Skip to content

Commit f163786

Browse files
authored
[camerax] Retrieve exposure and zoom camera information (flutter#3798)
Implements retrieval of exposure and zoom camera information. Specifically, implements the following: - `getMinExposureOffset()` - `getMaxExposureOffset()` - `getExposureOffsetStepSize()` - `getMaxZoomLevel()` - `getMinZoomLevel()` Part of flutter/flutter#115846. Part of flutter/flutter#125371. Part of flutter/flutter#120468.
1 parent c3f4c46 commit f163786

29 files changed

+2014
-184
lines changed

packages/camera/camera_android_camerax/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@
2020
* Updates internal Java InstanceManager to only stop finalization callbacks when stopped.
2121
* Implements image streaming.
2222
* Provides LifecycleOwner implementation for Activities that use the plugin that do not implement it themselves.
23+
* Implements retrieval of camera information.

packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ public void setUp(
4848
// Set up Host APIs.
4949
GeneratedCameraXLibrary.InstanceManagerHostApi.setup(
5050
binaryMessenger, () -> instanceManager.clear());
51+
GeneratedCameraXLibrary.CameraHostApi.setup(
52+
binaryMessenger, new CameraHostApiImpl(binaryMessenger, instanceManager));
5153
GeneratedCameraXLibrary.CameraInfoHostApi.setup(
52-
binaryMessenger, new CameraInfoHostApiImpl(instanceManager));
54+
binaryMessenger, new CameraInfoHostApiImpl(binaryMessenger, instanceManager));
5355
GeneratedCameraXLibrary.CameraSelectorHostApi.setup(
5456
binaryMessenger, new CameraSelectorHostApiImpl(binaryMessenger, instanceManager));
5557
GeneratedCameraXLibrary.JavaObjectHostApi.setup(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.camerax;
6+
7+
import androidx.annotation.NonNull;
8+
import androidx.camera.core.Camera;
9+
import androidx.camera.core.CameraInfo;
10+
import io.flutter.plugin.common.BinaryMessenger;
11+
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraHostApi;
12+
import java.util.Objects;
13+
14+
public class CameraHostApiImpl implements CameraHostApi {
15+
private final BinaryMessenger binaryMessenger;
16+
private final InstanceManager instanceManager;
17+
18+
public CameraHostApiImpl(
19+
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
20+
this.binaryMessenger = binaryMessenger;
21+
this.instanceManager = instanceManager;
22+
}
23+
24+
/**
25+
* Retrieves the {@link CameraInfo} instance that contains information about the {@link Camera}
26+
* instance with the specified identifier.
27+
*/
28+
@Override
29+
@NonNull
30+
public Long getCameraInfo(@NonNull Long identifier) {
31+
Camera camera = (Camera) Objects.requireNonNull(instanceManager.getInstance(identifier));
32+
CameraInfo cameraInfo = camera.getCameraInfo();
33+
34+
CameraInfoFlutterApiImpl cameraInfoFlutterApiImpl =
35+
new CameraInfoFlutterApiImpl(binaryMessenger, instanceManager);
36+
cameraInfoFlutterApiImpl.create(cameraInfo, reply -> {});
37+
38+
return instanceManager.getIdentifierForStrongReference(cameraInfo);
39+
}
40+
}

packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public CameraInfoFlutterApiImpl(
1818
}
1919

2020
void create(CameraInfo cameraInfo, Reply<Void> reply) {
21-
create(instanceManager.addHostCreatedInstance(cameraInfo), reply);
21+
if (!instanceManager.containsInstance(cameraInfo)) {
22+
create(instanceManager.addHostCreatedInstance(cameraInfo), reply);
23+
}
2224
}
2325
}

packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoHostApiImpl.java

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,64 @@
66

77
import androidx.annotation.NonNull;
88
import androidx.camera.core.CameraInfo;
9+
import androidx.camera.core.ExposureState;
10+
import androidx.camera.core.ZoomState;
11+
import io.flutter.plugin.common.BinaryMessenger;
912
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraInfoHostApi;
1013
import java.util.Objects;
1114

1215
public class CameraInfoHostApiImpl implements CameraInfoHostApi {
16+
private final BinaryMessenger binaryMessenger;
1317
private final InstanceManager instanceManager;
1418

15-
public CameraInfoHostApiImpl(InstanceManager instanceManager) {
19+
public CameraInfoHostApiImpl(
20+
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
21+
this.binaryMessenger = binaryMessenger;
1622
this.instanceManager = instanceManager;
1723
}
1824

25+
/** Retrieves the sensor rotation in degrees, relative to the device's default orientation. */
1926
@Override
27+
@NonNull
2028
public Long getSensorRotationDegrees(@NonNull Long identifier) {
2129
CameraInfo cameraInfo =
2230
(CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier));
2331
return Long.valueOf(cameraInfo.getSensorRotationDegrees());
2432
}
33+
34+
/**
35+
* Retrieves the {@link ExposureState} of the {@link CameraInfo} with the specified identifier.
36+
*/
37+
@Override
38+
@NonNull
39+
public Long getExposureState(@NonNull Long identifier) {
40+
CameraInfo cameraInfo =
41+
(CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier));
42+
ExposureState exposureState = cameraInfo.getExposureState();
43+
44+
ExposureStateFlutterApiImpl exposureStateFlutterApiImpl =
45+
new ExposureStateFlutterApiImpl(binaryMessenger, instanceManager);
46+
exposureStateFlutterApiImpl.create(exposureState, result -> {});
47+
48+
return instanceManager.getIdentifierForStrongReference(exposureState);
49+
}
50+
51+
/**
52+
* Retrieves the current {@link ZoomState} value of the {@link CameraInfo} with the specified
53+
* identifier.
54+
*/
55+
@NonNull
56+
@Override
57+
public Long getZoomState(@NonNull Long identifier) {
58+
CameraInfo cameraInfo =
59+
(CameraInfo) Objects.requireNonNull(instanceManager.getInstance(identifier));
60+
// TODO(camsim99): Create/return LiveData<ZoomState> once https://github.com/flutter/packages/pull/3419 lands.
61+
ZoomState zoomState = cameraInfo.getZoomState().getValue();
62+
63+
ZoomStateFlutterApiImpl zoomStateFlutterApiImpl =
64+
new ZoomStateFlutterApiImpl(binaryMessenger, instanceManager);
65+
zoomStateFlutterApiImpl.create(zoomState, result -> {});
66+
67+
return instanceManager.getIdentifierForStrongReference(zoomState);
68+
}
2569
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.camerax;
6+
7+
import android.util.Range;
8+
import androidx.annotation.NonNull;
9+
import androidx.camera.core.ExposureState;
10+
import io.flutter.plugin.common.BinaryMessenger;
11+
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ExposureCompensationRange;
12+
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ExposureStateFlutterApi;
13+
14+
public class ExposureStateFlutterApiImpl extends ExposureStateFlutterApi {
15+
private final InstanceManager instanceManager;
16+
17+
public ExposureStateFlutterApiImpl(
18+
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
19+
super(binaryMessenger);
20+
this.instanceManager = instanceManager;
21+
}
22+
23+
/**
24+
* Creates a {@link ExposureState} on the Dart side with its exposure compensation range that can
25+
* be used to set the exposure compensation index and its exposure compensation step, the smallest
26+
* step by which the exposure compensation can be changed.
27+
*/
28+
void create(@NonNull ExposureState exposureState, @NonNull Reply<Void> reply) {
29+
if (instanceManager.containsInstance(exposureState)) {
30+
return;
31+
}
32+
33+
final Range<Integer> exposureCompensationRangeFromState =
34+
exposureState.getExposureCompensationRange();
35+
ExposureCompensationRange exposureCompensationRange =
36+
new ExposureCompensationRange.Builder()
37+
.setMinCompensation(exposureCompensationRangeFromState.getLower().longValue())
38+
.setMaxCompensation(exposureCompensationRangeFromState.getUpper().longValue())
39+
.build();
40+
final Double exposureCompensationStep =
41+
exposureState.getExposureCompensationStep().doubleValue();
42+
43+
create(
44+
instanceManager.addHostCreatedInstance(exposureState),
45+
exposureCompensationRange,
46+
exposureCompensationStep,
47+
reply);
48+
}
49+
}

0 commit comments

Comments
 (0)