/** * Stops the job if it is running. * * <p>Needed to avoid possibility of sending job result before the reschedule request is received * by Google Play services. */ static void onSchedule(Job job) { // Stop if running synchronized (callbacks) { SimpleArrayMap<String, JobCallback> jobs = callbacks.get(job.getService()); if (jobs == null) { // not running return; } JobCallback jobCallback = jobs.get(job.getTag()); if (jobCallback == null) { // not running return; } } JobInvocation key = new JobInvocation.Builder() .setTag(job.getTag()) .setService(job.getService()) .setTrigger(job.getTrigger()) .build(); ExecutionDelegator.stopJob(key, false /* must not send the result */); } }
/** * Builds the Job, using the settings provided so far. * * @throws ValidationEnforcer.ValidationException */ @NonNull public Job build() { validator.ensureValid(this); return new Job(this); }
@Override public int schedule(@NonNull Job job) { Log.i("TrackingBackend", "beginning schedule loop"); synchronized (mStore) { final Iterator<JobHistory> it = mStore.iterator(); while (it.hasNext()) { JobParameters j = it.next().job; if (j.getTag().equals(job.getTag()) && j.getService().equals(job.getService())) { it.remove(); } } mStore.add(new JobHistory(job)); } Log.i("TrackingBackend", "ending schedule loop"); return mDriver.schedule(job); }
private void verifyJobScheduled(Job job, int scheduled, String expectedType) { assertThat(job).isNotNull(); if (scheduled <= 0) { assertThat(job.getTrigger()).isInstanceOf(JobTrigger.ImmediateTrigger.class); } else { assertThat(job.getTrigger()).isInstanceOf(JobTrigger.ExecutionWindowTrigger.class); JobTrigger.ExecutionWindowTrigger trigger = (JobTrigger.ExecutionWindowTrigger) job.getTrigger(); JobTrigger.ExecutionWindowTrigger testTrigger = Trigger.executionWindow(scheduled, scheduled); assertThat(trigger.getWindowEnd()).isEqualTo(testTrigger.getWindowEnd()); assertThat(trigger.getWindowStart()).isEqualTo(testTrigger.getWindowStart()); } assertThat(job.getTag()).isEqualTo(expectedType); if ("BROADCAST_INTENT".equals(expectedType)) { assertThat(job.getConstraints()).isEmpty(); } else { assertThat(job.getConstraints()).asList().contains(Constraint.ON_ANY_NETWORK); } } }
@Override public int schedule(@NonNull Job job) { if (LOCAL_LOGV) { Log.v(TAG, "AlarmManagerDriver: schedule " +job); } final JobTrigger trigger = job.getTrigger(); final long atTime = scheduleTime(trigger); if (atTime > 0) { alarmManager.set(RTC_WAKEUP, atTime, createPendingIntent(context, BackupType.fromName(job.getTag()))); return SCHEDULE_RESULT_SUCCESS; } else { Log.w(TAG, "unsupported trigger for job "+job); return SCHEDULE_RESULT_UNSUPPORTED_TRIGGER; } }
private Job schedule(Job job) { if (LOCAL_LOGV) { Log.v(TAG, "schedule job " + job.getTag()); } final int result = firebaseJobDispatcher.schedule(job); if (result == SCHEDULE_RESULT_SUCCESS) { return job; } else { Log.w(TAG, "Error scheduling job: "+result); return null; } }
private void scheduleNextBackup(BackupState state) { if (state.backupType == REGULAR && getPreferences().isUseOldScheduler()) { final Job nextSync = getBackupJobs().scheduleRegular(); if (nextSync != null) { JobTrigger.ExecutionWindowTrigger trigger = (JobTrigger.ExecutionWindowTrigger) nextSync.getTrigger(); Date date = new Date(System.currentTimeMillis() + (trigger.getWindowStart() * 1000)); appLog(R.string.app_log_scheduled_next_sync, DateFormat.format("kk:mm", date)); } else { appLog(R.string.app_log_no_next_sync); } } // else job already persisted }
@Nullable private Job schedule(int inSeconds, BackupType backupType, boolean force) { if (LOCAL_LOGV) { Log.v(TAG, "scheduleBackup(" + inSeconds + ", " + backupType + ", " + force + ")"); } if (force || (preferences.isAutoBackupEnabled() && inSeconds > 0)) { final Job job = createJob(inSeconds, backupType); if (schedule(job) != null) { if (LOCAL_LOGV) { Log.v(TAG, "Scheduled backup job " + job + ", tag: " + job.getTag() + " due " + "" + (inSeconds > 0 ? "in " + inSeconds + " seconds" : "now")); } } return job; } else { if (LOCAL_LOGV) Log.v(TAG, "Not scheduling backup because auto backup is disabled."); return null; } }
@Test public void shouldScheduleContentUriTriggerForSMS() throws Exception { Job job = subject.scheduleContentTriggerJob(); assertThat(job.getTrigger()).isInstanceOf(JobTrigger.ContentUriTrigger.class); JobTrigger.ContentUriTrigger contentUriTrigger = (JobTrigger.ContentUriTrigger) job.getTrigger(); assertThat(contentUriTrigger.getUris()).containsExactly(new ObservedUri(SMS_PROVIDER, FLAG_NOTIFY_FOR_DESCENDANTS)); }
@Test public void shouldScheduleContentUriTriggerForCallLogIfEnabled() throws Exception { when(preferences.isCallLogBackupAfterCallEnabled()).thenReturn(true); when(dataTypePreferences.isBackupEnabled(CALLLOG)).thenReturn(true); Job job = subject.scheduleContentTriggerJob(); assertThat(job.getTrigger()).isInstanceOf(JobTrigger.ContentUriTrigger.class); JobTrigger.ContentUriTrigger contentUriTrigger = (JobTrigger.ContentUriTrigger) job.getTrigger(); assertThat(contentUriTrigger.getUris()).containsExactly( new ObservedUri(SMS_PROVIDER, FLAG_NOTIFY_FOR_DESCENDANTS), new ObservedUri(CALLLOG_PROVIDER, FLAG_NOTIFY_FOR_DESCENDANTS) ); }