diff options
author | ezio84 <brabus84@gmail.com> | 2021-10-21 18:07:40 +0000 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2022-05-07 00:20:58 +0800 |
commit | e5cd9a84d44f8e02be93e8bc142510670884e91d (patch) | |
tree | 33d735efa6ff5f5171c20be78d9e44155b1cbc4e | |
parent | 2a071c3fd6f87e1a54e9e975804b8ab800e0a791 (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
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) { |