From 2de7c9f64c39cf691d6ee22eb35d13e4acd281e7 Mon Sep 17 00:00:00 2001
From: spezi77 <spezi7713@gmx.net>
Date: Wed, 10 Nov 2021 00:45:35 +0100
Subject: [PATCH] Powermenu Torch: Allow simultaneous access

Use a callback to retrieve the torch state. This is necessary
because the flashlight can also be switched by any other triggers
outside of the power menu, e.g. by a QS Tile or Active Edge Squeezes.

Signed-off-by: spezi77 <spezi7713@gmx.net>
Change-Id: I28fa2dbe74e7310fcef057c9a9c4b8c1c0a8aee5
Signed-off-by: Joey Huab <joey@evolution-x.org>
---

diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index 5e62c02..ed41894 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -418,6 +418,10 @@
         mScreenshotHelper = new ScreenshotHelper(context);
 
         mConfigurationController.addCallback(this);
+
+        // get notified of torch state changes
+        mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
+        mCameraManager.registerTorchCallback(torchCallback, null);
     }
 
     /**
@@ -1065,20 +1069,32 @@
         return new ScreenshotAction();
     }
 
+    private CameraManager mCameraManager;
+    CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
+        @Override
+        public void onTorchModeUnavailable(String cameraId) {
+            super.onTorchModeUnavailable(cameraId);
+        }
+
+        @Override
+        public void onTorchModeChanged(String cameraId, boolean enabled) {
+            super.onTorchModeChanged(cameraId, enabled);
+            mTorchEnabled = enabled;
+        }
+    };
+
     private Action getTorchToggleAction() {
         return new SinglePressAction(com.android.systemui.R.drawable.ic_lock_torch,
                 com.android.systemui.R.string.quick_settings_flashlight_label) {
 
             public void onPress() {
                 try {
-                    CameraManager cameraManager = (CameraManager)
-                            mContext.getSystemService(Context.CAMERA_SERVICE);
-                    for (final String cameraId : cameraManager.getCameraIdList()) {
+                    for (final String cameraId : mCameraManager.getCameraIdList()) {
                         CameraCharacteristics characteristics =
-                            cameraManager.getCameraCharacteristics(cameraId);
+                            mCameraManager.getCameraCharacteristics(cameraId);
                         int orient = characteristics.get(CameraCharacteristics.LENS_FACING);
                         if (orient == CameraCharacteristics.LENS_FACING_BACK) {
-                            cameraManager.setTorchMode(cameraId, !mTorchEnabled);
+                            mCameraManager.setTorchMode(cameraId, !mTorchEnabled);
                             mTorchEnabled = !mTorchEnabled;
                         }
                     }
