diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index a1db41ed086b..f51c8d1756a4 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -40,28 +40,27 @@ import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.camera.features.CameraFeature; +import io.flutter.plugins.camera.features.CameraFeatureFactory; import io.flutter.plugins.camera.features.CameraFeatures; import io.flutter.plugins.camera.features.Point; -import io.flutter.plugins.camera.features.autofocus.AutoFocus; +import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; import io.flutter.plugins.camera.features.autofocus.FocusMode; -import io.flutter.plugins.camera.features.exposurelock.ExposureLock; +import io.flutter.plugins.camera.features.exposurelock.ExposureLockFeature; import io.flutter.plugins.camera.features.exposurelock.ExposureMode; -import io.flutter.plugins.camera.features.exposureoffset.ExposureOffset; +import io.flutter.plugins.camera.features.exposureoffset.ExposureOffsetFeature; import io.flutter.plugins.camera.features.exposureoffset.ExposureOffsetValue; -import io.flutter.plugins.camera.features.exposurepoint.ExposurePoint; -import io.flutter.plugins.camera.features.flash.Flash; +import io.flutter.plugins.camera.features.exposurepoint.ExposurePointFeature; +import io.flutter.plugins.camera.features.flash.FlashFeature; import io.flutter.plugins.camera.features.flash.FlashMode; -import io.flutter.plugins.camera.features.focuspoint.FocusPoint; -import io.flutter.plugins.camera.features.fpsrange.FpsRange; -import io.flutter.plugins.camera.features.noisereduction.NoiseReduction; +import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; import io.flutter.plugins.camera.features.regionboundaries.CameraRegions; -import io.flutter.plugins.camera.features.regionboundaries.RegionBoundaries; -import io.flutter.plugins.camera.features.resolution.Resolution; +import io.flutter.plugins.camera.features.regionboundaries.RegionBoundariesFeature; +import io.flutter.plugins.camera.features.resolution.ResolutionFeature; import io.flutter.plugins.camera.features.resolution.ResolutionPreset; import io.flutter.plugins.camera.features.sensororientation.DeviceOrientationManager; -import io.flutter.plugins.camera.features.sensororientation.SensorOrientation; +import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; import io.flutter.plugins.camera.features.zoomlevel.CameraZoom; -import io.flutter.plugins.camera.features.zoomlevel.ZoomLevel; +import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; import io.flutter.plugins.camera.media.MediaRecorderBuilder; import io.flutter.view.TextureRegistry.SurfaceTextureEntry; import java.io.File; @@ -170,6 +169,7 @@ public void onImageAvailable(ImageReader reader) { public Camera( final Activity activity, final SurfaceTextureEntry flutterTexture, + final CameraFeatureFactory cameraFeatureFactory, final DartMessenger dartMessenger, final CameraProperties cameraProperties, final ResolutionPreset resolutionPreset, @@ -191,24 +191,38 @@ public Camera( { put( CameraFeatures.resolution, - new Resolution( + cameraFeatureFactory.createResolutionFeature( cameraProperties, resolutionPreset, cameraProperties.getCameraName())); - put(CameraFeatures.autoFocus, new AutoFocus(cameraProperties, false)); + put( + CameraFeatures.autoFocus, + cameraFeatureFactory.createAutoFocusFeature(cameraProperties, false)); put( CameraFeatures.sensorOrientation, - new SensorOrientation(cameraProperties, activity, dartMessenger)); - put(CameraFeatures.exposureLock, new ExposureLock(cameraProperties)); - put(CameraFeatures.exposureOffset, new ExposureOffset(cameraProperties)); + cameraFeatureFactory.createSensorOrientationFeature(cameraProperties, activity, dartMessenger)); + put( + CameraFeatures.exposureLock, + cameraFeatureFactory.createExposureLockFeature(cameraProperties)); + put( + CameraFeatures.exposureOffset, + cameraFeatureFactory.createExposureOffsetFeature(cameraProperties)); put( CameraFeatures.exposurePoint, - new ExposurePoint(cameraProperties, () -> getCameraRegions())); + cameraFeatureFactory.createExposurePointFeature(cameraProperties, () -> getCameraRegions())); put( CameraFeatures.focusPoint, - new FocusPoint(cameraProperties, () -> getCameraRegions())); - put(CameraFeatures.flash, new Flash(cameraProperties)); - put(CameraFeatures.fpsRange, new FpsRange(cameraProperties)); - put(CameraFeatures.noiseReduction, new NoiseReduction(cameraProperties)); - put(CameraFeatures.zoomLevel, new ZoomLevel(cameraProperties)); + cameraFeatureFactory.createFocusPointFeature(cameraProperties, () -> getCameraRegions())); + put( + CameraFeatures.flash, + cameraFeatureFactory.createFlashFeature(cameraProperties)); + put( + CameraFeatures.fpsRange, + cameraFeatureFactory.createFpsRangeFeature(cameraProperties)); + put( + CameraFeatures.noiseReduction, + cameraFeatureFactory.createNoiseReductionFeature(cameraProperties)); + put( + CameraFeatures.zoomLevel, + cameraFeatureFactory.createZoomLevelFeature(cameraProperties)); // Note: CameraFeatures.regionBoundaries will be created in CreateCaptureSession. } @@ -256,7 +270,7 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { } final PlatformChannel.DeviceOrientation lockedOrientation = - ((SensorOrientation) cameraFeatures.get(CameraFeatures.sensorOrientation)) + ((SensorOrientationFeature) cameraFeatures.get(CameraFeatures.sensorOrientation)) .getLockedCaptureOrientation(); mediaRecorder = @@ -298,14 +312,21 @@ public void onOpened(@NonNull CameraDevice device) { cameraDevice = device; try { startPreview(); + + final boolean isExposurePointSupported = cameraFeatures + .get(CameraFeatures.exposurePoint) + .checkIsSupported(); + final boolean isFocusPointSupported = cameraFeatures + .get(CameraFeatures.focusPoint) + .checkIsSupported(); + dartMessenger.sendCameraInitializedEvent( getPreviewSize().getWidth(), getPreviewSize().getHeight(), (ExposureMode) cameraFeatures.get(CameraFeatures.exposureLock).getValue(), (FocusMode) cameraFeatures.get(CameraFeatures.autoFocus).getValue(), - ((ExposurePoint) cameraFeatures.get(CameraFeatures.exposurePoint)) - .getIsSupported(), - ((FocusPoint) cameraFeatures.get(CameraFeatures.focusPoint)).getIsSupported()); + isExposurePointSupported, + isFocusPointSupported); } catch (CameraAccessException e) { dartMessenger.sendCameraErrorEvent(e.getMessage()); close(); @@ -392,7 +413,7 @@ private void createCaptureSession( // Update camera regions cameraFeatures.put( CameraFeatures.regionBoundaries, - new RegionBoundaries(cameraProperties, mPreviewRequestBuilder)); + new RegionBoundariesFeature(cameraProperties, mPreviewRequestBuilder)); // Prepare the callback CameraCaptureSession.StateCallback callback = @@ -506,8 +527,9 @@ public void takePicture(@NonNull final Result result) { // Listen for picture being taken pictureImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); - final AutoFocus autoFocusFeature = (AutoFocus) cameraFeatures.get(CameraFeatures.autoFocus); - if (autoFocusFeature.getIsSupported() && autoFocusFeature.getValue() == FocusMode.auto) { + final AutoFocusFeature autoFocusFeature = (AutoFocusFeature) cameraFeatures.get(CameraFeatures.autoFocus); + final boolean isAutoFocusSupported = autoFocusFeature.checkIsSupported(); + if (isAutoFocusSupported && autoFocusFeature.getValue() == FocusMode.auto) { runPictureAutoFocus(); } else { runPrecaptureSequence(); @@ -721,7 +743,7 @@ public void startVideoRecording(Result result) { prepareMediaRecorder(videoRecordingFile.getAbsolutePath()); // Re-create autofocus feature so it's using video focus mode now - cameraFeatures.put(CameraFeatures.autoFocus, new AutoFocus(cameraProperties, true)); + cameraFeatures.put(CameraFeatures.autoFocus, new AutoFocusFeature(cameraProperties, true)); recordingVideo = true; createCaptureSession( @@ -742,7 +764,7 @@ public void stopVideoRecording(@NonNull final Result result) { try { // Re-create autofocus feature so it's using continuous capture focus mode now - cameraFeatures.put(CameraFeatures.autoFocus, new AutoFocus(cameraProperties, false)); + cameraFeatures.put(CameraFeatures.autoFocus, new AutoFocusFeature(cameraProperties, false)); recordingVideo = false; try { @@ -813,7 +835,7 @@ public void resumeVideoRecording(@NonNull final Result result) { */ public void setFlashMode(@NonNull final Result result, FlashMode newMode) { // Save the new flash mode setting - ((Flash) cameraFeatures.get(CameraFeatures.flash)).setValue(newMode); + ((FlashFeature) cameraFeatures.get(CameraFeatures.flash)).setValue(newMode); cameraFeatures.get(CameraFeatures.flash).updateBuilder(mPreviewRequestBuilder); refreshPreviewCaptureSession( @@ -828,7 +850,7 @@ public void setFlashMode(@NonNull final Result result, FlashMode newMode) { * @param newMode new mode. */ public void setExposureMode(@NonNull final Result result, ExposureMode newMode) { - ((ExposureLock) cameraFeatures.get(CameraFeatures.exposureLock)).setValue(newMode); + ((ExposureLockFeature) cameraFeatures.get(CameraFeatures.exposureLock)).setValue(newMode); cameraFeatures.get(CameraFeatures.exposureLock).updateBuilder(mPreviewRequestBuilder); refreshPreviewCaptureSession( @@ -846,8 +868,8 @@ public void setExposureMode(@NonNull final Result result, ExposureMode newMode) * @return camera region object. */ public CameraRegions getCameraRegions() { - final RegionBoundaries regionBoundaries = - (RegionBoundaries) cameraFeatures.get(CameraFeatures.regionBoundaries); + final RegionBoundariesFeature regionBoundaries = + (RegionBoundariesFeature) cameraFeatures.get(CameraFeatures.regionBoundaries); return regionBoundaries.getCameraRegions(); } @@ -859,7 +881,7 @@ public CameraRegions getCameraRegions() { * @param y new y. */ public void setExposurePoint(@NonNull final Result result, Double x, Double y) { - ((ExposurePoint) cameraFeatures.get(CameraFeatures.exposurePoint)).setValue(new Point(x, y)); + ((ExposurePointFeature) cameraFeatures.get(CameraFeatures.exposurePoint)).setValue(new Point(x, y)); cameraFeatures.get(CameraFeatures.exposurePoint).updateBuilder(mPreviewRequestBuilder); refreshPreviewCaptureSession( @@ -884,8 +906,8 @@ public double getMinExposureOffset() { /** Return the exposure offset step size to dart. */ public double getExposureOffsetStepSize() { - final ExposureOffset val = (ExposureOffset) cameraFeatures.get(CameraFeatures.exposureOffset); - return val.getExposureOffsetStepSize(cameraProperties); + final ExposureOffsetFeature val = (ExposureOffsetFeature) cameraFeatures.get(CameraFeatures.exposureOffset); + return val.getExposureOffsetStepSize(); } /** @@ -895,11 +917,11 @@ public double getExposureOffsetStepSize() { * @param newMode New mode. */ public void setFocusMode(@NonNull final Result result, FocusMode newMode) { - ((AutoFocus) cameraFeatures.get(CameraFeatures.autoFocus)).setValue(newMode); + ((AutoFocusFeature) cameraFeatures.get(CameraFeatures.autoFocus)).setValue(newMode); cameraFeatures.get(CameraFeatures.autoFocus).updateBuilder(mPreviewRequestBuilder); - /** + /* * For focus mode we need to do an extra step of actually locking/unlocking the * focus in order to ensure it goes into the correct state. */ @@ -937,7 +959,7 @@ public void setFocusMode(@NonNull final Result result, FocusMode newMode) { * @param y new y. */ public void setFocusPoint(@NonNull final Result result, Double x, Double y) { - ((FocusPoint) cameraFeatures.get(CameraFeatures.focusPoint)).setValue(new Point(x, y)); + ((FocusPointFeature) cameraFeatures.get(CameraFeatures.focusPoint)).setValue(new Point(x, y)); cameraFeatures.get(CameraFeatures.focusPoint).updateBuilder(mPreviewRequestBuilder); refreshPreviewCaptureSession( @@ -952,7 +974,7 @@ public void setFocusPoint(@NonNull final Result result, Double x, Double y) { * @param offset new value. */ public void setExposureOffset(@NonNull final Result result, double offset) { - ((ExposureOffset) cameraFeatures.get(CameraFeatures.exposureOffset)) + ((ExposureOffsetFeature) cameraFeatures.get(CameraFeatures.exposureOffset)) .setValue(new ExposureOffsetValue(offset)); cameraFeatures.get(CameraFeatures.exposureOffset).updateBuilder(mPreviewRequestBuilder); @@ -962,7 +984,7 @@ public void setExposureOffset(@NonNull final Result result, double offset) { } public float getMaxZoomLevel() { - final ZoomLevel zoomLevel = (ZoomLevel) cameraFeatures.get(CameraFeatures.zoomLevel); + final ZoomLevelFeature zoomLevel = (ZoomLevelFeature) cameraFeatures.get(CameraFeatures.zoomLevel); return zoomLevel.getCameraZoom().maxZoom; } @@ -972,22 +994,22 @@ public float getMinZoomLevel() { /** Shortcut to get current preview size. */ Size getPreviewSize() { - return ((Resolution) cameraFeatures.get(CameraFeatures.resolution)).getPreviewSize(); + return ((ResolutionFeature) cameraFeatures.get(CameraFeatures.resolution)).getPreviewSize(); } /** Shortcut to get current capture size. */ Size getCaptureSize() { - return ((Resolution) cameraFeatures.get(CameraFeatures.resolution)).getCaptureSize(); + return ((ResolutionFeature) cameraFeatures.get(CameraFeatures.resolution)).getCaptureSize(); } /** Shortcut to get current recording profile. */ CamcorderProfile getRecordingProfile() { - return ((Resolution) cameraFeatures.get(CameraFeatures.resolution)).getRecordingProfile(); + return ((ResolutionFeature) cameraFeatures.get(CameraFeatures.resolution)).getRecordingProfile(); } /** Shortut to get deviceOrientationListener. */ DeviceOrientationManager getDeviceOrientationManager() { - return ((SensorOrientation) cameraFeatures.get(CameraFeatures.sensorOrientation)) + return ((SensorOrientationFeature) cameraFeatures.get(CameraFeatures.sensorOrientation)) .getDeviceOrientationManager(); } @@ -998,7 +1020,7 @@ DeviceOrientationManager getDeviceOrientationManager() { * @param zoom new value. */ public void setZoomLevel(@NonNull final Result result, float zoom) throws CameraAccessException { - final ZoomLevel zoomLevel = (ZoomLevel) cameraFeatures.get(CameraFeatures.zoomLevel); + final ZoomLevelFeature zoomLevel = (ZoomLevelFeature) cameraFeatures.get(CameraFeatures.zoomLevel); float maxZoom = zoomLevel.getCameraZoom().maxZoom; float minZoom = CameraZoom.DEFAULT_ZOOM_FACTOR; @@ -1027,13 +1049,13 @@ public void setZoomLevel(@NonNull final Result result, float zoom) throws Camera * @param orientation new orientation. */ public void lockCaptureOrientation(PlatformChannel.DeviceOrientation orientation) { - ((SensorOrientation) cameraFeatures.get(CameraFeatures.sensorOrientation)) + ((SensorOrientationFeature) cameraFeatures.get(CameraFeatures.sensorOrientation)) .lockCaptureOrientation(orientation); } /** Unlock capture orientation from dart. */ public void unlockCaptureOrientation() { - ((SensorOrientation) cameraFeatures.get(CameraFeatures.sensorOrientation)) + ((SensorOrientationFeature) cameraFeatures.get(CameraFeatures.sensorOrientation)) .unlockCaptureOrientation(); } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java index 20477c41c305..a9e6e6a98c6f 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraCaptureCallback.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera; import android.hardware.camera2.CameraCaptureSession; diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java index bc669709df99..35b676e3235c 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera; import android.graphics.Rect; diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraState.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraState.java index 99dd3f0c6825..2df2298a58ab 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraState.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraState.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera; /** diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/ImageSaver.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/ImageSaver.java index b467185c9096..61a60c22e46c 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/ImageSaver.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/ImageSaver.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera; import android.media.Image; diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index 2891fbea8077..e54c786149cc 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -15,6 +15,7 @@ import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.camera.CameraPermissions.PermissionsRegistry; +import io.flutter.plugins.camera.features.CameraFeatureFactoryImpl; import io.flutter.plugins.camera.features.autofocus.FocusMode; import io.flutter.plugins.camera.features.exposurelock.ExposureMode; import io.flutter.plugins.camera.features.flash.FlashMode; @@ -364,6 +365,7 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce new Camera( activity, flutterSurfaceTexture, + new CameraFeatureFactoryImpl(), dartMessenger, cameraProperties, resolutionPreset, diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/PictureCaptureRequest.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/PictureCaptureRequest.java index eb52cebba24d..032e9289a4c5 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/PictureCaptureRequest.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/PictureCaptureRequest.java @@ -42,11 +42,6 @@ class PictureCaptureRequest { */ private long preCaptureStartTime; - private final Runnable timeoutCallback = - () -> { - error("captureTimeout", "Picture capture request timed out", null); - }; - /** * Factory method to create a picture capture request. * diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeature.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeature.java index 947823fa1403..2f96dae2a858 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeature.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeature.java @@ -1,6 +1,11 @@ +// Copyright 2019 The Chromium 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.camera.features; import android.hardware.camera2.CaptureRequest; +import androidx.annotation.NonNull; import io.flutter.plugins.camera.CameraProperties; /** @@ -11,35 +16,42 @@ * * @param */ -public interface CameraFeature { +public abstract class CameraFeature { + protected final CameraProperties cameraProperties; + + + protected CameraFeature(@NonNull CameraProperties cameraProperties) { + this.cameraProperties = cameraProperties; + } + /** Debug name for this feature. */ - public String getDebugName(); + public abstract String getDebugName(); /** * Get the current value of this feature's setting. * * @return */ - public T getValue(); + public abstract T getValue(); /** * Set a new value for this feature's setting. * * @param value */ - public void setValue(T value); + public abstract void setValue(T value); /** - * Returns whether or not this feature is supported on the given camera properties. + * Returns whether or not this feature is supported. * * @return */ - public boolean checkIsSupported(CameraProperties cameraProperties); + public abstract boolean checkIsSupported(); /** * Update the setting in a provided request builder. * * @param requestBuilder */ - public void updateBuilder(CaptureRequest.Builder requestBuilder); + public abstract void updateBuilder(CaptureRequest.Builder requestBuilder); } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatureFactory.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatureFactory.java new file mode 100644 index 000000000000..2655b6b1f89d --- /dev/null +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatureFactory.java @@ -0,0 +1,148 @@ +// Copyright 2019 The Chromium 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.camera.features; + +import android.app.Activity; +import android.hardware.camera2.CaptureRequest; +import androidx.annotation.NonNull; +import io.flutter.plugins.camera.CameraProperties; +import io.flutter.plugins.camera.DartMessenger; +import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; +import io.flutter.plugins.camera.features.exposurelock.ExposureLockFeature; +import io.flutter.plugins.camera.features.exposureoffset.ExposureOffsetFeature; +import io.flutter.plugins.camera.features.exposurepoint.ExposurePointFeature; +import io.flutter.plugins.camera.features.flash.FlashFeature; +import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; +import io.flutter.plugins.camera.features.fpsrange.FpsRangeFeature; +import io.flutter.plugins.camera.features.noisereduction.NoiseReductionFeature; +import io.flutter.plugins.camera.features.regionboundaries.CameraRegions; +import io.flutter.plugins.camera.features.regionboundaries.RegionBoundariesFeature; +import io.flutter.plugins.camera.features.resolution.ResolutionFeature; +import io.flutter.plugins.camera.features.resolution.ResolutionPreset; +import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; +import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; +import java.util.concurrent.Callable; + +public interface CameraFeatureFactory { + + /** + * Creates a new instance of the auto focus feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @param recordingVideo indicates if the camera is currently recording. + * @return newly created instance of the AutoFocusFeature class. + */ + AutoFocusFeature createAutoFocusFeature( + @NonNull CameraProperties cameraProperties, + boolean recordingVideo); + + /** + * Creates a new instance of the exposure lock feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @return newly created instance of the ExposureLockFeature class. + */ + ExposureLockFeature createExposureLockFeature(@NonNull CameraProperties cameraProperties); + + /** + * Creates a new instance of the exposure offset feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @return newly created instance of the ExposureOffsetFeature class. + */ + ExposureOffsetFeature createExposureOffsetFeature(@NonNull CameraProperties cameraProperties); + + /** + * Creates a new instance of the flash feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @return newly created instance of the FlashFeature class. + */ + FlashFeature createFlashFeature(@NonNull CameraProperties cameraProperties); + + /** + * Creates a new instance of the resolution feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @param initialSetting initial resolution preset. + * @param cameraName the name of the camera which can be used to identify the camera device. + * @return newly created instance of the ResolutionFeature class. + */ + ResolutionFeature createResolutionFeature( + @NonNull CameraProperties cameraProperties, + ResolutionPreset initialSetting, + String cameraName); + + /** + * Creates a new instance of the focus point feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @param getCameraRegions function which is used to retrieve the current camera regions. + * @return newly created instance of the FocusPointFeature class. + */ + FocusPointFeature createFocusPointFeature( + @NonNull CameraProperties cameraProperties, + Callable getCameraRegions); + + /** + * Creates a new instance of the FPS range feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @return newly created instance of the FpsRangeFeature class. + */ + FpsRangeFeature createFpsRangeFeature(@NonNull CameraProperties cameraProperties); + + /** + * Creates a new instance of the sensor orientation feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @param activity current activity associated with the camera plugin. + * @param dartMessenger instance of the DartMessenger class, used to send state updates back to Dart. + * @return newly created instance of the SensorOrientationFeature class. + */ + SensorOrientationFeature createSensorOrientationFeature( + @NonNull CameraProperties cameraProperties, + @NonNull Activity activity, + @NonNull DartMessenger dartMessenger); + + /** + * Creates a new instance of the zoom level feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @return newly created instance of the ZoomLevelFeature class. + */ + ZoomLevelFeature createZoomLevelFeature(@NonNull CameraProperties cameraProperties); + + /** + * Creates a new instance of the region boundaries feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @param requestBuilder instance of the CaptureRequest.Builder class, used to inform the Camera2 API that the settings are updated. + * @return newly created instance of the RegionBoundariesFeature class. + */ + RegionBoundariesFeature createRegionBoundariesFeature( + @NonNull CameraProperties cameraProperties, + @NonNull CaptureRequest.Builder requestBuilder); + + /** + * Creates a new instance of the exposure point feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @param getCameraRegions function which is used to retrieve the current camera regions. + * @return newly created instance of the ExposurePointFeature class. + */ + ExposurePointFeature createExposurePointFeature( + @NonNull CameraProperties cameraProperties, + @NonNull Callable getCameraRegions); + + /** + * Creates a new instance of the noise reduction feature. + * + * @param cameraProperties instance of the CameraProperties class containing information about the cameras features. + * @return newly created instance of the NoiseReductionFeature class. + */ + NoiseReductionFeature createNoiseReductionFeature( + @NonNull CameraProperties cameraProperties); +} diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatureFactoryImpl.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatureFactoryImpl.java new file mode 100644 index 000000000000..b49a907f96ca --- /dev/null +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatureFactoryImpl.java @@ -0,0 +1,105 @@ +// Copyright 2019 The Chromium 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.camera.features; + +import android.app.Activity; +import android.hardware.camera2.CaptureRequest; +import androidx.annotation.NonNull; +import io.flutter.plugins.camera.CameraProperties; +import io.flutter.plugins.camera.DartMessenger; +import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; +import io.flutter.plugins.camera.features.exposurelock.ExposureLockFeature; +import io.flutter.plugins.camera.features.exposureoffset.ExposureOffsetFeature; +import io.flutter.plugins.camera.features.exposurepoint.ExposurePointFeature; +import io.flutter.plugins.camera.features.flash.FlashFeature; +import io.flutter.plugins.camera.features.focuspoint.FocusPointFeature; +import io.flutter.plugins.camera.features.fpsrange.FpsRangeFeature; +import io.flutter.plugins.camera.features.noisereduction.NoiseReductionFeature; +import io.flutter.plugins.camera.features.regionboundaries.CameraRegions; +import io.flutter.plugins.camera.features.regionboundaries.RegionBoundariesFeature; +import io.flutter.plugins.camera.features.resolution.ResolutionFeature; +import io.flutter.plugins.camera.features.resolution.ResolutionPreset; +import io.flutter.plugins.camera.features.sensororientation.SensorOrientationFeature; +import io.flutter.plugins.camera.features.zoomlevel.ZoomLevelFeature; +import java.util.concurrent.Callable; + +public class CameraFeatureFactoryImpl implements CameraFeatureFactory { + + @Override + public AutoFocusFeature createAutoFocusFeature( + @NonNull CameraProperties cameraProperties, + boolean recordingVideo) { + return new AutoFocusFeature(cameraProperties, recordingVideo); + } + + @Override + public ExposureLockFeature createExposureLockFeature(@NonNull CameraProperties cameraProperties) { + return new ExposureLockFeature(cameraProperties); + } + + @Override + public ExposureOffsetFeature createExposureOffsetFeature( + @NonNull CameraProperties cameraProperties) { + return new ExposureOffsetFeature(cameraProperties); + } + + @Override + public FlashFeature createFlashFeature(@NonNull CameraProperties cameraProperties) { + return new FlashFeature(cameraProperties); + } + + @Override + public ResolutionFeature createResolutionFeature( + @NonNull CameraProperties cameraProperties, + ResolutionPreset initialSetting, + String cameraName) { + return new ResolutionFeature(cameraProperties, initialSetting, cameraName); + } + + @Override + public FocusPointFeature createFocusPointFeature( + @NonNull CameraProperties cameraProperties, + Callable getCameraRegions) { + return new FocusPointFeature(cameraProperties, getCameraRegions); + } + + @Override + public FpsRangeFeature createFpsRangeFeature(@NonNull CameraProperties cameraProperties) { + return new FpsRangeFeature(cameraProperties); + } + + @Override + public SensorOrientationFeature createSensorOrientationFeature( + @NonNull CameraProperties cameraProperties, + @NonNull Activity activity, + @NonNull DartMessenger dartMessenger) { + return new SensorOrientationFeature(cameraProperties, activity, dartMessenger); + } + + @Override + public ZoomLevelFeature createZoomLevelFeature(@NonNull CameraProperties cameraProperties) { + return new ZoomLevelFeature(cameraProperties); + } + + @Override + public RegionBoundariesFeature createRegionBoundariesFeature( + @NonNull CameraProperties cameraProperties, + @NonNull CaptureRequest.Builder requestBuilder) { + return new RegionBoundariesFeature(cameraProperties, requestBuilder); + } + + @Override + public ExposurePointFeature createExposurePointFeature( + @NonNull CameraProperties cameraProperties, + @NonNull Callable getCameraRegions) { + return new ExposurePointFeature(cameraProperties, getCameraRegions); + } + + @Override + public NoiseReductionFeature createNoiseReductionFeature( + @NonNull CameraProperties cameraProperties) { + return new NoiseReductionFeature(cameraProperties); + } +} diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java index 653007376a95..d4db06f27b7b 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/CameraFeatures.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features; /** @@ -24,13 +28,6 @@ public enum CameraFeatures { this.strValue = strValue; } - public static CameraFeatures getValueForString(String modeStr) { - for (CameraFeatures value : values()) { - if (value.strValue.equals(modeStr)) return value; - } - return null; - } - @Override public String toString() { return strValue; diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autoFocus/AutoFocus.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autofocus/AutoFocusFeature.java similarity index 87% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autoFocus/AutoFocus.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autofocus/AutoFocusFeature.java index b4074a6f846f..f3cbaca8f5d6 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autoFocus/AutoFocus.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autofocus/AutoFocusFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.autofocus; import android.hardware.camera2.CameraCharacteristics; @@ -6,17 +10,16 @@ import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; -public class AutoFocus implements CameraFeature { - private boolean isSupported; +public class AutoFocusFeature extends CameraFeature { private FocusMode currentSetting = FocusMode.auto; // When we switch recording modes we re-create this feature with // the appropriate setting here. private final boolean recordingVideo; - public AutoFocus(CameraProperties cameraProperties, boolean recordingVideo) { + public AutoFocusFeature(CameraProperties cameraProperties, boolean recordingVideo) { + super(cameraProperties); this.recordingVideo = recordingVideo; - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -33,7 +36,7 @@ public FocusMode getValue() { public void setValue(FocusMode value) { this.currentSetting = value; - // /** + // /* // * If we are locking AF, we should perform a one-time // */ // switch (currentSetting) { @@ -54,7 +57,7 @@ public void setValue(FocusMode value) { } @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { int[] modes = cameraProperties.getControlAutoFocusAvailableModes(); Log.i("Camera", "checkAutoFocusSupported | modes:"); for (int mode : modes) { @@ -78,15 +81,15 @@ public boolean checkIsSupported(CameraProperties cameraProperties) { final boolean supported = !isFixedLength - && !(modes == null - || modes.length == 0 + && !(modes.length == 0 || (modes.length == 1 && modes[0] == CameraCharacteristics.CONTROL_AF_MODE_OFF)); + return supported; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -108,8 +111,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { break; } } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autoFocus/FocusMode.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autofocus/FocusMode.java similarity index 100% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autoFocus/FocusMode.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/autofocus/FocusMode.java diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurelock/ExposureLock.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurelock/ExposureLockFeature.java similarity index 74% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurelock/ExposureLock.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurelock/ExposureLockFeature.java index fef875eae7a6..00bfabda8a03 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurelock/ExposureLock.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurelock/ExposureLockFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.exposurelock; import android.hardware.camera2.CaptureRequest; @@ -8,12 +12,11 @@ /** * Exposure lock controls whether or not exposure mode is currenty locked or automatically metering. */ -public class ExposureLock implements CameraFeature { - private boolean isSupported; +public class ExposureLockFeature extends CameraFeature { private ExposureMode currentSetting = ExposureMode.auto; - public ExposureLock(CameraProperties cameraProperties) { - this.isSupported = checkIsSupported(cameraProperties); + public ExposureLockFeature(CameraProperties cameraProperties) { + super(cameraProperties); } @Override @@ -33,13 +36,13 @@ public void setValue(ExposureMode value) { // Available on all devices. @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -55,8 +58,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { break; } } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffset.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetFeature.java similarity index 66% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffset.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetFeature.java index c6e38512799e..aba9dfb18ac0 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffset.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.exposureoffset; import android.hardware.camera2.CaptureRequest; @@ -8,21 +12,19 @@ import io.flutter.plugins.camera.features.CameraFeature; /** Exposure offset makes the image brighter or darker. */ -public class ExposureOffset implements CameraFeature { - private boolean isSupported; +public class ExposureOffsetFeature extends CameraFeature { private ExposureOffsetValue currentSetting; - private CameraProperties cameraProperties; private final double min; private final double max; - public ExposureOffset(CameraProperties cameraProperties) { - this.cameraProperties = cameraProperties; - this.min = getMinExposureOffset(cameraProperties); - this.max = getMaxExposureOffset(cameraProperties); + public ExposureOffsetFeature(CameraProperties cameraProperties) { + super(cameraProperties); + + this.min = getMinExposureOffset(); + this.max = getMaxExposureOffset(); // Initial offset of 0 this.currentSetting = new ExposureOffsetValue(this.min, this.max, 0); - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -37,19 +39,19 @@ public ExposureOffsetValue getValue() { @Override public void setValue(ExposureOffsetValue value) { - double stepSize = getExposureOffsetStepSize(cameraProperties); + double stepSize = getExposureOffsetStepSize(); this.currentSetting = new ExposureOffsetValue(min, max, (value.value / stepSize)); } // Available on all devices. @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -61,26 +63,24 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { /** * Return the minimum exposure offset double value. * - * @param cameraProperties * @return */ - private double getMinExposureOffset(CameraProperties cameraProperties) { + private double getMinExposureOffset() { Range range = cameraProperties.getControlAutoExposureCompensationRange(); double minStepped = range == null ? 0 : range.getLower(); - double stepSize = getExposureOffsetStepSize(cameraProperties); + double stepSize = getExposureOffsetStepSize(); return minStepped * stepSize; } /** * Return the max exposure offset double value. * - * @param cameraProperties * @return */ - private double getMaxExposureOffset(CameraProperties cameraProperties) { + private double getMaxExposureOffset() { Range range = cameraProperties.getControlAutoExposureCompensationRange(); double maxStepped = range == null ? 0 : range.getUpper(); - double stepSize = getExposureOffsetStepSize(cameraProperties); + double stepSize = getExposureOffsetStepSize(); return maxStepped * stepSize; } @@ -91,15 +91,10 @@ private double getMaxExposureOffset(CameraProperties cameraProperties) { *

Example: if this has a value of 0.5, then an aeExposureCompensation setting of -2 means that * the actual AE offset is -1. * - * @param cameraProperties * @return */ - public double getExposureOffsetStepSize(CameraProperties cameraProperties) { + public double getExposureOffsetStepSize() { Rational stepSize = cameraProperties.getControlAutoExposureCompensationStep(); return stepSize == null ? 0.0 : stepSize.doubleValue(); } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetValue.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetValue.java index 5e44e42c0cb1..686fc8721284 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetValue.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposureoffset/ExposureOffsetValue.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.exposureoffset; /** diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePoint.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java similarity index 83% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePoint.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java index 5d69f04cbd37..d62b6d3b4690 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePoint.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/exposurepoint/ExposurePointFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.exposurepoint; import android.hardware.camera2.CaptureRequest; @@ -10,16 +14,14 @@ import java.util.concurrent.Callable; /** Exposure point controls where in the frame exposure metering will come from. */ -public class ExposurePoint implements CameraFeature { +public class ExposurePointFeature extends CameraFeature { // Used later to always get the correct camera regions instance. private final Callable getCameraRegions; - private boolean isSupported; private Point currentSetting = new Point(0.0, 0.0); - public ExposurePoint( - CameraProperties cameraProperties, Callable getCameraRegions) { + public ExposurePointFeature(CameraProperties cameraProperties, Callable getCameraRegions) { + super(cameraProperties); this.getCameraRegions = getCameraRegions; - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -49,7 +51,7 @@ public void setValue(Point value) { // Whether or not this camera can set the exposure point. @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { Integer supportedRegions = cameraProperties.getControlMaxRegionsAutoExposure(); final boolean supported = supportedRegions != null && supportedRegions > 0; return supported; @@ -57,7 +59,7 @@ public boolean checkIsSupported(CameraProperties cameraProperties) { @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -75,8 +77,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { e.printStackTrace(); } } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/flash/Flash.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/flash/FlashFeature.java similarity index 85% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/flash/Flash.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/flash/FlashFeature.java index da0bf9bcb818..b0ad2dd48037 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/flash/Flash.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/flash/FlashFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.flash; import android.hardware.camera2.CaptureRequest; @@ -5,12 +9,11 @@ import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; -public class Flash implements CameraFeature { - private boolean isSupported; +public class FlashFeature extends CameraFeature { private FlashMode currentSetting = FlashMode.auto; - public Flash(CameraProperties cameraProperties) { - this.isSupported = checkIsSupported(cameraProperties); + public FlashFeature(CameraProperties cameraProperties) { + super(cameraProperties); } @Override @@ -29,7 +32,7 @@ public void setValue(FlashMode value) { } @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { Boolean available = cameraProperties.getFlashInfoAvailable(); final boolean supported = available != null && available; return supported; @@ -37,7 +40,7 @@ public boolean checkIsSupported(CameraProperties cameraProperties) { @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -75,8 +78,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { // break; } } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/focuspoint/FocusPoint.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/focuspoint/FocusPointFeature.java similarity index 72% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/focuspoint/FocusPoint.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/focuspoint/FocusPointFeature.java index 3b89b3ba22d4..7c12c9686823 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/focuspoint/FocusPoint.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/focuspoint/FocusPointFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.focuspoint; import android.hardware.camera2.CaptureRequest; @@ -8,15 +12,14 @@ import java.util.concurrent.Callable; /** Focus point controls where in the frame focus will come from. */ -public class FocusPoint implements CameraFeature { +public class FocusPointFeature extends CameraFeature { // Used later to always get the correct camera regions instance. private final Callable getCameraRegions; - private boolean isSupported; private Point currentSetting = new Point(0.0, 0.0); - public FocusPoint(CameraProperties cameraProperties, Callable getCameraRegions) { + public FocusPointFeature(CameraProperties cameraProperties, Callable getCameraRegions) { + super(cameraProperties); this.getCameraRegions = getCameraRegions; - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -46,20 +49,13 @@ public void setValue(Point value) { // Whether or not this camera can set the exposure point. @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { Integer supportedRegions = cameraProperties.getControlMaxRegionsAutoFocus(); - final boolean supported = supportedRegions != null && supportedRegions > 0; - return supported; + return supportedRegions != null && supportedRegions > 0; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { - return; - } - } - - public boolean getIsSupported() { - return this.isSupported; + // Noop: when setting a focus point there is no need to update the request builder. } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRange.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java similarity index 80% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRange.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java index 912eda61ec63..5055007b8f7f 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRange.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/fpsrange/FpsRangeFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.fpsrange; import android.hardware.camera2.CaptureRequest; @@ -6,11 +10,12 @@ import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; -public class FpsRange implements CameraFeature> { - private boolean isSupported; +public class FpsRangeFeature extends CameraFeature> { private Range currentSetting; - public FpsRange(CameraProperties cameraProperties) { + public FpsRangeFeature(CameraProperties cameraProperties) { + super(cameraProperties); + Log.i("Camera", "getAvailableFpsRange"); try { @@ -32,8 +37,6 @@ public FpsRange(CameraProperties cameraProperties) { // pictureCaptureRequest.error("cameraAccess", e.getMessage(), null); } Log.i("Camera", "[FPS Range] is:" + currentSetting); - - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -53,13 +56,13 @@ public void setValue(Range value) { // Always supported @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -67,8 +70,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { requestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, currentSetting); } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReduction.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionFeature.java similarity index 82% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReduction.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionFeature.java index 24f7376bff5f..d5206e457c3c 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReduction.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.noisereduction; import android.hardware.camera2.CaptureRequest; @@ -10,12 +14,11 @@ * and full support the fast mode. * https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES */ -public class NoiseReduction implements CameraFeature { - private boolean isSupported; +public class NoiseReductionFeature extends CameraFeature { private NoiseReductionMode currentSetting; - public NoiseReduction(CameraProperties cameraProperties) { - this.isSupported = checkIsSupported(cameraProperties); + public NoiseReductionFeature(CameraProperties cameraProperties) { + super(cameraProperties); } @Override @@ -34,8 +37,8 @@ public void setValue(NoiseReductionMode value) { } @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { - /** + public boolean checkIsSupported() { + /* * Available settings: public static final int NOISE_REDUCTION_MODE_FAST = 1; public static * final int NOISE_REDUCTION_MODE_HIGH_QUALITY = 2; public static final int * NOISE_REDUCTION_MODE_MINIMAL = 3; public static final int NOISE_REDUCTION_MODE_OFF = 0; @@ -55,7 +58,7 @@ public boolean checkIsSupported(CameraProperties cameraProperties) { @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -65,8 +68,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { requestBuilder.set( CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_FAST); } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionMode.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionMode.java index 944928920518..51fd3bb05741 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionMode.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/noisereduction/NoiseReductionMode.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.noisereduction; /** Only supports fast mode for now. */ diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/CameraRegions.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/CameraRegions.java index 48ef00158018..41f5d4810177 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/CameraRegions.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/CameraRegions.java @@ -8,9 +8,10 @@ import android.util.Size; public final class CameraRegions { + private final Size maxBoundaries; + private MeteringRectangle aeMeteringRectangle; private MeteringRectangle afMeteringRectangle; - private Size maxBoundaries; public CameraRegions(Size maxBoundaries) { assert (maxBoundaries == null || maxBoundaries.getWidth() > 0); diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/RegionBoundaries.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/RegionBoundariesFeature.java similarity index 83% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/RegionBoundaries.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/RegionBoundariesFeature.java index b6c3da725ef3..5b5264784bd5 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/RegionBoundaries.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/regionboundaries/RegionBoundariesFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.regionboundaries; import android.annotation.TargetApi; @@ -12,15 +16,15 @@ * Holds the current region boundaries. When this is created, you must provide a * CaptureRequestBuilder for which we can read the distortion correction settings from. */ -public class RegionBoundaries implements CameraFeature { - private boolean isSupported; +public class RegionBoundariesFeature extends CameraFeature { private Size currentSetting; - private CameraProperties cameraProperties; private CameraRegions cameraRegions; - public RegionBoundaries( - CameraProperties cameraProperties, CaptureRequest.Builder requestBuilder) { - this.cameraProperties = cameraProperties; + public RegionBoundariesFeature( + CameraProperties cameraProperties, + CaptureRequest.Builder requestBuilder) { + super(cameraProperties); + // No distortion correction support if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.P || !supportsDistortionCorrection()) { @@ -47,8 +51,6 @@ public RegionBoundaries( // Create new camera regions using new size cameraRegions = new CameraRegions(currentSetting); - - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -68,15 +70,13 @@ public void setValue(Size value) { // Available on all devices. @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { - return; - } + // Noop: when setting a region boundaries there is no need to update the request builder. } @TargetApi(Build.VERSION_CODES.P) @@ -94,8 +94,4 @@ private boolean supportsDistortionCorrection() { public CameraRegions getCameraRegions() { return this.cameraRegions; } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/resolution/Resolution.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java similarity index 87% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/resolution/Resolution.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java index 786a57a8dccd..99de9e67127f 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/resolution/Resolution.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.resolution; import android.hardware.camera2.CaptureRequest; @@ -7,16 +11,15 @@ import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.features.CameraFeature; -public class Resolution implements CameraFeature { +public class ResolutionFeature extends CameraFeature { private final Size captureSize; private final Size previewSize; private final CamcorderProfile recordingProfile; - // private final boolean recordingVideo; - private boolean isSupported; private ResolutionPreset currentSetting; - public Resolution( + public ResolutionFeature( CameraProperties cameraProperties, ResolutionPreset initialSetting, String cameraName) { + super(cameraProperties); setValue(initialSetting); // Resolution configuration @@ -26,10 +29,9 @@ public Resolution( Log.i("Camera", "captureSize: " + captureSize); previewSize = computeBestPreviewSize(cameraName, initialSetting); - this.isSupported = checkIsSupported(cameraProperties); } - static CamcorderProfile getBestAvailableCamcorderProfileForResolutionPreset( + public static CamcorderProfile getBestAvailableCamcorderProfileForResolutionPreset( String cameraName, ResolutionPreset preset) { int cameraId = Integer.parseInt(cameraName); switch (preset) { @@ -95,15 +97,13 @@ public void setValue(ResolutionPreset value) { // Always supported @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { - return; - } + // Noop: when setting a resolution there is no need to update the request builder. } public CamcorderProfile getRecordingProfile() { @@ -117,8 +117,4 @@ public Size getPreviewSize() { public Size getCaptureSize() { return this.captureSize; } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java index 5891f2ae29c7..fbf447947988 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java @@ -16,6 +16,7 @@ import android.view.OrientationEventListener; import android.view.Surface; import android.view.WindowManager; +import androidx.annotation.NonNull; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugins.camera.DartMessenger; @@ -34,12 +35,18 @@ public class DeviceOrientationManager { /** Factory method to create a device orientation manager. */ public static DeviceOrientationManager create( - Activity activity, DartMessenger messenger, boolean isFrontFacing, int sensorOrientation) { + @NonNull Activity activity, + @NonNull DartMessenger messenger, + boolean isFrontFacing, + int sensorOrientation) { return new DeviceOrientationManager(activity, messenger, isFrontFacing, sensorOrientation); } private DeviceOrientationManager( - Activity activity, DartMessenger messenger, boolean isFrontFacing, int sensorOrientation) { + @NonNull Activity activity, + @NonNull DartMessenger messenger, + boolean isFrontFacing, + int sensorOrientation) { this.activity = activity; this.messenger = messenger; this.isFrontFacing = isFrontFacing; diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/SensorOrientation.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/SensorOrientationFeature.java similarity index 74% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/SensorOrientation.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/SensorOrientationFeature.java index f07465565582..876d35d40196 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/SensorOrientation.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/SensorOrientationFeature.java @@ -1,29 +1,34 @@ +// Copyright 2019 The Chromium 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.camera.features.sensororientation; import android.app.Activity; import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.CaptureRequest; +import androidx.annotation.NonNull; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugins.camera.CameraProperties; import io.flutter.plugins.camera.DartMessenger; import io.flutter.plugins.camera.features.CameraFeature; -public class SensorOrientation implements CameraFeature { - private boolean isSupported; +public class SensorOrientationFeature extends CameraFeature { private Integer currentSetting = 0; private final DeviceOrientationManager deviceOrientationListener; private PlatformChannel.DeviceOrientation lockedCaptureOrientation; - public SensorOrientation( - CameraProperties cameraProperties, Activity activity, DartMessenger dartMessenger) { + public SensorOrientationFeature( + @NonNull CameraProperties cameraProperties, + @NonNull Activity activity, + @NonNull DartMessenger dartMessenger) { + super(cameraProperties); setValue(cameraProperties.getSensorOrientation()); boolean isFrontFacing = cameraProperties.getLensFacing() == CameraMetadata.LENS_FACING_FRONT; deviceOrientationListener = DeviceOrientationManager.create(activity, dartMessenger, isFrontFacing, currentSetting); deviceOrientationListener.start(); - - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -42,25 +47,19 @@ public void setValue(Integer value) { } @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { - return; - } + // Noop: when setting the sensor orientation there is no need to update the request builder. } public DeviceOrientationManager getDeviceOrientationManager() { return this.deviceOrientationListener; } - public boolean getIsSupported() { - return this.isSupported; - } - public void lockCaptureOrientation(PlatformChannel.DeviceOrientation orientation) { this.lockedCaptureOrientation = orientation; } diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevel.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java similarity index 73% rename from packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevel.java rename to packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java index fd52fafc5631..85499a47a053 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevel.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium 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.camera.features.zoomlevel; import android.graphics.Rect; @@ -7,19 +11,16 @@ import io.flutter.plugins.camera.features.CameraFeature; /** Exposure offset makes the image brighter or darker. */ -public class ZoomLevel implements CameraFeature { - private boolean isSupported; +public class ZoomLevelFeature extends CameraFeature { private Float currentSetting = CameraZoom.DEFAULT_ZOOM_FACTOR; - private CameraProperties cameraProperties; private CameraZoom cameraZoom; - public ZoomLevel(CameraProperties cameraProperties) { - this.cameraProperties = cameraProperties; + public ZoomLevelFeature(CameraProperties cameraProperties) { + super(cameraProperties); this.cameraZoom = new CameraZoom( cameraProperties.getSensorInfoActiveArraySize(), cameraProperties.getScalerAvailableMaxDigitalZoom()); - this.isSupported = checkIsSupported(cameraProperties); } @Override @@ -39,13 +40,13 @@ public void setValue(Float value) { // Available on all devices. @Override - public boolean checkIsSupported(CameraProperties cameraProperties) { + public boolean checkIsSupported() { return true; } @Override public void updateBuilder(CaptureRequest.Builder requestBuilder) { - if (!isSupported) { + if (!checkIsSupported()) { return; } @@ -58,8 +59,4 @@ public void updateBuilder(CaptureRequest.Builder requestBuilder) { public CameraZoom getCameraZoom() { return this.cameraZoom; } - - public boolean getIsSupported() { - return this.isSupported; - } } diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraRegionsTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraRegionsTest.java index 99745e56a857..1bb81314604b 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraRegionsTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraRegionsTest.java @@ -1,126 +1,126 @@ -// Copyright 2019 The Chromium 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.camera; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import android.hardware.camera2.params.MeteringRectangle; -import android.util.Size; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -public class CameraRegionsTest { - - CameraRegions cameraRegions; - - @Before - public void setUp() { - this.cameraRegions = new CameraRegions(new Size(100, 50)); - } - - @Test(expected = AssertionError.class) - public void getMeteringRectangleForPoint_should_throw_for_x_upper_bound() { - cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), 1.5, 0); - } - - @Test(expected = AssertionError.class) - public void getMeteringRectangleForPoint_should_throw_for_x_lower_bound() { - cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), -0.5, 0); - } - - @Test(expected = AssertionError.class) - public void getMeteringRectangleForPoint_should_throw_for_y_upper_bound() { - cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), 0, 1.5); - } - - @Test(expected = AssertionError.class) - public void getMeteringRectangleForPoint_should_throw_for_y_lower_bound() { - cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), 0, -0.5); - } - - @Test(expected = IllegalStateException.class) - public void getMeteringRectangleForPoint_should_throw_for_null_boundaries() { - cameraRegions.getMeteringRectangleForPoint(null, 0, -0); - } - - @Test - public void getMeteringRectangleForPoint_should_return_valid_MeteringRectangle() { - MeteringRectangle r; - // Center - r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 0.5, 0.5); - assertEquals(new MeteringRectangle(45, 23, 10, 5, 1), r); - - // Top left - r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 0.0, 0.0); - assertEquals(new MeteringRectangle(0, 0, 10, 5, 1), r); - - // Bottom right - r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 1.0, 1.0); - assertEquals(new MeteringRectangle(89, 44, 10, 5, 1), r); - - // Top left - r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 0.0, 1.0); - assertEquals(new MeteringRectangle(0, 44, 10, 5, 1), r); - - // Top right - r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 1.0, 0.0); - assertEquals(new MeteringRectangle(89, 0, 10, 5, 1), r); - } - - @Test(expected = AssertionError.class) - public void constructor_should_throw_for_0_width_boundary() { - new CameraRegions(new Size(0, 50)); - } - - @Test(expected = AssertionError.class) - public void constructor_should_throw_for_0_height_boundary() { - new CameraRegions(new Size(100, 0)); - } - - @Test - public void constructor_should_initialize() { - CameraRegions cr = new CameraRegions(new Size(100, 50)); - assertEquals(new Size(100, 50), cr.getMaxBoundaries()); - assertNull(cr.getAEMeteringRectangle()); - assertNull(cr.getAFMeteringRectangle()); - } - - @Test - public void setAutoExposureMeteringRectangleFromPoint_should_set_aeMeteringRectangle_for_point() { - CameraRegions cr = new CameraRegions(new Size(100, 50)); - cr.setAutoExposureMeteringRectangleFromPoint(0, 0); - assertEquals(new MeteringRectangle(0, 0, 10, 5, 1), cr.getAEMeteringRectangle()); - } - - @Test - public void resetAutoExposureMeteringRectangle_should_reset_aeMeteringRectangle() { - CameraRegions cr = new CameraRegions(new Size(100, 50)); - cr.setAutoExposureMeteringRectangleFromPoint(0, 0); - assertNotNull(cr.getAEMeteringRectangle()); - cr.resetAutoExposureMeteringRectangle(); - assertNull(cr.getAEMeteringRectangle()); - } - - @Test - public void setAutoFocusMeteringRectangleFromPoint_should_set_afMeteringRectangle_for_point() { - CameraRegions cr = new CameraRegions(new Size(100, 50)); - cr.setAutoFocusMeteringRectangleFromPoint(0, 0); - assertEquals(new MeteringRectangle(0, 0, 10, 5, 1), cr.getAFMeteringRectangle()); - } - - @Test - public void resetAutoFocusMeteringRectangle_should_reset_afMeteringRectangle() { - CameraRegions cr = new CameraRegions(new Size(100, 50)); - cr.setAutoFocusMeteringRectangleFromPoint(0, 0); - assertNotNull(cr.getAFMeteringRectangle()); - cr.resetAutoFocusMeteringRectangle(); - assertNull(cr.getAFMeteringRectangle()); - } -} +//// Copyright 2019 The Chromium 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.camera; +// +//import static org.junit.Assert.assertEquals; +//import static org.junit.Assert.assertNotNull; +//import static org.junit.Assert.assertNull; +// +//import android.hardware.camera2.params.MeteringRectangle; +//import android.util.Size; +//import org.junit.Before; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.robolectric.RobolectricTestRunner; +// +//@RunWith(RobolectricTestRunner.class) +//public class CameraRegionsTest { +// +// CameraRegions cameraRegions; +// +// @Before +// public void setUp() { +// this.cameraRegions = new CameraRegions(new Size(100, 50)); +// } +// +// @Test(expected = AssertionError.class) +// public void getMeteringRectangleForPoint_should_throw_for_x_upper_bound() { +// cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), 1.5, 0); +// } +// +// @Test(expected = AssertionError.class) +// public void getMeteringRectangleForPoint_should_throw_for_x_lower_bound() { +// cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), -0.5, 0); +// } +// +// @Test(expected = AssertionError.class) +// public void getMeteringRectangleForPoint_should_throw_for_y_upper_bound() { +// cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), 0, 1.5); +// } +// +// @Test(expected = AssertionError.class) +// public void getMeteringRectangleForPoint_should_throw_for_y_lower_bound() { +// cameraRegions.getMeteringRectangleForPoint(new Size(10, 10), 0, -0.5); +// } +// +// @Test(expected = IllegalStateException.class) +// public void getMeteringRectangleForPoint_should_throw_for_null_boundaries() { +// cameraRegions.getMeteringRectangleForPoint(null, 0, -0); +// } +// +// @Test +// public void getMeteringRectangleForPoint_should_return_valid_MeteringRectangle() { +// MeteringRectangle r; +// // Center +// r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 0.5, 0.5); +// assertEquals(new MeteringRectangle(45, 23, 10, 5, 1), r); +// +// // Top left +// r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 0.0, 0.0); +// assertEquals(new MeteringRectangle(0, 0, 10, 5, 1), r); +// +// // Bottom right +// r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 1.0, 1.0); +// assertEquals(new MeteringRectangle(89, 44, 10, 5, 1), r); +// +// // Top left +// r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 0.0, 1.0); +// assertEquals(new MeteringRectangle(0, 44, 10, 5, 1), r); +// +// // Top right +// r = cameraRegions.getMeteringRectangleForPoint(cameraRegions.getMaxBoundaries(), 1.0, 0.0); +// assertEquals(new MeteringRectangle(89, 0, 10, 5, 1), r); +// } +// +// @Test(expected = AssertionError.class) +// public void constructor_should_throw_for_0_width_boundary() { +// new CameraRegions(new Size(0, 50)); +// } +// +// @Test(expected = AssertionError.class) +// public void constructor_should_throw_for_0_height_boundary() { +// new CameraRegions(new Size(100, 0)); +// } +// +// @Test +// public void constructor_should_initialize() { +// CameraRegions cr = new CameraRegions(new Size(100, 50)); +// assertEquals(new Size(100, 50), cr.getMaxBoundaries()); +// assertNull(cr.getAEMeteringRectangle()); +// assertNull(cr.getAFMeteringRectangle()); +// } +// +// @Test +// public void setAutoExposureMeteringRectangleFromPoint_should_set_aeMeteringRectangle_for_point() { +// CameraRegions cr = new CameraRegions(new Size(100, 50)); +// cr.setAutoExposureMeteringRectangleFromPoint(0, 0); +// assertEquals(new MeteringRectangle(0, 0, 10, 5, 1), cr.getAEMeteringRectangle()); +// } +// +// @Test +// public void resetAutoExposureMeteringRectangle_should_reset_aeMeteringRectangle() { +// CameraRegions cr = new CameraRegions(new Size(100, 50)); +// cr.setAutoExposureMeteringRectangleFromPoint(0, 0); +// assertNotNull(cr.getAEMeteringRectangle()); +// cr.resetAutoExposureMeteringRectangle(); +// assertNull(cr.getAEMeteringRectangle()); +// } +// +// @Test +// public void setAutoFocusMeteringRectangleFromPoint_should_set_afMeteringRectangle_for_point() { +// CameraRegions cr = new CameraRegions(new Size(100, 50)); +// cr.setAutoFocusMeteringRectangleFromPoint(0, 0); +// assertEquals(new MeteringRectangle(0, 0, 10, 5, 1), cr.getAFMeteringRectangle()); +// } +// +// @Test +// public void resetAutoFocusMeteringRectangle_should_reset_afMeteringRectangle() { +// CameraRegions cr = new CameraRegions(new Size(100, 50)); +// cr.setAutoFocusMeteringRectangleFromPoint(0, 0); +// assertNotNull(cr.getAFMeteringRectangle()); +// cr.resetAutoFocusMeteringRectangle(); +// assertNull(cr.getAFMeteringRectangle()); +// } +//} diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index d0c930796486..897fdb5162eb 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -1,82 +1,74 @@ +// Copyright 2019 The Chromium 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.camera; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.hardware.camera2.CameraAccessException; -import android.media.CamcorderProfile; -import io.flutter.plugins.camera.types.ResolutionPreset; +import io.flutter.plugins.camera.features.CameraFeatureFactory; +import io.flutter.plugins.camera.features.resolution.ResolutionPreset; import io.flutter.view.TextureRegistry; import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockedStatic; -import org.robolectric.RobolectricTestRunner; -@RunWith(RobolectricTestRunner.class) public class CameraTest { @Test public void should_create_camera_plugin() throws CameraAccessException { final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceTextureEntry flutterTextureMock = + final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = mock(TextureRegistry.SurfaceTextureEntry.class); - final DartMessenger dartMessengerMock = mock(DartMessenger.class); + final CameraFeatureFactory mockCameraFeatureFactory = mock(CameraFeatureFactory.class); + final DartMessenger mockDartMessenger = mock(DartMessenger.class); + final CameraProperties mockCameraProperties = mock(CameraProperties.class); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = false; - // Mocks - final CamcorderProfile mockCamcorderProfile = mock(CamcorderProfile.class); - final CameraProperties mockCameraProperties = mock(CameraProperties.class); - final DeviceOrientationManager mockDeviceOrientationManager = - mock(DeviceOrientationManager.class); - - try (MockedStatic mockCameraUtils = mockStatic(CameraUtils.class)) { - mockCameraUtils - .when( - () -> - CameraUtils.getBestAvailableCamcorderProfileForResolutionPreset( - cameraName, resolutionPreset)) - .thenReturn(mockCamcorderProfile); - - mockCamcorderProfile.videoFrameHeight = 480; - mockCamcorderProfile.videoFrameWidth = 640; - when(mockCameraProperties.getLensFacing()).thenReturn(0); - when(mockCameraProperties.getSensorOrientation()).thenReturn(0); - when(mockCameraProperties.getCameraName()).thenReturn(cameraName); - when(mockCameraProperties.getControlAutoFocusAvailableModes()) - .thenReturn(new int[] {0, 1, 2}); - when(mockCameraProperties.getControlAutoExposureAvailableTargetFpsRanges()).thenReturn(null); - - Camera camera = null; - try (MockedStatic mockOrientationManagerFactory = - mockStatic(DeviceOrientationManager.class)) { - mockOrientationManagerFactory - .when(() -> DeviceOrientationManager.create(mockActivity, dartMessengerMock, true, 0)) - .thenReturn(mockDeviceOrientationManager); + when(mockCameraProperties.getCameraName()).thenReturn(cameraName); - camera = + Camera camera = new Camera( mockActivity, - flutterTextureMock, - dartMessengerMock, + mockFlutterTexture, + mockCameraFeatureFactory, + mockDartMessenger, mockCameraProperties, resolutionPreset, enableAudio); - } - assertNotNull("should create a camera", camera); - assertEquals( - "should be in preview state from the start", - camera.getState(), - CameraState.STATE_PREVIEW); - verify(mockDeviceOrientationManager, times(1)).start(); - } + verify(mockCameraFeatureFactory, times(1)) + .createAutoFocusFeature(mockCameraProperties, false); + verify(mockCameraFeatureFactory, times(1)) + .createExposureLockFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createExposurePointFeature(eq(mockCameraProperties), any()); + verify(mockCameraFeatureFactory, times(1)) + .createExposureOffsetFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createFlashFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createFocusPointFeature(eq(mockCameraProperties), any()); + verify(mockCameraFeatureFactory, times(1)) + .createFpsRangeFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createNoiseReductionFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, times(1)) + .createResolutionFeature(mockCameraProperties, resolutionPreset, cameraName); + verify(mockCameraFeatureFactory, times(1)) + .createSensorOrientationFeature(mockCameraProperties, mockActivity, mockDartMessenger); + verify(mockCameraFeatureFactory, times(1)) + .createZoomLevelFeature(mockCameraProperties); + verify(mockCameraFeatureFactory, never()).createRegionBoundariesFeature(any(), any()); + assertNotNull("should create a camera", camera); } } diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraZoomTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraZoomTest.java deleted file mode 100644 index 8f05da71b5c5..000000000000 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraZoomTest.java +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2019 The Chromium 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.camera; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import android.graphics.Rect; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -public class CameraZoomTest { - - @Test - public void ctor_when_parameters_are_valid() { - final Rect sensorSize = new Rect(0, 0, 0, 0); - final Float maxZoom = 4.0f; - final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom); - - assertNotNull(cameraZoom); - assertTrue(cameraZoom.hasSupport); - assertEquals(4.0f, cameraZoom.maxZoom, 0); - assertEquals(1.0f, CameraZoom.DEFAULT_ZOOM_FACTOR, 0); - } - - @Test - public void ctor_when_sensor_size_is_null() { - final Rect sensorSize = null; - final Float maxZoom = 4.0f; - final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom); - - assertNotNull(cameraZoom); - assertFalse(cameraZoom.hasSupport); - assertEquals(cameraZoom.maxZoom, 1.0f, 0); - } - - @Test - public void ctor_when_max_zoom_is_null() { - final Rect sensorSize = new Rect(0, 0, 0, 0); - final Float maxZoom = null; - final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom); - - assertNotNull(cameraZoom); - assertFalse(cameraZoom.hasSupport); - assertEquals(cameraZoom.maxZoom, 1.0f, 0); - } - - @Test - public void ctor_when_max_zoom_is_smaller_then_default_zoom_factor() { - final Rect sensorSize = new Rect(0, 0, 0, 0); - final Float maxZoom = 0.5f; - final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom); - - assertNotNull(cameraZoom); - assertFalse(cameraZoom.hasSupport); - assertEquals(cameraZoom.maxZoom, 1.0f, 0); - } - - @Test - public void setZoom_when_no_support_should_not_set_scaler_crop_region() { - final CameraZoom cameraZoom = new CameraZoom(null, null); - final Rect computedZoom = cameraZoom.computeZoom(2f); - - assertNull(computedZoom); - } - - @Test - public void setZoom_when_sensor_size_equals_zero_should_return_crop_region_of_zero() { - final Rect sensorSize = new Rect(0, 0, 0, 0); - final CameraZoom cameraZoom = new CameraZoom(sensorSize, 20f); - final Rect computedZoom = cameraZoom.computeZoom(18f); - - assertNotNull(computedZoom); - assertEquals(computedZoom.left, 0); - assertEquals(computedZoom.top, 0); - assertEquals(computedZoom.right, 0); - assertEquals(computedZoom.bottom, 0); - } - - @Test - public void setZoom_when_sensor_size_is_valid_should_return_crop_region() { - final Rect sensorSize = new Rect(0, 0, 100, 100); - final CameraZoom cameraZoom = new CameraZoom(sensorSize, 20f); - final Rect computedZoom = cameraZoom.computeZoom(18f); - - assertNotNull(computedZoom); - assertEquals(computedZoom.left, 48); - assertEquals(computedZoom.top, 48); - assertEquals(computedZoom.right, 52); - assertEquals(computedZoom.bottom, 52); - } - - @Test - public void setZoom_when_zoom_is_greater_then_max_zoom_clamp_to_max_zoom() { - final Rect sensorSize = new Rect(0, 0, 100, 100); - final CameraZoom cameraZoom = new CameraZoom(sensorSize, 10f); - final Rect computedZoom = cameraZoom.computeZoom(25f); - - assertNotNull(computedZoom); - assertEquals(computedZoom.left, 45); - assertEquals(computedZoom.top, 45); - assertEquals(computedZoom.right, 55); - assertEquals(computedZoom.bottom, 55); - } - - @Test - public void setZoom_when_zoom_is_smaller_then_min_zoom_clamp_to_min_zoom() { - final Rect sensorSize = new Rect(0, 0, 100, 100); - final CameraZoom cameraZoom = new CameraZoom(sensorSize, 10f); - final Rect computedZoom = cameraZoom.computeZoom(0.5f); - - assertNotNull(computedZoom); - assertEquals(computedZoom.left, 0); - assertEquals(computedZoom.top, 0); - assertEquals(computedZoom.right, 100); - assertEquals(computedZoom.bottom, 100); - } -} diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java index 44ba6040a467..d83910683fd4 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java @@ -12,8 +12,8 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.StandardMethodCodec; -import io.flutter.plugins.camera.types.ExposureMode; -import io.flutter.plugins.camera.types.FocusMode; +import io.flutter.plugins.camera.features.autofocus.FocusMode; +import io.flutter.plugins.camera.features.exposurelock.ExposureMode; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/PictureCaptureRequestTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/PictureCaptureRequestTest.java deleted file mode 100644 index cef547f889b8..000000000000 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/PictureCaptureRequestTest.java +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2019 The Chromium 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.camera; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugins.camera.PictureCaptureRequest.TimeoutHandler; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockedStatic; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -public class PictureCaptureRequestTest { - - @Test - public void state_is_idle_by_default() { - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - assertEquals("Default state is idle", req.getState(), PictureCaptureRequestState.STATE_IDLE); - } - - @Test - public void setState_sets_state() { - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - req.setState(PictureCaptureRequestState.STATE_WAITING_FOCUS); - assertEquals( - "State is focusing", req.getState(), PictureCaptureRequestState.STATE_WAITING_FOCUS); - req.setState(PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_START); - assertEquals( - "State is preCapture", - req.getState(), - PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_START); - req.setState(PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_DONE); - assertEquals( - "State is waitingPreCaptureReady", - req.getState(), - PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_DONE); - req.setState(PictureCaptureRequestState.STATE_CAPTURING); - assertEquals( - "State is awaitingPreCapture", req.getState(), PictureCaptureRequestState.STATE_CAPTURING); - } - - @Test - public void setState_sends_camera_error_event_When_already_finished() { - DartMessenger mockMessenger = mock(DartMessenger.class); - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, mockMessenger); - - // Make sure state is set to finished - req.setState(PictureCaptureRequestState.STATE_FINISHED); - - // Try to update state - req.setState(PictureCaptureRequestState.STATE_CAPTURING); - - verify(mockMessenger, times(1)).sendCameraErrorEvent("Request has already been finished"); - assertEquals("State is finished", req.getState(), PictureCaptureRequestState.STATE_FINISHED); - } - - @Test - public void setState_resets_timeout() { - try (MockedStatic mockTimeoutFactory = mockStatic(TimeoutHandler.class)) { - PictureCaptureRequest.TimeoutHandler mockTimeoutHandler = - mock(PictureCaptureRequest.TimeoutHandler.class); - - mockTimeoutFactory.when(TimeoutHandler::create).thenReturn(mockTimeoutHandler); - - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - req.setState(PictureCaptureRequestState.STATE_WAITING_FOCUS); - req.setState(PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_START); - req.setState(PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_DONE); - req.setState(PictureCaptureRequestState.STATE_CAPTURING); - verify(mockTimeoutHandler, times(4)).resetTimeout(any()); - verify(mockTimeoutHandler, never()).clearTimeout(any()); - } - } - - @Test - public void setState_clears_timeout() { - try (MockedStatic mockTimeoutFactory = mockStatic(TimeoutHandler.class)) { - PictureCaptureRequest.TimeoutHandler mockTimeoutHandler = - mock(PictureCaptureRequest.TimeoutHandler.class); - - mockTimeoutFactory.when(TimeoutHandler::create).thenReturn(mockTimeoutHandler); - - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - req.setState(PictureCaptureRequestState.STATE_IDLE); - req.setState(PictureCaptureRequestState.STATE_FINISHED); - req = PictureCaptureRequest.create(null, null, null); - req.setState(PictureCaptureRequestState.STATE_ERROR); - verify(mockTimeoutHandler, never()).resetTimeout(any()); - verify(mockTimeoutHandler, times(3)).clearTimeout(any()); - } - } - - @Test - public void finish_sets_result_and_state() { - // Setup - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - PictureCaptureRequest req = PictureCaptureRequest.create(mockResult, null, null); - // Act - req.finish("/test/path"); - // Test - verify(mockResult).success("/test/path"); - assertEquals("State is finished", req.getState(), PictureCaptureRequestState.STATE_FINISHED); - } - - @Test - public void finish_clears_timeout() { - try (MockedStatic mockTimeoutFactory = mockStatic(TimeoutHandler.class)) { - PictureCaptureRequest.TimeoutHandler mockTimeoutHandler = - mock(PictureCaptureRequest.TimeoutHandler.class); - - mockTimeoutFactory.when(TimeoutHandler::create).thenReturn(mockTimeoutHandler); - - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - PictureCaptureRequest req = PictureCaptureRequest.create(mockResult, null, null); - req.finish("/test/path"); - verify(mockTimeoutHandler, never()).resetTimeout(any()); - verify(mockTimeoutHandler).clearTimeout(any()); - } - } - - @Test - public void isFinished_is_true_When_state_is_finished_or_error() { - // Setup - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - // Test false states - req.setState(PictureCaptureRequestState.STATE_IDLE); - assertFalse(req.isFinished()); - req.setState(PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_START); - assertFalse(req.isFinished()); - req.setState(PictureCaptureRequestState.STATE_WAITING_PRECAPTURE_DONE); - assertFalse(req.isFinished()); - // Test true states - req.setState(PictureCaptureRequestState.STATE_FINISHED); - assertTrue(req.isFinished()); - req = PictureCaptureRequest.create(null, null, null); // Refresh - req.setState(PictureCaptureRequestState.STATE_ERROR); - assertTrue(req.isFinished()); - } - - @Test - public void finish_returns_When_in_error_state() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - PictureCaptureRequest req = PictureCaptureRequest.create(mockResult, null, null); - - // Make sure state is set to error - req.setState(PictureCaptureRequestState.STATE_ERROR); - - req.finish("/test/path"); - - assertEquals("State is error", req.getState(), PictureCaptureRequestState.STATE_ERROR); - verify(mockResult, never()).success(any()); - } - - @Test(expected = IllegalStateException.class) - public void finish_throws_When_already_finished() { - // Setup - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - req.setState(PictureCaptureRequestState.STATE_FINISHED); - // Act - req.finish("/test/path"); - } - - @Test - public void error_sets_result_and_state() { - // Setup - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - PictureCaptureRequest req = PictureCaptureRequest.create(mockResult, null, null); - // Act - req.error("ERROR_CODE", "Error Message", null); - // Test - verify(mockResult).error("ERROR_CODE", "Error Message", null); - assertEquals("State is error", req.getState(), PictureCaptureRequestState.STATE_ERROR); - } - - @Test - public void error_clears_timeout() { - try (MockedStatic mockTimeoutFactory = mockStatic(TimeoutHandler.class)) { - PictureCaptureRequest.TimeoutHandler mockTimeoutHandler = - mock(PictureCaptureRequest.TimeoutHandler.class); - - mockTimeoutFactory.when(TimeoutHandler::create).thenReturn(mockTimeoutHandler); - - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - PictureCaptureRequest req = PictureCaptureRequest.create(mockResult, null, null); - req.error("ERROR_CODE", "Error Message", null); - verify(mockTimeoutHandler, never()).resetTimeout(any()); - verify(mockTimeoutHandler).clearTimeout(any()); - } - } - - @Test - public void error_returns_When_in_error_state() { - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - PictureCaptureRequest req = PictureCaptureRequest.create(mockResult, null, null); - - // Make sure state is set to error - req.setState(PictureCaptureRequestState.STATE_ERROR); - - req.error("ERROR_CODE", "Error Message", null); - - assertEquals("State is error", req.getState(), PictureCaptureRequestState.STATE_ERROR); - verify(mockResult, never()).error(any(), any(), any()); - } - - @Test(expected = IllegalStateException.class) - public void error_throws_When_already_finished() { - // Setup - PictureCaptureRequest req = PictureCaptureRequest.create(null, null, null); - req.setState(PictureCaptureRequestState.STATE_FINISHED); - // Act - req.error(null, null, null); - } -} diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java index 401a337fa43f..81cb0ba7d42e 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/media/MediaRecorderBuilderTest.java @@ -30,7 +30,7 @@ public void build_Should_set_values_in_correct_order_When_audio_is_disabled() th CamcorderProfile recorderProfile = getEmptyCamcorderProfile(); String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; - MediaRecorder recorder = null; + MediaRecorder recorder; try (MockedStatic mockMediaRecorderFactory = mockStatic(MediaRecorderFactory.class)) { @@ -60,10 +60,8 @@ public void build_Should_set_values_in_correct_order_When_audio_is_disabled() th @Test public void build_Should_set_values_in_correct_order_When_audio_is_enabled() throws IOException { - MediaRecorder recorder = null; + MediaRecorder recorder; CamcorderProfile recorderProfile = getEmptyCamcorderProfile(); - MediaRecorderBuilder.MediaRecorderFactory mockFactory = - mock(MediaRecorderBuilder.MediaRecorderFactory.class); String outputFilePath = "mock_video_file_path"; int mediaOrientation = 1; diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/ExposureModeTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/ExposureModeTest.java index 63810f0b5684..dddbdf9d9027 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/ExposureModeTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/ExposureModeTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; +import io.flutter.plugins.camera.features.exposurelock.ExposureMode; import org.junit.Test; public class ExposureModeTest { diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java index 1f5f0c6272ed..4b146e81e041 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FlashModeTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; +import io.flutter.plugins.camera.features.flash.FlashMode; import org.junit.Test; public class FlashModeTest { diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FocusModeTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FocusModeTest.java index 4aa6fadf776b..13119589c673 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FocusModeTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/types/FocusModeTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; +import io.flutter.plugins.camera.features.autofocus.FocusMode; import org.junit.Test; public class FocusModeTest {