private void encodeTrigger(JobTrigger trigger, Bundle data) { if (trigger == Trigger.NOW) { data.putInt( prefix + BundleProtocol.PACKED_PARAM_TRIGGER_TYPE, BundleProtocol.TRIGGER_TYPE_IMMEDIATE); } else if (trigger instanceof JobTrigger.ExecutionWindowTrigger) { JobTrigger.ExecutionWindowTrigger t = (JobTrigger.ExecutionWindowTrigger) trigger; data.putInt( prefix + BundleProtocol.PACKED_PARAM_TRIGGER_TYPE, BundleProtocol.TRIGGER_TYPE_EXECUTION_WINDOW); data.putInt(prefix + BundleProtocol.PACKED_PARAM_TRIGGER_WINDOW_START, t.getWindowStart()); data.putInt(prefix + BundleProtocol.PACKED_PARAM_TRIGGER_WINDOW_END, t.getWindowEnd()); } else if (trigger instanceof JobTrigger.ContentUriTrigger) { data.putInt( prefix + BundleProtocol.PACKED_PARAM_TRIGGER_TYPE, BundleProtocol.TRIGGER_TYPE_CONTENT_URI); ContentUriTrigger uriTrigger = (ContentUriTrigger) trigger; String jsonTrigger = convertObservedUrisToJsonString(uriTrigger.getUris()); data.putString(prefix + BundleProtocol.PACKED_PARAM_OBSERVED_URI, jsonTrigger); } else { throw new IllegalArgumentException("Unsupported trigger."); } }
/** * Creates a new ExecutionWindow based on the provided time interval. * * @param windowStart The earliest time (in seconds) the job should be considered eligible to run. * Calculated from when the job was scheduled (for new jobs) or last run (for recurring jobs). * @param windowEnd The latest time (in seconds) the job should be run in an ideal world. * Calculated in the same way as {@code windowStart}. * @throws IllegalArgumentException if the provided parameters are too restrictive. */ @NonNull public static JobTrigger.ExecutionWindowTrigger executionWindow(int windowStart, int windowEnd) { if (windowStart < 0) { throw new IllegalArgumentException("Window start can't be less than 0"); } else if (windowEnd < windowStart) { throw new IllegalArgumentException("Window end can't be less than window start"); } return new JobTrigger.ExecutionWindowTrigger(windowStart, windowEnd); }
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); } } }
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 }
private static long scheduleTime(JobTrigger trigger) { if (trigger instanceof JobTrigger.ImmediateTrigger) { return System.currentTimeMillis(); } else if (trigger instanceof JobTrigger.ExecutionWindowTrigger) { JobTrigger.ExecutionWindowTrigger executionWindowTrigger = (JobTrigger.ExecutionWindowTrigger) trigger; return System.currentTimeMillis() + (executionWindowTrigger.getWindowStart() * 1000L); } else { return -1; } } }
static void assertTriggersEqual(JobTrigger inTrigger, JobTrigger outTrigger) { assertEquals("", inTrigger.getClass(), outTrigger.getClass()); if (inTrigger instanceof JobTrigger.ExecutionWindowTrigger) { assertEquals( "getTrigger().getWindowStart()", ((JobTrigger.ExecutionWindowTrigger) inTrigger).getWindowStart(), ((JobTrigger.ExecutionWindowTrigger) outTrigger).getWindowStart()); assertEquals( "getTrigger().getWindowEnd()", ((JobTrigger.ExecutionWindowTrigger) inTrigger).getWindowEnd(), ((JobTrigger.ExecutionWindowTrigger) outTrigger).getWindowEnd()); } else if (inTrigger == Trigger.NOW) { assertEquals(inTrigger, outTrigger); } else if (inTrigger instanceof JobTrigger.ContentUriTrigger) { assertEquals( "Collection of URIs", ((ContentUriTrigger) inTrigger).getUris(), ((ContentUriTrigger) outTrigger).getUris()); } else { fail("Unknown Trigger class: " + inTrigger.getClass()); } }
@Test public void testWriteToBundle_triggers() { // immediate Bundle b = writer.writeToBundle( initializeDefaultBuilder().setTrigger(Trigger.NOW).build(), new Bundle()); assertEquals("window_start", 0, b.getLong("window_start")); assertEquals("window_end", 1, b.getLong("window_end")); // execution window (oneoff) JobTrigger.ExecutionWindowTrigger t = Trigger.executionWindow(631, 978); b = writer.writeToBundle(initializeDefaultBuilder().setTrigger(t).build(), new Bundle()); assertEquals("window_start", t.getWindowStart(), b.getLong("window_start")); assertEquals("window_end", t.getWindowEnd(), b.getLong("window_end")); // execution window (periodic) b = writer.writeToBundle( initializeDefaultBuilder().setRecurring(true).setTrigger(t).build(), new Bundle()); assertEquals("period", t.getWindowEnd(), b.getLong("period")); assertEquals("period_flex", t.getWindowEnd() - t.getWindowStart(), b.getLong("period_flex")); }
private static void writeExecutionWindowTriggerToBundle( JobParameters job, Bundle b, JobTrigger.ExecutionWindowTrigger trigger) { b.putInt(REQUEST_PARAM_TRIGGER_TYPE, BundleProtocol.TRIGGER_TYPE_EXECUTION_WINDOW); if (job.isRecurring()) { b.putLong(REQUEST_PARAM_TRIGGER_WINDOW_PERIOD, trigger.getWindowEnd()); b.putLong( REQUEST_PARAM_TRIGGER_WINDOW_FLEX, trigger.getWindowEnd() - trigger.getWindowStart()); } else { b.putLong(REQUEST_PARAM_TRIGGER_WINDOW_START, trigger.getWindowStart()); b.putLong(REQUEST_PARAM_TRIGGER_WINDOW_END, trigger.getWindowEnd()); } }
@Test public void testNewInstance_withValidWindow() throws Exception { JobTrigger.ExecutionWindowTrigger trigger = Trigger.executionWindow(0, 60); assertEquals(0, trigger.getWindowStart()); assertEquals(60, trigger.getWindowEnd()); }