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 526ae83bf7..ac5dc85155 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -498,6 +498,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