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

Unverified Commit 0238fcf0 authored by dantmnf's avatar dantmnf Committed by Michael Bestas
Browse files

PhoneWindowManager: Check camera availability on camera key long press

And don't launch camera when camera is in use.

Change-Id: I55a96d6c777104155d879251400956713cb119b5
parent ab78ebe1
Loading
Loading
Loading
Loading
+31 −1
Original line number Original line Diff line number Diff line
@@ -270,6 +270,7 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
@@ -819,6 +820,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private LineageHardwareManager mLineageHardware;
    private LineageHardwareManager mLineageHardware;


    private boolean mLongSwipeDown;
    private boolean mLongSwipeDown;
    private CameraAvailbilityListener mCameraAvailabilityListener;


    private class PolicyHandler extends Handler {
    private class PolicyHandler extends Handler {


@@ -2541,6 +2543,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mAlarmManager = mContext.getSystemService(AlarmManager.class);
        mAlarmManager = mContext.getSystemService(AlarmManager.class);
        mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        mCameraManager.registerTorchCallback(new TorchModeCallback(), mHandler);
        mCameraManager.registerTorchCallback(new TorchModeCallback(), mHandler);
        mCameraAvailabilityListener = new CameraAvailbilityListener();
        mCameraManager.registerAvailabilityCallback(mCameraAvailabilityListener, mHandler);


        mModifierShortcutManager = new ModifierShortcutManager(mContext, mHandler);
        mModifierShortcutManager = new ModifierShortcutManager(mContext, mHandler);
        mUiMode = mContext.getResources().getInteger(
        mUiMode = mContext.getResources().getInteger(
@@ -5479,7 +5483,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                } else {
                } else {
                    mHandler.removeMessages(MSG_CAMERA_LONG_PRESS);
                    mHandler.removeMessages(MSG_CAMERA_LONG_PRESS);
                    // Consume key up events of long presses only.
                    // Consume key up events of long presses only.
                    if (mIsLongPress && mCameraLaunch) {
                    if (mIsLongPress && mCameraLaunch
                            && !mCameraAvailabilityListener.isAnyCameraInUse()) {
                        Intent intent;
                        Intent intent;
                        if (keyguardActive) {
                        if (keyguardActive) {
                            intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
                            intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
@@ -7792,4 +7797,29 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            return displayId;
            return displayId;
        }
        }
    }
    }

    private class CameraAvailbilityListener extends CameraManager.AvailabilityCallback {
        private final Set<String> mCameraInUse = Collections.synchronizedSet(new HashSet<>());

        @Override
        public void onCameraAvailable(String cameraId) {
            mCameraInUse.remove(cameraId);
        }

        @Override
        public void onCameraUnavailable(String cameraId) {
            try {
                // check if the camera id is still valid
                mCameraManager.getCameraCharacteristics(cameraId);
            } catch (Exception e) {
                // camera id is no longer valid, ignore
                return;
            }
            mCameraInUse.add(cameraId);
        }

        public boolean isAnyCameraInUse() {
            return !mCameraInUse.isEmpty();
        }
    }
}
}