blob: 5581b0305565c5785ce88f3db583a76ceacc321a [file] [log] [blame]
Alexandre Lisionc48c36a2013-11-12 16:26:10 -05001package org.sflphone.fragments;
2
3import java.net.NetworkInterface;
4import java.net.SocketException;
5import java.util.ArrayList;
6import java.util.Enumeration;
7
8import org.sflphone.R;
9import org.sflphone.account.AccountDetail;
10import org.sflphone.account.AccountDetailAdvanced;
11import org.sflphone.model.Account;
12
13import android.app.Activity;
14import android.os.Bundle;
15import android.preference.CheckBoxPreference;
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050016import android.preference.ListPreference;
17import android.preference.Preference;
18import android.preference.Preference.OnPreferenceChangeListener;
19import android.preference.PreferenceFragment;
20import android.util.Log;
21
22public class AdvancedAccountFragment extends PreferenceFragment {
23
Alexandre Lisiona3650992013-11-13 14:19:35 -050024 private static final String TAG = AdvancedAccountFragment.class.getSimpleName();
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050025
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050026 private Callbacks mCallbacks = sDummyCallbacks;
27 private static Callbacks sDummyCallbacks = new Callbacks() {
28
29 @Override
30 public Account getAccount() {
31 return null;
32 }
33
34 };
35
36 public interface Callbacks {
37
38 public Account getAccount();
39
40 }
41
42 @Override
43 public void onAttach(Activity activity) {
44 super.onAttach(activity);
45 if (!(activity instanceof Callbacks)) {
46 throw new IllegalStateException("Activity must implement fragment's callbacks.");
47 }
48
49 mCallbacks = (Callbacks) activity;
50 }
51
52 @Override
53 public void onDetach() {
54 super.onDetach();
55 mCallbacks = sDummyCallbacks;
56 }
57
58 @Override
59 public void onCreate(Bundle savedInstanceState) {
60 super.onCreate(savedInstanceState);
61
62 // Load the preferences from an XML resource
63 addPreferencesFromResource(R.xml.account_advanced_prefs);
64 setPreferenceDetails(mCallbacks.getAccount().getAdvancedDetails());
65 addPreferenceListener(mCallbacks.getAccount().getAdvancedDetails(), changeAdvancedPreferenceListener);
Alexandre Lisiona3650992013-11-13 14:19:35 -050066
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050067 }
68
69 private void setPreferenceDetails(AccountDetail details) {
70 for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
71 Log.i(TAG, "setPreferenceDetails: pref " + p.mKey + " value " + p.mValue);
72 Preference pref = findPreference(p.mKey);
73 if (pref != null) {
74 if (p.mKey == AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE) {
Alexandre Lisiona3650992013-11-13 14:19:35 -050075 ArrayList<CharSequence> entries = getNetworkInterfaces();
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050076 CharSequence[] display = new CharSequence[entries.size()];
77 entries.toArray(display);
78 ((ListPreference) pref).setEntries(display);
79 ((ListPreference) pref).setEntryValues(display);
80 pref.setSummary(p.mValue);
81 continue;
82 }
83 if (!p.isTwoState) {
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050084 pref.setSummary(p.mValue);
Alexandre Lision3cefec22013-11-14 17:26:35 -050085 } else if (pref.getKey().contentEquals("STUN.enable")) {
86 ((CheckBoxPreference) pref).setChecked(p.mValue.contentEquals("true"));
Alexandre Lisiona3650992013-11-13 14:19:35 -050087 findPreference("STUN.server").setEnabled(p.mValue.contentEquals("true"));
Alexandre Lision3cefec22013-11-14 17:26:35 -050088 } else if (pref.getKey().contentEquals("Account.publishedSameAsLocal")) {
89 ((CheckBoxPreference) pref).setChecked(p.mValue.contentEquals("true"));
Alexandre Lisiona3650992013-11-13 14:19:35 -050090 findPreference("Account.publishedPort").setEnabled(!p.mValue.contentEquals("true"));
91 findPreference("Account.publishedAddress").setEnabled(!p.mValue.contentEquals("true"));
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050092 }
93 } else {
94 Log.w(TAG, "pref not found");
95 }
96 }
97 }
98
Alexandre Lisiona3650992013-11-13 14:19:35 -050099 private ArrayList<CharSequence> getNetworkInterfaces() {
100 ArrayList<CharSequence> result = new ArrayList<CharSequence>();
Alexandre Lision3cefec22013-11-14 17:26:35 -0500101
Alexandre Lisiona3650992013-11-13 14:19:35 -0500102 result.add("default");
103 try {
104
105 for (Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();) {
106 NetworkInterface i = list.nextElement();
107 if (i.isUp())
108 result.add(i.getDisplayName());
109 }
110 } catch (SocketException e) {
111 Log.e(TAG, e.toString());
112 }
113 return result;
114 }
115
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500116 private void addPreferenceListener(AccountDetail details, OnPreferenceChangeListener listener) {
117 for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
118 Log.i(TAG, "addPreferenceListener: pref " + p.mKey + p.mValue);
119 Preference pref = findPreference(p.mKey);
120 if (pref != null) {
121
122 pref.setOnPreferenceChangeListener(listener);
123
124 } else {
125 Log.w(TAG, "addPreferenceListener: pref not found");
126 }
127 }
128 }
129
130 Preference.OnPreferenceChangeListener changeAdvancedPreferenceListener = new Preference.OnPreferenceChangeListener() {
131 @Override
132 public boolean onPreferenceChange(Preference preference, Object newValue) {
Alexandre Lision3cefec22013-11-14 17:26:35 -0500133
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500134 if (preference instanceof CheckBoxPreference) {
Alexandre Lisiona3650992013-11-13 14:19:35 -0500135 mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
136 if (preference.getKey().contentEquals("STUN.enable")) {
137 findPreference("STUN.server").setEnabled((Boolean) newValue);
138 } else if (preference.getKey().contentEquals("Account.publishedSameAsLocal")) {
139 findPreference("Account.publishedPort").setEnabled(!(Boolean) newValue);
140 findPreference("Account.publishedAddress").setEnabled(!(Boolean) newValue);
141 }
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500142 } else {
143 preference.setSummary((CharSequence) newValue);
Alexandre Lisiona3650992013-11-13 14:19:35 -0500144 Log.i(TAG, "Changing" + preference.getKey() + " value:" + newValue);
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500145 mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
146 }
Alexandre Lision68ee0ac2013-12-06 15:06:19 -0500147
148 mCallbacks.getAccount().notifyObservers();
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500149 return true;
150 }
151 };
152
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500153}