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.crypto.PgpEngine;
  8import eu.siacs.conversations.crypto.PgpEngine.UserInputRequiredException;
  9import eu.siacs.conversations.entities.Account;
 10import eu.siacs.conversations.ui.EditAccount.EditAccountListener;
 11import android.app.Activity;
 12import android.app.AlertDialog;
 13import android.content.Context;
 14import android.content.DialogInterface;
 15import android.content.DialogInterface.OnClickListener;
 16import android.content.Intent;
 17import android.content.IntentSender.SendIntentException;
 18import android.os.Bundle;
 19import android.util.Log;
 20import android.view.ActionMode;
 21import android.view.ActionMode.Callback;
 22import android.view.LayoutInflater;
 23import android.view.Menu;
 24import android.view.MenuInflater;
 25import android.view.MenuItem;
 26import android.view.View;
 27import android.view.ViewGroup;
 28import android.widget.AdapterView;
 29import android.widget.AdapterView.OnItemClickListener;
 30import android.widget.AdapterView.OnItemLongClickListener;
 31import android.widget.ArrayAdapter;
 32import android.widget.ListView;
 33import android.widget.TextView;
 34
 35public class ManageAccountActivity extends XmppActivity {
 36
 37	public static final int REQUEST_ANNOUNCE_PGP = 0x73731;
 38	
 39	protected boolean isActionMode = false;
 40	protected ActionMode actionMode;
 41	protected Account selectedAccountForActionMode = null;
 42	
 43	protected List<Account> accountList = new ArrayList<Account>();
 44	protected ListView accountListView;
 45	protected ArrayAdapter<Account> accountListViewAdapter;
 46	protected OnAccountListChangedListener accountChanged = new OnAccountListChangedListener() {
 47
 48		@Override
 49		public void onAccountListChangedListener() {
 50			Log.d("xmppService", "ui on account list changed listener");
 51			accountList.clear();
 52			accountList.addAll(xmppConnectionService.getAccounts());
 53			runOnUiThread(new Runnable() {
 54
 55				@Override
 56				public void run() {
 57					accountListViewAdapter.notifyDataSetChanged();
 58				}
 59			});
 60		}
 61	};
 62
 63	@Override
 64	protected void onCreate(Bundle savedInstanceState) {
 65
 66		super.onCreate(savedInstanceState);
 67
 68		setContentView(R.layout.manage_accounts);
 69
 70		accountListView = (ListView) findViewById(R.id.account_list);
 71		accountListViewAdapter = new ArrayAdapter<Account>(
 72				getApplicationContext(), R.layout.account_row, this.accountList) {
 73			@Override
 74			public View getView(int position, View view, ViewGroup parent) {
 75				Account account = getItem(position);
 76				if (view == null) {
 77					LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 78					view = (View) inflater.inflate(R.layout.account_row, null);
 79				}
 80				((TextView) view.findViewById(R.id.account_jid))
 81						.setText(account.getJid());
 82				TextView statusView = (TextView) view
 83						.findViewById(R.id.account_status);
 84				switch (account.getStatus()) {
 85				case Account.STATUS_DISABLED:
 86					statusView.setText("temporarily disabled");
 87					statusView.setTextColor(0xFF1da9da);
 88					break;
 89				case Account.STATUS_ONLINE:
 90					statusView.setText("online");
 91					statusView.setTextColor(0xFF83b600);
 92					break;
 93				case Account.STATUS_CONNECTING:
 94					statusView.setText("connecting\u2026");
 95					statusView.setTextColor(0xFF1da9da);
 96					break;
 97				case Account.STATUS_OFFLINE:
 98					statusView.setText("offline");
 99					statusView.setTextColor(0xFFe92727);
100					break;
101				case Account.STATUS_UNAUTHORIZED:
102					statusView.setText("unauthorized");
103					statusView.setTextColor(0xFFe92727);
104					break;
105				case Account.STATUS_SERVER_NOT_FOUND:
106					statusView.setText("server not found");
107					statusView.setTextColor(0xFFe92727);
108					break;
109				case Account.STATUS_NO_INTERNET:
110					statusView.setText("no internet");
111					statusView.setTextColor(0xFFe92727);
112					break;
113				case Account.STATUS_SERVER_REQUIRES_TLS:
114					statusView.setText("server requires TLS");
115					statusView.setTextColor(0xFFe92727);
116					break;
117				default:
118					break;
119				}
120
121				return view;
122			}
123		};
124		final XmppActivity activity = this;
125		accountListView.setAdapter(this.accountListViewAdapter);
126		accountListView.setOnItemClickListener(new OnItemClickListener() {
127
128			@Override
129			public void onItemClick(AdapterView<?> arg0, View view,
130					int position, long arg3) {
131				if (!isActionMode) {
132					EditAccount dialog = new EditAccount();
133					dialog.setAccount(accountList.get(position));
134					dialog.setEditAccountListener(new EditAccountListener() {
135	
136						@Override
137						public void onAccountEdited(Account account) {
138							xmppConnectionService.updateAccount(account);
139						}
140					});
141					dialog.show(getFragmentManager(), "edit_account");
142				} else {
143					selectedAccountForActionMode = accountList.get(position);
144					actionMode.invalidate();
145				}
146			}
147		});
148		accountListView.setOnItemLongClickListener(new OnItemLongClickListener() {
149
150			@Override
151			public boolean onItemLongClick(AdapterView<?> arg0, View view,
152					int position, long arg3) {
153				if (!isActionMode) {
154					accountListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
155					accountListView.setItemChecked(position,true);
156					selectedAccountForActionMode = accountList.get(position);
157					actionMode = activity.startActionMode((new ActionMode.Callback() {
158						
159						@Override
160						public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
161							if (selectedAccountForActionMode.isOptionSet(Account.OPTION_DISABLED)) {
162					        	menu.findItem(R.id.account_enable).setVisible(true);
163					        	menu.findItem(R.id.account_disable).setVisible(false);
164					        } else {
165					        	menu.findItem(R.id.account_disable).setVisible(true);
166					        	menu.findItem(R.id.account_enable).setVisible(false);
167					        }
168							return true;
169						}
170						
171						@Override
172						public void onDestroyActionMode(ActionMode mode) {
173							// TODO Auto-generated method stub
174							
175						}
176						
177						@Override
178						public boolean onCreateActionMode(ActionMode mode, Menu menu) {
179							MenuInflater inflater = mode.getMenuInflater();
180					        inflater.inflate(R.menu.manageaccounts_context, menu);
181							return true;
182						}
183						
184						@Override
185						public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
186							if (item.getItemId()==R.id.account_disable) {
187								selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, true);
188								xmppConnectionService.updateAccount(selectedAccountForActionMode);
189								mode.finish();
190							} else if (item.getItemId()==R.id.account_enable) {
191								selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, false);
192								xmppConnectionService.updateAccount(selectedAccountForActionMode);
193								mode.finish();
194							} else if (item.getItemId()==R.id.account_delete) {
195								AlertDialog.Builder builder = new AlertDialog.Builder(activity);
196								builder.setTitle("Are you sure?");
197								builder.setIconAttribute(android.R.attr.alertDialogIcon);
198								builder.setMessage("If you delete your account your entire conversation history will be lost");
199								builder.setPositiveButton("Delete", new OnClickListener() {
200									
201									@Override
202									public void onClick(DialogInterface dialog, int which) {
203										xmppConnectionService.deleteAccount(selectedAccountForActionMode);
204										selectedAccountForActionMode = null;
205										mode.finish();
206									}
207								});
208								builder.setNegativeButton("Cancel",null);
209								builder.create().show();
210							} else if (item.getItemId()==R.id.announce_pgp) {
211								if (activity.hasPgp()) {
212									mode.finish();
213									try {
214										xmppConnectionService.generatePgpAnnouncement(selectedAccountForActionMode);
215									} catch (PgpEngine.UserInputRequiredException e) {
216										try {
217											startIntentSenderForResult(e.getPendingIntent().getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0);
218										} catch (SendIntentException e1) {
219											Log.d("gultsch","sending intent failed");
220										}
221									}
222								}
223							}
224							return true;
225						}
226					}));
227					return true;
228				} else {
229					return false;
230				}
231			}
232		});
233	}
234
235	@Override
236	protected void onStop() {
237		if (xmppConnectionServiceBound) {
238			xmppConnectionService.removeOnAccountListChangedListener();
239		}
240		super.onStop();
241	}
242
243	@Override
244	void onBackendConnected() {
245		xmppConnectionService.setOnAccountListChangedListener(accountChanged);
246		this.accountList.clear();
247		this.accountList.addAll(xmppConnectionService.getAccounts());
248		accountListViewAdapter.notifyDataSetChanged();
249		if (this.accountList.size() == 0) {
250			getActionBar().setDisplayHomeAsUpEnabled(false);
251			addAccount();
252		}
253	}
254
255	@Override
256	public boolean onCreateOptionsMenu(Menu menu) {
257		getMenuInflater().inflate(R.menu.manageaccounts, menu);
258		return true;
259	}
260
261	@Override
262	public boolean onOptionsItemSelected(MenuItem item) {
263		switch (item.getItemId()) {
264		case R.id.action_settings:
265			startActivity(new Intent(this, SettingsActivity.class));
266			break;
267		case R.id.action_add_account:
268			addAccount();
269			break;
270		default:
271			break;
272		}
273		return super.onOptionsItemSelected(item);
274	}
275
276	protected void addAccount() {
277		final Activity activity = this;
278		EditAccount dialog = new EditAccount();
279		dialog.setEditAccountListener(new EditAccountListener() {
280
281			@Override
282			public void onAccountEdited(Account account) {
283				xmppConnectionService.createAccount(account);
284				activity.getActionBar().setDisplayHomeAsUpEnabled(true);
285			}
286		});
287		dialog.show(getFragmentManager(), "add_account");
288	}
289
290	
291	@Override
292	public void onActionModeStarted(ActionMode mode) {
293		super.onActionModeStarted(mode);
294		this.isActionMode = true;
295	}
296	
297	@Override
298	public void onActionModeFinished(ActionMode mode) {
299		super.onActionModeFinished(mode);
300		this.isActionMode = false;
301		accountListView.clearChoices();
302		accountListView.requestLayout();
303		accountListView.post(new Runnable() {
304            @Override
305            public void run() {
306                accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
307            }
308        });
309	}
310	
311	 @Override
312	 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
313		 super.onActivityResult(requestCode, resultCode, data);
314		 if (resultCode == RESULT_OK) {
315			if (requestCode == REQUEST_ANNOUNCE_PGP) {
316				 try {
317					xmppConnectionService.generatePgpAnnouncement(selectedAccountForActionMode);
318				} catch (UserInputRequiredException e) {
319					Log.d("gultsch","already came back. ignoring");
320				}
321			 }
322		 }
323	 }
324}