/** * @return The unique ID for this {@link Job}. * @see JobRequest#getJobId() */ public int getId() { return mRequest.getJobId(); }
public void remove(JobRequest request) { remove(request, request.getJobId()); }
protected String createTag(JobRequest request) { return createTag(request.getJobId()); }
private void updateRequestInCache(JobRequest request) { mCacheId.put(request.getJobId(), request); }
@Override protected boolean isJobInfoScheduled(@Nullable JobInfo info, @NonNull JobRequest request) { return info != null && info.getId() == request.getJobId(); }
@SuppressWarnings("SimplifiableIfStatement") protected boolean isJobInfoScheduled(@Nullable JobInfo info, @NonNull JobRequest request) { boolean correctInfo = info != null && info.getId() == request.getJobId(); if (!correctInfo) { return false; } return !request.isTransient() || TransientBundleCompat.isScheduled(mContext, request.getJobId()); }
public static void persistBundle(@NonNull Context context, @NonNull JobRequest request) { Intent intent = PlatformAlarmServiceExact.createIntent(context, request.getJobId(), request.getTransientExtras()); PendingIntent pendingIntent = PendingIntent.getService(context, request.getJobId(), intent, PendingIntent.FLAG_UPDATE_CURRENT); long when = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1000); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.setExact(AlarmManager.RTC, when, pendingIntent); }
@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 public String toString() { return "request{id=" + getJobId() + ", tag=" + getTag() + ", transient=" + isTransient() + '}'; }
public void update(JobRequest request, ContentValues contentValues) { SQLiteDatabase database = null; mLock.writeLock().lock(); try { updateRequestInCache(request); database = getDatabase(); database.update(JOB_TABLE_NAME, contentValues, COLUMN_ID + "=?", new String[]{String.valueOf(request.getJobId())}); } catch (Exception e) { // catch the exception here and keep what's in the database CAT.e(e, "could not update %s", request); } finally { closeDatabase(database); mLock.writeLock().unlock(); } }
public synchronized Future<Job.Result> execute(@NonNull Context context, @NonNull JobRequest request, @Nullable Job job, @NonNull Bundle transientExtras) { mStartingRequests.remove(request); if (job == null) { CAT.w("JobCreator returned null for tag %s", request.getTag()); return null; } if (job.isFinished()) { throw new IllegalStateException(String.format(Locale.ENGLISH, "Job for tag %s was already run, a creator should always create a new Job instance", request.getTag())); } job.setContext(context).setRequest(request, transientExtras); CAT.i("Executing %s, context %s", request, context.getClass().getSimpleName()); mJobs.put(request.getJobId(), job); return JobConfig.getExecutorService().submit(new JobCallable(job)); }
@Override public void delete(JobRequest request) { executeJob(request.getJobId(), Job.Result.SUCCESS); } });
protected PendingIntent getPendingIntent(JobRequest request, int flags) { return getPendingIntent(request.getJobId(), request.isExact(), request.getTransientExtras(), flags); }
@Override public boolean isPlatformJobScheduled(JobRequest request) { try { return isJobInfoScheduled(getJobScheduler().getPendingJob(request.getJobId()), request); } catch (Exception e) { mCat.e(e); return false; } }
@Override public void delete(JobRequest request) { manager().cancel(request.getJobId()); } });
private boolean cancelInner(@Nullable JobRequest request) { if (request != null) { CAT.i("Found pending job %s, canceling", request); getJobProxy(request.getJobApi()).cancel(request.getJobId()); getJobStorage().remove(request); request.setScheduledAt(0); // reset value return true; } else { return false; } }
protected JobInfo.Builder createBaseBuilder(JobRequest request, boolean allowPersisting) { JobInfo.Builder builder = new JobInfo.Builder(request.getJobId(), new ComponentName(mContext, PlatformJobService.class)) .setRequiresCharging(request.requiresCharging()) .setRequiresDeviceIdle(request.requiresDeviceIdle()) .setRequiredNetworkType(convertNetworkType(request.requiredNetworkType())) .setPersisted(allowPersisting && !request.isTransient() && JobUtil.hasBootPermission(mContext)); return setTransientBundle(request, builder); }
@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); }
@Test public void testFlex() { JobConfig.forceApi(JobApi.V_14); long interval = JobRequest.MIN_INTERVAL * 5; long flex = JobRequest.MIN_FLEX * 5; JobRequest request = getBuilder() .setPeriodic(interval, flex) .build(); JobManager.instance().schedule(request); assertThat(request.getJobId()).isGreaterThan(0); assertThat(request.getTag()).isEqualTo(DummyJobs.SuccessJob.TAG); assertThat(request.getIntervalMs()).isEqualTo(interval); assertThat(request.getFlexMs()).isEqualTo(flex); assertThat(request.isPeriodic()).isTrue(); assertThat(request.isFlexSupport()).isTrue(); }
@Test public void testSameIdAfterCancel() { JobRequest request = DummyJobs.createOneOff(); int jobId = request.getJobId(); assertThat(request.getScheduledAt()).isEqualTo(0L); manager().schedule(request); assertThat(request.getScheduledAt()).isGreaterThan(0L); JobRequest requestNew = request.cancelAndEdit().build(); assertThat(request.getScheduledAt()).isEqualTo(0L); int newId = requestNew.schedule(); assertThat(newId).isEqualTo(jobId); assertThat(request.getScheduledAt()).isEqualTo(0L); assertThat(requestNew.getScheduledAt()).isGreaterThan(0L); }