Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3579371a authored by Danny Baumann's avatar Danny Baumann Committed by Steve Kondik
Browse files

Add PowerManager integration for button and keyboard backlight.

Allows setting button and keyboard backlight brightness as well as
button timeout.

Change-Id: I550cccafc0a8f90d6347de9261adb26b75955cc4
parent dcf8496c
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -1265,5 +1265,21 @@ public final class PowerManager {
        }
    }

    /**
     * Gets the default button brightness value.
     * @hide
     */
    public int getDefaultButtonBrightness() {
        return mContext.getResources().getInteger(
                com.android.internal.R.integer.config_buttonBrightnessSettingDefault);
    }

    /**
     * Gets the default keyboard brightness value.
     * @hide
     */
    public int getDefaultKeyboardBrightness() {
        return mContext.getResources().getInteger(
                com.android.internal.R.integer.config_keyboardBrightnessSettingDefault);
    }
}
+22 −0
Original line number Diff line number Diff line
@@ -2453,6 +2453,28 @@ public final class Settings {
         */
        public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1;

        /**
         * The keyboard brightness to be used while the screen is on.
         * Valid value range is between 0 and {@link PowerManager#getMaximumKeyboardBrightness()}
         * @hide
         */
        public static final String KEYBOARD_BRIGHTNESS = "keyboard_brightness";

        /**
         * The button brightness to be used while the screen is on or after a button press,
         * depending on the value of {@link BUTTON_BACKLIGHT_TIMEOUT}.
         * Valid value range is between 0 and {@link PowerManager#getMaximumButtonBrightness()}
         * @hide
         */
        public static final String BUTTON_BRIGHTNESS = "button_brightness";

        /**
         * The time in ms to keep the button backlight on after pressing a button.
         * A value of 0 will keep the buttons on for as long as the screen is on.
         * @hide
         */
        public static final String BUTTON_BACKLIGHT_TIMEOUT = "button_backlight_timeout";

        /**
         * Control whether the process CPU usage meter should be shown.
         *
+4 −0
Original line number Diff line number Diff line
@@ -1069,6 +1069,10 @@
    <integer-array name="config_autoBrightnessKeyboardBacklightValues">
    </integer-array>

    <integer name="config_buttonBrightnessSettingDefault">255</integer>
    <integer name="config_keyboardBrightnessSettingDefault">0</integer>
    <bool name="config_deviceHasVariableButtonBrightness">false</bool>

    <!-- Amount of time it takes for the light sensor to warm up in milliseconds.
         For this time after the screen turns on, the Power Manager
         will not debounce light sensor readings -->
+3 −0
Original line number Diff line number Diff line
@@ -1710,6 +1710,9 @@
  <java-symbol type="integer" name="config_screenBrightnessDark" />
  <java-symbol type="integer" name="config_screenBrightnessDim" />
  <java-symbol type="integer" name="config_screenBrightnessDoze" />
  <java-symbol type="integer" name="config_buttonBrightnessSettingDefault" />
  <java-symbol type="integer" name="config_keyboardBrightnessSettingDefault" />
  <java-symbol type="bool" name="config_deviceHasVariableButtonBrightness" />
  <java-symbol type="integer" name="config_shutdownBatteryTemperature" />
  <java-symbol type="integer" name="config_undockedHdmiRotation" />
  <java-symbol type="integer" name="config_virtualKeyQuietTimeMillis" />
+77 −9
Original line number Diff line number Diff line
@@ -156,6 +156,8 @@ public final class PowerManagerService extends SystemService
    // Power features defined in hardware/libhardware/include/hardware/power.h.
    private static final int POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 1;

    private static final int DEFAULT_BUTTON_ON_DURATION = 5 * 1000;

    // Default setting for double tap to wake.
    private static final int DEFAULT_DOUBLE_TAP_TO_WAKE = 0;

@@ -181,6 +183,12 @@ public final class PowerManagerService extends SystemService
    private Light mCapsLight;
    private Light mFnLight;

    private int mButtonTimeout;
    private int mButtonBrightness;
    private int mButtonBrightnessSettingDefault;
    private int mKeyboardBrightness;
    private int mKeyboardBrightnessSettingDefault;

    private final Object mLock = new Object();

    // A bitfield that indicates what parts of the power state have
@@ -399,6 +407,11 @@ public final class PowerManagerService extends SystemService
    // Use -1 to disable.
    private int mScreenBrightnessOverrideFromWindowManager = -1;

    // The button brightness setting override from the window manager
    // to allow the current foreground activity to override the button brightness.
    // Use -1 to disable.
    private int mButtonBrightnessOverrideFromWindowManager = -1;

    // The user activity timeout override from the window manager
    // to allow the current foreground activity to override the user activity timeout.
    // Use -1 to disable.
@@ -533,6 +546,8 @@ public final class PowerManagerService extends SystemService
            mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();
            mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();
            mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();
            mButtonBrightnessSettingDefault = pm.getDefaultButtonBrightness();
            mKeyboardBrightnessSettingDefault = pm.getDefaultKeyboardBrightness();

            SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());

@@ -619,6 +634,16 @@ public final class PowerManagerService extends SystemService
            resolver.registerContentObserver(Settings.Secure.getUriFor(
                    Settings.Secure.DOUBLE_TAP_TO_WAKE),
                    false, mSettingsObserver, UserHandle.USER_ALL);
            resolver.registerContentObserver(Settings.System.getUriFor(
                    Settings.System.BUTTON_BRIGHTNESS),
                    false, mSettingsObserver, UserHandle.USER_ALL);
            resolver.registerContentObserver(Settings.System.getUriFor(
                    Settings.System.KEYBOARD_BRIGHTNESS),
                    false, mSettingsObserver, UserHandle.USER_ALL);
            resolver.registerContentObserver(Settings.System.getUriFor(
                    Settings.System.BUTTON_BACKLIGHT_TIMEOUT),
                    false, mSettingsObserver, UserHandle.USER_ALL);

            // Go.
            readConfigurationLocked();
            updateSettingsLocked();
@@ -736,6 +761,17 @@ public final class PowerManagerService extends SystemService
            updateLowPowerModeLocked();
        }

        mButtonTimeout = Settings.System.getIntForUser(resolver,
                Settings.System.BUTTON_BACKLIGHT_TIMEOUT,
                DEFAULT_BUTTON_ON_DURATION, UserHandle.USER_CURRENT);

        mButtonBrightness = Settings.System.getIntForUser(resolver,
                Settings.System.BUTTON_BRIGHTNESS, mButtonBrightnessSettingDefault,
                UserHandle.USER_CURRENT);
        mKeyboardBrightness = Settings.System.getIntForUser(resolver,
                Settings.System.KEYBOARD_BRIGHTNESS, mKeyboardBrightnessSettingDefault,
                UserHandle.USER_CURRENT);

        mDirty |= DIRTY_SETTINGS;
    }

@@ -1554,18 +1590,30 @@ public final class PowerManagerService extends SystemService
                    nextTimeout = mLastUserActivityTime
                            + screenOffTimeout - screenDimDuration;
                    if (now < nextTimeout) {
                        if (now > mLastUserActivityTime + BUTTON_ON_DURATION) {
                        int buttonBrightness, keyboardBrightness;
                        if (mButtonBrightnessOverrideFromWindowManager >= 0) {
                            buttonBrightness = mButtonBrightnessOverrideFromWindowManager;
                            keyboardBrightness = mButtonBrightnessOverrideFromWindowManager;
                        } else {
                            buttonBrightness = mButtonBrightness;
                            keyboardBrightness = mKeyboardBrightness;
                        }

                        mKeyboardLight.setBrightness(mKeyboardVisible ? keyboardBrightness : 0);
                        if (mButtonTimeout != 0 && now > mLastUserActivityTime + mButtonTimeout) {
                             mButtonsLight.setBrightness(0);
                            mKeyboardLight.setBrightness(0);
                        } else {
                            mButtonsLight.setBrightness(mDisplayPowerRequest.screenBrightness);
                            mKeyboardLight.setBrightness(mKeyboardVisible ? mDisplayPowerRequest.screenBrightness : 0);
                            nextTimeout = now + BUTTON_ON_DURATION;
                            mButtonsLight.setBrightness(buttonBrightness);
                            if (buttonBrightness != 0 && mButtonTimeout != 0) {
                                nextTimeout = now + mButtonTimeout;
                            }
                        }
                        mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
                    } else {
                        nextTimeout = mLastUserActivityTime + screenOffTimeout;
                        if (now < nextTimeout) {
                            mButtonsLight.setBrightness(0);
                            mKeyboardLight.setBrightness(0);
                            mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
                        }
                    }
@@ -3192,11 +3240,14 @@ public final class PowerManagerService extends SystemService
                if (mKeyboardVisible != visible) {
                    mKeyboardVisible = visible;
                    if (!visible) {
                        mKeyboardLight.turnOff();
                        // If hiding keyboard, turn off leds
                        setKeyboardLight(false, 1);
                        setKeyboardLight(false, 2);
                    }
                    synchronized (mLock) {
                        mDirty |= DIRTY_USER_ACTIVITY;
                        updatePowerStateLocked();
                    }
                }
            }
        }
@@ -3551,6 +3602,16 @@ public final class PowerManagerService extends SystemService
        }
    }

    private void setButtonBrightnessOverrideFromWindowManagerInternal(int brightness) {
        synchronized (mLock) {
            if (mButtonBrightnessOverrideFromWindowManager != brightness) {
                mButtonBrightnessOverrideFromWindowManager = brightness;
                mDirty |= DIRTY_SETTINGS;
                updatePowerStateLocked();
            }
        }
    }

    private final class LocalService extends PowerManagerInternal {
        @Override
        public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) {
@@ -3563,8 +3624,15 @@ public final class PowerManagerService extends SystemService

        @Override
        public void setButtonBrightnessOverrideFromWindowManager(int screenBrightness) {
            // Do nothing.
            // Button lights are not currently supported in the new implementation.
            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);

            final long ident = Binder.clearCallingIdentity();
            try {
                setButtonBrightnessOverrideFromWindowManagerInternal(screenBrightness);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }

        }

        @Override