@Override public void onSend(MasterSecret masterSecret) throws MmsException, IOException, NoSuchMessageException { MmsDatabase database = DatabaseFactory.getMmsDatabase(context); SendReq message = database.getOutgoingMessage(masterSecret, messageId); try { deliver(masterSecret, message); database.markAsPush(messageId); database.markAsSecure(messageId); database.markAsSent(messageId, "push".getBytes(), 0); } catch (InvalidNumberException | RecipientFormattingException e) { Log.w(TAG, e); database.markAsSentFailed(messageId); notifyMediaMessageDeliveryFailed(context, messageId); } catch (EncapsulatedExceptions e) { Log.w(TAG, e); if (!e.getUnregisteredUserExceptions().isEmpty()) { database.markAsSentFailed(messageId); } for (UntrustedIdentityException uie : e.getUntrustedIdentityExceptions()) { IncomingIdentityUpdateMessage identityUpdateMessage = IncomingIdentityUpdateMessage.createFor( message.getTo()[0].getString(), uie.getIdentityKey()); DatabaseFactory.getEncryptingSmsDatabase(context) .insertMessageInbox(masterSecret, identityUpdateMessage); database.markAsSentFailed(messageId); } notifyMediaMessageDeliveryFailed(context, messageId); } }
private void handleSentResult(MasterSecret masterSecret, long messageId, int result) { try { EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context); SmsMessageRecord record = database.getMessage(masterSecret, messageId); switch (result) { case Activity.RESULT_OK: database.markAsSent(messageId); if (record != null && record.isEndSession()) { Log.w(TAG, "Ending session..."); SessionStore sessionStore = new TextSecureSessionStore(context, masterSecret); sessionStore.deleteAllSessions(record.getIndividualRecipient().getRecipientId()); SecurityEvent.broadcastSecurityUpdateEvent(context, record.getThreadId()); } break; case SmsManager.RESULT_ERROR_NO_SERVICE: case SmsManager.RESULT_ERROR_RADIO_OFF: Log.w(TAG, "Service connectivity problem, requeuing..."); ApplicationContext.getInstance(context) .getJobManager() .add(new SmsSendJob(context, messageId, record.getIndividualRecipient().getNumber())); break; default: database.markAsSentFailed(messageId); MessageNotifier.notifyMessageDeliveryFailed( context, record.getRecipients(), record.getThreadId()); } } catch (NoSuchMessageException e) { Log.w(TAG, e); } }
private void handleSendMessage(MasterSecret masterSecret, Intent intent) { long messageId = intent.getLongExtra("message_id", -1); UniversalTransport transport = new UniversalTransport(context, masterSecret); EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context); EncryptingSmsDatabase.Reader reader = null; SmsMessageRecord record; Log.w("SmsSender", "Sending message: " + messageId); try { if (messageId != -1) reader = database.getMessage(masterSecret, messageId); else reader = database.getOutgoingMessages(masterSecret); while (reader != null && (record = reader.getNext()) != null) { try { database.markAsSending(record.getId()); transport.deliver(record); } catch (UntrustedIdentityException e) { Log.w("SmsSender", e); IncomingIdentityUpdateMessage identityUpdateMessage = IncomingIdentityUpdateMessage.createFor(e.getE164Number(), e.getIdentityKey()); DatabaseFactory.getEncryptingSmsDatabase(context) .insertMessageInbox(masterSecret, identityUpdateMessage); DatabaseFactory.getSmsDatabase(context).markAsSentFailed(messageId); } catch (UndeliverableMessageException ude) { Log.w("SmsSender", ude); DatabaseFactory.getSmsDatabase(context).markAsSentFailed(messageId); } catch (RetryLaterException rle) { Log.w("SmsSender", rle); if (systemStateListener.isConnected()) scheduleQuickRetryAlarm(); else systemStateListener.registerForConnectivityChange(); } } } finally { if (reader != null) reader.close(); } }
private Pair<Long, Long> storeMessage( MasterSecretUnion masterSecret, IncomingTextMessage message) { EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context); Pair<Long, Long> messageAndThreadId; if (message.isSecureMessage()) { IncomingTextMessage placeholder = new IncomingTextMessage(message, ""); messageAndThreadId = database.insertMessageInbox(placeholder); database.markAsLegacyVersion(messageAndThreadId.first); } else { messageAndThreadId = database.insertMessageInbox(masterSecret, message); } return messageAndThreadId; }
private void handleDeliveredResult(long messageId, int result) { DatabaseFactory.getEncryptingSmsDatabase(context).markStatus(messageId, result); }