From 686d8289896ab312776436e4b7e0e05c89e10993 Mon Sep 17 00:00:00 2001 From: Chiachang Wang Date: Mon, 22 Mar 2021 20:06:27 +0800 Subject: [PATCH] Remove the hidden NetworkRequest usage Constructor of JobStatus may update the network request in the JobInfo parameter. NetworkRequest is moving into the incoming connectivity module. The hidden methods and members usage will not allowed anymore, so it requires to rebuild the network request for any update in the network request. Expose a new Builder constructor as a helper method to construct from an existing JobInfo instance which will helpful for such cases that need to clone the JobInfo and update only specific items. Also, JobStatus which is inside the platform could not refer to the hidden members or methods of classes in the connectivity mainline module. Callers who want to construct a network request should use the formal NetworkRequest.Builder. Update the usage accordingly to resolve the hidden usage. Bug: 172183305 Test: atest JobInfoTest Test: atest com.android.server.job.controllers.JobStatusTest Change-Id: Ifb74d44e29e13f0e3b995be638c5bfe435a09106 Merged-In: Ifb74d44e29e13f0e3b995be638c5bfe435a09106 --- .../java/android/app/job/JobInfo.java | 35 +++++++++++++++++++ .../server/job/controllers/JobStatus.java | 12 ++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java index 24b8055b9a571..a3fa8ac9958c7 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java @@ -1006,6 +1006,41 @@ public class JobInfo implements Parcelable { mJobId = jobId; } + /** + * Creates a new Builder of JobInfo from an existing instance. + * @hide + */ + public Builder(@NonNull JobInfo job) { + mJobId = job.getId(); + mJobService = job.getService(); + mExtras = job.getExtras(); + mTransientExtras = job.getTransientExtras(); + mClipData = job.getClipData(); + mClipGrantFlags = job.getClipGrantFlags(); + mPriority = job.getPriority(); + mFlags = job.getFlags(); + mConstraintFlags = job.getConstraintFlags(); + mNetworkRequest = job.getRequiredNetwork(); + mNetworkDownloadBytes = job.getEstimatedNetworkDownloadBytes(); + mNetworkUploadBytes = job.getEstimatedNetworkUploadBytes(); + mTriggerContentUris = job.getTriggerContentUris() != null + ? new ArrayList<>(Arrays.asList(job.getTriggerContentUris())) : null; + mTriggerContentUpdateDelay = job.getTriggerContentUpdateDelay(); + mTriggerContentMaxDelay = job.getTriggerContentMaxDelay(); + mIsPersisted = job.isPersisted(); + mMinLatencyMillis = job.getMinLatencyMillis(); + mMaxExecutionDelayMillis = job.getMaxExecutionDelayMillis(); + mIsPeriodic = job.isPeriodic(); + mHasEarlyConstraint = job.hasEarlyConstraint(); + mHasLateConstraint = job.hasLateConstraint(); + mIntervalMillis = job.getIntervalMillis(); + mFlexMillis = job.getFlexMillis(); + mInitialBackoffMillis = job.getInitialBackoffMillis(); + // mBackoffPolicySet isn't set but it's fine since this is copying from an already valid + // job. + mBackoffPolicy = job.getBackoffPolicy(); + } + /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public Builder setPriority(int priority) { diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index d7be2595e88ba..ea8e7bc4ab06e 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -28,6 +28,7 @@ import android.app.job.JobWorkItem; import android.content.ClipData; import android.content.ComponentName; import android.net.Network; +import android.net.NetworkRequest; import android.net.Uri; import android.os.RemoteException; import android.os.UserHandle; @@ -35,6 +36,7 @@ import android.provider.MediaStore; import android.text.format.DateFormat; import android.util.ArraySet; import android.util.Pair; +import android.util.Range; import android.util.Slog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; @@ -52,6 +54,7 @@ import com.android.server.job.JobStatusShortInfoProto; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.function.Predicate; /** @@ -486,8 +489,15 @@ public final class JobStatus { // Later, when we check if a given network satisfies the required // network, we need to know the UID that is requesting it, so push // our source UID into place. - job.getRequiredNetwork().networkCapabilities.setSingleUid(this.sourceUid); + final JobInfo.Builder builder = new JobInfo.Builder(job); + final NetworkRequest.Builder requestBuilder = + new NetworkRequest.Builder(job.getRequiredNetwork()); + requestBuilder.setUids( + Collections.singleton(new Range(this.sourceUid, this.sourceUid))); + builder.setRequiredNetwork(requestBuilder.build()); + job = builder.build(); } + final JobSchedulerInternal jsi = LocalServices.getService(JobSchedulerInternal.class); mHasMediaBackupExemption = !job.hasLateConstraint() && exemptedMediaUrisOnly && requiresNetwork && this.sourcePackageName.equals(jsi.getMediaBackupPackage());