Loading apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +12 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.util.Slog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.server.LocalServices; Loading Loading @@ -1668,7 +1669,8 @@ public final class JobStatus { return readinessStatusWithConstraint(constraint, true); } private boolean readinessStatusWithConstraint(int constraint, boolean value) { @VisibleForTesting boolean readinessStatusWithConstraint(int constraint, boolean value) { boolean oldValue = false; int satisfied = mSatisfiedConstraintsOfInterest; switch (constraint) { Loading Loading @@ -1704,6 +1706,15 @@ public final class JobStatus { break; } // The flexibility constraint relies on other constraints to be satisfied. // This function lacks the information to determine if flexibility will be satisfied. // But for the purposes of this function it is still useful to know the jobs' readiness // not including the flexibility constraint. If flexibility is the constraint in question // we can proceed as normal. if (constraint != CONSTRAINT_FLEXIBLE) { satisfied |= CONSTRAINT_FLEXIBLE; } boolean toReturn = isReady(satisfied); switch (constraint) { Loading services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +78 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONNECTIVI import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONTENT_TRIGGER; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_DEADLINE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_DEVICE_NOT_DOZING; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_FLEXIBLE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_IDLE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_STORAGE_NOT_LOW; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_TIMING_DELAY; Loading Loading @@ -790,6 +791,83 @@ public class JobStatusTest { assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BACKGROUND_NOT_RESTRICTED)); } @Test public void testWouldBeReadyWithConstraint_FlexibilityDoesNotAffectReadiness() { final JobStatus job = createJobStatus( new JobInfo.Builder(101, new ComponentName("foo", "bar")).build()); markImplicitConstraintsSatisfied(job, false); job.setFlexibilityConstraintSatisfied(0, false); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); markImplicitConstraintsSatisfied(job, true); job.setFlexibilityConstraintSatisfied(0, false); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); markImplicitConstraintsSatisfied(job, false); job.setFlexibilityConstraintSatisfied(0, true); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); markImplicitConstraintsSatisfied(job, true); job.setFlexibilityConstraintSatisfied(0, true); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); } @Test public void testReadinessStatusWithConstraint_FlexibilityConstraint() { final JobStatus job = createJobStatus( new JobInfo.Builder(101, new ComponentName("foo", "bar")).build()); job.setConstraintSatisfied(CONSTRAINT_FLEXIBLE, sElapsedRealtimeClock.millis(), false); markImplicitConstraintsSatisfied(job, true); assertTrue(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); markImplicitConstraintsSatisfied(job, false); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); job.setConstraintSatisfied(CONSTRAINT_FLEXIBLE, sElapsedRealtimeClock.millis(), true); markImplicitConstraintsSatisfied(job, true); assertTrue(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); markImplicitConstraintsSatisfied(job, false); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); } private void markImplicitConstraintsSatisfied(JobStatus job, boolean isSatisfied) { job.setQuotaConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied); job.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied); Loading @@ -797,7 +875,6 @@ public class JobStatusTest { sElapsedRealtimeClock.millis(), isSatisfied, false); job.setBackgroundNotRestrictedConstraintSatisfied( sElapsedRealtimeClock.millis(), isSatisfied, false); job.setFlexibilityConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied); } private static JobStatus createJobStatus(long earliestRunTimeElapsedMillis, Loading Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +12 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.util.Slog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.server.LocalServices; Loading Loading @@ -1668,7 +1669,8 @@ public final class JobStatus { return readinessStatusWithConstraint(constraint, true); } private boolean readinessStatusWithConstraint(int constraint, boolean value) { @VisibleForTesting boolean readinessStatusWithConstraint(int constraint, boolean value) { boolean oldValue = false; int satisfied = mSatisfiedConstraintsOfInterest; switch (constraint) { Loading Loading @@ -1704,6 +1706,15 @@ public final class JobStatus { break; } // The flexibility constraint relies on other constraints to be satisfied. // This function lacks the information to determine if flexibility will be satisfied. // But for the purposes of this function it is still useful to know the jobs' readiness // not including the flexibility constraint. If flexibility is the constraint in question // we can proceed as normal. if (constraint != CONSTRAINT_FLEXIBLE) { satisfied |= CONSTRAINT_FLEXIBLE; } boolean toReturn = isReady(satisfied); switch (constraint) { Loading
services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +78 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONNECTIVI import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONTENT_TRIGGER; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_DEADLINE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_DEVICE_NOT_DOZING; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_FLEXIBLE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_IDLE; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_STORAGE_NOT_LOW; import static com.android.server.job.controllers.JobStatus.CONSTRAINT_TIMING_DELAY; Loading Loading @@ -790,6 +791,83 @@ public class JobStatusTest { assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BACKGROUND_NOT_RESTRICTED)); } @Test public void testWouldBeReadyWithConstraint_FlexibilityDoesNotAffectReadiness() { final JobStatus job = createJobStatus( new JobInfo.Builder(101, new ComponentName("foo", "bar")).build()); markImplicitConstraintsSatisfied(job, false); job.setFlexibilityConstraintSatisfied(0, false); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); markImplicitConstraintsSatisfied(job, true); job.setFlexibilityConstraintSatisfied(0, false); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); markImplicitConstraintsSatisfied(job, false); job.setFlexibilityConstraintSatisfied(0, true); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); markImplicitConstraintsSatisfied(job, true); job.setFlexibilityConstraintSatisfied(0, true); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER)); assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_FLEXIBLE)); } @Test public void testReadinessStatusWithConstraint_FlexibilityConstraint() { final JobStatus job = createJobStatus( new JobInfo.Builder(101, new ComponentName("foo", "bar")).build()); job.setConstraintSatisfied(CONSTRAINT_FLEXIBLE, sElapsedRealtimeClock.millis(), false); markImplicitConstraintsSatisfied(job, true); assertTrue(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); markImplicitConstraintsSatisfied(job, false); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); job.setConstraintSatisfied(CONSTRAINT_FLEXIBLE, sElapsedRealtimeClock.millis(), true); markImplicitConstraintsSatisfied(job, true); assertTrue(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); markImplicitConstraintsSatisfied(job, false); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, true)); assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); } private void markImplicitConstraintsSatisfied(JobStatus job, boolean isSatisfied) { job.setQuotaConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied); job.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied); Loading @@ -797,7 +875,6 @@ public class JobStatusTest { sElapsedRealtimeClock.millis(), isSatisfied, false); job.setBackgroundNotRestrictedConstraintSatisfied( sElapsedRealtimeClock.millis(), isSatisfied, false); job.setFlexibilityConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied); } private static JobStatus createJobStatus(long earliestRunTimeElapsedMillis, Loading