PowerManagerService: Allow to light up buttons only when pressed

Co-authored-by: Corinna Vinschen <xda@vinschen.de>
Change-Id: I5b486e65a5b7d9d16590941df0af4d9c604dedc4
diff --git a/services/core/java/com/android/server/power/PowerGroup.java b/services/core/java/com/android/server/power/PowerGroup.java
index 7439960..66192a7 100644
--- a/services/core/java/com/android/server/power/PowerGroup.java
+++ b/services/core/java/com/android/server/power/PowerGroup.java
@@ -89,6 +89,9 @@
     /** The current wakefulness of this group */
     private int mWakefulness;
     private int mWakeLockSummary;
+    private boolean mButtonOn;
+    private boolean mButtonPressed;
+    private long mLastButtonActivityTime;
     private long mLastPowerOnTime;
     private long mLastUserActivityTime;
     private long mLastUserActivityTimeNoChangeLights;
@@ -369,10 +372,34 @@
         return true;
     }
 
+    boolean getButtonOnLocked() {
+        return mButtonOn;
+    }
+
+    boolean getButtonPressedLocked() {
+        return mButtonPressed;
+    }
+
+    long getLastButtonActivityTimeLocked() {
+        return mLastButtonActivityTime;
+    }
+
     long getLastUserActivityTimeLocked() {
         return mLastUserActivityTime;
     }
 
+    void setButtonOnLocked(boolean on) {
+        mButtonOn = on;
+    }
+
+    void setButtonPressedLocked(boolean pressed) {
+        mButtonPressed = pressed;
+    }
+
+    void setLastButtonActivityTimeLocked(long lastButtonActivityTime) {
+        mLastButtonActivityTime = lastButtonActivityTime;
+    }
+
     void setLastUserActivityTimeLocked(long lastUserActivityTime,
             @PowerManager.UserActivityEvent int event) {
         mLastUserActivityTime = lastUserActivityTime;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 404d776..b081015 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -378,6 +378,8 @@
     private int mButtonTimeout;
     private float mButtonBrightness;
 
+    private boolean mButtonLightOnKeypressOnly;
+
     private final InattentiveSleepWarningController mInattentiveSleepWarningOverlayController;
     private final AmbientDisplaySuppressionController mAmbientDisplaySuppressionController;
 
@@ -1579,6 +1581,9 @@
         resolver.registerContentObserver(LineageSettings.Secure.getUriFor(
                 LineageSettings.Secure.BUTTON_BACKLIGHT_TIMEOUT),
                 false, mSettingsObserver, UserHandle.USER_ALL);
+        resolver.registerContentObserver(LineageSettings.System.getUriFor(
+                LineageSettings.System.BUTTON_BACKLIGHT_ONLY_WHEN_PRESSED),
+                false, mSettingsObserver, UserHandle.USER_ALL);
 
         // Register for broadcasts from other components of the system.
         IntentFilter filter = new IntentFilter();
@@ -1719,6 +1724,9 @@
         mButtonBrightness = LineageSettings.Secure.getFloatForUser(resolver,
                 LineageSettings.Secure.BUTTON_BRIGHTNESS, mButtonBrightnessDefault,
                 UserHandle.USER_CURRENT);
+        mButtonLightOnKeypressOnly = LineageSettings.System.getIntForUser(resolver,
+                LineageSettings.System.BUTTON_BACKLIGHT_ONLY_WHEN_PRESSED,
+                0, UserHandle.USER_CURRENT) == 1;
 
         mDirty |= DIRTY_SETTINGS;
     }
@@ -2318,6 +2326,13 @@
                 }
             } else {
                 if (eventTime > powerGroup.getLastUserActivityTimeLocked()) {
+                    powerGroup.setButtonPressedLocked(
+                            event == PowerManager.USER_ACTIVITY_EVENT_BUTTON);
+                    if ((mButtonLightOnKeypressOnly && powerGroup.getButtonPressedLocked())
+                            || eventTime == powerGroup.getLastWakeTimeLocked()) {
+                        powerGroup.setButtonPressedLocked(true);
+                        powerGroup.setLastButtonActivityTimeLocked(eventTime);
+                    }
                     powerGroup.setLastUserActivityTimeLocked(eventTime, event);
                     mDirty |= DIRTY_USER_ACTIVITY;
                     if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) {
@@ -3185,14 +3200,32 @@
                                     buttonBrightness = mButtonBrightness;
                                 }
 
-                                if (mButtonTimeout != 0 &&
-                                        now > lastUserActivityTime + mButtonTimeout) {
+                                if (!mButtonLightOnKeypressOnly) {
+                                    powerGroup.setLastButtonActivityTimeLocked(
+                                            lastUserActivityTime);
+                                }
+                                final long lastButtonActivityTimeout = mButtonTimeout +
+                                        powerGroup.getLastButtonActivityTimeLocked();
+
+                                if (mButtonTimeout != 0 && now > lastButtonActivityTimeout) {
                                     mButtonsLight.setBrightness(BRIGHTNESS_OFF_FLOAT);
+                                    powerGroup.setButtonOnLocked(false);
                                 } else {
-                                    mButtonsLight.setBrightness(buttonBrightness);
-                                    if (buttonBrightness != BRIGHTNESS_OFF_FLOAT &&
-                                            mButtonTimeout != 0) {
-                                        groupNextTimeout = now + mButtonTimeout;
+                                    if (!mProximityPositive && (!mButtonLightOnKeypressOnly ||
+                                            powerGroup.getButtonPressedLocked())) {
+                                        mButtonsLight.setBrightness(buttonBrightness);
+                                        powerGroup.setButtonPressedLocked(false);
+                                        if (buttonBrightness != BRIGHTNESS_OFF_FLOAT &&
+                                                mButtonTimeout != 0) {
+                                            powerGroup.setButtonOnLocked(true);
+                                            if (now + mButtonTimeout < nextTimeout) {
+                                                groupNextTimeout = now + mButtonTimeout;
+                                            }
+                                        }
+                                    } else if (mButtonLightOnKeypressOnly &&
+                                            lastButtonActivityTimeout < nextTimeout &&
+                                            powerGroup.getButtonOnLocked()) {
+                                        groupNextTimeout = lastButtonActivityTimeout;
                                     }
                                 }
                             }
@@ -3204,6 +3237,7 @@
                             if (wakefulness == WAKEFULNESS_AWAKE) {
                                 if (mButtonsLight != null) {
                                     mButtonsLight.setBrightness(BRIGHTNESS_OFF_FLOAT);
+                                    powerGroup.setButtonOnLocked(false);
                                 }
                             }
                         }