Loading apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +127 −152 Original line number Diff line number Diff line Loading @@ -244,7 +244,7 @@ import java.util.stream.Collectors; label="LIGHT_STATE_INACTIVE\nScreen off AND Not charging", color=black,shape=diamond ] LIGHT_STATE_IDLE [label="LIGHT_STATE_IDLE\n",color=blue,shape=oval] LIGHT_STATE_IDLE [label="LIGHT_STATE_IDLE\n",color=red,shape=box] LIGHT_STATE_WAITING_FOR_NETWORK [ label="LIGHT_STATE_WAITING_FOR_NETWORK\n" + "Coming out of LIGHT_STATE_IDLE, waiting for network", Loading Loading @@ -490,9 +490,9 @@ public class DeviceIdleController extends SystemService @GuardedBy("this") private long mNextLightIdleDelay; @GuardedBy("this") private long mNextLightAlarmTime; private long mNextLightIdleDelayFlex; @GuardedBy("this") private long mNextLightMaintenanceAlarmTime; private long mNextLightAlarmTime; @GuardedBy("this") private long mNextSensingTimeoutAlarmTime; Loading Loading @@ -689,15 +689,6 @@ public class DeviceIdleController extends SystemService } }; private final AlarmManager.OnAlarmListener mLightMaintenanceAlarmListener = () -> { if (DEBUG) { Slog.d(TAG, "Light maintenance alarm fired"); } synchronized (DeviceIdleController.this) { stepLightIdleStateLocked("s:alarm"); } }; /** AlarmListener to start monitoring motion if there are registered stationary listeners. */ private final AlarmManager.OnAlarmListener mMotionRegistrationAlarmListener = () -> { synchronized (DeviceIdleController.this) { Loading Loading @@ -962,6 +953,9 @@ public class DeviceIdleController extends SystemService private static final String KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = "light_after_inactive_to"; private static final String KEY_LIGHT_IDLE_TIMEOUT = "light_idle_to"; private static final String KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = "light_idle_to_initial_flex"; private static final String KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX = "light_max_idle_to_flex"; private static final String KEY_LIGHT_IDLE_FACTOR = "light_idle_factor"; private static final String KEY_LIGHT_MAX_IDLE_TIMEOUT = "light_max_idle_to"; private static final String KEY_LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = Loading Loading @@ -1010,6 +1004,10 @@ public class DeviceIdleController extends SystemService !COMPRESS_TIME ? 4 * 60 * 1000L : 30 * 1000L; private long mDefaultLightIdleTimeout = !COMPRESS_TIME ? 5 * 60 * 1000L : 15 * 1000L; private long mDefaultLightIdleTimeoutInitialFlex = !COMPRESS_TIME ? 60 * 1000L : 5 * 1000L; private long mDefaultLightIdleTimeoutMaxFlex = !COMPRESS_TIME ? 15 * 60 * 1000L : 60 * 1000L; private float mDefaultLightIdleFactor = 2f; private long mDefaultLightMaxIdleTimeout = !COMPRESS_TIME ? 15 * 60 * 1000L : 60 * 1000L; Loading Loading @@ -1083,6 +1081,22 @@ public class DeviceIdleController extends SystemService */ public long LIGHT_IDLE_TIMEOUT = mDefaultLightIdleTimeout; /** * This is the initial alarm window size that we will tolerate for light idle maintenance * timing. * * @see #KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX * @see #mNextLightIdleDelayFlex */ public long LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = mDefaultLightIdleTimeoutInitialFlex; /** * This is the maximum value that {@link #mNextLightIdleDelayFlex} should take. * * @see #KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX */ public long LIGHT_IDLE_TIMEOUT_MAX_FLEX = mDefaultLightIdleTimeoutMaxFlex; /** * Scaling factor to apply to the light idle mode time each time we complete a cycle. * Loading Loading @@ -1321,6 +1335,14 @@ public class DeviceIdleController extends SystemService mDefaultLightIdleTimeout = getTimeout( res.getInteger(com.android.internal.R.integer.device_idle_light_idle_to_ms), mDefaultLightIdleTimeout); mDefaultLightIdleTimeoutInitialFlex = getTimeout( res.getInteger( com.android.internal.R.integer.device_idle_light_idle_to_init_flex_ms), mDefaultLightIdleTimeoutInitialFlex); mDefaultLightIdleTimeoutMaxFlex = getTimeout( res.getInteger( com.android.internal.R.integer.device_idle_light_idle_to_max_flex_ms), mDefaultLightIdleTimeoutMaxFlex); mDefaultLightIdleFactor = res.getFloat( com.android.internal.R.integer.device_idle_light_idle_factor); mDefaultLightMaxIdleTimeout = getTimeout( Loading Loading @@ -1400,6 +1422,8 @@ public class DeviceIdleController extends SystemService FLEX_TIME_SHORT = mDefaultFlexTimeShort; LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = mDefaultLightIdleAfterInactiveTimeout; LIGHT_IDLE_TIMEOUT = mDefaultLightIdleTimeout; LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = mDefaultLightIdleTimeoutInitialFlex; LIGHT_IDLE_TIMEOUT_MAX_FLEX = mDefaultLightIdleTimeoutMaxFlex; LIGHT_IDLE_FACTOR = mDefaultLightIdleFactor; LIGHT_MAX_IDLE_TIMEOUT = mDefaultLightMaxIdleTimeout; LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = mDefaultLightIdleMaintenanceMinBudget; Loading Loading @@ -1457,6 +1481,16 @@ public class DeviceIdleController extends SystemService LIGHT_IDLE_TIMEOUT = properties.getLong( KEY_LIGHT_IDLE_TIMEOUT, mDefaultLightIdleTimeout); break; case KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX: LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = properties.getLong( KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX, mDefaultLightIdleTimeoutInitialFlex); break; case KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX: LIGHT_IDLE_TIMEOUT_MAX_FLEX = properties.getLong( KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX, mDefaultLightIdleTimeoutMaxFlex); break; case KEY_LIGHT_IDLE_FACTOR: LIGHT_IDLE_FACTOR = Math.max(1, properties.getFloat( KEY_LIGHT_IDLE_FACTOR, mDefaultLightIdleFactor)); Loading Loading @@ -1613,6 +1647,14 @@ public class DeviceIdleController extends SystemService TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT, pw); pw.println(); pw.print(" "); pw.print(KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX); pw.print("="); TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT_INITIAL_FLEX, pw); pw.println(); pw.print(" "); pw.print(KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX); pw.print("="); TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT_MAX_FLEX, pw); pw.println(); pw.print(" "); pw.print(KEY_LIGHT_IDLE_FACTOR); pw.print("="); pw.print(LIGHT_IDLE_FACTOR); pw.println(); Loading Loading @@ -3209,7 +3251,7 @@ public class DeviceIdleController extends SystemService if (conn != mNetworkConnected) { mNetworkConnected = conn; if (conn && mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) { stepLightIdleStateLocked("network", /* forceProgression */ true); stepLightIdleStateLocked("network"); } } } Loading Loading @@ -3454,11 +3496,7 @@ public class DeviceIdleController extends SystemService moveToLightStateLocked(LIGHT_STATE_INACTIVE, "no activity"); resetLightIdleManagementLocked(); scheduleLightAlarmLocked(mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT, mConstants.FLEX_TIME_SHORT); // After moving in INACTIVE, the maintenance window should start the time inactive // timeout and a single light idle period. scheduleLightMaintenanceAlarmLocked( mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT + mConstants.LIGHT_IDLE_TIMEOUT); mConstants.FLEX_TIME_SHORT, true); } } Loading @@ -3480,8 +3518,9 @@ public class DeviceIdleController extends SystemService private void resetLightIdleManagementLocked() { mNextLightIdleDelay = mConstants.LIGHT_IDLE_TIMEOUT; mMaintenanceStartTime = 0; mNextLightIdleDelayFlex = mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX; mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET; cancelAllLightAlarmsLocked(); cancelLightAlarmLocked(); } @GuardedBy("this") Loading Loading @@ -3514,15 +3553,10 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void stepLightIdleStateLocked(String reason) { stepLightIdleStateLocked(reason, false); } @GuardedBy("this") @VisibleForTesting @SuppressLint("WakelockTimeout") void stepLightIdleStateLocked(String reason, boolean forceProgression) { void stepLightIdleStateLocked(String reason) { if (mLightState == LIGHT_STATE_ACTIVE || mLightState == LIGHT_STATE_OVERRIDE) { // If we are already in deep device idle mode, then // there is nothing left to do for light mode. Loading @@ -3530,37 +3564,44 @@ public class DeviceIdleController extends SystemService } if (DEBUG) { Slog.d(TAG, "stepLightIdleStateLocked: mLightState=" + lightStateToString(mLightState) + " force=" + forceProgression); Slog.d(TAG, "stepLightIdleStateLocked: mLightState=" + lightStateToString(mLightState)); } EventLogTags.writeDeviceIdleLightStep(); final long nowElapsed = mInjector.getElapsedRealtime(); final boolean crossedMaintenanceTime = mNextLightMaintenanceAlarmTime > 0 && nowElapsed >= mNextLightMaintenanceAlarmTime; final boolean crossedProgressionTime = mNextLightAlarmTime > 0 && nowElapsed >= mNextLightAlarmTime; final boolean enterMaintenance; if (crossedMaintenanceTime) { if (crossedProgressionTime) { enterMaintenance = (mNextLightAlarmTime <= mNextLightMaintenanceAlarmTime); } else { enterMaintenance = true; } } else if (crossedProgressionTime) { enterMaintenance = false; } else if (forceProgression) { // This will happen for adb commands, unit tests, // and when we're in WAITING_FOR_NETWORK and the network connects. enterMaintenance = mLightState == LIGHT_STATE_IDLE || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK; switch (mLightState) { case LIGHT_STATE_INACTIVE: mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET; // Reset the upcoming idle delays. mNextLightIdleDelay = mConstants.LIGHT_IDLE_TIMEOUT; mNextLightIdleDelayFlex = mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX; mMaintenanceStartTime = 0; // Fall through to immediately idle. case LIGHT_STATE_IDLE_MAINTENANCE: if (mMaintenanceStartTime != 0) { long duration = SystemClock.elapsedRealtime() - mMaintenanceStartTime; if (duration < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) { // We didn't use up all of our minimum budget; add this to the reserve. mCurLightIdleBudget += (mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET - duration); } else { Slog.wtfStack(TAG, "stepLightIdleStateLocked called in invalid state: " + mLightState); return; // We used more than our minimum budget; this comes out of the reserve. mCurLightIdleBudget -= (duration - mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET); } if (enterMaintenance) { } mMaintenanceStartTime = 0; scheduleLightAlarmLocked(mNextLightIdleDelay, mNextLightIdleDelayFlex, true); mNextLightIdleDelay = Math.min(mConstants.LIGHT_MAX_IDLE_TIMEOUT, (long) (mNextLightIdleDelay * mConstants.LIGHT_IDLE_FACTOR)); mNextLightIdleDelayFlex = Math.min(mConstants.LIGHT_IDLE_TIMEOUT_MAX_FLEX, (long) (mNextLightIdleDelayFlex * mConstants.LIGHT_IDLE_FACTOR)); moveToLightStateLocked(LIGHT_STATE_IDLE, reason); addEvent(EVENT_LIGHT_IDLE, null); mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); break; case LIGHT_STATE_IDLE: case LIGHT_STATE_WAITING_FOR_NETWORK: if (mNetworkConnected || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) { // We have been idling long enough, now it is time to do some work. mActiveIdleOpCount = 1; Loading @@ -3571,13 +3612,7 @@ public class DeviceIdleController extends SystemService } else if (mCurLightIdleBudget > mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET) { mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET; } mNextLightIdleDelay = Math.min(mConstants.LIGHT_MAX_IDLE_TIMEOUT, (long) (mNextLightIdleDelay * mConstants.LIGHT_IDLE_FACTOR)); // We're entering MAINTENANCE. It should end curLightIdleBudget time from now. // The next maintenance window should be curLightIdleBudget + nextLightIdleDelay // time from now. scheduleLightAlarmLocked(mCurLightIdleBudget, mConstants.FLEX_TIME_SHORT); scheduleLightMaintenanceAlarmLocked(mCurLightIdleBudget + mNextLightIdleDelay); scheduleLightAlarmLocked(mCurLightIdleBudget, mConstants.FLEX_TIME_SHORT, true); moveToLightStateLocked(LIGHT_STATE_IDLE_MAINTENANCE, reason); addEvent(EVENT_LIGHT_MAINTENANCE, null); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF); Loading @@ -3585,36 +3620,11 @@ public class DeviceIdleController extends SystemService // We'd like to do maintenance, but currently don't have network // connectivity... let's try to wait until the network comes back. // We'll only wait for another full idle period, however, and then give up. scheduleLightMaintenanceAlarmLocked(mNextLightIdleDelay); cancelLightAlarmLocked(); scheduleLightAlarmLocked(mNextLightIdleDelay, mNextLightIdleDelayFlex / 2, true); moveToLightStateLocked(LIGHT_STATE_WAITING_FOR_NETWORK, reason); } } else { if (mMaintenanceStartTime != 0) { // Cap duration at budget since the non-wakeup alarm to exit maintenance may // not fire at the exact intended time, but once the system is up, we will stop // more ongoing work. long duration = Math.min(mCurLightIdleBudget, SystemClock.elapsedRealtime() - mMaintenanceStartTime); if (duration < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) { // We didn't use up all of our minimum budget; add this to the reserve. mCurLightIdleBudget += (mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET - duration); } else { // We used more than our minimum budget; this comes out of the reserve. mCurLightIdleBudget -= (duration - mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET); } } mMaintenanceStartTime = 0; // We're entering IDLE. We may have used less than curLightIdleBudget for the // maintenance window, so reschedule the alarm starting from now. scheduleLightMaintenanceAlarmLocked(mNextLightIdleDelay); cancelLightAlarmLocked(); moveToLightStateLocked(LIGHT_STATE_IDLE, reason); addEvent(EVENT_LIGHT_IDLE, null); mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); break; } } Loading Loading @@ -3749,7 +3759,7 @@ public class DeviceIdleController extends SystemService moveToStateLocked(STATE_IDLE, reason); if (mLightState != LIGHT_STATE_OVERRIDE) { moveToLightStateLocked(LIGHT_STATE_OVERRIDE, "deep"); cancelAllLightAlarmsLocked(); cancelLightAlarmLocked(); } addEvent(EVENT_DEEP_IDLE, null); mGoingIdleWakeLock.acquire(); Loading Loading @@ -3995,7 +4005,7 @@ public class DeviceIdleController extends SystemService if (mState == STATE_IDLE_MAINTENANCE) { stepIdleStateLocked("s:early"); } else { stepLightIdleStateLocked("s:early", /* forceProgression */ true); stepLightIdleStateLocked("s:early"); } } } Loading Loading @@ -4102,12 +4112,6 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void cancelAllLightAlarmsLocked() { cancelLightAlarmLocked(); cancelLightMaintenanceAlarmLocked(); } @GuardedBy("this") private void cancelLightAlarmLocked() { if (mNextLightAlarmTime != 0) { Loading @@ -4116,14 +4120,6 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void cancelLightMaintenanceAlarmLocked() { if (mNextLightMaintenanceAlarmTime != 0) { mNextLightMaintenanceAlarmTime = 0; mAlarmManager.cancel(mLightMaintenanceAlarmListener); } } @GuardedBy("this") void cancelLocatingLocked() { if (mLocating) { Loading Loading @@ -4188,40 +4184,26 @@ public class DeviceIdleController extends SystemService } @GuardedBy("this") @VisibleForTesting void scheduleLightAlarmLocked(long delay, long flex) { void scheduleLightAlarmLocked(long delay, long flex, boolean wakeup) { if (DEBUG) { Slog.d(TAG, "scheduleLightAlarmLocked(" + delay + (mConstants.USE_WINDOW_ALARMS ? "/" + flex : "") + ")"); + ", wakeup=" + wakeup + ")"); } mNextLightAlarmTime = mInjector.getElapsedRealtime() + delay; if (mConstants.USE_WINDOW_ALARMS) { mAlarmManager.setWindow( AlarmManager.ELAPSED_REALTIME, wakeup ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME, mNextLightAlarmTime, flex, "DeviceIdleController.light", mLightAlarmListener, mHandler); } else { mAlarmManager.set( AlarmManager.ELAPSED_REALTIME, wakeup ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME, mNextLightAlarmTime, "DeviceIdleController.light", mLightAlarmListener, mHandler); } } @GuardedBy("this") @VisibleForTesting void scheduleLightMaintenanceAlarmLocked(long delay) { if (DEBUG) { Slog.d(TAG, "scheduleLightMaintenanceAlarmLocked(" + delay + ")"); } mNextLightMaintenanceAlarmTime = mInjector.getElapsedRealtime() + delay; mAlarmManager.setWindow( AlarmManager.ELAPSED_REALTIME_WAKEUP, mNextLightMaintenanceAlarmTime, mConstants.FLEX_TIME_SHORT, "DeviceIdleController.light", mLightMaintenanceAlarmListener, mHandler); } @VisibleForTesting long getNextLightAlarmTimeForTesting() { synchronized (this) { Loading @@ -4229,13 +4211,6 @@ public class DeviceIdleController extends SystemService } } @VisibleForTesting long getNextLightMaintenanceAlarmTimeForTesting() { synchronized (this) { return mNextLightMaintenanceAlarmTime; } } private void scheduleMotionRegistrationAlarmLocked() { if (DEBUG) Slog.d(TAG, "scheduleMotionRegistrationAlarmLocked"); long nextMotionRegistrationAlarmTime = Loading Loading @@ -4605,7 +4580,7 @@ public class DeviceIdleController extends SystemService pw.print("Stepped to deep: "); pw.println(stateToString(mState)); } else if ("light".equals(arg)) { stepLightIdleStateLocked("s:shell", /* forceProgression */ true); stepLightIdleStateLocked("s:shell"); pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState)); } else { pw.println("Unknown idle mode: " + arg); Loading Loading @@ -4645,7 +4620,7 @@ public class DeviceIdleController extends SystemService becomeInactiveIfAppropriateLocked(); int curLightState = mLightState; while (curLightState != LIGHT_STATE_IDLE) { stepLightIdleStateLocked("s:shell", /* forceProgression */ true); stepLightIdleStateLocked("s:shell"); if (curLightState == mLightState) { pw.print("Unable to go light idle; stopped at "); pw.println(lightStateToString(mLightState)); Loading Loading @@ -5266,19 +5241,19 @@ public class DeviceIdleController extends SystemService if (mNextLightIdleDelay != 0) { pw.print(" mNextLightIdleDelay="); TimeUtils.formatDuration(mNextLightIdleDelay, pw); if (mConstants.USE_WINDOW_ALARMS) { pw.print(" (flex="); TimeUtils.formatDuration(mNextLightIdleDelayFlex, pw); pw.println(")"); } else { pw.println(); } } if (mNextLightAlarmTime != 0) { pw.print(" mNextLightAlarmTime="); TimeUtils.formatDuration(mNextLightAlarmTime, SystemClock.elapsedRealtime(), pw); pw.println(); } if (mNextLightMaintenanceAlarmTime != 0) { pw.print(" mNextLightMaintenanceAlarmTime="); TimeUtils.formatDuration( mNextLightMaintenanceAlarmTime, SystemClock.elapsedRealtime(), pw); pw.println(); } if (mCurLightIdleBudget != 0) { pw.print(" mCurLightIdleBudget="); TimeUtils.formatDuration(mCurLightIdleBudget, pw); Loading core/res/res/values/config_device_idle.xml +7 −1 Original line number Diff line number Diff line Loading @@ -28,11 +28,17 @@ <integer name="device_idle_flex_time_short_ms">60000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT --> <integer name="device_idle_light_after_inactive_to_ms">180000</integer> <integer name="device_idle_light_after_inactive_to_ms">240000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT --> <integer name="device_idle_light_idle_to_ms">300000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT_MAX_FLEX --> <integer name="device_idle_light_idle_to_init_flex_ms">60000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT_MAX_FLEX --> <integer name="device_idle_light_idle_to_max_flex_ms">900000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_FACTOR --> <item name="device_idle_light_idle_factor" format="float" type="integer">2.0</item> Loading core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -4417,6 +4417,8 @@ <java-symbol type="integer" name="device_idle_flex_time_short_ms" /> <java-symbol type="integer" name="device_idle_light_after_inactive_to_ms" /> <java-symbol type="integer" name="device_idle_light_idle_to_ms" /> <java-symbol type="integer" name="device_idle_light_idle_to_init_flex_ms" /> <java-symbol type="integer" name="device_idle_light_idle_to_max_flex_ms" /> <java-symbol type="integer" name="device_idle_light_idle_factor" /> <java-symbol type="integer" name="device_idle_light_max_idle_to_ms" /> <java-symbol type="integer" name="device_idle_light_idle_maintenance_min_budget_ms" /> Loading services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java +51 −117 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +127 −152 Original line number Diff line number Diff line Loading @@ -244,7 +244,7 @@ import java.util.stream.Collectors; label="LIGHT_STATE_INACTIVE\nScreen off AND Not charging", color=black,shape=diamond ] LIGHT_STATE_IDLE [label="LIGHT_STATE_IDLE\n",color=blue,shape=oval] LIGHT_STATE_IDLE [label="LIGHT_STATE_IDLE\n",color=red,shape=box] LIGHT_STATE_WAITING_FOR_NETWORK [ label="LIGHT_STATE_WAITING_FOR_NETWORK\n" + "Coming out of LIGHT_STATE_IDLE, waiting for network", Loading Loading @@ -490,9 +490,9 @@ public class DeviceIdleController extends SystemService @GuardedBy("this") private long mNextLightIdleDelay; @GuardedBy("this") private long mNextLightAlarmTime; private long mNextLightIdleDelayFlex; @GuardedBy("this") private long mNextLightMaintenanceAlarmTime; private long mNextLightAlarmTime; @GuardedBy("this") private long mNextSensingTimeoutAlarmTime; Loading Loading @@ -689,15 +689,6 @@ public class DeviceIdleController extends SystemService } }; private final AlarmManager.OnAlarmListener mLightMaintenanceAlarmListener = () -> { if (DEBUG) { Slog.d(TAG, "Light maintenance alarm fired"); } synchronized (DeviceIdleController.this) { stepLightIdleStateLocked("s:alarm"); } }; /** AlarmListener to start monitoring motion if there are registered stationary listeners. */ private final AlarmManager.OnAlarmListener mMotionRegistrationAlarmListener = () -> { synchronized (DeviceIdleController.this) { Loading Loading @@ -962,6 +953,9 @@ public class DeviceIdleController extends SystemService private static final String KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = "light_after_inactive_to"; private static final String KEY_LIGHT_IDLE_TIMEOUT = "light_idle_to"; private static final String KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = "light_idle_to_initial_flex"; private static final String KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX = "light_max_idle_to_flex"; private static final String KEY_LIGHT_IDLE_FACTOR = "light_idle_factor"; private static final String KEY_LIGHT_MAX_IDLE_TIMEOUT = "light_max_idle_to"; private static final String KEY_LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = Loading Loading @@ -1010,6 +1004,10 @@ public class DeviceIdleController extends SystemService !COMPRESS_TIME ? 4 * 60 * 1000L : 30 * 1000L; private long mDefaultLightIdleTimeout = !COMPRESS_TIME ? 5 * 60 * 1000L : 15 * 1000L; private long mDefaultLightIdleTimeoutInitialFlex = !COMPRESS_TIME ? 60 * 1000L : 5 * 1000L; private long mDefaultLightIdleTimeoutMaxFlex = !COMPRESS_TIME ? 15 * 60 * 1000L : 60 * 1000L; private float mDefaultLightIdleFactor = 2f; private long mDefaultLightMaxIdleTimeout = !COMPRESS_TIME ? 15 * 60 * 1000L : 60 * 1000L; Loading Loading @@ -1083,6 +1081,22 @@ public class DeviceIdleController extends SystemService */ public long LIGHT_IDLE_TIMEOUT = mDefaultLightIdleTimeout; /** * This is the initial alarm window size that we will tolerate for light idle maintenance * timing. * * @see #KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX * @see #mNextLightIdleDelayFlex */ public long LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = mDefaultLightIdleTimeoutInitialFlex; /** * This is the maximum value that {@link #mNextLightIdleDelayFlex} should take. * * @see #KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX */ public long LIGHT_IDLE_TIMEOUT_MAX_FLEX = mDefaultLightIdleTimeoutMaxFlex; /** * Scaling factor to apply to the light idle mode time each time we complete a cycle. * Loading Loading @@ -1321,6 +1335,14 @@ public class DeviceIdleController extends SystemService mDefaultLightIdleTimeout = getTimeout( res.getInteger(com.android.internal.R.integer.device_idle_light_idle_to_ms), mDefaultLightIdleTimeout); mDefaultLightIdleTimeoutInitialFlex = getTimeout( res.getInteger( com.android.internal.R.integer.device_idle_light_idle_to_init_flex_ms), mDefaultLightIdleTimeoutInitialFlex); mDefaultLightIdleTimeoutMaxFlex = getTimeout( res.getInteger( com.android.internal.R.integer.device_idle_light_idle_to_max_flex_ms), mDefaultLightIdleTimeoutMaxFlex); mDefaultLightIdleFactor = res.getFloat( com.android.internal.R.integer.device_idle_light_idle_factor); mDefaultLightMaxIdleTimeout = getTimeout( Loading Loading @@ -1400,6 +1422,8 @@ public class DeviceIdleController extends SystemService FLEX_TIME_SHORT = mDefaultFlexTimeShort; LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = mDefaultLightIdleAfterInactiveTimeout; LIGHT_IDLE_TIMEOUT = mDefaultLightIdleTimeout; LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = mDefaultLightIdleTimeoutInitialFlex; LIGHT_IDLE_TIMEOUT_MAX_FLEX = mDefaultLightIdleTimeoutMaxFlex; LIGHT_IDLE_FACTOR = mDefaultLightIdleFactor; LIGHT_MAX_IDLE_TIMEOUT = mDefaultLightMaxIdleTimeout; LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = mDefaultLightIdleMaintenanceMinBudget; Loading Loading @@ -1457,6 +1481,16 @@ public class DeviceIdleController extends SystemService LIGHT_IDLE_TIMEOUT = properties.getLong( KEY_LIGHT_IDLE_TIMEOUT, mDefaultLightIdleTimeout); break; case KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX: LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = properties.getLong( KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX, mDefaultLightIdleTimeoutInitialFlex); break; case KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX: LIGHT_IDLE_TIMEOUT_MAX_FLEX = properties.getLong( KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX, mDefaultLightIdleTimeoutMaxFlex); break; case KEY_LIGHT_IDLE_FACTOR: LIGHT_IDLE_FACTOR = Math.max(1, properties.getFloat( KEY_LIGHT_IDLE_FACTOR, mDefaultLightIdleFactor)); Loading Loading @@ -1613,6 +1647,14 @@ public class DeviceIdleController extends SystemService TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT, pw); pw.println(); pw.print(" "); pw.print(KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX); pw.print("="); TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT_INITIAL_FLEX, pw); pw.println(); pw.print(" "); pw.print(KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX); pw.print("="); TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT_MAX_FLEX, pw); pw.println(); pw.print(" "); pw.print(KEY_LIGHT_IDLE_FACTOR); pw.print("="); pw.print(LIGHT_IDLE_FACTOR); pw.println(); Loading Loading @@ -3209,7 +3251,7 @@ public class DeviceIdleController extends SystemService if (conn != mNetworkConnected) { mNetworkConnected = conn; if (conn && mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) { stepLightIdleStateLocked("network", /* forceProgression */ true); stepLightIdleStateLocked("network"); } } } Loading Loading @@ -3454,11 +3496,7 @@ public class DeviceIdleController extends SystemService moveToLightStateLocked(LIGHT_STATE_INACTIVE, "no activity"); resetLightIdleManagementLocked(); scheduleLightAlarmLocked(mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT, mConstants.FLEX_TIME_SHORT); // After moving in INACTIVE, the maintenance window should start the time inactive // timeout and a single light idle period. scheduleLightMaintenanceAlarmLocked( mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT + mConstants.LIGHT_IDLE_TIMEOUT); mConstants.FLEX_TIME_SHORT, true); } } Loading @@ -3480,8 +3518,9 @@ public class DeviceIdleController extends SystemService private void resetLightIdleManagementLocked() { mNextLightIdleDelay = mConstants.LIGHT_IDLE_TIMEOUT; mMaintenanceStartTime = 0; mNextLightIdleDelayFlex = mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX; mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET; cancelAllLightAlarmsLocked(); cancelLightAlarmLocked(); } @GuardedBy("this") Loading Loading @@ -3514,15 +3553,10 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void stepLightIdleStateLocked(String reason) { stepLightIdleStateLocked(reason, false); } @GuardedBy("this") @VisibleForTesting @SuppressLint("WakelockTimeout") void stepLightIdleStateLocked(String reason, boolean forceProgression) { void stepLightIdleStateLocked(String reason) { if (mLightState == LIGHT_STATE_ACTIVE || mLightState == LIGHT_STATE_OVERRIDE) { // If we are already in deep device idle mode, then // there is nothing left to do for light mode. Loading @@ -3530,37 +3564,44 @@ public class DeviceIdleController extends SystemService } if (DEBUG) { Slog.d(TAG, "stepLightIdleStateLocked: mLightState=" + lightStateToString(mLightState) + " force=" + forceProgression); Slog.d(TAG, "stepLightIdleStateLocked: mLightState=" + lightStateToString(mLightState)); } EventLogTags.writeDeviceIdleLightStep(); final long nowElapsed = mInjector.getElapsedRealtime(); final boolean crossedMaintenanceTime = mNextLightMaintenanceAlarmTime > 0 && nowElapsed >= mNextLightMaintenanceAlarmTime; final boolean crossedProgressionTime = mNextLightAlarmTime > 0 && nowElapsed >= mNextLightAlarmTime; final boolean enterMaintenance; if (crossedMaintenanceTime) { if (crossedProgressionTime) { enterMaintenance = (mNextLightAlarmTime <= mNextLightMaintenanceAlarmTime); } else { enterMaintenance = true; } } else if (crossedProgressionTime) { enterMaintenance = false; } else if (forceProgression) { // This will happen for adb commands, unit tests, // and when we're in WAITING_FOR_NETWORK and the network connects. enterMaintenance = mLightState == LIGHT_STATE_IDLE || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK; switch (mLightState) { case LIGHT_STATE_INACTIVE: mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET; // Reset the upcoming idle delays. mNextLightIdleDelay = mConstants.LIGHT_IDLE_TIMEOUT; mNextLightIdleDelayFlex = mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX; mMaintenanceStartTime = 0; // Fall through to immediately idle. case LIGHT_STATE_IDLE_MAINTENANCE: if (mMaintenanceStartTime != 0) { long duration = SystemClock.elapsedRealtime() - mMaintenanceStartTime; if (duration < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) { // We didn't use up all of our minimum budget; add this to the reserve. mCurLightIdleBudget += (mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET - duration); } else { Slog.wtfStack(TAG, "stepLightIdleStateLocked called in invalid state: " + mLightState); return; // We used more than our minimum budget; this comes out of the reserve. mCurLightIdleBudget -= (duration - mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET); } if (enterMaintenance) { } mMaintenanceStartTime = 0; scheduleLightAlarmLocked(mNextLightIdleDelay, mNextLightIdleDelayFlex, true); mNextLightIdleDelay = Math.min(mConstants.LIGHT_MAX_IDLE_TIMEOUT, (long) (mNextLightIdleDelay * mConstants.LIGHT_IDLE_FACTOR)); mNextLightIdleDelayFlex = Math.min(mConstants.LIGHT_IDLE_TIMEOUT_MAX_FLEX, (long) (mNextLightIdleDelayFlex * mConstants.LIGHT_IDLE_FACTOR)); moveToLightStateLocked(LIGHT_STATE_IDLE, reason); addEvent(EVENT_LIGHT_IDLE, null); mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); break; case LIGHT_STATE_IDLE: case LIGHT_STATE_WAITING_FOR_NETWORK: if (mNetworkConnected || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) { // We have been idling long enough, now it is time to do some work. mActiveIdleOpCount = 1; Loading @@ -3571,13 +3612,7 @@ public class DeviceIdleController extends SystemService } else if (mCurLightIdleBudget > mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET) { mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET; } mNextLightIdleDelay = Math.min(mConstants.LIGHT_MAX_IDLE_TIMEOUT, (long) (mNextLightIdleDelay * mConstants.LIGHT_IDLE_FACTOR)); // We're entering MAINTENANCE. It should end curLightIdleBudget time from now. // The next maintenance window should be curLightIdleBudget + nextLightIdleDelay // time from now. scheduleLightAlarmLocked(mCurLightIdleBudget, mConstants.FLEX_TIME_SHORT); scheduleLightMaintenanceAlarmLocked(mCurLightIdleBudget + mNextLightIdleDelay); scheduleLightAlarmLocked(mCurLightIdleBudget, mConstants.FLEX_TIME_SHORT, true); moveToLightStateLocked(LIGHT_STATE_IDLE_MAINTENANCE, reason); addEvent(EVENT_LIGHT_MAINTENANCE, null); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF); Loading @@ -3585,36 +3620,11 @@ public class DeviceIdleController extends SystemService // We'd like to do maintenance, but currently don't have network // connectivity... let's try to wait until the network comes back. // We'll only wait for another full idle period, however, and then give up. scheduleLightMaintenanceAlarmLocked(mNextLightIdleDelay); cancelLightAlarmLocked(); scheduleLightAlarmLocked(mNextLightIdleDelay, mNextLightIdleDelayFlex / 2, true); moveToLightStateLocked(LIGHT_STATE_WAITING_FOR_NETWORK, reason); } } else { if (mMaintenanceStartTime != 0) { // Cap duration at budget since the non-wakeup alarm to exit maintenance may // not fire at the exact intended time, but once the system is up, we will stop // more ongoing work. long duration = Math.min(mCurLightIdleBudget, SystemClock.elapsedRealtime() - mMaintenanceStartTime); if (duration < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) { // We didn't use up all of our minimum budget; add this to the reserve. mCurLightIdleBudget += (mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET - duration); } else { // We used more than our minimum budget; this comes out of the reserve. mCurLightIdleBudget -= (duration - mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET); } } mMaintenanceStartTime = 0; // We're entering IDLE. We may have used less than curLightIdleBudget for the // maintenance window, so reschedule the alarm starting from now. scheduleLightMaintenanceAlarmLocked(mNextLightIdleDelay); cancelLightAlarmLocked(); moveToLightStateLocked(LIGHT_STATE_IDLE, reason); addEvent(EVENT_LIGHT_IDLE, null); mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); break; } } Loading Loading @@ -3749,7 +3759,7 @@ public class DeviceIdleController extends SystemService moveToStateLocked(STATE_IDLE, reason); if (mLightState != LIGHT_STATE_OVERRIDE) { moveToLightStateLocked(LIGHT_STATE_OVERRIDE, "deep"); cancelAllLightAlarmsLocked(); cancelLightAlarmLocked(); } addEvent(EVENT_DEEP_IDLE, null); mGoingIdleWakeLock.acquire(); Loading Loading @@ -3995,7 +4005,7 @@ public class DeviceIdleController extends SystemService if (mState == STATE_IDLE_MAINTENANCE) { stepIdleStateLocked("s:early"); } else { stepLightIdleStateLocked("s:early", /* forceProgression */ true); stepLightIdleStateLocked("s:early"); } } } Loading Loading @@ -4102,12 +4112,6 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void cancelAllLightAlarmsLocked() { cancelLightAlarmLocked(); cancelLightMaintenanceAlarmLocked(); } @GuardedBy("this") private void cancelLightAlarmLocked() { if (mNextLightAlarmTime != 0) { Loading @@ -4116,14 +4120,6 @@ public class DeviceIdleController extends SystemService } } @GuardedBy("this") private void cancelLightMaintenanceAlarmLocked() { if (mNextLightMaintenanceAlarmTime != 0) { mNextLightMaintenanceAlarmTime = 0; mAlarmManager.cancel(mLightMaintenanceAlarmListener); } } @GuardedBy("this") void cancelLocatingLocked() { if (mLocating) { Loading Loading @@ -4188,40 +4184,26 @@ public class DeviceIdleController extends SystemService } @GuardedBy("this") @VisibleForTesting void scheduleLightAlarmLocked(long delay, long flex) { void scheduleLightAlarmLocked(long delay, long flex, boolean wakeup) { if (DEBUG) { Slog.d(TAG, "scheduleLightAlarmLocked(" + delay + (mConstants.USE_WINDOW_ALARMS ? "/" + flex : "") + ")"); + ", wakeup=" + wakeup + ")"); } mNextLightAlarmTime = mInjector.getElapsedRealtime() + delay; if (mConstants.USE_WINDOW_ALARMS) { mAlarmManager.setWindow( AlarmManager.ELAPSED_REALTIME, wakeup ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME, mNextLightAlarmTime, flex, "DeviceIdleController.light", mLightAlarmListener, mHandler); } else { mAlarmManager.set( AlarmManager.ELAPSED_REALTIME, wakeup ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME, mNextLightAlarmTime, "DeviceIdleController.light", mLightAlarmListener, mHandler); } } @GuardedBy("this") @VisibleForTesting void scheduleLightMaintenanceAlarmLocked(long delay) { if (DEBUG) { Slog.d(TAG, "scheduleLightMaintenanceAlarmLocked(" + delay + ")"); } mNextLightMaintenanceAlarmTime = mInjector.getElapsedRealtime() + delay; mAlarmManager.setWindow( AlarmManager.ELAPSED_REALTIME_WAKEUP, mNextLightMaintenanceAlarmTime, mConstants.FLEX_TIME_SHORT, "DeviceIdleController.light", mLightMaintenanceAlarmListener, mHandler); } @VisibleForTesting long getNextLightAlarmTimeForTesting() { synchronized (this) { Loading @@ -4229,13 +4211,6 @@ public class DeviceIdleController extends SystemService } } @VisibleForTesting long getNextLightMaintenanceAlarmTimeForTesting() { synchronized (this) { return mNextLightMaintenanceAlarmTime; } } private void scheduleMotionRegistrationAlarmLocked() { if (DEBUG) Slog.d(TAG, "scheduleMotionRegistrationAlarmLocked"); long nextMotionRegistrationAlarmTime = Loading Loading @@ -4605,7 +4580,7 @@ public class DeviceIdleController extends SystemService pw.print("Stepped to deep: "); pw.println(stateToString(mState)); } else if ("light".equals(arg)) { stepLightIdleStateLocked("s:shell", /* forceProgression */ true); stepLightIdleStateLocked("s:shell"); pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState)); } else { pw.println("Unknown idle mode: " + arg); Loading Loading @@ -4645,7 +4620,7 @@ public class DeviceIdleController extends SystemService becomeInactiveIfAppropriateLocked(); int curLightState = mLightState; while (curLightState != LIGHT_STATE_IDLE) { stepLightIdleStateLocked("s:shell", /* forceProgression */ true); stepLightIdleStateLocked("s:shell"); if (curLightState == mLightState) { pw.print("Unable to go light idle; stopped at "); pw.println(lightStateToString(mLightState)); Loading Loading @@ -5266,19 +5241,19 @@ public class DeviceIdleController extends SystemService if (mNextLightIdleDelay != 0) { pw.print(" mNextLightIdleDelay="); TimeUtils.formatDuration(mNextLightIdleDelay, pw); if (mConstants.USE_WINDOW_ALARMS) { pw.print(" (flex="); TimeUtils.formatDuration(mNextLightIdleDelayFlex, pw); pw.println(")"); } else { pw.println(); } } if (mNextLightAlarmTime != 0) { pw.print(" mNextLightAlarmTime="); TimeUtils.formatDuration(mNextLightAlarmTime, SystemClock.elapsedRealtime(), pw); pw.println(); } if (mNextLightMaintenanceAlarmTime != 0) { pw.print(" mNextLightMaintenanceAlarmTime="); TimeUtils.formatDuration( mNextLightMaintenanceAlarmTime, SystemClock.elapsedRealtime(), pw); pw.println(); } if (mCurLightIdleBudget != 0) { pw.print(" mCurLightIdleBudget="); TimeUtils.formatDuration(mCurLightIdleBudget, pw); Loading
core/res/res/values/config_device_idle.xml +7 −1 Original line number Diff line number Diff line Loading @@ -28,11 +28,17 @@ <integer name="device_idle_flex_time_short_ms">60000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT --> <integer name="device_idle_light_after_inactive_to_ms">180000</integer> <integer name="device_idle_light_after_inactive_to_ms">240000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT --> <integer name="device_idle_light_idle_to_ms">300000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT_MAX_FLEX --> <integer name="device_idle_light_idle_to_init_flex_ms">60000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT_MAX_FLEX --> <integer name="device_idle_light_idle_to_max_flex_ms">900000</integer> <!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_FACTOR --> <item name="device_idle_light_idle_factor" format="float" type="integer">2.0</item> Loading
core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -4417,6 +4417,8 @@ <java-symbol type="integer" name="device_idle_flex_time_short_ms" /> <java-symbol type="integer" name="device_idle_light_after_inactive_to_ms" /> <java-symbol type="integer" name="device_idle_light_idle_to_ms" /> <java-symbol type="integer" name="device_idle_light_idle_to_init_flex_ms" /> <java-symbol type="integer" name="device_idle_light_idle_to_max_flex_ms" /> <java-symbol type="integer" name="device_idle_light_idle_factor" /> <java-symbol type="integer" name="device_idle_light_max_idle_to_ms" /> <java-symbol type="integer" name="device_idle_light_idle_maintenance_min_budget_ms" /> Loading
services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java +51 −117 File changed.Preview size limit exceeded, changes collapsed. Show changes