blob: e3c9ab368f1ded7acbcf5974ae112a2493f1413b [file] [log] [blame]
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001package org.sflphone.fragments;
2
3import java.net.NetworkInterface;
4import java.net.SocketException;
5import java.util.ArrayList;
6import java.util.Enumeration;
7import java.util.HashMap;
8
9import org.sflphone.R;
10import org.sflphone.account.AccountDetail;
11import org.sflphone.account.AccountDetailAdvanced;
12import org.sflphone.account.AccountDetailBasic;
13import org.sflphone.account.AccountDetailSrtp;
14import org.sflphone.account.AccountDetailTls;
Alexandre Lision059da9d2013-10-22 11:17:25 -040015import org.sflphone.model.Account;
Alexandre Lisionafd40e42013-10-15 13:48:37 -040016
17import android.app.Activity;
18import android.os.Bundle;
19import android.preference.CheckBoxPreference;
20import android.preference.EditTextPreference;
21import android.preference.ListPreference;
22import android.preference.Preference;
23import android.preference.Preference.OnPreferenceChangeListener;
24import android.preference.PreferenceFragment;
25import android.util.Log;
26
27public class EditionFragment extends PreferenceFragment {
28
29 private static final String TAG = EditionFragment.class.getSimpleName();
Alexandre Lision059da9d2013-10-22 11:17:25 -040030
Alexandre Lisionafd40e42013-10-15 13:48:37 -040031 private boolean isDifferent = false;
Alexandre Lisionafd40e42013-10-15 13:48:37 -040032
Alexandre Lision059da9d2013-10-22 11:17:25 -040033
Alexandre Lisionafd40e42013-10-15 13:48:37 -040034 private Callbacks mCallbacks = sDummyCallbacks;
35 private static Callbacks sDummyCallbacks = new Callbacks() {
36
37 @Override
Alexandre Lision059da9d2013-10-22 11:17:25 -040038 public Account getAccount() {
Alexandre Lisionafd40e42013-10-15 13:48:37 -040039 return null;
40 }
41
Alexandre Lisionafd40e42013-10-15 13:48:37 -040042 };
43
44 public interface Callbacks {
45
Alexandre Lision059da9d2013-10-22 11:17:25 -040046 public Account getAccount();
Alexandre Lisionafd40e42013-10-15 13:48:37 -040047
48 }
49
50 @Override
51 public void onAttach(Activity activity) {
52 super.onAttach(activity);
53 if (!(activity instanceof Callbacks)) {
54 throw new IllegalStateException("Activity must implement fragment's callbacks.");
55 }
56
57 mCallbacks = (Callbacks) activity;
58 }
Alexandre Lision059da9d2013-10-22 11:17:25 -040059
Alexandre Lisionafd40e42013-10-15 13:48:37 -040060 @Override
61 public void onDetach() {
62 super.onDetach();
63 mCallbacks = sDummyCallbacks;
64 }
65
66 @Override
67 public void onCreate(Bundle savedInstanceState) {
68 super.onCreate(savedInstanceState);
69
70 // Load the preferences from an XML resource
71 addPreferencesFromResource(R.xml.account_prefs);
72 initEdition();
Alexandre Lisionafd40e42013-10-15 13:48:37 -040073
74 }
75
76 private void initEdition() {
77
Alexandre Lisionafd40e42013-10-15 13:48:37 -040078
Alexandre Lision059da9d2013-10-22 11:17:25 -040079 setPreferenceDetails(mCallbacks.getAccount().getBasicDetails());
80 setPreferenceDetails(mCallbacks.getAccount().getAdvancedDetails());
81 setPreferenceDetails(mCallbacks.getAccount().getSrtpDetails());
82 setPreferenceDetails(mCallbacks.getAccount().getTlsDetails());
Alexandre Lisionafd40e42013-10-15 13:48:37 -040083
Alexandre Lision059da9d2013-10-22 11:17:25 -040084 addPreferenceListener(mCallbacks.getAccount().getBasicDetails(), changeBasicPreferenceListener);
Alexandre Lisionafd40e42013-10-15 13:48:37 -040085 // addPreferenceListener(advancedDetails, changeAdvancedPreferenceListener);
86 // addPreferenceListener(srtpDetails, changeSrtpPreferenceListener);
87 // addPreferenceListener(tlsDetails, changeTlsPreferenceListener);
88 }
89
90 private void setPreferenceDetails(AccountDetail details) {
91 for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
92 Log.i(TAG, "setPreferenceDetails: pref " + p.mKey + " value " + p.mValue);
93 Preference pref = findPreference(p.mKey);
94 if (pref != null) {
95 if (p.mKey == AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE) {
96 ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
97 try {
98
99 for (Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();) {
100 NetworkInterface i = list.nextElement();
101 Log.e("network_interfaces", "display name " + i.getDisplayName());
102 if (i.isUp())
103 entries.add(i.getDisplayName());
104 }
105 } catch (SocketException e) {
106 Log.e(TAG, e.toString());
107 }
108 CharSequence[] display = new CharSequence[entries.size()];
109 entries.toArray(display);
110 ((ListPreference) pref).setEntries(display);
111 ((ListPreference) pref).setEntryValues(display);
112 pref.setSummary(p.mValue);
113 continue;
114 }
115 if (!p.isTwoState) {
116 ((EditTextPreference) pref).setText(p.mValue);
117 pref.setSummary(p.mValue);
118 }
119 } else {
120 Log.w(TAG, "pref not found");
121 }
122 }
123 }
124
125 private void addPreferenceListener(AccountDetail details, OnPreferenceChangeListener listener) {
126 for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
127 Log.i(TAG, "addPreferenceListener: pref " + p.mKey + p.mValue);
128 Preference pref = findPreference(p.mKey);
129 if (pref != null) {
130
131 pref.setOnPreferenceChangeListener(listener);
132
133 } else {
134 Log.w(TAG, "addPreferenceListener: pref not found");
135 }
136 }
137 }
138
139 Preference.OnPreferenceChangeListener changeBasicPreferenceListener = new Preference.OnPreferenceChangeListener() {
140 @Override
141 public boolean onPreferenceChange(Preference preference, Object newValue) {
142
143 setDifferent(true);
144 if (preference instanceof CheckBoxPreference) {
145 if ((Boolean) newValue == true)
Alexandre Lision059da9d2013-10-22 11:17:25 -0400146 mCallbacks.getAccount().getBasicDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400147 } else {
148 preference.setSummary((CharSequence) newValue);
149 Log.i(TAG, "Changing preference value:" + newValue);
Alexandre Lision059da9d2013-10-22 11:17:25 -0400150 mCallbacks.getAccount().getBasicDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400151 }
152 return true;
153 }
154 };
155
156 Preference.OnPreferenceChangeListener changeAdvancedPreferenceListener = new Preference.OnPreferenceChangeListener() {
157 @Override
158 public boolean onPreferenceChange(Preference preference, Object newValue) {
159 preference.setSummary((CharSequence) newValue);
Alexandre Lision059da9d2013-10-22 11:17:25 -0400160 mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400161 return true;
162 }
163 };
164
165 Preference.OnPreferenceChangeListener changeTlsPreferenceListener = new Preference.OnPreferenceChangeListener() {
166 @Override
167 public boolean onPreferenceChange(Preference preference, Object newValue) {
168 preference.setSummary((CharSequence) newValue);
Alexandre Lision059da9d2013-10-22 11:17:25 -0400169 mCallbacks.getAccount().getTlsDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400170 return true;
171 }
172 };
173
174 Preference.OnPreferenceChangeListener changeSrtpPreferenceListener = new Preference.OnPreferenceChangeListener() {
175 @Override
176 public boolean onPreferenceChange(Preference preference, Object newValue) {
177 preference.setSummary((CharSequence) newValue);
Alexandre Lision059da9d2013-10-22 11:17:25 -0400178 mCallbacks.getAccount().getSrtpDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400179 return true;
180 }
181 };
182
Alexandre Lision059da9d2013-10-22 11:17:25 -0400183
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400184
185 public boolean isDifferent() {
186 return isDifferent;
187 }
188
189 public void setDifferent(boolean isDifferent) {
190 this.isDifferent = isDifferent;
191 }
192
Alexandre Lisionafd40e42013-10-15 13:48:37 -0400193}