From 1bd260b9814ab1aa3abbb20ff999b3dd350b0944 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sun, 21 Oct 2012 14:34:09 -0700 Subject: [PATCH] Improve UI for group SMS ConversationActivity 1) Change title to indicate it's a group message, and specify the number of recipients. 2) Add an ActionBar icon to display a list of the recipients. --- res/drawable-hdpi/ic_groups_holo_dark.png | Bin 0 -> 2152 bytes res/drawable-mdpi/ic_groups_holo_dark.png | Bin 0 -> 1376 bytes res/drawable-xhdpi/ic_groups_holo_dark.png | Bin 0 -> 3076 bytes res/menu/conversation_group_options.xml | 9 ++++++ res/values/strings.xml | 11 +++++-- .../securesms/ConversationActivity.java | 29 ++++++++++++++++++ 6 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 res/drawable-hdpi/ic_groups_holo_dark.png create mode 100644 res/drawable-mdpi/ic_groups_holo_dark.png create mode 100644 res/drawable-xhdpi/ic_groups_holo_dark.png create mode 100644 res/menu/conversation_group_options.xml diff --git a/res/drawable-hdpi/ic_groups_holo_dark.png b/res/drawable-hdpi/ic_groups_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..32f419ce67a8642e176cae1be66d52662635f583 GIT binary patch literal 2152 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 S$z?nM0000 + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 80ec755abb..2f784fd33c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -79,6 +79,9 @@ Recipient is not a valid SMS or email address! Message is empty! FWD + Group Conversation Recipients + Group Conversation + %d recipients in group Message details @@ -404,6 +407,9 @@ Delete thread Compare + + Recipients list + Compare Get scanned to compare @@ -422,9 +428,10 @@ Verified - - + TextSecure is a security enhanced text messaging application that serves as a full replacement for the default text messaging application. Messages to other TextSecure users are encrypted over the air, and all text messages are stored in an encrypted database on the device. If your phone is lost or stolen, your messages will be safe, and communication with other TextSecure users can\'t be monitored over the air. + + diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 625365159b..d6657315c0 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -73,6 +73,8 @@ import org.thoughtcrime.securesms.util.MemoryCleaner; import ws.com.google.android.mms.MmsException; import java.io.IOException; +import java.util.LinkedList; +import java.util.List; /** * Activity for displaying a message thread, as well as @@ -199,6 +201,8 @@ public class ConversationActivity extends SherlockFragmentActivity if (isSingleConversation()) { inflater.inflate(R.menu.conversation_callable, menu); + } else if (isGroupConversation()) { + inflater.inflate(R.menu.conversation_group_options, menu); } inflater.inflate(R.menu.conversation, menu); @@ -217,6 +221,7 @@ public class ConversationActivity extends SherlockFragmentActivity case R.id.menu_abort_session: handleAbortSecureSession(); return true; case R.id.menu_verify_recipient: handleVerifyRecipient(); return true; case R.id.menu_verify_session: handleVerifySession(); return true; + case R.id.menu_group_recipients: handleDisplayGroupRecipients(); return true; case android.R.id.home: finish(); return true; } @@ -305,6 +310,22 @@ public class ConversationActivity extends SherlockFragmentActivity startActivity(dialIntent); } + private void handleDisplayGroupRecipients() { + List recipientStrings = new LinkedList(); + + for (Recipient recipient : getRecipients().getRecipientsList()) { + recipientStrings.add(recipient.getName()); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.ConversationActivity_group_conversation_recipients); + builder.setIcon(R.drawable.ic_groups_holo_dark); + builder.setCancelable(true); + builder.setItems(recipientStrings.toArray(new String[]{}), null); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } + private void handleDeleteThread() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.ConversationActivity_delete_thread_confirmation); @@ -356,6 +377,10 @@ public class ConversationActivity extends SherlockFragmentActivity } else { subtitle = getRecipients().getPrimaryRecipient().getNumber(); } + } else if (isGroupConversation()) { + title = getString(R.string.ConversationActivity_group_conversation); + subtitle = String.format(getString(R.string.ConversationActivity_d_recipients_in_group), + getRecipients().getRecipientsList().size()); } else { title = getString(R.string.ConversationActivity_compose_message); subtitle = ""; @@ -526,6 +551,10 @@ public class ConversationActivity extends SherlockFragmentActivity return getRecipients() != null && getRecipients().isSingleRecipient(); } + private boolean isGroupConversation() { + return getRecipients() != null && !getRecipients().isSingleRecipient(); + } + private boolean isAuthenticatedSession() { return AuthenticityCalculator.isAuthenticated(this, getRecipients().getPrimaryRecipient(),