diff options
author | ezio84 <brabus84@gmail.com> | 2021-10-21 18:07:40 +0000 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2022-03-05 14:57:20 +0800 |
commit | f47e918c7e6f600523ee2c7196fcdbc2212c6995 (patch) | |
tree | 0e46dd497af4307c489850f2fa678b9dd8947f76 | |
parent | 7e48204a49db81d9cb58dd1fb40c247d4f3529c7 (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
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) { |