/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.os; import android.view.Display; import android.view.KeyEvent; import java.util.function.Consumer; /** * Power manager local system service interface. * * @hide Only for use within the system server. */ public abstract class PowerManagerInternal { /** * Wakefulness: The device is asleep. It can only be awoken by a call to wakeUp(). * The screen should be off or in the process of being turned off by the display controller. * The device typically passes through the dozing state first. */ public static final int WAKEFULNESS_ASLEEP = 0; /** * Wakefulness: The device is fully awake. It can be put to sleep by a call to goToSleep(). * When the user activity timeout expires, the device may start dreaming or go to sleep. */ public static final int WAKEFULNESS_AWAKE = 1; /** * Wakefulness: The device is dreaming. It can be awoken by a call to wakeUp(), * which ends the dream. The device goes to sleep when goToSleep() is called, when * the dream ends or when unplugged. * User activity may brighten the screen but does not end the dream. */ public static final int WAKEFULNESS_DREAMING = 2; /** * Wakefulness: The device is dozing. It is almost asleep but is allowing a special * low-power "doze" dream to run which keeps the display on but lets the application * processor be suspended. It can be awoken by a call to wakeUp() which ends the dream. * The device fully goes to sleep if the dream cannot be started or ends on its own. */ public static final int WAKEFULNESS_DOZING = 3; public static String wakefulnessToString(int wakefulness) { switch (wakefulness) { case WAKEFULNESS_ASLEEP: return "Asleep"; case WAKEFULNESS_AWAKE: return "Awake"; case WAKEFULNESS_DREAMING: return "Dreaming"; case WAKEFULNESS_DOZING: return "Dozing"; default: return Integer.toString(wakefulness); } } /** * Converts platform constants to proto enums. */ public static int wakefulnessToProtoEnum(int wakefulness) { switch (wakefulness) { case WAKEFULNESS_ASLEEP: return PowerManagerInternalProto.WAKEFULNESS_ASLEEP; case WAKEFULNESS_AWAKE: return PowerManagerInternalProto.WAKEFULNESS_AWAKE; case WAKEFULNESS_DREAMING: return PowerManagerInternalProto.WAKEFULNESS_DREAMING; case WAKEFULNESS_DOZING: return PowerManagerInternalProto.WAKEFULNESS_DOZING; default: return wakefulness; } } /** * Returns true if the wakefulness state represents an interactive state * as defined by {@link android.os.PowerManager#isInteractive}. */ public static boolean isInteractive(int wakefulness) { return wakefulness == WAKEFULNESS_AWAKE || wakefulness == WAKEFULNESS_DREAMING; } /** * Used by the window manager to override the screen 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 setScreenBrightnessOverrideFromWindowManager(float brightness); /** * 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 * than usual, not longer. * * This method must only be called by the window manager. * * @param timeoutMillis The overridden timeout, or -1 to disable the override. */ public abstract void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis); /** * Used by the window manager to tell the power manager that the user is no longer actively * using the device. */ public abstract void setUserInactiveOverrideFromWindowManager(); /** * Used by device administration to set the maximum screen off timeout. * * This method must only be called by the device administration policy manager. */ public abstract void setMaximumScreenOffTimeoutFromDeviceAdmin(int userId, long timeMs); /** * Used by the dream manager to override certain properties while dozing. * * @param screenState The overridden screen state, or {@link Display#STATE_UNKNOWN} * to disable the override. * @param reason The reason for overriding the screen state. * @param screenBrightness The overridden screen brightness, or * {@link PowerManager#BRIGHTNESS_DEFAULT} to disable the override. */ public abstract void setDozeOverrideFromDreamManager( int screenState, @Display.StateReason int reason, int screenBrightness); /** * Used by sidekick manager to tell the power manager if it shouldn't change the display state * when a draw wake lock is acquired. Some processes may grab such a wake lock to do some work * in a powered-up state, but we shouldn't give up sidekick control over the display until this * override is lifted. */ public abstract void setDrawWakeLockOverrideFromSidekick(boolean keepState); public abstract PowerSaveState getLowPowerState(int serviceType); public abstract void registerLowPowerModeObserver(LowPowerModeListener listener); /** * Same as {@link #registerLowPowerModeObserver} but can take a lambda. */ public void registerLowPowerModeObserver(int serviceType, Consumer listener) { registerLowPowerModeObserver(new LowPowerModeListener() { @Override public int getServiceType() { return serviceType; } @Override public void onLowPowerModeChanged(PowerSaveState state) { listener.accept(state); } }); } public interface LowPowerModeListener { int getServiceType(); void onLowPowerModeChanged(PowerSaveState state); } public abstract boolean setDeviceIdleMode(boolean enabled); public abstract boolean setLightDeviceIdleMode(boolean enabled); public abstract void setDeviceIdleWhitelist(int[] appids); public abstract void setDeviceIdleTempWhitelist(int[] appids); /** * Updates the Low Power Standby allowlist. * * @param uids UIDs that are exempt from Low Power Standby restrictions */ public abstract void setLowPowerStandbyAllowlist(int[] uids); /** * Used by LowPowerStandbyController to notify the power manager that Low Power Standby's * active state has changed. * * @param active {@code true} to activate Low Power Standby, {@code false} to turn it off. */ public abstract void setLowPowerStandbyActive(boolean active); public abstract void startUidChanges(); public abstract void finishUidChanges(); public abstract void updateUidProcState(int uid, int procState); public abstract void uidGone(int uid); public abstract void uidActive(int uid); public abstract void uidIdle(int uid); /** * Boost: It is sent when user interacting with the device, for example, * touchscreen events are incoming. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Boost.aidl */ public static final int BOOST_INTERACTION = 0; /** * Boost: It indicates that the framework is likely to provide a new display * frame soon. This implies that the device should ensure that the display * processing path is powered up and ready to receive that update. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Boost.aidl */ public static final int BOOST_DISPLAY_UPDATE_IMMINENT = 1; /** * SetPowerBoost() indicates the device may need to boost some resources, as * the load is likely to increase before the kernel governors can react. * Depending on the boost, it may be appropriate to raise the frequencies of * CPU, GPU, memory subsystem, or stop CPU from going into deep sleep state. * * @param boost Boost which is to be set with a timeout. * @param durationMs The expected duration of the user's interaction, if * known, or 0 if the expected duration is unknown. * a negative value indicates canceling previous boost. * A given platform can choose to boost some time based on durationMs, * and may also pick an appropriate timeout for 0 case. */ public abstract void setPowerBoost(int boost, int durationMs); /** * Mode: It indicates that the device is to allow wake up when the screen * is tapped twice. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_DOUBLE_TAP_TO_WAKE = 0; /** * Mode: It indicates Low power mode is activated or not. Low power mode * is intended to save battery at the cost of performance. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_LOW_POWER = 1; /** * Mode: It indicates Sustained Performance mode is activated or not. * Sustained performance mode is intended to provide a consistent level of * performance for a prolonged amount of time. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_SUSTAINED_PERFORMANCE = 2; /** * Mode: It sets the device to a fixed performance level which can be sustained * under normal indoor conditions for at least 10 minutes. * Fixed performance mode puts both upper and lower bounds on performance such * that any workload run while in a fixed performance mode should complete in * a repeatable amount of time. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_FIXED_PERFORMANCE = 3; /** * Mode: It indicates VR Mode is activated or not. VR mode is intended to * provide minimum guarantee for performance for the amount of time the device * can sustain it. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_VR = 4; /** * Mode: It indicates that an application has been launched. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_LAUNCH = 5; /** * Mode: It indicates that the device is about to enter a period of expensive * rendering. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_EXPENSIVE_RENDERING = 6; /** * Mode: It indicates that the device is about entering/leaving interactive * state or on-interactive state. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_INTERACTIVE = 7; /** * Mode: It indicates the device is in device idle, externally known as doze. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_DEVICE_IDLE = 8; /** * Mode: It indicates that display is either off or still on but is optimized * for low power. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_DISPLAY_INACTIVE = 9; /** * Mode: It indicates that display is changing layout due to rotation or fold * unfold behavior. * Defined in hardware/interfaces/power/aidl/android/hardware/power/Mode.aidl */ public static final int MODE_DISPLAY_CHANGE = 17; /** * SetPowerMode() is called to enable/disable specific hint mode, which * may result in adjustment of power/performance parameters of the * cpufreq governor and other controls on device side. * * @param mode Mode which is to be enable/disable. * @param enabled true to enable, false to disable the mode. */ public abstract void setPowerMode(int mode, boolean enabled); /** Returns whether there hasn't been a user activity event for the given number of ms. */ public abstract boolean wasDeviceIdleFor(long ms); /** Returns information about the last wakeup event. */ public abstract PowerManager.WakeData getLastWakeup(); /** Returns information about the last event to go to sleep. */ public abstract PowerManager.SleepData getLastGoToSleep(); /** Allows power button to intercept a power key button press. */ public abstract boolean interceptPowerKeyDown(KeyEvent event); /** * Internal version of {@link android.os.PowerManager#nap} which allows for napping while the * device is not awake. */ public abstract void nap(long eventTime, boolean allowWake); /** * Returns true if ambient display is suppressed by any app with any token. This method will * return false if ambient display is not available. */ public abstract boolean isAmbientDisplaySuppressed(); }