unified presence selection for otr and file transfer

Daniel Gultsch created

Change summary

res/values/strings.xml                                  | 10 +
src/eu/siacs/conversations/ui/ConversationActivity.java | 99 ++++++++--
src/eu/siacs/conversations/ui/ConversationFragment.java | 64 +-----
src/eu/siacs/conversations/ui/OnPresenceSelected.java   |  1 
4 files changed, 100 insertions(+), 74 deletions(-)

Detailed changes

res/values/strings.xml 🔗

@@ -68,4 +68,14 @@
     <string name="download_image">Download Image</string>
     <string name="error_loading_image">Error loading image (File not found)</string>
     <string name="image_offered_for_download"><i>Image file offered for download</i></string>
+    <string name="not_connected">Not Connected</string>
+    <string name="you_are_offline">You have to be online to send %s but your account assoziated with this Conversation is currently offline.</string>
+    <string name="you_are_offline_blank">You can not perform this action while being offline</string>
+    <string name="files">files</string>
+    <string name="otr_messages">OTR encrypted messages</string>
+    <string name="manage_account">Manage account</string>
+    <string name="contact_offline">Your Contact is Offline</string>
+    <string name="contact_offline_otr">Sending OTR encrypted messages to an offline contact is unfortunately not supported.\nWould you like to send the message in plain text?</string>
+    <string name="contact_offline_file">Sending files to an offline contact is unfortunately not supported.</string>
+    <string name="send_unencrypted">Send unencrypted</string>
 </resources>

src/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -332,7 +332,13 @@ public class ConversationActivity extends XmppActivity {
 						startActivityForResult(chooser,	ATTACH_FILE);
 					}
 				}
-			});
+
+				@Override
+				public void onSendPlainTextInstead() {
+					// TODO Auto-generated method stub
+					
+				}
+			},"file");
 			break;
 		case R.id.action_add:
 			startActivity(new Intent(this, ContactsActivity.class));
@@ -589,36 +595,77 @@ public class ConversationActivity extends XmppActivity {
 		listView.invalidateViews();
 	}
 	
