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) {
2885ead6b92fdcfd5da4841509be534efa6264a4cccJeff Davidson                showDisconnectedState(Summary.get(this, state, false /* isEphemeral */));
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