@NonNull private static List<ObservedUri> convertJsonToObservedUris(@NonNull String contentUrisJson) { List<ObservedUri> uris = new ArrayList<>(); try { JSONObject json = new JSONObject(contentUrisJson); JSONArray jsonFlags = json.getJSONArray(JSON_URI_FLAGS); JSONArray jsonUris = json.getJSONArray(JSON_URIS); int length = jsonFlags.length(); for (int i = 0; i < length; i++) { int flags = jsonFlags.getInt(i); String uri = jsonUris.getString(i); uris.add(new ObservedUri(Uri.parse(uri), flags)); } } catch (JSONException e) { throw new RuntimeException(e); } return uris; } }
@NonNull private static String convertObservedUrisToJsonString(@NonNull List<ObservedUri> uris) { JSONObject contentUris = new JSONObject(); JSONArray jsonFlags = new JSONArray(); JSONArray jsonUris = new JSONArray(); for (ObservedUri uri : uris) { jsonFlags.put(uri.getFlags()); jsonUris.put(uri.getUri()); } try { contentUris.put(JSON_URI_FLAGS, jsonFlags); contentUris.put(JSON_URIS, jsonUris); } catch (JSONException e) { throw new RuntimeException(e); } return contentUris.toString(); }
static ContentUriTrigger getContentUriTrigger() { ObservedUri contactUri = new ObservedUri(ContactsContract.AUTHORITY_URI, Flags.FLAG_NOTIFY_FOR_DESCENDANTS); ObservedUri imageUri = new ObservedUri(Media.EXTERNAL_CONTENT_URI, 0); return Trigger.contentUriTrigger(Arrays.asList(contactUri, imageUri)); }
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); }
@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()); } }
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 testValidate_trigger() throws Exception { Map<JobTrigger, String> testCases = new HashMap<>(); testCases.put(Trigger.NOW, null); testCases.put(Trigger.executionWindow(0, 100), null); ContentUriTrigger contentUriTrigger = Trigger.contentUriTrigger( Arrays.asList( new ObservedUri( ContactsContract.AUTHORITY_URI, Flags.FLAG_NOTIFY_FOR_DESCENDANTS))); testCases.put(contentUriTrigger, null); for (Entry<JobTrigger, String> testCase : testCases.entrySet()) { List<String> validationErrors = validator.validate(testCase.getKey()); if (testCase.getValue() == null) { assertNull("Expected no validation errors for trigger", validationErrors); } else { assertTrue( "Expected validation errors to contain \"" + testCase.getValue() + "\"", validationErrors.contains(testCase.getValue())); } } }
@Test public void onJobFinished_notRecurringContentJob_sendResult() { jobInvocationBuilder.setTrigger( Trigger.contentUriTrigger(Arrays.asList(new ObservedUri(Contacts.CONTENT_URI, 0)))); JobInvocation jobInvocation = receiver.prepareJob(callbackMock, TestUtil.getBundleForContentJobExecution()); receiver.onJobFinished(jobInvocation, JobService.RESULT_SUCCESS); verify(callbackMock).jobFinished(JobService.RESULT_SUCCESS); verifyZeroInteractions(driverMock); }
@Test public void testWriteToBundle_contentUriTrigger() { ObservedUri observedUri = new ObservedUri(ContactsContract.AUTHORITY_URI, Flags.FLAG_NOTIFY_FOR_DESCENDANTS); ContentUriTrigger contentUriTrigger = Trigger.contentUriTrigger(Arrays.asList(observedUri)); Bundle bundle = writer.writeToBundle( initializeDefaultBuilder().setTrigger(contentUriTrigger).build(), new Bundle()); Uri[] uris = (Uri[]) bundle.getParcelableArray(BundleProtocol.PACKED_PARAM_CONTENT_URI_ARRAY); int[] flags = bundle.getIntArray(BundleProtocol.PACKED_PARAM_CONTENT_URI_FLAGS_ARRAY); assertTrue("Array size", uris.length == flags.length && flags.length == 1); assertEquals( BundleProtocol.PACKED_PARAM_CONTENT_URI_ARRAY, ContactsContract.AUTHORITY_URI, uris[0]); assertEquals( BundleProtocol.PACKED_PARAM_CONTENT_URI_FLAGS_ARRAY, Flags.FLAG_NOTIFY_FOR_DESCENDANTS, flags[0]); }
int flags = notifyForDescendants.isChecked() ? ObservedUri.Flags.FLAG_NOTIFY_FOR_DESCENDANTS : 0; ObservedUri observedUri = new ObservedUri(uri, flags); builder.setTrigger(Trigger.contentUriTrigger(Arrays.asList(observedUri))); break;
private @NonNull List<ObservedUri> observedUris() { List<ObservedUri> observedUris = new ArrayList<ObservedUri>(); observedUris.add(new ObservedUri(SMS_PROVIDER, FLAG_NOTIFY_FOR_DESCENDANTS)); if (preferences.getDataTypePreferences().isBackupEnabled(DataType.CALLLOG) && preferences.isCallLogBackupAfterCallEnabled()) { observedUris.add(new ObservedUri(CALLLOG_PROVIDER, FLAG_NOTIFY_FOR_DESCENDANTS)); } return observedUris; }
@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) ); }
@Test public void testScheduleJobWithUnknownTrigger() throws Exception { final Job job = jobBuilder() .setTrigger(Trigger.contentUriTrigger(Collections.singletonList(new ObservedUri(Uri.parse("foo://bar"), 0)))) .build(); final int result = subject.schedule(job); assertThat(result).isEqualTo(SCHEDULE_RESULT_UNSUPPORTED_TRIGGER); }
@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)); }