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="download_image">Download Image</string>
 | 
				
			||||||
    <string name="error_loading_image">Error loading image (File not found)</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="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>
 | 
					</resources>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -332,7 +332,13 @@ public class ConversationActivity extends XmppActivity {
 | 
				
			||||||
						startActivityForResult(chooser,	ATTACH_FILE);
 | 
											startActivityForResult(chooser,	ATTACH_FILE);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			});
 | 
					
 | 
				
			||||||
 | 
									@Override
 | 
				
			||||||
 | 
									public void onSendPlainTextInstead() {
 | 
				
			||||||
 | 
										// TODO Auto-generated method stub
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								},"file");
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case R.id.action_add:
 | 
							case R.id.action_add:
 | 
				
			||||||
			startActivity(new Intent(this, ContactsActivity.class));
 | 
								startActivity(new Intent(this, ContactsActivity.class));
 | 
				
			||||||
| 
						 | 
					@ -589,7 +595,30 @@ public class ConversationActivity extends XmppActivity {
 | 
				
			||||||
		listView.invalidateViews();
 | 
							listView.invalidateViews();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public void selectPresence(final Conversation conversation, final OnPresenceSelected listener) {
 | 
						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 {
 | 
				
			||||||
			Contact contact = conversation.getContact();
 | 
								Contact contact = conversation.getContact();
 | 
				
			||||||
			if (contact==null) {
 | 
								if (contact==null) {
 | 
				
			||||||
				showAddToRosterDialog(conversation);
 | 
									showAddToRosterDialog(conversation);
 | 
				
			||||||
| 
						 | 
					@ -597,6 +626,23 @@ public class ConversationActivity extends XmppActivity {
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				Hashtable<String, Integer> presences = contact.getPresences();
 | 
									Hashtable<String, Integer> presences = contact.getPresences();
 | 
				
			||||||
				if (presences.size() == 0) {
 | 
									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) {
 | 
				
			||||||
 | 
													listener.onSendPlainTextInstead();
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											});
 | 
				
			||||||
 | 
										} 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);
 | 
										listener.onPresenceSelected(false, null);
 | 
				
			||||||
				} else if (presences.size() == 1) {
 | 
									} else if (presences.size() == 1) {
 | 
				
			||||||
					String presence = (String) presences.keySet().toArray()[0];
 | 
										String presence = (String) presences.keySet().toArray()[0];
 | 
				
			||||||
| 
						 | 
					@ -622,6 +668,7 @@ public class ConversationActivity extends XmppActivity {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	private void showAddToRosterDialog(final Conversation conversation) {
 | 
						private void showAddToRosterDialog(final Conversation conversation) {
 | 
				
			||||||
		String jid = conversation.getContactJid();
 | 
							String jid = conversation.getContactJid();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -616,55 +616,23 @@ public class ConversationFragment extends Fragment {
 | 
				
			||||||
			activity.xmppConnectionService.sendMessage(message, null);
 | 
								activity.xmppConnectionService.sendMessage(message, null);
 | 
				
			||||||
			chatMsg.setText("");
 | 
								chatMsg.setText("");
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			Hashtable<String, Integer> presences;
 | 
								activity.selectPresence(message.getConversation(), new OnPresenceSelected() {
 | 
				
			||||||
			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
 | 
									@Override
 | 
				
			||||||
							public void onClick(DialogInterface dialog,
 | 
									public void onPresenceSelected(boolean success, String presence) {
 | 
				
			||||||
									int which) {
 | 
										if (success) {
 | 
				
			||||||
								conversation.nextMessageEncryption = Message.ENCRYPTION_NONE;
 | 
											xmppService.sendMessage(message,presence);
 | 
				
			||||||
 | 
											chatMsg.setText("");
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									@Override
 | 
				
			||||||
 | 
									public void onSendPlainTextInstead() {
 | 
				
			||||||
					message.setEncryption(Message.ENCRYPTION_NONE);
 | 
										message.setEncryption(Message.ENCRYPTION_NONE);
 | 
				
			||||||
								xmppService.sendMessage(message, null);
 | 
										xmppService.sendMessage(message,null);
 | 
				
			||||||
					chatMsg.setText("");
 | 
										chatMsg.setText("");
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
						});
 | 
								},"otr");
 | 
				
			||||||
				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();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,4 +2,5 @@ package eu.siacs.conversations.ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public interface OnPresenceSelected {
 | 
					public interface OnPresenceSelected {
 | 
				
			||||||
	public void onPresenceSelected(boolean success, String presence);
 | 
						public void onPresenceSelected(boolean success, String presence);
 | 
				
			||||||
 | 
						public void onSendPlainTextInstead();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue