blob: eb36c452ec3b3ed544c5092c794c957394fe40ac [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugins.camerax;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
import io.flutter.embedding.engine.systemchannels.PlatformChannel.DeviceOrientation;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugins.camerax.CameraPermissionsManager.PermissionsRegistry;
import io.flutter.plugins.camerax.CameraPermissionsManager.ResultCallback;
import io.flutter.plugins.camerax.DeviceOrientationManager.DeviceOrientationChangeCallback;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraPermissionsErrorData;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.Result;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.SystemServicesFlutterApi.Reply;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
public class SystemServicesTest {
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock public BinaryMessenger mockBinaryMessenger;
@Mock public InstanceManager mockInstanceManager;
@Test
public void requestCameraPermissionsTest() {
final SystemServicesHostApiImpl systemServicesHostApi =
new SystemServicesHostApiImpl(mockBinaryMessenger, mockInstanceManager);
final CameraXProxy mockCameraXProxy = mock(CameraXProxy.class);
final CameraPermissionsManager mockCameraPermissionsManager =
mock(CameraPermissionsManager.class);
final Activity mockActivity = mock(Activity.class);
final PermissionsRegistry mockPermissionsRegistry = mock(PermissionsRegistry.class);
final Result<CameraPermissionsErrorData> mockResult = mock(Result.class);
final Boolean enableAudio = false;
systemServicesHostApi.cameraXProxy = mockCameraXProxy;
systemServicesHostApi.setActivity(mockActivity);
systemServicesHostApi.setPermissionsRegistry(mockPermissionsRegistry);
when(mockCameraXProxy.createCameraPermissionsManager())
.thenReturn(mockCameraPermissionsManager);
final ArgumentCaptor<ResultCallback> resultCallbackCaptor =
ArgumentCaptor.forClass(ResultCallback.class);
systemServicesHostApi.requestCameraPermissions(enableAudio, mockResult);
// Test camera permissions are requested.
verify(mockCameraPermissionsManager)
.requestPermissions(
eq(mockActivity),
eq(mockPermissionsRegistry),
eq(enableAudio),
resultCallbackCaptor.capture());
ResultCallback resultCallback = (ResultCallback) resultCallbackCaptor.getValue();
// Test no error data is sent upon permissions request success.
resultCallback.onResult(null, null);
verify(mockResult).success(null);
// Test expected error data is sent upon permissions request failure.
final String testErrorCode = "TestErrorCode";
final String testErrorDescription = "Test error description.";
final ArgumentCaptor<CameraPermissionsErrorData> cameraPermissionsErrorDataCaptor =
ArgumentCaptor.forClass(CameraPermissionsErrorData.class);
resultCallback.onResult(testErrorCode, testErrorDescription);
verify(mockResult, times(2)).success(cameraPermissionsErrorDataCaptor.capture());
CameraPermissionsErrorData cameraPermissionsErrorData =
cameraPermissionsErrorDataCaptor.getValue();
assertEquals(cameraPermissionsErrorData.getErrorCode(), testErrorCode);
assertEquals(cameraPermissionsErrorData.getDescription(), testErrorDescription);
}
@Test
public void deviceOrientationChangeTest() {
final SystemServicesHostApiImpl systemServicesHostApi =
new SystemServicesHostApiImpl(mockBinaryMessenger, mockInstanceManager);
final CameraXProxy mockCameraXProxy = mock(CameraXProxy.class);
final Activity mockActivity = mock(Activity.class);
final DeviceOrientationManager mockDeviceOrientationManager =
mock(DeviceOrientationManager.class);
final Boolean isFrontFacing = true;
final int sensorOrientation = 90;
SystemServicesFlutterApiImpl systemServicesFlutterApi =
mock(SystemServicesFlutterApiImpl.class);
systemServicesHostApi.systemServicesFlutterApi = systemServicesFlutterApi;
systemServicesHostApi.cameraXProxy = mockCameraXProxy;
systemServicesHostApi.setActivity(mockActivity);
when(mockCameraXProxy.createDeviceOrientationManager(
eq(mockActivity),
eq(isFrontFacing),
eq(sensorOrientation),
any(DeviceOrientationChangeCallback.class)))
.thenReturn(mockDeviceOrientationManager);
final ArgumentCaptor<DeviceOrientationChangeCallback> deviceOrientationChangeCallbackCaptor =
ArgumentCaptor.forClass(DeviceOrientationChangeCallback.class);
systemServicesHostApi.startListeningForDeviceOrientationChange(
isFrontFacing, Long.valueOf(sensorOrientation));
// Test callback method defined in Flutter API is called when device orientation changes.
verify(mockCameraXProxy)
.createDeviceOrientationManager(
eq(mockActivity),
eq(isFrontFacing),
eq(sensorOrientation),
deviceOrientationChangeCallbackCaptor.capture());
DeviceOrientationChangeCallback deviceOrientationChangeCallback =
deviceOrientationChangeCallbackCaptor.getValue();
deviceOrientationChangeCallback.onChange(DeviceOrientation.PORTRAIT_DOWN);
verify(systemServicesFlutterApi)
.sendDeviceOrientationChangedEvent(
eq(DeviceOrientation.PORTRAIT_DOWN.toString()), any(Reply.class));
// Test that the DeviceOrientationManager starts listening for device orientation changes.
verify(mockDeviceOrientationManager).start();
}
}