Loading apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +4 −4 Original line number Diff line number Diff line Loading @@ -35,8 +35,6 @@ public interface AppStandbyInternal { void onBootPhase(int phase); boolean isParoledOrCharging(); void postCheckIdleStates(int userId); /** Loading @@ -59,13 +57,15 @@ public interface AppStandbyInternal { int getAppId(String packageName); boolean isAppIdleFilteredOrParoled(String packageName, int userId, long elapsedRealtime, /** * @see #isAppIdleFiltered(String, int, int, long) */ boolean isAppIdleFiltered(String packageName, int userId, long elapsedRealtime, boolean shouldObfuscateInstantApps); /** * Checks if an app has been idle for a while and filters out apps that are excluded. * It returns false if the current system state allows all apps to be considered active. * This happens if the device is plugged in or temporarily allowed to make exceptions. * Called by interface impls. */ boolean isAppIdleFiltered(String packageName, int appId, int userId, Loading apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +0 −18 Original line number Diff line number Diff line Loading @@ -265,11 +265,6 @@ public class JobSchedulerService extends com.android.server.SystemService */ boolean mReportedActive; /** * Are we currently in device-wide standby parole? */ volatile boolean mInParole; /** * A mapping of which uids are currently in the foreground to their effective priority. */ Loading Loading @@ -2360,14 +2355,6 @@ public class JobSchedulerService extends com.android.server.SystemService // QuotaController handles this now. } @Override public void onParoleStateChanged(boolean isParoleOn) { if (DEBUG_STANDBY) { Slog.i(TAG, "Global parole state now " + (isParoleOn ? "ON" : "OFF")); } mInParole = isParoleOn; } @Override public void onUserInteractionStarted(String packageName, int userId) { final int uid = mLocalPM.getPackageUid(packageName, Loading Loading @@ -3031,10 +3018,6 @@ public class JobSchedulerService extends com.android.server.SystemService } pw.println(); pw.print(" In parole?: "); pw.print(mInParole); pw.println(); for (int i = mJobRestrictions.size() - 1; i >= 0; i--) { pw.print(" "); mJobRestrictions.get(i).dumpConstants(pw); Loading Loading @@ -3222,7 +3205,6 @@ public class JobSchedulerService extends com.android.server.SystemService } proto.end(settingsToken); proto.write(JobSchedulerServiceDumpProto.IN_PAROLE, mInParole); for (int i = mJobRestrictions.size() - 1; i >= 0; i--) { mJobRestrictions.get(i).dumpConstants(proto); } Loading apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +2 −21 Original line number Diff line number Diff line Loading @@ -414,8 +414,6 @@ public final class QuotaController extends StateController { private final Handler mHandler; private final QcConstants mQcConstants; private volatile boolean mInParole; /** How much time each app will have to run jobs within their standby bucket window. */ private long mAllowedTimePerPeriodMs = QcConstants.DEFAULT_ALLOWED_TIME_PER_PERIOD_MS; Loading Loading @@ -711,7 +709,6 @@ public final class QuotaController extends StateController { public long getMaxJobExecutionTimeMsLocked(@NonNull final JobStatus jobStatus) { // If quota is currently "free", then the job can run for the full amount of time. if (mChargeTracker.isCharging() || mInParole || isTopStartedJobLocked(jobStatus) || isUidInForeground(jobStatus.getSourceUid())) { return JobServiceContext.EXECUTING_TIMESLICE_MILLIS; Loading @@ -737,8 +734,8 @@ public final class QuotaController extends StateController { final int standbyBucket) { if (standbyBucket == NEVER_INDEX) return false; // Quota constraint is not enforced while charging or when parole is on. if (mChargeTracker.isCharging() || mInParole) { // Quota constraint is not enforced while charging. if (mChargeTracker.isCharging()) { return true; } Loading Loading @@ -1780,20 +1777,6 @@ public final class QuotaController extends StateController { } }); } @Override public void onParoleStateChanged(final boolean isParoleOn) { mInParole = isParoleOn; if (DEBUG) { Slog.i(TAG, "Global parole state now " + (isParoleOn ? "ON" : "OFF")); } // Update job bookkeeping out of band. BackgroundThread.getHandler().post(() -> { synchronized (mLock) { maybeUpdateAllConstraintsLocked(); } }); } } private final class DeleteTimingSessionsFunctor implements Consumer<List<TimingSession>> { Loading Loading @@ -2515,7 +2498,6 @@ public final class QuotaController extends StateController { public void dumpControllerStateLocked(final IndentingPrintWriter pw, final Predicate<JobStatus> predicate) { pw.println("Is charging: " + mChargeTracker.isCharging()); pw.println("In parole: " + mInParole); pw.println("Current elapsed time: " + sElapsedRealtimeClock.millis()); pw.println(); Loading Loading @@ -2639,7 +2621,6 @@ public final class QuotaController extends StateController { final long mToken = proto.start(StateControllerProto.QUOTA); proto.write(StateControllerProto.QuotaController.IS_CHARGING, mChargeTracker.isCharging()); proto.write(StateControllerProto.QuotaController.IS_IN_PAROLE, mInParole); proto.write(StateControllerProto.QuotaController.ELAPSED_REALTIME, sElapsedRealtimeClock.millis()); Loading apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +2 −286 Original line number Diff line number Diff line Loading @@ -45,7 +45,6 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET; import static com.android.server.SystemService.PHASE_BOOT_COMPLETED; import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; import android.annotation.UserIdInt; Loading @@ -70,10 +69,8 @@ import android.database.ContentObserver; import android.hardware.display.DisplayManager; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkInfo; import android.net.NetworkRequest; import android.net.NetworkScoreManager; import android.os.BatteryManager; import android.os.BatteryStats; import android.os.Environment; import android.os.Handler; Loading Loading @@ -192,21 +189,14 @@ public class AppStandbyController implements AppStandbyInternal { static final int MSG_INFORM_LISTENERS = 3; static final int MSG_FORCE_IDLE_STATE = 4; static final int MSG_CHECK_IDLE_STATES = 5; static final int MSG_CHECK_PAROLE_TIMEOUT = 6; static final int MSG_PAROLE_END_TIMEOUT = 7; static final int MSG_REPORT_CONTENT_PROVIDER_USAGE = 8; static final int MSG_PAROLE_STATE_CHANGED = 9; static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10; /** Check the state of one app: arg1 = userId, arg2 = uid, obj = (String) packageName */ static final int MSG_CHECK_PACKAGE_IDLE_STATE = 11; static final int MSG_REPORT_SYNC_SCHEDULED = 12; static final int MSG_REPORT_EXEMPTED_SYNC_START = 13; static final int MSG_UPDATE_STABLE_CHARGING= 14; long mCheckIdleIntervalMillis; long mAppIdleParoleIntervalMillis; long mAppIdleParoleWindowMillis; long mAppIdleParoleDurationMillis; long[] mAppStandbyScreenThresholds = SCREEN_TIME_THRESHOLDS; long[] mAppStandbyElapsedThresholds = ELAPSED_TIME_THRESHOLDS; /** Minimum time a strong usage event should keep the bucket elevated. */ Loading Loading @@ -244,20 +234,12 @@ public class AppStandbyController implements AppStandbyInternal { * start is the first usage of the app */ long mInitialForegroundServiceStartTimeoutMillis; /** The length of time phone must be charging before considered stable enough to run jobs */ long mStableChargingThresholdMillis; private volatile boolean mAppIdleEnabled; boolean mAppIdleTempParoled; boolean mCharging; boolean mChargingStable; private long mLastAppIdleParoledTime; private boolean mSystemServicesReady = false; // There was a system update, defaults need to be initialized after services are ready private boolean mPendingInitializeDefaults; private final DeviceStateReceiver mDeviceStateReceiver; private volatile boolean mPendingOneTimeCheckIdleStates; private final AppStandbyHandler mHandler; Loading @@ -267,7 +249,6 @@ public class AppStandbyController implements AppStandbyInternal { private AppWidgetManager mAppWidgetManager; private ConnectivityManager mConnectivityManager; private PowerManager mPowerManager; private PackageManager mPackageManager; Injector mInjector; Loading Loading @@ -329,12 +310,6 @@ public class AppStandbyController implements AppStandbyInternal { mContext = mInjector.getContext(); mHandler = new AppStandbyHandler(mInjector.getLooper()); mPackageManager = mContext.getPackageManager(); mDeviceStateReceiver = new DeviceStateReceiver(); IntentFilter deviceStates = new IntentFilter(BatteryManager.ACTION_CHARGING); deviceStates.addAction(BatteryManager.ACTION_DISCHARGING); deviceStates.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); mContext.registerReceiver(mDeviceStateReceiver, deviceStates); synchronized (mAppIdleLock) { mAppIdleHistory = new AppIdleHistory(mInjector.getDataSystemDirectory(), Loading @@ -353,15 +328,7 @@ public class AppStandbyController implements AppStandbyInternal { @VisibleForTesting void setAppIdleEnabled(boolean enabled) { synchronized (mAppIdleLock) { if (mAppIdleEnabled != enabled) { final boolean oldParoleState = isParoledOrCharging(); mAppIdleEnabled = enabled; if (isParoledOrCharging() != oldParoleState) { postParoleStateChanged(); } } } } @Override Loading @@ -381,7 +348,6 @@ public class AppStandbyController implements AppStandbyInternal { mAppWidgetManager = mContext.getSystemService(AppWidgetManager.class); mConnectivityManager = mContext.getSystemService(ConnectivityManager.class); mPowerManager = mContext.getSystemService(PowerManager.class); mInjector.registerDisplayListener(mDisplayListener, mHandler); synchronized (mAppIdleLock) { Loading @@ -402,8 +368,6 @@ public class AppStandbyController implements AppStandbyInternal { if (mPendingOneTimeCheckIdleStates) { postOneTimeCheckIdleStates(); } } else if (phase == PHASE_BOOT_COMPLETED) { setChargingState(mInjector.isCharging()); } } Loading Loading @@ -504,93 +468,6 @@ public class AppStandbyController implements AppStandbyInternal { } } @VisibleForTesting void setChargingState(boolean charging) { synchronized (mAppIdleLock) { if (mCharging != charging) { mCharging = charging; if (DEBUG) Slog.d(TAG, "Setting mCharging to " + charging); if (charging) { if (DEBUG) { Slog.d(TAG, "Scheduling MSG_UPDATE_STABLE_CHARGING delay = " + mStableChargingThresholdMillis); } mHandler.sendEmptyMessageDelayed(MSG_UPDATE_STABLE_CHARGING, mStableChargingThresholdMillis); } else { mHandler.removeMessages(MSG_UPDATE_STABLE_CHARGING); updateChargingStableState(); } } } } private void updateChargingStableState() { synchronized (mAppIdleLock) { if (mChargingStable != mCharging) { if (DEBUG) Slog.d(TAG, "Setting mChargingStable to " + mCharging); mChargingStable = mCharging; postParoleStateChanged(); } } } private void setAppIdleParoled(boolean paroled) { synchronized (mAppIdleLock) { final long now = mInjector.currentTimeMillis(); if (mAppIdleTempParoled != paroled) { mAppIdleTempParoled = paroled; if (DEBUG) Slog.d(TAG, "Changing paroled to " + mAppIdleTempParoled); if (paroled) { postParoleEndTimeout(); } else { mLastAppIdleParoledTime = now; postNextParoleTimeout(now, false); } postParoleStateChanged(); } } } @Override public boolean isParoledOrCharging() { if (!mAppIdleEnabled) return true; synchronized (mAppIdleLock) { // Only consider stable charging when determining charge state. return mAppIdleTempParoled || mChargingStable; } } private void postNextParoleTimeout(long now, boolean forced) { if (DEBUG) Slog.d(TAG, "Posting MSG_CHECK_PAROLE_TIMEOUT"); mHandler.removeMessages(MSG_CHECK_PAROLE_TIMEOUT); // Compute when the next parole needs to happen. We check more frequently than necessary // since the message handler delays are based on elapsedRealTime and not wallclock time. // The comparison is done in wallclock time. long timeLeft = (mLastAppIdleParoledTime + mAppIdleParoleIntervalMillis) - now; if (forced) { // Set next timeout for the end of the parole window // If parole is not set by the end of the window it will be forced timeLeft += mAppIdleParoleWindowMillis; } if (timeLeft < 0) { timeLeft = 0; } mHandler.sendEmptyMessageDelayed(MSG_CHECK_PAROLE_TIMEOUT, timeLeft); } private void postParoleEndTimeout() { if (DEBUG) Slog.d(TAG, "Posting MSG_PAROLE_END_TIMEOUT"); mHandler.removeMessages(MSG_PAROLE_END_TIMEOUT); mHandler.sendEmptyMessageDelayed(MSG_PAROLE_END_TIMEOUT, mAppIdleParoleDurationMillis); } private void postParoleStateChanged() { if (DEBUG) Slog.d(TAG, "Posting MSG_PAROLE_STATE_CHANGED"); mHandler.removeMessages(MSG_PAROLE_STATE_CHANGED); mHandler.sendEmptyMessage(MSG_PAROLE_STATE_CHANGED); } @Override public void postCheckIdleStates(int userId) { mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0)); Loading Loading @@ -787,48 +664,6 @@ public class AppStandbyController implements AppStandbyInternal { return THRESHOLD_BUCKETS[bucketIndex]; } private void checkParoleTimeout() { boolean setParoled = false; boolean waitForNetwork = false; NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo(); boolean networkActive = activeNetwork != null && activeNetwork.isConnected(); synchronized (mAppIdleLock) { final long now = mInjector.currentTimeMillis(); if (!mAppIdleTempParoled) { final long timeSinceLastParole = now - mLastAppIdleParoledTime; if (timeSinceLastParole > mAppIdleParoleIntervalMillis) { if (DEBUG) Slog.d(TAG, "Crossed default parole interval"); if (networkActive) { // If network is active set parole setParoled = true; } else { if (timeSinceLastParole > mAppIdleParoleIntervalMillis + mAppIdleParoleWindowMillis) { if (DEBUG) Slog.d(TAG, "Crossed end of parole window, force parole"); setParoled = true; } else { if (DEBUG) Slog.d(TAG, "Network unavailable, delaying parole"); waitForNetwork = true; postNextParoleTimeout(now, true); } } } else { if (DEBUG) Slog.d(TAG, "Not long enough to go to parole"); postNextParoleTimeout(now, false); } } } if (waitForNetwork) { mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback); } if (setParoled) { // Set parole if network is available setAppIdleParoled(true); } } private void notifyBatteryStats(String packageName, int userId, boolean idle) { try { final int uid = mPackageManager.getPackageUidAsUser(packageName, Loading @@ -844,30 +679,6 @@ public class AppStandbyController implements AppStandbyInternal { } } private void onDeviceIdleModeChanged() { final boolean deviceIdle = mPowerManager.isDeviceIdleMode(); if (DEBUG) Slog.i(TAG, "DeviceIdleMode changed to " + deviceIdle); boolean paroled = false; synchronized (mAppIdleLock) { final long timeSinceLastParole = mInjector.currentTimeMillis() - mLastAppIdleParoledTime; if (!deviceIdle && timeSinceLastParole >= mAppIdleParoleIntervalMillis) { if (DEBUG) { Slog.i(TAG, "Bringing idle apps out of inactive state due to deviceIdleMode=false"); } paroled = true; } else if (deviceIdle) { if (DEBUG) Slog.i(TAG, "Device idle, back to prison"); paroled = false; } else { return; } } setAppIdleParoled(paroled); } @Override public void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId) { if (!mAppIdleEnabled) return; Loading Loading @@ -1038,11 +849,8 @@ public class AppStandbyController implements AppStandbyInternal { } @Override public boolean isAppIdleFilteredOrParoled(String packageName, int userId, long elapsedRealtime, public boolean isAppIdleFiltered(String packageName, int userId, long elapsedRealtime, boolean shouldObfuscateInstantApps) { if (isParoledOrCharging()) { return false; } if (shouldObfuscateInstantApps && mInjector.isPackageEphemeral(userId, packageName)) { return false; Loading Loading @@ -1388,15 +1196,6 @@ public class AppStandbyController implements AppStandbyInternal { } } private void informParoleStateChanged() { final boolean paroled = isParoledOrCharging(); synchronized (mPackageAccessListeners) { for (AppIdleStateChangeListener listener : mPackageAccessListeners) { listener.onParoleStateChanged(paroled); } } } @Override public void flushToDisk(int userId) { synchronized (mAppIdleLock) { Loading Loading @@ -1517,18 +1316,6 @@ public class AppStandbyController implements AppStandbyInternal { TimeUtils.formatDuration(mCheckIdleIntervalMillis, pw); pw.println(); pw.print(" mAppIdleParoleIntervalMillis="); TimeUtils.formatDuration(mAppIdleParoleIntervalMillis, pw); pw.println(); pw.print(" mAppIdleParoleWindowMillis="); TimeUtils.formatDuration(mAppIdleParoleWindowMillis, pw); pw.println(); pw.print(" mAppIdleParoleDurationMillis="); TimeUtils.formatDuration(mAppIdleParoleDurationMillis, pw); pw.println(); pw.print(" mStrongUsageTimeoutMillis="); TimeUtils.formatDuration(mStrongUsageTimeoutMillis, pw); pw.println(); Loading Loading @@ -1566,22 +1353,11 @@ public class AppStandbyController implements AppStandbyInternal { TimeUtils.formatDuration(mSystemUpdateUsageTimeoutMillis, pw); pw.println(); pw.print(" mStableChargingThresholdMillis="); TimeUtils.formatDuration(mStableChargingThresholdMillis, pw); pw.println(); pw.println(); pw.print("mAppIdleEnabled="); pw.print(mAppIdleEnabled); pw.print(" mAppIdleTempParoled="); pw.print(mAppIdleTempParoled); pw.print(" mCharging="); pw.print(mCharging); pw.print(" mChargingStable="); pw.print(mChargingStable); pw.print(" mLastAppIdleParoledTime="); TimeUtils.formatDuration(now - mLastAppIdleParoledTime, pw); pw.println(); pw.print("mScreenThresholds="); pw.println(Arrays.toString(mAppStandbyScreenThresholds)); pw.print("mElapsedThresholds="); pw.println(Arrays.toString(mAppStandbyElapsedThresholds)); pw.print("mStableChargingThresholdMillis="); TimeUtils.formatDuration(mStableChargingThresholdMillis, pw); pw.println(); } Loading Loading @@ -1655,10 +1431,6 @@ public class AppStandbyController implements AppStandbyInternal { return buildFlag && runtimeFlag; } boolean isCharging() { return mContext.getSystemService(BatteryManager.class).isCharging(); } boolean isPowerSaveWhitelistExceptIdleApp(String packageName) throws RemoteException { return mDeviceIdleController.isPowerSaveWhitelistExceptIdleApp(packageName); } Loading Loading @@ -1748,15 +1520,6 @@ public class AppStandbyController implements AppStandbyInternal { checkIdleStates(UserHandle.USER_ALL); break; case MSG_CHECK_PAROLE_TIMEOUT: checkParoleTimeout(); break; case MSG_PAROLE_END_TIMEOUT: if (DEBUG) Slog.d(TAG, "Ending parole"); setAppIdleParoled(false); break; case MSG_REPORT_CONTENT_PROVIDER_USAGE: SomeArgs args = (SomeArgs) msg.obj; reportContentProviderUsage((String) args.arg1, // authority name Loading @@ -1765,11 +1528,6 @@ public class AppStandbyController implements AppStandbyInternal { args.recycle(); break; case MSG_PAROLE_STATE_CHANGED: if (DEBUG) Slog.d(TAG, "Parole state: " + mAppIdleTempParoled + ", Charging state:" + mChargingStable); informParoleStateChanged(); break; case MSG_CHECK_PACKAGE_IDLE_STATE: checkAndUpdateStandbyState((String) msg.obj, msg.arg1, msg.arg2, mInjector.elapsedRealtime()); Loading @@ -1788,10 +1546,6 @@ public class AppStandbyController implements AppStandbyInternal { reportExemptedSyncStart((String) msg.obj, msg.arg1); break; case MSG_UPDATE_STABLE_CHARGING: updateChargingStableState(); break; default: super.handleMessage(msg); break; Loading @@ -1800,23 +1554,6 @@ public class AppStandbyController implements AppStandbyInternal { } }; private class DeviceStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { case BatteryManager.ACTION_CHARGING: setChargingState(true); break; case BatteryManager.ACTION_DISCHARGING: setChargingState(false); break; case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: onDeviceIdleModeChanged(); break; } } } private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder().build(); private final ConnectivityManager.NetworkCallback mNetworkCallback Loading @@ -1824,7 +1561,6 @@ public class AppStandbyController implements AppStandbyInternal { @Override public void onAvailable(Network network) { mConnectivityManager.unregisterNetworkCallback(this); checkParoleTimeout(); } }; Loading @@ -1851,9 +1587,6 @@ public class AppStandbyController implements AppStandbyInternal { * Observe settings changes for {@link Global#APP_IDLE_CONSTANTS}. */ private class SettingsObserver extends ContentObserver { private static final String KEY_PAROLE_INTERVAL = "parole_interval"; private static final String KEY_PAROLE_WINDOW = "parole_window"; private static final String KEY_PAROLE_DURATION = "parole_duration"; private static final String KEY_SCREEN_TIME_THRESHOLDS = "screen_thresholds"; private static final String KEY_ELAPSED_TIME_THRESHOLDS = "elapsed_thresholds"; private static final String KEY_STRONG_USAGE_HOLD_DURATION = "strong_usage_duration"; Loading @@ -1875,7 +1608,6 @@ public class AppStandbyController implements AppStandbyInternal { "system_interaction_duration"; private static final String KEY_INITIAL_FOREGROUND_SERVICE_START_HOLD_DURATION = "initial_foreground_service_start_duration"; private static final String KEY_STABLE_CHARGING_THRESHOLD = "stable_charging_threshold"; public static final long DEFAULT_STRONG_USAGE_TIMEOUT = 1 * ONE_HOUR; public static final long DEFAULT_NOTIFICATION_TIMEOUT = 12 * ONE_HOUR; public static final long DEFAULT_SYSTEM_UPDATE_TIMEOUT = 2 * ONE_HOUR; Loading @@ -1885,7 +1617,6 @@ public class AppStandbyController implements AppStandbyInternal { public static final long DEFAULT_EXEMPTED_SYNC_SCHEDULED_DOZE_TIMEOUT = 4 * ONE_HOUR; public static final long DEFAULT_EXEMPTED_SYNC_START_TIMEOUT = 10 * ONE_MINUTE; public static final long DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT = 10 * ONE_MINUTE; public static final long DEFAULT_STABLE_CHARGING_THRESHOLD = 10 * ONE_MINUTE; public static final long DEFAULT_INITIAL_FOREGROUND_SERVICE_START_TIMEOUT = 30 * ONE_MINUTE; private final KeyValueListParser mParser = new KeyValueListParser(','); Loading Loading @@ -1932,17 +1663,6 @@ public class AppStandbyController implements AppStandbyInternal { synchronized (mAppIdleLock) { // Default: 24 hours between paroles mAppIdleParoleIntervalMillis = mParser.getDurationMillis(KEY_PAROLE_INTERVAL, COMPRESS_TIME ? ONE_MINUTE * 10 : 24 * 60 * ONE_MINUTE); // Default: 2 hours to wait on network mAppIdleParoleWindowMillis = mParser.getDurationMillis(KEY_PAROLE_WINDOW, COMPRESS_TIME ? ONE_MINUTE * 2 : 2 * 60 * ONE_MINUTE); mAppIdleParoleDurationMillis = mParser.getDurationMillis(KEY_PAROLE_DURATION, COMPRESS_TIME ? ONE_MINUTE : 10 * ONE_MINUTE); // 10 minutes String screenThresholdsValue = mParser.getString(KEY_SCREEN_TIME_THRESHOLDS, null); mAppStandbyScreenThresholds = parseLongArray(screenThresholdsValue, SCREEN_TIME_THRESHOLDS); Loading Loading @@ -1997,10 +1717,6 @@ public class AppStandbyController implements AppStandbyInternal { KEY_INITIAL_FOREGROUND_SERVICE_START_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_INITIAL_FOREGROUND_SERVICE_START_TIMEOUT); mStableChargingThresholdMillis = mParser.getDurationMillis( KEY_STABLE_CHARGING_THRESHOLD, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STABLE_CHARGING_THRESHOLD); } // Check if app_idle_enabled has changed. Do this after getting the rest of the settings Loading Loading
apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +4 −4 Original line number Diff line number Diff line Loading @@ -35,8 +35,6 @@ public interface AppStandbyInternal { void onBootPhase(int phase); boolean isParoledOrCharging(); void postCheckIdleStates(int userId); /** Loading @@ -59,13 +57,15 @@ public interface AppStandbyInternal { int getAppId(String packageName); boolean isAppIdleFilteredOrParoled(String packageName, int userId, long elapsedRealtime, /** * @see #isAppIdleFiltered(String, int, int, long) */ boolean isAppIdleFiltered(String packageName, int userId, long elapsedRealtime, boolean shouldObfuscateInstantApps); /** * Checks if an app has been idle for a while and filters out apps that are excluded. * It returns false if the current system state allows all apps to be considered active. * This happens if the device is plugged in or temporarily allowed to make exceptions. * Called by interface impls. */ boolean isAppIdleFiltered(String packageName, int appId, int userId, Loading
apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +0 −18 Original line number Diff line number Diff line Loading @@ -265,11 +265,6 @@ public class JobSchedulerService extends com.android.server.SystemService */ boolean mReportedActive; /** * Are we currently in device-wide standby parole? */ volatile boolean mInParole; /** * A mapping of which uids are currently in the foreground to their effective priority. */ Loading Loading @@ -2360,14 +2355,6 @@ public class JobSchedulerService extends com.android.server.SystemService // QuotaController handles this now. } @Override public void onParoleStateChanged(boolean isParoleOn) { if (DEBUG_STANDBY) { Slog.i(TAG, "Global parole state now " + (isParoleOn ? "ON" : "OFF")); } mInParole = isParoleOn; } @Override public void onUserInteractionStarted(String packageName, int userId) { final int uid = mLocalPM.getPackageUid(packageName, Loading Loading @@ -3031,10 +3018,6 @@ public class JobSchedulerService extends com.android.server.SystemService } pw.println(); pw.print(" In parole?: "); pw.print(mInParole); pw.println(); for (int i = mJobRestrictions.size() - 1; i >= 0; i--) { pw.print(" "); mJobRestrictions.get(i).dumpConstants(pw); Loading Loading @@ -3222,7 +3205,6 @@ public class JobSchedulerService extends com.android.server.SystemService } proto.end(settingsToken); proto.write(JobSchedulerServiceDumpProto.IN_PAROLE, mInParole); for (int i = mJobRestrictions.size() - 1; i >= 0; i--) { mJobRestrictions.get(i).dumpConstants(proto); } Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +2 −21 Original line number Diff line number Diff line Loading @@ -414,8 +414,6 @@ public final class QuotaController extends StateController { private final Handler mHandler; private final QcConstants mQcConstants; private volatile boolean mInParole; /** How much time each app will have to run jobs within their standby bucket window. */ private long mAllowedTimePerPeriodMs = QcConstants.DEFAULT_ALLOWED_TIME_PER_PERIOD_MS; Loading Loading @@ -711,7 +709,6 @@ public final class QuotaController extends StateController { public long getMaxJobExecutionTimeMsLocked(@NonNull final JobStatus jobStatus) { // If quota is currently "free", then the job can run for the full amount of time. if (mChargeTracker.isCharging() || mInParole || isTopStartedJobLocked(jobStatus) || isUidInForeground(jobStatus.getSourceUid())) { return JobServiceContext.EXECUTING_TIMESLICE_MILLIS; Loading @@ -737,8 +734,8 @@ public final class QuotaController extends StateController { final int standbyBucket) { if (standbyBucket == NEVER_INDEX) return false; // Quota constraint is not enforced while charging or when parole is on. if (mChargeTracker.isCharging() || mInParole) { // Quota constraint is not enforced while charging. if (mChargeTracker.isCharging()) { return true; } Loading Loading @@ -1780,20 +1777,6 @@ public final class QuotaController extends StateController { } }); } @Override public void onParoleStateChanged(final boolean isParoleOn) { mInParole = isParoleOn; if (DEBUG) { Slog.i(TAG, "Global parole state now " + (isParoleOn ? "ON" : "OFF")); } // Update job bookkeeping out of band. BackgroundThread.getHandler().post(() -> { synchronized (mLock) { maybeUpdateAllConstraintsLocked(); } }); } } private final class DeleteTimingSessionsFunctor implements Consumer<List<TimingSession>> { Loading Loading @@ -2515,7 +2498,6 @@ public final class QuotaController extends StateController { public void dumpControllerStateLocked(final IndentingPrintWriter pw, final Predicate<JobStatus> predicate) { pw.println("Is charging: " + mChargeTracker.isCharging()); pw.println("In parole: " + mInParole); pw.println("Current elapsed time: " + sElapsedRealtimeClock.millis()); pw.println(); Loading Loading @@ -2639,7 +2621,6 @@ public final class QuotaController extends StateController { final long mToken = proto.start(StateControllerProto.QUOTA); proto.write(StateControllerProto.QuotaController.IS_CHARGING, mChargeTracker.isCharging()); proto.write(StateControllerProto.QuotaController.IS_IN_PAROLE, mInParole); proto.write(StateControllerProto.QuotaController.ELAPSED_REALTIME, sElapsedRealtimeClock.millis()); Loading
apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +2 −286 Original line number Diff line number Diff line Loading @@ -45,7 +45,6 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET; import static com.android.server.SystemService.PHASE_BOOT_COMPLETED; import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; import android.annotation.UserIdInt; Loading @@ -70,10 +69,8 @@ import android.database.ContentObserver; import android.hardware.display.DisplayManager; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkInfo; import android.net.NetworkRequest; import android.net.NetworkScoreManager; import android.os.BatteryManager; import android.os.BatteryStats; import android.os.Environment; import android.os.Handler; Loading Loading @@ -192,21 +189,14 @@ public class AppStandbyController implements AppStandbyInternal { static final int MSG_INFORM_LISTENERS = 3; static final int MSG_FORCE_IDLE_STATE = 4; static final int MSG_CHECK_IDLE_STATES = 5; static final int MSG_CHECK_PAROLE_TIMEOUT = 6; static final int MSG_PAROLE_END_TIMEOUT = 7; static final int MSG_REPORT_CONTENT_PROVIDER_USAGE = 8; static final int MSG_PAROLE_STATE_CHANGED = 9; static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10; /** Check the state of one app: arg1 = userId, arg2 = uid, obj = (String) packageName */ static final int MSG_CHECK_PACKAGE_IDLE_STATE = 11; static final int MSG_REPORT_SYNC_SCHEDULED = 12; static final int MSG_REPORT_EXEMPTED_SYNC_START = 13; static final int MSG_UPDATE_STABLE_CHARGING= 14; long mCheckIdleIntervalMillis; long mAppIdleParoleIntervalMillis; long mAppIdleParoleWindowMillis; long mAppIdleParoleDurationMillis; long[] mAppStandbyScreenThresholds = SCREEN_TIME_THRESHOLDS; long[] mAppStandbyElapsedThresholds = ELAPSED_TIME_THRESHOLDS; /** Minimum time a strong usage event should keep the bucket elevated. */ Loading Loading @@ -244,20 +234,12 @@ public class AppStandbyController implements AppStandbyInternal { * start is the first usage of the app */ long mInitialForegroundServiceStartTimeoutMillis; /** The length of time phone must be charging before considered stable enough to run jobs */ long mStableChargingThresholdMillis; private volatile boolean mAppIdleEnabled; boolean mAppIdleTempParoled; boolean mCharging; boolean mChargingStable; private long mLastAppIdleParoledTime; private boolean mSystemServicesReady = false; // There was a system update, defaults need to be initialized after services are ready private boolean mPendingInitializeDefaults; private final DeviceStateReceiver mDeviceStateReceiver; private volatile boolean mPendingOneTimeCheckIdleStates; private final AppStandbyHandler mHandler; Loading @@ -267,7 +249,6 @@ public class AppStandbyController implements AppStandbyInternal { private AppWidgetManager mAppWidgetManager; private ConnectivityManager mConnectivityManager; private PowerManager mPowerManager; private PackageManager mPackageManager; Injector mInjector; Loading Loading @@ -329,12 +310,6 @@ public class AppStandbyController implements AppStandbyInternal { mContext = mInjector.getContext(); mHandler = new AppStandbyHandler(mInjector.getLooper()); mPackageManager = mContext.getPackageManager(); mDeviceStateReceiver = new DeviceStateReceiver(); IntentFilter deviceStates = new IntentFilter(BatteryManager.ACTION_CHARGING); deviceStates.addAction(BatteryManager.ACTION_DISCHARGING); deviceStates.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); mContext.registerReceiver(mDeviceStateReceiver, deviceStates); synchronized (mAppIdleLock) { mAppIdleHistory = new AppIdleHistory(mInjector.getDataSystemDirectory(), Loading @@ -353,15 +328,7 @@ public class AppStandbyController implements AppStandbyInternal { @VisibleForTesting void setAppIdleEnabled(boolean enabled) { synchronized (mAppIdleLock) { if (mAppIdleEnabled != enabled) { final boolean oldParoleState = isParoledOrCharging(); mAppIdleEnabled = enabled; if (isParoledOrCharging() != oldParoleState) { postParoleStateChanged(); } } } } @Override Loading @@ -381,7 +348,6 @@ public class AppStandbyController implements AppStandbyInternal { mAppWidgetManager = mContext.getSystemService(AppWidgetManager.class); mConnectivityManager = mContext.getSystemService(ConnectivityManager.class); mPowerManager = mContext.getSystemService(PowerManager.class); mInjector.registerDisplayListener(mDisplayListener, mHandler); synchronized (mAppIdleLock) { Loading @@ -402,8 +368,6 @@ public class AppStandbyController implements AppStandbyInternal { if (mPendingOneTimeCheckIdleStates) { postOneTimeCheckIdleStates(); } } else if (phase == PHASE_BOOT_COMPLETED) { setChargingState(mInjector.isCharging()); } } Loading Loading @@ -504,93 +468,6 @@ public class AppStandbyController implements AppStandbyInternal { } } @VisibleForTesting void setChargingState(boolean charging) { synchronized (mAppIdleLock) { if (mCharging != charging) { mCharging = charging; if (DEBUG) Slog.d(TAG, "Setting mCharging to " + charging); if (charging) { if (DEBUG) { Slog.d(TAG, "Scheduling MSG_UPDATE_STABLE_CHARGING delay = " + mStableChargingThresholdMillis); } mHandler.sendEmptyMessageDelayed(MSG_UPDATE_STABLE_CHARGING, mStableChargingThresholdMillis); } else { mHandler.removeMessages(MSG_UPDATE_STABLE_CHARGING); updateChargingStableState(); } } } } private void updateChargingStableState() { synchronized (mAppIdleLock) { if (mChargingStable != mCharging) { if (DEBUG) Slog.d(TAG, "Setting mChargingStable to " + mCharging); mChargingStable = mCharging; postParoleStateChanged(); } } } private void setAppIdleParoled(boolean paroled) { synchronized (mAppIdleLock) { final long now = mInjector.currentTimeMillis(); if (mAppIdleTempParoled != paroled) { mAppIdleTempParoled = paroled; if (DEBUG) Slog.d(TAG, "Changing paroled to " + mAppIdleTempParoled); if (paroled) { postParoleEndTimeout(); } else { mLastAppIdleParoledTime = now; postNextParoleTimeout(now, false); } postParoleStateChanged(); } } } @Override public boolean isParoledOrCharging() { if (!mAppIdleEnabled) return true; synchronized (mAppIdleLock) { // Only consider stable charging when determining charge state. return mAppIdleTempParoled || mChargingStable; } } private void postNextParoleTimeout(long now, boolean forced) { if (DEBUG) Slog.d(TAG, "Posting MSG_CHECK_PAROLE_TIMEOUT"); mHandler.removeMessages(MSG_CHECK_PAROLE_TIMEOUT); // Compute when the next parole needs to happen. We check more frequently than necessary // since the message handler delays are based on elapsedRealTime and not wallclock time. // The comparison is done in wallclock time. long timeLeft = (mLastAppIdleParoledTime + mAppIdleParoleIntervalMillis) - now; if (forced) { // Set next timeout for the end of the parole window // If parole is not set by the end of the window it will be forced timeLeft += mAppIdleParoleWindowMillis; } if (timeLeft < 0) { timeLeft = 0; } mHandler.sendEmptyMessageDelayed(MSG_CHECK_PAROLE_TIMEOUT, timeLeft); } private void postParoleEndTimeout() { if (DEBUG) Slog.d(TAG, "Posting MSG_PAROLE_END_TIMEOUT"); mHandler.removeMessages(MSG_PAROLE_END_TIMEOUT); mHandler.sendEmptyMessageDelayed(MSG_PAROLE_END_TIMEOUT, mAppIdleParoleDurationMillis); } private void postParoleStateChanged() { if (DEBUG) Slog.d(TAG, "Posting MSG_PAROLE_STATE_CHANGED"); mHandler.removeMessages(MSG_PAROLE_STATE_CHANGED); mHandler.sendEmptyMessage(MSG_PAROLE_STATE_CHANGED); } @Override public void postCheckIdleStates(int userId) { mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0)); Loading Loading @@ -787,48 +664,6 @@ public class AppStandbyController implements AppStandbyInternal { return THRESHOLD_BUCKETS[bucketIndex]; } private void checkParoleTimeout() { boolean setParoled = false; boolean waitForNetwork = false; NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo(); boolean networkActive = activeNetwork != null && activeNetwork.isConnected(); synchronized (mAppIdleLock) { final long now = mInjector.currentTimeMillis(); if (!mAppIdleTempParoled) { final long timeSinceLastParole = now - mLastAppIdleParoledTime; if (timeSinceLastParole > mAppIdleParoleIntervalMillis) { if (DEBUG) Slog.d(TAG, "Crossed default parole interval"); if (networkActive) { // If network is active set parole setParoled = true; } else { if (timeSinceLastParole > mAppIdleParoleIntervalMillis + mAppIdleParoleWindowMillis) { if (DEBUG) Slog.d(TAG, "Crossed end of parole window, force parole"); setParoled = true; } else { if (DEBUG) Slog.d(TAG, "Network unavailable, delaying parole"); waitForNetwork = true; postNextParoleTimeout(now, true); } } } else { if (DEBUG) Slog.d(TAG, "Not long enough to go to parole"); postNextParoleTimeout(now, false); } } } if (waitForNetwork) { mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback); } if (setParoled) { // Set parole if network is available setAppIdleParoled(true); } } private void notifyBatteryStats(String packageName, int userId, boolean idle) { try { final int uid = mPackageManager.getPackageUidAsUser(packageName, Loading @@ -844,30 +679,6 @@ public class AppStandbyController implements AppStandbyInternal { } } private void onDeviceIdleModeChanged() { final boolean deviceIdle = mPowerManager.isDeviceIdleMode(); if (DEBUG) Slog.i(TAG, "DeviceIdleMode changed to " + deviceIdle); boolean paroled = false; synchronized (mAppIdleLock) { final long timeSinceLastParole = mInjector.currentTimeMillis() - mLastAppIdleParoledTime; if (!deviceIdle && timeSinceLastParole >= mAppIdleParoleIntervalMillis) { if (DEBUG) { Slog.i(TAG, "Bringing idle apps out of inactive state due to deviceIdleMode=false"); } paroled = true; } else if (deviceIdle) { if (DEBUG) Slog.i(TAG, "Device idle, back to prison"); paroled = false; } else { return; } } setAppIdleParoled(paroled); } @Override public void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId) { if (!mAppIdleEnabled) return; Loading Loading @@ -1038,11 +849,8 @@ public class AppStandbyController implements AppStandbyInternal { } @Override public boolean isAppIdleFilteredOrParoled(String packageName, int userId, long elapsedRealtime, public boolean isAppIdleFiltered(String packageName, int userId, long elapsedRealtime, boolean shouldObfuscateInstantApps) { if (isParoledOrCharging()) { return false; } if (shouldObfuscateInstantApps && mInjector.isPackageEphemeral(userId, packageName)) { return false; Loading Loading @@ -1388,15 +1196,6 @@ public class AppStandbyController implements AppStandbyInternal { } } private void informParoleStateChanged() { final boolean paroled = isParoledOrCharging(); synchronized (mPackageAccessListeners) { for (AppIdleStateChangeListener listener : mPackageAccessListeners) { listener.onParoleStateChanged(paroled); } } } @Override public void flushToDisk(int userId) { synchronized (mAppIdleLock) { Loading Loading @@ -1517,18 +1316,6 @@ public class AppStandbyController implements AppStandbyInternal { TimeUtils.formatDuration(mCheckIdleIntervalMillis, pw); pw.println(); pw.print(" mAppIdleParoleIntervalMillis="); TimeUtils.formatDuration(mAppIdleParoleIntervalMillis, pw); pw.println(); pw.print(" mAppIdleParoleWindowMillis="); TimeUtils.formatDuration(mAppIdleParoleWindowMillis, pw); pw.println(); pw.print(" mAppIdleParoleDurationMillis="); TimeUtils.formatDuration(mAppIdleParoleDurationMillis, pw); pw.println(); pw.print(" mStrongUsageTimeoutMillis="); TimeUtils.formatDuration(mStrongUsageTimeoutMillis, pw); pw.println(); Loading Loading @@ -1566,22 +1353,11 @@ public class AppStandbyController implements AppStandbyInternal { TimeUtils.formatDuration(mSystemUpdateUsageTimeoutMillis, pw); pw.println(); pw.print(" mStableChargingThresholdMillis="); TimeUtils.formatDuration(mStableChargingThresholdMillis, pw); pw.println(); pw.println(); pw.print("mAppIdleEnabled="); pw.print(mAppIdleEnabled); pw.print(" mAppIdleTempParoled="); pw.print(mAppIdleTempParoled); pw.print(" mCharging="); pw.print(mCharging); pw.print(" mChargingStable="); pw.print(mChargingStable); pw.print(" mLastAppIdleParoledTime="); TimeUtils.formatDuration(now - mLastAppIdleParoledTime, pw); pw.println(); pw.print("mScreenThresholds="); pw.println(Arrays.toString(mAppStandbyScreenThresholds)); pw.print("mElapsedThresholds="); pw.println(Arrays.toString(mAppStandbyElapsedThresholds)); pw.print("mStableChargingThresholdMillis="); TimeUtils.formatDuration(mStableChargingThresholdMillis, pw); pw.println(); } Loading Loading @@ -1655,10 +1431,6 @@ public class AppStandbyController implements AppStandbyInternal { return buildFlag && runtimeFlag; } boolean isCharging() { return mContext.getSystemService(BatteryManager.class).isCharging(); } boolean isPowerSaveWhitelistExceptIdleApp(String packageName) throws RemoteException { return mDeviceIdleController.isPowerSaveWhitelistExceptIdleApp(packageName); } Loading Loading @@ -1748,15 +1520,6 @@ public class AppStandbyController implements AppStandbyInternal { checkIdleStates(UserHandle.USER_ALL); break; case MSG_CHECK_PAROLE_TIMEOUT: checkParoleTimeout(); break; case MSG_PAROLE_END_TIMEOUT: if (DEBUG) Slog.d(TAG, "Ending parole"); setAppIdleParoled(false); break; case MSG_REPORT_CONTENT_PROVIDER_USAGE: SomeArgs args = (SomeArgs) msg.obj; reportContentProviderUsage((String) args.arg1, // authority name Loading @@ -1765,11 +1528,6 @@ public class AppStandbyController implements AppStandbyInternal { args.recycle(); break; case MSG_PAROLE_STATE_CHANGED: if (DEBUG) Slog.d(TAG, "Parole state: " + mAppIdleTempParoled + ", Charging state:" + mChargingStable); informParoleStateChanged(); break; case MSG_CHECK_PACKAGE_IDLE_STATE: checkAndUpdateStandbyState((String) msg.obj, msg.arg1, msg.arg2, mInjector.elapsedRealtime()); Loading @@ -1788,10 +1546,6 @@ public class AppStandbyController implements AppStandbyInternal { reportExemptedSyncStart((String) msg.obj, msg.arg1); break; case MSG_UPDATE_STABLE_CHARGING: updateChargingStableState(); break; default: super.handleMessage(msg); break; Loading @@ -1800,23 +1554,6 @@ public class AppStandbyController implements AppStandbyInternal { } }; private class DeviceStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { case BatteryManager.ACTION_CHARGING: setChargingState(true); break; case BatteryManager.ACTION_DISCHARGING: setChargingState(false); break; case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: onDeviceIdleModeChanged(); break; } } } private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder().build(); private final ConnectivityManager.NetworkCallback mNetworkCallback Loading @@ -1824,7 +1561,6 @@ public class AppStandbyController implements AppStandbyInternal { @Override public void onAvailable(Network network) { mConnectivityManager.unregisterNetworkCallback(this); checkParoleTimeout(); } }; Loading @@ -1851,9 +1587,6 @@ public class AppStandbyController implements AppStandbyInternal { * Observe settings changes for {@link Global#APP_IDLE_CONSTANTS}. */ private class SettingsObserver extends ContentObserver { private static final String KEY_PAROLE_INTERVAL = "parole_interval"; private static final String KEY_PAROLE_WINDOW = "parole_window"; private static final String KEY_PAROLE_DURATION = "parole_duration"; private static final String KEY_SCREEN_TIME_THRESHOLDS = "screen_thresholds"; private static final String KEY_ELAPSED_TIME_THRESHOLDS = "elapsed_thresholds"; private static final String KEY_STRONG_USAGE_HOLD_DURATION = "strong_usage_duration"; Loading @@ -1875,7 +1608,6 @@ public class AppStandbyController implements AppStandbyInternal { "system_interaction_duration"; private static final String KEY_INITIAL_FOREGROUND_SERVICE_START_HOLD_DURATION = "initial_foreground_service_start_duration"; private static final String KEY_STABLE_CHARGING_THRESHOLD = "stable_charging_threshold"; public static final long DEFAULT_STRONG_USAGE_TIMEOUT = 1 * ONE_HOUR; public static final long DEFAULT_NOTIFICATION_TIMEOUT = 12 * ONE_HOUR; public static final long DEFAULT_SYSTEM_UPDATE_TIMEOUT = 2 * ONE_HOUR; Loading @@ -1885,7 +1617,6 @@ public class AppStandbyController implements AppStandbyInternal { public static final long DEFAULT_EXEMPTED_SYNC_SCHEDULED_DOZE_TIMEOUT = 4 * ONE_HOUR; public static final long DEFAULT_EXEMPTED_SYNC_START_TIMEOUT = 10 * ONE_MINUTE; public static final long DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT = 10 * ONE_MINUTE; public static final long DEFAULT_STABLE_CHARGING_THRESHOLD = 10 * ONE_MINUTE; public static final long DEFAULT_INITIAL_FOREGROUND_SERVICE_START_TIMEOUT = 30 * ONE_MINUTE; private final KeyValueListParser mParser = new KeyValueListParser(','); Loading Loading @@ -1932,17 +1663,6 @@ public class AppStandbyController implements AppStandbyInternal { synchronized (mAppIdleLock) { // Default: 24 hours between paroles mAppIdleParoleIntervalMillis = mParser.getDurationMillis(KEY_PAROLE_INTERVAL, COMPRESS_TIME ? ONE_MINUTE * 10 : 24 * 60 * ONE_MINUTE); // Default: 2 hours to wait on network mAppIdleParoleWindowMillis = mParser.getDurationMillis(KEY_PAROLE_WINDOW, COMPRESS_TIME ? ONE_MINUTE * 2 : 2 * 60 * ONE_MINUTE); mAppIdleParoleDurationMillis = mParser.getDurationMillis(KEY_PAROLE_DURATION, COMPRESS_TIME ? ONE_MINUTE : 10 * ONE_MINUTE); // 10 minutes String screenThresholdsValue = mParser.getString(KEY_SCREEN_TIME_THRESHOLDS, null); mAppStandbyScreenThresholds = parseLongArray(screenThresholdsValue, SCREEN_TIME_THRESHOLDS); Loading Loading @@ -1997,10 +1717,6 @@ public class AppStandbyController implements AppStandbyInternal { KEY_INITIAL_FOREGROUND_SERVICE_START_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_INITIAL_FOREGROUND_SERVICE_START_TIMEOUT); mStableChargingThresholdMillis = mParser.getDurationMillis( KEY_STABLE_CHARGING_THRESHOLD, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STABLE_CHARGING_THRESHOLD); } // Check if app_idle_enabled has changed. Do this after getting the rest of the settings Loading