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

Unverified Commit a8792426 authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Michael Bestas
Browse files

fw/b: Button backlight brightness

Squash of:

Author: Ricardo Cerqueira <cyanogenmod@cerqueira.org>
Date:   Fri Nov 23 14:23:16 2012 +0000

    Reintroduce button-backlight (and respective inactivity timeout)

    The power manager rewrite from Change I1d7a52e98f0449f76d70bf421f6a7f245957d1d7
    completely removed support for control of the button backlights, which makes
    all capacitive buttons out there stay dark. The commit message in that change
    mentions it hasn't been implemented _yet_, so this fix should be temporary
    until upstream does their own implementation

    Change-Id: I6094c446e0b8c23f57d30652a3cbd35dee5e821a

Author: Danny Baumann <dannybaumann@web.de>
Date:   Thu Aug 22 08:53:24 2013 +0200

    Add PowerManager integration for button and keyboard backlight.

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

    Change-Id: I550cccafc0a8f90d6347de9261adb26b75955cc4

Author: Steve Kondik <steve@cyngn.com>
Date:   Sat Jan 3 05:13:26 2015 -0800

    power: Disable keyboard/button lights while dozing/dreaming

     * With hardkeys and doze mode enabled, entering suspend results in
       an epic battle over the lights. It's a bad situation. Disable
       them when we're sleepy.

    Change-Id: I7f1fc35a1573717d1ea101a07c4171d6f66d1553

Author: nadlabak <pavel@doshaska.net>
Date:   Sun Jun 7 02:01:05 2015 +0200

    PowerManagerService: Fix updating of mUserActivitySummary

    I7f1fc35a1573717d1ea101a07c4171d6f66d1553 missed the fact that the primary
    purpose of the affected condition block was to update mUserActivitySummary
    and the button/keyboard light handling was just appended to it later.

    This fixes the waking from dream/screensaver by user activity.

    I30c5c8c9c09e3d57ace18cac72b783510b9b3bf3 is removed here as well as it was
    just a band aid.

    jira: NIGHTLIES-1285

    Change-Id: I6b2f6c58e73110787d62e86d4d2ef538638cf491

Author: Bruno Martins <bgcngm@gmail.com>
Date:   Tue Dec 26 17:15:05 2017 +0000

    Forward-port button brightness implementation to O

     * Reworked for the new handler interface, restoring also removed
       methods (partial revert of commit 86c39f9e).

     * Keyboard backlight brightness support left out for now.

    Change-Id: I53f031fa2da394e95a2b29a01eb3c6a8f8132507

Change-Id: I5176a2028c18408c17bac7f25e62b5612fd6c227
parent 2e99d2f6
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -481,7 +481,8 @@ public final class PowerManager {
            BRIGHTNESS_CONSTRAINT_TYPE_DOZE,
            BRIGHTNESS_CONSTRAINT_TYPE_DOZE,
            BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR,
            BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR,
            BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR,
            BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR,
            BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR
            BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR,
            BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_BUTTON
    })
    })
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface BrightnessConstraint{}
    public @interface BrightnessConstraint{}
