WifiSettings.java revision 18e9992a5e5f515566aa9ea861b2e1a3c2450ebc
148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh/*
248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Copyright (C) 2010 The Android Open Source Project
348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *
448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License");
548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * you may not use this file except in compliance with the License.
648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * You may obtain a copy of the License at
748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *
848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *      http://www.apache.org/licenses/LICENSE-2.0
948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh *
1048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software
1148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS,
1248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * See the License for the specific language governing permissions and
1448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh * limitations under the License.
1548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh */
1648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehpackage com.android.settings.wifi;
1848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
195d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawaimport static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
205d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa
21e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.app.ActionBar;
229c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.app.Activity;
23e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriffimport android.app.AlertDialog;
2448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
2979470d1a66f479919c13e27546391439cafa0ee7Freeman Ngimport android.net.ConnectivityManager;
3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
31af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yehimport android.net.NetworkInfo.DetailedState;
3248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
35e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.net.wifi.WifiConfiguration.KeyMgmt;
3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
38dee5b268925641c2e8f6280ce817fafa7e76d953Irfan Sheriffimport android.net.wifi.WpsResult;
3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
439e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.preference.PreferenceActivity;
4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials;
4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore;
47590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport android.util.Log;
4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
49e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo;
50e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.view.Gravity;
510688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawaimport android.view.LayoutInflater;
5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
539c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawaimport android.view.MenuInflater;
5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
560688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawaimport android.view.ViewGroup;
579e3a4700b6f6035c6ce79b0194ca0cff5f0f9574Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo;
58e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Switch;
5918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunneimport android.widget.TextView;
60e78c1879058571c00879f0d3e756951302adf513Gilles Debunneimport android.widget.Toast;
6148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
62590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.internal.util.AsyncChannel;
63590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.R;
64590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment;
65590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
6652727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriffimport java.util.ArrayList;
67d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport java.util.Collection;
6848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
69582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
7048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
71d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
72d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * This currently provides three types of UI.
73d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
74d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Two are for phones with relatively small screens: "for SetupWizard" and "for usual Settings".
75d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Users just need to launch WifiSettings Activity as usual. The request will be appropriately
76d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * handled by ActivityManager, and they will have appropriate look-and-feel with this fragment.
77d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
78d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Third type is for Setup Wizard with X-Large, landscape UI. Users need to launch
79d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * {@link WifiSettingsForSetupWizardXL} Activity, which contains this fragment but also has
80d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * other decorations specific to that screen.
81d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
829c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawapublic class WifiSettings extends SettingsPreferenceFragment
83e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        implements DialogInterface.OnClickListener  {
84590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private static final String TAG = "WifiSettings";
8548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_SCAN = Menu.FIRST;
86e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 1;
87e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private static final int MENU_ID_ADVANCED = Menu.FIRST + 2;
88e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private static final int MENU_ID_CONNECT = Menu.FIRST + 3;
89e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private static final int MENU_ID_FORGET = Menu.FIRST + 4;
90e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private static final int MENU_ID_MODIFY = Menu.FIRST + 5;
9148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
9248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
9348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
9448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
9548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
9748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
98d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // An access point being editted is stored here.
99d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private AccessPoint mSelectedAccessPoint;
10048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
101af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private DetailedState mLastState;
10248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
10348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
104582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff    private AtomicBoolean mConnected = new AtomicBoolean(false);
105582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff
106b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff    private int mKeyStoreNetworkId = INVALID_NETWORK_ID;
10748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
10858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private WifiDialog mDialog;
109d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
11018e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private View mView;
11118e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne    private TextView mEmptyView;
11218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
11358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* Used in Wifi Setup context */
114d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
11558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // this boolean extra specifies whether to disable the Next button when not connected
11658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
117d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
11858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    // should Next button only be enabled when we have a connection?
11958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mEnableNextOnConnection;
12058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private boolean mInXlSetupWizard;
12186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
12258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* End of "used in Wifi Setup context" */
12379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
124065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
130afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
131afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
1346377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff        mFilter.addAction(WifiManager.ERROR_ACTION);
13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
13648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
13748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
1396377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                handleEvent(context, intent);
14048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
14148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
14248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
14348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
14448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
14548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
14648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
1470688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    public void onAttach(Activity activity) {
1480688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa        super.onAttach(activity);
1490688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa
1500688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa        mInXlSetupWizard = (activity instanceof WifiSettingsForSetupWizardXL);
1510688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    }
1520688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa
1530688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    @Override
1540688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1550688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa            Bundle savedInstanceState) {
15618e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        mView = inflater.inflate(R.layout.custom_preference_list_fragment, container, false);
15718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        return mView;
1580688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    }
1590688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa
1600688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa    @Override
1619c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
1629c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // We don't call super.onActivityCreated() here, since it assumes we already set up
1639c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in
1649c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // this method.
16548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
167590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        mWifiManager.asyncConnect(getActivity(), new WifiServiceHandler());
16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
1699c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Activity activity = getActivity();
1709c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        final Intent intent = activity.getIntent();
1719c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa
17279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // if we're supposed to enable/disable the Next button based on our current connection
17379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng        // state, start it off in the right state
1749c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
175d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
176e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mEnableNextOnConnection) {
177e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (hasNextButton()) {
178e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final ConnectivityManager connectivity = (ConnectivityManager)
179e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                        getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
180e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (connectivity != null) {
181e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    NetworkInfo info = connectivity.getNetworkInfo(
182e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ConnectivityManager.TYPE_WIFI);
183e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    changeNextButtonState(info.isConnected());
184d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
18579470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            }
186e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        }
18779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng
188e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (mInXlSetupWizard) {
189e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl);
190e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        } else {
191e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            addPreferencesFromResource(R.xml.wifi_settings);
192e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
193e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Switch actionBarSwitch = new Switch(activity);
194e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
195e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            if (activity instanceof PreferenceActivity) {
196e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
197e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
198e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    final int padding = activity.getResources().getDimensionPixelSize(
199e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            R.dimen.action_bar_switch_padding);
200e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    actionBarSwitch.setPadding(0, 0, padding, 0);
201e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
202e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.DISPLAY_SHOW_CUSTOM);
203e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
204e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
205e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            ActionBar.LayoutParams.WRAP_CONTENT,
206e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            Gravity.CENTER_VERTICAL | Gravity.RIGHT));
2070f85c48d6c77e811f4d949503f0aa3efd908834dAmith Yamasani                }
208a93196f1651a0598d6e398f6fb3c2e513a3b7091Daisuke Miyakawa            }
2097bdf0e73d051f176fbc20451761eb50177d69f91Irfan Sheriff
210e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
21148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
21248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
21318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        mEmptyView = (TextView) mView.findViewById(R.id.empty);
21418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getListView().setEmptyView(mEmptyView);
21518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
216e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        registerForContextMenu(getListView());
217e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        setHasOptionsMenu(true);
218e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
2199c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        // After confirming PreferenceScreen is available, we call super.
2209c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onActivityCreated(savedInstanceState);
22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2249c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onResume() {
22548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
22648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
22748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
22848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
229590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
2309c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().registerReceiver(mReceiver, mFilter);
231b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        if (mKeyStoreNetworkId != INVALID_NETWORK_ID &&
232d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) {
233d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff            mWifiManager.connectNetwork(mKeyStoreNetworkId);
23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
235b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff        mKeyStoreNetworkId = INVALID_NETWORK_ID;
236e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
23758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
23948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
24048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2419c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onPause() {
24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
24448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
24548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
2469c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        getActivity().unregisterReceiver(mReceiver);
24748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
24848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
24948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog.dismiss();
25048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog = null;
25148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
25248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
25348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
25448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
2559c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
256d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        // We don't want menus in Setup Wizard XL.
257d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (!mInXlSetupWizard) {
258e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
259d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
260dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(R.drawable.ic_menu_scan_network)
261dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
262dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
263e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
264dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_add)
265dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setEnabled(wifiIsEnabled)
266dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
267d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
268dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    //.setIcon(android.R.drawable.ic_menu_manage)
269dc7101ff883d3b91a7b5d2d0e813109aa05d1af3Gilles Debunne                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
270d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
2719c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        super.onCreateOptionsMenu(menu, inflater);
27248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
27348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
27748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
2782215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                if (mWifiManager.isWifiEnabled()) {
279c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff                    mScanner.forceScan();
2802215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff                }
28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
282e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case MENU_ID_ADD_NETWORK:
283e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mWifiManager.isWifiEnabled()) {
284e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    onAddNetworkPressed();
285e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
286e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                return true;
28748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
2889eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                if (getActivity() instanceof PreferenceActivity) {
2899eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                    ((PreferenceActivity) getActivity()).startPreferencePanel(
290dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                            AdvancedWifiSettings.class.getCanonicalName(),
2919eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            null,
2929eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            R.string.wifi_advanced_titlebar, null,
2939eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                            this, 0);
2949eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                } else {
295dcff7338ad5dd9a883c735afaed1a0e73ae8eb74Gilles Debunne                    startFragment(this, AdvancedWifiSettings.class.getCanonicalName(), -1, null);
2969eb18f00152cd3bb490ca1dc1ccff671ea3f3a1bAmith Yamasani                }
29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
29848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
29948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
30048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
304267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa        if (mInXlSetupWizard) {
305267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).onCreateContextMenu(menu, view, info);
306267d51a68a6e2bc40b90d199425af88a7a824f53Daisuke Miyakawa        } else if (info instanceof AdapterContextMenuInfo) {
30748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
30848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
30948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
31048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
311d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mSelectedAccessPoint = (AccessPoint) preference;
312d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                menu.setHeaderTitle(mSelectedAccessPoint.ssid);
313d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mSelectedAccessPoint.getLevel() != -1
314d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        && mSelectedAccessPoint.getState() == null) {
31548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
31648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
317b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
31848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
319f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
32048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
32148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
32248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
32348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
32448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
32548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
32648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
327d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mSelectedAccessPoint == null) {
32848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
32948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
33048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
331d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_CONNECT: {
332b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
333d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if (!requireKeyStore(mSelectedAccessPoint.getConfig())) {
334d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        mWifiManager.connectNetwork(mSelectedAccessPoint.networkId);
33548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
336d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    // Shortcut for open networks.
33848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiConfiguration config = new WifiConfiguration();
339d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    config.SSID = AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid);
34048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.allowedKeyManagement.set(KeyMgmt.NONE);
341d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff                    mWifiManager.connectNetwork(config);
34248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
343d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    showConfigUi(mSelectedAccessPoint, true);
34448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
34548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
346d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
347d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_FORGET: {
348d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId);
34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
350d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
351d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case MENU_ID_MODIFY: {
352d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                showConfigUi(mSelectedAccessPoint, true);
35348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
354d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
35648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
36048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
362d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mSelectedAccessPoint = (AccessPoint) preference;
363d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            showConfigUi(mSelectedAccessPoint, false);
36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
36548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
36748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
36848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
36948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
370d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
37158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Shows an appropriate Wifi configuration component.
37258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when a user clicks "Add network" preference or one of available networks is selected.
373d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
374d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void showConfigUi(AccessPoint accessPoint, boolean edit) {
375d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
37658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit);
377d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
378d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            showDialog(accessPoint, edit);
379d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
380d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
381d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
38248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
38348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog.dismiss();
38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
3869c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa        mDialog = new WifiDialog(getActivity(), this, accessPoint, edit);
38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mDialog.show();
38848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean requireKeyStore(WifiConfiguration config) {
391d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (WifiConfigController.requireKeyStore(config) &&
392d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                KeyStore.getInstance().state() != KeyStore.State.UNLOCKED) {
39348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mKeyStoreNetworkId = config.networkId;
3949c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa            Credentials.getInstance().unlock(getActivity());
39548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return true;
39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return false;
39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
400d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /**
401d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * Shows the latest access points available with supplimental information like
402d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     * the strength of network and the security for it.
403d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa     */
40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
405e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final int wifiState = mWifiManager.getWifiState();
406e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
407e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (wifiState) {
408e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
40918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
410e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                // AccessPoints are automatically sorted with TreeSet.
411e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                final Collection<AccessPoint> accessPoints = constructAccessPoints();
412e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                if (mInXlSetupWizard) {
413e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated(
414e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                            getPreferenceScreen(), accessPoints);
415e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                } else {
416e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    for (AccessPoint accessPoint : accessPoints) {
417e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                        getPreferenceScreen().addPreference(accessPoint);
418e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    }
419e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                }
420e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
42186eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa
42218e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
42318e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                getPreferenceScreen().removeAll();
42418e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                break;
42518e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne
426e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLING:
427e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_stopping);
428e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
429e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
430e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
431e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
432e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
433d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
434d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
43548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
436e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    private void addMessagePreference(int messageId) {
43718e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        if (mEmptyView != null) mEmptyView.setText(messageId);
43818e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne        getPreferenceScreen().removeAll();
439e78c1879058571c00879f0d3e756951302adf513Gilles Debunne    }
440e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
441d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private Collection<AccessPoint> constructAccessPoints() {
44252727dd1fbca7612c2179b50689cd77f8f939b1aIrfan Sheriff        Collection<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
443d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
444d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
44548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
4479c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                AccessPoint accessPoint = new AccessPoint(getActivity(), config);
44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
45148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
45248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
453d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final List<ScanResult> results = mWifiManager.getScanResults();
45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
45548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
45648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
45748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
45848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
45948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
46248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
46348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                for (AccessPoint accessPoint : accessPoints) {
46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    if (accessPoint.update(result)) {
46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        found = true;
46648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
46748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
4699c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                    accessPoints.add(new AccessPoint(getActivity(), result));
47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
474d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return accessPoints;
47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
4776377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff    private void handleEvent(Context context, Intent intent) {
47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
482d821c7adcccda6024c3e82013f1579507f528949Irfan Sheriff        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
483afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
484afc2aacf0015fbb3a79b1f29ce552fe35efe58b7Irfan Sheriff                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
485d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                updateAccessPoints();
48648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
487582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //Ignore supplicant state changes when network is connected
488582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
489582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //introduce a broadcast that combines the supplicant and network
490582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //network state change events so the apps dont have to worry about
491582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //ignoring supplicant state change when network is connected
492582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            //to get more fine grained information.
493582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            if (!mConnected.get()) {
494582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff                updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState)
495582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff                        intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
496582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            }
497cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
498cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            if (mInXlSetupWizard) {
499cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                ((WifiSettingsForSetupWizardXL)getActivity()).onSupplicantStateChanged(intent);
500cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            }
50148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
50279470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
50379470d1a66f479919c13e27546391439cafa0ee7Freeman Ng                    WifiManager.EXTRA_NETWORK_INFO);
504582ab4d414c21f71cf1e4df658b304d1a409c155Irfan Sheriff            mConnected.set(info.isConnected());
505d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            changeNextButtonState(info.isConnected());
506317e0aa530760ee323c7a98321d9b34a2ffa1d41Irfan Sheriff            updateAccessPoints();
50779470d1a66f479919c13e27546391439cafa0ee7Freeman Ng            updateConnectionState(info.getDetailedState());
50848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
50948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
5106377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff        } else if (WifiManager.ERROR_ACTION.equals(action)) {
5116377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff            int errorCode = intent.getIntExtra(WifiManager.EXTRA_ERROR_CODE, 0);
5126377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff            switch (errorCode) {
5136377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                case WifiManager.WPS_OVERLAP_ERROR:
5146377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                    Toast.makeText(context, R.string.wifi_wps_overlap_error,
5156377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                            Toast.LENGTH_SHORT).show();
5166377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff                    break;
5176377e47f8b89982ebfa381542a301606a4bbb06dIrfan Sheriff            }
51848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
51948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
52048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
521af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh    private void updateConnectionState(DetailedState state) {
5222215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff        /* sticky broadcasts can call this when wifi is disabled */
523e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        if (!mWifiManager.isWifiEnabled()) {
524e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff            mScanner.pause();
5252215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff            return;
526e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff        }
5272215c7f86895ce1400e9d0cde7ec3326713a5f5bIrfan Sheriff
528af7b2d8a23d297194365db74518cd67c58b9f48dChia-chi Yeh        if (state == DetailedState.OBTAINING_IPADDR) {
52948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
53048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
53148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
53248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
53348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
53448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
53548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
53648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
53748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
53848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
539e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) {
540d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // Maybe there's a WifiConfigPreference
541e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            Preference preference = getPreferenceScreen().getPreference(i);
542d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (preference instanceof AccessPoint) {
54386eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                final AccessPoint accessPoint = (AccessPoint) preference;
54486eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa                accessPoint.update(mLastInfo, mLastState);
545d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
546d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
547d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
54858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
54958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).updateConnectionState(mLastState);
55048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
55148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
55248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
55348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
554e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getActivity().invalidateOptionsMenu();
555e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
556e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        switch (state) {
557e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLED:
558e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                mScanner.resume();
55918e9992a5e5f515566aa9ea861b2e1a3c2450ebcGilles Debunne                return; // not break, to avoid the call to pause() below
560e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
561e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_ENABLING:
562e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_starting);
563e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
564e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
565e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            case WifiManager.WIFI_STATE_DISABLED:
566e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                addMessagePreference(R.string.wifi_empty_list_wifi_off);
567e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                break;
56848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
569e78c1879058571c00879f0d3e756951302adf513Gilles Debunne
570e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        mScanner.pause();
57148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
57248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
57348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
57448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
57548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
57648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
57748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
57848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
57948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
58048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
58148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
582c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        void forceScan() {
583c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff            sendEmptyMessage(0);
584c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff        }
585c1bad6bc68020590b7d6df50fdacaa28201b006fIrfan Sheriff
58648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
58748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
58848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
58948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
59048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
59148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
59248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
59348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mWifiManager.startScanActive()) {
59448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
59548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
59648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
5979c8bde576ab18fcfe653587f3e63604430c8791cDaisuke Miyakawa                Toast.makeText(getActivity(), R.string.wifi_fail_to_scan,
59848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        Toast.LENGTH_LONG).show();
599e81497095bd97a14db07d870cb9f57aa0c220078Irfan Sheriff                return;
60048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
6017add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff            // Combo scans can take 5-6s to complete. Increase interval to 10s.
6027add00049ac150c4b8c0e473a9baca70cf5e8aa8Irfan Sheriff            sendEmptyMessageDelayed(0, 10000);
60348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
60448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
605d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
606590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    private class WifiServiceHandler extends Handler {
607590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
608590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        @Override
609590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        public void handleMessage(Message msg) {
610590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            switch (msg.what) {
611590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
612590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
613590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel in msg.obj
614590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    } else {
615590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        //AsyncChannel set up failure, ignore
616590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        Log.e(TAG, "Failed to establish AsyncChannel connection");
617590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    }
618590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
619590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                case WifiManager.CMD_WPS_COMPLETED:
620590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    WpsResult result = (WpsResult) msg.obj;
621590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    if (result == null) break;
622590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity())
623590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        .setTitle(R.string.wifi_wps_setup_title)
624590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        .setPositiveButton(android.R.string.ok, null);
625590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    switch (result.status) {
626590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        case FAILURE:
627590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            dialog.setMessage(R.string.wifi_wps_failed);
628590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            dialog.show();
629590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            break;
630590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        case IN_PROGRESS:
631590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            dialog.setMessage(R.string.wifi_wps_in_progress);
632590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            dialog.show();
633590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            break;
634590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                        default:
635590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            if (result.pin != null) {
636590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                                dialog.setMessage(getResources().getString(
637590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                                        R.string.wifi_wps_pin_output, result.pin));
638590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                                dialog.show();
639590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            }
640590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                            break;
641590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    }
642e78c1879058571c00879f0d3e756951302adf513Gilles Debunne                    break;
643590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                //TODO: more connectivity feedback
644590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                default:
645590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    //Ignore
646590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                    break;
647590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff            }
648590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff        }
649590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff    }
650590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff
65158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
65258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Renames/replaces "Next" button when appropriate. "Next" button usually exists in
65358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Wifi setup screens, not in usual wifi settings screen.
65458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     *
65558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * @param connected true when the device is connected to a wifi network.
65658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
65758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    private void changeNextButtonState(boolean connected) {
658d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mInXlSetupWizard) {
65958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).changeNextButtonState(connected);
660d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else if (mEnableNextOnConnection && hasNextButton()) {
66158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            getNextButton().setEnabled(connected);
662d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
663d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
664d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
665d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(DialogInterface dialogInterface, int button) {
66658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mInXlSetupWizard) {
66758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
66814cbcb7fe88dab90cb50efa3a09869bc48297170Daisuke Miyakawa                forget();
66958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            } else if (button == WifiDialog.BUTTON_SUBMIT) {
67058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                ((WifiSettingsForSetupWizardXL)getActivity()).onConnectButtonPressed();
67158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            }
67258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        } else {
67358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
67458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                forget();
67558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            } else if (button == WifiDialog.BUTTON_SUBMIT) {
67658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                submit(mDialog.getController());
6778b3b876c096acb93ec8736851e47e2ba3ce276e5Daisuke Miyakawa            }
678d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
679d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
68058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
681d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
68258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void submit(WifiConfigController configController) {
683dee5b268925641c2e8f6280ce817fafa7e76d953Irfan Sheriff        int networkSetup = configController.chosenNetworkSetupMethod();
684dee5b268925641c2e8f6280ce817fafa7e76d953Irfan Sheriff        switch(networkSetup) {
685b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff            case WifiConfigController.WPS_PBC:
686e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff            case WifiConfigController.WPS_PIN_FROM_ACCESS_POINT:
687e45e13f47ad5e09aa8291d81a03a136618b383c0Irfan Sheriff            case WifiConfigController.WPS_PIN_FROM_DEVICE:
688590e6c23b7ba4bf9a75ecfe5e6eda11d0dfa5c71Irfan Sheriff                mWifiManager.startWps(configController.getWpsConfig());
689b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                break;
690b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff            case WifiConfigController.MANUAL:
691b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                final WifiConfiguration config = configController.getConfig();
692b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff
693b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                if (config == null) {
694b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    if (mSelectedAccessPoint != null
6955d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa                            && !requireKeyStore(mSelectedAccessPoint.getConfig())
6965d3c5cb9d0134c02ee0a5a91baa2e90d83a5deddDaisuke Miyakawa                            && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
697b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                        mWifiManager.connectNetwork(mSelectedAccessPoint.networkId);
698b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    }
699b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                } else if (config.networkId != INVALID_NETWORK_ID) {
700b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    if (mSelectedAccessPoint != null) {
701cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                        saveNetwork(config);
702b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    }
703b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                } else {
70458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa                    if (configController.isEdit() || requireKeyStore(config)) {
705cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa                        saveNetwork(config);
706b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    } else {
707b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                        mWifiManager.connectNetwork(config);
708b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                    }
709b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                }
710b3024fa6a0359f18b93fd8aaf197fce59f806edeIrfan Sheriff                break;
711d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
712d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
71358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
71458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
71586eaa09aa42e3281ed6c8ea85e09d4875973c4bfDaisuke Miyakawa        }
71658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
717d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
718d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
719cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    private void saveNetwork(WifiConfiguration config) {
720cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        if (mInXlSetupWizard) {
721cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            ((WifiSettingsForSetupWizardXL)getActivity()).onSaveNetwork(config);
722cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        } else {
723cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa            mWifiManager.saveNetwork(config);
724cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa        }
725cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa    }
726cde3083fb539e87728a17a0bb491314530a29643Daisuke Miyakawa
727d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void forget() {
728d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId);
729d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
73058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
73158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
73258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
73358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        updateAccessPoints();
734d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
73558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // We need to rename/replace "Next" button in wifi setup context.
736d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        changeNextButtonState(false);
737d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
738d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
73958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
74058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Refreshes acccess points and ask Wifi module to scan networks again.
74158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
742d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void refreshAccessPoints() {
743d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
744d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mScanner.resume();
745d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
746d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
747e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        getPreferenceScreen().removeAll();
748d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
749d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
75058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
75158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Called when "add network" button is pressed.
75258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
753d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ void onAddNetworkPressed() {
75458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        // No exact access point is selected.
755d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mSelectedAccessPoint = null;
756d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        showConfigUi(null, true);
757d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
758b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa
759b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    /* package */ int getAccessPointsCount() {
760e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
761e78c1879058571c00879f0d3e756951302adf513Gilles Debunne        if (wifiIsEnabled) {
762e78c1879058571c00879f0d3e756951302adf513Gilles Debunne            return getPreferenceScreen().getPreferenceCount();
763b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        } else {
764b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa            return 0;
765b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa        }
766b962d6566c99edf9950b5d05c5f08c56d1f850feDaisuke Miyakawa    }
76755de702961642521e247f155963644df81756215Daisuke Miyakawa
76858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
76958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
77058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
77158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void pauseWifiScan() {
77258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
77358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.pause();
77458b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
77558b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    }
77658b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa
77758b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /**
77858b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
77958b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa     */
78058b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa    /* package */ void resumeWifiScan() {
78158b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        if (mWifiManager.isWifiEnabled()) {
78258b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa            mScanner.resume();
78358b0291fe6e6e47bf3d7457d8cf2648b8ce4a1aeDaisuke Miyakawa        }
78455de702961642521e247f155963644df81756215Daisuke Miyakawa    }
78548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
786