refactored ui listeners a little bit

iNPUTmice created

Change summary

src/eu/siacs/conversations/crypto/PgpEngine.java                     |   3 
src/eu/siacs/conversations/parser/MessageParser.java                 |   8 
src/eu/siacs/conversations/parser/PresenceParser.java                |   2 
src/eu/siacs/conversations/services/XmppConnectionService.java       |  94 
src/eu/siacs/conversations/ui/ConversationActivity.java              |   9 
src/eu/siacs/conversations/ui/ManageAccountActivity.java             | 562 
src/eu/siacs/conversations/ui/OnAccountListChangedListener.java      |   5 
src/eu/siacs/conversations/ui/OnConversationListChangedListener.java |   5 
src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java         |   4 
9 files changed, 398 insertions(+), 294 deletions(-)

Detailed changes

src/eu/siacs/conversations/crypto/PgpEngine.java 🔗

@@ -98,8 +98,7 @@ public class PgpEngine {
 							message.setEncryption(Message.ENCRYPTION_DECRYPTED);
 							PgpEngine.this.mXmppConnectionService
 									.updateMessage(message);
-							PgpEngine.this.mXmppConnectionService.updateUi(
-									message.getConversation(), false);
+							PgpEngine.this.mXmppConnectionService.updateConversationUi();
 							callback.success(message);
 							return;
 						case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:

src/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -114,7 +114,7 @@ public class MessageParser extends AbstractParser implements
 		if (packet.hasChild("subject")) {
 			conversation.getMucOptions().setSubject(
 					packet.findChild("subject").getContent());
-			mXmppConnectionService.updateUi(conversation, false);
+			mXmppConnectionService.updateConversationUi();
 			return null;
 		}
 		if ((fromParts.length == 1)) {
@@ -217,10 +217,10 @@ public class MessageParser extends AbstractParser implements
 		} else if (packet.hasChild("x")) {
 			Element x = packet.findChild("x");
 			if (x.hasChild("invite")) {
-				Conversation conversation = mXmppConnectionService
+				mXmppConnectionService
 						.findOrCreateConversation(account,
 								packet.getAttribute("from"), true);
-				mXmppConnectionService.updateUi(conversation, false);
+				mXmppConnectionService.updateConversationUi();
 			}
 
 		}
@@ -318,6 +318,6 @@ public class MessageParser extends AbstractParser implements
 		if (packet.getType() != MessagePacket.TYPE_ERROR) {
 			mXmppConnectionService.databaseBackend.createMessage(message);
 		}
-		mXmppConnectionService.updateUi(conversation, notify);
+		mXmppConnectionService.notifyUi(conversation, notify);
 	}
 }

src/eu/siacs/conversations/parser/PresenceParser.java 🔗

@@ -33,7 +33,7 @@ public class PresenceParser extends AbstractParser implements
 				int error = muc.getMucOptions().getError();
 				muc.getMucOptions().processPacket(packet, mPgpEngine);
 				if (muc.getMucOptions().getError() != error) {
-					mXmppConnectionService.updateUi(muc, false);
+					mXmppConnectionService.updateConversationUi();
 				}
 			}
 		}

src/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -33,8 +33,6 @@ import eu.siacs.conversations.parser.MessageParser;
 import eu.siacs.conversations.parser.PresenceParser;
 import eu.siacs.conversations.persistance.DatabaseBackend;
 import eu.siacs.conversations.persistance.FileBackend;
-import eu.siacs.conversations.ui.OnAccountListChangedListener;
-import eu.siacs.conversations.ui.OnConversationListChangedListener;
 import eu.siacs.conversations.ui.UiCallback;
 import eu.siacs.conversations.utils.CryptoHelper;
 import eu.siacs.conversations.utils.ExceptionHelper;