@@ -533,6 +534,12 @@ public final class PowerManager {
     */
     */
    public static final int BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR = 7;
    public static final int BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR = 7;


    /**
     * Brightness constraint type: minimum allowed value.
     * @hide
     */
    public static final int BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_BUTTON = 8;

    /**
    /**
     * @hide
     * @hide
     */
     */
+10 −0
Original line number Original line Diff line number Diff line
@@ -107,6 +107,16 @@ public abstract class PowerManagerInternal {
     */
     */
    public abstract void setScreenBrightnessOverrideFromWindowManager(float brightness);
    public abstract void setScreenBrightnessOverrideFromWindowManager(float brightness);


    /**
     * Used by the window manager to override the button brightness based on the
     * current foreground activity.
     *
     * This method must only be called by the window manager.
     *
     * @param brightness The overridden brightness, or Float.NaN to disable the override.
     */
    public abstract void setButtonBrightnessOverrideFromWindowManager(float brightness);

    /**
    /**
     * Used by the window manager to override the user activity timeout based on the
     * Used by the window manager to override the user activity timeout based on the
     * current foreground activity.  It can only be used to make the timeout shorter
     * current foreground activity.  It can only be used to make the timeout shorter
+18 −0
Original line number Original line Diff line number Diff line
@@ -68,6 +68,8 @@ import com.android.server.display.utils.SensorUtils;
import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory;
import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory;
import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings;
import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings;
import com.android.server.lights.LightsManager;
import com.android.server.lights.LogicalLight;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.policy.WindowManagerPolicy;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -164,6 +166,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    @Nullable
    @Nullable
    private final IBatteryStats mBatteryStats;
    private final IBatteryStats mBatteryStats;


    // The lights service.
    private final LightsManager mLights;

    // The sensor manager.
    // The sensor manager.
    private final SensorManager mSensorManager;
    private final SensorManager mSensorManager;


@@ -459,6 +464,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId();
        mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId();
        mHandler = new DisplayControllerHandler(handler.getLooper());
        mHandler = new DisplayControllerHandler(handler.getLooper());
        mLights = LocalServices.getService(LightsManager.class);


        if (mDisplayId == Display.DEFAULT_DISPLAY) {
        if (mDisplayId == Display.DEFAULT_DISPLAY) {
            mBatteryStats = BatteryStatsService.getService();
            mBatteryStats = BatteryStatsService.getService();
@@ -1123,6 +1129,18 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        if (state == Display.STATE_OFF) {
        if (state == Display.STATE_OFF) {
            brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT;
            brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT;
            mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF);
            mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF);
            LogicalLight buttonsLight = mLights.getLight(LightsManager.LIGHT_ID_BUTTONS);
            if (buttonsLight != null) {
                buttonsLight.setBrightness(brightnessState);
            }
        }

        // Disable button lights when dozing
        if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) {
            LogicalLight buttonsLight = mLights.getLight(LightsManager.LIGHT_ID_BUTTONS);
            if (buttonsLight != null) {
                buttonsLight.setBrightness(PowerManager.BRIGHTNESS_OFF_FLOAT);
            }
        }
        }


        // Always use the VR brightness when in the VR state.
        // Always use the VR brightness when in the VR state.
+99 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.power;
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.policyToString;
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.policyToString;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT;
import static android.os.PowerManager.BRIGHTNESS_OFF_FLOAT;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DISPLAY_GROUPS_TURNED_OFF;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DISPLAY_GROUPS_TURNED_OFF;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DISPLAY_GROUP_REMOVED;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DISPLAY_GROUP_REMOVED;
import static android.os.PowerManager.WAKE_REASON_DISPLAY_GROUP_ADDED;
import static android.os.PowerManager.WAKE_REASON_DISPLAY_GROUP_ADDED;
@@ -278,6 +279,8 @@ public final class PowerManagerService extends SystemService
     */
     */
    private static final long ENHANCED_DISCHARGE_PREDICTION_BROADCAST_MIN_DELAY_MS = 60 * 1000L;
    private static final long ENHANCED_DISCHARGE_PREDICTION_BROADCAST_MIN_DELAY_MS = 60 * 1000L;


    private static final int DEFAULT_BUTTON_ON_DURATION = 5 * 1000;

    private final Context mContext;
    private final Context mContext;
    private final ServiceThread mHandlerThread;
    private final ServiceThread mHandlerThread;
    private final Handler mHandler;
    private final Handler mHandler;
@@ -307,6 +310,10 @@ public final class PowerManagerService extends SystemService
    private SettingsObserver mSettingsObserver;
    private SettingsObserver mSettingsObserver;
    private DreamManagerInternal mDreamManager;
    private DreamManagerInternal mDreamManager;
    private LogicalLight mAttentionLight;
    private LogicalLight mAttentionLight;
    private LogicalLight mButtonsLight;

    private int mButtonTimeout;
    private float mButtonBrightness;


    private InattentiveSleepWarningController mInattentiveSleepWarningOverlayController;
    private InattentiveSleepWarningController mInattentiveSleepWarningOverlayController;
    private final AmbientDisplaySuppressionController mAmbientDisplaySuppressionController;
    private final AmbientDisplaySuppressionController mAmbientDisplaySuppressionController;
@@ -566,6 +573,9 @@ public final class PowerManagerService extends SystemService
    public final float mScreenBrightnessMaximumVr;
    public final float mScreenBrightnessMaximumVr;
    public final float mScreenBrightnessDefaultVr;
    public final float mScreenBrightnessDefaultVr;


    // Button brightness
    public final float mButtonBrightnessDefault;

    // Value we store for tracking face down behavior.
    // Value we store for tracking face down behavior.
    private boolean mIsFaceDown = false;
    private boolean mIsFaceDown = false;
    private long mLastFlipTime = 0L;
    private long mLastFlipTime = 0L;
@@ -574,6 +584,11 @@ public final class PowerManagerService extends SystemService
    // One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants.
    // One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants.
    private int mScreenBrightnessModeSetting;
    private int mScreenBrightnessModeSetting;


    // The button brightness setting override from the window manager
    // to allow the current foreground activity to override the button brightness.
    private float mButtonBrightnessOverrideFromWindowManager =
            PowerManager.BRIGHTNESS_INVALID_FLOAT;

    // The screen brightness setting override from the window manager
    // The screen brightness setting override from the window manager
    // to allow the current foreground activity to override the brightness.
    // to allow the current foreground activity to override the brightness.
    private float mScreenBrightnessOverrideFromWindowManager =
    private float mScreenBrightnessOverrideFromWindowManager =
@@ -1074,6 +1089,10 @@ public final class PowerManagerService extends SystemService
            mScreenBrightnessDefaultVr = vrDef;
            mScreenBrightnessDefaultVr = vrDef;
        }
        }


        mButtonBrightnessDefault = mContext.getResources().getFloat(
                org.lineageos.platform.internal.R.dimen
                        .config_buttonBrightnessSettingDefaultFloat);

        synchronized (mLock) {
        synchronized (mLock) {
            mWakeLockSuspendBlocker =
            mWakeLockSuspendBlocker =
                    mInjector.createSuspendBlocker(this, "PowerManagerService.WakeLocks");
                    mInjector.createSuspendBlocker(this, "PowerManagerService.WakeLocks");
@@ -1189,6 +1208,7 @@ public final class PowerManagerService extends SystemService


            mLightsManager = getLocalService(LightsManager.class);
            mLightsManager = getLocalService(LightsManager.class);
            mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
            mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
            mButtonsLight = mLightsManager.getLight(LightsManager.LIGHT_ID_BUTTONS);


            // Initialize display power management.
            // Initialize display power management.
            mDisplayManagerInternal.initPowerManagement(
            mDisplayManagerInternal.initPowerManagement(
@@ -1271,6 +1291,12 @@ public final class PowerManagerService extends SystemService
        resolver.registerContentObserver(LineageSettings.System.getUriFor(
        resolver.registerContentObserver(LineageSettings.System.getUriFor(
                LineageSettings.System.FORCE_SHOW_NAVBAR),
                LineageSettings.System.FORCE_SHOW_NAVBAR),
                false, mSettingsObserver, UserHandle.USER_ALL);
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(LineageSettings.Secure.getUriFor(
                LineageSettings.Secure.BUTTON_BRIGHTNESS),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(LineageSettings.Secure.getUriFor(
                LineageSettings.Secure.BUTTON_BACKLIGHT_TIMEOUT),
                false, mSettingsObserver, UserHandle.USER_ALL);


        IVrManager vrManager = IVrManager.Stub.asInterface(getBinderService(Context.VR_SERVICE));
        IVrManager vrManager = IVrManager.Stub.asInterface(getBinderService(Context.VR_SERVICE));
        if (vrManager != null) {
        if (vrManager != null) {
@@ -1418,6 +1444,13 @@ public final class PowerManagerService extends SystemService
                LineageSettings.System.FORCE_SHOW_NAVBAR,
                LineageSettings.System.FORCE_SHOW_NAVBAR,
                0, UserHandle.USER_CURRENT) == 1;
                0, UserHandle.USER_CURRENT) == 1;


        mButtonTimeout = LineageSettings.Secure.getIntForUser(resolver,
                LineageSettings.Secure.BUTTON_BACKLIGHT_TIMEOUT,
                DEFAULT_BUTTON_ON_DURATION, UserHandle.USER_CURRENT);
        mButtonBrightness = LineageSettings.Secure.getFloatForUser(resolver,
                LineageSettings.Secure.BUTTON_BRIGHTNESS, mButtonBrightnessDefault,
                UserHandle.USER_CURRENT);

        mDirty |= DIRTY_SETTINGS;
        mDirty |= DIRTY_SETTINGS;
    }
    }


@@ -2621,10 +2654,43 @@ public final class PowerManagerService extends SystemService
                    groupNextTimeout = lastUserActivityTime + screenOffTimeout - screenDimDuration;
                    groupNextTimeout = lastUserActivityTime + screenOffTimeout - screenDimDuration;
                    if (now < groupNextTimeout) {
                    if (now < groupNextTimeout) {
                        groupUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
                        groupUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
                        if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) {
                            if (mButtonsLight != null) {
                                float buttonBrightness = BRIGHTNESS_OFF_FLOAT;
                                if (!mForceNavbar) {
                                    if (isValidBrightness(
                                            mButtonBrightnessOverrideFromWindowManager)) {
                                        if (mButtonBrightnessOverrideFromWindowManager >
                                                PowerManager.BRIGHTNESS_MIN) {
                                            buttonBrightness =
                                                    mButtonBrightnessOverrideFromWindowManager;
                                        }
                                    } else if (isValidButtonBrightness(mButtonBrightness)) {
                                        buttonBrightness = mButtonBrightness;
                                    }
                                }

                                if (mButtonTimeout != 0 &&
                                        now > lastUserActivityTime + mButtonTimeout) {
                                    mButtonsLight.setBrightness(BRIGHTNESS_OFF_FLOAT);
                                } else {
                                    mButtonsLight.setBrightness(buttonBrightness);
                                    if (buttonBrightness != BRIGHTNESS_OFF_FLOAT &&
                                            mButtonTimeout != 0) {
                                        groupNextTimeout = now + mButtonTimeout;
                                    }
                                }
                            }
                        }
                    } else {
                    } else {
                        groupNextTimeout = lastUserActivityTime + screenOffTimeout;
                        groupNextTimeout = lastUserActivityTime + screenOffTimeout;
                        if (now < groupNextTimeout) {
                        if (now < groupNextTimeout) {
                            groupUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
                            groupUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
                            if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) {
                                if (mButtonsLight != null) {
                                    mButtonsLight.setBrightness(BRIGHTNESS_OFF_FLOAT);
                                }
                            }
                        }
                        }
                    }
                    }
                }
                }
