public long getMostRecentSyncedDate() { return Math.max(Math.max( getMaxSyncedDate(DataType.SMS), getMaxSyncedDate(DataType.CALLLOG)), getMaxSyncedDate(DataType.MMS)); }
private Query getQueryForCallLog(int max) { return new Query( Consts.CALLLOG_PROVIDER, CALLLOG_PROJECTION, String.format(Locale.ENGLISH, "%s > ?", CallLog.Calls.DATE), new String[] { String.valueOf(preferences.getMaxSyncedDate(CALLLOG)) }, max); }
private Query getQueryForSMS(@Nullable ContactGroupIds groupIds, int max) { return new Query(Consts.SMS_PROVIDER, null, String.format(Locale.ENGLISH, "%s > ? AND %s <> ? %s", Telephony.TextBasedSmsColumns.DATE, Telephony.TextBasedSmsColumns.TYPE, groupSelection(SMS, groupIds)).trim(), new String[] { String.valueOf(preferences.getMaxSyncedDate(SMS)), String.valueOf(Telephony.TextBasedSmsColumns.MESSAGE_TYPE_DRAFT) }, max); }
private Query getQueryForMMS(@Nullable ContactGroupIds group, int max) { long maxSynced = preferences.getMaxSyncedDate(MMS); if (maxSynced > 0) { // NB: max synced date is stored in seconds since epoch in database maxSynced = (long) (maxSynced / 1000d); } return new Query( Consts.MMS_PROVIDER, null, String.format(Locale.ENGLISH, "%s > ? AND %s <> ? %s", Telephony.BaseMmsColumns.DATE, Telephony.BaseMmsColumns.MESSAGE_TYPE, groupSelection(DataType.MMS, group)).trim(), new String[] { String.valueOf(maxSynced), MmsConsts.DELIVERY_REPORT }, max); }
private void importSms(final Message message) throws IOException, MessagingException { if (LOCAL_LOGV) Log.v(TAG, "importSms(" + message + ")"); final ContentValues values = converter.messageToContentValues(message); final Integer type = values.getAsInteger(Telephony.TextBasedSmsColumns.TYPE); // only restore inbox messages and sent messages - otherwise sms might get sent on restore if (type != null && (type == Telephony.TextBasedSmsColumns.MESSAGE_TYPE_INBOX || type == Telephony.TextBasedSmsColumns.MESSAGE_TYPE_SENT) && !smsExists(values)) { final Uri uri = resolver.insert(Consts.SMS_PROVIDER, values); if (uri != null) { smsIds.add(uri.getLastPathSegment()); Long timestamp = values.getAsLong(Telephony.TextBasedSmsColumns.DATE); if (timestamp != null && preferences.getDataTypePreferences().getMaxSyncedDate(SMS) < timestamp) { preferences.getDataTypePreferences().setMaxSyncedDate(SMS, timestamp); } if (LOCAL_LOGV) Log.v(TAG, "inserted " + uri); } } else { if (LOCAL_LOGV) Log.d(TAG, "ignoring sms"); } }
@Before public void before() { initMocks(this); when(dataTypePreferences.getMaxSyncedDate(any(DataType.class))).thenReturn(-1L); builder = new BackupQueryBuilder(dataTypePreferences); }
private void updateLastBackupTimes() { for (DataType type : DataType.values()) { findPreference(type.backupEnabledPreference).setSummary( getLastSyncText(preferences.getDataTypePreferences().getMaxSyncedDate(type)) ); } }
@Test public void shouldBuildQueryForMMSWithSyncedDate() throws Exception { long nowInSecs = System.currentTimeMillis(); when(dataTypePreferences.getMaxSyncedDate(MMS)).thenReturn(nowInSecs); BackupQueryBuilder.Query query = builder.buildQueryForDataType(MMS, null, 200); assertThat(query.uri).isEqualTo(Uri.parse("content://mms")); assertThat(query.projection).isNull(); assertThat(query.selection).isEqualTo("date > ? AND m_type <> ?"); assertThat(query.selectionArgs).asList().containsExactly(String.valueOf(nowInSecs / 1000L), "134"); assertThat(query.sortOrder).isEqualTo("date LIMIT 200"); }
@Test public void shouldRestoreItems() throws Exception { Date now = new Date(); List<ImapMessage> messages = new ArrayList<ImapMessage>(); ContentValues values = new ContentValues(); values.put(Telephony.TextBasedSmsColumns.TYPE, Telephony.TextBasedSmsColumns.MESSAGE_TYPE_INBOX); values.put(Telephony.TextBasedSmsColumns.DATE, now.getTime()); ImapMessage mockMessage = mock(ImapMessage.class); when(mockMessage.getFolder()).thenReturn(folder); when(converter.getDataType(mockMessage)).thenReturn(DataType.SMS); when(converter.messageToContentValues(mockMessage)).thenReturn(values); messages.add(mockMessage); when(folder.getMessages(anyInt(), anyBoolean(), any(Date.class))).thenReturn(messages); when(resolver.insert(Consts.SMS_PROVIDER, values)).thenReturn(Uri.parse("content://sms/123")); task.doInBackground(config); verify(resolver).insert(Consts.SMS_PROVIDER, values); verify(resolver).delete(Uri.parse("content://sms/conversations/-1"), null, null); assertThat(service.getPreferences().getDataTypePreferences().getMaxSyncedDate(DataType.SMS)).isEqualTo(now.getTime()); assertThat(task.getSmsIds()).containsExactly("123"); verify(store).closeFolders(); } }