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}