Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97d79b13 authored by Xin Guan's avatar Xin Guan Committed by Android (Google) Code Review
Browse files

Merge "JobScheduler: Update the media backup exemption policy." into main

parents a421cb58 d4a10cda
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -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();
+16 −6
Original line number Diff line number Diff line
@@ -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;
        }
@@ -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.
     */
+90 −4
Original line number Diff line number Diff line
@@ -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))
@@ -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))
@@ -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)
@@ -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)
@@ -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();
@@ -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);
@@ -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))
@@ -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))
@@ -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();