Skip to content

Commit a494825

Browse files
[camerax] Allow instance manager to create identical objects (flutter#7034)
* Make changes amd add test * Update changelog * Add comment * Fix spelling * Update packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/InstanceManager.java Co-authored-by: Maurice Parrish <[email protected]> --------- Co-authored-by: Maurice Parrish <[email protected]>
1 parent 1896f10 commit a494825

File tree

5 files changed

+31
-8
lines changed

5 files changed

+31
-8
lines changed

packages/camera/camera_android_camerax/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77
* Bump CameraX version to 1.3.0-alpha02.
88
* Adds Camera and UseCase classes, along with methods for binding UseCases to a lifecycle with the ProcessCameraProvider.
99
* Bump CameraX version to 1.3.0-alpha03 and Kotlin version to 1.8.0.
10+
* Changes instance manager to allow the separate creation of identical objects.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ public List<Long> filter(@NonNull Long identifier, @NonNull List<Long> cameraInf
6060
List<Long> filteredCameraInfosIds = new ArrayList<Long>();
6161

6262
for (CameraInfo cameraInfo : filteredCameraInfos) {
63-
cameraInfoFlutterApiImpl.create(cameraInfo, result -> {});
63+
if (!instanceManager.containsInstance(cameraInfo)) {
64+
cameraInfoFlutterApiImpl.create(cameraInfo, result -> {});
65+
}
6466
Long filteredCameraInfoId = instanceManager.getIdentifierForStrongReference(cameraInfo);
6567
filteredCameraInfosIds.add(filteredCameraInfoId);
6668
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,15 @@ public void addDartCreatedInstance(Object instance, long identifier) {
122122
/**
123123
* Adds a new instance that was instantiated from the host platform.
124124
*
125-
* <p>If an instance has already been added, the identifier of the instance will be returned.
125+
* <p>If an instance has already been added, this will replace it. {@code #containsInstance} can
126+
* be used to check if the object has already been added to avoid this.
126127
*
127128
* @param instance the instance to be stored.
128129
* @return the unique identifier stored with instance.
129130
*/
130131
public long addHostCreatedInstance(Object instance) {
131132
assertManagerIsNotClosed();
132-
if (containsInstance(instance)) {
133-
return getIdentifierForStrongReference(instance);
134-
}
133+
135134
final long identifier = nextIdentifier++;
136135
addInstance(instance, identifier);
137136
return identifier;

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ public void getInstance(GeneratedCameraXLibrary.Result<Long> result) {
6666

6767
final ProcessCameraProviderFlutterApiImpl flutterApi =
6868
new ProcessCameraProviderFlutterApiImpl(binaryMessenger, instanceManager);
69-
flutterApi.create(processCameraProvider, reply -> {});
69+
if (!instanceManager.containsInstance(processCameraProvider)) {
70+
flutterApi.create(processCameraProvider, reply -> {});
71+
}
7072
result.success(instanceManager.getIdentifierForStrongReference(processCameraProvider));
7173
} catch (Exception e) {
7274
result.error(e);
@@ -87,7 +89,9 @@ public List<Long> getAvailableCameraInfos(@NonNull Long identifier) {
8789
new CameraInfoFlutterApiImpl(binaryMessenger, instanceManager);
8890

8991
for (CameraInfo cameraInfo : availableCameras) {
90-
cameraInfoFlutterApi.create(cameraInfo, result -> {});
92+
if (!instanceManager.containsInstance(cameraInfo)) {
93+
cameraInfoFlutterApi.create(cameraInfo, result -> {});
94+
}
9195
availableCamerasIds.add(instanceManager.getIdentifierForStrongReference(cameraInfo));
9296
}
9397
return availableCamerasIds;
@@ -122,7 +126,9 @@ public Long bindToLifecycle(
122126

123127
final CameraFlutterApiImpl cameraFlutterApi =
124128
new CameraFlutterApiImpl(binaryMessenger, instanceManager);
125-
cameraFlutterApi.create(camera, result -> {});
129+
if (!instanceManager.containsInstance(camera)) {
130+
cameraFlutterApi.create(camera, result -> {});
131+
}
126132

127133
return instanceManager.getIdentifierForStrongReference(camera);
128134
}

packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/InstanceManagerTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package io.flutter.plugins.camerax;
66

77
import static org.junit.Assert.assertEquals;
8+
import static org.junit.Assert.assertNotEquals;
89
import static org.junit.Assert.assertNotNull;
910
import static org.junit.Assert.assertNull;
1011
import static org.junit.Assert.assertTrue;
@@ -40,6 +41,20 @@ public void addHostCreatedInstance() {
4041
instanceManager.close();
4142
}
4243

44+
@Test
45+
public void addHostCreatedInstance_createsSameInstanceTwice() {
46+
final InstanceManager instanceManager = InstanceManager.open(identifier -> {});
47+
48+
final Object object = new Object();
49+
long firstIdentifier = instanceManager.addHostCreatedInstance(object);
50+
long secondIdentifier = instanceManager.addHostCreatedInstance(object);
51+
52+
assertNotEquals(firstIdentifier, secondIdentifier);
53+
assertTrue(instanceManager.containsInstance(object));
54+
55+
instanceManager.close();
56+
}
57+
4358
@Test
4459
public void remove() {
4560
final InstanceManager instanceManager = InstanceManager.open(identifier -> {});

0 commit comments

Comments
 (0)