• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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 com.android.tv.settings.ActionBehavior;
20 import com.android.tv.settings.ActionKey;
21 import com.android.tv.settings.BaseSettingsActivity;
22 import com.android.tv.settings.R;
23 import com.android.tv.settings.dialog.old.Action;
24 import com.android.tv.settings.dialog.old.ActionAdapter;
25 import com.android.tv.settings.dialog.old.ContentFragment;
26 
27 import android.content.Context;
28 import android.net.ConnectivityManager;
29 import android.net.IpConfiguration.IpAssignment;
30 import android.net.IpConfiguration.ProxySettings;
31 import android.net.NetworkInfo;
32 import android.net.Uri;
33 import android.net.wifi.WifiConfiguration;
34 import android.net.wifi.WifiInfo;
35 import android.net.wifi.WifiManager;
36 
37 import android.os.Bundle;
38 import android.util.Log;
39 import android.os.Handler;
40 import android.content.Intent;
41 
42 /**
43  * Activity to view the status and modify the configuration of the currently
44  * connected wifi network.
45  */
46 
47 public class WifiConfigurationActivity extends BaseSettingsActivity
48         implements ActionAdapter.Listener, ConnectivityListener.Listener {
49 
50     protected static final String TAG = "WifiConfigurationActivity";
51     private static final boolean DEBUG = false;
52 
53     private static final int INET_CONDITION_THRESHOLD = 50;
54     private static final int REQUEST_CODE_ADVANCED_OPTIONS = 1;
55 
56     private ConnectivityListener mConnectivityListener;
57     private ConnectivityStatusIconUriGetter mWifiStatusIconUriGetter;
58     private ConnectivityManager mConnectivityManager;
59     private WifiManager mWifiManager;
60     private boolean mInetConnected;
61     private Handler mHandler;
62 
63     private Runnable mMainRefreshView = new Runnable() {
64         @Override
65         public void run() {
66             updateView();
67         }
68     };
69 
70     @Override
onCreate(Bundle savedInstanceState)71     protected void onCreate(Bundle savedInstanceState) {
72         mConnectivityListener = new ConnectivityListener(this, this);
73         mWifiStatusIconUriGetter =
74             ConnectivityStatusIconUriGetter.createWifiStatusIconUriGetter(this);
75         mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
76         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
77         super.onCreate(savedInstanceState);
78         if (DEBUG) Log.d(TAG, "onCreate");
79         mHandler = new Handler();
80     }
81 
82     @Override
onResume()83     protected void onResume() {
84         super.onResume();
85         if (DEBUG) Log.d(TAG, "onResume");
86         mConnectivityListener.start();
87     }
88 
89     @Override
onPause()90     protected void onPause() {
91         mConnectivityListener.stop();
92         super.onPause();
93         if (DEBUG) Log.d(TAG, "onPause");
94     }
95 
96     @Override
getInitialState()97     protected Object getInitialState() {
98         if (DEBUG) Log.d(TAG, "getInitialState");
99         return ActionType.CONECTIVITY_SETTINGS_MAIN;
100     }
101 
102     @Override
onConnectivityChange(Intent intent)103     public void onConnectivityChange(Intent intent) {
104         if (DEBUG) Log.d(TAG, "onConnectivityChange  intent " + intent);
105         String intentAction = intent.getAction();
106         boolean inetConnectedChanged = false;
107         if (intentAction.equals(ConnectivityManager.CONNECTIVITY_ACTION)
108                 || intentAction.equals(ConnectivityManager.INET_CONDITION_ACTION)) {
109             int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);
110             boolean ic = connectionStatus > INET_CONDITION_THRESHOLD ? true : false;
111             if (ic != mInetConnected) {
112                 inetConnectedChanged = true;
113                 mInetConnected = ic;
114             }
115             if (DEBUG) Log.d(TAG, "onConnectivityChange  mInetConnected " + mInetConnected);
116         }
117         if (inetConnectedChanged) {
118             mHandler.post(mMainRefreshView);
119         } else {
120             updateIconUriIfNecessary();
121         }
122     }
123 
updateIconUriIfNecessary()124     private void updateIconUriIfNecessary() {
125         if(mContentFragment instanceof ContentFragment) {
126             ContentFragment cf = (ContentFragment) mContentFragment;
127             Uri oldUri = cf.getIconResourceUri();
128             Uri newUri = Uri.parse(mWifiStatusIconUriGetter.getUri());
129             if (!oldUri.equals(newUri)) {
130                 cf.setIcon(newUri);
131             }
132         }
133     }
134 
getWifiInfo()135     private WifiInfo getWifiInfo() {
136         NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
137         if (networkInfo == null || networkInfo.getType() != ConnectivityManager.TYPE_WIFI) {
138             return null;
139         } else {
140             return mWifiManager.getConnectionInfo();
141         }
142     }
143 
144     @Override
refreshActionList()145     protected void refreshActionList() {
146         if (DEBUG) Log.d(TAG, "refreshActionList");
147         mActions.clear();
148         switch ((ActionType) mState) {
149             case CONECTIVITY_SETTINGS_MAIN:
150                 mActions.add(ActionType.CONECTIVITY_SETTINGS_STATUS_INFO.toAction(mResources));
151                 mActions.add(ActionType.CONECTIVITY_SETTINGS_ADVANCED_OPTIONS.toAction(mResources));
152                 mActions.add(ActionType.CONECTIVITY_SETTINGS_FORGET_NETWORK.toAction(mResources));
153                 break;
154             case CONECTIVITY_SETTINGS_STATUS_INFO: {
155                 boolean isConnected = false;
156                 WifiInfo wifiInfo = getWifiInfo();
157                 if (wifiInfo != null) {
158                     NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
159                     if (networkInfo != null &&
160                         networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
161                         mInetConnected) {
162                         isConnected = true;
163                     }
164                 }
165 
166                 if (!isConnected) {
167                     mActions.add(ActionType.CONECTIVITY_SETTINGS_CONNECTION.
168                                      toInfo(mResources, R.string.not_connected));
169                 } else {
170                     // If we're on a wifi-network and the status is good...
171                     mActions.add(
172                         ActionType.CONECTIVITY_SETTINGS_CONNECTION.
173                             toInfo(mResources, R.string.connected));
174 
175                     int ip = wifiInfo.getIpAddress();
176                     mActions.add(ActionType.CONECTIVITY_SETTINGS_IP_ADDRESS.
177                         toInfo(mResources,
178                                  String.format("%d.%d.%d.%d", (ip & 0xff), (ip >> 8 & 0xff),
179                                                (ip >> 16 & 0xff), (ip >> 24 & 0xff))));
180 
181                     mActions.add(ActionType.CONECTIVITY_SETTINGS_MAC_ADDRESS.
182                         toInfo(mResources, wifiInfo.getMacAddress()));
183 
184                     String[] signalLevels =
185                         getResources().getStringArray(R.array.wifi_signal_strength);
186                     int strength =
187                         WifiManager.
188                             calculateSignalLevel(wifiInfo.getRssi(), signalLevels.length);
189                     mActions.add(ActionType.CONECTIVITY_SETTINGS_SIGNAL_STRENGTH.
190                         toInfo(mResources, signalLevels[strength]));
191                 }
192                 break;
193             }
194             case CONECTIVITY_SETTINGS_ADVANCED_OPTIONS: {
195                 WifiInfo wifiInfo = getWifiInfo();
196                 if (wifiInfo != null) {
197                     WifiConfiguration wifiConfiguration =
198                         WifiConfigHelper.getWifiConfiguration(
199                             mWifiManager, wifiInfo.getNetworkId());
200                     if (wifiConfiguration != null) {
201                         int proxySettingsResourceId =
202                             (wifiConfiguration.getProxySettings() == ProxySettings.NONE) ?
203                                 R.string.wifi_action_proxy_none :
204                                 R.string.wifi_action_proxy_manual;
205                         mActions.add(ActionType.CONECTIVITY_SETTINGS_PROXY_SETTINGS.
206                                             toAction(mResources, proxySettingsResourceId));
207 
208                         int ipSettingsResourceId =
209                            (wifiConfiguration.getIpAssignment() == IpAssignment.STATIC) ?
210                                 R.string.wifi_action_static :
211                                 R.string.wifi_action_dhcp;
212                         mActions.add(ActionType.CONECTIVITY_SETTINGS_IP_SETTINGS.
213                                             toAction(mResources, ipSettingsResourceId));
214                     }
215                 } else {
216                     mActions.add(ActionType.CONECTIVITY_SETTINGS_CONNECTION.
217                                      toInfo(mResources, R.string.not_connected));
218                 }
219                 break;
220             }
221 
222             case CONECTIVITY_SETTINGS_FORGET_NETWORK: {
223                 String okKey =
224                     new ActionKey<ActionType, ActionBehavior>(
225                         ActionType.CONECTIVITY_SETTINGS_FORGET_NETWORK, ActionBehavior.OK).getKey();
226                 mActions.add(
227                     new Action.Builder()
228                         .key(okKey)
229                         .title(getString(R.string.wifi_forget_network))
230                         .build());
231                 String cancelKey =
232                     new ActionKey<ActionType, ActionBehavior>(
233                             ActionType.CONECTIVITY_SETTINGS_FORGET_NETWORK,
234                             ActionBehavior.CANCEL).getKey();
235                 mActions.add(
236                     new Action.Builder()
237                         .key(cancelKey)
238                         .title(getString(R.string.settings_cancel))
239                         .build());
240                 break;
241             }
242         }
243     }
244 
getNetworkName()245     private String getNetworkName() {
246         NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
247         String name = getString(R.string.connectivity_wifi);
248         if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
249             WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
250             if (wifiInfo != null) {
251                 name = WifiInfo.removeDoubleQuotes(wifiInfo.getSSID());
252             }
253         }
254         return name;
255     }
256 
257     @Override
updateView()258     protected void updateView() {
259         refreshActionList();
260         if (DEBUG) Log.d(TAG, "updateView  mState " + (ActionType) mState);
261         switch ((ActionType) mState) {
262             case CONECTIVITY_SETTINGS_MAIN: {
263                 setView(getNetworkName(), null, null,
264                         Uri.parse(mWifiStatusIconUriGetter.getUri()));
265                 break;
266             }
267             case CONECTIVITY_SETTINGS_STATUS_INFO: {
268                 setView(getString(R.string.wifi_action_status_info), getNetworkName(), null,
269                         Uri.parse(mWifiStatusIconUriGetter.getUri()));
270                 break;
271             }
272             case CONECTIVITY_SETTINGS_ADVANCED_OPTIONS: {
273                 setView(getString(R.string.wifi_action_advanced_options_title),
274                         getNetworkName(), null, Uri.parse(mWifiStatusIconUriGetter.getUri()));
275                 break;
276             }
277             case CONECTIVITY_SETTINGS_FORGET_NETWORK: {
278                 setView(R.string.wifi_forget_network, getNetworkName(),
279                         R.string.wifi_forget_network_description,
280                         Uri.parse(mWifiStatusIconUriGetter.getUri()));
281                 break;
282             }
283         }
284     }
285 
286     @Override
onActivityResult(int requestCode, int resultCode, Intent data)287     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
288         if (requestCode == REQUEST_CODE_ADVANCED_OPTIONS && resultCode == RESULT_OK) {
289             updateView();
290         } else {
291             super.onActivityResult(requestCode, resultCode, data);
292         }
293     }
294 
295     @Override
setProperty(boolean enable)296     protected void setProperty(boolean enable) {
297     }
298 
getNetworkId()299     private int getNetworkId() {
300         WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
301         if (wifiInfo != null) {
302               return wifiInfo.getNetworkId();
303         }
304         return -1;
305     }
306 
307     @Override
onActionClicked(Action action)308     public void onActionClicked(Action action) {
309         if (DEBUG) Log.d(TAG, "onActionClicked " + action.getKey());
310 
311         ActionKey<ActionType, ActionBehavior> actionKey =
312             new ActionKey<ActionType, ActionBehavior>(
313                 ActionType.class, ActionBehavior.class, action.getKey());
314         final ActionType type = actionKey.getType();
315         final ActionBehavior behavior = actionKey.getBehavior();
316 
317         switch (type) {
318             case CONECTIVITY_SETTINGS_STATUS_INFO:
319                 switch (behavior) {
320                     case INIT:
321                         setState(type, true);
322                         break;
323                 }
324                 break;
325             case CONECTIVITY_SETTINGS_ADVANCED_OPTIONS:
326                 switch (behavior) {
327                     case INIT:
328                         setState(type, true);
329                         break;
330                 }
331                 break;
332             case CONECTIVITY_SETTINGS_PROXY_SETTINGS:
333                 switch (behavior) {
334                     case INIT: {
335                         int networkId = getNetworkId();
336                         if (networkId != -1) {
337                             startActivityForResult(
338                                 EditProxySettingsActivity.createIntent(this, networkId),
339                                 REQUEST_CODE_ADVANCED_OPTIONS);
340                         }
341                         break;
342                     }
343                 }
344                 break;
345             case CONECTIVITY_SETTINGS_IP_SETTINGS:
346                 switch (behavior) {
347                     case INIT: {
348                         int networkId = getNetworkId();
349                         if (networkId != -1) {
350                             startActivityForResult(
351                                 EditIpSettingsActivity.createIntent(this, networkId),
352                                 REQUEST_CODE_ADVANCED_OPTIONS);
353                         }
354                         break;
355                     }
356                 }
357                 break;
358             case CONECTIVITY_SETTINGS_FORGET_NETWORK: {
359                 switch (behavior) {
360                     case INIT:
361                         setState(type, true);
362                         break;
363                     case OK: {
364                         int networkId = getNetworkId();
365                         if (networkId != -1) {
366                             mWifiManager.forget(networkId, null);
367                         }
368                         setResult(RESULT_OK);
369                         finish();
370                         break;
371                     }
372                     case CANCEL:
373                         goBack();
374                         break;
375                 }
376                 break;
377             }
378         }
379     }
380 }
381