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

Commit af3be986 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Camera: Quit extension handler thread during release" into udc-dev am: f34e90c0

parents 5cb37f47 f34e90c0
Loading
Loading
Loading
Loading
+69 −59
Original line number Diff line number Diff line
@@ -851,7 +851,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {

        synchronized (mInterfaceLock) {
            mInternalRepeatingRequestEnabled = false;
            mHandlerThread.quitSafely();
            mHandlerThread.quit();

            try {
                mPreviewExtender.onDeInit();
@@ -1393,6 +1393,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
        @Override
        public void onImageAvailable(ImageReader reader) {
            Image img;
            synchronized (mInterfaceLock) {
                try {
                    img = reader.acquireNextImage();
                } catch (IllegalStateException e) {
@@ -1407,7 +1408,8 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {

                Long timestamp = img.getTimestamp();
                if (mImageListenerMap.containsKey(timestamp)) {
                Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp);
                    Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(
                            timestamp);
                    if (entry.second != null) {
                        entry.second.onImageAvailable(reader, img);
                    } else {
@@ -1415,13 +1417,15 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
                        img.close();
                    }
                } else {
                mImageListenerMap.put(img.getTimestamp(), new Pair<>(img, null));
                    mImageListenerMap.put(timestamp, new Pair<>(img, null));
                }

                notifyDroppedImages(timestamp);
            }
        }

        private void notifyDroppedImages(long timestamp) {
            synchronized (mInterfaceLock) {
                Set<Long> timestamps = mImageListenerMap.keySet();
                ArrayList<Long> removedTs = new ArrayList<>();
                for (long ts : timestamps) {
@@ -1441,10 +1445,13 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
                    mImageListenerMap.remove(ts);
                }
            }
        }

        public void registerListener(Long timestamp, OnImageAvailableListener listener) {
            synchronized (mInterfaceLock) {
                if (mImageListenerMap.containsKey(timestamp)) {
                Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp);
                    Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(
                            timestamp);
                    if (entry.first != null) {
                        listener.onImageAvailable(mImageReader, entry.first);
                        if (mOutOfBuffers) {
@@ -1460,9 +1467,11 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
                    mImageListenerMap.put(timestamp, new Pair<>(null, listener));
                }
            }
        }

        @Override
        public void close() {
            synchronized (mInterfaceLock) {
                for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) {
                    if (entry.first != null) {
                        entry.first.close();
@@ -1477,6 +1486,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
                mImageListenerMap.clear();
            }
        }
    }

    private class CloseRequestHandler extends CameraCaptureSession.CaptureCallback {
        private final CameraOutputImageCallback mImageCallback;