diff options
| author | 2022-08-25 04:28:13 +0000 | |
|---|---|---|
| committer | 2022-08-25 04:28:13 +0000 | |
| commit | 6fd743bd4759aba68eea32cb53769ce82d83429a (patch) | |
| tree | ff116fcfb741a1e4145d53c569173e4904e8f6bc | |
| parent | ab9b482ec4ffea1c00c5c9bad0a8ea1b821aba41 (diff) | |
| parent | 8901fa1779fae8ee32b40cfe68f98e1f03dff332 (diff) | |
Merge "Disable Flexibility Controller for Android Auto"
4 files changed, 72 insertions, 20 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java index 4f449f0e551a..9d364782a57f 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java @@ -32,6 +32,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.job.JobInfo; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Looper; import android.os.UserHandle; import android.provider.DeviceConfig; @@ -81,18 +82,6 @@ public final class FlexibilityController extends StateController { private static final long NO_LIFECYCLE_END = Long.MAX_VALUE; /** - * Keeps track of what flexible constraints are satisfied at the moment. - * Is updated by the other controllers. - */ - @VisibleForTesting - @GuardedBy("mLock") - int mSatisfiedFlexibleConstraints; - - /** Hard cutoff to remove flexible constraints. */ - private long mDeadlineProximityLimitMs = - FcConfig.DEFAULT_DEADLINE_PROXIMITY_LIMIT_MS; - - /** * The default deadline that all flexible constraints should be dropped by if a job lacks * a deadline. */ @@ -109,6 +98,10 @@ public final class FlexibilityController extends StateController { private long mMinTimeBetweenFlexibilityAlarmsMs = FcConfig.DEFAULT_MIN_TIME_BETWEEN_FLEXIBILITY_ALARMS_MS; + /** Hard cutoff to remove flexible constraints. */ + private long mDeadlineProximityLimitMs = + FcConfig.DEFAULT_DEADLINE_PROXIMITY_LIMIT_MS; + /** * The percent of a job's lifecycle to drop number of required constraints. * mPercentToDropConstraints[i] denotes that at x% of a Jobs lifecycle, @@ -117,6 +110,17 @@ public final class FlexibilityController extends StateController { private int[] mPercentToDropConstraints; @VisibleForTesting + boolean mDeviceSupportsFlexConstraints; + + /** + * Keeps track of what flexible constraints are satisfied at the moment. + * Is updated by the other controllers. + */ + @VisibleForTesting + @GuardedBy("mLock") + int mSatisfiedFlexibleConstraints; + + @VisibleForTesting @GuardedBy("mLock") final FlexibilityTracker mFlexibilityTracker; @VisibleForTesting @@ -124,7 +128,6 @@ public final class FlexibilityController extends StateController { final FlexibilityAlarmQueue mFlexibilityAlarmQueue; @VisibleForTesting final FcConfig mFcConfig; - @VisibleForTesting final PrefetchController mPrefetchController; @@ -172,6 +175,9 @@ public final class FlexibilityController extends StateController { public FlexibilityController( JobSchedulerService service, PrefetchController prefetchController) { super(service); + mDeviceSupportsFlexConstraints = !mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE); + mFlexibilityEnabled &= mDeviceSupportsFlexConstraints; mFlexibilityTracker = new FlexibilityTracker(NUM_FLEXIBLE_CONSTRAINTS); mFcConfig = new FcConfig(); mFlexibilityAlarmQueue = new FlexibilityAlarmQueue( @@ -191,10 +197,14 @@ public final class FlexibilityController extends StateController { @GuardedBy("mLock") public void maybeStartTrackingJobLocked(JobStatus js, JobStatus lastJob) { if (js.hasFlexibilityConstraint()) { - mFlexibilityTracker.add(js); - js.setTrackingController(JobStatus.TRACKING_FLEXIBILITY); final long nowElapsed = sElapsedRealtimeClock.millis(); + if (!mDeviceSupportsFlexConstraints) { + js.setFlexibilityConstraintSatisfied(nowElapsed, true); + return; + } js.setFlexibilityConstraintSatisfied(nowElapsed, isFlexibilitySatisfiedLocked(js)); + mFlexibilityTracker.add(js); + js.setTrackingController(JobStatus.TRACKING_FLEXIBILITY); mFlexibilityAlarmQueue.scheduleDropNumConstraintsAlarm(js, nowElapsed); } } @@ -655,7 +665,8 @@ public final class FlexibilityController extends StateController { @NonNull String key) { switch (key) { case KEY_FLEXIBILITY_ENABLED: - FLEXIBILITY_ENABLED = properties.getBoolean(key, DEFAULT_FLEXIBILITY_ENABLED); + FLEXIBILITY_ENABLED = properties.getBoolean(key, DEFAULT_FLEXIBILITY_ENABLED) + && mDeviceSupportsFlexConstraints; if (mFlexibilityEnabled != FLEXIBILITY_ENABLED) { mFlexibilityEnabled = FLEXIBILITY_ENABLED; mShouldReevaluateConstraints = true; diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java index 4a631a1251d5..59cb43f16ef6 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java @@ -33,6 +33,7 @@ import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.BatteryManagerInternal; import android.os.RemoteException; @@ -75,6 +76,8 @@ public class BatteryControllerTest { private JobSchedulerService mJobSchedulerService; @Mock private PackageManagerInternal mPackageManagerInternal; + @Mock + private PackageManager mPackageManager; @Before public void setUp() { @@ -100,6 +103,9 @@ public class BatteryControllerTest { ArgumentCaptor<BroadcastReceiver> receiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.hasSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE)).thenReturn(false); mFlexibilityController = new FlexibilityController(mJobSchedulerService, mock(PrefetchController.class)); mBatteryController = new BatteryController(mJobSchedulerService, mFlexibilityController); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java index 953a72d5085c..1f85f2c2c46e 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java @@ -51,6 +51,7 @@ import android.annotation.Nullable; import android.app.job.JobInfo; import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; @@ -96,6 +97,8 @@ public class ConnectivityControllerTest { private NetworkPolicyManagerInternal mNetPolicyManagerInternal; @Mock private JobSchedulerService mService; + @Mock + private PackageManager mPackageManager; private Constants mConstants; @@ -115,10 +118,6 @@ public class ConnectivityControllerTest { LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); LocalServices.addService(NetworkPolicyManagerInternal.class, mNetPolicyManagerInternal); - when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); - mFlexibilityController = - new FlexibilityController(mService, mock(PrefetchController.class)); - // Freeze the clocks at this moment in time JobSchedulerService.sSystemClock = Clock.fixed(Clock.systemUTC().instant(), ZoneOffset.UTC); @@ -142,6 +141,13 @@ public class ConnectivityControllerTest { when(mService.getTestableContext()).thenReturn(mContext); when(mService.getLock()).thenReturn(mService); when(mService.getConstants()).thenReturn(mConstants); + // Instantiate Flexibility Controller + when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.hasSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE)).thenReturn(false); + mFlexibilityController = + new FlexibilityController(mService, mock(PrefetchController.class)); } @Test diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java index 711acb7c2e1b..0eb0a002fe6e 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java @@ -50,6 +50,7 @@ import android.app.AlarmManager; import android.app.job.JobInfo; import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Looper; import android.provider.DeviceConfig; @@ -92,6 +93,8 @@ public class FlexibilityControllerTest { private JobSchedulerService mJobSchedulerService; @Mock private PrefetchController mPrefetchController; + @Mock + private PackageManager mPackageManager; @Before public void setup() { @@ -109,6 +112,9 @@ public class FlexibilityControllerTest { // Called in FlexibilityController constructor. when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); when(mContext.getSystemService(Context.ALARM_SERVICE)).thenReturn(mAlarmManager); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.hasSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE)).thenReturn(false); // Used in FlexibilityController.FcConstants. doAnswer((Answer<Void>) invocationOnMock -> null) .when(() -> DeviceConfig.addOnPropertiesChangedListener( @@ -859,6 +865,29 @@ public class FlexibilityControllerTest { } + @Test + public void testDeviceDisabledFlexibility_Auto() { + when(mPackageManager.hasSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE)).thenReturn(true); + mFlexibilityController = + new FlexibilityController(mJobSchedulerService, mPrefetchController); + assertFalse(mFlexibilityController.mFlexibilityEnabled); + + JobStatus js = createJobStatus("testIsAuto", createJob(0)); + + mFlexibilityController.maybeStartTrackingJobLocked(js, null); + assertTrue(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE)); + + setDeviceConfigBoolean(KEY_FLEXIBILITY_ENABLED, true); + assertFalse(mFlexibilityController.mFlexibilityEnabled); + + ArrayList<ArraySet<JobStatus>> jobs = + mFlexibilityController.mFlexibilityTracker.getArrayList(); + for (int i = 0; i < jobs.size(); i++) { + assertEquals(0, jobs.get(i).size()); + } + } + private void setUidBias(int uid, int bias) { int prevBias = mJobSchedulerService.getUidBias(uid); doReturn(bias).when(mJobSchedulerService).getUidBias(uid); |