Loading apex/jobscheduler/service/aconfig/job.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -119,3 +119,13 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "update_media_backup_exemption_policy" namespace: "backstage_power" description: "Update the criteria for media backup job exemption" bug: "436531976" metadata { purpose: PURPOSE_BUGFIX } } apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +3 −0 Original line number Diff line number Diff line Loading @@ -5979,6 +5979,9 @@ public class JobSchedulerService extends com.android.server.SystemService pw.print(Flags.FLAG_DO_NOT_FORCE_RUSH_EXECUTION_AT_BOOT, Flags.doNotForceRushExecutionAtBoot()); pw.println(); pw.print(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY, Flags.updateMediaBackupExemptionPolicy()); pw.println(); pw.print(android.app.job.Flags.FLAG_GET_PENDING_JOB_REASONS_API, android.app.job.Flags.getPendingJobReasonsApi()); pw.println(); Loading apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +16 −6 Original line number Diff line number Diff line Loading @@ -1429,12 +1429,7 @@ public final class JobStatus { if (mJobSchedulerInternal == null) { mJobSchedulerInternal = LocalServices.getService(JobSchedulerInternal.class); } boolean hasMediaExemption = mHasExemptedMediaUrisOnly && !job.hasLateConstraint() && job.getRequiredNetwork() != null && getEffectivePriority() >= JobInfo.PRIORITY_DEFAULT && sourcePackageName.equals( mJobSchedulerInternal.getCloudMediaProviderPackage(sourceUserId)); final boolean hasMediaExemption = hasMediaBackupExemption(); if (mHasMediaBackupExemption == hasMediaExemption) { return false; } Loading Loading @@ -2571,6 +2566,21 @@ public final class JobStatus { return (sat & mRequiredConstraintsOfInterest) == mRequiredConstraintsOfInterest; } private boolean hasMediaBackupExemption() { if (Flags.updateMediaBackupExemptionPolicy()) { return getEffectivePriority() == JobInfo.PRIORITY_HIGH && sourcePackageName.equals( mJobSchedulerInternal.getCloudMediaProviderPackage(sourceUserId)); } else { return mHasExemptedMediaUrisOnly && !job.hasLateConstraint() && job.getRequiredNetwork() != null && getEffectivePriority() >= JobInfo.PRIORITY_DEFAULT && sourcePackageName.equals( mJobSchedulerInternal.getCloudMediaProviderPackage(sourceUserId)); } } /** * Returns true if the given parameters match this job's unique identifier. */ Loading services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +90 −4 Original line number Diff line number Diff line Loading @@ -376,6 +376,7 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_lateConstraint() { final JobInfo triggerContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -387,6 +388,7 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_noConnectivityConstraint() { final JobInfo triggerContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -396,6 +398,7 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_noContentTriggerConstraint() { final JobInfo networkJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) Loading @@ -405,7 +408,8 @@ public class JobStatusTest { } @Test public void testMediaBackupExemption_wrongSourcePackage() { @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_wrongSourcePackage_policyUpdateDisabled() { final JobInfo networkContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) Loading @@ -416,6 +420,18 @@ public class JobStatusTest { } @Test @EnableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_wrongSourcePackage() { final JobInfo networkContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setPriority(JobInfo.PRIORITY_HIGH) .build(); when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))) .thenReturn("not.test.package"); assertEffectiveBucketForMediaExemption(createJobStatus(networkContentJob), false); } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_nonEligibleUri() { final Uri nonEligibleUri = MediaStore.AUTHORITY_URI.buildUpon() .appendPath("any_path").build(); Loading @@ -429,8 +445,10 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_lowPriorityJobs() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))) .thenReturn(TEST_PACKAGE); final JobInfo.Builder jobBuilder = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); Loading @@ -440,9 +458,54 @@ public class JobStatusTest { createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_MIN).build()), false); } @Test @DisableFlags(Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET) @EnableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_priority_restrictedBucketDisabled_policyUpdateEnabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo.Builder jobBuilder = new JobInfo.Builder(42, TEST_JOB_COMPONENT); // DEFAULT job priority. assertEffectiveBucketForMediaExemption(createJobStatus(jobBuilder.build()), false, false); // LOW priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_LOW).build()), false, false); // MIN priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_MIN).build()), false, false); // HIGH priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_HIGH).build()), true, false); } @Test @EnableFlags({Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET, Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY}) public void testMediaBackupExemption_priority() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))) .thenReturn(TEST_PACKAGE); final JobInfo.Builder jobBuilder = new JobInfo.Builder(42, TEST_JOB_COMPONENT); // DEFAULT job priority. assertEffectiveBucketForMediaExemption(createJobStatus(jobBuilder.build()), false); // LOW priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_LOW).build()), false); // MIN priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_MIN).build()), false); // HIGH priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_HIGH).build()), true); } @DisableFlags({Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET, Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY}) @Test public void testMediaBackupExemptionGranted_flagDisabled() { public void testMediaBackupExemptionGranted_restrictedBucketDisabled_policyUpdateDisabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo imageUriJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -464,9 +527,21 @@ public class JobStatusTest { assertEffectiveBucketForMediaExemption(createJobStatus(bothUriJob), true, false); } @Test @DisableFlags(Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET) @EnableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemptionGranted_restrictedBucketDisabled_policyUpdateEnabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo job = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setPriority(JobInfo.PRIORITY_HIGH) .build(); assertEffectiveBucketForMediaExemption(createJobStatus(job), true, false); } @EnableFlags(Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET) @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) @Test public void testMediaBackupExemptionGranted() { public void testMediaBackupExemptionGranted_restrictedBucketEnabled_policyUpdateDisabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo imageUriJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -488,6 +563,17 @@ public class JobStatusTest { assertEffectiveBucketForMediaExemption(createJobStatus(bothUriJob), true); } @Test @EnableFlags({Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET, Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY}) public void testMediaBackupExemptionGranted_policyUpdateEnabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo job = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setPriority(JobInfo.PRIORITY_HIGH) .build(); assertEffectiveBucketForMediaExemption(createJobStatus(job), true); } @Test public void testFraction() throws Exception { final long now = sElapsedRealtimeClock.millis(); Loading Loading
apex/jobscheduler/service/aconfig/job.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -119,3 +119,13 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "update_media_backup_exemption_policy" namespace: "backstage_power" description: "Update the criteria for media backup job exemption" bug: "436531976" metadata { purpose: PURPOSE_BUGFIX } }
apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +3 −0 Original line number Diff line number Diff line Loading @@ -5979,6 +5979,9 @@ public class JobSchedulerService extends com.android.server.SystemService pw.print(Flags.FLAG_DO_NOT_FORCE_RUSH_EXECUTION_AT_BOOT, Flags.doNotForceRushExecutionAtBoot()); pw.println(); pw.print(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY, Flags.updateMediaBackupExemptionPolicy()); pw.println(); pw.print(android.app.job.Flags.FLAG_GET_PENDING_JOB_REASONS_API, android.app.job.Flags.getPendingJobReasonsApi()); pw.println(); Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +16 −6 Original line number Diff line number Diff line Loading @@ -1429,12 +1429,7 @@ public final class JobStatus { if (mJobSchedulerInternal == null) { mJobSchedulerInternal = LocalServices.getService(JobSchedulerInternal.class); } boolean hasMediaExemption = mHasExemptedMediaUrisOnly && !job.hasLateConstraint() && job.getRequiredNetwork() != null && getEffectivePriority() >= JobInfo.PRIORITY_DEFAULT && sourcePackageName.equals( mJobSchedulerInternal.getCloudMediaProviderPackage(sourceUserId)); final boolean hasMediaExemption = hasMediaBackupExemption(); if (mHasMediaBackupExemption == hasMediaExemption) { return false; } Loading Loading @@ -2571,6 +2566,21 @@ public final class JobStatus { return (sat & mRequiredConstraintsOfInterest) == mRequiredConstraintsOfInterest; } private boolean hasMediaBackupExemption() { if (Flags.updateMediaBackupExemptionPolicy()) { return getEffectivePriority() == JobInfo.PRIORITY_HIGH && sourcePackageName.equals( mJobSchedulerInternal.getCloudMediaProviderPackage(sourceUserId)); } else { return mHasExemptedMediaUrisOnly && !job.hasLateConstraint() && job.getRequiredNetwork() != null && getEffectivePriority() >= JobInfo.PRIORITY_DEFAULT && sourcePackageName.equals( mJobSchedulerInternal.getCloudMediaProviderPackage(sourceUserId)); } } /** * Returns true if the given parameters match this job's unique identifier. */ Loading
services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +90 −4 Original line number Diff line number Diff line Loading @@ -376,6 +376,7 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_lateConstraint() { final JobInfo triggerContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -387,6 +388,7 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_noConnectivityConstraint() { final JobInfo triggerContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -396,6 +398,7 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_noContentTriggerConstraint() { final JobInfo networkJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) Loading @@ -405,7 +408,8 @@ public class JobStatusTest { } @Test public void testMediaBackupExemption_wrongSourcePackage() { @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_wrongSourcePackage_policyUpdateDisabled() { final JobInfo networkContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) Loading @@ -416,6 +420,18 @@ public class JobStatusTest { } @Test @EnableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_wrongSourcePackage() { final JobInfo networkContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setPriority(JobInfo.PRIORITY_HIGH) .build(); when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))) .thenReturn("not.test.package"); assertEffectiveBucketForMediaExemption(createJobStatus(networkContentJob), false); } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_nonEligibleUri() { final Uri nonEligibleUri = MediaStore.AUTHORITY_URI.buildUpon() .appendPath("any_path").build(); Loading @@ -429,8 +445,10 @@ public class JobStatusTest { } @Test @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_lowPriorityJobs() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))) .thenReturn(TEST_PACKAGE); final JobInfo.Builder jobBuilder = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); Loading @@ -440,9 +458,54 @@ public class JobStatusTest { createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_MIN).build()), false); } @Test @DisableFlags(Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET) @EnableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemption_priority_restrictedBucketDisabled_policyUpdateEnabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo.Builder jobBuilder = new JobInfo.Builder(42, TEST_JOB_COMPONENT); // DEFAULT job priority. assertEffectiveBucketForMediaExemption(createJobStatus(jobBuilder.build()), false, false); // LOW priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_LOW).build()), false, false); // MIN priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_MIN).build()), false, false); // HIGH priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_HIGH).build()), true, false); } @Test @EnableFlags({Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET, Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY}) public void testMediaBackupExemption_priority() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))) .thenReturn(TEST_PACKAGE); final JobInfo.Builder jobBuilder = new JobInfo.Builder(42, TEST_JOB_COMPONENT); // DEFAULT job priority. assertEffectiveBucketForMediaExemption(createJobStatus(jobBuilder.build()), false); // LOW priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_LOW).build()), false); // MIN priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_MIN).build()), false); // HIGH priority. assertEffectiveBucketForMediaExemption( createJobStatus(jobBuilder.setPriority(JobInfo.PRIORITY_HIGH).build()), true); } @DisableFlags({Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET, Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY}) @Test public void testMediaBackupExemptionGranted_flagDisabled() { public void testMediaBackupExemptionGranted_restrictedBucketDisabled_policyUpdateDisabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo imageUriJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -464,9 +527,21 @@ public class JobStatusTest { assertEffectiveBucketForMediaExemption(createJobStatus(bothUriJob), true, false); } @Test @DisableFlags(Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET) @EnableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) public void testMediaBackupExemptionGranted_restrictedBucketDisabled_policyUpdateEnabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo job = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setPriority(JobInfo.PRIORITY_HIGH) .build(); assertEffectiveBucketForMediaExemption(createJobStatus(job), true, false); } @EnableFlags(Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET) @DisableFlags(Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY) @Test public void testMediaBackupExemptionGranted() { public void testMediaBackupExemptionGranted_restrictedBucketEnabled_policyUpdateDisabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo imageUriJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0)) Loading @@ -488,6 +563,17 @@ public class JobStatusTest { assertEffectiveBucketForMediaExemption(createJobStatus(bothUriJob), true); } @Test @EnableFlags({Flags.FLAG_ALLOW_CMP_EXEMPTION_FOR_RESTRICTED_BUCKET, Flags.FLAG_UPDATE_MEDIA_BACKUP_EXEMPTION_POLICY}) public void testMediaBackupExemptionGranted_policyUpdateEnabled() { when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE); final JobInfo job = new JobInfo.Builder(42, TEST_JOB_COMPONENT) .setPriority(JobInfo.PRIORITY_HIGH) .build(); assertEffectiveBucketForMediaExemption(createJobStatus(job), true); } @Test public void testFraction() throws Exception { final long now = sElapsedRealtimeClock.millis(); Loading