blob: 6600f477fef88d0f31aba9b0a06d08d7c2a1002a [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
26 private boolean isDifferent = false;
27
28 private Callbacks mCallbacks = sDummyCallbacks;
29 private static Callbacks sDummyCallbacks = new Callbacks() {
30
31 @Override
32 public Account getAccount() {
33 return null;
34 }
35
36 };
37
38 public interface Callbacks {
39
40 public Account getAccount();
41
42 }
43
44 @Override
45 public void onAttach(Activity activity) {
46 super.onAttach(activity);
47 if (!(activity instanceof Callbacks)) {
48 throw new IllegalStateException("Activity must implement fragment's callbacks.");
49 }
50
51 mCallbacks = (Callbacks) activity;
52 }
53
54 @Override
55 public void onDetach() {
56 super.onDetach();
57 mCallbacks = sDummyCallbacks;
58 }
59
60 @Override
61 public void onCreate(Bundle savedInstanceState) {
62 super.onCreate(savedInstanceState);
63
64 // Load the preferences from an XML resource
65 addPreferencesFromResource(R.xml.account_advanced_prefs);
66 setPreferenceDetails(mCallbacks.getAccount().getAdvancedDetails());
67 addPreferenceListener(mCallbacks.getAccount().getAdvancedDetails(), changeAdvancedPreferenceListener);
Alexandre Lisiona3650992013-11-13 14:19:35 -050068
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050069 }
70
71 private void setPreferenceDetails(AccountDetail details) {
72 for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
73 Log.i(TAG, "setPreferenceDetails: pref " + p.mKey + " value " + p.mValue);
74 Preference pref = findPreference(p.mKey);
75 if (pref != null) {
76 if (p.mKey == AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE) {
Alexandre Lisiona3650992013-11-13 14:19:35 -050077 ArrayList<CharSequence> entries = getNetworkInterfaces();
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050078 CharSequence[] display = new CharSequence[entries.size()];
79 entries.toArray(display);
80 ((ListPreference) pref).setEntries(display);
81 ((ListPreference) pref).setEntryValues(display);
82 pref.setSummary(p.mValue);
83 continue;
84 }
85 if (!p.isTwoState) {
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050086 pref.setSummary(p.mValue);
Alexandre Lision3cefec22013-11-14 17:26:35 -050087 } else if (pref.getKey().contentEquals("STUN.enable")) {
88 ((CheckBoxPreference) pref).setChecked(p.mValue.contentEquals("true"));
Alexandre Lisiona3650992013-11-13 14:19:35 -050089 findPreference("STUN.server").setEnabled(p.mValue.contentEquals("true"));
Alexandre Lision3cefec22013-11-14 17:26:35 -050090 } else if (pref.getKey().contentEquals("Account.publishedSameAsLocal")) {
91 ((CheckBoxPreference) pref).setChecked(p.mValue.contentEquals("true"));
Alexandre Lisiona3650992013-11-13 14:19:35 -050092 findPreference("Account.publishedPort").setEnabled(!p.mValue.contentEquals("true"));
93 findPreference("Account.publishedAddress").setEnabled(!p.mValue.contentEquals("true"));
Alexandre Lisionc48c36a2013-11-12 16:26:10 -050094 }
95 } else {
96 Log.w(TAG, "pref not found");
97 }
98 }
99 }
100
Alexandre Lisiona3650992013-11-13 14:19:35 -0500101 private ArrayList<CharSequence> getNetworkInterfaces() {
102 ArrayList<CharSequence> result = new ArrayList<CharSequence>();
Alexandre Lision3cefec22013-11-14 17:26:35 -0500103
Alexandre Lisiona3650992013-11-13 14:19:35 -0500104 result.add("default");
105 try {
106
107 for (Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();) {
108 NetworkInterface i = list.nextElement();
109 if (i.isUp())
110 result.add(i.getDisplayName());
111 }
112 } catch (SocketException e) {
113 Log.e(TAG, e.toString());
114 }
115 return result;
116 }
117
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500118 private void addPreferenceListener(AccountDetail details, OnPreferenceChangeListener listener) {
119 for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
120 Log.i(TAG, "addPreferenceListener: pref " + p.mKey + p.mValue);
121 Preference pref = findPreference(p.mKey);
122 if (pref != null) {
123
124 pref.setOnPreferenceChangeListener(listener);
125
126 } else {
127 Log.w(TAG, "addPreferenceListener: pref not found");
128 }
129 }
130 }
131
132 Preference.OnPreferenceChangeListener changeAdvancedPreferenceListener = new Preference.OnPreferenceChangeListener() {
133 @Override
134 public boolean onPreferenceChange(Preference preference, Object newValue) {
Alexandre Lision3cefec22013-11-14 17:26:35 -0500135
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500136 if (preference instanceof CheckBoxPreference) {
Alexandre Lisiona3650992013-11-13 14:19:35 -0500137 mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
138 if (preference.getKey().contentEquals("STUN.enable")) {
139 findPreference("STUN.server").setEnabled((Boolean) newValue);
140 } else if (preference.getKey().contentEquals("Account.publishedSameAsLocal")) {
141 findPreference("Account.publishedPort").setEnabled(!(Boolean) newValue);
142 findPreference("Account.publishedAddress").setEnabled(!(Boolean) newValue);
143 }
Alexandre Lision3cefec22013-11-14 17:26:35 -0500144 mCallbacks.getAccount().notifyObservers();
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500145 } else {
146 preference.setSummary((CharSequence) newValue);
Alexandre Lisiona3650992013-11-13 14:19:35 -0500147 Log.i(TAG, "Changing" + preference.getKey() + " value:" + newValue);
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500148 mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((CharSequence) newValue).toString());
Alexandre Lision3cefec22013-11-14 17:26:35 -0500149 mCallbacks.getAccount().notifyObservers();
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500150 }
151 return true;
152 }
153 };
154
Alexandre Lisionc48c36a2013-11-12 16:26:10 -0500155}