blob: faf8f729dcd537eaf8669343c3924b1ed134c4c1 [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;
Alexandre Savard12dc3ac2012-09-27 11:17:39 -040075 private ISipService service;
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();
89 Log.i(TAG, "onAttach() service " + service);
90 }
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
Alexandre Savard70982012012-09-27 17:15:50 -0400109 setPreferenceScreen(getAccountListPreferenceScreen());
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400110
111 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver, new IntentFilter("accounts-changed"));
Alexandre Savard2b370f02012-09-06 16:06:01 -0400112 }
113
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400114 @Override
115 public void onStop()
116 {
117 super.onStop();
118 Log.i(TAG, "onStop");
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400119 }
120
121 @Override
122 public void onDestroy()
123 {
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400124 LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mMessageReceiver);
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400125 super.onDestroy();
126 Log.i(TAG, "onDestroy");
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400127 }
128
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400129 @Override
130 public void onActivityResult(int requestCode, int resultCode, Intent data) {
Alexandre Savard68838112012-10-30 11:34:43 -0400131 switch(requestCode) {
132 case ACCOUNT_CREATE_REQUEST:
133 Log.i(TAG, "ACCOUNT_CREATE_REQUEST Done");
134 break;
135 case ACCOUNT_EDIT_REQUEST:
136 if(resultCode == AccountPreferenceActivity.ACCOUNT_MODIFIED) {
137 Bundle bundle = data.getExtras();
138 String accountID = bundle.getString("AccountID");
139 Log.i(TAG, "Update account settings for " + accountID);
Alexandre Savard833616f2012-10-30 16:02:30 -0400140
141 AccountDetailBasic basicDetails =
142 new AccountDetailBasic(bundle.getStringArrayList(AccountDetailBasic.BUNDLE_TAG));
143 AccountDetailAdvanced advancedDetails =
144 new AccountDetailAdvanced(bundle.getStringArrayList(AccountDetailAdvanced.BUNDLE_TAG));
145 AccountDetailSrtp srtpDetails =
146 new AccountDetailSrtp(bundle.getStringArrayList(AccountDetailSrtp.BUNDLE_TAG));
147 AccountDetailTls tlsDetails =
148 new AccountDetailTls(bundle.getStringArrayList(AccountDetailTls.BUNDLE_TAG));
149
150 HashMap<String, String> map = new HashMap<String, String>();
151 map.putAll(basicDetails.getDetailsHashMap());
152 map.putAll(advancedDetails.getDetailsHashMap());
153 map.putAll(srtpDetails.getDetailsHashMap());
154 map.putAll(tlsDetails.getDetailsHashMap());
155
156 setAccountDetails(accountID, map);
Alexandre Savard5195d922012-10-30 16:58:50 -0400157 } else if(resultCode == AccountPreferenceActivity.ACCOUNT_DELETED) {
158 Bundle bundle = data.getExtras();
159 String accountID = bundle.getString("AccountID");
160
161 Log.i(TAG, "Remove account " + accountID);
162 deleteSelectedAccount(accountID);
163 Preference accountScreen = accountPreferenceHashMap.get(accountID);
164 mRoot.removePreference(accountScreen);
165 accountPreferenceHashMap.remove(accountID);
Alexandre Savard68838112012-10-30 11:34:43 -0400166 }
167 break;
168 default:
169 break;
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400170 }
171 }
172
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400173 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
174 @Override
175 public void onReceive(Context context, Intent intent) {
176 String message = intent.getStringExtra("message");
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400177 ArrayList<String> newList = (ArrayList<String>) getAccountList();
Alexandre Savard5195d922012-10-30 16:58:50 -0400178 Set<String> currentList = (Set<String>) accountPreferenceHashMap.keySet();
Alexandre Savardc7d22332012-10-18 16:54:17 -0400179 if(newList.size() > currentList.size()) {
180 for(String s : newList) {
181 if(!currentList.contains(s)) {
Alexandre Savard5195d922012-10-30 16:58:50 -0400182 Preference accountScreen = createAccountPreferenceScreen(s);
183 mRoot.addPreference(accountScreen);
184 accountPreferenceHashMap.put(s, accountScreen);
Alexandre Savardc7d22332012-10-18 16:54:17 -0400185 }
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400186 }
187 }
Alexandre Savard8ef37c52012-10-01 10:48:14 -0400188 }
189 };
Alexandre Savard9a93f062012-09-11 10:42:43 -0400190
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400191 Preference.OnPreferenceClickListener launchAccountCreationOnClick = new Preference.OnPreferenceClickListener() {
Alexandre Savard9a93f062012-09-11 10:42:43 -0400192 public boolean onPreferenceClick(Preference preference) {
Alexandre Savardcf7e95a2012-10-18 18:03:06 -0400193 if(preference.getTitle() == "Create New Account") {
Alexandre Savard68838112012-10-30 11:34:43 -0400194 launchAccountCreationActivity(preference);
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400195 }
196 return true;
Alexandre Savard9a93f062012-09-11 10:42:43 -0400197 }
198 };
199
Alexandre Savard68838112012-10-30 11:34:43 -0400200 Preference.OnPreferenceClickListener launchAccountEditOnClick = new Preference.OnPreferenceClickListener() {
201 public boolean onPreferenceClick(Preference preference) {
202 launchAccountEditActivity(preference);
203 return true;
204 }
205 };
206
Alexandre Savardc7d22332012-10-18 16:54:17 -0400207 Preference.OnPreferenceClickListener removeSelectedAccountOnClick = new Preference.OnPreferenceClickListener() {
208 public boolean onPreferenceClick(Preference preference) {
209 if(preference.getTitle() == "Delete Account") {
210 deleteSelectedAccount(preference.getKey());
211 }
212 return true;
213 }
214 };
215
Alexandre Savard68838112012-10-30 11:34:43 -0400216 private void launchAccountCreationActivity(Preference preference)
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400217 {
Alexandre Savard68838112012-10-30 11:34:43 -0400218 Log.i(TAG, "Launch account creation activity");
Alexandre Savardd5babe52012-10-01 08:52:44 -0400219 Intent intent = preference.getIntent();
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400220 startActivityForResult(intent, ACCOUNT_CREATE_REQUEST);
Alexandre Savardc7d22332012-10-18 16:54:17 -0400221 }
222
Alexandre Savard68838112012-10-30 11:34:43 -0400223 private void launchAccountEditActivity(Preference preference)
224 {
225 Log.i(TAG, "Launch account edit activity");
226 Intent intent = preference.getIntent();
Alexandre Savard833616f2012-10-30 16:02:30 -0400227
228 Bundle bundle = intent.getExtras();
229 String accountID = bundle.getString("AccountID");
230
231 HashMap<String, String> preferenceMap = getAccountDetails(accountID);
232
233 AccountDetailBasic basicDetails = new AccountDetailBasic(preferenceMap);
234 AccountDetailAdvanced advancedDetails = new AccountDetailAdvanced(preferenceMap);
235 AccountDetailSrtp srtpDetails = new AccountDetailSrtp(preferenceMap);
236 AccountDetailTls tlsDetails = new AccountDetailTls(preferenceMap);
237
238 bundle.putStringArrayList(AccountDetailBasic.BUNDLE_TAG, basicDetails.getValuesOnly());
239 bundle.putStringArrayList(AccountDetailAdvanced.BUNDLE_TAG, advancedDetails.getValuesOnly());
240 bundle.putStringArrayList(AccountDetailSrtp.BUNDLE_TAG, srtpDetails.getValuesOnly());
241 bundle.putStringArrayList(AccountDetailTls.BUNDLE_TAG, tlsDetails.getValuesOnly());
242
243 intent.putExtras(bundle);
244
Alexandre Savard68838112012-10-30 11:34:43 -0400245 startActivityForResult(intent, ACCOUNT_EDIT_REQUEST);
246 }
247
Alexandre Savardc7d22332012-10-18 16:54:17 -0400248 private void deleteSelectedAccount(String accountID) {
249 Log.i(TAG, "DeleteSelectedAccount");
250 try {
251 service.removeAccount(accountID);
252 } catch (RemoteException e) {
253 Log.e(TAG, "Cannot call service method", e);
254 }
255 };
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400256
257 private ArrayList<String> getAccountList()
Alexandre Savard52a72522012-09-27 16:40:13 -0400258 {
259 ArrayList<String> accountList = null;
260 try {
261 accountList = (ArrayList) service.getAccountList();
262 } catch (RemoteException e) {
263 Log.e(TAG, "Cannot call service method", e);
264 }
265
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400266 // Remove the default account from list
267 accountList.remove(DEFAULT_ACCOUNT_ID);
268
Alexandre Savard52a72522012-09-27 16:40:13 -0400269 return accountList;
270 }
271
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400272 private HashMap getAccountDetails(String accountID)
Alexandre Savard9a93f062012-09-11 10:42:43 -0400273 {
Alexandre Savard12dc3ac2012-09-27 11:17:39 -0400274 HashMap accountDetails = null;
275 try {
Alexandre Savard70982012012-09-27 17:15:50 -0400276 accountDetails = (HashMap) service.getAccountDetails(accountID);
Alexandre Savard12dc3ac2012-09-27 11:17:39 -0400277 } catch (RemoteException e) {
278 Log.e(TAG, "Cannot call service method", e);
279 }
Alexandre Savard9a93f062012-09-11 10:42:43 -0400280
281 return accountDetails;
282 }
283
Alexandre Savardd5babe52012-10-01 08:52:44 -0400284 private void setAccountDetails(String accountID, HashMap<String, String> accountDetails)
285 {
286 try {
287 service.setAccountDetails(accountID, accountDetails);
288 } catch (RemoteException e) {
289 Log.e(TAG, "Cannot call service method", e);
290 }
291 }
292
Alexandre Savard70982012012-09-27 17:15:50 -0400293 public PreferenceScreen getAccountListPreferenceScreen()
Alexandre Savard9a93f062012-09-11 10:42:43 -0400294 {
Alexandre Savard9a93f062012-09-11 10:42:43 -0400295 Activity currentContext = getActivity();
Alexandre Savard52a72522012-09-27 16:40:13 -0400296
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400297 mRoot = getPreferenceManager().createPreferenceScreen(currentContext);
Alexandre Savard70982012012-09-27 17:15:50 -0400298
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400299 // Default account category
Alexandre Savard70982012012-09-27 17:15:50 -0400300 PreferenceCategory defaultAccountCat = new PreferenceCategory(currentContext);
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400301 defaultAccountCat.setTitle(R.string.default_account_category);
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400302 mRoot.addPreference(defaultAccountCat);
Alexandre Savard70982012012-09-27 17:15:50 -0400303
Alexandre Savard68838112012-10-30 11:34:43 -0400304 mRoot.addPreference(createAccountPreferenceScreen(DEFAULT_ACCOUNT_ID));
Alexandre Savard70982012012-09-27 17:15:50 -0400305
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400306 // Account list category
Alexandre Savard70982012012-09-27 17:15:50 -0400307 PreferenceCategory accountListCat = new PreferenceCategory(currentContext);
Alexandre Savarda6c0d992012-09-28 09:24:13 -0400308 accountListCat.setTitle(R.string.default_account_category);
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400309 mRoot.addPreference(accountListCat);
Alexandre Savard70982012012-09-27 17:15:50 -0400310
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400311 Preference createNewAccount = new Preference(currentContext);
Alexandre Savardcf7e95a2012-10-18 18:03:06 -0400312 createNewAccount.setTitle("Create New Account");
Alexandre Savard53d2ddd2012-09-30 22:04:40 -0400313 createNewAccount.setOnPreferenceClickListener(launchAccountCreationOnClick);
Alexandre Savardd5babe52012-10-01 08:52:44 -0400314 createNewAccount.setIntent(new Intent().setClass(getActivity(), AccountCreationActivity.class));
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400315 mRoot.addPreference(createNewAccount);
Alexandre Savard3a46d922012-09-30 20:42:51 -0400316
Alexandre Savard833616f2012-10-30 16:02:30 -0400317 ArrayList<String> accountList = getAccountList();
Alexandre Savarde990d052012-10-18 14:43:09 -0400318 for(String s : accountList) {
Alexandre Savard5195d922012-10-30 16:58:50 -0400319 Preference accountScreen = createAccountPreferenceScreen(s);
320 mRoot.addPreference(accountScreen);
321 accountPreferenceHashMap.put(s, accountScreen);
Alexandre Savarde990d052012-10-18 14:43:09 -0400322 }
Alexandre Savard8ef37c52012-10-01 10:48:14 -0400323
Alexandre Savard4f11d7a2012-10-18 13:15:36 -0400324 return mRoot;
Alexandre Savard70982012012-09-27 17:15:50 -0400325 }
326
Alexandre Savard68838112012-10-30 11:34:43 -0400327 Preference createAccountPreferenceScreen(String accountID) {
328
Alexandre Savard68838112012-10-30 11:34:43 -0400329 Bundle bundle = new Bundle();
330 bundle.putString("AccountID", accountID);
Alexandre Savard68838112012-10-30 11:34:43 -0400331
332 Intent intent = new Intent().setClass(getActivity(), AccountPreferenceActivity.class);
333 intent.putExtras(bundle);
334
335 Preference editAccount = new Preference(getActivity());
336 editAccount.setTitle(accountID);
337 editAccount.setOnPreferenceClickListener(launchAccountEditOnClick);
338 editAccount.setIntent(intent);
339
340 return editAccount;
341 }
Alexandre Savard2b370f02012-09-06 16:06:01 -0400342}