WifiSettingsForSetupWizardXL.java revision 590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71
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;
3958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport android.view.WindowManager;
405d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
41d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.Button;
42d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.ProgressBar;
43d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.TextView;
44d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
45590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.internal.util.AsyncChannel;
46590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
4758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawaimport java.util.Collection;
48d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.EnumMap;
4909d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawaimport java.util.List;
50d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
51d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
52d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * WifiSetings Activity specific for SetupWizard with X-Large screen size.
53d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
54d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapublic class WifiSettingsForSetupWizardXL extends Activity implements OnClickListener {
5558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String TAG = "SetupWizard";
5635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final boolean DEBUG = true;
5758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
58d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private static final EnumMap<DetailedState, DetailedState> stateMap =
5958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            new EnumMap<DetailedState, DetailedState>(DetailedState.class);
60d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
61d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    static {
62d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.IDLE, DetailedState.DISCONNECTED);
63b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        stateMap.put(DetailedState.SCANNING, DetailedState.SCANNING);
64d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.CONNECTING, DetailedState.CONNECTING);
65d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.AUTHENTICATING, DetailedState.CONNECTING);
66d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.OBTAINING_IPADDR, DetailedState.CONNECTING);
67d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.CONNECTED, DetailedState.CONNECTED);
68d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.SUSPENDED, DetailedState.SUSPENDED);  // ?
69d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.DISCONNECTING, DetailedState.DISCONNECTED);
70d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        stateMap.put(DetailedState.DISCONNECTED, DetailedState.DISCONNECTED);
715d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        stateMap.put(DetailedState.FAILED, DetailedState.FAILED);
72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
7458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiManager mWifiManager;
7558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
7614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    /**
7714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * Used for resizing a padding above title. Hiden when software keyboard is shown.
7814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     */
7914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private View mTopPadding;
8014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
8114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    /**
8214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * Used for resizing a padding inside Config UI. Hiden when software keyboard is shown.
8314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     */
8414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private View mWifiConfigPadding;
8514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
8614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private TextView mTitleView;
8714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    /**
8814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * The name of a network currently connecting, or trying to connect.
8914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * This may be empty ("") at first, and updated when configuration is changed.
9014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     */
9114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private CharSequence mNetworkName = "";
9214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private CharSequence mEditingTitle;
9314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
94d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private ProgressBar mProgressBar;
95beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa    private View mTopDividerNoProgress;
96be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private View mBottomPadding;
97be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
98d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private WifiSettings mWifiSettings;
99d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke 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 static int CONNECT_BUTTON_TAG_ADD_NETWORK = 1;
1064781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
1074781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private Button mConnectButton;
1084781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
10935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /**
11035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * View enclosing {@link WifiSettings}.
11135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     */
11235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private View mWifiSettingsFragmentLayout;
113a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa    private View mConnectingStatusLayout;
114a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa    private TextView mConnectingStatusView;
115a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
11635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_DISCONNECTED = 0;
11735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_EDITING = 1;
11835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_CONNECTING = 2;
11935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private static final int SCREEN_STATE_CONNECTED = 3;
12035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
12135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private int mScreenState = SCREEN_STATE_DISCONNECTED;
12258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
12358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiConfigUiForSetupWizardXL mWifiConfig;
12458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
1255d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    private InputMethodManager mInputMethodManager;
126fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawa
1274dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    private final Handler mHandler = new Handler();
1284dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
129cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private int mPreviousWpsFieldsVisibility = View.GONE;
130cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private int mPreviousSecurityFieldsVisibility = View.GONE;
131cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private int mPreviousTypeVisibility = View.GONE;
132cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
1334781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private DetailedState mPreviousState = DetailedState.DISCONNECTED;
1344781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
1358f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    private int mBackgroundId = R.drawable.setups_bg_default;
1368f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
137d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
138d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onCreate(Bundle savedInstanceState) {
139d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        super.onCreate(savedInstanceState);
140d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        requestWindowFeature(Window.FEATURE_NO_TITLE);
141d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        setContentView(R.layout.wifi_settings_for_setup_wizard_xl);
14258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
14358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
14440124c30a9d554597808992d77ccc867737cf242Daisuke Miyakawa
14558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
146dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        // There's no button here enabling wifi network, so we need to enable it without
147dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        // users' request.
148dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa        mWifiManager.setWifiEnabled(true);
149590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        mWifiManager.asyncConnect(this, new WifiServiceHandler());
150dd9fbb0b9e1b82025fc8699fe4ad4a9e2a918c4dDaisuke Miyakawa
151d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mWifiSettings =
152d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                (WifiSettings)getFragmentManager().findFragmentById(R.id.wifi_setup_fragment);
1535d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
154d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        setup();
155d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
156d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
157d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void setup() {
15835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (getIntent().getBooleanExtra("firstRun", false)) {
15935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            final View layoutRoot = findViewById(R.id.layout_root);
16035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            layoutRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);
16135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        }
16262fb701ea9781f4e1c05af6d730e91bb2cdcdae0Daisuke Miyakawa
16314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTitleView = (TextView)findViewById(R.id.wifi_setup_title);
164d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mProgressBar = (ProgressBar)findViewById(R.id.scanning_progress_bar);
165d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mProgressBar.setMax(2);
166beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress = findViewById(R.id.top_divider_no_progress);
167be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding = findViewById(R.id.bottom_padding);
168d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
169beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mProgressBar.setVisibility(View.VISIBLE);
1703b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa        mProgressBar.setIndeterminate(true);
171beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.GONE);
1723b6aa41cce9dafa48dfbb3e93ea856610de1f1e7Daisuke Miyakawa
17358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton = (Button)findViewById(R.id.wifi_setup_add_network);
17458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton.setOnClickListener(this);
17558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton = (Button)findViewById(R.id.wifi_setup_refresh_list);
17658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setOnClickListener(this);
17758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton = (Button)findViewById(R.id.wifi_setup_skip_or_next);
17858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setOnClickListener(this);
17958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton = (Button)findViewById(R.id.wifi_setup_connect);
18058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setOnClickListener(this);
18158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton = (Button)findViewById(R.id.wifi_setup_cancel);
18258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setOnClickListener(this);
1834dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
18414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTopPadding = findViewById(R.id.top_padding);
18514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mWifiConfigPadding = findViewById(R.id.wifi_config_padding);
18614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
18735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout = findViewById(R.id.wifi_settings_fragment_layout);
188a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout = findViewById(R.id.connecting_status_layout);
189a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusView = (TextView) findViewById(R.id.connecting_status);
190a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
1914dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        // At first, Wifi module doesn't return SCANNING state (it's too early), so we manually
1924dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        // show it.
1934dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        showScanningStatus();
19458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
19558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
196590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private class WifiServiceHandler extends Handler {
197590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        @Override
198590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        public void handleMessage(Message msg) {
199590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            switch (msg.what) {
200590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
201590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
202590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel in msg.obj
203590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    } else {
204590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel set up failure, ignore
205590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        Log.e(TAG, "Failed to establish AsyncChannel connection");
206590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    }
207590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
208590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                default:
209590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    //Ignore
210590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
211590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            }
212590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        }
213590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    }
214590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
21558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void restoreFirstButtonVisibilityState() {
216a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        showDefaultTitle();
217fe7d04fee23b4142c77ec7ab1416f0b94384ba63Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.VISIBLE);
21858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setVisibility(View.VISIBLE);
21958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
22058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
22158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setVisibility(View.GONE);
22214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE, View.GONE);
223d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
224d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
225d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
226d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(View view) {
227fdb9343ef660fc424bb8c29b48d5c06dff0241c1Daisuke Miyakawa        hideSoftwareKeyboard();
22858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (view == mAddNetworkButton) {
2294dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "AddNetwork button pressed");
23058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            onAddNetworkButtonPressed();
23158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mRefreshButton) {
2324dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Refresh button pressed");
23358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
23458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mSkipOrNextButton) {
2354dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Skip/Next button pressed");
23655de702961642521e247f155963644df81756215Daisuke Miyakawa            if (TextUtils.equals(getString(R.string.wifi_setup_skip), ((Button)view).getText())) {
23755de702961642521e247f155963644df81756215Daisuke Miyakawa                // We don't want to let Wifi enabled when a user press skip without choosing
23855de702961642521e247f155963644df81756215Daisuke Miyakawa                // any access point.
23958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                mWifiManager.setWifiEnabled(false);
24055de702961642521e247f155963644df81756215Daisuke Miyakawa            }
2417e3ff8eca6ce2912839c02065a5463c5cd234aaeDaisuke Miyakawa            setResult(RESULT_OK);
2427e3ff8eca6ce2912839c02065a5463c5cd234aaeDaisuke Miyakawa            finish();
24358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mConnectButton) {
2444dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Connect button pressed");
2458b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa            onConnectButtonPressed();
24658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else if (view == mBackButton) {
2474dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Back button pressed");
24858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            onBackButtonPressed();
249d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
2505d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    }
2515d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa
2525d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    private void hideSoftwareKeyboard() {
253c9cd29ddb832fd76d96fea080abe8325a8bb1bd2satok        if (DEBUG) Log.i(TAG, "Hiding software keyboard.");
2545d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        final View focusedView = getCurrentFocus();
2555d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        if (focusedView != null) {
2565d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa            mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
2575d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        }
258d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
259d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
26086eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa    // Called from WifiSettings
2615d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa    /* package */ void updateConnectionState(DetailedState originalState) {
262d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final DetailedState state = stateMap.get(originalState);
26358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
26458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (originalState == DetailedState.FAILED) {
26558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // We clean up the current connectivity status and let users select another network
26658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // if they want.
26758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
26858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
26958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
270d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        switch (state) {
271b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        case SCANNING: {
272b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            // Let users know the device is working correctly though currently there's
273b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            // no visible network on the list.
274b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            if (mWifiSettings.getAccessPointsCount() == 0) {
275be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa                showScanningProgressBar();
276b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            } else {
277be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa                // Users already see available networks.
278be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa                showDisconnectedProgressBar();
279b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            }
280b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            break;
281b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
282d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        case CONNECTING: {
28335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            if (mScreenState != SCREEN_STATE_DISCONNECTED &&
28435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                    mScreenState != SCREEN_STATE_CONNECTED) {
28535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                showConnectingState();
28635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
287d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            break;
288d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
289d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        case CONNECTED: {
29035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            showConnectedState();
291d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            break;
292d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
2934dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        default:  // DISCONNECTED, FAILED
29435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            if (mScreenState != SCREEN_STATE_CONNECTED) {
29535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                showDisconnectedState(Summary.get(this, state));
29635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
2975d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa            break;
2985d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa        }
2994781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mPreviousState = state;
3004dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    }
30158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
30235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showDisconnectedState(String stateString) {
303be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showDisconnectedProgressBar();
3044dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        mAddNetworkButton.setEnabled(true);
3054dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa        mRefreshButton.setEnabled(true);
306d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
307d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
30835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showConnectingState() {
30935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTING;
31035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
311ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
31214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        // We save this title and show it when authentication failed.
31314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mEditingTitle = mTitleView.getText();
314a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        showConnectingTitle();
315be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showConnectingProgressBar();
316350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa
31735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
31835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
31935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
32035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    private void showConnectedState() {
32135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // Once we show "connected" screen, we won't change it even when the device becomes
32235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // disconnected afterwards. We keep the state unless a user explicitly cancel it
32335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // (by pressing "back" button).
32435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTED;
32535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
32635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        hideSoftwareKeyboard();
32735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        setPaddingVisibility(View.VISIBLE);
32835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
32935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        trySetBackground(R.drawable.setups_bg_complete);
33035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        showConnectedTitle();
331be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showConnectedProgressBar();
33235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
33335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
33435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.VISIBLE);
33535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
33635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectingStatusView.setText(R.string.wifi_setup_description_connected);
33735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
33835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
33935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
34035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
34135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
34235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
34335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mSkipOrNextButton.setEnabled(true);
34414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
34514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
346a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showDefaultTitle() {
347a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title));
348a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
349a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
3504781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private void showAddNetworkTitle() {
3514781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mNetworkName = "";
3524781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mTitleView.setText(R.string.wifi_setup_title_add_network);
3534781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    }
3544781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
355a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showEditingTitle() {
35614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3574781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3584781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mWifiConfig.getController().getConfig() != null) {
3594781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3604781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3614781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3624781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3634781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
36414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
36514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_editing_network, mNetworkName));
366f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa    }
367f3cd94652f26d68485650fbbe5f9904e5da3008dDaisuke Miyakawa
368a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showConnectingTitle() {
369a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3704781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3714781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                    mWifiConfig.getController().getConfig() != null) {
3724781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3734781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3744781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3754781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3764781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
377a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        }
378a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_connecting_network, mNetworkName));
379a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
380a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
381a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    private void showConnectedTitle() {
382a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        if (TextUtils.isEmpty(mNetworkName) && mWifiConfig != null) {
3834781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (mWifiConfig.getController() != null &&
3844781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                    mWifiConfig.getController().getConfig() != null) {
3854781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mNetworkName = mWifiConfig.getController().getConfig().SSID;
3864781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
3874781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                Log.w(TAG, "Unexpected null found (WifiController or WifiConfig is null). " +
3884781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                        "Ignore them.");
3894781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
390a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        }
391a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa        mTitleView.setText(getString(R.string.wifi_setup_title_connected_network, mNetworkName));
392a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa    }
393a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa
394be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
395be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar without defining the state of the ProgressBar.
396be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     *
397be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showScanningProgressBar()
398be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showConnectedProgressBar()
399be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * @see #showConnectingProgressBar()
400be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
401be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showTopDividerWithProgressBar() {
402beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mProgressBar.setVisibility(View.VISIBLE);
403beec0b2da6286575a4526d06cd5215463f39ae40Daisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.GONE);
404be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding.setVisibility(View.GONE);
405be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
406be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
407be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showScanningStatus() {
408be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showScanningProgressBar();
4094dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa    }
4104dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa
41158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void onAddNetworkButtonPressed() {
41258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.onAddNetworkPressed();
413fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa    }
414fef4125d4e5db8d35a3c76041fdfde9a12627480Daisuke Miyakawa
41558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
41658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when the screen enters wifi configuration UI. UI widget for configuring network
41758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * (a.k.a. ConfigPreference) should be taken care of by caller side.
41858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * This method should handle buttons' visibility/enabled.
41958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param selectedAccessPoint AccessPoint object being selected. null when a user pressed
42058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * "Add network" button, meaning there's no selected access point.
42158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
42258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void showConfigUi(AccessPoint selectedAccessPoint, boolean edit) {
423cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (selectedAccessPoint != null &&
424cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                (selectedAccessPoint.security == AccessPoint.SECURITY_WEP ||
425cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                        selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) {
426cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // We forcibly set edit as true so that users can modify every field if they want,
427cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // while config UI doesn't allow them to edit some of them when edit is false
428cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            // (e.g. password field is hiden when edit==false).
429cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            edit = true;
430cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
431cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
4328f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_default);
4338f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
43458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We don't want to keep scanning Wi-Fi networks during users' configuring one network.
43558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.pauseWifiScan();
43658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
43735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.GONE);
438a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
43958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
44058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.setVisibility(View.VISIBLE);
44158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.removeAllViews();
44258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiConfig = new WifiConfigUiForSetupWizardXL(this, parent, selectedAccessPoint, edit);
4434781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4444781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        // For safety, we forget the tag once. Tag will be updated in this method when needed.
4454781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mConnectButton.setTag(null);
4464781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        if (selectedAccessPoint == null) {  // "Add network" flow
4474781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showAddNetworkTitle();
4484781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mConnectButton.setVisibility(View.VISIBLE);
4494781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mConnectButton.setTag(CONNECT_BUTTON_TAG_ADD_NETWORK);
4504781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4514781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showEditingButtonState();
4524781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        } else if (selectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
45314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mNetworkName = selectedAccessPoint.getTitle().toString();
45458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
45514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            // onConnectButtonPressed() will change visibility status.
45614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mConnectButton.performClick();
4570333f74b9c54227cee22f04fbb08a562771504e9Daisuke Miyakawa        } else {
4584781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            mNetworkName = selectedAccessPoint.getTitle().toString();
459a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa            showEditingTitle();
4604781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showEditingButtonState();
4614781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            if (selectedAccessPoint.security == AccessPoint.SECURITY_EAP) {
46235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                onEapNetworkSelected();
4634781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            } else {
4644781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mConnectButton.setVisibility(View.VISIBLE);
4654781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
4664781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // WifiConfigController shows Connect button as "Save" when edit==true and a user
4674781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // tried to connect the network.
4684781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                // In SetupWizard, we just show the button as "Connect" instead.
4694781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mConnectButton.setText(R.string.wifi_connect);
4704781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                mBackButton.setText(R.string.wifi_setup_cancel);
4714781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            }
47214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
47358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
47458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
47535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /**
47635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * Called before security fields are correctly set by WifiConfigController.
47735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     *
47835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @param view security field view
47935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @param accessPointSecurity type of security. e.g. AccessPoint.SECURITY_NONE
48035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * @return true when it is ok for the caller to init security fields. false when
48135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     * all security fields are managed by this method, and thus the caller shouldn't touch them.
48235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa     */
48335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /* package */ boolean initSecurityFields(View view, int accessPointSecurity) {
48435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        // Reset all states tweaked below.
48535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.eap_not_supported).setVisibility(View.GONE);
48635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.eap_not_supported_for_add_network).setVisibility(View.GONE);
48735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.ssid_text).setVisibility(View.VISIBLE);
48835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        view.findViewById(R.id.ssid_layout).setVisibility(View.VISIBLE);
48935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
49035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (accessPointSecurity == AccessPoint.SECURITY_EAP) {
49135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            hideSoftwareKeyboard();
49235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
49335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // In SetupWizard for XLarge screen, we don't have enough space for showing
49435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // configurations needed for EAP. We instead disable the whole feature there and let
49535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // users configure those networks after the setup.
49635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            if (view.findViewById(R.id.type).getVisibility() == View.VISIBLE) {
49735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                view.findViewById(R.id.eap_not_supported_for_add_network)
49835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                .setVisibility(View.VISIBLE);
49935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            } else {
50035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa                view.findViewById(R.id.eap_not_supported).setVisibility(View.VISIBLE);
50135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            }
50235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.security_fields).setVisibility(View.GONE);
50335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.ssid_text).setVisibility(View.GONE);
50435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            view.findViewById(R.id.ssid_layout).setVisibility(View.GONE);
50535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            onEapNetworkSelected();
50635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            return false;
50735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        }
50835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        return true;
50935eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
51035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
51135eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    /* package */ void onEapNetworkSelected() {
51235eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
51335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
51435eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa    }
51535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
5164781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    private void showEditingButtonState() {
5174781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.GONE);
5184781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
5194781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
5204781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
5214781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa    }
5224781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa
52358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // May be called when user press "connect" button in WifiDialog
52458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void onConnectButtonPressed() {
52535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_CONNECTING;
52658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
5278f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_wifi);
5288f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
52958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.submit(mWifiConfig.getController());
53058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
53158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // updateConnectionState() isn't called soon after the user's "connect" action,
53258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // and the user still sees "not connected" message for a while, which looks strange.
53358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We instead manually show "connecting" message before the system gets actual
53458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // "connecting" message from Wi-Fi module.
53535eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        showConnectingState();
53658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
53758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // Might be better to delay showing this button.
53858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mBackButton.setVisibility(View.VISIBLE);
539ee5576ce0677ccae468fdefa70c541837178c4fcDaisuke Miyakawa        mBackButton.setText(R.string.wifi_setup_back);
54058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
541cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        // We need to restore visibility status when the device failed to connect the network.
542cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View wpsFieldView = findViewById(R.id.wps_fields);
543cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (wpsFieldView != null) {
544cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mPreviousWpsFieldsVisibility = wpsFieldView.getVisibility();
545cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            wpsFieldView.setVisibility(View.GONE);
546cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
547cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View securityFieldsView = findViewById(R.id.security_fields);
548cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (securityFieldsView != null) {
549cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mPreviousSecurityFieldsVisibility = securityFieldsView.getVisibility();
550cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            securityFieldsView.setVisibility(View.GONE);
551cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
552cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View typeView = findViewById(R.id.type);
553cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (typeView != null) {
554cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mPreviousTypeVisibility = typeView.getVisibility();
555cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            typeView.setVisibility(View.GONE);
556cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
55758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
558a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        // TODO: investigate whether visibility handling above is needed. Now that we hide
559a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        // them completely when connecting, so we may not need to do so, though we probably
560a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        // need to show software keyboard conditionaly.
561a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
562a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        parent.setVisibility(View.GONE);
563a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.VISIBLE);
564a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusView.setText(R.string.wifi_setup_description_connecting);
565a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
56658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setVisibility(View.VISIBLE);
56758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mSkipOrNextButton.setEnabled(false);
56858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mConnectButton.setVisibility(View.GONE);
56958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mAddNetworkButton.setVisibility(View.GONE);
57058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mRefreshButton.setVisibility(View.GONE);
571d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
572d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
57358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void onBackButtonPressed() {
5748f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_default);
5758f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
57635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        if (mScreenState == SCREEN_STATE_CONNECTING || mScreenState == SCREEN_STATE_CONNECTED) {
5774dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            if (DEBUG) Log.d(TAG, "Back button pressed after connect action.");
57835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            mScreenState = SCREEN_STATE_DISCONNECTED;
57958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
58058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // When a user press "Back" button after pressing "Connect" button, we want to cancel
58158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            // the "Connect" request and refresh the whole wifi status.
58258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            restoreFirstButtonVisibilityState();
58358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
58458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setEnabled(true);
5854dd2a5b4f7129609d773a7e663c48f81b89a60b2Daisuke Miyakawa            changeNextButtonState(false);  // Skip
58658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
58735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // Wifi list becomes empty for a moment. We show "scanning" effect to a user so that
58835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            // he/she won't be astonished there. This stops once the scan finishes.
589be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa            showScanningProgressBar();
59035eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
59109d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            // Remembered networks may be re-used during SetupWizard, which confuse users.
59209d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            // We force the module to forget them to reduce UX complexity
59309d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
59409d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            for (WifiConfiguration config : configs) {
59509d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                if (DEBUG) {
59609d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                    Log.d(TAG, String.format("forgeting Wi-Fi network \"%s\" (id: %d)",
59709d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                            config.SSID, config.networkId));
59809d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                }
59909d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa                mWifiManager.forgetNetwork(config.networkId);
60009d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa            }
60109d5c98ea1465183ed8065771e1a4f34a50f0d75Daisuke Miyakawa
60258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            refreshAccessPoints(true);
60358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else { // During user's Wifi configuration.
60458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mWifiSettings.resumeWifiScan();
60558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            restoreFirstButtonVisibilityState();
60758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
60858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mAddNetworkButton.setEnabled(true);
60958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mRefreshButton.setEnabled(true);
61058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setEnabled(true);
61158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
61258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
61335eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mWifiSettingsFragmentLayout.setVisibility(View.VISIBLE);
614a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
61558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
61658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.removeAllViews();
61758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        parent.setVisibility(View.GONE);
61858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiConfig = null;
61958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
62058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
62158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
62258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a specific network.
62358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
62458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void changeNextButtonState(boolean connected) {
62558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (connected) {
62658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setText(R.string.wifi_setup_next);
62758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
62858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mSkipOrNextButton.setText(R.string.wifi_setup_skip);
62958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
63058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
63158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
63258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
63358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when the list of AccessPoints are modified and this Activity needs to refresh
63458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * the list.
63558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
63658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void onAccessPointsUpdated(
63758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            PreferenceCategory holder, Collection<AccessPoint> accessPoints) {
638350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        // If we already show some of access points but the bar still shows "scanning" state, it
639350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        // should be stopped.
640350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        if (mProgressBar.isIndeterminate() && accessPoints.size() > 0) {
641be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa            showTopDividerWithProgressBar();
642350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa            mAddNetworkButton.setEnabled(true);
643350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa            mRefreshButton.setEnabled(true);
644350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa        }
645350b724d098329186eb6f566029e0537ff24de9dDaisuke Miyakawa
64658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        for (AccessPoint accessPoint : accessPoints) {
64758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            accessPoint.setLayoutResource(R.layout.custom_preference);
64858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            holder.addPreference(accessPoint);
64958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
65058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
65158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
65258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void refreshAccessPoints(boolean disconnectNetwork) {
6534781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        final Object tag = mConnectButton.getTag();
6544781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        if (tag != null && (tag instanceof Integer) &&
6554781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa                ((Integer)tag == CONNECT_BUTTON_TAG_ADD_NETWORK)) {
6564781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            // In "Add network" flow, we won't get DetaledState available for changing ProgressBar
6574781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            // state. Instead we manually show previous status here.
65835eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa            showDisconnectedState(Summary.get(this, mPreviousState));
6594781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        } else {
6604781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa            showScanningStatus();
6614781d280d4cc210ea824c729ba1c9efaf2d2da48Daisuke Miyakawa        }
6628b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa
66358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (disconnectNetwork) {
66458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mWifiManager.disconnect();
66558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
66658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
66758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        mWifiSettings.refreshAccessPoints();
6688b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa    }
669cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
670cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
67114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * Called when {@link WifiSettings} received
67214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa     * {@link WifiManager#SUPPLICANT_STATE_CHANGED_ACTION}.
673cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
674cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /* package */ void onSupplicantStateChanged(Intent intent) {
675cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final int errorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
676cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (errorCode == WifiManager.ERROR_AUTHENTICATING) {
677cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            Log.i(TAG, "Received authentication error event.");
678cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            onAuthenticationFailure();
679cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
680cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
681cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
682cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
683cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     * Called once when Authentication failed.
684cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
685cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private void onAuthenticationFailure() {
68635eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa        mScreenState = SCREEN_STATE_EDITING;
68735eae7ccc759da15c6d82c388ab52e4dafab2a13Daisuke Miyakawa
688cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mSkipOrNextButton.setVisibility(View.GONE);
689cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mConnectButton.setVisibility(View.VISIBLE);
690cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mConnectButton.setEnabled(true);
691cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
6928f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        trySetBackground(R.drawable.setups_bg_default);
6938f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
69414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        if (!TextUtils.isEmpty(mEditingTitle)) {
69514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            mTitleView.setText(mEditingTitle);
69614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        } else {
69714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            Log.w(TAG, "Title during editing/adding a network was empty.");
698a0587d028a79397b8c3c2ccf66ee1d5b2dacb625Daisuke Miyakawa            showEditingTitle();
69914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        }
70014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
701a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        final ViewGroup parent = (ViewGroup)findViewById(R.id.wifi_config_ui);
702a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        parent.setVisibility(View.VISIBLE);
703a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa        mConnectingStatusLayout.setVisibility(View.GONE);
704a30013fad40bcbe02d87863edae488b75c73190dDaisuke Miyakawa
705cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        // Restore View status which was tweaked on connection.
706cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View wpsFieldView = findViewById(R.id.wps_fields);
707cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (wpsFieldView != null) {
708cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            wpsFieldView.setVisibility(mPreviousWpsFieldsVisibility);
709cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
710cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View securityFieldsView = findViewById(R.id.security_fields);
711cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (securityFieldsView != null) {
712cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            securityFieldsView.setVisibility(mPreviousSecurityFieldsVisibility);
713cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            if (mPreviousSecurityFieldsVisibility == View.VISIBLE && mWifiConfig != null) {
714cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                final View passwordView = findViewById(R.id.password);
715cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                if (passwordView != null) {
716cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                    if (passwordView.isFocused()) {
71714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                        setPaddingVisibility(View.GONE);
718cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                    }
71914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    mWifiConfig.requestFocusAndShowKeyboard(R.id.password);
720cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                }
721cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            }
722cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
723cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        final View typeView = findViewById(R.id.type);
724cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (typeView != null) {
725cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            typeView.setVisibility(mPreviousTypeVisibility);
72614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            if (mPreviousTypeVisibility == View.VISIBLE && mWifiConfig != null) {
72714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                final View ssidView = findViewById(R.id.ssid);
72814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                if (ssidView != null) {
72914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    if (ssidView.isFocused()) {
73014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                        setPaddingVisibility(View.GONE);
73114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    }
73214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                    mWifiConfig.requestFocusAndShowKeyboard(R.id.ssid);
73314cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                }
73414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa            }
735cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
736cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
737cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
738be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /** Note: doesn't affect bottom padding */
73914cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    public void setPaddingVisibility(int visibility) {
74014cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        setPaddingVisibility(visibility, visibility);
74114cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
74214cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
743be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /** Note: doesn't affect bottom padding */
74414cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    private void setPaddingVisibility(int topPaddingVisibility, int configVisibility) {
74514cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mTopPadding.setVisibility(topPaddingVisibility);
74614cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa        mWifiConfigPadding.setVisibility(configVisibility);
74714cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa    }
74814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa
749be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showDisconnectedProgressBar() {
750be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setVisibility(View.GONE);
751be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
752be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mTopDividerNoProgress.setVisibility(View.VISIBLE);
753be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mBottomPadding.setVisibility(View.VISIBLE);
754be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
755be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
756be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
757be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar, whose state is intermediate.
758be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
759be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showScanningProgressBar() {
760be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
761be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(true);
762be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
763be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
764be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    /**
765be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     * Shows top divider with ProgressBar, showing "connecting" state.
766be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa     */
767be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showConnectingProgressBar() {
768be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
769be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
770be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setProgress(1);
771be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
772be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
773be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    private void showConnectedProgressBar() {
774be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        showTopDividerWithProgressBar();
775be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setIndeterminate(false);
776be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa        mProgressBar.setProgress(2);
777be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa    }
778be10e75c8c81a979384bc3a06b26150c22885bcaDaisuke Miyakawa
779cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /**
780cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     * Called when WifiManager is requested to save a network. This method sholud include
781cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     * WifiManager#saveNetwork() call.
782cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     *
783cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     * Currently this method calls {@link WifiManager#connectNetwork(int)}.
784cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa     */
785cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    /* package */ void onSaveNetwork(WifiConfiguration config) {
786cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        mWifiManager.connectNetwork(config);
787cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
788267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa
789267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa    @Override
790267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
791267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa        super.onCreateContextMenu(menu, view, menuInfo);
792267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa    }
7938f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa
7948f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    /**
7958f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa     * Replace the current background with a new background whose id is resId if needed.
7968f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa     */
7978f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    private void trySetBackground(int resId) {
798cc0dc00916c5194cdef4151767ec58c6ccad6578Daisuke Miyakawa        if (mBackgroundId != resId) {
7998f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa            getWindow().setBackgroundDrawable(getResources().getDrawable(resId));
8008f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa            mBackgroundId = resId;
8018f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa        }
8028f533a62324d154f5f804a511a2f3208dd73780dDaisuke Miyakawa    }
803d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa}
804