summaryrefslogtreecommitdiff
path: root/src/com/android/camera/CaptureModule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/CaptureModule.java')
-rw-r--r--src/com/android/camera/CaptureModule.java53
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();