Loading core/java/android/hardware/camera2/CameraManager.java +93 −94 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.hardware.CameraInfo; import android.hardware.CameraStatus; import android.hardware.ICameraService; import android.hardware.ICameraServiceListener; import android.hardware.camera2.impl.CameraDeviceImpl; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.legacy.CameraDeviceUserShim; import android.hardware.camera2.legacy.LegacyMetadataMapper; Loading @@ -41,6 +42,11 @@ import android.util.ArrayMap; import android.util.Log; import java.util.ArrayList; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * <p>A system service manager for detecting, characterizing, and connecting to Loading Loading @@ -123,16 +129,8 @@ public final class CameraManager { */ public void registerAvailabilityCallback(@NonNull AvailabilityCallback callback, @Nullable Handler handler) { if (handler == null) { Looper looper = Looper.myLooper(); if (looper == null) { throw new IllegalArgumentException( "No handler given, and current thread has no looper!"); } handler = new Handler(looper); } CameraManagerGlobal.get().registerAvailabilityCallback(callback, handler); CameraManagerGlobal.get().registerAvailabilityCallback(callback, CameraDeviceImpl.checkAndWrapHandler(handler)); } /** Loading Loading @@ -170,15 +168,8 @@ public final class CameraManager { * no looper. */ public void registerTorchCallback(@NonNull TorchCallback callback, @Nullable Handler handler) { if (handler == null) { Looper looper = Looper.myLooper(); if (looper == null) { throw new IllegalArgumentException( "No handler given, and current thread has no looper!"); } handler = new Handler(looper); } CameraManagerGlobal.get().registerTorchCallback(callback, handler); CameraManagerGlobal.get().registerTorchCallback(callback, CameraDeviceImpl.checkAndWrapHandler(handler)); } /** Loading Loading @@ -728,12 +719,13 @@ public final class CameraManager { */ private static final String CAMERA_SERVICE_BINDER_NAME = "media.camera"; private final ScheduledExecutorService mScheduler = Executors.newScheduledThreadPool(1); // Camera ID -> Status map private final ArrayMap<String, Integer> mDeviceStatus = new ArrayMap<String, Integer>(); // Registered availablility callbacks and their handlers private final ArrayMap<AvailabilityCallback, Handler> mCallbackMap = new ArrayMap<AvailabilityCallback, Handler>(); // Registered availablility callbacks and their executors private final ArrayMap<AvailabilityCallback, Executor> mCallbackMap = new ArrayMap<AvailabilityCallback, Executor>(); // torch client binder to set the torch mode with. private Binder mTorchClientBinder = new Binder(); Loading @@ -741,9 +733,9 @@ public final class CameraManager { // Camera ID -> Torch status map private final ArrayMap<String, Integer> mTorchStatus = new ArrayMap<String, Integer>(); // Registered torch callbacks and their handlers private final ArrayMap<TorchCallback, Handler> mTorchCallbackMap = new ArrayMap<TorchCallback, Handler>(); // Registered torch callbacks and their executors private final ArrayMap<TorchCallback, Executor> mTorchCallbackMap = new ArrayMap<TorchCallback, Executor>(); private final Object mLock = new Object(); Loading Loading @@ -925,49 +917,63 @@ public final class CameraManager { } } private void postSingleUpdate(final AvailabilityCallback callback, final Handler handler, private void postSingleUpdate(final AvailabilityCallback callback, final Executor executor, final String id, final int status) { if (isAvailable(status)) { handler.post( final long ident = Binder.clearCallingIdentity(); try { executor.execute( new Runnable() { @Override public void run() { callback.onCameraAvailable(id); } }); } finally { Binder.restoreCallingIdentity(ident); } } else { handler.post( final long ident = Binder.clearCallingIdentity(); try { executor.execute( new Runnable() { @Override public void run() { callback.onCameraUnavailable(id); } }); } finally { Binder.restoreCallingIdentity(ident); } } } private void postSingleTorchUpdate(final TorchCallback callback, final Handler handler, private void postSingleTorchUpdate(final TorchCallback callback, final Executor executor, final String id, final int status) { switch(status) { case ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON: case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF: handler.post( new Runnable() { @Override public void run() { case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF: { final long ident = Binder.clearCallingIdentity(); try { executor.execute(() -> { callback.onTorchModeChanged(id, status == ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON); } }); } finally { Binder.restoreCallingIdentity(ident); } } break; default: handler.post( new Runnable() { @Override public void run() { default: { final long ident = Binder.clearCallingIdentity(); try { executor.execute(() -> { callback.onTorchModeUnavailable(id); } }); } finally { Binder.restoreCallingIdentity(ident); } } break; } } Loading @@ -976,11 +982,11 @@ public final class CameraManager { * Send the state of all known cameras to the provided listener, to initialize * the listener's knowledge of camera state. */ private void updateCallbackLocked(AvailabilityCallback callback, Handler handler) { private void updateCallbackLocked(AvailabilityCallback callback, Executor executor) { for (int i = 0; i < mDeviceStatus.size(); i++) { String id = mDeviceStatus.keyAt(i); Integer status = mDeviceStatus.valueAt(i); postSingleUpdate(callback, handler, id, status); postSingleUpdate(callback, executor, id, status); } } Loading Loading @@ -1039,18 +1045,18 @@ public final class CameraManager { final int callbackCount = mCallbackMap.size(); for (int i = 0; i < callbackCount; i++) { Handler handler = mCallbackMap.valueAt(i); Executor executor = mCallbackMap.valueAt(i); final AvailabilityCallback callback = mCallbackMap.keyAt(i); postSingleUpdate(callback, handler, id, status); postSingleUpdate(callback, executor, id, status); } } // onStatusChangedLocked private void updateTorchCallbackLocked(TorchCallback callback, Handler handler) { private void updateTorchCallbackLocked(TorchCallback callback, Executor executor) { for (int i = 0; i < mTorchStatus.size(); i++) { String id = mTorchStatus.keyAt(i); Integer status = mTorchStatus.valueAt(i); postSingleTorchUpdate(callback, handler, id, status); postSingleTorchUpdate(callback, executor, id, status); } } Loading Loading @@ -1078,9 +1084,9 @@ public final class CameraManager { final int callbackCount = mTorchCallbackMap.size(); for (int i = 0; i < callbackCount; i++) { final Handler handler = mTorchCallbackMap.valueAt(i); final Executor executor = mTorchCallbackMap.valueAt(i); final TorchCallback callback = mTorchCallbackMap.keyAt(i); postSingleTorchUpdate(callback, handler, id, status); postSingleTorchUpdate(callback, executor, id, status); } } // onTorchStatusChangedLocked Loading @@ -1089,16 +1095,16 @@ public final class CameraManager { * global listener singleton. * * @param callback the new callback to send camera availability notices to * @param handler The handler on which the callback should be invoked. May not be null. * @param executor The executor which should invoke the callback. May not be null. */ public void registerAvailabilityCallback(AvailabilityCallback callback, Handler handler) { public void registerAvailabilityCallback(AvailabilityCallback callback, Executor executor) { synchronized (mLock) { connectCameraServiceLocked(); Handler oldHandler = mCallbackMap.put(callback, handler); Executor oldExecutor = mCallbackMap.put(callback, executor); // For new callbacks, provide initial availability information if (oldHandler == null) { updateCallbackLocked(callback, handler); if (oldExecutor == null) { updateCallbackLocked(callback, executor); } // If not connected to camera service, schedule a reconnect to camera service. Loading @@ -1120,14 +1126,14 @@ public final class CameraManager { } } public void registerTorchCallback(TorchCallback callback, Handler handler) { public void registerTorchCallback(TorchCallback callback, Executor executor) { synchronized(mLock) { connectCameraServiceLocked(); Handler oldHandler = mTorchCallbackMap.put(callback, handler); Executor oldExecutor = mTorchCallbackMap.put(callback, executor); // For new callbacks, provide initial torch information if (oldHandler == null) { updateTorchCallbackLocked(callback, handler); if (oldExecutor == null) { updateTorchCallbackLocked(callback, executor); } // If not connected to camera service, schedule a reconnect to camera service. Loading Loading @@ -1165,13 +1171,7 @@ public final class CameraManager { * availability callback or torch status callback. */ private void scheduleCameraServiceReconnectionLocked() { final Handler handler; if (mCallbackMap.size() > 0) { handler = mCallbackMap.valueAt(0); } else if (mTorchCallbackMap.size() > 0) { handler = mTorchCallbackMap.valueAt(0); } else { if (mCallbackMap.isEmpty() && mTorchCallbackMap.isEmpty()) { // Not necessary to reconnect camera service if no client registers a callback. return; } Loading @@ -1181,10 +1181,8 @@ public final class CameraManager { " ms"); } handler.postDelayed( new Runnable() { @Override public void run() { try { mScheduler.schedule(() -> { ICameraService cameraService = getCameraService(); if (cameraService == null) { synchronized(mLock) { Loading @@ -1194,9 +1192,10 @@ public final class CameraManager { scheduleCameraServiceReconnectionLocked(); } } }, CAMERA_SERVICE_RECONNECT_DELAY_MS, TimeUnit.MILLISECONDS); } catch (RejectedExecutionException e) { Log.e(TAG, "Failed to schedule camera service re-connect: " + e); } }, CAMERA_SERVICE_RECONNECT_DELAY_MS); } /** Loading core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java +16 −16 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.hardware.camera2.utils.TaskDrainer; import android.hardware.camera2.utils.TaskSingleDrainer; import android.os.Binder; import android.os.Handler; import android.os.HandlerExecutor; import android.util.Log; import android.view.Surface; Loading Loading @@ -57,8 +56,8 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession /** Internal camera device; used to translate calls into existing deprecated API */ private final android.hardware.camera2.impl.CameraDeviceImpl mDeviceImpl; /** Internal handler; used for all incoming events to preserve total order */ private final Handler mDeviceHandler; /** Internal executor; used for all incoming events to preserve total order */ private final Executor mDeviceExecutor; /** Drain Sequence IDs which have been queued but not yet finished with aborted/completed */ private final TaskDrainer<Integer> mSequenceDrainer; Loading Loading @@ -87,7 +86,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession CameraCaptureSessionImpl(int id, Surface input, CameraCaptureSession.StateCallback callback, Executor stateExecutor, android.hardware.camera2.impl.CameraDeviceImpl deviceImpl, Handler deviceStateHandler, boolean configureSuccess) { Executor deviceStateExecutor, boolean configureSuccess) { if (callback == null) { throw new IllegalArgumentException("callback must not be null"); } Loading @@ -99,7 +98,8 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession mStateExecutor = checkNotNull(stateExecutor, "stateExecutor must not be null"); mStateCallback = createUserStateCallbackProxy(mStateExecutor, callback); mDeviceHandler = checkNotNull(deviceStateHandler, "deviceStateHandler must not be null"); mDeviceExecutor = checkNotNull(deviceStateExecutor, "deviceStateExecutor must not be null"); mDeviceImpl = checkNotNull(deviceImpl, "deviceImpl must not be null"); /* Loading @@ -108,12 +108,12 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession * This ensures total ordering between CameraDevice.StateCallback and * CameraDeviceImpl.CaptureCallback events. */ mSequenceDrainer = new TaskDrainer<>(new HandlerExecutor(mDeviceHandler), new SequenceDrainListener(), /*name*/"seq"); mIdleDrainer = new TaskSingleDrainer(new HandlerExecutor(mDeviceHandler), new IdleDrainListener(), /*name*/"idle"); mAbortDrainer = new TaskSingleDrainer(new HandlerExecutor(mDeviceHandler), new AbortDrainListener(), /*name*/"abort"); mSequenceDrainer = new TaskDrainer<>(mDeviceExecutor, new SequenceDrainListener(), /*name*/"seq"); mIdleDrainer = new TaskSingleDrainer(mDeviceExecutor, new IdleDrainListener(), /*name*/"idle"); mAbortDrainer = new TaskSingleDrainer(mDeviceExecutor, new AbortDrainListener(), /*name*/"abort"); // CameraDevice should call configureOutputs and have it finish before constructing us Loading Loading @@ -178,7 +178,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.capture(request, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading Loading @@ -215,7 +215,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.captureBurst(requests, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading @@ -239,7 +239,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.setRepeatingRequest(request, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading Loading @@ -272,7 +272,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.setRepeatingBurst(requests, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading Loading @@ -582,7 +582,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession /** * * Create an internal state callback, to be invoked on the mDeviceHandler * Create an internal state callback, to be invoked on the mDeviceExecutor * * <p>It has a few behaviors: * <ul> Loading core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java +2 −2 Original line number Diff line number Diff line Loading @@ -62,12 +62,12 @@ public class CameraConstrainedHighSpeedCaptureSessionImpl CameraConstrainedHighSpeedCaptureSessionImpl(int id, CameraCaptureSession.StateCallback callback, Executor stateExecutor, android.hardware.camera2.impl.CameraDeviceImpl deviceImpl, Handler deviceStateHandler, boolean configureSuccess, Executor deviceStateExecutor, boolean configureSuccess, CameraCharacteristics characteristics) { mCharacteristics = characteristics; CameraCaptureSession.StateCallback wrapperCallback = new WrapperCallback(callback); mSessionImpl = new CameraCaptureSessionImpl(id, /*input*/null, wrapperCallback, stateExecutor, deviceImpl, deviceStateHandler, configureSuccess); stateExecutor, deviceImpl, deviceStateExecutor, configureSuccess); } @Override Loading core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +68 −43 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
core/java/android/hardware/camera2/CameraManager.java +93 −94 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.hardware.CameraInfo; import android.hardware.CameraStatus; import android.hardware.ICameraService; import android.hardware.ICameraServiceListener; import android.hardware.camera2.impl.CameraDeviceImpl; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.legacy.CameraDeviceUserShim; import android.hardware.camera2.legacy.LegacyMetadataMapper; Loading @@ -41,6 +42,11 @@ import android.util.ArrayMap; import android.util.Log; import java.util.ArrayList; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * <p>A system service manager for detecting, characterizing, and connecting to Loading Loading @@ -123,16 +129,8 @@ public final class CameraManager { */ public void registerAvailabilityCallback(@NonNull AvailabilityCallback callback, @Nullable Handler handler) { if (handler == null) { Looper looper = Looper.myLooper(); if (looper == null) { throw new IllegalArgumentException( "No handler given, and current thread has no looper!"); } handler = new Handler(looper); } CameraManagerGlobal.get().registerAvailabilityCallback(callback, handler); CameraManagerGlobal.get().registerAvailabilityCallback(callback, CameraDeviceImpl.checkAndWrapHandler(handler)); } /** Loading Loading @@ -170,15 +168,8 @@ public final class CameraManager { * no looper. */ public void registerTorchCallback(@NonNull TorchCallback callback, @Nullable Handler handler) { if (handler == null) { Looper looper = Looper.myLooper(); if (looper == null) { throw new IllegalArgumentException( "No handler given, and current thread has no looper!"); } handler = new Handler(looper); } CameraManagerGlobal.get().registerTorchCallback(callback, handler); CameraManagerGlobal.get().registerTorchCallback(callback, CameraDeviceImpl.checkAndWrapHandler(handler)); } /** Loading Loading @@ -728,12 +719,13 @@ public final class CameraManager { */ private static final String CAMERA_SERVICE_BINDER_NAME = "media.camera"; private final ScheduledExecutorService mScheduler = Executors.newScheduledThreadPool(1); // Camera ID -> Status map private final ArrayMap<String, Integer> mDeviceStatus = new ArrayMap<String, Integer>(); // Registered availablility callbacks and their handlers private final ArrayMap<AvailabilityCallback, Handler> mCallbackMap = new ArrayMap<AvailabilityCallback, Handler>(); // Registered availablility callbacks and their executors private final ArrayMap<AvailabilityCallback, Executor> mCallbackMap = new ArrayMap<AvailabilityCallback, Executor>(); // torch client binder to set the torch mode with. private Binder mTorchClientBinder = new Binder(); Loading @@ -741,9 +733,9 @@ public final class CameraManager { // Camera ID -> Torch status map private final ArrayMap<String, Integer> mTorchStatus = new ArrayMap<String, Integer>(); // Registered torch callbacks and their handlers private final ArrayMap<TorchCallback, Handler> mTorchCallbackMap = new ArrayMap<TorchCallback, Handler>(); // Registered torch callbacks and their executors private final ArrayMap<TorchCallback, Executor> mTorchCallbackMap = new ArrayMap<TorchCallback, Executor>(); private final Object mLock = new Object(); Loading Loading @@ -925,49 +917,63 @@ public final class CameraManager { } } private void postSingleUpdate(final AvailabilityCallback callback, final Handler handler, private void postSingleUpdate(final AvailabilityCallback callback, final Executor executor, final String id, final int status) { if (isAvailable(status)) { handler.post( final long ident = Binder.clearCallingIdentity(); try { executor.execute( new Runnable() { @Override public void run() { callback.onCameraAvailable(id); } }); } finally { Binder.restoreCallingIdentity(ident); } } else { handler.post( final long ident = Binder.clearCallingIdentity(); try { executor.execute( new Runnable() { @Override public void run() { callback.onCameraUnavailable(id); } }); } finally { Binder.restoreCallingIdentity(ident); } } } private void postSingleTorchUpdate(final TorchCallback callback, final Handler handler, private void postSingleTorchUpdate(final TorchCallback callback, final Executor executor, final String id, final int status) { switch(status) { case ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON: case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF: handler.post( new Runnable() { @Override public void run() { case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF: { final long ident = Binder.clearCallingIdentity(); try { executor.execute(() -> { callback.onTorchModeChanged(id, status == ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON); } }); } finally { Binder.restoreCallingIdentity(ident); } } break; default: handler.post( new Runnable() { @Override public void run() { default: { final long ident = Binder.clearCallingIdentity(); try { executor.execute(() -> { callback.onTorchModeUnavailable(id); } }); } finally { Binder.restoreCallingIdentity(ident); } } break; } } Loading @@ -976,11 +982,11 @@ public final class CameraManager { * Send the state of all known cameras to the provided listener, to initialize * the listener's knowledge of camera state. */ private void updateCallbackLocked(AvailabilityCallback callback, Handler handler) { private void updateCallbackLocked(AvailabilityCallback callback, Executor executor) { for (int i = 0; i < mDeviceStatus.size(); i++) { String id = mDeviceStatus.keyAt(i); Integer status = mDeviceStatus.valueAt(i); postSingleUpdate(callback, handler, id, status); postSingleUpdate(callback, executor, id, status); } } Loading Loading @@ -1039,18 +1045,18 @@ public final class CameraManager { final int callbackCount = mCallbackMap.size(); for (int i = 0; i < callbackCount; i++) { Handler handler = mCallbackMap.valueAt(i); Executor executor = mCallbackMap.valueAt(i); final AvailabilityCallback callback = mCallbackMap.keyAt(i); postSingleUpdate(callback, handler, id, status); postSingleUpdate(callback, executor, id, status); } } // onStatusChangedLocked private void updateTorchCallbackLocked(TorchCallback callback, Handler handler) { private void updateTorchCallbackLocked(TorchCallback callback, Executor executor) { for (int i = 0; i < mTorchStatus.size(); i++) { String id = mTorchStatus.keyAt(i); Integer status = mTorchStatus.valueAt(i); postSingleTorchUpdate(callback, handler, id, status); postSingleTorchUpdate(callback, executor, id, status); } } Loading Loading @@ -1078,9 +1084,9 @@ public final class CameraManager { final int callbackCount = mTorchCallbackMap.size(); for (int i = 0; i < callbackCount; i++) { final Handler handler = mTorchCallbackMap.valueAt(i); final Executor executor = mTorchCallbackMap.valueAt(i); final TorchCallback callback = mTorchCallbackMap.keyAt(i); postSingleTorchUpdate(callback, handler, id, status); postSingleTorchUpdate(callback, executor, id, status); } } // onTorchStatusChangedLocked Loading @@ -1089,16 +1095,16 @@ public final class CameraManager { * global listener singleton. * * @param callback the new callback to send camera availability notices to * @param handler The handler on which the callback should be invoked. May not be null. * @param executor The executor which should invoke the callback. May not be null. */ public void registerAvailabilityCallback(AvailabilityCallback callback, Handler handler) { public void registerAvailabilityCallback(AvailabilityCallback callback, Executor executor) { synchronized (mLock) { connectCameraServiceLocked(); Handler oldHandler = mCallbackMap.put(callback, handler); Executor oldExecutor = mCallbackMap.put(callback, executor); // For new callbacks, provide initial availability information if (oldHandler == null) { updateCallbackLocked(callback, handler); if (oldExecutor == null) { updateCallbackLocked(callback, executor); } // If not connected to camera service, schedule a reconnect to camera service. Loading @@ -1120,14 +1126,14 @@ public final class CameraManager { } } public void registerTorchCallback(TorchCallback callback, Handler handler) { public void registerTorchCallback(TorchCallback callback, Executor executor) { synchronized(mLock) { connectCameraServiceLocked(); Handler oldHandler = mTorchCallbackMap.put(callback, handler); Executor oldExecutor = mTorchCallbackMap.put(callback, executor); // For new callbacks, provide initial torch information if (oldHandler == null) { updateTorchCallbackLocked(callback, handler); if (oldExecutor == null) { updateTorchCallbackLocked(callback, executor); } // If not connected to camera service, schedule a reconnect to camera service. Loading Loading @@ -1165,13 +1171,7 @@ public final class CameraManager { * availability callback or torch status callback. */ private void scheduleCameraServiceReconnectionLocked() { final Handler handler; if (mCallbackMap.size() > 0) { handler = mCallbackMap.valueAt(0); } else if (mTorchCallbackMap.size() > 0) { handler = mTorchCallbackMap.valueAt(0); } else { if (mCallbackMap.isEmpty() && mTorchCallbackMap.isEmpty()) { // Not necessary to reconnect camera service if no client registers a callback. return; } Loading @@ -1181,10 +1181,8 @@ public final class CameraManager { " ms"); } handler.postDelayed( new Runnable() { @Override public void run() { try { mScheduler.schedule(() -> { ICameraService cameraService = getCameraService(); if (cameraService == null) { synchronized(mLock) { Loading @@ -1194,9 +1192,10 @@ public final class CameraManager { scheduleCameraServiceReconnectionLocked(); } } }, CAMERA_SERVICE_RECONNECT_DELAY_MS, TimeUnit.MILLISECONDS); } catch (RejectedExecutionException e) { Log.e(TAG, "Failed to schedule camera service re-connect: " + e); } }, CAMERA_SERVICE_RECONNECT_DELAY_MS); } /** Loading
core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java +16 −16 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.hardware.camera2.utils.TaskDrainer; import android.hardware.camera2.utils.TaskSingleDrainer; import android.os.Binder; import android.os.Handler; import android.os.HandlerExecutor; import android.util.Log; import android.view.Surface; Loading Loading @@ -57,8 +56,8 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession /** Internal camera device; used to translate calls into existing deprecated API */ private final android.hardware.camera2.impl.CameraDeviceImpl mDeviceImpl; /** Internal handler; used for all incoming events to preserve total order */ private final Handler mDeviceHandler; /** Internal executor; used for all incoming events to preserve total order */ private final Executor mDeviceExecutor; /** Drain Sequence IDs which have been queued but not yet finished with aborted/completed */ private final TaskDrainer<Integer> mSequenceDrainer; Loading Loading @@ -87,7 +86,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession CameraCaptureSessionImpl(int id, Surface input, CameraCaptureSession.StateCallback callback, Executor stateExecutor, android.hardware.camera2.impl.CameraDeviceImpl deviceImpl, Handler deviceStateHandler, boolean configureSuccess) { Executor deviceStateExecutor, boolean configureSuccess) { if (callback == null) { throw new IllegalArgumentException("callback must not be null"); } Loading @@ -99,7 +98,8 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession mStateExecutor = checkNotNull(stateExecutor, "stateExecutor must not be null"); mStateCallback = createUserStateCallbackProxy(mStateExecutor, callback); mDeviceHandler = checkNotNull(deviceStateHandler, "deviceStateHandler must not be null"); mDeviceExecutor = checkNotNull(deviceStateExecutor, "deviceStateExecutor must not be null"); mDeviceImpl = checkNotNull(deviceImpl, "deviceImpl must not be null"); /* Loading @@ -108,12 +108,12 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession * This ensures total ordering between CameraDevice.StateCallback and * CameraDeviceImpl.CaptureCallback events. */ mSequenceDrainer = new TaskDrainer<>(new HandlerExecutor(mDeviceHandler), new SequenceDrainListener(), /*name*/"seq"); mIdleDrainer = new TaskSingleDrainer(new HandlerExecutor(mDeviceHandler), new IdleDrainListener(), /*name*/"idle"); mAbortDrainer = new TaskSingleDrainer(new HandlerExecutor(mDeviceHandler), new AbortDrainListener(), /*name*/"abort"); mSequenceDrainer = new TaskDrainer<>(mDeviceExecutor, new SequenceDrainListener(), /*name*/"seq"); mIdleDrainer = new TaskSingleDrainer(mDeviceExecutor, new IdleDrainListener(), /*name*/"idle"); mAbortDrainer = new TaskSingleDrainer(mDeviceExecutor, new AbortDrainListener(), /*name*/"abort"); // CameraDevice should call configureOutputs and have it finish before constructing us Loading Loading @@ -178,7 +178,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.capture(request, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading Loading @@ -215,7 +215,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.captureBurst(requests, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading @@ -239,7 +239,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.setRepeatingRequest(request, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading Loading @@ -272,7 +272,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } return addPendingSequence(mDeviceImpl.setRepeatingBurst(requests, createCaptureCallbackProxy(handler, callback), mDeviceHandler)); createCaptureCallbackProxy(handler, callback), mDeviceExecutor)); } } Loading Loading @@ -582,7 +582,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession /** * * Create an internal state callback, to be invoked on the mDeviceHandler * Create an internal state callback, to be invoked on the mDeviceExecutor * * <p>It has a few behaviors: * <ul> Loading
core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java +2 −2 Original line number Diff line number Diff line Loading @@ -62,12 +62,12 @@ public class CameraConstrainedHighSpeedCaptureSessionImpl CameraConstrainedHighSpeedCaptureSessionImpl(int id, CameraCaptureSession.StateCallback callback, Executor stateExecutor, android.hardware.camera2.impl.CameraDeviceImpl deviceImpl, Handler deviceStateHandler, boolean configureSuccess, Executor deviceStateExecutor, boolean configureSuccess, CameraCharacteristics characteristics) { mCharacteristics = characteristics; CameraCaptureSession.StateCallback wrapperCallback = new WrapperCallback(callback); mSessionImpl = new CameraCaptureSessionImpl(id, /*input*/null, wrapperCallback, stateExecutor, deviceImpl, deviceStateHandler, configureSuccess); stateExecutor, deviceImpl, deviceStateExecutor, configureSuccess); } @Override Loading
core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +68 −43 File changed.Preview size limit exceeded, changes collapsed. Show changes