@Override public void delete(String trashFolder) throws MessagingException { getFolder().delete(Collections.singletonList(this), trashFolder); } }
private void removeMessages(List<String> removeUids) { List<Message> messages = new ArrayList<>(removeUids.size()); try { List<ImapMessage> existingMessages = getMessagesFromUids(removeUids); for (Message existingMessage : existingMessages) { needsPoll = true; msgSeqUidMap.clear(); String existingUid = existingMessage.getUid(); Timber.w("Message with UID %s still exists on server, not expunging", existingUid); removeUids.remove(existingUid); } for (String uid : removeUids) { ImapMessage message = new ImapMessage(uid, ImapFolderPusher.this); try { message.setFlagInternal(Flag.DELETED, true); } catch (MessagingException me) { Timber.e("Unable to set DELETED flag on message %s", message.getUid()); } messages.add(message); } pushReceiver.messagesRemoved(ImapFolderPusher.this, messages); } catch (Exception e) { Timber.e("Cannot remove EXPUNGEd messages"); } }
String flag = flags.getString(i); if (flag.equalsIgnoreCase("\\Deleted")) { message.setFlagInternal(Flag.DELETED, true); } else if (flag.equalsIgnoreCase("\\Answered")) { message.setFlagInternal(Flag.ANSWERED, true); } else if (flag.equalsIgnoreCase("\\Seen")) { message.setFlagInternal(Flag.SEEN, true); } else if (flag.equalsIgnoreCase("\\Flagged")) { message.setFlagInternal(Flag.FLAGGED, true); } else if (flag.equalsIgnoreCase("$Forwarded")) { message.setFlagInternal(Flag.FORWARDED, true); message.setFlagInternal(Flag.DRAFT, true); message.setInternalDate(internalDate); message.setSize(size); Timber.d(e, "Error handling message for %s", getLogId()); message.setBody(null);
private void syncMessages(int end) throws MessagingException { long oldUidNext = getOldUidNext(); List<ImapMessage> messageList = getMessages(end, end, null, true, null); if (messageList != null && messageList.size() > 0) { long newUid = Long.parseLong(messageList.get(0).getUid()); if (K9MailLib.isDebug()) { Timber.i("Got newUid %s for message %d on %s", newUid, end, getLogId()); } long startUid = oldUidNext; if (startUid < newUid - 10) { startUid = newUid - 10; } if (startUid < 1) { startUid = 1; } if (newUid >= startUid) { if (K9MailLib.isDebug()) { Timber.i("Needs sync from uid %d to %d for %s", startUid, newUid, getLogId()); } List<Message> messages = new ArrayList<>(); for (long uid = startUid; uid <= newUid; uid++) { ImapMessage message = new ImapMessage(Long.toString(uid), ImapFolderPusher.this); messages.add(message); } if (!messages.isEmpty()) { pushReceiver.messagesArrived(ImapFolderPusher.this, messages); } } } }
private ImapMessage createImapMessage(String uid) { ImapMessage message = mock(ImapMessage.class); when(message.getUid()).thenReturn(uid); return message; }
@Test public void fetch_withFlagsFetchProfile_shouldSetFlags() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RO); folder.open(OPEN_MODE_RO); List<ImapMessage> messages = createImapMessages("1"); FetchProfile fetchProfile = createFetchProfile(Item.FLAGS); when(imapConnection.readResponse(nullable(ImapResponseCallback.class))) .thenReturn(createImapResponse("* 1 FETCH (FLAGS (\\Seen) UID 1)")) .thenReturn(createImapResponse("x OK")); folder.fetch(messages, fetchProfile, null); ImapMessage imapMessage = messages.get(0); verify(imapMessage).setFlagInternal(Flag.SEEN, true); }
@Override public ImapMessage getMessage(String uid) throws MessagingException { return new ImapMessage(uid, this); }
@Override public Object foundLiteral(ImapResponse response, FixedLengthInputStream literal) throws MessagingException, IOException { if (response.getTag() == null && ImapResponseParser.equalsIgnoreCase(response.get(1), "FETCH")) { ImapList fetchList = (ImapList)response.getKeyedValue("FETCH"); String uid = fetchList.getKeyedString("UID"); ImapMessage message = (ImapMessage) mMessageMap.get(uid); message.parse(literal); // Return placeholder object return 1; } return null; } }
@Test public void fetch_withStructureFetchProfile_shouldSetContentType() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RO); folder.open(OPEN_MODE_RO); String bodyStructure = "(\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 2279 48)"; when(imapConnection.readResponse(nullable(ImapResponseCallback.class))) .thenReturn(createImapResponse("* 1 FETCH (BODYSTRUCTURE "+bodyStructure+" UID 1)")) .thenReturn(createImapResponse("x OK")); List<ImapMessage> messages = createImapMessages("1"); FetchProfile fetchProfile = createFetchProfile(Item.STRUCTURE); folder.fetch(messages, fetchProfile, null); verify(messages.get(0)).setHeader(MimeHeader.HEADER_CONTENT_TYPE, "text/plain;\r\n CHARSET=\"US-ASCII\""); }
((ImapMessage) part).setSize(size);
private List<ImapMessage> getMessages(SearchResponse searchResponse, MessageRetrievalListener<ImapMessage> listener) throws MessagingException { List<ImapMessage> messages = new ArrayList<>(); List<Long> uids = searchResponse.getNumbers(); // Sort the uids in numerically decreasing order // By doing it in decreasing order, we ensure newest messages are dealt with first // This makes the most sense when a limit is imposed, and also prevents UI from going // crazy adding stuff at the top. Collections.sort(uids, Collections.reverseOrder()); for (int i = 0, count = uids.size(); i < count; i++) { String uid = uids.get(i).toString(); if (listener != null) { listener.messageStarted(uid, i, count); } ImapMessage message = new ImapMessage(uid, this); messages.add(message); if (listener != null) { listener.messageFinished(message, i, count); } } return messages; }
String bodyString = (String) literal; InputStream bodyStream = new ByteArrayInputStream(bodyString.getBytes()); imapMessage.parse(bodyStream); } else if (literal instanceof Integer) {
@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(); } }
private void notifyMessagesArrived(long startUid, long uidNext) { if (K9MailLib.isDebug()) { Timber.i("Needs sync from uid %d to %d for %s", startUid, uidNext, getLogId()); } int count = (int) (uidNext - startUid); List<Message> messages = new ArrayList<>(count); for (long uid = startUid; uid < uidNext; uid++) { ImapMessage message = new ImapMessage(Long.toString(uid), ImapFolderPusher.this); messages.add(message); } pushReceiver.messagesArrived(ImapFolderPusher.this, messages); }