WifiSettings.java revision 065cd4be6471084863c6560b8404dfdeaf4f2154
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
1948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport com.android.settings.ProgressCategory;
2048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport com.android.settings.R;
2148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
2248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.BroadcastReceiver;
2348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Context;
2448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.DialogInterface;
2548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.Intent;
2648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.content.IntentFilter;
2748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.NetworkInfo;
2848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.ScanResult;
2948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.SupplicantState;
3048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration;
3148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration.KeyMgmt;
3248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiConfiguration.Status;
3348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiInfo;
3448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.net.wifi.WifiManager;
3548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Bundle;
3648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Handler;
3748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.os.Message;
3848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.CheckBoxPreference;
3948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.Preference;
4048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceActivity;
4148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.preference.PreferenceScreen;
4248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.provider.Settings.Secure;
4348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.Credentials;
4448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.security.KeyStore;
4548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.text.TextUtils;
4648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu;
4748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.ContextMenu.ContextMenuInfo;
4848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.Menu;
4948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.MenuItem;
5048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.view.View;
5148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.AdapterView.AdapterContextMenuInfo;
5248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport android.widget.Toast;
5348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
5448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.ArrayList;
5548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yehimport java.util.List;
5648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
57065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yehpublic class WifiSettings extends PreferenceActivity implements DialogInterface.OnClickListener {
5848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_SCAN = Menu.FIRST;
5948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
6048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_CONNECT = Menu.FIRST + 2;
6148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_FORGET = Menu.FIRST + 3;
6248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private static final int MENU_ID_MODIFY = Menu.FIRST + 4;
6348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
6448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final IntentFilter mFilter;
6548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final BroadcastReceiver mReceiver;
6648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private final Scanner mScanner;
6748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
6848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiManager mWifiManager;
6948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiEnabler mWifiEnabler;
7048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private CheckBoxPreference mNotifyOpenNetworks;
7148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private ProgressCategory mAccessPoints;
7248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private Preference mAddNetwork;
7348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
7448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private NetworkInfo.DetailedState mLastState;
7548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiInfo mLastInfo;
7648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private int mLastPriority;
7748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
7848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean mResetNetworks = false;
7948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private int mKeyStoreNetworkId = -1;
8048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
8148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private AccessPoint mSelected;
8248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private WifiDialog mDialog;
8348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
84065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh    public WifiSettings() {
8548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter = new IntentFilter();
8648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
8748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
8848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
8948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
9048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
9148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
9248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
9348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mReceiver = new BroadcastReceiver() {
9448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            @Override
9548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            public void onReceive(Context context, Intent intent) {
9648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                handleEvent(intent);
9748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
9848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        };
9948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
10048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner = new Scanner();
10148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
10248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
10348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
10448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    protected void onCreate(Bundle savedInstanceState) {
10548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onCreate(savedInstanceState);
10648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
10748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
10848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
10948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (getIntent().getBooleanExtra("only_access_points", false)) {
110065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh            addPreferencesFromResource(R.xml.wifi_access_points);
11148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
112065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh            addPreferencesFromResource(R.xml.wifi_settings);
11348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler = new WifiEnabler(this, mWifiManager,
11448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    (CheckBoxPreference) findPreference("enable_wifi"));
11548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mNotifyOpenNetworks =
11648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    (CheckBoxPreference) findPreference("notify_open_networks");
11748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mNotifyOpenNetworks.setChecked(Secure.getInt(getContentResolver(),
11848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
11948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
12048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mAccessPoints = (ProgressCategory) findPreference("access_points");
12248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mAccessPoints.setOrderingAsAdded(false);
12348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mAddNetwork = findPreference("add_network");
12448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        registerForContextMenu(getListView());
12648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
12748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
12848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
12948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    protected void onResume() {
13048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onResume();
13148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        registerReceiver(mReceiver, mFilter);
13248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
13348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.resume();
13448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
13548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mKeyStoreNetworkId != -1 && KeyStore.getInstance().test() == KeyStore.NO_ERROR) {
13648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            connect(mKeyStoreNetworkId);
13748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
13848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mKeyStoreNetworkId = -1;
13948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
14048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
14148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
14248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    protected void onPause() {
14348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        super.onPause();
14448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        unregisterReceiver(mReceiver);
14548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mWifiEnabler != null) {
14648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mWifiEnabler.pause();
14748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
14848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mScanner.pause();
14948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
15048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog.dismiss();
15148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog = null;
15248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
15348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mResetNetworks) {
15448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            enableNetworks();
15548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
15648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
15748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
15848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
15948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onCreateOptionsMenu(Menu menu) {
16048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
16148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                .setIcon(R.drawable.ic_menu_scan_network);
16248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
16348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                .setIcon(android.R.drawable.ic_menu_manage);
16448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onCreateOptionsMenu(menu);
16548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
16648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
16748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
16848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onOptionsItemSelected(MenuItem item) {
16948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
17048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_SCAN:
17148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mScanner.resume();
17248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
17348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_ADVANCED:
17448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                startActivity(new Intent(this, AdvancedSettings.class));
17548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
17648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
17748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onOptionsItemSelected(item);
17848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
17948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
18048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
18148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
18248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (info instanceof AdapterContextMenuInfo) {
18348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Preference preference = (Preference) getListView().getItemAtPosition(
18448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    ((AdapterContextMenuInfo) info).position);
18548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
18648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (preference instanceof AccessPoint) {
18748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mSelected = (AccessPoint) preference;
18848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                menu.setHeaderTitle(mSelected.ssid);
18948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (mSelected.getLevel() != -1 && mSelected.getState() == null) {
19048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
19148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
19248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (mSelected.networkId != -1) {
19348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
19448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    if (mSelected.security != AccessPoint.SECURITY_NONE) {
19548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
19648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
19748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
19848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
19948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
20048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
20148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
20248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
20348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onContextItemSelected(MenuItem item) {
20448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mSelected == null) {
20548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onContextItemSelected(item);
20648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
20748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        switch (item.getItemId()) {
20848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_CONNECT:
20948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (mSelected.networkId != -1) {
21048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    if (!requireKeyStore(mSelected.getConfig())) {
21148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        connect(mSelected.networkId);
21248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
21348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else if (mSelected.security == AccessPoint.SECURITY_NONE) {
21448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    // Shortcut for open networks.
21548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiConfiguration config = new WifiConfiguration();
21648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.SSID = mSelected.ssid;
21748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.allowedKeyManagement.set(KeyMgmt.NONE);
21848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    int networkId = mWifiManager.addNetwork(config);
21948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mWifiManager.enableNetwork(networkId, false);
22048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    connect(networkId);
22148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else {
22248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    showDialog(mSelected, false);
22348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
22448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
22548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_FORGET:
22648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                forget(mSelected.networkId);
22748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
22848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            case MENU_ID_MODIFY:
22948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                showDialog(mSelected, true);
23048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                return true;
23148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
23248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return super.onContextItemSelected(item);
23348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
23448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
23548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    @Override
23648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
23748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (preference instanceof AccessPoint) {
23848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mSelected = (AccessPoint) preference;
23948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            showDialog(mSelected, false);
24048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (preference == mAddNetwork) {
24148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mSelected = null;
24248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            showDialog(null, true);
24348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (preference == mNotifyOpenNetworks) {
24448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Secure.putInt(getContentResolver(),
24548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
24648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mNotifyOpenNetworks.isChecked() ? 1 : 0);
24748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
24848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return super.onPreferenceTreeClick(screen, preference);
24948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
25048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return true;
25148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
25248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
25348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    public void onClick(DialogInterface dialogInterface, int button) {
25448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (button == WifiDialog.BUTTON_FORGET && mSelected != null) {
25548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            forget(mSelected.networkId);
25648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (button == WifiDialog.BUTTON_SUBMIT) {
25748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            WifiConfiguration config = mDialog.getConfig();
25848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
25948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (config == null) {
26048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (mSelected != null && !requireKeyStore(mSelected.getConfig())) {
26148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    connect(mSelected.networkId);
26248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
26348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (config.networkId != -1) {
26448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (mSelected != null) {
26548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mWifiManager.updateNetwork(config);
26648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    saveNetworks();
26748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
26848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else {
26948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                int networkId = mWifiManager.addNetwork(config);
27048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (networkId != -1) {
27148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mWifiManager.enableNetwork(networkId, false);
27248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.networkId = networkId;
27348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    if (mDialog.edit || requireKeyStore(config)) {
27448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        saveNetworks();
27548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    } else {
27648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        connect(networkId);
27748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
27848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
27948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
28048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
28148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
28248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
28348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void showDialog(AccessPoint accessPoint, boolean edit) {
28448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mDialog != null) {
28548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mDialog.dismiss();
28648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
28748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mDialog = new WifiDialog(this, this, accessPoint, edit);
28848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mDialog.show();
28948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
29048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
29148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private boolean requireKeyStore(WifiConfiguration config) {
29248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiDialog.requireKeyStore(config) &&
29348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                KeyStore.getInstance().test() != KeyStore.NO_ERROR) {
29448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mKeyStoreNetworkId = config.networkId;
29548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            Credentials.getInstance().unlock(this);
29648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return true;
29748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
29848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        return false;
29948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
30048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
30148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void forget(int networkId) {
30248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager.removeNetwork(networkId);
30348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        saveNetworks();
30448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
30548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
30648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void connect(int networkId) {
30748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (networkId == -1) {
30848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            return;
30948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
31048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
31148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        // Reset the priority of each network if it goes too high.
31248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (mLastPriority > 1000000) {
31348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) {
31448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                AccessPoint accessPoint = (AccessPoint) mAccessPoints.getPreference(i);
31548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (accessPoint.networkId != -1) {
31648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiConfiguration config = new WifiConfiguration();
31748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.networkId = accessPoint.networkId;
31848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.priority = 0;
31948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mWifiManager.updateNetwork(config);
32048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
32148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
32248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastPriority = 0;
32348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
32448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
32548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        // Set to the highest priority and save the configuration.
32648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        WifiConfiguration config = new WifiConfiguration();
32748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        config.networkId = networkId;
32848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        config.priority = ++mLastPriority;
32948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager.updateNetwork(config);
33048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        saveNetworks();
33148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
33248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        // Connect to network by disabling others.
33348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager.enableNetwork(networkId, true);
33448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager.reconnect();
33548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mResetNetworks = true;
33648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
33748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
33848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void enableNetworks() {
33948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) {
34048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            WifiConfiguration config = ((AccessPoint) mAccessPoints.getPreference(i)).getConfig();
34148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (config != null && config.status != Status.ENABLED) {
34248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mWifiManager.enableNetwork(config.networkId, false);
34348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
34448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
34548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mResetNetworks = false;
34648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
34748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
34848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void saveNetworks() {
34948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        // Always save the configuration with all networks enabled.
35048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        enableNetworks();
35148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mWifiManager.saveConfiguration();
35248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        updateAccessPoints();
35348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
35448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
35548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateAccessPoints() {
35648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        List<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
35748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
35848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
35948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (configs != null) {
36048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastPriority = 0;
36148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (WifiConfiguration config : configs) {
36248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (config.priority > mLastPriority) {
36348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    mLastPriority = config.priority;
36448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
36548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
36648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Shift the status to make enableNetworks() more efficient.
36748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (config.status == Status.CURRENT) {
36848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.status = Status.ENABLED;
36948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                } else if (mResetNetworks && config.status == Status.DISABLED) {
37048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    config.status = Status.CURRENT;
37148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
37248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
37348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                AccessPoint accessPoint = new AccessPoint(this, config);
37448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoint.update(mLastInfo, mLastState);
37548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                accessPoints.add(accessPoint);
37648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
37748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
37848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
37948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        List<ScanResult> results = mWifiManager.getScanResults();
38048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (results != null) {
38148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            for (ScanResult result : results) {
38248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                // Ignore hidden and ad-hoc networks.
38348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (result.SSID == null || result.SSID.length() == 0 ||
38448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        result.capabilities.contains("[IBSS]")) {
38548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    continue;
38648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
38748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
38848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                boolean found = false;
38948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                for (AccessPoint accessPoint : accessPoints) {
39048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    if (accessPoint.update(result)) {
39148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        found = true;
39248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    }
39348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
39448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                if (!found) {
39548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    accessPoints.add(new AccessPoint(this, result));
39648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                }
39748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
39848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
39948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
40048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mAccessPoints.removeAll();
40148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        for (AccessPoint accessPoint : accessPoints) {
40248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.addPreference(accessPoint);
40348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
40448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
40548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
40648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void handleEvent(Intent intent) {
40748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        String action = intent.getAction();
40848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
40948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
41048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.WIFI_STATE_UNKNOWN));
41148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
41248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateAccessPoints();
41348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_IDS_CHANGED_ACTION.equals(action)) {
41448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mSelected != null && mSelected.networkId != -1) {
41548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mSelected = null;
41648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
41748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateAccessPoints();
41848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
41948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState)
42048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
42148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
42248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(((NetworkInfo) intent.getParcelableExtra(
42348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                    WifiManager.EXTRA_NETWORK_INFO)).getDetailedState());
42448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
42548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateConnectionState(null);
42648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
42748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
42848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
42948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateConnectionState(NetworkInfo.DetailedState state) {
43048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state == NetworkInfo.DetailedState.OBTAINING_IPADDR) {
43148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
43248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
43348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
43448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
43548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
43648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        mLastInfo = mWifiManager.getConnectionInfo();
43748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state != null) {
43848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mLastState = state;
43948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
44048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
44148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) {
44248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            ((AccessPoint) mAccessPoints.getPreference(i)).update(mLastInfo, mLastState);
44348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
44448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
44548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
44648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private void updateWifiState(int state) {
44748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        if (state == WifiManager.WIFI_STATE_ENABLED) {
44848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.resume();
44948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            updateAccessPoints();
45048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        } else {
45148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mScanner.pause();
45248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.removeAll();
45348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
45448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
45548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
45648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    private class Scanner extends Handler {
45748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        private int mRetry = 0;
45848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
45948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void resume() {
46048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (!hasMessages(0)) {
46148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                sendEmptyMessage(0);
46248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
46348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
46448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
46548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        void pause() {
46648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mRetry = 0;
46748090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.setProgress(false);
46848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            removeMessages(0);
46948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
47048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh
47148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        @Override
47248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        public void handleMessage(Message message) {
47348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            if (mWifiManager.startScanActive()) {
47448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
47548090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            } else if (++mRetry >= 3) {
47648090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                mRetry = 0;
477065cd4be6471084863c6560b8404dfdeaf4f2154Chia-chi Yeh                Toast.makeText(WifiSettings.this, R.string.wifi_fail_to_scan,
47848090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh                        Toast.LENGTH_LONG).show();
47948090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            }
48048090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            mAccessPoints.setProgress(mRetry != 0);
48148090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh            sendEmptyMessageDelayed(0, 6000);
48248090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh        }
48348090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh    }
48448090d4066fdf3084a4fb31277e785149c1bce37Chia-chi Yeh}
485