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				default:
114					break;
115				}
116
117				return view;
118			}
119		};
120		final XmppActivity activity = this;
121		accountListView.setAdapter(this.accountListViewAdapter);
122		accountListView.setOnItemClickListener(new OnItemClickListener() {
123
124			@Override
125			public void onItemClick(AdapterView<?> arg0, View view,
126					int position, long arg3) {
127				if (!isActionMode) {
128					EditAccount dialog = new EditAccount();
129					dialog.setAccount(accountList.get(position));
130					dialog.setEditAccountListener(new EditAccountListener() {
131	
132						@Override
133						public void onAccountEdited(Account account) {
134							xmppConnectionService.updateAccount(account);
135						}
136					});
137					dialog.show(getFragmentManager(), "edit_account");
138				} else {
139					selectedAccountForActionMode = accountList.get(position);
140					actionMode.invalidate();
141				}
142			}
143		});
144		accountListView.setOnItemLongClickListener(new OnItemLongClickListener() {
145
146			@Override
147			public boolean onItemLongClick(AdapterView<?> arg0, View view,
148					int position, long arg3) {
149				if (!isActionMode) {
150					accountListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
151					accountListView.setItemChecked(position,true);
152					selectedAccountForActionMode = accountList.get(position);
153					actionMode = activity.startActionMode((new ActionMode.Callback() {
154						
155						@Override
156						public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
157							if (selectedAccountForActionMode.isOptionSet(Account.OPTION_DISABLED)) {
158					        	menu.findItem(R.id.account_enable).setVisible(true);
159					        	menu.findItem(R.id.account_disable).setVisible(false);
160					        } else {
161					        	menu.findItem(R.id.account_disable).setVisible(true);
162					        	menu.findItem(R.id.account_enable).setVisible(false);
163					        }
164							return true;
165						}
166						
167						@Override
168						public void onDestroyActionMode(ActionMode mode) {
169							// TODO Auto-generated method stub
170							
171						}
172						
173						@Override
174						public boolean onCreateActionMode(ActionMode mode, Menu menu) {
175							MenuInflater inflater = mode.getMenuInflater();
176					        inflater.inflate(R.menu.manageaccounts_context, menu);
177							return true;
178						}
179						
180						@Override
181						public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
182							if (item.getItemId()==R.id.account_disable) {
183								selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, true);
184								xmppConnectionService.updateAccount(selectedAccountForActionMode);
185								mode.finish();
186							} else if (item.getItemId()==R.id.account_enable) {
187								selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, false);
188								xmppConnectionService.updateAccount(selectedAccountForActionMode);
189								mode.finish();
190							} else if (item.getItemId()==R.id.account_delete) {
191								AlertDialog.Builder builder = new AlertDialog.Builder(activity);
192								builder.setTitle("Are you sure?");
193								builder.setIconAttribute(android.R.attr.alertDialogIcon);
194								builder.setMessage("If you delete your account your entire conversation history will be lost");
195								builder.setPositiveButton("Delete", new OnClickListener() {
196									
197									@Override
198									public void onClick(DialogInterface dialog, int which) {
199										xmppConnectionService.deleteAccount(selectedAccountForActionMode);
200										selectedAccountForActionMode = null;
201										mode.finish();
202									}
203								});
204								builder.setNegativeButton("Cancel",null);
205								builder.create().show();
206							} else if (item.getItemId()==R.id.announce_pgp) {
207								if (activity.hasPgp()) {
208									mode.finish();
209									try {
210										xmppConnectionService.generatePgpAnnouncement(selectedAccountForActionMode);
211									} catch (PgpEngine.UserInputRequiredException e) {
212										try {
213											startIntentSenderForResult(e.getPendingIntent().getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0);
214										} catch (SendIntentException e1) {
215											Log.d("gultsch","sending intent failed");
216										}
217									}
218								}
219							}
220							return true;
221						}
222					}));
223					return true;
224				} else {
225					return false;
226				}
227			}
228		});
229	}
230
231	@Override
232	protected void onStop() {
233		if (xmppConnectionServiceBound) {
234			xmppConnectionService.removeOnAccountListChangedListener();
235		}
236		super.onStop();
237	}
238
239	@Override
240	void onBackendConnected() {
241		xmppConnectionService.setOnAccountListChangedListener(accountChanged);
242		this.accountList.clear();
243		this.accountList.addAll(xmppConnectionService.getAccounts());
244		accountListViewAdapter.notifyDataSetChanged();
245		if (this.accountList.size() == 0) {
246			getActionBar().setDisplayHomeAsUpEnabled(false);
247			addAccount();
248		}
249	}
250
251	@Override
252	public boolean onCreateOptionsMenu(Menu menu) {
253		getMenuInflater().inflate(R.menu.manageaccounts, menu);
254		return true;
255	}
256
257	@Override
258	public boolean onOptionsItemSelected(MenuItem item) {
259		switch (item.getItemId()) {
260		case R.id.action_settings:
261			startActivity(new Intent(this, SettingsActivity.class));
262			break;
263		case R.id.action_add_account:
264			addAccount();
265			break;
266		default:
267			break;
268		}
269		return super.onOptionsItemSelected(item);
270	}
271
272	protected void addAccount() {
273		final Activity activity = this;
274		EditAccount dialog = new EditAccount();
275		dialog.setEditAccountListener(new EditAccountListener() {
276
277			@Override
278			public void onAccountEdited(Account account) {
279				xmppConnectionService.createAccount(account);
280				activity.getActionBar().setDisplayHomeAsUpEnabled(true);
281			}
282		});
283		dialog.show(getFragmentManager(), "add_account");
284	}
285
286	
287	@Override
288	public void onActionModeStarted(ActionMode mode) {
289		super.onActionModeStarted(mode);
290		this.isActionMode = true;
291	}
292	
293	@Override
294	public void onActionModeFinished(ActionMode mode) {
295		super.onActionModeFinished(mode);
296		this.isActionMode = false;
297		accountListView.clearChoices();
298		accountListView.requestLayout();
299		accountListView.post(new Runnable() {
300            @Override
301            public void run() {
302                accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
303            }
304        });
305	}
306	
307	 @Override
308	 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
309		 super.onActivityResult(requestCode, resultCode, data);
310		 if (resultCode == RESULT_OK) {
311			if (requestCode == REQUEST_ANNOUNCE_PGP) {
312				 try {
313					xmppConnectionService.generatePgpAnnouncement(selectedAccountForActionMode);
314				} catch (UserInputRequiredException e) {
315					Log.d("gultsch","already came back. ignoring");
316				}
317			 }
318		 }
319	 }
320}