@@ -3346,6 +3412,10 @@ public final class PowerManagerService extends SystemService
        return value >= PowerManager.BRIGHTNESS_MIN && value <= PowerManager.BRIGHTNESS_MAX;
        return value >= PowerManager.BRIGHTNESS_MIN && value <= PowerManager.BRIGHTNESS_MAX;
    }
    }


    private static boolean isValidButtonBrightness(float value) {
        return value > PowerManager.BRIGHTNESS_MIN && value <= PowerManager.BRIGHTNESS_MAX;
    }

    @VisibleForTesting
    @VisibleForTesting
    int getDesiredScreenPolicyLocked(int groupId) {
    int getDesiredScreenPolicyLocked(int groupId) {
        final int wakefulness = mDisplayGroupPowerStateMapper.getWakefulnessLocked(groupId);
        final int wakefulness = mDisplayGroupPowerStateMapper.getWakefulnessLocked(groupId);
@@ -4006,6 +4076,17 @@ public final class PowerManagerService extends SystemService
        }
        }
    }
    }


    private void setButtonBrightnessOverrideFromWindowManagerInternal(float brightness) {
        synchronized (mLock) {
            if (!BrightnessSynchronizer.floatEquals(mButtonBrightnessOverrideFromWindowManager,
                    brightness)) {
                mButtonBrightnessOverrideFromWindowManager = brightness;
                mDirty |= DIRTY_SETTINGS;
                updatePowerStateLocked();
            }
        }
    }

    private void setScreenBrightnessOverrideFromWindowManagerInternal(float brightness) {
    private void setScreenBrightnessOverrideFromWindowManagerInternal(float brightness) {
        synchronized (mLock) {
        synchronized (mLock) {
            if (!BrightnessSynchronizer.floatEquals(mScreenBrightnessOverrideFromWindowManager,
            if (!BrightnessSynchronizer.floatEquals(mScreenBrightnessOverrideFromWindowManager,
@@ -4312,7 +4393,11 @@ public final class PowerManagerService extends SystemService
                    + mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced="
                    + mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced="
                    + isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");
                    + isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");
            pw.println("  mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting);
            pw.println("  mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting);
            pw.println("  mButtonTimeout=" + mButtonTimeout);
            pw.println("  mButtonBrightness=" + mButtonBrightness);
            pw.println("  mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting);
            pw.println("  mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting);
            pw.println("  mButtonBrightnessOverrideFromWindowManager="
                    + mButtonBrightnessOverrideFromWindowManager);
            pw.println("  mScreenBrightnessOverrideFromWindowManager="
            pw.println("  mScreenBrightnessOverrideFromWindowManager="
                    + mScreenBrightnessOverrideFromWindowManager);
                    + mScreenBrightnessOverrideFromWindowManager);
            pw.println("  mUserActivityTimeoutOverrideFromWindowManager="
            pw.println("  mUserActivityTimeoutOverrideFromWindowManager="
@@ -5464,6 +5549,8 @@ public final class PowerManagerService extends SystemService
                    return mScreenBrightnessMaximumVr;
                    return mScreenBrightnessMaximumVr;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR:
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR:
                    return mScreenBrightnessDefaultVr;
                    return mScreenBrightnessDefaultVr;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_BUTTON:
                    return mButtonBrightnessDefault;
                default:
                default:
                    return PowerManager.BRIGHTNESS_INVALID_FLOAT;
                    return PowerManager.BRIGHTNESS_INVALID_FLOAT;
            }
            }
@@ -6116,6 +6203,18 @@ public final class PowerManagerService extends SystemService


    @VisibleForTesting
    @VisibleForTesting
    final class LocalService extends PowerManagerInternal {
    final class LocalService extends PowerManagerInternal {
        @Override
        public void setButtonBrightnessOverrideFromWindowManager(float screenBrightness) {
            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);

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

        @Override
        @Override
        public void setScreenBrightnessOverrideFromWindowManager(float screenBrightness) {
        public void setScreenBrightnessOverrideFromWindowManager(float screenBrightness) {
            if (screenBrightness < PowerManager.BRIGHTNESS_MIN
            if (screenBrightness < PowerManager.BRIGHTNESS_MIN
+22 −3
Original line number Original line Diff line number Diff line
@@ -177,6 +177,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        implements DisplayManager.DisplayListener {
        implements DisplayManager.DisplayListener {
    private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;
    private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;


    private static final int SET_BUTTON_BRIGHTNESS_OVERRIDE = 0;
    private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
    private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
    private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
    private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
    static final String TAG_TASKS = TAG + POSTFIX_TASKS;
    static final String TAG_TASKS = TAG + POSTFIX_TASKS;
@@ -185,6 +186,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>


    private Object mLastWindowFreezeSource = null;
    private Object mLastWindowFreezeSource = null;
    private Session mHoldScreen = null;
    private Session mHoldScreen = null;
    private float mButtonBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
    private float mScreenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
    private float mScreenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
    private long mUserActivityTimeout = -1;
    private long mUserActivityTimeout = -1;
    private boolean mUpdateRotation = false;
    private boolean mUpdateRotation = false;
@@ -848,6 +850,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        }
        }


        mHoldScreen = null;
        mHoldScreen = null;
        mButtonBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mScreenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mScreenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mUserActivityTimeout = -1;
        mUserActivityTimeout = -1;
        mObscureApplicationContentOnSecondaryDisplays = false;
        mObscureApplicationContentOnSecondaryDisplays = false;
@@ -968,13 +971,21 @@ class RootWindowContainer extends WindowContainer<DisplayContent>


        mWmService.setHoldScreenLocked(mHoldScreen);
        mWmService.setHoldScreenLocked(mHoldScreen);
        if (!mWmService.mDisplayFrozen) {
        if (!mWmService.mDisplayFrozen) {
            final float brightnessOverride = mScreenBrightnessOverride < PowerManager.BRIGHTNESS_MIN
            final float buttonBrightnessOverride =
                    mButtonBrightnessOverride < PowerManager.BRIGHTNESS_MIN
                    || mButtonBrightnessOverride > PowerManager.BRIGHTNESS_MAX
                    ? PowerManager.BRIGHTNESS_INVALID_FLOAT : mButtonBrightnessOverride;
            final float screenBrightnessOverride =
                    mScreenBrightnessOverride < PowerManager.BRIGHTNESS_MIN
                    || mScreenBrightnessOverride > PowerManager.BRIGHTNESS_MAX
                    || mScreenBrightnessOverride > PowerManager.BRIGHTNESS_MAX
                    ? PowerManager.BRIGHTNESS_INVALID_FLOAT : mScreenBrightnessOverride;
                    ? PowerManager.BRIGHTNESS_INVALID_FLOAT : mScreenBrightnessOverride;
            int brightnessFloatAsIntBits = Float.floatToIntBits(brightnessOverride);
            int buttonBrightnessFloatAsIntBits = Float.floatToIntBits(buttonBrightnessOverride);
            int screenBrightnessFloatAsIntBits = Float.floatToIntBits(screenBrightnessOverride);
            // Post these on a handler such that we don't call into power manager service while
            // Post these on a handler such that we don't call into power manager service while
            // holding the window manager lock to avoid lock contention with power manager lock.
            // holding the window manager lock to avoid lock contention with power manager lock.
            mHandler.obtainMessage(SET_SCREEN_BRIGHTNESS_OVERRIDE, brightnessFloatAsIntBits,
            mHandler.obtainMessage(SET_BUTTON_BRIGHTNESS_OVERRIDE, buttonBrightnessFloatAsIntBits,
                    0).sendToTarget();
            mHandler.obtainMessage(SET_SCREEN_BRIGHTNESS_OVERRIDE, screenBrightnessFloatAsIntBits,
                    0).sendToTarget();
                    0).sendToTarget();
            mHandler.obtainMessage(SET_USER_ACTIVITY_TIMEOUT, mUserActivityTimeout).sendToTarget();
            mHandler.obtainMessage(SET_USER_ACTIVITY_TIMEOUT, mUserActivityTimeout).sendToTarget();
        }
        }
@@ -1151,6 +1162,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
                                + "has FLAG_KEEP_SCREEN_ON!!! called by%s",
                                + "has FLAG_KEEP_SCREEN_ON!!! called by%s",
                        w, Debug.getCallers(10));
                        w, Debug.getCallers(10));
            }
            }
            if (!syswin && w.mAttrs.buttonBrightness >= 0
                    && Float.isNaN(mButtonBrightnessOverride)) {
                mButtonBrightnessOverride = w.mAttrs.buttonBrightness;
            }
            if (!syswin && w.mAttrs.screenBrightness >= 0
            if (!syswin && w.mAttrs.screenBrightness >= 0
                    && Float.isNaN(mScreenBrightnessOverride)) {
                    && Float.isNaN(mScreenBrightnessOverride)) {
                mScreenBrightnessOverride = w.mAttrs.screenBrightness;
                mScreenBrightnessOverride = w.mAttrs.screenBrightness;
@@ -1223,6 +1238,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        @Override
        @Override
        public void handleMessage(Message msg) {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            switch (msg.what) {
                case SET_BUTTON_BRIGHTNESS_OVERRIDE:
                    mWmService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(
                            Float.intBitsToFloat(msg.arg1));
                    break;
                case SET_SCREEN_BRIGHTNESS_OVERRIDE:
                case SET_SCREEN_BRIGHTNESS_OVERRIDE:
                    mWmService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
                    mWmService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
                            Float.intBitsToFloat(msg.arg1));
                            Float.intBitsToFloat(msg.arg1));