Skip to content

Commit

Permalink
[camera] Add filter for unsupported cameras on Android (flutter#4418)
Browse files Browse the repository at this point in the history
  • Loading branch information
camsim99 authored Oct 7, 2021
1 parent cd5dc3b commit 174f140
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,16 @@ public static List<Map<String, Object>> getAvailableCameras(Activity activity)
String[] cameraNames = cameraManager.getCameraIdList();
List<Map<String, Object>> cameras = new ArrayList<>();
for (String cameraName : cameraNames) {
int cameraId;
try {
cameraId = Integer.parseInt(cameraName, 10);
} catch (NumberFormatException e) {
cameraId = -1;
}
if (cameraId < 0) {
continue;
}

HashMap<String, Object> details = new HashMap<>();
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName);
details.put("name", cameraName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,20 @@
package io.flutter.plugins.camera;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.app.Activity;
import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
import java.util.List;
import java.util.Map;
import org.junit.Test;

public class CameraUtilsTest {
Expand Down Expand Up @@ -52,4 +64,37 @@ public void deserializeDeviceOrientation_deserializesCorrectly() {
public void deserializeDeviceOrientation_throwsForNull() {
CameraUtils.deserializeDeviceOrientation(null);
}

@Test
public void getAvailableCameras_retrievesValidCameras()
throws CameraAccessException, NumberFormatException {
final Activity mockActivity = mock(Activity.class);
final CameraManager mockCameraManager = mock(CameraManager.class);
final CameraCharacteristics mockCameraCharacteristics = mock(CameraCharacteristics.class);
final String[] mockCameraIds = {"1394902", "-192930", "0283835", "foobar"};
final int mockSensorOrientation0 = 90;
final int mockSensorOrientation2 = 270;
final int mockLensFacing0 = CameraMetadata.LENS_FACING_FRONT;
final int mockLensFacing2 = CameraMetadata.LENS_FACING_EXTERNAL;

when(mockActivity.getSystemService(Context.CAMERA_SERVICE)).thenReturn(mockCameraManager);
when(mockCameraManager.getCameraIdList()).thenReturn(mockCameraIds);
when(mockCameraManager.getCameraCharacteristics(anyString()))
.thenReturn(mockCameraCharacteristics);
when(mockCameraCharacteristics.get(any()))
.thenReturn(mockSensorOrientation0)
.thenReturn(mockLensFacing0)
.thenReturn(mockSensorOrientation2)
.thenReturn(mockLensFacing2);

List<Map<String, Object>> availableCameras = CameraUtils.getAvailableCameras(mockActivity);

assertEquals(availableCameras.size(), 2);
assertEquals(availableCameras.get(0).get("name"), "1394902");
assertEquals(availableCameras.get(0).get("sensorOrientation"), mockSensorOrientation0);
assertEquals(availableCameras.get(0).get("lensFacing"), "front");
assertEquals(availableCameras.get(1).get("name"), "0283835");
assertEquals(availableCameras.get(1).get("sensorOrientation"), mockSensorOrientation2);
assertEquals(availableCameras.get(1).get("lensFacing"), "external");
}
}

0 comments on commit 174f140

Please sign in to comment.