-	public void selectPresence(final Conversation conversation, final OnPresenceSelected listener) {
-		Contact contact = conversation.getContact();
-		if (contact==null) {
-			showAddToRosterDialog(conversation);
-			listener.onPresenceSelected(false,null);
+	public void selectPresence(final Conversation conversation, final OnPresenceSelected listener, String reason) {
+		Account account = conversation.getAccount();
+		if (account.getStatus() != Account.STATUS_ONLINE) {
+			AlertDialog.Builder builder = new AlertDialog.Builder(this);
+			builder.setTitle(getString(R.string.not_connected));
+			builder.setIconAttribute(android.R.attr.alertDialogIcon);
+			if ("otr".equals(reason)) {
+				builder.setMessage(getString(R.string.you_are_offline,getString(R.string.otr_messages)));
+			} else if ("file".equals(reason)) {
+				builder.setMessage(getString(R.string.you_are_offline,getString(R.string.files)));
+			} else {
+				builder.setMessage(getString(R.string.you_are_offline_blank));
+			}
+			builder.setNegativeButton(getString(R.string.cancel), null);
+			builder.setPositiveButton(getString(R.string.manage_account), new OnClickListener() {
+				
+				@Override
+				public void onClick(DialogInterface dialog, int which) {
+					startActivity(new Intent(activity, ManageAccountActivity.class));
+				}
+			});
+			builder.create().show();
+			listener.onPresenceSelected(false, null);
 		} else {
-			Hashtable<String, Integer> presences = contact.getPresences();
-			if (presences.size() == 0) {
-				listener.onPresenceSelected(false, null);
-			} else if (presences.size() == 1) {
-				String presence = (String) presences.keySet().toArray()[0];
-				conversation.setNextPresence(presence);
-				listener.onPresenceSelected(true, presence);
+			Contact contact = conversation.getContact();
+			if (contact==null) {
+				showAddToRosterDialog(conversation);
+				listener.onPresenceSelected(false,null);
 			} else {
-				AlertDialog.Builder builder = new AlertDialog.Builder(this);
-				builder.setTitle(getString(R.string.choose_presence));
-				final String[] presencesArray = new String[presences.size()];
-				presences.keySet().toArray(presencesArray);
-				builder.setItems(presencesArray,
-						new DialogInterface.OnClickListener() {
-
+				Hashtable<String, Integer> presences = contact.getPresences();
+				if (presences.size() == 0) {
+					AlertDialog.Builder builder = new AlertDialog.Builder(this);
+					builder.setTitle(getString(R.string.contact_offline));
+					if ("otr".equals(reason)) {
+						builder.setMessage(getString(R.string.contact_offline_otr));
+						builder.setPositiveButton(getString(R.string.send_unencrypted), new OnClickListener() {
+							
 							@Override
-							public void onClick(DialogInterface dialog,
-									int which) {
-								String presence = presencesArray[which];
-								conversation.setNextPresence(presence);
-								listener.onPresenceSelected(true,presence);
+							public void onClick(DialogInterface dialog, int which) {
+								listener.onSendPlainTextInstead();
 							}
 						});
-				builder.create().show();
+					} else if ("file".equals(reason)) {
+						builder.setMessage(getString(R.string.contact_offline_file));
+					}
+					builder.setIconAttribute(android.R.attr.alertDialogIcon);
+					builder.setNegativeButton(getString(R.string.cancel), null);
+					builder.create().show();
+					listener.onPresenceSelected(false, null);
+				} else if (presences.size() == 1) {
+					String presence = (String) presences.keySet().toArray()[0];
+					conversation.setNextPresence(presence);
+					listener.onPresenceSelected(true, presence);
+				} else {
+					AlertDialog.Builder builder = new AlertDialog.Builder(this);
+					builder.setTitle(getString(R.string.choose_presence));
+					final String[] presencesArray = new String[presences.size()];
+					presences.keySet().toArray(presencesArray);
+					builder.setItems(presencesArray,
+							new DialogInterface.OnClickListener() {
+	
+								@Override
+								public void onClick(DialogInterface dialog,
+										int which) {
+									String presence = presencesArray[which];
+									conversation.setNextPresence(presence);
+									listener.onPresenceSelected(true,presence);
+								}
+							});
+					builder.create().show();
+				}
 			}
 		}
 	}

src/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -616,55 +616,23 @@ public class ConversationFragment extends Fragment {
 			activity.xmppConnectionService.sendMessage(message, null);
 			chatMsg.setText("");
 		} else {
-			Hashtable<String, Integer> presences;
-			if (conversation.getContact() != null) {
-				presences = conversation.getContact().getPresences();
-			} else {
-				presences = null;
-			}
-			if ((presences == null) || (presences.size() == 0)) {
-				AlertDialog.Builder builder = new AlertDialog.Builder(
-						getActivity());
-				builder.setTitle("Contact is offline");
-				builder.setIconAttribute(android.R.attr.alertDialogIcon);
-				builder.setMessage("Sending OTR encrypted messages to an offline contact is impossible.");
-				builder.setPositiveButton("Send plain text",
-						new DialogInterface.OnClickListener() {
-
-							@Override
-							public void onClick(DialogInterface dialog,
-									int which) {
-								conversation.nextMessageEncryption = Message.ENCRYPTION_NONE;
-								message.setEncryption(Message.ENCRYPTION_NONE);
-								xmppService.sendMessage(message, null);
-								chatMsg.setText("");
-							}
-						});
-				builder.setNegativeButton("Cancel", null);
-				builder.create().show();
-			} else if (presences.size() == 1) {
-				xmppService.sendMessage(message, (String) presences.keySet()
-						.toArray()[0]);
-				chatMsg.setText("");
-			} else {
-				AlertDialog.Builder builder = new AlertDialog.Builder(
-						getActivity());
-				builder.setTitle("Choose Presence");
-				final String[] presencesArray = new String[presences.size()];
-				presences.keySet().toArray(presencesArray);
-				builder.setItems(presencesArray,
-						new DialogInterface.OnClickListener() {
+			activity.selectPresence(message.getConversation(), new OnPresenceSelected() {
+				
+				@Override
+				public void onPresenceSelected(boolean success, String presence) {
+					if (success) {
+						xmppService.sendMessage(message,presence);
+						chatMsg.setText("");
+					}
+				}
 
-							@Override
-							public void onClick(DialogInterface dialog,
-									int which) {
-								xmppService.sendMessage(message,
-										presencesArray[which]);
-								chatMsg.setText("");
-							}
-						});
-				builder.create().show();
-			}
+				@Override
+				public void onSendPlainTextInstead() {
+					message.setEncryption(Message.ENCRYPTION_NONE);
+					xmppService.sendMessage(message,null);
+					chatMsg.setText("");
+				}
+			},"otr");
 		}
 	}