OSDN Git Service

Treat named standby states as ceilings of behavioral categories
authorChristopher Tate <ctate@google.com>
Tue, 27 Mar 2018 23:04:14 +0000 (16:04 -0700)
committerChris Tate <ctate@android.com>
Mon, 16 Apr 2018 19:45:54 +0000 (19:45 +0000)
For purposes of alarm dispatch & job execution, intermediate standby
states are now treated as the ceilings of the range associated with each
bucket, rather than as the floor.  So, for example, a value that is
between STANDBY_BUCKET_WORKING_SET and STANDBY_BUCKET_ACTIVE is now
treated as equivalent to STANDBY_BUCKET_WORKING_SET.

Bug: 77154340
Test: atest CtsJobSchedulerTestCases
Change-Id: I84d010863eecaac011dd117205980254487bfa64

services/core/java/com/android/server/AlarmManagerService.java
services/core/java/com/android/server/job/JobSchedulerService.java

index 85eeba0..5c5f0f8 100644 (file)
@@ -141,6 +141,13 @@ class AlarmManagerService extends SystemService {
     static final int ALARM_EVENT = 1;
     static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
 
+    // Indices into the APP_STANDBY_MIN_DELAYS and KEYS_APP_STANDBY_DELAY arrays
+    static final int ACTIVE_INDEX = 0;
+    static final int WORKING_INDEX = 1;
+    static final int FREQUENT_INDEX = 2;
+    static final int RARE_INDEX = 3;
+    static final int NEVER_INDEX = 4;
+
     private final Intent mBackgroundIntent
             = new Intent().addFlags(Intent.FLAG_FROM_BACKGROUND);
     static final IncreasingTimeOrder sIncreasingTimeOrder = new IncreasingTimeOrder();
@@ -381,9 +388,10 @@ class AlarmManagerService extends SystemService {
                         DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION);
                 LISTENER_TIMEOUT = mParser.getLong(KEY_LISTENER_TIMEOUT,
                         DEFAULT_LISTENER_TIMEOUT);
-                APP_STANDBY_MIN_DELAYS[0] = mParser.getDurationMillis(KEYS_APP_STANDBY_DELAY[0],
-                        DEFAULT_APP_STANDBY_DELAYS[0]);
-                for (int i = 1; i < KEYS_APP_STANDBY_DELAY.length; i++) {
+                APP_STANDBY_MIN_DELAYS[ACTIVE_INDEX] = mParser.getDurationMillis(
+                        KEYS_APP_STANDBY_DELAY[ACTIVE_INDEX],
+                        DEFAULT_APP_STANDBY_DELAYS[ACTIVE_INDEX]);
+                for (int i = WORKING_INDEX; i < KEYS_APP_STANDBY_DELAY.length; i++) {
                     APP_STANDBY_MIN_DELAYS[i] = mParser.getDurationMillis(KEYS_APP_STANDBY_DELAY[i],
                             Math.max(APP_STANDBY_MIN_DELAYS[i-1], DEFAULT_APP_STANDBY_DELAYS[i]));
                 }
@@ -1526,22 +1534,24 @@ class AlarmManagerService extends SystemService {
         setImplLocked(a, false, doValidate);
     }
 
+    /**
+     * Return the minimum time that should elapse before an app in the specified bucket
+     * can receive alarms again
+     */
     private long getMinDelayForBucketLocked(int bucket) {
-        // Return the minimum time that should elapse before an app in the specified bucket
-        // can receive alarms again
-        if (bucket == UsageStatsManager.STANDBY_BUCKET_NEVER) {
-            return mConstants.APP_STANDBY_MIN_DELAYS[4];
-        }
-        else if (bucket >= UsageStatsManager.STANDBY_BUCKET_RARE) {
-            return mConstants.APP_STANDBY_MIN_DELAYS[3];
-        }
-        else if (bucket >= UsageStatsManager.STANDBY_BUCKET_FREQUENT) {
-            return mConstants.APP_STANDBY_MIN_DELAYS[2];
-        }
-        else if (bucket >= UsageStatsManager.STANDBY_BUCKET_WORKING_SET) {
-            return mConstants.APP_STANDBY_MIN_DELAYS[1];
-        }
-        else return mConstants.APP_STANDBY_MIN_DELAYS[0];
+        // UsageStats bucket values are treated as floors of their behavioral range.
+        // In other words, a bucket value between WORKING and ACTIVE is treated as
+        // WORKING, not as ACTIVE.  The ACTIVE and NEVER bucket apply only at specific
+        // values.
+        final int index;
+
+        if (bucket == UsageStatsManager.STANDBY_BUCKET_NEVER) index = NEVER_INDEX;
+        else if (bucket > UsageStatsManager.STANDBY_BUCKET_FREQUENT) index = RARE_INDEX;
+        else if (bucket > UsageStatsManager.STANDBY_BUCKET_WORKING_SET) index = FREQUENT_INDEX;
+        else if (bucket > UsageStatsManager.STANDBY_BUCKET_ACTIVE) index = WORKING_INDEX;
+        else index = ACTIVE_INDEX;
+
+        return mConstants.APP_STANDBY_MIN_DELAYS[index];
     }
 
     /**
index 736aa46..0135085 100644 (file)
@@ -248,6 +248,7 @@ public class JobSchedulerService extends com.android.server.SystemService
     static final int WORKING_INDEX = 1;
     static final int FREQUENT_INDEX = 2;
     static final int RARE_INDEX = 3;
+    static final int NEVER_INDEX = 4;
 
     /**
      * Bookkeeping about when jobs last run.  We keep our own record in heartbeat time,
@@ -2432,11 +2433,11 @@ public class JobSchedulerService extends com.android.server.SystemService
 
     public static int standbyBucketToBucketIndex(int bucket) {
         // Normalize AppStandby constants to indices into our bookkeeping
-        if (bucket == UsageStatsManager.STANDBY_BUCKET_NEVER) return 4;
-        else if (bucket >= UsageStatsManager.STANDBY_BUCKET_RARE) return 3;
-        else if (bucket >= UsageStatsManager.STANDBY_BUCKET_FREQUENT) return 2;
-        else if (bucket >= UsageStatsManager.STANDBY_BUCKET_WORKING_SET) return 1;
-        else return 0;
+        if (bucket == UsageStatsManager.STANDBY_BUCKET_NEVER) return NEVER_INDEX;
+        else if (bucket > UsageStatsManager.STANDBY_BUCKET_FREQUENT) return RARE_INDEX;
+        else if (bucket > UsageStatsManager.STANDBY_BUCKET_WORKING_SET) return FREQUENT_INDEX;
+        else if (bucket > UsageStatsManager.STANDBY_BUCKET_ACTIVE) return WORKING_INDEX;
+        else return ACTIVE_INDEX;
     }
 
     // Static to support external callers