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