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

Commit 60a827fa authored by Kweku Adams's avatar Kweku Adams Committed by Android (Google) Code Review
Browse files

Merge "Reject inconsistent Job-JobWorkItem scheduling."

parents 798db0ab bc72f48f
Loading
Loading
Loading
Loading
+39 −5
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ import android.app.job.JobSnapshot;
import android.app.job.JobWorkItem;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -58,6 +60,7 @@ import android.os.BatteryManager;
import android.os.BatteryManagerInternal;
import android.os.BatteryStatsInternal;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.LimitExceededException;
import android.os.Looper;
@@ -166,6 +169,14 @@ public class JobSchedulerService extends com.android.server.SystemService
    /** The number of the most recently completed jobs to keep track of for debugging purposes. */
    private static final int NUM_COMPLETED_JOB_HISTORY = 20;

    /**
     * Require the hosting job to specify a network constraint if the included
     * {@link android.app.job.JobWorkItem} indicates network usage.
     */
    @ChangeId
    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
    private static final long REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS = 241104082L;

    @VisibleForTesting
    public static Clock sSystemClock = Clock.systemUTC();

@@ -3147,7 +3158,11 @@ public class JobSchedulerService extends com.android.server.SystemService
            return canPersist;
        }

        private void validateJobFlags(JobInfo job, int callingUid) {
        private void validateJob(JobInfo job, int callingUid) {
            validateJob(job, callingUid, null);
        }

        private void validateJob(JobInfo job, int callingUid, @Nullable JobWorkItem jobWorkItem) {
            job.enforceValidity(
                    CompatChanges.isChangeEnabled(
                            JobInfo.DISALLOW_DEADLINES_FOR_PREFETCH_JOBS, callingUid));
@@ -3164,6 +3179,26 @@ public class JobSchedulerService extends com.android.server.SystemService
                            + " FLAG_EXEMPT_FROM_APP_STANDBY. Job=" + job);
                }
            }
            if (jobWorkItem != null) {
                jobWorkItem.enforceValidity();
                if (jobWorkItem.getEstimatedNetworkDownloadBytes() != JobInfo.NETWORK_BYTES_UNKNOWN
                        || jobWorkItem.getEstimatedNetworkUploadBytes()
                        != JobInfo.NETWORK_BYTES_UNKNOWN
                        || jobWorkItem.getMinimumNetworkChunkBytes()
                        != JobInfo.NETWORK_BYTES_UNKNOWN) {
                    if (job.getRequiredNetwork() == null) {
                        final String errorMsg = "JobWorkItem implies network usage"
                                + " but job doesn't specify a network constraint";
                        if (CompatChanges.isChangeEnabled(
                                REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS,
                                callingUid)) {
                            throw new IllegalArgumentException(errorMsg);
                        } else {
                            Slog.e(TAG, errorMsg);
                        }
                    }
                }
            }
        }

        // IJobScheduler implementation
@@ -3184,7 +3219,7 @@ public class JobSchedulerService extends com.android.server.SystemService
                }
            }

            validateJobFlags(job, uid);
            validateJob(job, uid);

            final long ident = Binder.clearCallingIdentity();
            try {
@@ -3212,8 +3247,7 @@ public class JobSchedulerService extends com.android.server.SystemService
                throw new NullPointerException("work is null");
            }

            work.enforceValidity();
            validateJobFlags(job, uid);
            validateJob(job, uid, work);

            final long ident = Binder.clearCallingIdentity();
            try {
@@ -3244,7 +3278,7 @@ public class JobSchedulerService extends com.android.server.SystemService
                        + " not permitted to schedule jobs for other apps");
            }

            validateJobFlags(job, callerUid);
            validateJob(job, callerUid);

            final long ident = Binder.clearCallingIdentity();
            try {