From 04eafd5fab529f336d75e4740918bda3763baa95 Mon Sep 17 00:00:00 2001 From: Ruben Pollan Date: Sun, 13 Oct 2013 12:53:41 +0200 Subject: [PATCH] Allow to resend a failed message Add an option to the context menu of the message to resend it if it has failed. --- res/menu/conversation_context.xml | 4 +++ res/values/strings.xml | 1 + .../securesms/ConversationFragment.java | 26 ++++++++++++++++--- .../securesms/database/MmsDatabase.java | 5 ++++ .../securesms/service/MmsSender.java | 2 +- .../securesms/sms/MessageSender.java | 17 ++++++++++++ 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/res/menu/conversation_context.xml b/res/menu/conversation_context.xml index 5c5878f313..2b69aab6b3 100644 --- a/res/menu/conversation_context.xml +++ b/res/menu/conversation_context.xml @@ -11,4 +11,8 @@ + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 0999db8a58..ed7cd2cbec 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -496,6 +496,7 @@ Copy text Delete message Forward message + Resend message Start Secure Session diff --git a/src/org/thoughtcrime/securesms/ConversationFragment.java b/src/org/thoughtcrime/securesms/ConversationFragment.java index b6ae5f368a..2727ad6cd7 100644 --- a/src/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationFragment.java @@ -12,6 +12,7 @@ import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.text.ClipboardManager; import android.view.ContextMenu; +import android.view.MenuItem; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -24,6 +25,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.loaders.ConversationLoader; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.recipients.Recipients; +import org.thoughtcrime.securesms.sms.MessageSender; import java.sql.Date; import java.text.SimpleDateFormat; @@ -58,19 +60,23 @@ public class ConversationFragment extends SherlockListFragment menu.clear(); inflater.inflate(R.menu.conversation_context, menu); + + MessageRecord messageRecord = getMessageRecord(); + if (messageRecord.isFailed()) { + MenuItem resend = menu.findItem(R.id.menu_context_resend); + resend.setVisible(true); + } } @Override public boolean onContextItemSelected(android.view.MenuItem item) { - Cursor cursor = ((CursorAdapter)getListAdapter()).getCursor(); - ConversationItem conversationItem = (ConversationItem)(((ConversationAdapter)getListAdapter()).newView(getActivity(), cursor, null)); - MessageRecord messageRecord = conversationItem.getMessageRecord(); - + MessageRecord messageRecord = getMessageRecord(); switch(item.getItemId()) { case R.id.menu_context_copy: handleCopyMessage(messageRecord); return true; case R.id.menu_context_delete_message: handleDeleteMessage(messageRecord); return true; case R.id.menu_context_details: handleDisplayDetails(messageRecord); return true; case R.id.menu_context_forward: handleForwardMessage(messageRecord); return true; + case R.id.menu_context_resend: handleResendMessage(messageRecord); return true; } return false; @@ -82,6 +88,12 @@ public class ConversationFragment extends SherlockListFragment this.listener = (ConversationFragmentListener)activity; } + private MessageRecord getMessageRecord() { + Cursor cursor = ((CursorAdapter)getListAdapter()).getCursor(); + ConversationItem conversationItem = (ConversationItem)(((ConversationAdapter)getListAdapter()).newView(getActivity(), cursor, null)); + return conversationItem.getMessageRecord(); + } + public void reload(Recipients recipients, long threadId) { this.recipients = recipients; this.threadId = threadId; @@ -158,6 +170,12 @@ public class ConversationFragment extends SherlockListFragment startActivity(composeIntent); } + private void handleResendMessage(MessageRecord message) { + long messageId = message.getId(); + final Activity activity = getActivity(); + MessageSender.resend(activity, messageId, message.isMms()); + } + private void initializeResources() { this.masterSecret = (MasterSecret)this.getActivity().getIntent() .getParcelableExtra("master_secret"); diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index c2b50a0d78..2a22d042fb 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -230,6 +230,11 @@ public class MmsDatabase extends Database implements MmsSmsColumns { " WHERE " + ID + " = ?", new String[] {id + ""}); } + public void markAsSending(long messageId) { + updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE); + notifyConversationListeners(getThreadIdForMessage(messageId)); + } + public void markAsSentFailed(long messageId) { updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENT_FAILED_TYPE); notifyConversationListeners(getThreadIdForMessage(messageId)); diff --git a/src/org/thoughtcrime/securesms/service/MmsSender.java b/src/org/thoughtcrime/securesms/service/MmsSender.java index 6fa5b39037..a5a8b88277 100644 --- a/src/org/thoughtcrime/securesms/service/MmsSender.java +++ b/src/org/thoughtcrime/securesms/service/MmsSender.java @@ -78,7 +78,7 @@ public class MmsSender extends MmscProcessor { Log.w("MmsSender", me); if (messageId != -1) database.markAsSentFailed(messageId); - } + } } else if (intent.getAction().equals(SendReceiveService.SEND_MMS_CONNECTIVITY_ACTION)) { handleConnectivityChange(); } diff --git a/src/org/thoughtcrime/securesms/sms/MessageSender.java b/src/org/thoughtcrime/securesms/sms/MessageSender.java index a4217f7dd2..2716643fa3 100644 --- a/src/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/src/org/thoughtcrime/securesms/sms/MessageSender.java @@ -95,6 +95,23 @@ public class MessageSender { return threadId; } + public static void resend(Context context, long messageId, boolean isMms) + { + + Intent intent; + if (isMms) { + DatabaseFactory.getMmsDatabase(context).markAsSending(messageId); + intent = new Intent(SendReceiveService.SEND_MMS_ACTION, null, + context, SendReceiveService.class); + } else { + DatabaseFactory.getSmsDatabase(context).markAsSending(messageId); + intent = new Intent(SendReceiveService.SEND_SMS_ACTION, null, + context, SendReceiveService.class); + } + intent.putExtra("message_id", messageId); + context.startService(intent); + } + private static void sendMms(Context context, Recipients recipients, MasterSecret masterSecret, SendReq sendRequest, long threadId, int distributionType, boolean secure) throws MmsException