Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2ff33be authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Ensure device events are processed in order" into main

parents 1285e6f4 5d02d02a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1081,6 +1081,12 @@ public final class CameraManager {
     * {@link java.util.concurrent.Executor} as an argument instead of
     * {@link android.os.Handler}.</p>
     *
     * <p>Do note that typically callbacks are expected to be dispatched
     * by the executor in a single thread. If the executor uses two or
     * more threads to dispatch callbacks, then clients must ensure correct
     * synchronization and must also be able to handle potentially different
     * ordering of the incoming callbacks.</p>
     *
     * @param cameraId
     *             The unique identifier of the camera device to open
     * @param executor
+56 −2
Original line number Diff line number Diff line
@@ -290,6 +290,55 @@ public class CameraDeviceImpl extends CameraDevice
        }
    };

    private class ClientStateCallback extends StateCallback {
        private final Executor mClientExecutor;
        private final StateCallback mClientStateCallback;

        private ClientStateCallback(@NonNull Executor clientExecutor,
                @NonNull StateCallback clientStateCallback) {
            mClientExecutor = clientExecutor;
            mClientStateCallback = clientStateCallback;
        }

        public void onClosed(@NonNull CameraDevice camera) {
            mClientExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    mClientStateCallback.onClosed(camera);
                }
            });
        }
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            mClientExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    mClientStateCallback.onOpened(camera);
                }
            });
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {
            mClientExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    mClientStateCallback.onDisconnected(camera);
                }
            });
        }

        @Override
        public void onError(@NonNull CameraDevice camera, int error) {
            mClientExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    mClientStateCallback.onError(camera, error);
                }
            });
        }
    }

    public CameraDeviceImpl(String cameraId, StateCallback callback, Executor executor,
                        CameraCharacteristics characteristics,
                        Map<String, CameraCharacteristics> physicalIdsToChars,
@@ -300,8 +349,13 @@ public class CameraDeviceImpl extends CameraDevice
            throw new IllegalArgumentException("Null argument given");
        }
        mCameraId = cameraId;
        if (Flags.singleThreadExecutor()) {
            mDeviceCallback = new ClientStateCallback(executor, callback);
            mDeviceExecutor = Executors.newSingleThreadExecutor();
        } else {
            mDeviceCallback = callback;
            mDeviceExecutor = executor;
        }
        mCharacteristics = characteristics;
        mPhysicalIdsToChars = physicalIdsToChars;
        mAppTargetSdkVersion = appTargetSdkVersion;