/** * 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 */); } }
@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 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 }
@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) ); }
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); } } }