summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorezio84 <brabus84@gmail.com>2021-10-21 18:07:40 +0000
committeralk3pInjection <webmaster@raspii.tech>2022-05-07 00:20:58 +0800
commite5cd9a84d44f8e02be93e8bc142510670884e91d (patch)
tree33d735efa6ff5f5171c20be78d9e44155b1cbc4e
parent2a071c3fd6f87e1a54e9e975804b8ab800e0a791 (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.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java11
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java51
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java11
8 files changed, 104 insertions, 11 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 64173d5ee713..a0e38844a81a 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5228,6 +5228,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 ad4f280b1e8d..86ccd2e0e17c 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -288,4 +288,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 0b06b35b75d6..05be12636043 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -149,6 +149,7 @@ public class CommandQueue extends IStatusBar.Stub implements
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;
@@ -411,6 +412,8 @@ public class CommandQueue extends IStatusBar.Stub implements
* @see IStatusBar#setNavigationBarLumaSamplingEnabled(int, boolean)
*/
default void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {}
+
+ default void toggleCameraFlash() {}
}
public CommandQueue(Context context) {
@@ -1121,6 +1124,14 @@ public class CommandQueue extends IStatusBar.Stub implements
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);
@@ -1495,6 +1506,11 @@ public class CommandQueue extends IStatusBar.Stub implements
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 6d9e4448f6ee..d68e631f04a6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -128,6 +128,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.EventLogTags;
import com.android.systemui.InitController;
import com.android.systemui.Prefs;
@@ -436,6 +437,11 @@ public class StatusBar extends SystemUI implements
mCommandQueueCallbacks.animateCollapsePanels(flags, force);
}
+ /** */
+ public void toggleCameraFlash() {
+ mCommandQueueCallbacks.toggleCameraFlash();
+ }
+
/**
* The {@link StatusBarState} of the status bar.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
index d206304f321e..93a3c225c705 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
@@ -49,6 +49,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.view.AppearanceRegion;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.camera.CameraIntents;
@@ -64,6 +65,7 @@ import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
@@ -104,6 +106,7 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
private final int mDisplayId;
private final boolean mVibrateOnOpening;
private final VibrationEffect mCameraLaunchGestureVibrationEffect;
+ private FlashlightController mFlashlightController;
private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
@@ -171,6 +174,7 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
mVibrateOnOpening = resources.getBoolean(R.bool.config_vibrateOnIconAnimation);
mCameraLaunchGestureVibrationEffect = getCameraGestureVibrationEffect(
mVibratorOptional, resources);
+ mFlashlightController = Dependency.get(FlashlightController.class);
}
@Override
@@ -640,4 +644,11 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
}
return VibrationEffect.createWaveform(timings, /* repeat= */ -1);
}
+
+ @Override
+ public void toggleCameraFlash() {
+ if (mFlashlightController.isAvailable()) {
+ mFlashlightController.setFlashlight(!mFlashlightController.isEnabled());
+ }
+ }
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index f26c7707d404..813fb2dcf620 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -610,6 +610,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;
@@ -780,6 +782,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();
}
@@ -924,7 +929,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.
@@ -960,12 +967,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
@@ -1017,6 +1018,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
break;
}
}
+ } else if (mTorchActionMode != 0 && beganFromNonInteractive) {
+ wakeUpFromPowerKey(eventTime);
}
}
@@ -2052,10 +2055,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);
@@ -2073,6 +2083,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.
*/
@@ -2212,6 +2238,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 d4b4f455657e..da7f91fe8c57 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -881,6 +881,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) {