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
41590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.internal.util.AsyncChannel;
42e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport com.android.settings.R;
43590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
4458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport java.util.Collection;
45d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.EnumMap;
4609d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawaimport java.util.List;
47d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
48d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
49d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * WifiSetings Activity specific for SetupWizard with X-Large screen size.
50d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
51d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapublic class WifiSettingsForSetupWizardXL extends Activity implements OnClickListener {
5258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String TAG = "SetupWizard";
5335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final boolean DEBUG = true;
5458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
55f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng    // lock orientation into landscape or portrait
56f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng    private static final String EXTRA_PREFS_LANDSCAPE_LOCK = "extra_prefs_landscape_lock";
57f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng    private static final String EXTRA_PREFS_PORTRAIT_LOCK = "extra_prefs_portrait_lock";
58f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng
592adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private static final EnumMap<DetailedState, DetailedState> sNetworkStateMap =
6058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            new EnumMap<DetailedState, DetailedState>(DetailedState.class);
61d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
62d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    static {
632adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.IDLE, DetailedState.DISCONNECTED);
642adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.SCANNING, DetailedState.SCANNING);
652adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.CONNECTING, DetailedState.CONNECTING);
662adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.AUTHENTICATING, DetailedState.CONNECTING);
672adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.OBTAINING_IPADDR, DetailedState.CONNECTING);
682adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.CONNECTED, DetailedState.CONNECTED);
692adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.SUSPENDED, DetailedState.SUSPENDED);  // ?
702adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.DISCONNECTING, DetailedState.DISCONNECTED);
712adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.DISCONNECTED, DetailedState.DISCONNECTED);
722adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.FAILED, DetailedState.FAILED);
73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
752adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private WifiSettings mWifiSettings;
762adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private WifiManager mWifiManager;
772adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
782adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /** Used for resizing a padding above title. Hiden when software keyboard is shown. */
7914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private View mTopPadding;
8014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
81dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa    /** Used for resizing a padding of main content. Hiden when software keyboard is shown. */
82dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa    private View mContentPadding;
8314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
8414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private TextView mTitleView;
8514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    /**
8614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * The name of a network currently connecting, or trying to connect.
8714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * This may be empty ("") at first, and updated when configuration is changed.
8814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     */
8914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private CharSequence mNetworkName = "";
9014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private CharSequence mEditingTitle;
9114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
92d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private ProgressBar mProgressBar;
93beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa    private View mTopDividerNoProgress;
942adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /**
952adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Used for resizing a padding between WifiSettings preference and bottom bar when
962adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * ProgressBar is visible as a top divider.
972adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
98be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private View mBottomPadding;
99be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
10058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mAddNetworkButton;
10158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mRefreshButton;
10258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mSkipOrNextButton;
10358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mBackButton;
10458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
1054781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private Button mConnectButton;
1064781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
10735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /**
10835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * View enclosing {@link WifiSettings}.
10935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     */
11035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private View mWifiSettingsFragmentLayout;
111a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa    private View mConnectingStatusLayout;
112a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa    private TextView mConnectingStatusView;
113a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
1142adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /*
1152adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * States of current screen, which should be saved and restored when Activity is relaunched
1162adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * with orientation change, etc.
1172adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
11835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_DISCONNECTED = 0;
11935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_EDITING = 1;
12035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_CONNECTING = 2;
12135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_CONNECTED = 3;
12235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
1232adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /** Current screen state. */
12435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private int mScreenState = SCREEN_STATE_DISCONNECTED;
12558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
12658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiConfigUiForSetupWizardXL mWifiConfig;
12758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
1285d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    private InputMethodManager mInputMethodManager;
129fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawa
1302adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /**
1312adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Previous network connection state reported by main Wifi module.
1322adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     *
1332adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Note that we don't use original {@link DetailedState} object but simplified one translated
1342adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * using sNetworkStateMap.
1352adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
1362adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private DetailedState mPreviousNetworkState = DetailedState.DISCONNECTED;
1374781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
138d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
139d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onCreate(Bundle savedInstanceState) {
140d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        super.onCreate(savedInstanceState);
141d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        requestWindowFeature(Window.FEATURE_NO_TITLE);
142d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        setContentView(R.layout.wifi_settings_for_setup_wizard_xl);
14358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
14458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
145dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        // There's no button here enabling wifi network, so we need to enable it without
146dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        // users' request.
147dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        mWifiManager.setWifiEnabled(true);
148590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        mWifiManager.asyncConnect(this, new WifiServiceHandler());
149dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa
150d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mWifiSettings =
151d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                (WifiSettings)getFragmentManager().findFragmentById(R.id.wifi_setup_fragment);
1525d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
1532adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
1542adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        initViews();
1552adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
1562adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // At first, Wifi module doesn't return SCANNING state (it's too early), so we manually
1572adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // show it.
158f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa        showScanningState();
159d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
160d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1612adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private void initViews() {
162f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng        Intent intent = getIntent();
163f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng
164f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng        if (intent.getBooleanExtra("firstRun", false)) {
16535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            final View layoutRoot = findViewById(R.id.layout_root);
16635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            layoutRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);
16735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        }
168f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng        if (intent.getBooleanExtra(EXTRA_PREFS_LANDSCAPE_LOCK, false)) {
169f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
170f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng        }
171f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng        if (intent.getBooleanExtra(EXTRA_PREFS_PORTRAIT_LOCK, false)) {
172f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
173f54fec59398a285b1f5344da120792bec5e4707aFreeman Ng        }
17462fb701ea9781f4e1c05af6d730e91bb2cdcdae0Daisuke Miyakawa
17514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTitleView = (TextView)findViewById(R.id.wifi_setup_title);
176d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mProgressBar = (ProgressBar)findViewById(R.id.scanning_progress_bar);
177d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mProgressBar.setMax(2);
178beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress = findViewById(R.id.top_divider_no_progress);
179be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding = findViewById(R.id.bottom_padding);
180d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
181beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mProgressBar.setVisibility(View.VISIBLE);
1823b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa        mProgressBar.setIndeterminate(true);
183beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.GONE);
1843b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa
18558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton = (Button)findViewById(R.id.wifi_setup_add_network);
18658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton.setOnClickListener(this);
18758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton = (Button)findViewById(R.id.wifi_setup_refresh_list);
18858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setOnClickListener(this);
18958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton = (Button)findViewById(R.id.wifi_setup_skip_or_next);
19058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setOnClickListener(this);
19158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton = (Button)findViewById(R.id.wifi_setup_connect);
19258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setOnClickListener(this);
19358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton = (Button)findViewById(R.id.wifi_setup_cancel);
19458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setOnClickListener(this);
1954dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
19614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTopPadding = findViewById(R.id.top_padding);
197dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        mContentPadding = findViewById(R.id.content_padding);
19814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
19935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout = findViewById(R.id.wifi_settings_fragment_layout);
200a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout = findViewById(R.id.connecting_status_layout);
201a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusView = (TextView) findViewById(R.id.connecting_status);
20258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
20358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
204590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private class WifiServiceHandler extends Handler {
205590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        @Override
206590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        public void handleMessage(Message msg) {
207590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            switch (msg.what) {
208590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
209590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
210590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel in msg.obj
211590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    } else {
212590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel set up failure, ignore
213590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        Log.e(TAG, "Failed to establish AsyncChannel connection");
214590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    }
215590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
216590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                default:
217590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    //Ignore
218590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
219590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            }
220590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        }
221590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    }
222590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
223dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa    private void restoreFirstVisibilityState() {
224a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        showDefaultTitle();
225fe7d04fee23b4142c77ec7ab1416f0b94384ba63Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.VISIBLE);
22658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setVisibility(View.VISIBLE);
22758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
22858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
22958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setVisibility(View.GONE);
230dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
231d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
232d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
233d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
234d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(View view) {
235fdb9343ef660fc424bb8c29b48d5c06dff0241c1Daisuke Miyakawa        hideSoftwareKeyboard();
23658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (view == mAddNetworkButton) {
2374dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "AddNetwork button pressed");
23858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            onAddNetworkButtonPressed();
23958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mRefreshButton) {
2404dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Refresh button pressed");
24158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
24258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mSkipOrNextButton) {
2434dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Skip/Next button pressed");
24455de702961642521e247f155963644df81756215Daisuke Miyakawa            if (TextUtils.equals(getString(R.string.wifi_setup_skip), ((Button)view).getText())) {
24555de702961642521e247f155963644df81756215Daisuke Miyakawa                // We don't want to let Wifi enabled when a user press skip without choosing
24655de702961642521e247f155963644df81756215Daisuke Miyakawa                // any access point.
24758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                mWifiManager.setWifiEnabled(false);
24883183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa                // Notify "skip"
24983183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa                setResult(RESULT_FIRST_USER);
25083183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa            } else {
25183183f469875e9835d32311c5c7f60c04eed8da4Daisuke Miyakawa                setResult(RESULT_OK);
25255de702961642521e247f155963644df81756215Daisuke Miyakawa            }
2537e3ff8eca6ce2912839c02065a5463c5cd234aaeDaisuke Miyakawa            finish();
25458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mConnectButton) {
2554dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Connect button pressed");
2568b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa            onConnectButtonPressed();
25758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mBackButton) {
2584dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Back button pressed");
25958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            onBackButtonPressed();
260d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
2615d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    }
2625d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa
2635d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    private void hideSoftwareKeyboard() {
264c9cd29ddb832fd76d96fea080abe8325a8bb1bd2satok        if (DEBUG) Log.i(TAG, "Hiding software keyboard.");
2655d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        final View focusedView = getCurrentFocus();
2665d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        if (focusedView != null) {
2675d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa            mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
2685d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        }
269d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
270d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
27186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa    // Called from WifiSettings
2725d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    /* package */ void updateConnectionState(DetailedState originalState) {
2732adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        final DetailedState state = sNetworkStateMap.get(originalState);
27458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
27558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (originalState == DetailedState.FAILED) {
27658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // We clean up the current connectivity status and let users select another network
27758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // if they want.
27858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
27958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
28058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
281d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        switch (state) {
282b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        case SCANNING: {
2836a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa            if (mScreenState == SCREEN_STATE_DISCONNECTED) {
2846a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa                if (mWifiSettings.getAccessPointsCount() == 0) {
2857e84e4682d5d9b643add13c453d631dad8343918Freeman Ng                    showScanningState();
2866a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa                } else {
2876a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa                    showDisconnectedProgressBar();
288dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa                    mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE);
289dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa                    mBottomPadding.setVisibility(View.GONE);
290dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa                }
2916a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa            } else {
2926a7b3d99493e9ba1492e705dc748b85992c5ee14Daisuke Miyakawa                showDisconnectedProgressBar();
293b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            }
294b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            break;
295b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
296d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        case CONNECTING: {
297c4a495fb5b3d161aa0227a08d6179bf21ffcc730Daisuke Miyakawa            if (mScreenState == SCREEN_STATE_CONNECTING) {
29835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                showConnectingState();
29935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
300d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            break;
301d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
302d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        case CONNECTED: {
30335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            showConnectedState();
304d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            break;
305d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
3064dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        default:  // DISCONNECTED, FAILED
307f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa            if (mScreenState != SCREEN_STATE_CONNECTED &&
308f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa                    mWifiSettings.getAccessPointsCount() > 0) {
30935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                showDisconnectedState(Summary.get(this, state));
31035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
3115d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa            break;
3125d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        }
3132adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        mPreviousNetworkState = state;
3144dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    }
31558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
31635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showDisconnectedState(String stateString) {
317be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showDisconnectedProgressBar();
318f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa        if (mScreenState == SCREEN_STATE_DISCONNECTED &&
319f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa                mWifiSettings.getAccessPointsCount() > 0) {
320dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE);
321dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mBottomPadding.setVisibility(View.GONE);
322dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        }
3234dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        mAddNetworkButton.setEnabled(true);
3244dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        mRefreshButton.setEnabled(true);
325d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
326d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
32735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showConnectingState() {
32835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTING;
32935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
330ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
33114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        // We save this title and show it when authentication failed.
33214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mEditingTitle = mTitleView.getText();
333a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        showConnectingTitle();
334be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showConnectingProgressBar();
335350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa
33635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
33735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
33835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
33935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showConnectedState() {
34035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // Once we show "connected" screen, we won't change it even when the device becomes
34135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // disconnected afterwards. We keep the state unless a user explicitly cancel it
34235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // (by pressing "back" button).
34335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTED;
34435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
34535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        hideSoftwareKeyboard();
34635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
34735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
34835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        showConnectedTitle();
349be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showConnectedProgressBar();
35035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
35135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
35235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.VISIBLE);
35335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
35435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectingStatusView.setText(R.string.wifi_setup_description_connected);
35535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
35635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
35735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
35835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
35935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
36035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
36135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mSkipOrNextButton.setEnabled(true);
36214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
36314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
364a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showDefaultTitle() {
365a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title));
366a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
367a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
3684781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private void showAddNetworkTitle() {
3694781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mNetworkName = "";
3704781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mTitleView.setText(R.string.wifi_setup_title_add_network);
3714781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    }
3724781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
373a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showEditingTitle() {
37414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3754781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3764781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mWifiConfig.getController().getConfig() != null) {
3774781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3784781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3794781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3804781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3814781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
38214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
38314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_editing_network, mNetworkName));
384f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa    }
385f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa
386a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showConnectingTitle() {
387a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3884781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3894781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                    mWifiConfig.getController().getConfig() != null) {
3904781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3914781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3924781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3934781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3944781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
395a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        }
396a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_connecting_network, mNetworkName));
397a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
398a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
399a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showConnectedTitle() {
400a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
4014781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
4024781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                    mWifiConfig.getController().getConfig() != null) {
4034781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
4044781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
4054781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
4064781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
4074781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
408a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        }
409a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_connected_network, mNetworkName));
410a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
411a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
412be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
413be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar without defining the state of the ProgressBar.
414be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     *
415be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showScanningProgressBar()
416be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showConnectedProgressBar()
417be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showConnectingProgressBar()
418be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
419be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showTopDividerWithProgressBar() {
420beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mProgressBar.setVisibility(View.VISIBLE);
421beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.GONE);
422be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding.setVisibility(View.GONE);
423be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
424be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
425dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa    private void showScanningState() {
426dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
427dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
428be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showScanningProgressBar();
4294dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    }
4304dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
43158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void onAddNetworkButtonPressed() {
43258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.onAddNetworkPressed();
433fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa    }
434fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa
43558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
43658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when the screen enters wifi configuration UI. UI widget for configuring network
43758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * (a.k.a. ConfigPreference) should be taken care of by caller side.
43858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * This method should handle buttons' visibility/enabled.
43958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param selectedAccessPoint AccessPoint object being selected. null when a user pressed
44058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * "Add network" button, meaning there's no selected access point.
44158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
44258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void showConfigUi(AccessPoint selectedAccessPoint, boolean edit) {
443dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        mScreenState = SCREEN_STATE_EDITING;
444dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa
445cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (selectedAccessPoint != null &&
446cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                (selectedAccessPoint.security == AccessPoint.SECURITY_WEP ||
447cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                        selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) {
448cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // We forcibly set edit as true so that users can modify every field if they want,
449cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // while config UI doesn't allow them to edit some of them when edit is false
450cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // (e.g. password field is hiden when edit==false).
451cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            edit = true;
452cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
453cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
4542adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // We don't want to keep scanning Wifi networks during users' configuring a network.
45558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.pauseWifiScan();
45658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
45735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
458a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
45958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
46058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.setVisibility(View.VISIBLE);
46158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.removeAllViews();
46258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiConfig = new WifiConfigUiForSetupWizardXL(this, parent, selectedAccessPoint, edit);
4634781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4644781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        if (selectedAccessPoint == null) {  // "Add network" flow
4654781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showAddNetworkTitle();
4664781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mConnectButton.setVisibility(View.VISIBLE);
4674781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
468ffce5dabbb8ad5cc441181241e84cf1a03233e20Daisuke Miyakawa            showDisconnectedProgressBar();
4694781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showEditingButtonState();
4704781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        } else if (selectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
47114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mNetworkName = selectedAccessPoint.getTitle().toString();
47258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
47314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            // onConnectButtonPressed() will change visibility status.
47414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mConnectButton.performClick();
4750333f74b9c54227cee22f04fbb08a562771504e9Daisuke Miyakawa        } else {
4764781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mNetworkName = selectedAccessPoint.getTitle().toString();
477a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa            showEditingTitle();
478ffce5dabbb8ad5cc441181241e84cf1a03233e20Daisuke Miyakawa            showDisconnectedProgressBar();
4794781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showEditingButtonState();
4804781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (selectedAccessPoint.security == AccessPoint.SECURITY_EAP) {
48135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                onEapNetworkSelected();
4824781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
4834781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mConnectButton.setVisibility(View.VISIBLE);
4844781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4854781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // WifiConfigController shows Connect button as "Save" when edit==true and a user
4864781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // tried to connect the network.
4874781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // In SetupWizard, we just show the button as "Connect" instead.
4884781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mConnectButton.setText(R.string.wifi_connect);
4894781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mBackButton.setText(R.string.wifi_setup_cancel);
4904781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
49114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
49258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
49358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
49435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /**
4952adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Called before security fields are correctly set by {@link WifiConfigController}.
49635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     *
49735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @param view security field view
49835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @param accessPointSecurity type of security. e.g. AccessPoint.SECURITY_NONE
49935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @return true when it is ok for the caller to init security fields. false when
50035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * all security fields are managed by this method, and thus the caller shouldn't touch them.
50135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     */
50235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /* package */ boolean initSecurityFields(View view, int accessPointSecurity) {
50335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // Reset all states tweaked below.
50435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.eap_not_supported).setVisibility(View.GONE);
50535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.eap_not_supported_for_add_network).setVisibility(View.GONE);
50635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.ssid_text).setVisibility(View.VISIBLE);
50735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.ssid_layout).setVisibility(View.VISIBLE);
50835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
50935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (accessPointSecurity == AccessPoint.SECURITY_EAP) {
510d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa            setPaddingVisibility(View.VISIBLE);
51135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            hideSoftwareKeyboard();
51235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
51335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // In SetupWizard for XLarge screen, we don't have enough space for showing
51435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // configurations needed for EAP. We instead disable the whole feature there and let
51535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // users configure those networks after the setup.
516d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa            if (view.findViewById(R.id.type_ssid).getVisibility() == View.VISIBLE) {
51735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                view.findViewById(R.id.eap_not_supported_for_add_network)
5182adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa                        .setVisibility(View.VISIBLE);
51935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            } else {
52035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                view.findViewById(R.id.eap_not_supported).setVisibility(View.VISIBLE);
52135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
52235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.security_fields).setVisibility(View.GONE);
52335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.ssid_text).setVisibility(View.GONE);
52435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.ssid_layout).setVisibility(View.GONE);
52535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            onEapNetworkSelected();
5262adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
5272adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa            // This method did init security fields by itself. The caller must not do it.
52835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            return false;
52935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        }
5302adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
531d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        mConnectButton.setVisibility(View.VISIBLE);
532d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        setPaddingVisibility(View.GONE);
533d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa
534d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        // In "add network" flow, we'll see multiple initSecurityFields() calls with different
535d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        // accessPointSecurity variable. We want to show software keyboard conditionally everytime
536d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        // when this method is called.
537d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        if (mWifiConfig != null) {
538d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa            if (accessPointSecurity == AccessPoint.SECURITY_PSK ||
539d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa                    accessPointSecurity == AccessPoint.SECURITY_WEP) {
540d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa                mWifiConfig.requestFocusAndShowKeyboard(R.id.password);
541d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa            } else {
542d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa                mWifiConfig.requestFocusAndShowKeyboard(R.id.ssid);
543d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa            }
544d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa        }
545d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa
5462adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // Let the caller init security fields.
54735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        return true;
54835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
54935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
550d1c22a1b56778f76a7bc8da624f83934ff4771a9Daisuke Miyakawa    private void onEapNetworkSelected() {
55135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
55235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
55335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
55435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
5554781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private void showEditingButtonState() {
5564781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.GONE);
5574781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
5584781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
5594781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
5604781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    }
5614781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
56258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // May be called when user press "connect" button in WifiDialog
56358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void onConnectButtonPressed() {
56435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTING;
56558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
56658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.submit(mWifiConfig.getController());
56758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
5682adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // updateConnectionState() isn't called soon by the main Wifi module after the user's
5692adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // "connect" request, and the user still sees "not connected" message for a while, which
5702adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // looks strange for users though legitimate from the view of the module.
5712adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        //
57258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We instead manually show "connecting" message before the system gets actual
5732adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // "connecting" message from Wifi module.
57435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        showConnectingState();
57558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
57658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // Might be better to delay showing this button.
57758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
578ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
57958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
580a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
581a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        parent.setVisibility(View.GONE);
582a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.VISIBLE);
583a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusView.setText(R.string.wifi_setup_description_connecting);
584a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
58558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
58658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setEnabled(false);
58758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
58858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
58958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
590d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
591d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
59258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void onBackButtonPressed() {
5938f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
59435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (mScreenState == SCREEN_STATE_CONNECTING || mScreenState == SCREEN_STATE_CONNECTED) {
5954dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Back button pressed after connect action.");
59635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            mScreenState = SCREEN_STATE_DISCONNECTED;
59758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
59858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // When a user press "Back" button after pressing "Connect" button, we want to cancel
5992adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa            // the "Connect" request and refresh the whole Wifi status.
600dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            restoreFirstVisibilityState();
60158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setEnabled(true);
6034dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            changeNextButtonState(false);  // Skip
60458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // Wifi list becomes empty for a moment. We show "scanning" effect to a user so that
60635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // he/she won't be astonished there. This stops once the scan finishes.
607dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            showScanningState();
60835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
60909d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            // Remembered networks may be re-used during SetupWizard, which confuse users.
61009d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            // We force the module to forget them to reduce UX complexity
61109d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
61209d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            for (WifiConfiguration config : configs) {
61309d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                if (DEBUG) {
61409d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                    Log.d(TAG, String.format("forgeting Wi-Fi network \"%s\" (id: %d)",
61509d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                            config.SSID, config.networkId));
61609d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                }
61709d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                mWifiManager.forgetNetwork(config.networkId);
61809d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            }
61909d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa
620dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mWifiSettingsFragmentLayout.setVisibility(View.GONE);
62158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
62258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else { // During user's Wifi configuration.
623dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mScreenState = SCREEN_STATE_DISCONNECTED;
62458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mWifiSettings.resumeWifiScan();
62558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
626dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            restoreFirstVisibilityState();
62758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
62858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mAddNetworkButton.setEnabled(true);
62958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mRefreshButton.setEnabled(true);
63058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setEnabled(true);
631dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            showDisconnectedProgressBar();
632f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa            mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE);
633f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa            mBottomPadding.setVisibility(View.GONE);
63458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
63558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
636dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
637a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
63858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
63958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.removeAllViews();
64058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.setVisibility(View.GONE);
64158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiConfig = null;
64258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
64358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
64458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
64558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a specific network.
64658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
64758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void changeNextButtonState(boolean connected) {
64858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (connected) {
64958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setText(R.string.wifi_setup_next);
65058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
65158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setText(R.string.wifi_setup_skip);
65258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
65358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
65458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
65558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
65658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when the list of AccessPoints are modified and this Activity needs to refresh
65758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * the list.
658e78c1879058571c00879f0d3e756951302adf513Gilles Debunne     * @param preferenceScreen
65958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
66058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void onAccessPointsUpdated(
661e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            PreferenceScreen preferenceScreen, Collection<AccessPoint> accessPoints) {
662350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        // If we already show some of access points but the bar still shows "scanning" state, it
663350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        // should be stopped.
664350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        if (mProgressBar.isIndeterminate() && accessPoints.size() > 0) {
665dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            showDisconnectedProgressBar();
666dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            if (mScreenState == SCREEN_STATE_DISCONNECTED) {
667dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa                mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE);
668dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa                mBottomPadding.setVisibility(View.GONE);
669dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            }
670350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa            mAddNetworkButton.setEnabled(true);
671350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa            mRefreshButton.setEnabled(true);
672350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        }
673350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa
67458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        for (AccessPoint accessPoint : accessPoints) {
67558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            accessPoint.setLayoutResource(R.layout.custom_preference);
676e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            preferenceScreen.addPreference(accessPoint);
67758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
67858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
67958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
68058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void refreshAccessPoints(boolean disconnectNetwork) {
681f26b2b5110117a74605ec30305fdfaa9c8077608Daisuke Miyakawa        showScanningState();
6828b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa
68358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (disconnectNetwork) {
68458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mWifiManager.disconnect();
68558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
68658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
68758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.refreshAccessPoints();
6888b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa    }
689cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
690cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
69114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * Called when {@link WifiSettings} received
69214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * {@link WifiManager#SUPPLICANT_STATE_CHANGED_ACTION}.
693cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
694cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /* package */ void onSupplicantStateChanged(Intent intent) {
695cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final int errorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
696cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (errorCode == WifiManager.ERROR_AUTHENTICATING) {
697cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            Log.i(TAG, "Received authentication error event.");
698cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            onAuthenticationFailure();
699cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
700cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
701cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
702cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
703cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     * Called once when Authentication failed.
704cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
705cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private void onAuthenticationFailure() {
70635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_EDITING;
70735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
708cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.GONE);
709cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mConnectButton.setVisibility(View.VISIBLE);
710cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mConnectButton.setEnabled(true);
711cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
71214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        if (!TextUtils.isEmpty(mEditingTitle)) {
71314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mTitleView.setText(mEditingTitle);
71414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        } else {
71514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            Log.w(TAG, "Title during editing/adding a network was empty.");
716a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa            showEditingTitle();
71714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
71814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
719a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
720a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        parent.setVisibility(View.VISIBLE);
721a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
7226291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa
7236291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa        showDisconnectedProgressBar();
7246291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa        setPaddingVisibility(View.GONE);
725cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
726cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
7272adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    // Used by WifiConfigUiForSetupWizardXL
7282adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /* package */ void setPaddingVisibility(int visibility) {
729dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        mTopPadding.setVisibility(visibility);
730dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        mContentPadding.setVisibility(visibility);
73114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
73214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
733be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showDisconnectedProgressBar() {
734dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        // The device may report DISCONNECTED during connecting to a network, at which we don't
735dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        // want to lose bottom padding of top divider implicitly added by ProgressBar.
736dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        if (mScreenState == SCREEN_STATE_DISCONNECTED) {
737dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mProgressBar.setVisibility(View.GONE);
738dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mProgressBar.setIndeterminate(false);
739dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mTopDividerNoProgress.setVisibility(View.VISIBLE);
740dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        } else {
741dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mProgressBar.setVisibility(View.VISIBLE);
742dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mProgressBar.setIndeterminate(false);
7436291d50b5de2933f8debf760b25be74b17981883Daisuke Miyakawa            mProgressBar.setProgress(0);
744dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa            mTopDividerNoProgress.setVisibility(View.GONE);
745dfd492df3f95042ac40004ef46c853064d3f27bbDaisuke Miyakawa        }
746be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
747be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
748be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
749be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar, whose state is intermediate.
750be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
751be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showScanningProgressBar() {
752be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
753be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(true);
754be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
755be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
756be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
757be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar, showing "connecting" state.
758be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
759be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showConnectingProgressBar() {
760be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
761be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
762be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setProgress(1);
763be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
764be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
765be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showConnectedProgressBar() {
766be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
767be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
768be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setProgress(2);
769be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
770be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
771cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
7722adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Called when WifiManager is requested to save a network.
773cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
774cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /* package */ void onSaveNetwork(WifiConfiguration config) {
7752adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // We want to both save and connect a network. connectNetwork() does both.
776cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mWifiManager.connectNetwork(config);
777cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
778d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa}
779