unified presence selection for otr and file transfer
This commit is contained in:
		
							parent
							
								
									a55ddb889e
								
							
						
					
					
						commit
						f36f218469
					
				| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
		} 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);
 | 
			
		||||
	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 {
 | 
			
		||||
				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() {
 | 
			
		||||
 | 
			
		||||
				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 {
 | 
			
		||||
			Contact contact = conversation.getContact();
 | 
			
		||||
			if (contact==null) {
 | 
			
		||||
				showAddToRosterDialog(conversation);
 | 
			
		||||
				listener.onPresenceSelected(false,null);
 | 
			
		||||
			} else {
 | 
			
		||||
				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();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
			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) {
 | 
			
		||||
								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() {
 | 
			
		||||
 | 
			
		||||
							@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");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,4 +2,5 @@ package eu.siacs.conversations.ui;
 | 
			
		|||
 | 
			
		||||
public interface OnPresenceSelected {
 | 
			
		||||
	public void onPresenceSelected(boolean success, String presence);
 | 
			
		||||
	public void onSendPlainTextInstead();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue