return setExecutionWindow(exactInMs, exactInMs);
.setExecutionWindow(Math.max(1L, startDelay), Math.max(1L, endDelay)) .build();
@Test public void testCancel() { int jobId = new JobRequest.Builder(TAG) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .build() .schedule(); JobRequest request = mWorkManagerRule.getManager().getJobRequest(jobId); JobProxyWorkManager jobProxyWorkManager = new JobProxyWorkManager(InstrumentationRegistry.getTargetContext()); assertThat(jobProxyWorkManager.isPlatformJobScheduled(request)).isTrue(); String tag = JobProxyWorkManager.createTag(jobId); List<WorkInfo> statuses = mWorkManagerRule.getWorkStatus(tag); assertThat(statuses).isNotNull().hasSize(1); assertThat(statuses.get(0).getState()).isEqualTo(WorkInfo.State.ENQUEUED); mWorkManagerRule.getManager().cancel(jobId); assertThat(mWorkManagerRule.getWorkStatus(tag).get(0).getState()).isEqualTo(WorkInfo.State.CANCELLED); assertThat(jobProxyWorkManager.isPlatformJobScheduled(request)).isFalse(); }
.setExecutionWindow(Math.max(1L, startDelay), Math.max(1L, endDelay)) .build();
return setExecutionWindow(exactInMs, exactInMs);
/** * Cancel this request if it has been scheduled. Note that if the job isn't periodic, then the * time passed since the job has been scheduled is subtracted from the time frame. For example * a job should run between 4 and 6 seconds from now. You cancel the scheduled job after 2 * seconds, then the job will run between 2 and 4 seconds after it's been scheduled again. * * @return A builder to modify the parameters. */ public Builder cancelAndEdit() { // create a temporary variable, because .cancel() will reset mScheduledAt long scheduledAt = mScheduledAt; JobManager.instance().cancel(getJobId()); Builder builder = new Builder(this.mBuilder); mStarted = false; if (!isPeriodic()) { long offset = JobConfig.getClock().currentTimeMillis() - scheduledAt; long minValue = 1L; // 1ms builder.setExecutionWindow(Math.max(minValue, getStartMs() - offset), Math.max(minValue, getEndMs() - offset)); } return builder; }
/** * {@inheritDoc} */ @Override public void executeRequestsNow(int howMany) { int started = 0; for (JobRequest jobRequest : JobManager.instance().getAllJobRequests()) { if (isSoonButNotImmediate(jobRequest)) { JobRequest.Builder builder = jobRequest.cancelAndEdit(); long endMillis = Math.max(jobRequest.getEndMs(), RUN_NOW_TIME_WINDOW_END); builder.setExecutionWindow(RUN_NOW_TIME_WINDOW_START, endMillis).build().schedule(); started++; } if (started == howMany) { break; } } Logger.d(TAG, String.format("Job scheduled started %d requests.", started)); }
static JobRequest adapt(UploadRequest request) { PersistableBundleCompat extras = new PersistableBundleCompat(); request.populateParamsFromFields(new AndroidJobRequestParams(extras)); UploadPolicy policy = request.getUploadPolicy(); JobRequest.Builder builder = new JobRequest.Builder(JOB_TAG) .setBackoffCriteria(policy.getBackoffMillis(), adaptPolicy(policy.getBackoffPolicy())) .setExtras(extras) .setExecutionWindow(request.getTimeWindow().getMinLatencyOffsetMillis(), request.getTimeWindow().getMaxExecutionDelayMillis()) .setRequiredNetworkType(adaptNetworkType(policy.getNetworkType())) .setRequiresCharging(policy.isRequiresCharging()) .setRequiresDeviceIdle(policy.isRequiresIdle()) .setRequirementsEnforced(true); return builder.build(); }
.setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .build() .schedule();
/** * Cancel this request if it has been scheduled. Note that if the job isn't periodic, then the * time passed since the job has been scheduled is subtracted from the time frame. For example * a job should run between 4 and 6 seconds from now. You cancel the scheduled job after 2 * seconds, then the job will run between 2 and 4 seconds after it's been scheduled again. * * @return A builder to modify the parameters. */ public Builder cancelAndEdit() { // create a temporary variable, because .cancel() will reset mScheduledAt long scheduledAt = mScheduledAt; JobManager.instance().cancel(getJobId()); Builder builder = new Builder(this.mBuilder); mStarted = false; if (!isPeriodic()) { long offset = JobConfig.getClock().currentTimeMillis() - scheduledAt; long minValue = 1L; // 1ms builder.setExecutionWindow(Math.max(minValue, getStartMs() - offset), Math.max(minValue, getEndMs() - offset)); } return builder; }
@Test public void testWarningWhenTooFarInTheFuture() { class TestPrinter implements JobLogger { private final List<String> mMessages = new ArrayList<>(); @Override public void log(int priority, @NonNull String tag, @NonNull String message, @Nullable Throwable t) { mMessages.add(message); } } TestPrinter testPrinter = new TestPrinter(); JobConfig.addLogger(testPrinter); getBuilder().setExecutionWindow(TimeUnit.DAYS.toMillis(366), TimeUnit.DAYS.toMillis(367)).build(); getBuilder().setExact(TimeUnit.DAYS.toMillis(366)).build(); JobConfig.removeLogger(testPrinter); assertThat(testPrinter.mMessages).containsSubsequence( "Warning: job with tag SuccessJob scheduled over a year in the future", "Warning: job with tag SuccessJob scheduled over a year in the future" ); }
@Test public void testTransientExtras() { Bundle extras = new Bundle(); extras.putInt("key", 5); JobRequest.Builder builder = new JobRequest.Builder(TAG) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .setTransientExtras(extras); int jobId = builder.build().schedule(); Bundle bundle = TransientBundleHolder.getBundle(jobId); assertThat(bundle).isNotNull(); assertThat(bundle.getInt("key")).isEqualTo(5); mWorkManagerRule.getManager().cancel(jobId); assertThat(TransientBundleHolder.getBundle(jobId)).isNull(); jobId = builder.build().schedule(); mWorkManagerRule.runJob(JobProxyWorkManager.createTag(jobId)); assertThat(TransientBundleHolder.getBundle(jobId)).isNull(); }
@Test public void verifyNotFoundJobCanceledOneOff() { final String tag = "something"; final int jobId = new JobRequest.Builder(tag) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .build() .schedule(); assertThat(manager().getAllJobRequestsForTag(tag)).hasSize(1); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getAllJobRequestsForTag(tag)).isEmpty(); }
@Test public void testConstraintsOneOff() { testConstraints(new JobRequest.Builder(TAG) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .setBackoffCriteria(TimeUnit.MINUTES.toMillis(4), JobRequest.BackoffPolicy.EXPONENTIAL) ); }