1package de.gultsch.chat.ui;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import de.gultsch.chat.R;
7import de.gultsch.chat.entities.Account;
8import de.gultsch.chat.ui.EditAccount.EditAccountListener;
9import android.app.Activity;
10import android.app.AlertDialog;
11import android.content.Context;
12import android.content.Intent;
13import android.os.Bundle;
14import android.util.Log;
15import android.view.ActionMode;
16import android.view.ActionMode.Callback;
17import android.view.LayoutInflater;
18import android.view.Menu;
19import android.view.MenuInflater;
20import android.view.MenuItem;
21import android.view.View;
22import android.view.ViewGroup;
23import android.widget.AdapterView;
24import android.widget.AdapterView.OnItemClickListener;
25import android.widget.AdapterView.OnItemLongClickListener;
26import android.widget.ArrayAdapter;
27import android.widget.ListView;
28import android.widget.TextView;
29
30public class ManageAccountActivity extends XmppActivity implements ActionMode.Callback {
31
32 protected boolean isActionMode = false;
33 protected ActionMode actionMode;
34 protected Account selectedAccountForActionMode = null;
35
36 protected List<Account> accountList = new ArrayList<Account>();
37 protected ListView accountListView;
38 protected ArrayAdapter<Account> accountListViewAdapter;
39 protected OnAccountListChangedListener accountChanged = new OnAccountListChangedListener() {
40
41 @Override
42 public void onAccountListChangedListener() {
43 Log.d("xmppService", "ui on account list changed listener");
44 accountList.clear();
45 accountList.addAll(xmppConnectionService.getAccounts());
46 runOnUiThread(new Runnable() {
47
48 @Override
49 public void run() {
50 if (accountList.size() == 1) {
51 startActivity(new Intent(getApplicationContext(),
52 NewConversationActivity.class));
53 }
54 accountListViewAdapter.notifyDataSetChanged();
55 }
56 });
57 }
58 };
59
60 @Override
61 protected void onCreate(Bundle savedInstanceState) {
62
63 super.onCreate(savedInstanceState);
64
65 setContentView(R.layout.manage_accounts);
66
67 accountListView = (ListView) findViewById(R.id.account_list);
68 accountListViewAdapter = new ArrayAdapter<Account>(
69 getApplicationContext(), R.layout.account_row, this.accountList) {
70 @Override
71 public View getView(int position, View view, ViewGroup parent) {
72 Account account = getItem(position);
73 if (view == null) {
74 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
75 view = (View) inflater.inflate(R.layout.account_row, null);
76 }
77 ((TextView) view.findViewById(R.id.account_jid))
78 .setText(account.getJid());
79 TextView statusView = (TextView) view
80 .findViewById(R.id.account_status);
81 switch (account.getStatus()) {
82 case Account.STATUS_DISABLED:
83 statusView.setText("temporarily disabled");
84 statusView.setTextColor(0xFF1da9da);
85 break;
86 case Account.STATUS_ONLINE:
87 statusView.setText("online");
88 statusView.setTextColor(0xFF83b600);
89 break;
90 case Account.STATUS_OFFLINE:
91 statusView.setText("offline");
92 statusView.setTextColor(0xFFe92727);
93 break;
94 case Account.STATUS_UNAUTHORIZED:
95 statusView.setText("unauthorized");
96 statusView.setTextColor(0xFFe92727);
97 break;
98 case Account.STATUS_SERVER_NOT_FOUND:
99 statusView.setText("server not found");
100 statusView.setTextColor(0xFFe92727);
101 break;
102 default:
103 break;
104 }
105
106 return view;
107 }
108 };
109 final Activity activity = this;
110 accountListView.setAdapter(this.accountListViewAdapter);
111 accountListView.setOnItemClickListener(new OnItemClickListener() {
112
113 @Override
114 public void onItemClick(AdapterView<?> arg0, View view,
115 int position, long arg3) {
116 if (!isActionMode) {
117 EditAccount dialog = new EditAccount();
118 dialog.setAccount(accountList.get(position));
119 dialog.setEditAccountListener(new EditAccountListener() {
120
121 @Override
122 public void onAccountEdited(Account account) {
123 xmppConnectionService.updateAccount(account);
124 }
125
126 @Override
127 public void onAccountDelete(Account account) {
128 xmppConnectionService.deleteAccount(account);
129 }
130 });
131 dialog.show(getFragmentManager(), "edit_account");
132 } else {
133 selectedAccountForActionMode = accountList.get(position);
134 actionMode.invalidate();
135 }
136 }
137 });
138 accountListView.setOnItemLongClickListener(new OnItemLongClickListener() {
139
140 @Override
141 public boolean onItemLongClick(AdapterView<?> arg0, View view,
142 int position, long arg3) {
143 if (!isActionMode) {
144 accountListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
145 accountListView.setItemChecked(position,true);
146 selectedAccountForActionMode = accountList.get(position);
147 actionMode = activity.startActionMode((Callback) activity);
148 return true;
149 } else {
150 return false;
151 }
152 }
153 });
154 }
155
156 @Override
157 protected void onStop() {
158 super.onStop();
159 if (xmppConnectionServiceBound) {
160 xmppConnectionService.removeOnAccountListChangedListener();
161 unbindService(mConnection);
162 xmppConnectionServiceBound = false;
163 }
164 }
165
166 @Override
167 void onBackendConnected() {
168 xmppConnectionService.setOnAccountListChangedListener(accountChanged);
169 this.accountList.clear();
170 this.accountList.addAll(xmppConnectionService.getAccounts());
171 accountListViewAdapter.notifyDataSetChanged();
172 if (this.accountList.size() == 0) {
173 getActionBar().setDisplayHomeAsUpEnabled(false);
174 addAccount();
175 }
176 }
177
178 @Override
179 public boolean onCreateOptionsMenu(Menu menu) {
180 // Inflate the menu; this adds items to the action bar if it is present.
181 getMenuInflater().inflate(R.menu.manageaccounts, menu);
182 return true;
183 }
184
185 @Override
186 public boolean onOptionsItemSelected(MenuItem item) {
187 switch (item.getItemId()) {
188 case R.id.action_settings:
189 startActivity(new Intent(this, SettingsActivity.class));
190 break;
191 case R.id.action_add_account:
192 addAccount();
193 break;
194 default:
195 break;
196 }
197 return super.onOptionsItemSelected(item);
198 }
199
200 protected void addAccount() {
201 final Activity activity = this;
202 EditAccount dialog = new EditAccount();
203 dialog.setEditAccountListener(new EditAccountListener() {
204
205 @Override
206 public void onAccountEdited(Account account) {
207 xmppConnectionService.createAccount(account);
208 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
209 }
210
211 @Override
212 public void onAccountDelete(Account account) {
213 // this will never be called
214 }
215 });
216 dialog.show(getFragmentManager(), "add_account");
217 }
218
219 @Override
220 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
221 if (item.getItemId()==R.id.account_disable) {
222 selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, true);
223 xmppConnectionService.updateAccount(selectedAccountForActionMode);
224 mode.finish();
225 } else if (item.getItemId()==R.id.account_enable) {
226 selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, false);
227 xmppConnectionService.updateAccount(selectedAccountForActionMode);
228 mode.finish();
229 }
230 return true;
231 }
232
233 @Override
234 public boolean onCreateActionMode(ActionMode mode, Menu menu) {
235 MenuInflater inflater = mode.getMenuInflater();
236 inflater.inflate(R.menu.manageaccounts_context, menu);
237 return true;
238 }
239
240 @Override
241 public void onDestroyActionMode(ActionMode mode) {
242 // TODO Auto-generated method stub
243
244 }
245
246 @Override
247 public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
248 if (selectedAccountForActionMode.isOptionSet(Account.OPTION_DISABLED)) {
249 menu.findItem(R.id.account_enable).setVisible(true);
250 menu.findItem(R.id.account_disable).setVisible(false);
251 } else {
252 menu.findItem(R.id.account_disable).setVisible(true);
253 menu.findItem(R.id.account_enable).setVisible(false);
254 }
255 return true;
256 }
257
258 @Override
259 public void onActionModeStarted(ActionMode mode) {
260 super.onActionModeStarted(mode);
261 this.isActionMode = true;
262 }
263
264 @Override
265 public void onActionModeFinished(ActionMode mode) {
266 super.onActionModeFinished(mode);
267 this.isActionMode = false;
268 accountListView.clearChoices();
269 accountListView.requestLayout();
270 accountListView.post(new Runnable() {
271 @Override
272 public void run() {
273 accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
274 }
275 });
276 }
277}