ManageAccountActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import java.util.ArrayList;
  4import java.util.List;
  5
  6import eu.siacs.conversations.R;
  7import eu.siacs.conversations.entities.Account;
  8import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
  9import eu.siacs.conversations.ui.adapter.AccountAdapter;
 10import eu.siacs.conversations.xmpp.XmppConnection;
 11import android.app.AlertDialog;
 12import android.content.DialogInterface;
 13import android.content.DialogInterface.OnClickListener;
 14import android.content.Intent;
 15import android.os.Bundle;
 16import android.os.SystemClock;
 17import android.view.ActionMode;
 18import android.view.Menu;
 19import android.view.MenuInflater;
 20import android.view.MenuItem;
 21import android.view.View;
 22import android.widget.AdapterView;
 23import android.widget.AdapterView.OnItemClickListener;
 24import android.widget.AdapterView.OnItemLongClickListener;
 25import android.widget.ListView;
 26import android.widget.TextView;
 27
 28public class ManageAccountActivity extends XmppActivity {
 29
 30	protected boolean isActionMode = false;
 31	protected ActionMode actionMode;
 32	protected Account selectedAccountForActionMode = null;
 33	protected ManageAccountActivity activity = this;
 34
 35	protected boolean firstrun = true;
 36
 37	protected List<Account> accountList = new ArrayList<Account>();
 38	protected ListView accountListView;
 39	protected AccountAdapter mAccountAdapter;
 40	protected OnAccountUpdate accountChanged = new OnAccountUpdate() {
 41
 42		@Override
 43		public void onAccountUpdate() {
 44			accountList.clear();
 45			accountList.addAll(xmppConnectionService.getAccounts());
 46			runOnUiThread(new Runnable() {
 47
 48				@Override
 49				public void run() {
 50					mAccountAdapter.notifyDataSetChanged();
 51				}
 52			});
 53		}
 54	};
 55
 56	protected ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
 57
 58		@Override
 59		public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
 60			if (selectedAccountForActionMode
 61					.isOptionSet(Account.OPTION_DISABLED)) {
 62				menu.findItem(R.id.mgmt_account_enable).setVisible(true);
 63				menu.findItem(R.id.mgmt_account_disable).setVisible(false);
 64			} else {
 65				menu.findItem(R.id.mgmt_account_disable).setVisible(true);
 66				menu.findItem(R.id.mgmt_account_enable).setVisible(false);
 67			}
 68			return true;
 69		}
 70
 71		@Override
 72		public void onDestroyActionMode(ActionMode mode) {
 73			// TODO Auto-generated method stub
 74
 75		}
 76
 77		@Override
 78		public boolean onCreateActionMode(ActionMode mode, Menu menu) {
 79			MenuInflater inflater = mode.getMenuInflater();
 80			inflater.inflate(R.menu.manageaccounts_context, menu);
 81			return true;
 82		}
 83
 84		@Override
 85		public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
 86			if (item.getItemId() == R.id.mgmt_account_edit) {
 87				editAccount(selectedAccountForActionMode);
 88			} else if (item.getItemId() == R.id.mgmt_account_disable) {
 89				selectedAccountForActionMode.setOption(Account.OPTION_DISABLED,
 90						true);
 91				xmppConnectionService
 92						.updateAccount(selectedAccountForActionMode);
 93				mode.finish();
 94			} else if (item.getItemId() == R.id.mgmt_account_enable) {
 95				selectedAccountForActionMode.setOption(Account.OPTION_DISABLED,
 96						false);
 97				xmppConnectionService
 98						.updateAccount(selectedAccountForActionMode);
 99				mode.finish();
100			} else if (item.getItemId() == R.id.mgmt_account_publish_avatar) {
101				Intent intent = new Intent(getApplicationContext(), PublishProfilePictureActivity.class);
102				intent.putExtra("account", selectedAccountForActionMode.getJid());
103				startActivity(intent);
104			} else if (item.getItemId() == R.id.mgmt_account_delete) {
105				AlertDialog.Builder builder = new AlertDialog.Builder(activity);
106				builder.setTitle(getString(R.string.mgmt_account_are_you_sure));
107				builder.setIconAttribute(android.R.attr.alertDialogIcon);
108				builder.setMessage(getString(R.string.mgmt_account_delete_confirm_text));
109				builder.setPositiveButton(getString(R.string.delete),
110						new OnClickListener() {
111
112							@Override
113							public void onClick(DialogInterface dialog,
114									int which) {
115								xmppConnectionService
116										.deleteAccount(selectedAccountForActionMode);
117								selectedAccountForActionMode = null;
118								mode.finish();
119							}
120						});
121				builder.setNegativeButton(getString(R.string.cancel), null);
122				builder.create().show();
123			} else if (item.getItemId() == R.id.mgmt_account_announce_pgp) {
124				if (activity.hasPgp()) {
125					mode.finish();
126					announcePgp(selectedAccountForActionMode, null);
127				} else {
128					activity.showInstallPgpDialog();
129				}
130			} else if (item.getItemId() == R.id.mgmt_otr_key) {
131				AlertDialog.Builder builder = new AlertDialog.Builder(activity);
132				builder.setTitle("OTR Fingerprint");
133				String fingerprintTxt = selectedAccountForActionMode
134						.getOtrFingerprint(getApplicationContext());
135				View view = (View) getLayoutInflater().inflate(
136						R.layout.otr_fingerprint, null);
137				if (fingerprintTxt != null) {
138					TextView fingerprint = (TextView) view
139							.findViewById(R.id.otr_fingerprint);
140					TextView noFingerprintView = (TextView) view
141							.findViewById(R.id.otr_no_fingerprint);
142					fingerprint.setText(fingerprintTxt);
143					fingerprint.setVisibility(View.VISIBLE);
144					noFingerprintView.setVisibility(View.GONE);
145				}
146				builder.setView(view);
147				builder.setPositiveButton(getString(R.string.done), null);
148				builder.create().show();
149			}
150			return true;
151		}
152
153	};
154
155	@Override
156	protected void onCreate(Bundle savedInstanceState) {
157
158		super.onCreate(savedInstanceState);
159
160		setContentView(R.layout.manage_accounts);
161
162		accountListView = (ListView) findViewById(R.id.account_list);
163		final XmppActivity activity = this;
164		this.mAccountAdapter = new AccountAdapter(this, accountList);
165		accountListView.setAdapter(this.mAccountAdapter);
166		accountListView.setOnItemClickListener(new OnItemClickListener() {
167
168			@Override
169			public void onItemClick(AdapterView<?> arg0, View view,
170					int position, long arg3) {
171				if (!isActionMode) {
172					editAccount(accountList.get(position));
173				} else {
174					selectedAccountForActionMode = accountList.get(position);
175					actionMode.invalidate();
176				}
177			}
178		});
179		accountListView
180				.setOnItemLongClickListener(new OnItemLongClickListener() {
181
182					@Override
183					public boolean onItemLongClick(AdapterView<?> arg0,
184							View view, int position, long arg3) {
185						if (!isActionMode) {
186							accountListView
187									.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
188							accountListView.setItemChecked(position, true);
189							selectedAccountForActionMode = accountList
190									.get(position);
191							actionMode = activity
192									.startActionMode(mActionModeCallback);
193							return true;
194						} else {
195							return false;
196						}
197					}
198				});
199	}
200
201	@Override
202	protected void onStop() {
203		if (xmppConnectionServiceBound) {
204			xmppConnectionService.removeOnAccountListChangedListener();
205		}
206		super.onStop();
207	}
208
209	@Override
210	void onBackendConnected() {
211		xmppConnectionService.setOnAccountListChangedListener(accountChanged);
212		this.accountList.clear();
213		this.accountList.addAll(xmppConnectionService.getAccounts());
214		mAccountAdapter.notifyDataSetChanged();
215		if ((this.accountList.size() == 0) && (this.firstrun)) {
216			getActionBar().setDisplayHomeAsUpEnabled(false);
217			getActionBar().setHomeButtonEnabled(false);
218			this.firstrun = false;
219		}
220	}
221
222	@Override
223	public boolean onCreateOptionsMenu(Menu menu) {
224		getMenuInflater().inflate(R.menu.manageaccounts, menu);
225		return true;
226	}
227
228	@Override
229	public boolean onOptionsItemSelected(MenuItem item) {
230		switch (item.getItemId()) {
231		case R.id.action_add_account:
232			startActivity(new Intent(getApplicationContext(), EditAccountActivity.class));
233			break;
234		default:
235			break;
236		}
237		return super.onOptionsItemSelected(item);
238	}
239
240	@Override
241	public boolean onNavigateUp() {
242		if (xmppConnectionService.getConversations().size() == 0) {
243			Intent contactsIntent = new Intent(this,
244					StartConversationActivity.class);
245			contactsIntent.setFlags(
246			// if activity exists in stack, pop the stack and go back to it
247					Intent.FLAG_ACTIVITY_CLEAR_TOP |
248					// otherwise, make a new task for it
249							Intent.FLAG_ACTIVITY_NEW_TASK |
250							// don't use the new activity animation; finish
251							// animation runs instead
252							Intent.FLAG_ACTIVITY_NO_ANIMATION);
253			startActivity(contactsIntent);
254			finish();
255			return true;
256		} else {
257			return super.onNavigateUp();
258		}
259	}
260
261	private void editAccount(Account account) {
262		Intent intent = new Intent(this, EditAccountActivity.class);
263		intent.putExtra("jid", account.getJid());
264		startActivity(intent);
265	}
266
267	@Override
268	public void onActionModeStarted(ActionMode mode) {
269		super.onActionModeStarted(mode);
270		this.isActionMode = true;
271	}
272
273	@Override
274	public void onActionModeFinished(ActionMode mode) {
275		super.onActionModeFinished(mode);
276		this.isActionMode = false;
277		accountListView.clearChoices();
278		accountListView.requestLayout();
279		accountListView.post(new Runnable() {
280			@Override
281			public void run() {
282				accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
283			}
284		});
285	}
286
287	@Override
288	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
289		super.onActivityResult(requestCode, resultCode, data);
290		if (resultCode == RESULT_OK) {
291			if (requestCode == REQUEST_ANNOUNCE_PGP) {
292				announcePgp(selectedAccountForActionMode, null);
293			}
294		}
295	}
296}