diff options
author | Kweku Adams <kwekua@google.com> | 2023-12-04 23:04:45 +0000 |
---|---|---|
committer | Kweku Adams <kwekua@google.com> | 2023-12-07 21:48:51 +0000 |
commit | a6738a47b1f0dede8640ebf48a0bbc8a223108de (patch) | |
tree | 57fd10fef94b2fc8e490d8a38ed322286f828fbf /apex | |
parent | 45073580616f24e6b5eff62596b347f5a338041b (diff) | |
download | base-a6738a47b1f0dede8640ebf48a0bbc8a223108de.tar.gz |
Make applied flex constraints configurable.
Make it possible to change which specific constraints are used in the
flex scheduling behavior.
Bug: 236261941
Bug: 299329948
Bug: 299346198
Test: atest CtsJobSchedulerTestCases:FlexibilityConstraintTest
Test: atest frameworks/base/services/tests/mockingservicestests/src/com/android/server/job
Test: atest frameworks/base/services/tests/servicestests/src/com/android/server/job
Change-Id: I55c143d9e4ec384bd4c687dbe9313a8e78a9a6f1
Diffstat (limited to 'apex')
3 files changed, 141 insertions, 72 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java index e06006f25d3f..f40508302ee3 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java @@ -1769,7 +1769,8 @@ public final class ConnectivityController extends RestrictingController implemen @VisibleForTesting class CcConfig { - private boolean mFlexIsEnabled = FlexibilityController.FcConfig.DEFAULT_FLEXIBILITY_ENABLED; + private boolean mFlexIsEnabled = + FlexibilityController.FcConfig.DEFAULT_APPLIED_CONSTRAINTS != 0; private boolean mShouldReprocessNetworkCapabilities = false; /** 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 13a474ccf451..0e67b9ac944f 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 @@ -24,7 +24,6 @@ import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_BATTERY_NOT_LOW; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CHARGING; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONNECTIVITY; -import static com.android.server.job.controllers.JobStatus.CONSTRAINT_FLEXIBLE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_IDLE; import android.annotation.ElapsedRealtimeLong; @@ -74,17 +73,10 @@ public final class FlexibilityController extends StateController { private static final int JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS = CONSTRAINT_CONNECTIVITY; /** List of all flexible constraints. */ - private static final int FLEXIBLE_CONSTRAINTS = + @VisibleForTesting + static final int FLEXIBLE_CONSTRAINTS = JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS | SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS; - private static final int NUM_JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS = - Integer.bitCount(JOB_SPECIFIC_FLEXIBLE_CONSTRAINTS); - - static final int NUM_SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS = - Integer.bitCount(SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS); - - static final int NUM_FLEXIBLE_CONSTRAINTS = Integer.bitCount(FLEXIBLE_CONSTRAINTS); - private static final long NO_LIFECYCLE_END = Long.MAX_VALUE; /** @@ -100,9 +92,15 @@ public final class FlexibilityController extends StateController { private long mUnseenConstraintGracePeriodMs = FcConfig.DEFAULT_UNSEEN_CONSTRAINT_GRACE_PERIOD_MS; - @VisibleForTesting + /** Set of constraints supported on this device for flex scheduling. */ + private final int mSupportedFlexConstraints; + @GuardedBy("mLock") - boolean mFlexibilityEnabled = FcConfig.DEFAULT_FLEXIBILITY_ENABLED; + private boolean mFlexibilityEnabled; + + /** Set of constraints that will be used in the flex policy. */ + @GuardedBy("mLock") + private int mAppliedConstraints = FcConfig.DEFAULT_APPLIED_CONSTRAINTS; private long mMinTimeBetweenFlexibilityAlarmsMs = FcConfig.DEFAULT_MIN_TIME_BETWEEN_FLEXIBILITY_ALARMS_MS; @@ -118,9 +116,6 @@ 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. @@ -178,7 +173,7 @@ public final class FlexibilityController extends StateController { if (!js.hasFlexibilityConstraint()) { continue; } - mFlexibilityTracker.resetJobNumDroppedConstraints(js, nowElapsed); + mFlexibilityTracker.calculateNumDroppedConstraints(js, nowElapsed); mFlexibilityAlarmQueue.scheduleDropNumConstraintsAlarm(js, nowElapsed); } } @@ -186,15 +181,23 @@ public final class FlexibilityController extends StateController { }; private static final int MSG_UPDATE_JOBS = 0; + private static final int MSG_UPDATE_JOB = 1; public FlexibilityController( JobSchedulerService service, PrefetchController prefetchController) { super(service); mHandler = new FcHandler(AppSchedulingModuleThread.get().getLooper()); - mDeviceSupportsFlexConstraints = !mContext.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_AUTOMOTIVE); - mFlexibilityEnabled &= mDeviceSupportsFlexConstraints; - mFlexibilityTracker = new FlexibilityTracker(NUM_FLEXIBLE_CONSTRAINTS); + if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) + || mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED)) { + // Embedded devices have no user-installable apps. Assume all jobs are critical + // and can't be flexed. + mSupportedFlexConstraints = 0; + } else { + // TODO(236261941): handle devices without a battery + mSupportedFlexConstraints = FLEXIBLE_CONSTRAINTS; + } + mFlexibilityEnabled = (mAppliedConstraints & mSupportedFlexConstraints) != 0; + mFlexibilityTracker = new FlexibilityTracker(Integer.bitCount(mSupportedFlexConstraints)); mFcConfig = new FcConfig(); mFlexibilityAlarmQueue = new FlexibilityAlarmQueue( mContext, AppSchedulingModuleThread.get().getLooper()); @@ -218,10 +221,12 @@ public final class FlexibilityController extends StateController { public void maybeStartTrackingJobLocked(JobStatus js, JobStatus lastJob) { if (js.hasFlexibilityConstraint()) { final long nowElapsed = sElapsedRealtimeClock.millis(); - if (!mDeviceSupportsFlexConstraints) { + if (mSupportedFlexConstraints == 0) { js.setFlexibilityConstraintSatisfied(nowElapsed, true); return; } + js.setNumAppliedFlexibleConstraints( + Integer.bitCount(getRelevantAppliedConstraintsLocked(js))); js.setFlexibilityConstraintSatisfied(nowElapsed, isFlexibilitySatisfiedLocked(js)); mFlexibilityTracker.add(js); js.setTrackingController(JobStatus.TRACKING_FLEXIBILITY); @@ -266,6 +271,14 @@ public final class FlexibilityController extends StateController { || mService.isCurrentlyRunningLocked(js); } + @VisibleForTesting + @GuardedBy("mLock") + int getRelevantAppliedConstraintsLocked(@NonNull JobStatus js) { + final int relevantConstraints = SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS + | (js.canApplyTransportAffinities() ? CONSTRAINT_CONNECTIVITY : 0); + return mAppliedConstraints & relevantConstraints; + } + /** * Returns whether there are enough constraints satisfied to allow running the job from flex's * perspective. This takes into account unseen constraint combinations and expectations around @@ -274,7 +287,7 @@ public final class FlexibilityController extends StateController { @VisibleForTesting @GuardedBy("mLock") boolean hasEnoughSatisfiedConstraintsLocked(@NonNull JobStatus js) { - final int satisfiedConstraints = mSatisfiedFlexibleConstraints + final int satisfiedConstraints = mSatisfiedFlexibleConstraints & mAppliedConstraints & (SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS | (js.areTransportAffinitiesSatisfied() ? CONSTRAINT_CONNECTIVITY : 0)); final int numSatisfied = Integer.bitCount(satisfiedConstraints); @@ -296,8 +309,7 @@ public final class FlexibilityController extends StateController { // count have not been seen recently enough, then assume they won't be seen anytime soon, // so don't force the job to wait longer. If any combinations with a higher count have been // seen recently, then the job can potentially wait for those combinations. - final int irrelevantConstraints = ~(SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS - | (js.canApplyTransportAffinities() ? CONSTRAINT_CONNECTIVITY : 0)); + final int irrelevantConstraints = ~getRelevantAppliedConstraintsLocked(js); for (int i = mLastSeenConstraintTimesElapsed.size() - 1; i >= 0; --i) { final int constraints = mLastSeenConstraintTimesElapsed.keyAt(i); if ((constraints & irrelevantConstraints) != 0) { @@ -515,9 +527,9 @@ public final class FlexibilityController extends StateController { for (int j = 0; j < mFlexibilityTracker.size(); j++) { final ArraySet<JobStatus> jobs = mFlexibilityTracker .getJobsByNumRequiredConstraints(j); - for (int i = 0; i < jobs.size(); i++) { + for (int i = jobs.size() - 1; i >= 0; --i) { JobStatus js = jobs.valueAt(i); - mFlexibilityTracker.resetJobNumDroppedConstraints(js, nowElapsed); + mFlexibilityTracker.updateFlexibleConstraints(js, nowElapsed); mFlexibilityAlarmQueue.scheduleDropNumConstraintsAlarm(js, nowElapsed); if (js.setFlexibilityConstraintSatisfied( nowElapsed, isFlexibilitySatisfiedLocked(js))) { @@ -579,18 +591,46 @@ public final class FlexibilityController extends StateController { mTrackedJobs.get(js.getNumRequiredFlexibleConstraints()).remove(js); } - public void resetJobNumDroppedConstraints(JobStatus js, long nowElapsed) { + /** + * Updates applied and dropped constraints for the job. + */ + public void updateFlexibleConstraints(JobStatus js, long nowElapsed) { + final int prevNumRequired = js.getNumRequiredFlexibleConstraints(); + + final int numAppliedConstraints = + Integer.bitCount(getRelevantAppliedConstraintsLocked(js)); + js.setNumAppliedFlexibleConstraints(numAppliedConstraints); + final int curPercent = getCurPercentOfLifecycleLocked(js, nowElapsed); int toDrop = 0; - final int jsMaxFlexibleConstraints = NUM_SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS - + (js.canApplyTransportAffinities() ? 1 : 0); + for (int i = 0; i < numAppliedConstraints; i++) { + if (curPercent >= mPercentToDropConstraints[i]) { + toDrop++; + } + } + js.setNumDroppedFlexibleConstraints(toDrop); + + if (prevNumRequired == js.getNumRequiredFlexibleConstraints()) { + return; + } + mTrackedJobs.get(prevNumRequired).remove(js); + add(js); + } + + /** + * Calculates the number of constraints that should be dropped for the job, based on how + * far along the job is into its lifecycle. + */ + public void calculateNumDroppedConstraints(JobStatus js, long nowElapsed) { + final int curPercent = getCurPercentOfLifecycleLocked(js, nowElapsed); + int toDrop = 0; + final int jsMaxFlexibleConstraints = js.getNumAppliedFlexibleConstraints(); for (int i = 0; i < jsMaxFlexibleConstraints; i++) { if (curPercent >= mPercentToDropConstraints[i]) { toDrop++; } } - adjustJobsRequiredConstraints( - js, js.getNumDroppedFlexibleConstraints() - toDrop, nowElapsed); + setNumDroppedFlexibleConstraints(js, toDrop); } /** Returns all tracked jobs. */ @@ -599,17 +639,14 @@ public final class FlexibilityController extends StateController { } /** - * Adjusts number of required flexible constraints and sorts it into the tracker. - * Returns false if the job status's number of flexible constraints is now 0. + * Updates the number of dropped flexible constraints and sorts it into the tracker. */ - public boolean adjustJobsRequiredConstraints(JobStatus js, int adjustBy, long nowElapsed) { - if (adjustBy != 0) { + public void setNumDroppedFlexibleConstraints(JobStatus js, int numDropped) { + if (numDropped != js.getNumDroppedFlexibleConstraints()) { remove(js); - js.adjustNumRequiredFlexibleConstraints(adjustBy); - js.setFlexibilityConstraintSatisfied(nowElapsed, isFlexibilitySatisfiedLocked(js)); + js.setNumDroppedFlexibleConstraints(numDropped); add(js); } - return js.getNumRequiredFlexibleConstraints() > 0; } public int size() { @@ -658,8 +695,10 @@ public final class FlexibilityController extends StateController { if (DEBUG) { Slog.d(TAG, "scheduleDropNumConstraintsAlarm: " + js.getSourcePackageName() + " " + js.getSourceUserId() + + " numApplied: " + js.getNumAppliedFlexibleConstraints() + " numRequired: " + js.getNumRequiredFlexibleConstraints() - + " numSatisfied: " + Integer.bitCount(mSatisfiedFlexibleConstraints) + + " numSatisfied: " + Integer.bitCount( + mSatisfiedFlexibleConstraints & getRelevantAppliedConstraintsLocked(js)) + " curTime: " + nowElapsed + " earliest: " + earliest + " latest: " + latest @@ -669,8 +708,9 @@ public final class FlexibilityController extends StateController { if (DEBUG) { Slog.d(TAG, "deadline proximity met: " + js); } - mFlexibilityTracker.adjustJobsRequiredConstraints(js, - -js.getNumRequiredFlexibleConstraints(), nowElapsed); + mFlexibilityTracker.setNumDroppedFlexibleConstraints(js, + js.getNumAppliedFlexibleConstraints()); + mHandler.obtainMessage(MSG_UPDATE_JOB, js).sendToTarget(); return; } if (nextTimeElapsed == NO_LIFECYCLE_END) { @@ -696,12 +736,15 @@ public final class FlexibilityController extends StateController { final long nowElapsed = sElapsedRealtimeClock.millis(); for (int i = 0; i < expired.size(); i++) { JobStatus js = expired.valueAt(i); - boolean wasFlexibilitySatisfied = js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE); - - if (mFlexibilityTracker.adjustJobsRequiredConstraints(js, -1, nowElapsed)) { + if (DEBUG) { + Slog.d(TAG, "Alarm fired for " + js.toShortString()); + } + mFlexibilityTracker.calculateNumDroppedConstraints(js, nowElapsed); + if (js.getNumRequiredFlexibleConstraints() > 0) { scheduleDropNumConstraintsAlarm(js, nowElapsed); } - if (wasFlexibilitySatisfied != js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE)) { + if (js.setFlexibilityConstraintSatisfied(nowElapsed, + isFlexibilitySatisfiedLocked(js))) { changedJobs.add(js); } } @@ -725,7 +768,9 @@ public final class FlexibilityController extends StateController { final long nowElapsed = sElapsedRealtimeClock.millis(); final ArraySet<JobStatus> changedJobs = new ArraySet<>(); - for (int o = 0; o <= NUM_SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS; ++o) { + final int numAppliedSystemWideConstraints = Integer.bitCount( + mAppliedConstraints & SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS); + for (int o = 0; o <= numAppliedSystemWideConstraints; ++o) { final ArraySet<JobStatus> jobsByNumConstraints = mFlexibilityTracker .getJobsByNumRequiredConstraints(o); @@ -744,6 +789,23 @@ public final class FlexibilityController extends StateController { } } break; + + case MSG_UPDATE_JOB: + synchronized (mLock) { + final JobStatus js = (JobStatus) msg.obj; + if (DEBUG) { + Slog.d("blah", "Checking on " + js.toShortString()); + } + final long nowElapsed = sElapsedRealtimeClock.millis(); + if (js.setFlexibilityConstraintSatisfied( + nowElapsed, isFlexibilitySatisfiedLocked(js))) { + // TODO(141645789): add method that will take a single job + ArraySet<JobStatus> changedJob = new ArraySet<>(); + changedJob.add(js); + mStateChangedListener.onControllerStateChanged(changedJob); + } + } + break; } } } @@ -754,7 +816,8 @@ public final class FlexibilityController extends StateController { /** Prefix to use with all constant keys in order to "sub-namespace" the keys. */ private static final String FC_CONFIG_PREFIX = "fc_"; - static final String KEY_FLEXIBILITY_ENABLED = FC_CONFIG_PREFIX + "enable_flexibility"; + @VisibleForTesting + static final String KEY_APPLIED_CONSTRAINTS = FC_CONFIG_PREFIX + "applied_constraints"; static final String KEY_DEADLINE_PROXIMITY_LIMIT = FC_CONFIG_PREFIX + "flexibility_deadline_proximity_limit_ms"; static final String KEY_FALLBACK_FLEXIBILITY_DEADLINE = @@ -770,7 +833,7 @@ public final class FlexibilityController extends StateController { static final String KEY_UNSEEN_CONSTRAINT_GRACE_PERIOD_MS = FC_CONFIG_PREFIX + "unseen_constraint_grace_period_ms"; - static final boolean DEFAULT_FLEXIBILITY_ENABLED = false; + static final int DEFAULT_APPLIED_CONSTRAINTS = 0; @VisibleForTesting static final long DEFAULT_DEADLINE_PROXIMITY_LIMIT_MS = 15 * MINUTE_IN_MILLIS; @VisibleForTesting @@ -783,11 +846,8 @@ public final class FlexibilityController extends StateController { @VisibleForTesting static final long DEFAULT_UNSEEN_CONSTRAINT_GRACE_PERIOD_MS = 3 * DAY_IN_MILLIS; - /** - * If false the controller will not track new jobs - * and the flexibility constraint will always be satisfied. - */ - public boolean FLEXIBILITY_ENABLED = DEFAULT_FLEXIBILITY_ENABLED; + /** Which constraints to apply/consider in flex policy. */ + public int APPLIED_CONSTRAINTS = DEFAULT_APPLIED_CONSTRAINTS; /** How close to a jobs' deadline all flexible constraints will be dropped. */ public long DEADLINE_PROXIMITY_LIMIT_MS = DEFAULT_DEADLINE_PROXIMITY_LIMIT_MS; /** For jobs that lack a deadline, the time that will be used to drop all constraints by. */ @@ -811,16 +871,19 @@ public final class FlexibilityController extends StateController { public void processConstantLocked(@NonNull DeviceConfig.Properties properties, @NonNull String key) { switch (key) { - case KEY_FLEXIBILITY_ENABLED: - FLEXIBILITY_ENABLED = properties.getBoolean(key, DEFAULT_FLEXIBILITY_ENABLED) - && mDeviceSupportsFlexConstraints; - if (mFlexibilityEnabled != FLEXIBILITY_ENABLED) { - mFlexibilityEnabled = FLEXIBILITY_ENABLED; + case KEY_APPLIED_CONSTRAINTS: + APPLIED_CONSTRAINTS = + properties.getInt(key, DEFAULT_APPLIED_CONSTRAINTS) + & mSupportedFlexConstraints; + if (mAppliedConstraints != APPLIED_CONSTRAINTS) { + mAppliedConstraints = APPLIED_CONSTRAINTS; mShouldReevaluateConstraints = true; - if (mFlexibilityEnabled) { + if (mAppliedConstraints != 0) { + mFlexibilityEnabled = true; mPrefetchController .registerPrefetchChangedListener(mPrefetchChangedListener); } else { + mFlexibilityEnabled = false; mPrefetchController .unRegisterPrefetchChangedListener(mPrefetchChangedListener); } @@ -893,7 +956,7 @@ public final class FlexibilityController extends StateController { private int[] parsePercentToDropString(String s) { String[] dropPercentString = s.split(","); - int[] dropPercentInt = new int[NUM_FLEXIBLE_CONSTRAINTS]; + int[] dropPercentInt = new int[Integer.bitCount(FLEXIBLE_CONSTRAINTS)]; if (dropPercentInt.length != dropPercentString.length) { return DEFAULT_PERCENT_TO_DROP_FLEXIBLE_CONSTRAINTS; } @@ -922,7 +985,7 @@ public final class FlexibilityController extends StateController { pw.println(":"); pw.increaseIndent(); - pw.print(KEY_FLEXIBILITY_ENABLED, FLEXIBILITY_ENABLED).println(); + pw.print(KEY_APPLIED_CONSTRAINTS, APPLIED_CONSTRAINTS).println(); pw.print(KEY_DEADLINE_PROXIMITY_LIMIT, DEADLINE_PROXIMITY_LIMIT_MS).println(); pw.print(KEY_FALLBACK_FLEXIBILITY_DEADLINE, FALLBACK_FLEXIBILITY_DEADLINE_MS).println(); pw.print(KEY_MIN_TIME_BETWEEN_FLEXIBILITY_ALARMS_MS, 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 d1f575ef40c8..0d5d11e98860 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 @@ -24,7 +24,6 @@ import static com.android.server.job.JobSchedulerService.NEVER_INDEX; import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; import static com.android.server.job.JobSchedulerService.WORKING_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; -import static com.android.server.job.controllers.FlexibilityController.NUM_SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS; import static com.android.server.job.controllers.FlexibilityController.SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS; import android.annotation.ElapsedRealtimeLong; @@ -155,7 +154,7 @@ public final class JobStatus { /** * Keeps track of how many flexible constraints must be satisfied for the job to execute. */ - private final int mNumRequiredFlexibleConstraints; + private int mNumAppliedFlexibleConstraints; /** * Number of required flexible constraints that have been dropped. @@ -697,11 +696,7 @@ public final class JobStatus { && satisfiesMinWindowException && (numFailures + numSystemStops) != 1 && lacksSomeFlexibleConstraints) { - mNumRequiredFlexibleConstraints = - NUM_SYSTEM_WIDE_FLEXIBLE_CONSTRAINTS + (mCanApplyTransportAffinities ? 1 : 0); requiredConstraints |= CONSTRAINT_FLEXIBLE; - } else { - mNumRequiredFlexibleConstraints = 0; } this.requiredConstraints = requiredConstraints; @@ -1527,9 +1522,14 @@ public final class JobStatus { return (requiredConstraints & CONSTRAINT_FLEXIBLE) != 0; } + /** Returns the number of flexible job constraints being applied to the job. */ + public int getNumAppliedFlexibleConstraints() { + return mNumAppliedFlexibleConstraints; + } + /** Returns the number of flexible job constraints required to be satisfied to execute */ public int getNumRequiredFlexibleConstraints() { - return mNumRequiredFlexibleConstraints - mNumDroppedFlexibleConstraints; + return mNumAppliedFlexibleConstraints - mNumDroppedFlexibleConstraints; } /** @@ -2112,9 +2112,14 @@ public final class JobStatus { } /** Adjusts the number of required flexible constraints by the given number */ - public void adjustNumRequiredFlexibleConstraints(int adjustment) { - mNumDroppedFlexibleConstraints = Math.max(0, Math.min(mNumRequiredFlexibleConstraints, - mNumDroppedFlexibleConstraints - adjustment)); + public void setNumAppliedFlexibleConstraints(int count) { + mNumAppliedFlexibleConstraints = count; + } + + /** Sets the number of dropped flexible constraints to the given number */ + public void setNumDroppedFlexibleConstraints(int count) { + mNumDroppedFlexibleConstraints = Math.max(0, + Math.min(mNumAppliedFlexibleConstraints, count)); } /** |