WifiSettingsForSetupWizardXL.java revision 5cd1bbda7d5f13d36a8d0144ed5310064a760bee
1d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/* 2d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project 3d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 4d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); 5d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * you may not use this file except in compliance with the License. 6d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * You may obtain a copy of the License at 7d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 8d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 9d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * 10d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 11d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, 12d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * See the License for the specific language governing permissions and 14d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * limitations under the License. 15d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 16d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 17d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapackage com.android.settings.wifi; 18d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 19d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.app.Activity; 20fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawaimport android.content.Context; 21cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawaimport android.content.Intent; 22f54fec59398a285b1f5344da120792bec5e4707aFreeman Ngimport android.content.pm.ActivityInfo; 23d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.NetworkInfo.DetailedState; 24cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawaimport android.net.wifi.WifiConfiguration; 2558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport android.net.wifi.WifiManager; 26d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.os.Bundle; 274dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawaimport android.os.Handler; 28590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.os.Message; 29e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.preference.PreferenceScreen; 3055de702961642521e247f155963644df81756215Daisuke Miyakawaimport android.text.TextUtils; 318b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawaimport android.util.Log; 3214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawaimport android.view.View; 33d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.view.View.OnClickListener; 3458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport android.view.ViewGroup; 35d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.view.Window; 365d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport android.view.inputmethod.InputMethodManager; 37d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.Button; 38d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.ProgressBar; 39d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.TextView; 40d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 41e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport com.android.settings.R; 42590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff 4358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport java.util.Collection; 44d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.EnumMap; 4509d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawaimport java.util.List; 46d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 47d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/** 48d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * WifiSetings Activity specific for SetupWizard with X-Large screen size. 49d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */ 50d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapublic class WifiSettingsForSetupWizardXL extends Activity implements OnClickListener { 5158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private static final String TAG = "SetupWizard"; 5235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private static final boolean DEBUG = true; 5358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 54f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng // lock orientation into landscape or portrait 55f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng private static final String EXTRA_PREFS_LANDSCAPE_LOCK = "extra_prefs_landscape_lock"; 56f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng private static final String EXTRA_PREFS_PORTRAIT_LOCK = "extra_prefs_portrait_lock"; 57f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng 582adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa private static final EnumMap<DetailedState, DetailedState> sNetworkStateMap = 5958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa new EnumMap<DetailedState, DetailedState>(DetailedState.class); 60d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 61d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa static { 622adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.IDLE, DetailedState.DISCONNECTED); 632adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.SCANNING, DetailedState.SCANNING); 642adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.CONNECTING, DetailedState.CONNECTING); 652adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.AUTHENTICATING, DetailedState.CONNECTING); 662adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.OBTAINING_IPADDR, DetailedState.CONNECTING); 672adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.CONNECTED, DetailedState.CONNECTED); 682adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.SUSPENDED, DetailedState.SUSPENDED); // ? 692adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.DISCONNECTING, DetailedState.DISCONNECTED); 702adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.DISCONNECTED, DetailedState.DISCONNECTED); 712adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa sNetworkStateMap.put(DetailedState.FAILED, DetailedState.FAILED); 72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 742adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa private WifiSettings mWifiSettings; 752adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa private WifiManager mWifiManager; 762adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa 772adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa /** Used for resizing a padding above title. Hiden when software keyboard is shown. */ 7814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa private View mTopPadding; 7914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 80dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa /** Used for resizing a padding of main content. Hiden when software keyboard is shown. */ 81dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa private View mContentPadding; 8214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 8314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa private TextView mTitleView; 8414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa /** 8514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa * The name of a network currently connecting, or trying to connect. 8614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa * This may be empty ("") at first, and updated when configuration is changed. 8714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa */ 8814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa private CharSequence mNetworkName = ""; 8914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa private CharSequence mEditingTitle; 9014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 91d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa private ProgressBar mProgressBar; 92beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa private View mTopDividerNoProgress; 932adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa /** 942adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * Used for resizing a padding between WifiSettings preference and bottom bar when 952adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * ProgressBar is visible as a top divider. 962adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa */ 97be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa private View mBottomPadding; 98be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa 9958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private Button mAddNetworkButton; 10058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private Button mRefreshButton; 10158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private Button mSkipOrNextButton; 10258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private Button mBackButton; 10358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 1044781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa private Button mConnectButton; 1054781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 10635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa /** 10735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa * View enclosing {@link WifiSettings}. 10835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa */ 10935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private View mWifiSettingsFragmentLayout; 110a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa private View mConnectingStatusLayout; 111a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa private TextView mConnectingStatusView; 112a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa 1132adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa /* 1142adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * States of current screen, which should be saved and restored when Activity is relaunched 1152adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * with orientation change, etc. 1162adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa */ 11735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private static final int SCREEN_STATE_DISCONNECTED = 0; 11835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private static final int SCREEN_STATE_EDITING = 1; 11935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private static final int SCREEN_STATE_CONNECTING = 2; 12035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private static final int SCREEN_STATE_CONNECTED = 3; 12135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 1222adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa /** Current screen state. */ 12335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private int mScreenState = SCREEN_STATE_DISCONNECTED; 12458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 12558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private WifiConfigUiForSetupWizardXL mWifiConfig; 12658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 1275d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa private InputMethodManager mInputMethodManager; 128fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawa 1292adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa /** 1302adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * Previous network connection state reported by main Wifi module. 1312adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * 1322adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * Note that we don't use original {@link DetailedState} object but simplified one translated 1332adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * using sNetworkStateMap. 1342adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa */ 1352adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa private DetailedState mPreviousNetworkState = DetailedState.DISCONNECTED; 1364781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 137d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa @Override 138d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onCreate(Bundle savedInstanceState) { 139d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa super.onCreate(savedInstanceState); 140d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa requestWindowFeature(Window.FEATURE_NO_TITLE); 141d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa setContentView(R.layout.wifi_settings_for_setup_wizard_xl); 14258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 14358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 144dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa // There's no button here enabling wifi network, so we need to enable it without 145dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa // users' request. 146dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa mWifiManager.setWifiEnabled(true); 147dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa 148d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mWifiSettings = 149d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa (WifiSettings)getFragmentManager().findFragmentById(R.id.wifi_setup_fragment); 1505d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 1512adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa 1522adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa initViews(); 1532adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa 1542adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // At first, Wifi module doesn't return SCANNING state (it's too early), so we manually 1552adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // show it. 156f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa showScanningState(); 157d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 158d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 1592adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa private void initViews() { 160f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng Intent intent = getIntent(); 161f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng 162f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng if (intent.getBooleanExtra("firstRun", false)) { 16335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa final View layoutRoot = findViewById(R.id.layout_root); 16435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa layoutRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK); 16535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 166f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng if (intent.getBooleanExtra(EXTRA_PREFS_LANDSCAPE_LOCK, false)) { 167f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 168f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng } 169f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng if (intent.getBooleanExtra(EXTRA_PREFS_PORTRAIT_LOCK, false)) { 170f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 171f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng } 17262fb701ea9781f4e1c05af6d730e91bb2cdcdae0Daisuke Miyakawa 17314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mTitleView = (TextView)findViewById(R.id.wifi_setup_title); 174d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mProgressBar = (ProgressBar)findViewById(R.id.scanning_progress_bar); 175d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa mProgressBar.setMax(2); 176beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa mTopDividerNoProgress = findViewById(R.id.top_divider_no_progress); 177be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mBottomPadding = findViewById(R.id.bottom_padding); 178d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 179beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa mProgressBar.setVisibility(View.VISIBLE); 1803b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa mProgressBar.setIndeterminate(true); 181beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa mTopDividerNoProgress.setVisibility(View.GONE); 1823b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa 18358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mAddNetworkButton = (Button)findViewById(R.id.wifi_setup_add_network); 18458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mAddNetworkButton.setOnClickListener(this); 18558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mRefreshButton = (Button)findViewById(R.id.wifi_setup_refresh_list); 18658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mRefreshButton.setOnClickListener(this); 18758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton = (Button)findViewById(R.id.wifi_setup_skip_or_next); 18858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setOnClickListener(this); 18958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mConnectButton = (Button)findViewById(R.id.wifi_setup_connect); 19058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mConnectButton.setOnClickListener(this); 19158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mBackButton = (Button)findViewById(R.id.wifi_setup_cancel); 19258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mBackButton.setOnClickListener(this); 1934dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa 19414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mTopPadding = findViewById(R.id.top_padding); 195dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mContentPadding = findViewById(R.id.content_padding); 19614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 19735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mWifiSettingsFragmentLayout = findViewById(R.id.wifi_settings_fragment_layout); 198a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusLayout = findViewById(R.id.connecting_status_layout); 199a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusView = (TextView) findViewById(R.id.connecting_status); 20058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 20158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 202dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa private void restoreFirstVisibilityState() { 203a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa showDefaultTitle(); 204fe7d04fee23b4142c77ec7ab1416f0b94384ba63Daisuke Miyakawa mAddNetworkButton.setVisibility(View.VISIBLE); 20558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mRefreshButton.setVisibility(View.VISIBLE); 20658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setVisibility(View.VISIBLE); 20758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mConnectButton.setVisibility(View.GONE); 20858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mBackButton.setVisibility(View.GONE); 209dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa setPaddingVisibility(View.VISIBLE); 210d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 211d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 212d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa @Override 213d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa public void onClick(View view) { 214fdb9343ef660fc424bb8c29b48d5c06dff0241c1Daisuke Miyakawa hideSoftwareKeyboard(); 21558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (view == mAddNetworkButton) { 2164dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa if (DEBUG) Log.d(TAG, "AddNetwork button pressed"); 21758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa onAddNetworkButtonPressed(); 21858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (view == mRefreshButton) { 2194dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa if (DEBUG) Log.d(TAG, "Refresh button pressed"); 22058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa refreshAccessPoints(true); 22158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (view == mSkipOrNextButton) { 2224dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa if (DEBUG) Log.d(TAG, "Skip/Next button pressed"); 22355de702961642521e247f155963644df81756215Daisuke Miyakawa if (TextUtils.equals(getString(R.string.wifi_setup_skip), ((Button)view).getText())) { 22455de702961642521e247f155963644df81756215Daisuke Miyakawa // We don't want to let Wifi enabled when a user press skip without choosing 22555de702961642521e247f155963644df81756215Daisuke Miyakawa // any access point. 22658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiManager.setWifiEnabled(false); 22783183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa // Notify "skip" 22883183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa setResult(RESULT_FIRST_USER); 22983183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa } else { 23083183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa setResult(RESULT_OK); 23155de702961642521e247f155963644df81756215Daisuke Miyakawa } 2327e3ff8eca6ce2912839c02065a5463c5cd234aaeDaisuke Miyakawa finish(); 23358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (view == mConnectButton) { 2344dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa if (DEBUG) Log.d(TAG, "Connect button pressed"); 2358b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa onConnectButtonPressed(); 23658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else if (view == mBackButton) { 2374dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa if (DEBUG) Log.d(TAG, "Back button pressed"); 23858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa onBackButtonPressed(); 239d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 2405d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa } 2415d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa 2425d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa private void hideSoftwareKeyboard() { 243c9cd29ddb832fd76d96fea080abe8325a8bb1bd2satok if (DEBUG) Log.i(TAG, "Hiding software keyboard."); 2445d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa final View focusedView = getCurrentFocus(); 2455d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa if (focusedView != null) { 2465d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); 2475d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa } 248d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 249d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 25086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa // Called from WifiSettings 2515d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa /* package */ void updateConnectionState(DetailedState originalState) { 2522adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa final DetailedState state = sNetworkStateMap.get(originalState); 25358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 25458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (originalState == DetailedState.FAILED) { 25558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We clean up the current connectivity status and let users select another network 25658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // if they want. 25758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa refreshAccessPoints(true); 25858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 25958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 260d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa switch (state) { 261b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa case SCANNING: { 2626a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa if (mScreenState == SCREEN_STATE_DISCONNECTED) { 2636a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa if (mWifiSettings.getAccessPointsCount() == 0) { 2647e84e4682d5d9b643add13c453d631dad8343918Freeman Ng showScanningState(); 2656a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa } else { 2666a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa showDisconnectedProgressBar(); 267dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE); 268dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mBottomPadding.setVisibility(View.GONE); 269dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa } 2706a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa } else { 2716a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa showDisconnectedProgressBar(); 272b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 273b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa break; 274b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa } 275d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case CONNECTING: { 276c4a495fb5b3d161aa0227a08d6179bf21ffcc730Daisuke Miyakawa if (mScreenState == SCREEN_STATE_CONNECTING) { 27735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa showConnectingState(); 27835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 279d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa break; 280d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 281d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa case CONNECTED: { 28235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa showConnectedState(); 283d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa break; 284d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 2854dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa default: // DISCONNECTED, FAILED 286f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa if (mScreenState != SCREEN_STATE_CONNECTED && 287f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa mWifiSettings.getAccessPointsCount() > 0) { 28835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa showDisconnectedState(Summary.get(this, state)); 28935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 2905d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa break; 2915d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa } 2922adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa mPreviousNetworkState = state; 2934dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa } 29458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 29535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private void showDisconnectedState(String stateString) { 296be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showDisconnectedProgressBar(); 297f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa if (mScreenState == SCREEN_STATE_DISCONNECTED && 298f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa mWifiSettings.getAccessPointsCount() > 0) { 299dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE); 300dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mBottomPadding.setVisibility(View.GONE); 301dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa } 3024dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa mAddNetworkButton.setEnabled(true); 3034dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa mRefreshButton.setEnabled(true); 304d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 305d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 30635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private void showConnectingState() { 30735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mScreenState = SCREEN_STATE_CONNECTING; 30835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 309ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa mBackButton.setVisibility(View.VISIBLE); 31014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa // We save this title and show it when authentication failed. 31114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mEditingTitle = mTitleView.getText(); 312a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa showConnectingTitle(); 313be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showConnectingProgressBar(); 314350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa 31535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa setPaddingVisibility(View.VISIBLE); 31635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 31735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 31835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa private void showConnectedState() { 31935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // Once we show "connected" screen, we won't change it even when the device becomes 32035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // disconnected afterwards. We keep the state unless a user explicitly cancel it 32135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // (by pressing "back" button). 32235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mScreenState = SCREEN_STATE_CONNECTED; 32335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 32435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa hideSoftwareKeyboard(); 32535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa setPaddingVisibility(View.VISIBLE); 32635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 32735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa showConnectedTitle(); 328be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showConnectedProgressBar(); 32935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 33035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.GONE); 33135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mConnectingStatusLayout.setVisibility(View.VISIBLE); 33235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 33335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mConnectingStatusView.setText(R.string.wifi_setup_description_connected); 33435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mConnectButton.setVisibility(View.GONE); 33535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mAddNetworkButton.setVisibility(View.GONE); 33635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mRefreshButton.setVisibility(View.GONE); 33735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mBackButton.setVisibility(View.VISIBLE); 33835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mBackButton.setText(R.string.wifi_setup_back); 33935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mSkipOrNextButton.setVisibility(View.VISIBLE); 34035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mSkipOrNextButton.setEnabled(true); 34114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa } 34214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 343a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa private void showDefaultTitle() { 344a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa mTitleView.setText(getString(R.string.wifi_setup_title)); 345a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa } 346a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa 3474781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa private void showAddNetworkTitle() { 3484781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mNetworkName = ""; 3494781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mTitleView.setText(R.string.wifi_setup_title_add_network); 3504781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } 3514781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 352a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa private void showEditingTitle() { 35314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) { 3544781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa if (mWifiConfig.getController() != null && 3554781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mWifiConfig.getController().getConfig() != null) { 3564781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mNetworkName = mWifiConfig.getController().getConfig().SSID; 3574781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } else { 3584781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " + 3594781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa "Ignore them."); 3604781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } 36114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa } 36214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mTitleView.setText(getString(R.string.wifi_setup_title_editing_network, mNetworkName)); 363f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa } 364f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa 365a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa private void showConnectingTitle() { 366a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) { 3674781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa if (mWifiConfig.getController() != null && 3684781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mWifiConfig.getController().getConfig() != null) { 3694781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mNetworkName = mWifiConfig.getController().getConfig().SSID; 3704781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } else { 3714781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " + 3724781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa "Ignore them."); 3734781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } 374a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa } 375a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa mTitleView.setText(getString(R.string.wifi_setup_title_connecting_network, mNetworkName)); 376a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa } 377a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa 378a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa private void showConnectedTitle() { 379a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) { 3804781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa if (mWifiConfig.getController() != null && 3814781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mWifiConfig.getController().getConfig() != null) { 3824781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mNetworkName = mWifiConfig.getController().getConfig().SSID; 3834781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } else { 3844781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " + 3854781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa "Ignore them."); 3864781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } 387a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa } 388a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa mTitleView.setText(getString(R.string.wifi_setup_title_connected_network, mNetworkName)); 389a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa } 390a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa 391be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa /** 392be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * Shows top divider with ProgressBar without defining the state of the ProgressBar. 393be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * 394be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * @see #showScanningProgressBar() 395be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * @see #showConnectedProgressBar() 396be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * @see #showConnectingProgressBar() 397be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa */ 398be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa private void showTopDividerWithProgressBar() { 399beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa mProgressBar.setVisibility(View.VISIBLE); 400beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa mTopDividerNoProgress.setVisibility(View.GONE); 401be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mBottomPadding.setVisibility(View.GONE); 402be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa } 403be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa 404dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa private void showScanningState() { 405dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa setPaddingVisibility(View.VISIBLE); 406dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.GONE); 407be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showScanningProgressBar(); 4084dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa } 4094dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa 41058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void onAddNetworkButtonPressed() { 41158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiSettings.onAddNetworkPressed(); 412fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa } 413fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa 41458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 41558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when the screen enters wifi configuration UI. UI widget for configuring network 41658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * (a.k.a. ConfigPreference) should be taken care of by caller side. 41758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * This method should handle buttons' visibility/enabled. 41858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param selectedAccessPoint AccessPoint object being selected. null when a user pressed 41958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * "Add network" button, meaning there's no selected access point. 42058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 42158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void showConfigUi(AccessPoint selectedAccessPoint, boolean edit) { 422dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mScreenState = SCREEN_STATE_EDITING; 423dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa 424cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa if (selectedAccessPoint != null && 425cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa (selectedAccessPoint.security == AccessPoint.SECURITY_WEP || 426cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) { 427cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa // We forcibly set edit as true so that users can modify every field if they want, 428cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa // while config UI doesn't allow them to edit some of them when edit is false 429cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa // (e.g. password field is hiden when edit==false). 430cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa edit = true; 431cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 432cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 4332adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // We don't want to keep scanning Wifi networks during users' configuring a network. 43458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiSettings.pauseWifiScan(); 43558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 43635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.GONE); 437a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusLayout.setVisibility(View.GONE); 43858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui); 43958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa parent.setVisibility(View.VISIBLE); 44058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa parent.removeAllViews(); 44158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiConfig = new WifiConfigUiForSetupWizardXL(this, parent, selectedAccessPoint, edit); 4424781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 4434781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa if (selectedAccessPoint == null) { // "Add network" flow 4444781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa showAddNetworkTitle(); 4454781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mConnectButton.setVisibility(View.VISIBLE); 4464781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 447ffce5dabbb8ad5cc441181241e84cf1a03233e20Daisuke Miyakawa showDisconnectedProgressBar(); 4484781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa showEditingButtonState(); 4494781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } else if (selectedAccessPoint.security == AccessPoint.SECURITY_NONE) { 45014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mNetworkName = selectedAccessPoint.getTitle().toString(); 45158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 45214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa // onConnectButtonPressed() will change visibility status. 45314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mConnectButton.performClick(); 4540333f74b9c54227cee22f04fbb08a562771504e9Daisuke Miyakawa } else { 4554781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mNetworkName = selectedAccessPoint.getTitle().toString(); 456a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa showEditingTitle(); 457ffce5dabbb8ad5cc441181241e84cf1a03233e20Daisuke Miyakawa showDisconnectedProgressBar(); 4584781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa showEditingButtonState(); 4594781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa if (selectedAccessPoint.security == AccessPoint.SECURITY_EAP) { 46035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa onEapNetworkSelected(); 4614781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } else { 4624781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mConnectButton.setVisibility(View.VISIBLE); 4634781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 4644781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa // WifiConfigController shows Connect button as "Save" when edit==true and a user 4654781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa // tried to connect the network. 4664781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa // In SetupWizard, we just show the button as "Connect" instead. 4674781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mConnectButton.setText(R.string.wifi_connect); 4684781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mBackButton.setText(R.string.wifi_setup_cancel); 4694781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } 47014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa } 47158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 47258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 47335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa /** 4742adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * Called before security fields are correctly set by {@link WifiConfigController}. 47535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa * 47635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa * @param view security field view 47735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa * @param accessPointSecurity type of security. e.g. AccessPoint.SECURITY_NONE 47835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa * @return true when it is ok for the caller to init security fields. false when 47935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa * all security fields are managed by this method, and thus the caller shouldn't touch them. 48035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa */ 48135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa /* package */ boolean initSecurityFields(View view, int accessPointSecurity) { 48235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // Reset all states tweaked below. 48335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.eap_not_supported).setVisibility(View.GONE); 48435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.eap_not_supported_for_add_network).setVisibility(View.GONE); 48535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.ssid_text).setVisibility(View.VISIBLE); 48635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.ssid_layout).setVisibility(View.VISIBLE); 48735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 48835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa if (accessPointSecurity == AccessPoint.SECURITY_EAP) { 489d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa setPaddingVisibility(View.VISIBLE); 49035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa hideSoftwareKeyboard(); 49135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 49235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // In SetupWizard for XLarge screen, we don't have enough space for showing 49335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // configurations needed for EAP. We instead disable the whole feature there and let 49435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // users configure those networks after the setup. 495d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa if (view.findViewById(R.id.type_ssid).getVisibility() == View.VISIBLE) { 49635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.eap_not_supported_for_add_network) 4972adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa .setVisibility(View.VISIBLE); 49835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } else { 49935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.eap_not_supported).setVisibility(View.VISIBLE); 50035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 50135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.security_fields).setVisibility(View.GONE); 50235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.ssid_text).setVisibility(View.GONE); 50335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa view.findViewById(R.id.ssid_layout).setVisibility(View.GONE); 50435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa onEapNetworkSelected(); 5052adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa 5062adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // This method did init security fields by itself. The caller must not do it. 50735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa return false; 50835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 5092adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa 510d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa mConnectButton.setVisibility(View.VISIBLE); 511d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa setPaddingVisibility(View.GONE); 512d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa 513d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa // In "add network" flow, we'll see multiple initSecurityFields() calls with different 514d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa // accessPointSecurity variable. We want to show software keyboard conditionally everytime 515d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa // when this method is called. 516d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa if (mWifiConfig != null) { 517d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa if (accessPointSecurity == AccessPoint.SECURITY_PSK || 518d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa accessPointSecurity == AccessPoint.SECURITY_WEP) { 519d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa mWifiConfig.requestFocusAndShowKeyboard(R.id.password); 520d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa } else { 521d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa mWifiConfig.requestFocusAndShowKeyboard(R.id.ssid); 522d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa } 523d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa } 524d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa 5252adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // Let the caller init security fields. 52635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa return true; 52735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 52835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 529d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa private void onEapNetworkSelected() { 53035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mConnectButton.setVisibility(View.GONE); 53135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mBackButton.setText(R.string.wifi_setup_back); 53235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa } 53335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 5344781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa private void showEditingButtonState() { 5354781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mSkipOrNextButton.setVisibility(View.GONE); 5364781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mAddNetworkButton.setVisibility(View.GONE); 5374781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mRefreshButton.setVisibility(View.GONE); 5384781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa mBackButton.setVisibility(View.VISIBLE); 5394781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa } 5404781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa 54158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // May be called when user press "connect" button in WifiDialog 54258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void onConnectButtonPressed() { 54335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mScreenState = SCREEN_STATE_CONNECTING; 54458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 54558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiSettings.submit(mWifiConfig.getController()); 54658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 5472adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // updateConnectionState() isn't called soon by the main Wifi module after the user's 5482adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // "connect" request, and the user still sees "not connected" message for a while, which 5492adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // looks strange for users though legitimate from the view of the module. 5502adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // 55158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // We instead manually show "connecting" message before the system gets actual 5522adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // "connecting" message from Wifi module. 55335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa showConnectingState(); 55458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 55558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // Might be better to delay showing this button. 55658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mBackButton.setVisibility(View.VISIBLE); 557ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa mBackButton.setText(R.string.wifi_setup_back); 55858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 559a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui); 560a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa parent.setVisibility(View.GONE); 561a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusLayout.setVisibility(View.VISIBLE); 562a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusView.setText(R.string.wifi_setup_description_connecting); 563a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa 56458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setVisibility(View.VISIBLE); 56558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setEnabled(false); 56658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mConnectButton.setVisibility(View.GONE); 56758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mAddNetworkButton.setVisibility(View.GONE); 56858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mRefreshButton.setVisibility(View.GONE); 569d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa } 570d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa 57158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void onBackButtonPressed() { 5728f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa 57335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa if (mScreenState == SCREEN_STATE_CONNECTING || mScreenState == SCREEN_STATE_CONNECTED) { 5744dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa if (DEBUG) Log.d(TAG, "Back button pressed after connect action."); 57535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mScreenState = SCREEN_STATE_DISCONNECTED; 57658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 57758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa // When a user press "Back" button after pressing "Connect" button, we want to cancel 5782adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // the "Connect" request and refresh the whole Wifi status. 579dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa restoreFirstVisibilityState(); 58058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 58158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setEnabled(true); 5824dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa changeNextButtonState(false); // Skip 58358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 58435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // Wifi list becomes empty for a moment. We show "scanning" effect to a user so that 58535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa // he/she won't be astonished there. This stops once the scan finishes. 586dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa showScanningState(); 58735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 58809d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa // Remembered networks may be re-used during SetupWizard, which confuse users. 58909d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa // We force the module to forget them to reduce UX complexity 59009d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); 59109d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa for (WifiConfiguration config : configs) { 59209d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa if (DEBUG) { 59309d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa Log.d(TAG, String.format("forgeting Wi-Fi network \"%s\" (id: %d)", 59409d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa config.SSID, config.networkId)); 59509d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa } 5965cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.forget(config.networkId, new WifiManager.ActionListener() { 5978f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 5988f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 5998f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 6008f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff //TODO: Add failure UI 6018f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 6028f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }); 60309d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa } 60409d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa 605dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.GONE); 60658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa refreshAccessPoints(true); 60758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else { // During user's Wifi configuration. 608dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mScreenState = SCREEN_STATE_DISCONNECTED; 60958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiSettings.resumeWifiScan(); 61058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 611dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa restoreFirstVisibilityState(); 61258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 61358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mAddNetworkButton.setEnabled(true); 61458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mRefreshButton.setEnabled(true); 61558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setEnabled(true); 616dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa showDisconnectedProgressBar(); 617f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE); 618f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa mBottomPadding.setVisibility(View.GONE); 61958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 62058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 621dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa setPaddingVisibility(View.VISIBLE); 622a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusLayout.setVisibility(View.GONE); 62358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui); 62458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa parent.removeAllViews(); 62558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa parent.setVisibility(View.GONE); 62658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiConfig = null; 62758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 62858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 62958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 63058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * @param connected true when the device is connected to a specific network. 63158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 63258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void changeNextButtonState(boolean connected) { 63358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (connected) { 63458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setText(R.string.wifi_setup_next); 63558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } else { 63658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mSkipOrNextButton.setText(R.string.wifi_setup_skip); 63758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 63858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 63958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 64058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /** 64158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * Called when the list of AccessPoints are modified and this Activity needs to refresh 64258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa * the list. 643e78c1879058571c00879f0d3e756951302adf513Gilles Debunne * @param preferenceScreen 64458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa */ 64558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa /* package */ void onAccessPointsUpdated( 646e78c1879058571c00879f0d3e756951302adf513Gilles Debunne PreferenceScreen preferenceScreen, Collection<AccessPoint> accessPoints) { 647350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa // If we already show some of access points but the bar still shows "scanning" state, it 648350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa // should be stopped. 649350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa if (mProgressBar.isIndeterminate() && accessPoints.size() > 0) { 650dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa showDisconnectedProgressBar(); 651dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa if (mScreenState == SCREEN_STATE_DISCONNECTED) { 652dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE); 653dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mBottomPadding.setVisibility(View.GONE); 654dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa } 655350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa mAddNetworkButton.setEnabled(true); 656350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa mRefreshButton.setEnabled(true); 657350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa } 658350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa 65958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa for (AccessPoint accessPoint : accessPoints) { 66058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa accessPoint.setLayoutResource(R.layout.custom_preference); 661e78c1879058571c00879f0d3e756951302adf513Gilles Debunne preferenceScreen.addPreference(accessPoint); 66258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 66358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 66458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 66558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa private void refreshAccessPoints(boolean disconnectNetwork) { 666f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa showScanningState(); 6678b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa 66858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa if (disconnectNetwork) { 66958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiManager.disconnect(); 67058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa } 67158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa 67258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa mWifiSettings.refreshAccessPoints(); 6738b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa } 674cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 675cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa /** 67614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa * Called when {@link WifiSettings} received 67714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa * {@link WifiManager#SUPPLICANT_STATE_CHANGED_ACTION}. 678cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa */ 679cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa /* package */ void onSupplicantStateChanged(Intent intent) { 680cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa final int errorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); 681cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa if (errorCode == WifiManager.ERROR_AUTHENTICATING) { 682cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa Log.i(TAG, "Received authentication error event."); 683cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa onAuthenticationFailure(); 684cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 685cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 686cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 687cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa /** 688cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa * Called once when Authentication failed. 689cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa */ 690cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa private void onAuthenticationFailure() { 69135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa mScreenState = SCREEN_STATE_EDITING; 69235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa 693cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa mSkipOrNextButton.setVisibility(View.GONE); 694cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa mConnectButton.setVisibility(View.VISIBLE); 695cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa mConnectButton.setEnabled(true); 696cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 69714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa if (!TextUtils.isEmpty(mEditingTitle)) { 69814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa mTitleView.setText(mEditingTitle); 69914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa } else { 70014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa Log.w(TAG, "Title during editing/adding a network was empty."); 701a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa showEditingTitle(); 70214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa } 70314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 704a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui); 705a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa parent.setVisibility(View.VISIBLE); 706a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa mConnectingStatusLayout.setVisibility(View.GONE); 7076291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa 7086291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa showDisconnectedProgressBar(); 7096291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa setPaddingVisibility(View.GONE); 710cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 711cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa 7122adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // Used by WifiConfigUiForSetupWizardXL 7132adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa /* package */ void setPaddingVisibility(int visibility) { 714dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mTopPadding.setVisibility(visibility); 715dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mContentPadding.setVisibility(visibility); 71614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa } 71714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa 718be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa private void showDisconnectedProgressBar() { 719dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa // The device may report DISCONNECTED during connecting to a network, at which we don't 720dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa // want to lose bottom padding of top divider implicitly added by ProgressBar. 721dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa if (mScreenState == SCREEN_STATE_DISCONNECTED) { 722dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mProgressBar.setVisibility(View.GONE); 723dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mProgressBar.setIndeterminate(false); 724dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mTopDividerNoProgress.setVisibility(View.VISIBLE); 725dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa } else { 726dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mProgressBar.setVisibility(View.VISIBLE); 727dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mProgressBar.setIndeterminate(false); 7286291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa mProgressBar.setProgress(0); 729dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa mTopDividerNoProgress.setVisibility(View.GONE); 730dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa } 731be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa } 732be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa 733be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa /** 734be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * Shows top divider with ProgressBar, whose state is intermediate. 735be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa */ 736be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa private void showScanningProgressBar() { 737be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showTopDividerWithProgressBar(); 738be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mProgressBar.setIndeterminate(true); 739be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa } 740be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa 741be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa /** 742be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa * Shows top divider with ProgressBar, showing "connecting" state. 743be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa */ 744be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa private void showConnectingProgressBar() { 745be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showTopDividerWithProgressBar(); 746be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mProgressBar.setIndeterminate(false); 747be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mProgressBar.setProgress(1); 748be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa } 749be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa 750be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa private void showConnectedProgressBar() { 751be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa showTopDividerWithProgressBar(); 752be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mProgressBar.setIndeterminate(false); 753be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa mProgressBar.setProgress(2); 754be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa } 755be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa 756cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa /** 7572adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa * Called when WifiManager is requested to save a network. 758cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa */ 759cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa /* package */ void onSaveNetwork(WifiConfiguration config) { 7602adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa // We want to both save and connect a network. connectNetwork() does both. 7615cd1bbda7d5f13d36a8d0144ed5310064a760beeIrfan Sheriff mWifiManager.connect(config, new WifiManager.ActionListener() { 7628f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onSuccess() { 7638f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 7648f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff public void onFailure(int reason) { 7658f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff //TODO: Add failure UI 7668f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff } 7678f2f08e0eefaea2cff27beae9c43b3baac81dee6Irfan Sheriff }); 768cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa } 769d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa} 770