diff --git a/src/eu/siacs/conversations/crypto/PgpEngine.java b/src/eu/siacs/conversations/crypto/PgpEngine.java index c0d8ca074..2d0c56e17 100644 --- a/src/eu/siacs/conversations/crypto/PgpEngine.java +++ b/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: diff --git a/src/eu/siacs/conversations/parser/MessageParser.java b/src/eu/siacs/conversations/parser/MessageParser.java index 3d2d1f2c9..1673fbf09 100644 --- a/src/eu/siacs/conversations/parser/MessageParser.java +++ b/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); } } diff --git a/src/eu/siacs/conversations/parser/PresenceParser.java b/src/eu/siacs/conversations/parser/PresenceParser.java index cce96b3ba..bd2aa636b 100644 --- a/src/eu/siacs/conversations/parser/PresenceParser.java +++ b/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(); } } } diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index f8a5d9740..0f90f725b 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/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(); + } } diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java index 209ff3b82..66db353be 100644 --- a/src/eu/siacs/conversations/ui/ConversationActivity.java +++ b/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 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(); } } diff --git a/src/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/eu/siacs/conversations/ui/ManageAccountActivity.java index 7e5a60c58..c3f1e105d 100644 --- a/src/eu/siacs/conversations/ui/ManageAccountActivity.java +++ b/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 accountList = new ArrayList(); protected ListView accountListView; protected ArrayAdapter 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(); - } - return true; - } - - })); - return true; - } else { - return false; - } - } - }); + @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; + } + } + }); } - + @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 - 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); + @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) { + if (requestCode == REQUEST_ANNOUNCE_PGP) { + announcePgp(selectedAccountForActionMode, null); + } + } + } } diff --git a/src/eu/siacs/conversations/ui/OnAccountListChangedListener.java b/src/eu/siacs/conversations/ui/OnAccountListChangedListener.java deleted file mode 100644 index 98ef445ec..000000000 --- a/src/eu/siacs/conversations/ui/OnAccountListChangedListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package eu.siacs.conversations.ui; - -public interface OnAccountListChangedListener { - public void onAccountListChangedListener(); -} diff --git a/src/eu/siacs/conversations/ui/OnConversationListChangedListener.java b/src/eu/siacs/conversations/ui/OnConversationListChangedListener.java deleted file mode 100644 index 2a922e218..000000000 --- a/src/eu/siacs/conversations/ui/OnConversationListChangedListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package eu.siacs.conversations.ui; - -public interface OnConversationListChangedListener { - public void onConversationListChanged(); -} diff --git a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index 7a867ef7b..f1a0373c5 100644 --- a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/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) {