summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorezio84 <brabus84@gmail.com>2021-10-21 18:07:40 +0000
committeralk3pInjection <webmaster@raspii.tech>2022-03-05 14:57:20 +0800
commitf47e918c7e6f600523ee2c7196fcdbc2212c6995 (patch)
tree0e46dd497af4307c489850f2fa678b9dd8947f76
parent7e48204a49db81d9cb58dd1fb40c247d4f3529c7 (diff)
base: Long press power button to toggle flashlight [1/2]
* Thanks to beanstown106 for the initial longpress action calls in PhoneWindowManager (improved by lineage guys) * Remove the settings pref if the device doesn't have flashlight * Vibrate when toggling torch to let the user know of unwanted toggling in the pocket (even if vibration is disabled by user) * Allow torch action also on ambient display [AEX Edits] : - Port to S - simplify code [mydongistiny]: - Fixed for android10 [DennySPB] : - base: ScreenOff torch: Allow to disable torch when screen is on [mickaelmendes50] : - Adapt to AOSPA * We don't allow users to use the Double Press power option, so remove the non used code. * Removed "double press power to toggle torch" * Removed "handle camera gesture here instead of extensions" * Removed "Add 170ms delay for double tap action" Change-Id: I12da044f86c7b625872607529cf8524615cf576b
-rw-r--r--core/java/android/provider/Settings.java10
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl5
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java19
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java51
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java11
7 files changed, 106 insertions, 11 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 09583e31067f..28f43b7c69ca 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5203,6 +5203,16 @@ public final class Settings {
public static final String VOLBTN_MUSIC_CONTROLS = "volbtn_music_controls";
/**
+ * Whether the torch launch gesture to double tap or long press the power button when the
+ * screen is off should be enabled. *
+ * 0: disabled
+ * 1: double tap power for torch
+ * 2: long tap power for torch
+ * @hide
+ */
+ public static final String TORCH_POWER_BUTTON_GESTURE = "torch_power_button_gesture";
+
+ /**
* Keys we no longer back up under the current schema, but want to continue to
* process when restoring historical backup datasets.
*
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index ed6415d749a3..5b000c102d46 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -284,4 +284,9 @@ oneway interface IStatusBar
* Triggers a GC in the system and status bar.
*/
void runGcForTest();
+
+ /**
+ * Toggles flashlight of the device
+ */
+ void toggleCameraFlash();
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index fd28d1be8106..44c530972409 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -162,4 +162,9 @@ interface IStatusBarService
* Starts the default assistant app.
*/
void startAssist(in Bundle args);
+
+ /**
+ * Toggles flashlight of the device
+ */
+ void toggleCameraFlash();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 50911d162113..2dd4272abc95 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -147,6 +147,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
private static final int MSG_EMERGENCY_ACTION_LAUNCH_GESTURE = 58 << MSG_SHIFT;
private static final int MSG_SET_NAVIGATION_BAR_LUMA_SAMPLING_ENABLED = 59 << MSG_SHIFT;
private static final int MSG_SET_UDFPS_HBM_LISTENER = 60 << MSG_SHIFT;
+ private static final int MSG_TOGGLE_CAMERA_FLASH = 61 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -400,6 +401,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
* @see IStatusBar#setNavigationBarLumaSamplingEnabled(int, boolean)
*/
default void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {}
+
+ default void toggleCameraFlash() {}
}
public CommandQueue(Context context) {
@@ -1104,6 +1107,14 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
GcUtils.runGcAndFinalizersSync();
}
+ @Override
+ public void toggleCameraFlash() {
+ synchronized (mLock) {
+ mHandler.removeMessages(MSG_TOGGLE_CAMERA_FLASH);
+ mHandler.sendEmptyMessage(MSG_TOGGLE_CAMERA_FLASH);
+ }
+ }
+
private final class H extends Handler {
private H(Looper l) {
super(l);
@@ -1477,6 +1488,11 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
msg.arg2 != 0);
}
break;
+ case MSG_TOGGLE_CAMERA_FLASH:
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).toggleCameraFlash();
+ }
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 133b00164337..37e5837f80dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -140,6 +140,7 @@ import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.ActivityIntentHelper;
import com.android.systemui.AutoReinflateContainer;
import com.android.systemui.DejankUtils;
+import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.EventLogTags;
import com.android.systemui.InitController;
@@ -238,6 +239,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController.Configurati
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.statusbar.policy.ExtensionController;
+import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -650,6 +652,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
};
+ private FlashlightController mFlashlightController;
private final UserSwitcherController mUserSwitcherController;
private final NetworkController mNetworkController;
private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
@@ -1380,6 +1383,8 @@ public class StatusBar extends SystemUI implements DemoMode,
// Private API call to make the shadows look better for Recents
ThreadedRenderer.overrideProperty("ambientRatio", String.valueOf(1.5f));
+
+ mFlashlightController = Dependency.get(FlashlightController.class);
}
@@ -2281,6 +2286,16 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
+ @Override
+ public void toggleCameraFlash() {
+ if (DEBUG) {
+ Log.d(TAG, "Toggling camera flashlight");
+ }
+ if (mFlashlightController.isAvailable()) {
+ mFlashlightController.setFlashlight(!mFlashlightController.isEnabled());
+ }
+ }
+
void makeExpandedVisible(boolean force) {
if (SPEW) Log.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible);
if (!force && (mExpandedVisible || !mCommandQueue.panelsEnabled())) {
@@ -2819,6 +2834,10 @@ public class StatusBar extends SystemUI implements DemoMode,
pw.println(" Secure camera: " + CameraIntents.getSecureCameraIntent(mContext));
pw.println(" Override package: "
+ String.valueOf(CameraIntents.getOverrideCameraPackage(mContext)));
+
+ if (mFlashlightController != null) {
+ mFlashlightController.dump(fd, pw, args);
+ }
}
public static void dumpBarTransitions(
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 871610360e81..d6ecab0f5d6a 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -613,6 +613,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private final List<DeviceKeyHandler> mDeviceKeyHandlers = new ArrayList<>();
+ private int mTorchActionMode;
+
private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
private static final int MSG_KEYGUARD_DRAWN_COMPLETE = 5;
@@ -783,6 +785,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.VOLBTN_MUSIC_CONTROLS), false, this,
UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.TORCH_POWER_BUTTON_GESTURE), false, this,
+ UserHandle.USER_ALL);
updateSettings();
}
@@ -927,7 +932,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|| handledByPowerManager || mKeyCombinationManager.isPowerKeyIntercepted();
if (!mPowerKeyHandled) {
if (!interactive) {
- wakeUpFromPowerKey(event.getDownTime());
+ if (mTorchActionMode == 0) {
+ wakeUpFromPowerKey(event.getDownTime());
+ }
}
} else {
// handled by another power key policy.
@@ -963,12 +970,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) {
- if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) {
- Slog.i(TAG, "Suppressed redundant power key press while "
- + "already in the process of turning the screen on.");
- return;
- }
-
final boolean interactive = Display.isOnState(mDefaultDisplay.getState());
Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive
@@ -1020,6 +1021,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
break;
}
}
+ } else if (mTorchActionMode != 0 && beganFromNonInteractive) {
+ wakeUpFromPowerKey(eventTime);
}
}
@@ -2047,10 +2050,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
void onLongPress(long eventTime) {
- if (mSingleKeyGestureDetector.beganFromNonInteractive()
- && !mSupportLongPressPowerWhenNonInteractive) {
- Slog.v(TAG, "Not support long press power when device is not interactive.");
- return;
+ if (mSingleKeyGestureDetector.beganFromNonInteractive() || isFlashLightIsOn()) {
+ if (mTorchActionMode != 0) {
+ performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
+ "Power - Long Press - Torch");
+ toggleCameraFlash();
+ return;
+ }
+ if (!mSupportLongPressPowerWhenNonInteractive) {
+ Slog.v(TAG, "Not support long press power when device is not interactive.");
+ return;
+ }
}
powerLongPress(eventTime);
@@ -2068,6 +2078,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private boolean isFlashLightIsOn() {
+ return Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.FLASHLIGHT_ENABLED, 0) != 0;
+ }
+
+ public void toggleCameraFlash() {
+ IStatusBarService service = getStatusBarService();
+ if (service != null) {
+ try {
+ service.toggleCameraFlash();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to toggle camera flash:", e);
+ }
+ }
+ }
+
/**
* Rule for single back key gesture.
*/
@@ -2207,6 +2233,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mVolBtnMusicControls = Settings.System.getIntForUser(resolver,
Settings.System.VOLBTN_MUSIC_CONTROLS, 0,
UserHandle.USER_CURRENT) == 1;
+ mTorchActionMode = Settings.System.getIntForUser(resolver,
+ Settings.System.TORCH_POWER_BUTTON_GESTURE, 0,
+ UserHandle.USER_CURRENT);
}
if (updateRotation) {
updateRotation(true);
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 2d075168664c..4b25161d9a9f 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -878,6 +878,17 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
return mTracingEnabled;
}
+ @Override
+ public void toggleCameraFlash() {
+ if (mBar != null) {
+ try {
+ mBar.toggleCameraFlash();
+ } catch (RemoteException ex) {
+ Slog.e(TAG, "Unable to toggle camera flash:", ex);
+ }
+ }
+ }
+
// TODO(b/117478341): make it aware of multi-display if needed.
@Override
public void disable(int what, IBinder token, String pkg) {