@@ -103,9 +101,9 @@ public class XmppConnectionService extends Service {
 	private JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager(
 			this);
 
-	private OnConversationListChangedListener convChangedListener = null;
+	private OnConversationUpdate mOnConversationUpdate = null;
 	private int convChangedListenerCount = 0;
-	private OnAccountListChangedListener accountChangedListener = null;
+	private OnAccountUpdate mOnAccountUpdate = null;
 	private OnTLSExceptionReceived tlsException = null;
 	public OnContactStatusChanged onContactStatusChanged = new OnContactStatusChanged() {
 
@@ -144,8 +142,8 @@ public class XmppConnectionService extends Service {
 
 		@Override
 		public void onStatusChanged(Account account) {
-			if (accountChangedListener != null) {
-				accountChangedListener.onAccountListChangedListener();
+			if (mOnAccountUpdate != null) {
+				mOnAccountUpdate.onAccountUpdate();;
 			}
 			if (account.getStatus() == Account.STATUS_ONLINE) {
 				mJingleConnectionManager.cancelInTransmission();
@@ -329,8 +327,8 @@ public class XmppConnectionService extends Service {
 					// in any case. reschedule wakup call
 					this.scheduleWakeupCall(PING_MAX_INTERVAL, true);
 				}
-				if (accountChangedListener != null) {
-					accountChangedListener.onAccountListChangedListener();
+				if (mOnAccountUpdate != null) {
+					mOnAccountUpdate.onAccountUpdate();
 				}
 			}
 		}
@@ -470,9 +468,7 @@ public class XmppConnectionService extends Service {
 				fetchRosterFromServer(account);
 				sendPresencePacket(account, mPresenceGenerator.sendPresence(account));
 				connectMultiModeConversations(account);
-				if (convChangedListener != null) {
-					convChangedListener.onConversationListChanged();
-				}
+				updateConversationUi();
 			}
 		});
 		return connection;
@@ -565,9 +561,7 @@ public class XmppConnectionService extends Service {
 			databaseBackend.createMessage(message);
 		}
 		conv.getMessages().add(message);
-		if (convChangedListener != null) {
-			convChangedListener.onConversationListChanged();
-		}
+		updateConversationUi();
 		if ((send) && (packet != null)) {
 			sendMessagePacket(account, packet);
 		}
@@ -798,9 +792,7 @@ public class XmppConnectionService extends Service {
 				&& (conversation.getMode() == Conversation.MODE_MULTI)) {
 			joinMuc(conversation);
 		}
-		if (this.convChangedListener != null) {
-			this.convChangedListener.onConversationListChanged();
-		}
+		updateConversationUi();
 		return conversation;
 	}
 
@@ -812,18 +804,14 @@ public class XmppConnectionService extends Service {
 		}
 		this.databaseBackend.updateConversation(conversation);
 		this.conversations.remove(conversation);
-		if (this.convChangedListener != null) {
-			this.convChangedListener.onConversationListChanged();
-		}
+		updateConversationUi();
 	}
 
 	public void clearConversationHistory(Conversation conversation) {
 		this.databaseBackend.deleteMessagesInConversation(conversation);
 		this.fileBackend.removeFiles(conversation);
 		conversation.getMessages().clear();
-		if (this.convChangedListener != null) {
-			this.convChangedListener.onConversationListChanged();
-		}
+		updateConversationUi();
 	}
 
 	public int getConversationCount() {
@@ -834,17 +822,14 @@ public class XmppConnectionService extends Service {
 		databaseBackend.createAccount(account);
 		this.accounts.add(account);
 		this.reconnectAccount(account, false);
-		if (accountChangedListener != null)
-			accountChangedListener.onAccountListChangedListener();
+		updateAccountUi();
 	}
 
 	public void updateAccount(Account account) {
 		this.statusListener.onStatusChanged(account);
 		databaseBackend.updateAccount(account);
 		reconnectAccount(account, false);
-		if (accountChangedListener != null) {
-			accountChangedListener.onAccountListChangedListener();
-		}
+		updateAccountUi();
 		UIHelper.showErrorNotification(getApplicationContext(), getAccounts());
 	}
 
@@ -854,32 +839,29 @@ public class XmppConnectionService extends Service {
 		}
 		databaseBackend.deleteAccount(account);
 		this.accounts.remove(account);
-		if (accountChangedListener != null) {
-			accountChangedListener.onAccountListChangedListener();
-		}
+		updateAccountUi();
 		UIHelper.showErrorNotification(getApplicationContext(), getAccounts());
 	}
 
 	public void setOnConversationListChangedListener(
-			OnConversationListChangedListener listener) {
-		this.convChangedListener = listener;
+			OnConversationUpdate listener) {
+		this.mOnConversationUpdate = listener;
 		this.convChangedListenerCount++;
 	}
 
 	public void removeOnConversationListChangedListener() {
 		this.convChangedListenerCount--;
 		if (this.convChangedListenerCount == 0) {
-			this.convChangedListener = null;
+			this.mOnConversationUpdate = null;
 		}
 	}
 
-	public void setOnAccountListChangedListener(
-			OnAccountListChangedListener listener) {
-		this.accountChangedListener = listener;
+	public void setOnAccountListChangedListener(OnAccountUpdate listener) {
+		this.mOnAccountUpdate = listener;
 	}
 
 	public void removeOnAccountListChangedListener() {
-		this.accountChangedListener = null;
+		this.mOnAccountUpdate = null;
 	}
 
 	public void connectMultiModeConversations(Account account) {
@@ -1062,7 +1044,7 @@ public class XmppConnectionService extends Service {
 				}
 			}
 		}
-		updateUi(conversation, false);
+		notifyUi(conversation, false);
 	}
 
 	public boolean renewSymmetricKey(Conversation conversation) {
@@ -1197,9 +1179,7 @@ public class XmppConnectionService extends Service {
 	public void markMessage(Message message, int status) {
 		message.setStatus(status);
 		databaseBackend.updateMessage(message);
-		if (convChangedListener != null) {
-			convChangedListener.onConversationListChanged();
-		}
+		updateConversationUi();
 	}
 
 	public SharedPreferences getPreferences() {
@@ -1211,14 +1191,26 @@ public class XmppConnectionService extends Service {
 		return getPreferences().getBoolean("confirm_messages", true);
 	}
 
-	public void updateUi(Conversation conversation, boolean notify) {
-		if (convChangedListener != null) {
-			convChangedListener.onConversationListChanged();
+	public void notifyUi(Conversation conversation, boolean notify) {
+		if (mOnConversationUpdate != null) {
+			mOnConversationUpdate.onConversationUpdate();
 		} else {
 			UIHelper.updateNotification(getApplicationContext(),
 					getConversations(), conversation, notify);
 		}
 	}
+	
+	public void updateConversationUi() {
+		if (mOnConversationUpdate != null) {
+			mOnConversationUpdate.onConversationUpdate();
+		}
+	}
+	
+	public void updateAccountUi() {
+		if (mOnAccountUpdate != null) {
+			mOnAccountUpdate.onAccountUpdate();
+		}
+	}
 
 	public Account findAccountByJid(String accountJid) {
 		for (Account account : this.accounts) {
@@ -1316,4 +1308,16 @@ public class XmppConnectionService extends Service {
 	public JingleConnectionManager getJingleConnectionManager() {
 		return this.mJingleConnectionManager;
 	}
+	
+	public interface OnConversationUpdate {
+		public void onConversationUpdate();
+	}
+	
+	public interface OnAccountUpdate {
+		public void onAccountUpdate();
+	}
+	
+	public interface OnRosterUpdate {
+		public void onRosterUpdate();
+	}
 }

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

@@ -10,6 +10,7 @@ import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.services.ImageProvider;
+import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
 import eu.siacs.conversations.utils.ExceptionHelper;
 import eu.siacs.conversations.utils.UIHelper;
 import android.net.Uri;
@@ -83,10 +84,10 @@ public class ConversationActivity extends XmppActivity {
 	private boolean showLastseen = false;
 	private ArrayAdapter<Conversation> listAdapter;
 
-	private OnConversationListChangedListener onConvChanged = new OnConversationListChangedListener() {
-
+	private OnConversationUpdate onConvChanged = new OnConversationUpdate() {
+		
 		@Override
-		public void onConversationListChanged() {
+		public void onConversationUpdate() {
 			runOnUiThread(new Runnable() {
 
 				@Override
@@ -655,7 +656,7 @@ public class ConversationActivity extends XmppActivity {
 			this.onBackendConnected();
 		}
 		if (conversationList.size() >= 1) {
-			onConvChanged.onConversationListChanged();
+			onConvChanged.onConversationUpdate();
 		}
 	}
 

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

@@ -5,6 +5,7 @@ import java.util.List;
 
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
 import eu.siacs.conversations.ui.EditAccount.EditAccountListener;
 import eu.siacs.conversations.xmpp.OnTLSExceptionReceived;
 import eu.siacs.conversations.xmpp.XmppConnection;
@@ -31,21 +32,21 @@ import android.widget.ListView;
 import android.widget.TextView;
 
 public class ManageAccountActivity extends XmppActivity {
-	
+
 	protected boolean isActionMode = false;
 	protected ActionMode actionMode;
 	protected Account selectedAccountForActionMode = null;
 	protected ManageAccountActivity activity = this;
-	
+
 	protected boolean firstrun = true;
-	
+
 	protected List<Account> accountList = new ArrayList<Account>();
 	protected ListView accountListView;
 	protected ArrayAdapter<Account> accountListViewAdapter;
-	protected OnAccountListChangedListener accountChanged = new OnAccountListChangedListener() {
+	protected OnAccountUpdate accountChanged = new OnAccountUpdate() {
 
 		@Override
-		public void onAccountListChangedListener() {
+		public void onAccountUpdate() {
 			accountList.clear();
 			accountList.addAll(xmppConnectionService.getAccounts());
 			runOnUiThread(new Runnable() {
@@ -57,47 +58,55 @@ public class ManageAccountActivity extends XmppActivity {
 			});
 		}
 	};
-	
+
 	protected OnTLSExceptionReceived tlsExceptionReceived = new OnTLSExceptionReceived() {
-		
+
 		@Override
-		public void onTLSExceptionReceived(final String fingerprint, final Account account) {
+		public void onTLSExceptionReceived(final String fingerprint,
+				final Account account) {
 			activity.runOnUiThread(new Runnable() {
-				
+
 				@Override
 				public void run() {
-					AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+					AlertDialog.Builder builder = new AlertDialog.Builder(
+							activity);
 					builder.setTitle(getString(R.string.account_status_error));
 					builder.setIconAttribute(android.R.attr.alertDialogIcon);
-					View view = (View) getLayoutInflater().inflate(R.layout.cert_warning, null);
+					View view = (View) getLayoutInflater().inflate(
+							R.layout.cert_warning, null);
 					TextView sha = (TextView) view.findViewById(R.id.sha);
 					TextView hint = (TextView) view.findViewById(R.id.hint);
 					StringBuilder humanReadableSha = new StringBuilder();
 					humanReadableSha.append(fingerprint);
-					for(int i = 2; i < 59; i += 3) {
-						if ((i==14)||(i==29)||(i==44)) {
+					for (int i = 2; i < 59; i += 3) {
+						if ((i == 14) || (i == 29) || (i == 44)) {
 							humanReadableSha.insert(i, "\n");
 						} else {
 							humanReadableSha.insert(i, ":");
 						}
-						
+
 					}
-					hint.setText(getString(R.string.untrusted_cert_hint,account.getServer()));
+					hint.setText(getString(R.string.untrusted_cert_hint,
+							account.getServer()));
 					sha.setText(humanReadableSha.toString());
 					builder.setView(view);
-					builder.setNegativeButton(getString(R.string.certif_no_trust), null);
-					builder.setPositiveButton(getString(R.string.certif_trust), new OnClickListener() {
-						
-						@Override
-						public void onClick(DialogInterface dialog, int which) {
-							account.setSSLCertFingerprint(fingerprint);
-							activity.xmppConnectionService.updateAccount(account);
-						}
-					});
+					builder.setNegativeButton(
+							getString(R.string.certif_no_trust), null);
+					builder.setPositiveButton(getString(R.string.certif_trust),
+							new OnClickListener() {
+
+								@Override
+								public void onClick(DialogInterface dialog,
+										int which) {
+									account.setSSLCertFingerprint(fingerprint);
+									activity.xmppConnectionService
+											.updateAccount(account);
+								}
+							});
 					builder.create().show();
 				}
 			});
-			
+
 		}
 	};
 
@@ -124,55 +133,68 @@ public class ManageAccountActivity extends XmppActivity {
 						.findViewById(R.id.account_status);
 				switch (account.getStatus()) {
 				case Account.STATUS_DISABLED:
-					statusView.setText(getString(R.string.account_status_disabled));
+					statusView
+							.setText(getString(R.string.account_status_disabled));
 					statusView.setTextColor(0xFF1da9da);
 					break;
 				case Account.STATUS_ONLINE:
-					statusView.setText(getString(R.string.account_status_online));
+					statusView
+							.setText(getString(R.string.account_status_online));
 					statusView.setTextColor(0xFF83b600);
 					break;
 				case Account.STATUS_CONNECTING:
-					statusView.setText(getString(R.string.account_status_connecting));
+					statusView
+							.setText(getString(R.string.account_status_connecting));
 					statusView.setTextColor(0xFF1da9da);
 					break;
 				case Account.STATUS_OFFLINE:
-					statusView.setText(getString(R.string.account_status_offline));
+					statusView
+							.setText(getString(R.string.account_status_offline));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_UNAUTHORIZED:
-					statusView.setText(getString(R.string.account_status_unauthorized));
+					statusView
+							.setText(getString(R.string.account_status_unauthorized));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_SERVER_NOT_FOUND:
-					statusView.setText(getString(R.string.account_status_not_found));
+					statusView
+							.setText(getString(R.string.account_status_not_found));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_NO_INTERNET:
-					statusView.setText(getString(R.string.account_status_no_internet));
+					statusView
+							.setText(getString(R.string.account_status_no_internet));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_SERVER_REQUIRES_TLS:
-					statusView.setText(getString(R.string.account_status_requires_tls));
+					statusView
+							.setText(getString(R.string.account_status_requires_tls));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_TLS_ERROR:
-					statusView.setText(getString(R.string.account_status_error));
+					statusView
+							.setText(getString(R.string.account_status_error));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_REGISTRATION_FAILED:
-					statusView.setText(getString(R.string.account_status_regis_fail));
+					statusView
+							.setText(getString(R.string.account_status_regis_fail));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				case Account.STATUS_REGISTRATION_CONFLICT:
-					statusView.setText(getString(R.string.account_status_regis_conflict));
+					statusView
+							.setText(getString(R.string.account_status_regis_conflict));
 					statusView.setTextColor(0xFFe92727);
 					break;
-				case  Account.STATUS_REGISTRATION_SUCCESSFULL:
-					statusView.setText(getString(R.string.account_status_regis_success));
+				case Account.STATUS_REGISTRATION_SUCCESSFULL:
+					statusView
+							.setText(getString(R.string.account_status_regis_success));
 					statusView.setTextColor(0xFF83b600);
 					break;
 				case Account.STATUS_REGISTRATION_NOT_SUPPORTED:
-					statusView.setText(getString(R.string.account_status_regis_not_sup));
+					statusView
+							.setText(getString(R.string.account_status_regis_not_sup));
 					statusView.setTextColor(0xFFe92727);
 					break;
 				default:
@@ -192,10 +214,14 @@ public class ManageAccountActivity extends XmppActivity {
 					int position, long arg3) {
 				if (!isActionMode) {
 					Account account = accountList.get(position);
-					if ((account.getStatus() == Account.STATUS_OFFLINE)||(account.getStatus() == Account.STATUS_TLS_ERROR)) {
-						activity.xmppConnectionService.reconnectAccount(accountList.get(position),true);
+					if ((account.getStatus() == Account.STATUS_OFFLINE)
+							|| (account.getStatus() == Account.STATUS_TLS_ERROR)) {
+						activity.xmppConnectionService.reconnectAccount(
+								accountList.get(position), true);
 					} else if (account.getStatus() == Account.STATUS_ONLINE) {
-						activity.startActivity(new Intent(activity.getApplicationContext(),StartConversation.class));
+						activity.startActivity(new Intent(activity
+								.getApplicationContext(),
+								StartConversation.class));
 					} else if (account.getStatus() != Account.STATUS_DISABLED) {
 						editAccount(account);
 					}
@@ -205,159 +231,242 @@ public class ManageAccountActivity extends XmppActivity {
 				}
 			}
 		});
-		accountListView.setOnItemLongClickListener(new OnItemLongClickListener() {
+		accountListView
+				.setOnItemLongClickListener(new OnItemLongClickListener() {
 
-			@Override
-			public boolean onItemLongClick(AdapterView<?> arg0, View view,
-					int position, long arg3) {
-				if (!isActionMode) {
-					accountListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-					accountListView.setItemChecked(position,true);
-					selectedAccountForActionMode = accountList.get(position);
-					actionMode = activity.startActionMode((new ActionMode.Callback() {
-						
-						@Override
-						public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-							if (selectedAccountForActionMode.isOptionSet(Account.OPTION_DISABLED)) {
-					        	menu.findItem(R.id.mgmt_account_enable).setVisible(true);
-					        	menu.findItem(R.id.mgmt_account_disable).setVisible(false);
-					        } else {
-					        	menu.findItem(R.id.mgmt_account_disable).setVisible(true);
-					        	menu.findItem(R.id.mgmt_account_enable).setVisible(false);
-					        }
-							return true;
-						}
-						
-						@Override
-						public void onDestroyActionMode(ActionMode mode) {
-							// TODO Auto-generated method stub
-							
-						}
-						
-						@Override
-						public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-							MenuInflater inflater = mode.getMenuInflater();
-					        inflater.inflate(R.menu.manageaccounts_context, menu);
-							return true;
-						}
-						
-						@Override
-						public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
-							if (item.getItemId()==R.id.mgmt_account_edit) {
-								editAccount(selectedAccountForActionMode);
-							} else if (item.getItemId()==R.id.mgmt_account_disable) {
-								selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, true);
-								xmppConnectionService.updateAccount(selectedAccountForActionMode);
-								mode.finish();
-							} else if (item.getItemId()==R.id.mgmt_account_enable) {
-								selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, false);
-								xmppConnectionService.updateAccount(selectedAccountForActionMode);
-								mode.finish();
-							} else if (item.getItemId()==R.id.mgmt_account_delete) {
-								AlertDialog.Builder builder = new AlertDialog.Builder(activity);
-								builder.setTitle(getString(R.string.mgmt_account_are_you_sure));
-								builder.setIconAttribute(android.R.attr.alertDialogIcon);
-								builder.setMessage(getString(R.string.mgmt_account_delete_confirm_text));
-								builder.setPositiveButton(getString(R.string.delete), new OnClickListener() {
-									
-									@Override
-									public void onClick(DialogInterface dialog, int which) {
-										xmppConnectionService.deleteAccount(selectedAccountForActionMode);
-										selectedAccountForActionMode = null;
-										mode.finish();
-									}
-								});
-								builder.setNegativeButton(getString(R.string.cancel),null);
-								builder.create().show();
-							} else if (item.getItemId()==R.id.mgmt_account_announce_pgp) {
-								if (activity.hasPgp()) {
-									mode.finish();
-									announcePgp(selectedAccountForActionMode,null);
-								} else {
-									activity.showInstallPgpDialog();
-								}
-							} else if (item.getItemId() == R.id.mgmt_otr_key) {
-								AlertDialog.Builder builder = new AlertDialog.Builder(activity);
-								builder.setTitle("OTR Fingerprint");
-								String fingerprintTxt = selectedAccountForActionMode.getOtrFingerprint(getApplicationContext());
-								View view = (View) getLayoutInflater().inflate(R.layout.otr_fingerprint, null);
-								if (fingerprintTxt!=null) {
-									TextView fingerprint = (TextView) view.findViewById(R.id.otr_fingerprint);
-									TextView noFingerprintView = (TextView) view.findViewById(R.id.otr_no_fingerprint);
-									fingerprint.setText(fingerprintTxt);
-									fingerprint.setVisibility(View.VISIBLE);
-									noFingerprintView.setVisibility(View.GONE);
-								}
-								builder.setView(view);
-								builder.setPositiveButton(getString(R.string.done), null);
-								builder.create().show();
-							} else if (item.getItemId() == R.id.mgmt_account_info) {
-								AlertDialog.Builder builder = new AlertDialog.Builder(activity);
-								builder.setTitle(getString(R.string.account_info));
-								if (selectedAccountForActionMode.getStatus() == Account.STATUS_ONLINE) {
-									XmppConnection xmpp = selectedAccountForActionMode.getXmppConnection();
-									long connectionAge = (SystemClock.elapsedRealtime() - xmpp.lastConnect) / 60000;
-									long sessionAge = (SystemClock.elapsedRealtime() - xmpp.lastSessionStarted) / 60000;
-									long connectionAgeHours = connectionAge / 60;
-									long sessionAgeHours = sessionAge / 60;
-									View view = (View) getLayoutInflater().inflate(R.layout.server_info, null);
-									TextView connection = (TextView) view.findViewById(R.id.connection);
-									TextView session = (TextView) view.findViewById(R.id.session);
-									TextView pcks_sent = (TextView) view.findViewById(R.id.pcks_sent);
-									TextView pcks_received = (TextView) view.findViewById(R.id.pcks_received);
-									TextView carbon = (TextView) view.findViewById(R.id.carbon);
-									TextView stream = (TextView) view.findViewById(R.id.stream);
-									TextView roster = (TextView) view.findViewById(R.id.roster);
-									TextView presences = (TextView) view.findViewById(R.id.number_presences);
-									presences.setText(selectedAccountForActionMode.countPresences()+"");
-									pcks_received.setText(""+xmpp.getReceivedStanzas());
-									pcks_sent.setText(""+xmpp.getSentStanzas());
-									if (connectionAgeHours >= 2) {
-										connection.setText(connectionAgeHours+" " + getString(R.string.hours));
-									} else {
-										connection.setText(connectionAge+" " + getString(R.string.mins));
-									}
-									if (xmpp.hasFeatureStreamManagment()) {
-										if (sessionAgeHours >= 2) {
-											session.setText(sessionAgeHours+" " + getString(R.string.hours));
-										} else {
-											session.setText(sessionAge+" " + getString(R.string.mins));
+					@Override
+					public boolean onItemLongClick(AdapterView<?> arg0,
+							View view, int position, long arg3) {
+						if (!isActionMode) {
+							accountListView
+									.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+							accountListView.setItemChecked(position, true);
+							selectedAccountForActionMode = accountList
+									.get(position);
+							actionMode = activity
+									.startActionMode((new ActionMode.Callback() {
+
+										@Override
+										public boolean onPrepareActionMode(
+												ActionMode mode, Menu menu) {
+											if (selectedAccountForActionMode
+													.isOptionSet(Account.OPTION_DISABLED)) {
+												menu.findItem(
+														R.id.mgmt_account_enable)
+														.setVisible(true);
+												menu.findItem(
+														R.id.mgmt_account_disable)
+														.setVisible(false);
+											} else {
+												menu.findItem(
+														R.id.mgmt_account_disable)
+														.setVisible(true);
+												menu.findItem(
+														R.id.mgmt_account_enable)
+														.setVisible(false);
+											}
+											return true;
 										}
-										stream.setText(getString(R.string.yes));
-									} else {
-										stream.setText(getString(R.string.no));
-										session.setText(connection.getText());
-									}
-									if (xmpp.hasFeaturesCarbon()) {
-										carbon.setText(getString(R.string.yes));
-									} else {
-										carbon.setText(getString(R.string.no));
-									}
-									if (xmpp.hasFeatureRosterManagment()) {
-										roster.setText(getString(R.string.yes));
-									} else {
-										roster.setText(getString(R.string.no));
-									}
-									builder.setView(view);
-								} else {
-									builder.setMessage(getString(R.string.mgmt_account_account_offline));
-								}
-								builder.setPositiveButton(getString(R.string.hide), null);
-								builder.create().show();
-							}
+
+										@Override
+										public void onDestroyActionMode(
+												ActionMode mode) {
+											// TODO Auto-generated method stub
+
+										}
+
+										@Override
+										public boolean onCreateActionMode(
+												ActionMode mode, Menu menu) {
+											MenuInflater inflater = mode
+													.getMenuInflater();
+											inflater.inflate(
+													R.menu.manageaccounts_context,
+													menu);
+											return true;
+										}
+
+										@Override
+										public boolean onActionItemClicked(
+												final ActionMode mode,
+												MenuItem item) {
+											if (item.getItemId() == R.id.mgmt_account_edit) {
+												editAccount(selectedAccountForActionMode);
+											} else if (item.getItemId() == R.id.mgmt_account_disable) {
+												selectedAccountForActionMode
+														.setOption(
+																Account.OPTION_DISABLED,
+																true);
+												xmppConnectionService
+														.updateAccount(selectedAccountForActionMode);
+												mode.finish();
+											} else if (item.getItemId() == R.id.mgmt_account_enable) {
+												selectedAccountForActionMode
+														.setOption(
+																Account.OPTION_DISABLED,
+																false);
+												xmppConnectionService
+														.updateAccount(selectedAccountForActionMode);
+												mode.finish();
+											} else if (item.getItemId() == R.id.mgmt_account_delete) {
+												AlertDialog.Builder builder = new AlertDialog.Builder(
+														activity);
+												builder.setTitle(getString(R.string.mgmt_account_are_you_sure));
+												builder.setIconAttribute(android.R.attr.alertDialogIcon);
+												builder.setMessage(getString(R.string.mgmt_account_delete_confirm_text));
+												builder.setPositiveButton(
+														getString(R.string.delete),
+														new OnClickListener() {
+
+															@Override
+															public void onClick(
+																	DialogInterface dialog,
+																	int which) {
+																xmppConnectionService
+																		.deleteAccount(selectedAccountForActionMode);
+																selectedAccountForActionMode = null;
+																mode.finish();
+															}
+														});
+												builder.setNegativeButton(
+														getString(R.string.cancel),
+														null);
+												builder.create().show();
+											} else if (item.getItemId() == R.id.mgmt_account_announce_pgp) {
+												if (activity.hasPgp()) {
+													mode.finish();
+													announcePgp(
+															selectedAccountForActionMode,
+															null);
+												} else {
+													activity.showInstallPgpDialog();
+												}
+											} else if (item.getItemId() == R.id.mgmt_otr_key) {
+												AlertDialog.Builder builder = new AlertDialog.Builder(
+														activity);
+												builder.setTitle("OTR Fingerprint");
+												String fingerprintTxt = selectedAccountForActionMode
+														.getOtrFingerprint(getApplicationContext());
+												View view = (View) getLayoutInflater()
+														.inflate(
+																R.layout.otr_fingerprint,
+																null);
+												if (fingerprintTxt != null) {
+													TextView fingerprint = (TextView) view
+															.findViewById(R.id.otr_fingerprint);
+													TextView noFingerprintView = (TextView) view
+															.findViewById(R.id.otr_no_fingerprint);
+													fingerprint
+															.setText(fingerprintTxt);
+													fingerprint
+															.setVisibility(View.VISIBLE);
+													noFingerprintView
+															.setVisibility(View.GONE);
+												}
+												builder.setView(view);
+												builder.setPositiveButton(
+														getString(R.string.done),
+														null);
+												builder.create().show();
+											} else if (item.getItemId() == R.id.mgmt_account_info) {
+												AlertDialog.Builder builder = new AlertDialog.Builder(
+														activity);
+												builder.setTitle(getString(R.string.account_info));
+												if (selectedAccountForActionMode
+														.getStatus() == Account.STATUS_ONLINE) {
+													XmppConnection xmpp = selectedAccountForActionMode
+															.getXmppConnection();
+													long connectionAge = (SystemClock
+															.elapsedRealtime() - xmpp.lastConnect) / 60000;
+													long sessionAge = (SystemClock
+															.elapsedRealtime() - xmpp.lastSessionStarted) / 60000;
+													long connectionAgeHours = connectionAge / 60;
+													long sessionAgeHours = sessionAge / 60;
+													View view = (View) getLayoutInflater()
+															.inflate(
+																	R.layout.server_info,
+																	null);
+													TextView connection = (TextView) view
+															.findViewById(R.id.connection);
+													TextView session = (TextView) view
+															.findViewById(R.id.session);
+													TextView pcks_sent = (TextView) view
+															.findViewById(R.id.pcks_sent);
+													TextView pcks_received = (TextView) view
+															.findViewById(R.id.pcks_received);
+													TextView carbon = (TextView) view
+															.findViewById(R.id.carbon);
+													TextView stream = (TextView) view
+															.findViewById(R.id.stream);
+													TextView roster = (TextView) view
+															.findViewById(R.id.roster);
+													TextView presences = (TextView) view
+															.findViewById(R.id.number_presences);
+													presences.setText(selectedAccountForActionMode
+															.countPresences()
+															+ "");
+													pcks_received.setText(""
+															+ xmpp.getReceivedStanzas());
+													pcks_sent.setText(""
+															+ xmpp.getSentStanzas());
+													if (connectionAgeHours >= 2) {
+														connection
+																.setText(connectionAgeHours
+																		+ " "
+																		+ getString(R.string.hours));
+													} else {
+														connection
+																.setText(connectionAge
+																		+ " "
+																		+ getString(R.string.mins));
+													}
+													if (xmpp.hasFeatureStreamManagment()) {
+														if (sessionAgeHours >= 2) {
+															session.setText(sessionAgeHours
+																	+ " "
+																	+ getString(R.string.hours));
+														} else {
+															session.setText(sessionAge
+																	+ " "
+																	+ getString(R.string.mins));
+														}
+														stream.setText(getString(R.string.yes));
+													} else {
+														stream.setText(getString(R.string.no));
+														session.setText(connection
+																.getText());
+													}
+													if (xmpp.hasFeaturesCarbon()) {
+														carbon.setText(getString(R.string.yes));
+													} else {
+														carbon.setText(getString(R.string.no));
+													}
+													if (xmpp.hasFeatureRosterManagment()) {
+														roster.setText(getString(R.string.yes));
+													} else {
+														roster.setText(getString(R.string.no));
+													}
+													builder.setView(view);
+												} else {
+													builder.setMessage(getString(R.string.mgmt_account_account_offline));
+												}
+												builder.setPositiveButton(
+														getString(R.string.hide),
+														null);
+												builder.create().show();
+											}
+											return true;
+										}
+
+									}));
 							return true;
+						} else {
+							return false;
 						}
-
-						
-					}));
-					return true;
-				} else {
-					return false;
-				}
-			}
-		});
+					}
+				});
 	}
-	
+
 	@Override
 	protected void onStop() {
 		if (xmppConnectionServiceBound) {
@@ -370,11 +479,12 @@ public class ManageAccountActivity extends XmppActivity {
 	@Override
 	void onBackendConnected() {
 		xmppConnectionService.setOnAccountListChangedListener(accountChanged);
-		xmppConnectionService.setOnTLSExceptionReceivedListener(tlsExceptionReceived);
+		xmppConnectionService
+				.setOnTLSExceptionReceivedListener(tlsExceptionReceived);
 		this.accountList.clear();
 		this.accountList.addAll(xmppConnectionService.getAccounts());
 		accountListViewAdapter.notifyDataSetChanged();
-		if ((this.accountList.size() == 0)&&(this.firstrun)) {
+		if ((this.accountList.size() == 0) && (this.firstrun)) {
 			getActionBar().setDisplayHomeAsUpEnabled(false);
 			getActionBar().setHomeButtonEnabled(false);
 			addAccount();
@@ -405,12 +515,13 @@ public class ManageAccountActivity extends XmppActivity {
 		if (xmppConnectionService.getConversations().size() == 0) {
 			Intent contactsIntent = new Intent(this, StartConversation.class);
 			contactsIntent.setFlags(
-					// if activity exists in stack, pop the stack and go back to it
+			// if activity exists in stack, pop the stack and go back to it
 					Intent.FLAG_ACTIVITY_CLEAR_TOP |
 					// otherwise, make a new task for it
-					Intent.FLAG_ACTIVITY_NEW_TASK |
-					// don't use the new activity animation; finish animation runs instead
-					Intent.FLAG_ACTIVITY_NO_ANIMATION);
+							Intent.FLAG_ACTIVITY_NEW_TASK |
+							// don't use the new activity animation; finish
+							// animation runs instead
+							Intent.FLAG_ACTIVITY_NO_ANIMATION);
 			startActivity(contactsIntent);
 			finish();
 			return true;
@@ -420,23 +531,23 @@ public class ManageAccountActivity extends XmppActivity {
 	}
 
 	private void editAccount(Account account) {
-			EditAccount dialog = new EditAccount();
-			dialog.setAccount(account);
-			dialog.setEditAccountListener(new EditAccountListener() {
+		EditAccount dialog = new EditAccount();
+		dialog.setAccount(account);
+		dialog.setEditAccountListener(new EditAccountListener() {
 
-				@Override
-				public void onAccountEdited(Account account) {
-					xmppConnectionService.updateAccount(account);
-					if (actionMode != null) { 
-						actionMode.finish();
-					}
+			@Override
+			public void onAccountEdited(Account account) {
+				xmppConnectionService.updateAccount(account);
+				if (actionMode != null) {
+					actionMode.finish();
 				}
-			});
-			dialog.show(getFragmentManager(), "edit_account");
-			dialog.setKnownHosts(xmppConnectionService.getKnownHosts(),this);
-		
+			}
+		});
+		dialog.show(getFragmentManager(), "edit_account");
+		dialog.setKnownHosts(xmppConnectionService.getKnownHosts(), this);
+
 	}
-	
+
 	protected void addAccount() {
 		final Activity activity = this;
 		EditAccount dialog = new EditAccount();
@@ -450,16 +561,15 @@ public class ManageAccountActivity extends XmppActivity {
 			}
 		});
 		dialog.show(getFragmentManager(), "add_account");
-		dialog.setKnownHosts(xmppConnectionService.getKnownHosts(),this);
+		dialog.setKnownHosts(xmppConnectionService.getKnownHosts(), this);
 	}
 
-	
 	@Override
 	public void onActionModeStarted(ActionMode mode) {
 		super.onActionModeStarted(mode);
 		this.isActionMode = true;
 	}
-	
+
 	@Override
 	public void onActionModeFinished(ActionMode mode) {
 		super.onActionModeFinished(mode);
@@ -467,20 +577,20 @@ public class ManageAccountActivity extends XmppActivity {
 		accountListView.clearChoices();
 		accountListView.requestLayout();
 		accountListView.post(new Runnable() {
-            @Override
-            public void run() {
-                accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
-            }
-        });
+			@Override
+			public void run() {
+				accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
+			}
+		});
 	}
-	
-	 @Override
-	 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-		 super.onActivityResult(requestCode, resultCode, data);
-		 if (resultCode == RESULT_OK) {
+
+	@Override
+	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+		super.onActivityResult(requestCode, resultCode, data);
+		if (resultCode == RESULT_OK) {
 			if (requestCode == REQUEST_ANNOUNCE_PGP) {
-				announcePgp(selectedAccountForActionMode,null);
+				announcePgp(selectedAccountForActionMode, null);
 			}
-		 }
-	 }
+		}
+	}
 }

src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java 🔗

@@ -83,7 +83,7 @@ public class JingleConnection {
 				sendSuccess();
 				if (acceptedAutomatically) {
 					message.markUnread();
-					JingleConnection.this.mXmppConnectionService.updateUi(message.getConversation(), true);
+					JingleConnection.this.mXmppConnectionService.notifyUi(message.getConversation(), true);
 				}
 				BitmapFactory.Options options = new BitmapFactory.Options();
 				options.inJustDecodeBounds = true;
@@ -277,7 +277,7 @@ public class JingleConnection {
 					} else {
 						message.markUnread();
 						Log.d("xmppService","not auto accepting new file offer with size: "+size+" allowed size:"+this.mJingleConnectionManager.getAutoAcceptFileSize());
-						this.mXmppConnectionService.updateUi(conversation, true);
+						this.mXmppConnectionService.notifyUi(conversation, true);
 					}
 					this.file = this.mXmppConnectionService.getFileBackend().getJingleFile(message,false);
 					if (message.getEncryption() == Message.ENCRYPTION_OTR) {