WifiSettingsForSetupWizardXL.java revision c4a495fb5b3d161aa0227a08d6179bf21ffcc730
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
195cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawaimport com.android.settings.R;
205cd60eb8aa5a4d5cf1a850ddd05d4f94eae1eb2fDaisuke Miyakawa
21d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.app.Activity;
22fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawaimport android.content.Context;
23cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawaimport android.content.Intent;
24d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.NetworkInfo.DetailedState;
25cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawaimport android.net.wifi.WifiConfiguration;
2658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport android.net.wifi.WifiManager;
27d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.os.Bundle;
284dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawaimport android.os.Handler;
29590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.os.Message;
3058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport android.preference.PreferenceCategory;
3155de702961642521e247f155963644df81756215Daisuke Miyakawaimport android.text.TextUtils;
328b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawaimport android.util.Log;
3314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawaimport android.view.ContextMenu;
34267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawaimport android.view.ContextMenu.ContextMenuInfo;
3514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawaimport android.view.View;
36d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.view.View.OnClickListener;
3758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport android.view.ViewGroup;
38d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.view.Window;
395d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
40d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.Button;
41d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.ProgressBar;
42d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.TextView;
43d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
44590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.internal.util.AsyncChannel;
45590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
4658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport java.util.Collection;
47d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.EnumMap;
4809d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawaimport java.util.List;
49d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
50d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
51d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * WifiSetings Activity specific for SetupWizard with X-Large screen size.
52d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
53d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapublic class WifiSettingsForSetupWizardXL extends Activity implements OnClickListener {
5458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String TAG = "SetupWizard";
5535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final boolean DEBUG = true;
5658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
572adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private static final EnumMap<DetailedState, DetailedState> sNetworkStateMap =
5858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            new EnumMap<DetailedState, DetailedState>(DetailedState.class);
59d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
60d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    static {
612adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.IDLE, DetailedState.DISCONNECTED);
622adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.SCANNING, DetailedState.SCANNING);
632adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.CONNECTING, DetailedState.CONNECTING);
642adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.AUTHENTICATING, DetailedState.CONNECTING);
652adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.OBTAINING_IPADDR, DetailedState.CONNECTING);
662adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.CONNECTED, DetailedState.CONNECTED);
672adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.SUSPENDED, DetailedState.SUSPENDED);  // ?
682adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.DISCONNECTING, DetailedState.DISCONNECTED);
692adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.DISCONNECTED, DetailedState.DISCONNECTED);
702adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        sNetworkStateMap.put(DetailedState.FAILED, DetailedState.FAILED);
71d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
7314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    /**
742adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Used with {@link Button#setTag(Object)} to remember "Connect" button is pressed in
752adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * with "add network" flow.
7614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     */
772adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private static final int CONNECT_BUTTON_TAG_ADD_NETWORK = 1;
782adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
792adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private WifiSettings mWifiSettings;
802adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private WifiManager mWifiManager;
812adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
822adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /** Used for resizing a padding above title. Hiden when software keyboard is shown. */
8314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private View mTopPadding;
8414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
852adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /** Used for resizing a padding inside Config UI. Hiden when software keyboard is shown. */
8614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private View mWifiConfigPadding;
8714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
8814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private TextView mTitleView;
8914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    /**
9014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * The name of a network currently connecting, or trying to connect.
9114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * This may be empty ("") at first, and updated when configuration is changed.
9214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     */
9314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private CharSequence mNetworkName = "";
9414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private CharSequence mEditingTitle;
9514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
96d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private ProgressBar mProgressBar;
97beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa    private View mTopDividerNoProgress;
982adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /**
992adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Used for resizing a padding between WifiSettings preference and bottom bar when
1002adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * ProgressBar is visible as a top divider.
1012adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
102be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private View mBottomPadding;
103be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
10458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mAddNetworkButton;
10558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mRefreshButton;
10658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mSkipOrNextButton;
10758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private Button mBackButton;
10858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
1094781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private Button mConnectButton;
1104781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
11135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /**
11235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * View enclosing {@link WifiSettings}.
11335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     */
11435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private View mWifiSettingsFragmentLayout;
115a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa    private View mConnectingStatusLayout;
116a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa    private TextView mConnectingStatusView;
117a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
1182adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /*
1192adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * States of current screen, which should be saved and restored when Activity is relaunched
1202adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * with orientation change, etc.
1212adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
12235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_DISCONNECTED = 0;
12335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_EDITING = 1;
12435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_CONNECTING = 2;
12535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_CONNECTED = 3;
12635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
1272adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /** Current screen state. */
12835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private int mScreenState = SCREEN_STATE_DISCONNECTED;
12958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
13058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiConfigUiForSetupWizardXL mWifiConfig;
13158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
1325d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    private InputMethodManager mInputMethodManager;
133fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawa
1342adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /**
1352adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Used to store View visibility status.
1362adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     *
1372adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * We store the status when we show "connecting" screen and use the stored data when the
1382adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * device failed to connect to the network.
1392adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
140cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private int mPreviousWpsFieldsVisibility = View.GONE;
141cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private int mPreviousSecurityFieldsVisibility = View.GONE;
142cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private int mPreviousTypeVisibility = View.GONE;
143cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
1442adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /**
1452adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Previous network connection state reported by main Wifi module.
1462adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     *
1472adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Note that we don't use original {@link DetailedState} object but simplified one translated
1482adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * using sNetworkStateMap.
1492adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     */
1502adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private DetailedState mPreviousNetworkState = DetailedState.DISCONNECTED;
1514781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
1528f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    private int mBackgroundId = R.drawable.setups_bg_default;
1538f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
154d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
155d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onCreate(Bundle savedInstanceState) {
156d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        super.onCreate(savedInstanceState);
157d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        requestWindowFeature(Window.FEATURE_NO_TITLE);
158d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        setContentView(R.layout.wifi_settings_for_setup_wizard_xl);
15958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
16058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
161dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        // There's no button here enabling wifi network, so we need to enable it without
162dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        // users' request.
163dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        mWifiManager.setWifiEnabled(true);
164590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        mWifiManager.asyncConnect(this, new WifiServiceHandler());
165dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa
166d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mWifiSettings =
167d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                (WifiSettings)getFragmentManager().findFragmentById(R.id.wifi_setup_fragment);
1685d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
1692adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
1702adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        initViews();
1712adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
1722adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // At first, Wifi module doesn't return SCANNING state (it's too early), so we manually
1732adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // show it.
1742adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        showScanningStatus();
175d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
176d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
1772adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    private void initViews() {
17835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (getIntent().getBooleanExtra("firstRun", false)) {
17935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            final View layoutRoot = findViewById(R.id.layout_root);
18035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            layoutRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);
18135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        }
18262fb701ea9781f4e1c05af6d730e91bb2cdcdae0Daisuke Miyakawa
18314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTitleView = (TextView)findViewById(R.id.wifi_setup_title);
184d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mProgressBar = (ProgressBar)findViewById(R.id.scanning_progress_bar);
185d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mProgressBar.setMax(2);
186beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress = findViewById(R.id.top_divider_no_progress);
187be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding = findViewById(R.id.bottom_padding);
188d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
189beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mProgressBar.setVisibility(View.VISIBLE);
1903b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa        mProgressBar.setIndeterminate(true);
191beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.GONE);
1923b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa
19358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton = (Button)findViewById(R.id.wifi_setup_add_network);
19458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton.setOnClickListener(this);
19558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton = (Button)findViewById(R.id.wifi_setup_refresh_list);
19658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setOnClickListener(this);
19758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton = (Button)findViewById(R.id.wifi_setup_skip_or_next);
19858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setOnClickListener(this);
19958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton = (Button)findViewById(R.id.wifi_setup_connect);
20058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setOnClickListener(this);
20158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton = (Button)findViewById(R.id.wifi_setup_cancel);
20258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setOnClickListener(this);
2034dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
20414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTopPadding = findViewById(R.id.top_padding);
20514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mWifiConfigPadding = findViewById(R.id.wifi_config_padding);
20614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
20735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout = findViewById(R.id.wifi_settings_fragment_layout);
208a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout = findViewById(R.id.connecting_status_layout);
209a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusView = (TextView) findViewById(R.id.connecting_status);
21058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
21158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
212590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private class WifiServiceHandler extends Handler {
213590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        @Override
214590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        public void handleMessage(Message msg) {
215590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            switch (msg.what) {
216590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
217590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
218590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel in msg.obj
219590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    } else {
220590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel set up failure, ignore
221590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        Log.e(TAG, "Failed to establish AsyncChannel connection");
222590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    }
223590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
224590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                default:
225590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    //Ignore
226590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
227590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            }
228590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        }
229590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    }
230590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
23158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void restoreFirstButtonVisibilityState() {
232a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        showDefaultTitle();
233fe7d04fee23b4142c77ec7ab1416f0b94384ba63Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.VISIBLE);
23458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setVisibility(View.VISIBLE);
23558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
23658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
23758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setVisibility(View.GONE);
23814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE, View.GONE);
239d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
240d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
241d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
242d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(View view) {
243fdb9343ef660fc424bb8c29b48d5c06dff0241c1Daisuke Miyakawa        hideSoftwareKeyboard();
24458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (view == mAddNetworkButton) {
2454dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "AddNetwork button pressed");
24658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            onAddNetworkButtonPressed();
24758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mRefreshButton) {
2484dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Refresh button pressed");
24958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
25058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mSkipOrNextButton) {
2514dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Skip/Next button pressed");
25255de702961642521e247f155963644df81756215Daisuke Miyakawa            if (TextUtils.equals(getString(R.string.wifi_setup_skip), ((Button)view).getText())) {
25355de702961642521e247f155963644df81756215Daisuke Miyakawa                // We don't want to let Wifi enabled when a user press skip without choosing
25455de702961642521e247f155963644df81756215Daisuke Miyakawa                // any access point.
25558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                mWifiManager.setWifiEnabled(false);
25655de702961642521e247f155963644df81756215Daisuke Miyakawa            }
2577e3ff8eca6ce2912839c02065a5463c5cd234aaeDaisuke Miyakawa            setResult(RESULT_OK);
2587e3ff8eca6ce2912839c02065a5463c5cd234aaeDaisuke Miyakawa            finish();
25958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mConnectButton) {
2604dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Connect button pressed");
2618b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa            onConnectButtonPressed();
26258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mBackButton) {
2634dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Back button pressed");
26458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            onBackButtonPressed();
265d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
2665d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    }
2675d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa
2685d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    private void hideSoftwareKeyboard() {
269c9cd29ddb832fd76d96fea080abe8325a8bb1bd2satok        if (DEBUG) Log.i(TAG, "Hiding software keyboard.");
2705d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        final View focusedView = getCurrentFocus();
2715d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        if (focusedView != null) {
2725d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa            mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
2735d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        }
274d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
275d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
27686eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa    // Called from WifiSettings
2775d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    /* package */ void updateConnectionState(DetailedState originalState) {
2782adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        final DetailedState state = sNetworkStateMap.get(originalState);
27958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
28058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (originalState == DetailedState.FAILED) {
28158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // We clean up the current connectivity status and let users select another network
28258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // if they want.
28358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
28458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
28558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
286d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        switch (state) {
287b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        case SCANNING: {
288b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            // Let users know the device is working correctly though currently there's
289b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            // no visible network on the list.
290b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            if (mWifiSettings.getAccessPointsCount() == 0) {
291be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa                showScanningProgressBar();
292b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            } else {
293be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa                // Users already see available networks.
294be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa                showDisconnectedProgressBar();
295b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            }
296b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            break;
297b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
298d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        case CONNECTING: {
299c4a495fb5b3d161aa0227a08d6179bf21ffcc730Daisuke Miyakawa            if (mScreenState == SCREEN_STATE_CONNECTING) {
30035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                showConnectingState();
30135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
302d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            break;
303d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
304d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        case CONNECTED: {
30535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            showConnectedState();
306d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            break;
307d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
3084dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        default:  // DISCONNECTED, FAILED
30935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            if (mScreenState != SCREEN_STATE_CONNECTED) {
31035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                showDisconnectedState(Summary.get(this, state));
31135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
3125d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa            break;
3135d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        }
3142adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        mPreviousNetworkState = state;
3154dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    }
31658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
31735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showDisconnectedState(String stateString) {
318be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showDisconnectedProgressBar();
3194dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        mAddNetworkButton.setEnabled(true);
3204dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        mRefreshButton.setEnabled(true);
321d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
322d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
32335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showConnectingState() {
32435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTING;
32535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
326ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
32714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        // We save this title and show it when authentication failed.
32814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mEditingTitle = mTitleView.getText();
329a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        showConnectingTitle();
330be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showConnectingProgressBar();
331350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa
33235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
33335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
33435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
33535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showConnectedState() {
33635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // Once we show "connected" screen, we won't change it even when the device becomes
33735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // disconnected afterwards. We keep the state unless a user explicitly cancel it
33835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // (by pressing "back" button).
33935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTED;
34035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
34135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        hideSoftwareKeyboard();
34235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
34335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
34435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        trySetBackground(R.drawable.setups_bg_complete);
34535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        showConnectedTitle();
346be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showConnectedProgressBar();
34735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
34835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
34935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.VISIBLE);
35035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
35135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectingStatusView.setText(R.string.wifi_setup_description_connected);
35235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
35335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
35435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
35535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
35635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
35735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
35835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mSkipOrNextButton.setEnabled(true);
35914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
36014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
361a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showDefaultTitle() {
362a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title));
363a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
364a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
3654781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private void showAddNetworkTitle() {
3664781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mNetworkName = "";
3674781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mTitleView.setText(R.string.wifi_setup_title_add_network);
3684781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    }
3694781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
370a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showEditingTitle() {
37114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3724781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3734781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mWifiConfig.getController().getConfig() != null) {
3744781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3754781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3764781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3774781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3784781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
37914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
38014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_editing_network, mNetworkName));
381f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa    }
382f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa
383a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showConnectingTitle() {
384a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3854781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3864781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                    mWifiConfig.getController().getConfig() != null) {
3874781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3884781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3894781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3904781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3914781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
392a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        }
393a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_connecting_network, mNetworkName));
394a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
395a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
396a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showConnectedTitle() {
397a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3984781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3994781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                    mWifiConfig.getController().getConfig() != null) {
4004781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
4014781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
4024781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
4034781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
4044781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
405a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        }
406a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_connected_network, mNetworkName));
407a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
408a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
409be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
410be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar without defining the state of the ProgressBar.
411be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     *
412be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showScanningProgressBar()
413be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showConnectedProgressBar()
414be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showConnectingProgressBar()
415be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
416be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showTopDividerWithProgressBar() {
417beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mProgressBar.setVisibility(View.VISIBLE);
418beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.GONE);
419be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding.setVisibility(View.GONE);
420be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
421be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
422be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showScanningStatus() {
423be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showScanningProgressBar();
4244dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    }
4254dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
42658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void onAddNetworkButtonPressed() {
42758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.onAddNetworkPressed();
428fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa    }
429fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa
43058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
43158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when the screen enters wifi configuration UI. UI widget for configuring network
43258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * (a.k.a. ConfigPreference) should be taken care of by caller side.
43358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * This method should handle buttons' visibility/enabled.
43458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param selectedAccessPoint AccessPoint object being selected. null when a user pressed
43558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * "Add network" button, meaning there's no selected access point.
43658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
43758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void showConfigUi(AccessPoint selectedAccessPoint, boolean edit) {
438cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (selectedAccessPoint != null &&
439cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                (selectedAccessPoint.security == AccessPoint.SECURITY_WEP ||
440cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                        selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) {
441cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // We forcibly set edit as true so that users can modify every field if they want,
442cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // while config UI doesn't allow them to edit some of them when edit is false
443cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // (e.g. password field is hiden when edit==false).
444cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            edit = true;
445cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
446cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
4478f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_default);
4488f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
4492adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // We don't want to keep scanning Wifi networks during users' configuring a network.
45058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.pauseWifiScan();
45158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
45235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
453a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
45458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
45558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.setVisibility(View.VISIBLE);
45658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.removeAllViews();
45758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiConfig = new WifiConfigUiForSetupWizardXL(this, parent, selectedAccessPoint, edit);
4584781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4592adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // Tag will be updated in this method when needed.
4604781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mConnectButton.setTag(null);
4614781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        if (selectedAccessPoint == null) {  // "Add network" flow
4624781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showAddNetworkTitle();
4634781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mConnectButton.setVisibility(View.VISIBLE);
4644781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mConnectButton.setTag(CONNECT_BUTTON_TAG_ADD_NETWORK);
4654781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4664781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showEditingButtonState();
4674781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        } else if (selectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
46814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mNetworkName = selectedAccessPoint.getTitle().toString();
46958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
47014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            // onConnectButtonPressed() will change visibility status.
47114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mConnectButton.performClick();
4720333f74b9c54227cee22f04fbb08a562771504e9Daisuke Miyakawa        } else {
4734781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mNetworkName = selectedAccessPoint.getTitle().toString();
474a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa            showEditingTitle();
4754781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showEditingButtonState();
4764781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (selectedAccessPoint.security == AccessPoint.SECURITY_EAP) {
47735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                onEapNetworkSelected();
4784781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
4794781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mConnectButton.setVisibility(View.VISIBLE);
4804781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4814781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // WifiConfigController shows Connect button as "Save" when edit==true and a user
4824781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // tried to connect the network.
4834781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // In SetupWizard, we just show the button as "Connect" instead.
4844781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mConnectButton.setText(R.string.wifi_connect);
4854781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mBackButton.setText(R.string.wifi_setup_cancel);
4864781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
48714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
48858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
48958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
49035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /**
4912adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Called before security fields are correctly set by {@link WifiConfigController}.
49235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     *
49335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @param view security field view
49435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @param accessPointSecurity type of security. e.g. AccessPoint.SECURITY_NONE
49535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @return true when it is ok for the caller to init security fields. false when
49635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * all security fields are managed by this method, and thus the caller shouldn't touch them.
49735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     */
49835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /* package */ boolean initSecurityFields(View view, int accessPointSecurity) {
49935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // Reset all states tweaked below.
50035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.eap_not_supported).setVisibility(View.GONE);
50135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.eap_not_supported_for_add_network).setVisibility(View.GONE);
50235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.ssid_text).setVisibility(View.VISIBLE);
50335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.ssid_layout).setVisibility(View.VISIBLE);
50435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
50535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (accessPointSecurity == AccessPoint.SECURITY_EAP) {
50635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            hideSoftwareKeyboard();
50735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
50835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // In SetupWizard for XLarge screen, we don't have enough space for showing
50935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // configurations needed for EAP. We instead disable the whole feature there and let
51035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // users configure those networks after the setup.
51135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            if (view.findViewById(R.id.type).getVisibility() == View.VISIBLE) {
51235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                view.findViewById(R.id.eap_not_supported_for_add_network)
5132adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa                        .setVisibility(View.VISIBLE);
51435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            } else {
51535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                view.findViewById(R.id.eap_not_supported).setVisibility(View.VISIBLE);
51635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
51735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.security_fields).setVisibility(View.GONE);
51835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.ssid_text).setVisibility(View.GONE);
51935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.ssid_layout).setVisibility(View.GONE);
52035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            onEapNetworkSelected();
5212adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
5222adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa            // This method did init security fields by itself. The caller must not do it.
52335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            return false;
52435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        }
5252adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa
5262adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // Let the caller init security fields.
52735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        return true;
52835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
52935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
53035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /* package */ void onEapNetworkSelected() {
53135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
53235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
53335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
53435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
5354781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private void showEditingButtonState() {
5364781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.GONE);
5374781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
5384781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
5394781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
5404781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    }
5414781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
54258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // May be called when user press "connect" button in WifiDialog
54358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void onConnectButtonPressed() {
54435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTING;
54558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
5468f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_wifi);
5478f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
54858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.submit(mWifiConfig.getController());
54958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
5502adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // updateConnectionState() isn't called soon by the main Wifi module after the user's
5512adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // "connect" request, and the user still sees "not connected" message for a while, which
5522adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // looks strange for users though legitimate from the view of the module.
5532adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        //
55458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We instead manually show "connecting" message before the system gets actual
5552adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // "connecting" message from Wifi module.
55635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        showConnectingState();
55758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
55858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // Might be better to delay showing this button.
55958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
560ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
56158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
562cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        // We need to restore visibility status when the device failed to connect the network.
563cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View wpsFieldView = findViewById(R.id.wps_fields);
564cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (wpsFieldView != null) {
565cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mPreviousWpsFieldsVisibility = wpsFieldView.getVisibility();
566cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            wpsFieldView.setVisibility(View.GONE);
567cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
568cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View securityFieldsView = findViewById(R.id.security_fields);
569cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (securityFieldsView != null) {
570cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mPreviousSecurityFieldsVisibility = securityFieldsView.getVisibility();
571cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            securityFieldsView.setVisibility(View.GONE);
572cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
573cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View typeView = findViewById(R.id.type);
574cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (typeView != null) {
575cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mPreviousTypeVisibility = typeView.getVisibility();
576cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            typeView.setVisibility(View.GONE);
577cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
57858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
579a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        // TODO: investigate whether visibility handling above is needed. Now that we hide
580a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        // them completely when connecting, so we may not need to do so, though we probably
581a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        // need to show software keyboard conditionaly.
582a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
583a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        parent.setVisibility(View.GONE);
584a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.VISIBLE);
585a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusView.setText(R.string.wifi_setup_description_connecting);
586a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
58758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
58858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setEnabled(false);
58958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
59058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
59158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
592d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
593d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
59458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void onBackButtonPressed() {
5958f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_default);
5968f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
59735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (mScreenState == SCREEN_STATE_CONNECTING || mScreenState == SCREEN_STATE_CONNECTED) {
5984dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Back button pressed after connect action.");
59935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            mScreenState = SCREEN_STATE_DISCONNECTED;
60058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // When a user press "Back" button after pressing "Connect" button, we want to cancel
6022adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa            // the "Connect" request and refresh the whole Wifi status.
60358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            restoreFirstButtonVisibilityState();
60458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setEnabled(true);
6064dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            changeNextButtonState(false);  // Skip
60758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // Wifi list becomes empty for a moment. We show "scanning" effect to a user so that
60935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // he/she won't be astonished there. This stops once the scan finishes.
610be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa            showScanningProgressBar();
61135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
61209d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            // Remembered networks may be re-used during SetupWizard, which confuse users.
61309d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            // We force the module to forget them to reduce UX complexity
61409d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
61509d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            for (WifiConfiguration config : configs) {
61609d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                if (DEBUG) {
61709d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                    Log.d(TAG, String.format("forgeting Wi-Fi network \"%s\" (id: %d)",
61809d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                            config.SSID, config.networkId));
61909d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                }
62009d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                mWifiManager.forgetNetwork(config.networkId);
62109d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            }
62209d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa
62358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
62458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else { // During user's Wifi configuration.
62558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mWifiSettings.resumeWifiScan();
62658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
62758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            restoreFirstButtonVisibilityState();
62858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
62958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mAddNetworkButton.setEnabled(true);
63058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mRefreshButton.setEnabled(true);
63158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setEnabled(true);
63258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
63358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
63435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE);
635a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
63658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
63758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.removeAllViews();
63858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.setVisibility(View.GONE);
63958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiConfig = null;
64058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
64158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
64258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
64358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a specific network.
64458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
64558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void changeNextButtonState(boolean connected) {
64658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (connected) {
64758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setText(R.string.wifi_setup_next);
64858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
64958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setText(R.string.wifi_setup_skip);
65058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
65158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
65258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
65358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
65458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when the list of AccessPoints are modified and this Activity needs to refresh
65558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * the list.
65658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
65758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void onAccessPointsUpdated(
65858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            PreferenceCategory holder, Collection<AccessPoint> accessPoints) {
659350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        // If we already show some of access points but the bar still shows "scanning" state, it
660350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        // should be stopped.
661350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        if (mProgressBar.isIndeterminate() && accessPoints.size() > 0) {
662be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa            showTopDividerWithProgressBar();
663350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa            mAddNetworkButton.setEnabled(true);
664350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa            mRefreshButton.setEnabled(true);
665350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        }
666350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa
66758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        for (AccessPoint accessPoint : accessPoints) {
66858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            accessPoint.setLayoutResource(R.layout.custom_preference);
66958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            holder.addPreference(accessPoint);
67058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
67158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
67258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
67358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void refreshAccessPoints(boolean disconnectNetwork) {
6744781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        final Object tag = mConnectButton.getTag();
6754781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        if (tag != null && (tag instanceof Integer) &&
6764781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                ((Integer)tag == CONNECT_BUTTON_TAG_ADD_NETWORK)) {
6774781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            // In "Add network" flow, we won't get DetaledState available for changing ProgressBar
6784781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            // state. Instead we manually show previous status here.
6792adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa            showDisconnectedState(Summary.get(this, mPreviousNetworkState));
6804781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        } else {
6814781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showScanningStatus();
6824781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        }
6838b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa
68458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (disconnectNetwork) {
68558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mWifiManager.disconnect();
68658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
68758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
68858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.refreshAccessPoints();
6898b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa    }
690cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
691cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
69214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * Called when {@link WifiSettings} received
69314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * {@link WifiManager#SUPPLICANT_STATE_CHANGED_ACTION}.
694cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
695cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /* package */ void onSupplicantStateChanged(Intent intent) {
696cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final int errorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
697cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (errorCode == WifiManager.ERROR_AUTHENTICATING) {
698cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            Log.i(TAG, "Received authentication error event.");
699cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            onAuthenticationFailure();
700cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
701cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
702cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
703cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
704cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     * Called once when Authentication failed.
705cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
706cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private void onAuthenticationFailure() {
70735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_EDITING;
70835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
709cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.GONE);
710cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mConnectButton.setVisibility(View.VISIBLE);
711cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mConnectButton.setEnabled(true);
712cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
7138f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_default);
7148f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
71514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        if (!TextUtils.isEmpty(mEditingTitle)) {
71614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mTitleView.setText(mEditingTitle);
71714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        } else {
71814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            Log.w(TAG, "Title during editing/adding a network was empty.");
719a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa            showEditingTitle();
72014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
72114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
722a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
723a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        parent.setVisibility(View.VISIBLE);
724a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
725a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
726cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        // Restore View status which was tweaked on connection.
727cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View wpsFieldView = findViewById(R.id.wps_fields);
728cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (wpsFieldView != null) {
729cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            wpsFieldView.setVisibility(mPreviousWpsFieldsVisibility);
730cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
731cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View securityFieldsView = findViewById(R.id.security_fields);
732cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (securityFieldsView != null) {
733cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            securityFieldsView.setVisibility(mPreviousSecurityFieldsVisibility);
734cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            if (mPreviousSecurityFieldsVisibility == View.VISIBLE && mWifiConfig != null) {
735cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                final View passwordView = findViewById(R.id.password);
736cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                if (passwordView != null) {
737cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                    if (passwordView.isFocused()) {
73814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                        setPaddingVisibility(View.GONE);
739cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                    }
74014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    mWifiConfig.requestFocusAndShowKeyboard(R.id.password);
741cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                }
742cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            }
743cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
744cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View typeView = findViewById(R.id.type);
745cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (typeView != null) {
746cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            typeView.setVisibility(mPreviousTypeVisibility);
74714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            if (mPreviousTypeVisibility == View.VISIBLE && mWifiConfig != null) {
74814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                final View ssidView = findViewById(R.id.ssid);
74914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                if (ssidView != null) {
75014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    if (ssidView.isFocused()) {
75114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                        setPaddingVisibility(View.GONE);
75214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    }
75314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    mWifiConfig.requestFocusAndShowKeyboard(R.id.ssid);
75414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                }
75514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            }
756cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
757cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
758cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
759be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /** Note: doesn't affect bottom padding */
7602adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    // Used by WifiConfigUiForSetupWizardXL
7612adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa    /* package */ void setPaddingVisibility(int visibility) {
762c4a495fb5b3d161aa0227a08d6179bf21ffcc730Daisuke Miyakawa        Log.d("@@@", "setPaddingVisibilyty: " + visibility, new RuntimeException());
76314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        setPaddingVisibility(visibility, visibility);
76414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
76514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
766be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /** Note: doesn't affect bottom padding */
76714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private void setPaddingVisibility(int topPaddingVisibility, int configVisibility) {
76814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTopPadding.setVisibility(topPaddingVisibility);
76914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mWifiConfigPadding.setVisibility(configVisibility);
77014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
77114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
772be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showDisconnectedProgressBar() {
773be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setVisibility(View.GONE);
774be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
775be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.VISIBLE);
776be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding.setVisibility(View.VISIBLE);
777be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
778be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
779be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
780be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar, whose state is intermediate.
781be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
782be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showScanningProgressBar() {
783be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
784be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(true);
785be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
786be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
787be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
788be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar, showing "connecting" state.
789be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
790be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showConnectingProgressBar() {
791be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
792be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
793be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setProgress(1);
794be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
795be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
796be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showConnectedProgressBar() {
797be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
798be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
799be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setProgress(2);
800be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
801be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
802cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
8032adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa     * Called when WifiManager is requested to save a network.
804cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
805cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /* package */ void onSaveNetwork(WifiConfiguration config) {
8062adae4e274c00f0b05b405d60b8def23d9b28469Daisuke Miyakawa        // We want to both save and connect a network. connectNetwork() does both.
807cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mWifiManager.connectNetwork(config);
808cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
809267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa
810267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa    @Override
811267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
812267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa        super.onCreateContextMenu(menu, view, menuInfo);
813267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa    }
8148f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
8158f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    /**
8168f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa     * Replace the current background with a new background whose id is resId if needed.
8178f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa     */
8188f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    private void trySetBackground(int resId) {
819cc0dc00916c5194cdef4151767ec58c6ccad6578Daisuke Miyakawa        if (mBackgroundId != resId) {
8208f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa            getWindow().setBackgroundDrawable(getResources().getDrawable(resId));
8218f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa            mBackgroundId = resId;
8228f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        }
8238f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    }
824d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa}
825