blob: 52fabeddc47d843495b2c23a14ac57a5d9451309 [file] [log] [blame]
Alexandre Savard2b370f02012-09-06 16:06:01 -04001/*
2 * Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
3 *
4 * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 * Additional permission under GNU GPL version 3 section 7:
21 *
22 * If you modify this program, or any covered work, by linking or
23 * combining it with the OpenSSL project's OpenSSL library (or a
24 * modified version of that library), containing parts covered by the
25 * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
26 * grants you additional permission to convey the resulting work.
27 * Corresponding Source for a non-source form of such a combination
28 * shall include the source code for the parts of OpenSSL used as well
29 * as that of the covered work.
30 */
31
32package com.savoirfairelinux.sflphone.client;
33
Alexandre Savard9a93f062012-09-11 10:42:43 -040034import android.app.Activity;
Alexandre Savard4f11d7a2012-10-18 13:15:36 -040035import android.content.BroadcastReceiver;
Alexandre Savardae992932012-10-17 10:26:12 -040036import android.content.Context;
Alexandre Savard53d2ddd2012-09-30 22:04:40 -040037import android.content.Intent;
Alexandre Savard4f11d7a2012-10-18 13:15:36 -040038import android.content.IntentFilter;
Alexandre Savard9a93f062012-09-11 10:42:43 -040039import android.preference.EditTextPreference;
40import android.preference.Preference;
41import android.preference.PreferenceCategory;
42import android.preference.PreferenceFragment;
43import android.preference.PreferenceScreen;
Alexandre Savard70982012012-09-27 17:15:50 -040044import android.preference.ListPreference;
Alexandre Savarde990d052012-10-18 14:43:09 -040045import android.preference.PreferenceManager;
Alexandre Savard2b370f02012-09-06 16:06:01 -040046import android.os.Bundle;
Alexandre Savard12dc3ac2012-09-27 11:17:39 -040047import android.os.RemoteException;
Alexandre Savard4f11d7a2012-10-18 13:15:36 -040048import android.support.v4.content.LocalBroadcastManager;
Alexandre Savard2b370f02012-09-06 16:06:01 -040049import android.util.Log;
Alexandre Savard2b370f02012-09-06 16:06:01 -040050import android.view.View;
Alexandre Savard9a93f062012-09-11 10:42:43 -040051import android.widget.ArrayAdapter;
52import android.widget.ListView;
Alexandre Savard4f11d7a2012-10-18 13:15:36 -040053
54import java.util.Set;
Alexandre Savard9a93f062012-09-11 10:42:43 -040055import java.util.HashMap;
Alexandre Savard52a72522012-09-27 16:40:13 -040056import java.util.ArrayList;
Alexandre Savard2b370f02012-09-06 16:06:01 -040057
58import com.savoirfairelinux.sflphone.R;
Alexandre Savard12dc3ac2012-09-27 11:17:39 -040059import com.savoirfairelinux.sflphone.service.ISipService;
Alexandre Savardae992932012-10-17 10:26:12 -040060import com.savoirfairelinux.sflphone.utils.AccountDetail;
Alexandre Savard8f27d162012-10-05 16:30:28 -040061import com.savoirfairelinux.sflphone.utils.AccountDetailsHandler;
Alexandre Savardae992932012-10-17 10:26:12 -040062import com.savoirfairelinux.sflphone.utils.AccountDetailBasic;
63import com.savoirfairelinux.sflphone.utils.AccountDetailAdvanced;
64import com.savoirfairelinux.sflphone.utils.AccountDetailSrtp;
65import com.savoirfairelinux.sflphone.utils.AccountDetailTls;
Alexandre Savard68838112012-10-30 11:34:43 -040066import com.savoirfairelinux.sflphone.client.AccountPreferenceActivity;
Alexandre Savard2b370f02012-09-06 16:06:01 -040067
Alexandre Savard9a93f062012-09-11 10:42:43 -040068public class AccountManagementFragment extends PreferenceFragment
Alexandre Savard2b370f02012-09-06 16:06:01 -040069{
70 static final String TAG = "AccountManagementFragment";
Alexandre Savarda6c0d992012-09-28 09:24:13 -040071 static final String DEFAULT_ACCOUNT_ID = "IP2IP";
Alexandre Savard53d2ddd2012-09-30 22:04:40 -040072 static final int ACCOUNT_CREATE_REQUEST = 1;
Alexandre Savard68838112012-10-30 11:34:43 -040073 static final int ACCOUNT_EDIT_REQUEST = 2;
Emeric Vigier1f1ced32012-11-02 16:56:32 -040074 private SFLPhonePreferenceActivity sflphonePreferenceActivity;
Emeric Vigier0038a612012-11-06 18:51:19 -050075 private ISipService service = null;
Alexandre Savardae992932012-10-17 10:26:12 -040076
Alexandre Savard5195d922012-10-30 16:58:50 -040077 ArrayList<AccountDetail.PreferenceEntry> basicDetailKeys = null;
78 ArrayList<AccountDetail.PreferenceEntry> advancedDetailKeys = null;
79 ArrayList<AccountDetail.PreferenceEntry> srtpDetailKeys = null;
80 ArrayList<AccountDetail.PreferenceEntry> tlsDetailKeys = null;
81 HashMap<String, Preference> accountPreferenceHashMap = null;
Alexandre Savard68838112012-10-30 11:34:43 -040082 PreferenceScreen mRoot = null;
Alexandre Savardae992932012-10-17 10:26:12 -040083
Emeric Vigier1f1ced32012-11-02 16:56:32 -040084 @Override
85 public void onAttach(Activity activity) {
86 super.onAttach(activity);
87 sflphonePreferenceActivity = (SFLPhonePreferenceActivity) activity;
88 service = sflphonePreferenceActivity.getSipService();
Emeric Vigier364499e2012-11-06 19:15:45 -050089 Log.w(TAG, "onAttach() service=" + service);
Emeric Vigier1f1ced32012-11-02 16:56:32 -040090 }
Alexandre Savard12dc3ac2012-09-27 11:17:39 -040091
Emeric Vigier1f1ced32012-11-02 16:56:32 -040092 public AccountManagementFragment()
Alexandre Savard12dc3ac2012-09-27 11:17:39 -040093 {
Alexandre Savardae992932012-10-17 10:26:12 -040094 basicDetailKeys = AccountDetailBasic.getPreferenceEntries();
95 advancedDetailKeys = AccountDetailAdvanced.getPreferenceEntries();
Alexandre Savardc63f54b2012-10-17 10:39:40 -040096 srtpDetailKeys = AccountDetailSrtp.getPreferenceEntries();
97 tlsDetailKeys = AccountDetailTls.getPreferenceEntries();
Alexandre Savard5195d922012-10-30 16:58:50 -040098
99 accountPreferenceHashMap = new HashMap<String, Preference>();
Alexandre Savard12dc3ac2012-09-27 11:17:39 -0400100 }
Alexandre Savard2b370f02012-09-06 16:06:01 -0400101
102 @Override
103 public void onCreate(Bundle savedInstanceState)
104 {
105 super.onCreate(savedInstanceState);
106
Alexandre Savard9a93f062012-09-11 10:42:43 -0400107 Log.i(TAG, "Create Account Management Fragment");
Alexandre Savard2b370f02012-09-06 16:06:01 -0400108
Emeric Vigier0038a612012-11-06 18:51:19 -0500109 /*
110 * FIXME if service cannot be obtained from SFLPhonePreferenceActivity,
111 * then get it from Application
112 */
113 service = sflphonePreferenceActivity.getSipService();
114 if (service == null) {
115 service = ((SFLphoneApplication)sflphonePreferenceActivity.getApplication()).getSipService();
116 if (service == null) {
117 Log.e(TAG, "onCreate() service=" + service);
118 }
119 }
120 Log.w(TAG, "onCreate() service=" + service);
121
Alexandre Savard70982012012-09-27 17:15:50 -0400122 setPreferenceScreen(getAccountListPreferenceScreen());
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400123
124 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver, new IntentFilter("accounts-changed"));
Alexandre Savard2b370f02012-09-06 16:06:01 -0400125 }
126
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400127 @Override
128 public void onStop()
129 {
130 super.onStop();
131 Log.i(TAG, "onStop");
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400132 }
133
134 @Override
135 public void onDestroy()
136 {
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400137 LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mMessageReceiver);
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400138 super.onDestroy();
139 Log.i(TAG, "onDestroy");
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400140 }
141
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400142 @Override
143 public void onActivityResult(int requestCode, int resultCode, Intent data) {
Alexandre Savard68838112012-10-30 11:34:43 -0400144 switch(requestCode) {
145 case ACCOUNT_CREATE_REQUEST:
146 Log.i(TAG, "ACCOUNT_CREATE_REQUEST Done");
147 break;
148 case ACCOUNT_EDIT_REQUEST:
149 if(resultCode == AccountPreferenceActivity.ACCOUNT_MODIFIED) {
150 Bundle bundle = data.getExtras();
151 String accountID = bundle.getString("AccountID");
152 Log.i(TAG, "Update account settings for " + accountID);
Alexandre Savard833616f2012-10-30 16:02:30 -0400153
154 AccountDetailBasic basicDetails =
155 new AccountDetailBasic(bundle.getStringArrayList(AccountDetailBasic.BUNDLE_TAG));
156 AccountDetailAdvanced advancedDetails =
157 new AccountDetailAdvanced(bundle.getStringArrayList(AccountDetailAdvanced.BUNDLE_TAG));
158 AccountDetailSrtp srtpDetails =
159 new AccountDetailSrtp(bundle.getStringArrayList(AccountDetailSrtp.BUNDLE_TAG));
160 AccountDetailTls tlsDetails =
161 new AccountDetailTls(bundle.getStringArrayList(AccountDetailTls.BUNDLE_TAG));
162
163 HashMap<String, String> map = new HashMap<String, String>();
164 map.putAll(basicDetails.getDetailsHashMap());
165 map.putAll(advancedDetails.getDetailsHashMap());
166 map.putAll(srtpDetails.getDetailsHashMap());
167 map.putAll(tlsDetails.getDetailsHashMap());
168
169 setAccountDetails(accountID, map);
Alexandre Savard5195d922012-10-30 16:58:50 -0400170 } else if(resultCode == AccountPreferenceActivity.ACCOUNT_DELETED) {
171 Bundle bundle = data.getExtras();
172 String accountID = bundle.getString("AccountID");
173
174 Log.i(TAG, "Remove account " + accountID);
175 deleteSelectedAccount(accountID);
176 Preference accountScreen = accountPreferenceHashMap.get(accountID);
177 mRoot.removePreference(accountScreen);
178 accountPreferenceHashMap.remove(accountID);
Alexandre Savard68838112012-10-30 11:34:43 -0400179 }
180 break;
181 default:
182 break;
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400183 }
184 }
185
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400186 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
187 @Override
188 public void onReceive(Context context, Intent intent) {
189 String message = intent.getStringExtra("message");
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400190 ArrayList<String> newList = (ArrayList<String>) getAccountList();
Alexandre Savard5195d922012-10-30 16:58:50 -0400191 Set<String> currentList = (Set<String>) accountPreferenceHashMap.keySet();
Alexandre Savardc7d22332012-10-18 16:54:17 -0400192 if(newList.size() > currentList.size()) {
193 for(String s : newList) {
194 if(!currentList.contains(s)) {
Alexandre Savard5195d922012-10-30 16:58:50 -0400195 Preference accountScreen = createAccountPreferenceScreen(s);
196 mRoot.addPreference(accountScreen);
197 accountPreferenceHashMap.put(s, accountScreen);
Alexandre Savardc7d22332012-10-18 16:54:17 -0400198 }
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400199 }
200 }
Alexandre Savard8ef37c52012-10-01 10:48:14 -0400201 }
202 };
Alexandre Savard9a93f062012-09-11 10:42:43 -0400203
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400204 Preference.OnPreferenceClickListener launchAccountCreationOnClick = new Preference.OnPreferenceClickListener() {
Alexandre Savard9a93f062012-09-11 10:42:43 -0400205 public boolean onPreferenceClick(Preference preference) {
Alexandre Savardcf7e95a2012-10-18 18:03:06 -0400206 if(preference.getTitle() == "Create New Account") {
Alexandre Savard68838112012-10-30 11:34:43 -0400207 launchAccountCreationActivity(preference);
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400208 }
209 return true;
Alexandre Savard9a93f062012-09-11 10:42:43 -0400210 }
211 };
212
Alexandre Savard68838112012-10-30 11:34:43 -0400213 Preference.OnPreferenceClickListener launchAccountEditOnClick = new Preference.OnPreferenceClickListener() {
214 public boolean onPreferenceClick(Preference preference) {
215 launchAccountEditActivity(preference);
216 return true;
217 }
218 };
219
Alexandre Savardc7d22332012-10-18 16:54:17 -0400220 Preference.OnPreferenceClickListener removeSelectedAccountOnClick = new Preference.OnPreferenceClickListener() {
221 public boolean onPreferenceClick(Preference preference) {
222 if(preference.getTitle() == "Delete Account") {
223 deleteSelectedAccount(preference.getKey());
224 }
225 return true;
226 }
227 };
228
Alexandre Savard68838112012-10-30 11:34:43 -0400229 private void launchAccountCreationActivity(Preference preference)
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400230 {
Alexandre Savard68838112012-10-30 11:34:43 -0400231 Log.i(TAG, "Launch account creation activity");
Alexandre Savardd5babe52012-10-01 08:52:44 -0400232 Intent intent = preference.getIntent();
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400233 startActivityForResult(intent, ACCOUNT_CREATE_REQUEST);
Alexandre Savardc7d22332012-10-18 16:54:17 -0400234 }
235
Alexandre Savard68838112012-10-30 11:34:43 -0400236 private void launchAccountEditActivity(Preference preference)
237 {
238 Log.i(TAG, "Launch account edit activity");
239 Intent intent = preference.getIntent();
Alexandre Savard833616f2012-10-30 16:02:30 -0400240
241 Bundle bundle = intent.getExtras();
242 String accountID = bundle.getString("AccountID");
243
244 HashMap<String, String> preferenceMap = getAccountDetails(accountID);
245
246 AccountDetailBasic basicDetails = new AccountDetailBasic(preferenceMap);
247 AccountDetailAdvanced advancedDetails = new AccountDetailAdvanced(preferenceMap);
248 AccountDetailSrtp srtpDetails = new AccountDetailSrtp(preferenceMap);
249 AccountDetailTls tlsDetails = new AccountDetailTls(preferenceMap);
250
251 bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, basicDetails.getValuesOnly());
252 bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, advancedDetails.getValuesOnly());
253 bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, srtpDetails.getValuesOnly());
254 bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, tlsDetails.getValuesOnly());
255
256 intent.putExtras(bundle);
257
Alexandre Savard68838112012-10-30 11:34:43 -0400258 startActivityForResult(intent, ACCOUNT_EDIT_REQUEST);
259 }
260
Alexandre Savardc7d22332012-10-18 16:54:17 -0400261 private void deleteSelectedAccount(String accountID) {
262 Log.i(TAG, "DeleteSelectedAccount");
263 try {
264 service.removeAccount(accountID);
265 } catch (RemoteException e) {
266 Log.e(TAG, "Cannot call service method", e);
267 }
268 };
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400269
270 private ArrayList<String> getAccountList()
Alexandre Savard52a72522012-09-27 16:40:13 -0400271 {
272 ArrayList<String> accountList = null;
273 try {
274 accountList = (ArrayList) service.getAccountList();
275 } catch (RemoteException e) {
276 Log.e(TAG, "Cannot call service method", e);
277 }
278
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400279 // Remove the default account from list
280 accountList.remove(DEFAULT_ACCOUNT_ID);
281
Alexandre Savard52a72522012-09-27 16:40:13 -0400282 return accountList;
283 }
284
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400285 private HashMap getAccountDetails(String accountID)
Alexandre Savard9a93f062012-09-11 10:42:43 -0400286 {
Alexandre Savard12dc3ac2012-09-27 11:17:39 -0400287 HashMap accountDetails = null;
288 try {
Alexandre Savard70982012012-09-27 17:15:50 -0400289 accountDetails = (HashMap) service.getAccountDetails(accountID);
Alexandre Savard12dc3ac2012-09-27 11:17:39 -0400290 } catch (RemoteException e) {
291 Log.e(TAG, "Cannot call service method", e);
292 }
Alexandre Savard9a93f062012-09-11 10:42:43 -0400293
294 return accountDetails;
295 }
296
Alexandre Savardd5babe52012-10-01 08:52:44 -0400297 private void setAccountDetails(String accountID, HashMap<String, String> accountDetails)
298 {
299 try {
300 service.setAccountDetails(accountID, accountDetails);
301 } catch (RemoteException e) {
302 Log.e(TAG, "Cannot call service method", e);
303 }
304 }
305
Alexandre Savard70982012012-09-27 17:15:50 -0400306 public PreferenceScreen getAccountListPreferenceScreen()
Alexandre Savard9a93f062012-09-11 10:42:43 -0400307 {
Alexandre Savard9a93f062012-09-11 10:42:43 -0400308 Activity currentContext = getActivity();
Alexandre Savard52a72522012-09-27 16:40:13 -0400309
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400310 mRoot = getPreferenceManager().createPreferenceScreen(currentContext);
Alexandre Savard70982012012-09-27 17:15:50 -0400311
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400312 // Default account category
Alexandre Savard70982012012-09-27 17:15:50 -0400313 PreferenceCategory defaultAccountCat = new PreferenceCategory(currentContext);
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400314 defaultAccountCat.setTitle(R.string.default_account_category);
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400315 mRoot.addPreference(defaultAccountCat);
Alexandre Savard70982012012-09-27 17:15:50 -0400316
Alexandre Savard68838112012-10-30 11:34:43 -0400317 mRoot.addPreference(createAccountPreferenceScreen(DEFAULT_ACCOUNT_ID));
Alexandre Savard70982012012-09-27 17:15:50 -0400318
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400319 // Account list category
Alexandre Savard70982012012-09-27 17:15:50 -0400320 PreferenceCategory accountListCat = new PreferenceCategory(currentContext);
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400321 accountListCat.setTitle(R.string.default_account_category);
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400322 mRoot.addPreference(accountListCat);
Alexandre Savard70982012012-09-27 17:15:50 -0400323
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400324 Preference createNewAccount = new Preference(currentContext);
Alexandre Savardcf7e95a2012-10-18 18:03:06 -0400325 createNewAccount.setTitle("Create New Account");
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400326 createNewAccount.setOnPreferenceClickListener(launchAccountCreationOnClick);
Alexandre Savardd5babe52012-10-01 08:52:44 -0400327 createNewAccount.setIntent(new Intent().setClass(getActivity(), AccountCreationActivity.class));
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400328 mRoot.addPreference(createNewAccount);
Alexandre Savard3a46d922012-09-30 20:42:51 -0400329
Alexandre Savard833616f2012-10-30 16:02:30 -0400330 ArrayList<String> accountList = getAccountList();
Alexandre Savarde990d052012-10-18 14:43:09 -0400331 for(String s : accountList) {
Alexandre Savard5195d922012-10-30 16:58:50 -0400332 Preference accountScreen = createAccountPreferenceScreen(s);
333 mRoot.addPreference(accountScreen);
334 accountPreferenceHashMap.put(s, accountScreen);
Alexandre Savarde990d052012-10-18 14:43:09 -0400335 }
Alexandre Savard8ef37c52012-10-01 10:48:14 -0400336
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400337 return mRoot;
Alexandre Savard70982012012-09-27 17:15:50 -0400338 }
339
Alexandre Savard68838112012-10-30 11:34:43 -0400340 Preference createAccountPreferenceScreen(String accountID) {
341
Alexandre Savard68838112012-10-30 11:34:43 -0400342 Bundle bundle = new Bundle();
343 bundle.putString("AccountID", accountID);
Alexandre Savard68838112012-10-30 11:34:43 -0400344
345 Intent intent = new Intent().setClass(getActivity(), AccountPreferenceActivity.class);
346 intent.putExtras(bundle);
347
348 Preference editAccount = new Preference(getActivity());
349 editAccount.setTitle(accountID);
350 editAccount.setOnPreferenceClickListener(launchAccountEditOnClick);
351 editAccount.setIntent(intent);
352
353 return editAccount;
354 }
Alexandre Savard2b370f02012-09-06 16:06:01 -0400355}