diff options
Diffstat (limited to 'src/com/android/camera/CaptureModule.java')
-rw-r--r-- | src/com/android/camera/CaptureModule.java | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index 1068bcf52..32417f60e 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -91,6 +91,9 @@ import com.android.camera2.R; import com.android.ex.camera2.portability.CameraAgent.CameraProxy; import com.google.common.logging.eventprotos; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -110,7 +113,8 @@ public class CaptureModule extends CameraModule implements OneCamera.PictureCallback, OneCamera.FocusStateListener, OneCamera.ReadyStateChangedListener, - RemoteCameraModule { + RemoteCameraModule, + OneCameraManager.AvailabilityCallback { private static final Tag TAG = new Tag("CaptureModule"); /** Enable additional debug output. */ @@ -168,6 +172,9 @@ public class CaptureModule extends CameraModule implements private OneCameraCharacteristics mCameraCharacteristics; final private PreviewTransformCalculator mPreviewTransformCalculator; + private ScheduledExecutorService mOnCameraAccessService; + private ScheduledFuture mOnCameraAccessFuture; + /** The listener to listen events from the CaptureModuleUI. */ private final CaptureModuleUI.CaptureModuleUIListener mUIListener = new CaptureModuleUI.CaptureModuleUIListener() { @@ -405,12 +412,14 @@ public class CaptureModule extends CameraModule implements thread.start(); mCameraHandler = new Handler(thread.getLooper()); mOneCameraOpener = mAppController.getCameraOpener(); + mOnCameraAccessService = Executors.newSingleThreadScheduledExecutor(); try { mOneCameraManager = OneCameraModule.provideOneCameraManager(); } catch (OneCameraException e) { Log.e(TAG, "Unable to provide a OneCameraManager. ", e); } + mOneCameraManager.setAvailabilityCallback(this, mCameraHandler); mDisplayRotation = CameraUtil.getDisplayRotation(activity); mCameraFacing = getFacingFromCameraId( mSettingsManager.getInteger(mAppController.getModuleScope(), Keys.KEY_CAMERA_ID)); @@ -503,6 +512,27 @@ public class CaptureModule extends CameraModule implements } } + @Override + public void onCameraAccessPrioritiesChanged() { + Log.d(TAG, "onCameraAccessPrioritiesChanged"); + Runnable runnable = () -> { + mMainThread.execute(() -> { + if (!mPaused && mCamera == null && !mAppController.isPaused()) { + openCameraAndStartPreview(); + } + }); + }; + + // onCameraAccessPrioritiesChanged callbacks come in rapid fire due to the way process oom + // scores are updated. To avoid redundantly opening the camera, wait for 300 ms of silence + // before trying on the main thread. + if (mOnCameraAccessFuture != null) { + mOnCameraAccessFuture.cancel(false); + } + mOnCameraAccessFuture = mOnCameraAccessService.schedule(runnable, 300, + TimeUnit.MILLISECONDS); + } + private void decorateSessionAtCaptureTime(CaptureSession session) { String flashSetting = @@ -1393,6 +1423,27 @@ public class CaptureModule extends CameraModule implements } @Override + public void onCameraInUse() { + Log.w(TAG, "Camera in use."); + if (mCamera != null) { + mCamera.close(); + } + mCamera = null; + mCameraOpenCloseLock.release(); + } + + @Override + public void onCameraInterrupted() { + Log.w(TAG, "Camera disconnected during active session."); + AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + closeCamera(); + } + }); + } + + @Override public void onCameraClosed() { mCamera = null; mCameraOpenCloseLock.release(); |