• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.tv.settings.connectivity;
18 
19 import android.content.Context;
20 import android.net.wifi.WifiConfiguration;
21 import android.os.Bundle;
22 import android.os.Handler;
23 import android.os.SystemClock;
24 import android.provider.Settings;
25 import android.support.v17.preference.LeanbackPreferenceFragment;
26 import android.support.v7.preference.Preference;
27 import android.support.v7.preference.PreferenceCategory;
28 import android.support.v7.preference.TwoStatePreference;
29 
30 import com.android.settingslib.wifi.AccessPoint;
31 import com.android.settingslib.wifi.AccessPointPreference;
32 import com.android.tv.settings.R;
33 
34 import java.util.Collection;
35 import java.util.HashSet;
36 import java.util.Set;
37 
38 public class NetworkFragment extends LeanbackPreferenceFragment implements
39         ConnectivityListener.Listener, ConnectivityListener.WifiNetworkListener,
40         AccessPoint.AccessPointListener {
41 
42     private static final String KEY_WIFI_ENABLE = "wifi_enable";
43     private static final String KEY_WIFI_LIST = "wifi_list";
44     private static final String KEY_WIFI_COLLAPSE = "wifi_collapse";
45     private static final String KEY_WIFI_OTHER = "wifi_other";
46     private static final String KEY_WIFI_WPS = "wifi_wps";
47     private static final String KEY_WIFI_ADD = "wifi_add";
48     private static final String KEY_WIFI_ALWAYS_SCAN = "wifi_always_scan";
49     private static final String KEY_ETHERNET = "ethernet";
50     private static final String KEY_ETHERNET_STATUS = "ethernet_status";
51     private static final String KEY_ETHERNET_PROXY = "ethernet_proxy";
52     private static final String KEY_ETHERNET_DHCP = "ethernet_dhcp";
53 
54     private static final int INITIAL_UPDATE_DELAY = 500;
55 
56     private ConnectivityListener mConnectivityListener;
57     private AccessPointPreference.UserBadgeCache mUserBadgeCache;
58 
59     private TwoStatePreference mEnableWifiPref;
60     private CollapsibleCategory mWifiNetworksCategory;
61     private Preference mCollapsePref;
62     private Preference mWpsPref;
63     private Preference mAddPref;
64     private TwoStatePreference mAlwaysScan;
65     private PreferenceCategory mEthernetCategory;
66     private Preference mEthernetStatusPref;
67     private Preference mEthernetProxyPref;
68     private Preference mEthernetDhcpPref;
69 
70     private final Handler mHandler = new Handler();
71     private long mNoWifiUpdateBeforeMillis;
72     private Runnable mInitialUpdateWifiListRunnable = new Runnable() {
73         @Override
74         public void run() {
75             mNoWifiUpdateBeforeMillis = 0;
76             updateWifiList();
77         }
78     };
79 
newInstance()80     public static NetworkFragment newInstance() {
81         return new NetworkFragment();
82     }
83 
84     @Override
onCreate(Bundle savedInstanceState)85     public void onCreate(Bundle savedInstanceState) {
86         mConnectivityListener = new ConnectivityListener(getContext(), this);
87         mUserBadgeCache =
88                 new AccessPointPreference.UserBadgeCache(getContext().getPackageManager());
89         super.onCreate(savedInstanceState);
90     }
91 
92     @Override
onStart()93     public void onStart() {
94         super.onStart();
95         mConnectivityListener.start();
96         mConnectivityListener.setWifiListener(this);
97         mNoWifiUpdateBeforeMillis = SystemClock.elapsedRealtime() + INITIAL_UPDATE_DELAY;
98         updateWifiList();
99     }
100 
101     @Override
onResume()102     public void onResume() {
103         super.onResume();
104         // There doesn't seem to be an API to listen to everything this could cover, so
105         // tickle it here and hope for the best.
106         updateConnectivity();
107     }
108 
109     @Override
onStop()110     public void onStop() {
111         super.onStop();
112         mConnectivityListener.stop();
113     }
114 
115     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)116     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
117         setPreferencesFromResource(R.xml.network, null);
118 
119         mEnableWifiPref = (TwoStatePreference) findPreference(KEY_WIFI_ENABLE);
120         mWifiNetworksCategory = (CollapsibleCategory) findPreference(KEY_WIFI_LIST);
121         mCollapsePref = findPreference(KEY_WIFI_COLLAPSE);
122         mWpsPref = findPreference(KEY_WIFI_WPS);
123         mAddPref = findPreference(KEY_WIFI_ADD);
124         mAlwaysScan = (TwoStatePreference) findPreference(KEY_WIFI_ALWAYS_SCAN);
125 
126         mEthernetCategory = (PreferenceCategory) findPreference(KEY_ETHERNET);
127         mEthernetStatusPref = findPreference(KEY_ETHERNET_STATUS);
128         mEthernetProxyPref = findPreference(KEY_ETHERNET_PROXY);
129         mEthernetProxyPref.setIntent(EditProxySettingsActivity.createIntent(getContext(),
130                 WifiConfiguration.INVALID_NETWORK_ID));
131         mEthernetDhcpPref = findPreference(KEY_ETHERNET_DHCP);
132         mEthernetDhcpPref.setIntent(EditIpSettingsActivity.createIntent(getContext(),
133                 WifiConfiguration.INVALID_NETWORK_ID));
134     }
135 
136     @Override
onPreferenceTreeClick(Preference preference)137     public boolean onPreferenceTreeClick(Preference preference) {
138         if (preference.getKey() == null) {
139             return super.onPreferenceTreeClick(preference);
140         }
141         switch (preference.getKey()) {
142             case KEY_WIFI_ENABLE:
143                 mConnectivityListener.setWifiEnabled(mEnableWifiPref.isChecked());
144                 return true;
145             case KEY_WIFI_COLLAPSE:
146                 final boolean collapse = !mWifiNetworksCategory.isCollapsed();
147                 mCollapsePref.setTitle(collapse
148                         ? R.string.wifi_setting_see_all : R.string.wifi_setting_see_fewer);
149                 mWifiNetworksCategory.setCollapsed(collapse);
150                 return true;
151             case KEY_WIFI_ALWAYS_SCAN:
152                 Settings.Global.putInt(getActivity().getContentResolver(),
153                         Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
154                         mAlwaysScan.isChecked() ? 1 : 0);
155                 return true;
156             case KEY_ETHERNET_STATUS:
157                 return true;
158         }
159         return super.onPreferenceTreeClick(preference);
160     }
161 
updateConnectivity()162     private void updateConnectivity() {
163         if (!isAdded()) {
164             return;
165         }
166 
167         final boolean wifiEnabled = mConnectivityListener.isWifiEnabled();
168         mEnableWifiPref.setChecked(wifiEnabled);
169 
170         mWifiNetworksCategory.setVisible(wifiEnabled);
171         mCollapsePref.setVisible(wifiEnabled && mWifiNetworksCategory.shouldShowCollapsePref());
172         mWpsPref.setVisible(wifiEnabled);
173         mAddPref.setVisible(wifiEnabled);
174 
175         if (!wifiEnabled) {
176             updateWifiList();
177         }
178 
179         int scanAlwaysAvailable = 0;
180         try {
181             scanAlwaysAvailable = Settings.Global.getInt(getContext().getContentResolver(),
182                     Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE);
183         } catch (Settings.SettingNotFoundException e) {
184             // Ignore
185         }
186         mAlwaysScan.setChecked(scanAlwaysAvailable == 1);
187 
188         final boolean ethernetAvailable = mConnectivityListener.isEthernetAvailable();
189         mEthernetCategory.setVisible(ethernetAvailable);
190         mEthernetStatusPref.setVisible(ethernetAvailable);
191         mEthernetProxyPref.setVisible(ethernetAvailable);
192         mEthernetDhcpPref.setVisible(ethernetAvailable);
193 
194         if (ethernetAvailable) {
195             final boolean ethernetConnected =
196                     mConnectivityListener.getConnectivityStatus().isEthernetConnected();
197             mEthernetStatusPref.setTitle(ethernetConnected
198                     ? R.string.connected : R.string.not_connected);
199             mEthernetStatusPref.setSummary(mConnectivityListener.getEthernetIpAddress());
200         }
201     }
202 
updateWifiList()203     private void updateWifiList() {
204         if (!isAdded()) {
205             return;
206         }
207 
208         if (!mConnectivityListener.isWifiEnabled()) {
209             mWifiNetworksCategory.removeAll();
210             mNoWifiUpdateBeforeMillis = 0;
211             return;
212         }
213 
214         final long now = SystemClock.elapsedRealtime();
215         if (mNoWifiUpdateBeforeMillis > now) {
216             mHandler.removeCallbacks(mInitialUpdateWifiListRunnable);
217             mHandler.postDelayed(mInitialUpdateWifiListRunnable,
218                     mNoWifiUpdateBeforeMillis - now);
219             return;
220         }
221 
222         final int existingCount = mWifiNetworksCategory.getRealPreferenceCount();
223         final Set<Preference> toRemove = new HashSet<>(existingCount);
224         for (int i = 0; i < existingCount; i++) {
225             toRemove.add(mWifiNetworksCategory.getPreference(i));
226         }
227 
228         final Context themedContext = getPreferenceManager().getContext();
229         final Collection<AccessPoint> accessPoints = mConnectivityListener.getAvailableNetworks();
230         int index = 0;
231         for (final AccessPoint accessPoint : accessPoints) {
232             accessPoint.setListener(this);
233             AccessPointPreference pref = (AccessPointPreference) accessPoint.getTag();
234             if (pref == null) {
235                 pref = new AccessPointPreference(accessPoint, themedContext, mUserBadgeCache,
236                         false);
237                 accessPoint.setTag(pref);
238             } else {
239                 toRemove.remove(pref);
240             }
241             if (accessPoint.isActive()) {
242                 pref.setFragment(WifiDetailsFragment.class.getName());
243                 WifiDetailsFragment.prepareArgs(pref.getExtras(), accessPoint);
244                 pref.setIntent(null);
245             } else {
246                 pref.setFragment(null);
247                 pref.setIntent(WifiConnectionActivity.createIntent(getContext(), accessPoint));
248             }
249             pref.setOrder(index++);
250             // Double-adding is harmless
251             mWifiNetworksCategory.addPreference(pref);
252         }
253 
254         for (final Preference preference : toRemove) {
255             mWifiNetworksCategory.removePreference(preference);
256         }
257 
258         mCollapsePref.setVisible(mWifiNetworksCategory.shouldShowCollapsePref());
259     }
260 
261     @Override
onConnectivityChange()262     public void onConnectivityChange() {
263         updateConnectivity();
264     }
265 
266     @Override
onWifiListChanged()267     public void onWifiListChanged() {
268         updateWifiList();
269     }
270 
271     @Override
onAccessPointChanged(AccessPoint accessPoint)272     public void onAccessPointChanged(AccessPoint accessPoint) {
273         ((AccessPointPreference) accessPoint.getTag()).refresh();
274     }
275 
276     @Override
onLevelChanged(AccessPoint accessPoint)277     public void onLevelChanged(AccessPoint accessPoint) {
278         ((AccessPointPreference) accessPoint.getTag()).onLevelChanged();
279     }
280 
281 }
282