private WorkManager getWorkManager() { // don't cache the instance, it could change under the hood, e.g. during tests WorkManager workManager; try { workManager = WorkManager.getInstance(); } catch (Throwable t) { workManager = null; } if (workManager == null) { try { WorkManager.initialize(mContext, new Configuration.Builder().build()); workManager = WorkManager.getInstance(); } catch (Throwable ignored) { } CAT.w("WorkManager getInstance() returned null, now: %s", workManager); } return workManager; }
private static Constraints buildConstraints(JobRequest request) { Constraints.Builder constraintsBuilder = new Constraints.Builder() .setRequiresBatteryNotLow(request.requiresBatteryNotLow()) .setRequiresCharging(request.requiresCharging()) .setRequiresStorageNotLow(request.requiresStorageNotLow()) .setRequiredNetworkType(mapNetworkType(request.requiredNetworkType())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { constraintsBuilder.setRequiresDeviceIdle(request.requiresDeviceIdle()); } return constraintsBuilder.build(); }
@Override public void plantPeriodic(JobRequest request) { PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(PlatformWorker.class, request.getIntervalMs(), TimeUnit.MILLISECONDS, request.getFlexMs(), TimeUnit.MILLISECONDS) .setConstraints(buildConstraints(request)) .addTag(createTag(request.getJobId())) .build(); WorkManager workManager = getWorkManager(); if (workManager == null) { throw new JobProxyIllegalStateException("WorkManager is null"); } workManager.enqueue(workRequest); }
static void enqueue() { WorkManager.getInstance() .enqueue(new OneTimeWorkRequest.Builder(MysplashMuzeiWorker.class) .setConstraints(new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build()) .build()); }
WorkManager.getInstance().enqueueUniqueWork("AutoCloseChangesets", REPLACE, new OneTimeWorkRequest.Builder(ChangesetAutoCloserWorker.class) .setInitialDelay(CLOSE_CHANGESETS_AFTER_INACTIVITY_OF, TimeUnit.MILLISECONDS) .setConstraints(new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build()) .build());
private WorkRequest buildWorkRequest(Constraints constraints) { OneTimeWorkRequest.Builder builder= new OneTimeWorkRequest.Builder(DownloadWorker.class) .setInputData(new Data.Builder() .putString(DownloadWorker.KEY_URL, "https://commonsware.com/Android/Android-1_0-CC.pdf") .putString(DownloadWorker.KEY_FILENAME, "oldbook.pdf") .build()) .addTag("download"); if (constraints!=null) { builder.setConstraints(constraints); } return builder.build(); } }
@Override public void plantOneOff(JobRequest request) { if (request.isTransient()) { TransientBundleHolder.putBundle(request.getJobId(), request.getTransientExtras()); } OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(PlatformWorker.class) .setInitialDelay(request.getStartMs(), TimeUnit.MILLISECONDS) // don't use the average here, WorkManager will do the right thing .setConstraints(buildConstraints(request)) .addTag(createTag(request.getJobId())) .build(); // don't set the back-off criteria, android-job is handling this WorkManager workManager = getWorkManager(); if (workManager == null) { throw new JobProxyIllegalStateException("WorkManager is null"); } workManager.enqueue(workRequest); }
public void scheduleMqttPing(long keepAliveSeconds) { WorkRequest mqttPingWorkRequest = new PeriodicWorkRequest.Builder(MQTTKeepaliveWorker.class, keepAliveSeconds, TimeUnit.SECONDS) .addTag(PERIODIC_TASK_MQTT_KEEPALIVE) .setConstraints(anyNetworkConstraint) .setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.SECONDS) .build(); Timber.v("WorkManager queue task %s as %s with interval %s", PERIODIC_TASK_MQTT_KEEPALIVE,mqttPingWorkRequest.getId(), keepAliveSeconds); workManager.cancelAllWorkByTag(PERIODIC_TASK_MQTT_KEEPALIVE); workManager.enqueue(mqttPingWorkRequest); }
public List<WorkInfo> getWorkStatus(String tag) { try { return WorkManager.getInstance().getWorkInfosByTag(tag).get(); } catch (Exception e) { throw new RuntimeException(e); } } }
@NonNull @Override public Result doWork() { try { osmQuestChangesUpload.closeOpenChangesets(); } catch(OsmConnectionException e) { // wasn't able to connect to the server (i.e. connection timeout). Oh well, then, // never mind. Could also retry later with Result.retry() but the OSM API closes open // changesets after 1 hour anyway. } catch(OsmAuthorizationException e) { // the user may not be authorized yet (or not be authorized anymore) #283 // nothing we can do about here. He will have to reauthenticate when he next opens the app return Result.failure(); } return Result.success(); } }
@Override protected void after() { mManager.cancelAll(); mManager.destroy(); JobConfig.reset(); WorkManager.getInstance().cancelAllWork(); }
@Override public boolean isPlatformJobScheduled(JobRequest request) { List<WorkInfo> infos = getWorkStatusBlocking(createTag(request.getJobId())); if (infos == null || infos.isEmpty()) { return false; } WorkInfo.State state = infos.get(0).getState(); return state == WorkInfo.State.ENQUEUED; }
@Override protected void before() { Context context = InstrumentationRegistry.getTargetContext(); Executor executor = new Executor() { @Override public void execute(@NonNull Runnable command) { command.run(); } }; WorkManagerTestInitHelper.initializeTestWorkManager(context, new Configuration.Builder().setExecutor(executor).build()); JobConfig.setJobReschedulePause(0, TimeUnit.MILLISECONDS); JobConfig.setSkipJobReschedule(true); JobConfig.forceApi(JobApi.WORK_MANAGER); mManager = JobManager.create(context); mManager.cancelAll(); }
public void runJob(String tag) { WorkManagerTestInitHelper.getTestDriver().setInitialDelayMet(getWorkStatus(tag).get(0).getId()); }
private List<WorkInfo> getWorkStatusBlocking(String tag) { WorkManager workManager = getWorkManager(); if (workManager == null) { return Collections.emptyList(); } try { return workManager.getWorkInfosByTag(tag).get(5, TimeUnit.SECONDS); } catch (Exception e) { return Collections.emptyList(); } } }
@Override public void cancel(int jobId) { WorkManager workManager = getWorkManager(); if (workManager == null) { return; } workManager.cancelAllWorkByTag(createTag(jobId)); TransientBundleHolder.cleanUpBundle(jobId); }
public void scheduleMqttReconnect() { WorkRequest mqttReconnectWorkRequest = new PeriodicWorkRequest.Builder(MQTTReconnectWorker.class, MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS) .addTag(PERIODIC_TASK_MQTT_RECONNECT) .setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.SECONDS) .setConstraints(anyNetworkConstraint) .build(); Timber.v("WorkManager queue task %s as %s", PERIODIC_TASK_MQTT_RECONNECT, mqttReconnectWorkRequest.getId()); workManager.cancelAllWorkByTag(PERIODIC_TASK_MQTT_RECONNECT); workManager.enqueue(mqttReconnectWorkRequest); }
@SuppressWarnings("ConstantConditions") private void testConstraints(JobRequest.Builder builder) { int jobId = builder .setRequiredNetworkType(JobRequest.NetworkType.METERED) .setRequiresBatteryNotLow(true) .setRequiresCharging(true) .setRequiresDeviceIdle(true) .setRequiresStorageNotLow(true) .build() .schedule(); 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().cancelAllForTag(TAG); assertThat(mWorkManagerRule.getWorkStatus(tag).get(0).getState()).isEqualTo(WorkInfo.State.CANCELLED); } }
@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(); }
mWorkManagerRule.runJob(tag); WorkInfo.State state = mWorkManagerRule.getWorkStatus(tag).get(0).getState();