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 ContentUriTrigger based on the provided list of {@link ObservedUri}. * * @param uris The list of URIs to observe. The trigger will be available if a piece of content, * corresponding to any of provided URIs, is updated. * @throws IllegalArgumentException if provided list of URIs is null or empty. */ @NonNull public static JobTrigger.ContentUriTrigger contentUriTrigger(@NonNull List<ObservedUri> uris) { if (uris == null || uris.isEmpty()) { throw new IllegalArgumentException("Uris must not be null or empty."); } return new JobTrigger.ContentUriTrigger(uris); } }
@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) ); }
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()); } }
private View createViewForJob(JobParameters job) { TableLayout tableLayout = new TableLayout(this); addRow(tableLayout, "TAG = " + job.getTag()); addRow(tableLayout, "SERVICE = " + job.getService()); if (job.getTriggerReason() != null && job.getTrigger() instanceof JobTrigger.ContentUriTrigger) { ContentUriTrigger trigger = (ContentUriTrigger) job.getTrigger(); addRow(tableLayout, "OBSERVED URIs = "); for (ObservedUri uri : trigger.getUris()) { addRow( tableLayout, "URI = " + uri.getUri() + ", flags = " + Integer.toBinaryString(uri.getFlags())); } addRow(tableLayout, "TRIGGERED URIs = "); for (Uri uri : job.getTriggerReason().getTriggeredContentUris()) { addRow(tableLayout, uri.toString()); } } ScrollView scrollView = new ScrollView(this); scrollView.addView(tableLayout); return scrollView; }
@Test public void decodeIntentBundle() { Bundle bundle = new Bundle(); ContentUriTrigger uriTrigger = getContentUriTrigger(); Bundle encode = encodeContentUriJob(uriTrigger, coder); bundle.putBundle(GooglePlayJobWriter.REQUEST_PARAM_EXTRAS, encode); ArrayList<Uri> uris = new ArrayList<>(); uris.add(ContactsContract.AUTHORITY_URI); uris.add(Media.EXTERNAL_CONTENT_URI); bundle.putParcelableArrayList(BundleProtocol.PACKED_PARAM_TRIGGERED_URIS, uris); JobInvocation jobInvocation = coder.decodeIntentBundle(bundle); assertEquals(uris, jobInvocation.getTriggerReason().getTriggeredContentUris()); assertEquals("TAG", jobInvocation.getTag()); assertEquals(uriTrigger.getUris(), ((ContentUriTrigger) jobInvocation.getTrigger()).getUris()); assertEquals(TestJobService.class.getName(), jobInvocation.getService()); assertEquals( RetryStrategy.DEFAULT_EXPONENTIAL.getPolicy(), jobInvocation.getRetryStrategy().getPolicy()); } }
@Test public void constrains_valid() throws Exception { List<ObservedUri> uris = Arrays.asList(new ObservedUri(ContactsContract.AUTHORITY_URI, 0)); ContentUriTrigger uriTrigger = Trigger.contentUriTrigger(uris); assertEquals(uris, uriTrigger.getUris()); } }
@Test public void decode_contentUriTrigger() { ContentUriTrigger contentUriTrigger = TestUtil.getContentUriTrigger(); Bundle bundle = TestUtil.encodeContentUriJob(contentUriTrigger, coder); JobInvocation decode = coder.decode(bundle).build(); ContentUriTrigger trigger = (ContentUriTrigger) decode.getTrigger(); assertEquals(contentUriTrigger.getUris(), trigger.getUris()); }
private static void writeContentUriTriggerToBundle(Bundle data, ContentUriTrigger uriTrigger) { data.putInt(BundleProtocol.PACKED_PARAM_TRIGGER_TYPE, BundleProtocol.TRIGGER_TYPE_CONTENT_URI); int size = uriTrigger.getUris().size(); int[] flagsArray = new int[size]; Uri[] uriArray = new Uri[size]; for (int i = 0; i < size; i++) { ObservedUri uri = uriTrigger.getUris().get(i); flagsArray[i] = uri.getFlags(); uriArray[i] = uri.getUri(); } data.putIntArray(BundleProtocol.PACKED_PARAM_CONTENT_URI_FLAGS_ARRAY, flagsArray); data.putParcelableArray(BundleProtocol.PACKED_PARAM_CONTENT_URI_ARRAY, uriArray); }