1b98463f8b0de186dc263217286449a76d6df91a8repo sync/*
2b98463f8b0de186dc263217286449a76d6df91a8repo sync * Copyright (C) 2011 The Android Open Source Project
3b98463f8b0de186dc263217286449a76d6df91a8repo sync *
4b98463f8b0de186dc263217286449a76d6df91a8repo sync * Licensed under the Apache License, Version 2.0 (the "License");
5b98463f8b0de186dc263217286449a76d6df91a8repo sync * you may not use this file except in compliance with the License.
6b98463f8b0de186dc263217286449a76d6df91a8repo sync * You may obtain a copy of the License at
7b98463f8b0de186dc263217286449a76d6df91a8repo sync *
8b98463f8b0de186dc263217286449a76d6df91a8repo sync *      http://www.apache.org/licenses/LICENSE-2.0
9b98463f8b0de186dc263217286449a76d6df91a8repo sync *
10b98463f8b0de186dc263217286449a76d6df91a8repo sync * Unless required by applicable law or agreed to in writing, software
11b98463f8b0de186dc263217286449a76d6df91a8repo sync * distributed under the License is distributed on an "AS IS" BASIS,
12b98463f8b0de186dc263217286449a76d6df91a8repo sync * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b98463f8b0de186dc263217286449a76d6df91a8repo sync * See the License for the specific language governing permissions and
14b98463f8b0de186dc263217286449a76d6df91a8repo sync * limitations under the License.
15b98463f8b0de186dc263217286449a76d6df91a8repo sync */
16b98463f8b0de186dc263217286449a76d6df91a8repo sync
179ef53578b8ef7da9c372b4fcd48ea760a0d9c305Irfan Sheriffpackage com.android.settings.wifi.p2p;
18b98463f8b0de186dc263217286449a76d6df91a8repo sync
19b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.app.Activity;
20b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.app.AlertDialog;
21b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.app.Dialog;
22b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.content.BroadcastReceiver;
23b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.content.Context;
24b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.content.DialogInterface;
25b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.content.DialogInterface.OnClickListener;
26b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.content.Intent;
27b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.content.IntentFilter;
2876feb7f1c129e8053ba72ee27cc048a0e7fd2152repo syncimport android.net.NetworkInfo;
29b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.net.wifi.p2p.WifiP2pConfig;
307c872478ebc016d8412ebbe2667d446e67a3a7easunil duttuimport android.net.wifi.p2p.WifiP2pInfo;
31b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.net.wifi.p2p.WifiP2pDevice;
32b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.net.wifi.p2p.WifiP2pDeviceList;
33f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenagaimport android.net.wifi.p2p.WifiP2pGroup;
34f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenagaimport android.net.wifi.p2p.WifiP2pGroupList;
35b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.net.wifi.p2p.WifiP2pManager;
365d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zhengimport android.net.wifi.p2p.WifiP2pManager.PeerListListener;
37f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenagaimport android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener;
388c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriffimport android.net.wifi.WpsInfo;
39b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.os.Bundle;
401e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriffimport android.os.SystemProperties;
41b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.preference.Preference;
422592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriffimport android.preference.PreferenceCategory;
432592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriffimport android.preference.PreferenceGroup;
44b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.preference.PreferenceScreen;
45540f75aa922806f8af506188a36d30e9c4dbad87Irfan Sheriffimport android.text.InputFilter;
462592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriffimport android.text.TextUtils;
47b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.util.Log;
48b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.view.Menu;
49b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.view.MenuInflater;
50b98463f8b0de186dc263217286449a76d6df91a8repo syncimport android.view.MenuItem;
5197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriffimport android.widget.EditText;
528c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriffimport android.widget.Toast;
53b98463f8b0de186dc263217286449a76d6df91a8repo sync
549ef53578b8ef7da9c372b4fcd48ea760a0d9c305Irfan Sheriffimport com.android.settings.R;
559ef53578b8ef7da9c372b4fcd48ea760a0d9c305Irfan Sheriffimport com.android.settings.SettingsPreferenceFragment;
56b98463f8b0de186dc263217286449a76d6df91a8repo sync
57b98463f8b0de186dc263217286449a76d6df91a8repo sync/*
58b98463f8b0de186dc263217286449a76d6df91a8repo sync * Displays Wi-fi p2p settings UI
59b98463f8b0de186dc263217286449a76d6df91a8repo sync */
60ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriffpublic class WifiP2pSettings extends SettingsPreferenceFragment
615d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        implements PersistentGroupInfoListener, PeerListListener {
62b98463f8b0de186dc263217286449a76d6df91a8repo sync
63b98463f8b0de186dc263217286449a76d6df91a8repo sync    private static final String TAG = "WifiP2pSettings";
648c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private static final boolean DBG = false;
65b98463f8b0de186dc263217286449a76d6df91a8repo sync    private static final int MENU_ID_SEARCH = Menu.FIRST;
668c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private static final int MENU_ID_RENAME = Menu.FIRST + 1;
67b98463f8b0de186dc263217286449a76d6df91a8repo sync
68b98463f8b0de186dc263217286449a76d6df91a8repo sync    private final IntentFilter mIntentFilter = new IntentFilter();
69b98463f8b0de186dc263217286449a76d6df91a8repo sync    private WifiP2pManager mWifiP2pManager;
7076feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync    private WifiP2pManager.Channel mChannel;
7197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff    private OnClickListener mRenameListener;
72b98463f8b0de186dc263217286449a76d6df91a8repo sync    private OnClickListener mDisconnectListener;
73c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff    private OnClickListener mCancelConnectListener;
74f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    private OnClickListener mDeleteGroupListener;
75b98463f8b0de186dc263217286449a76d6df91a8repo sync    private WifiP2pPeer mSelectedWifiPeer;
76f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    private WifiP2pPersistentGroup mSelectedGroup;
771a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde    private String mSelectedGroupName;
7897617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff    private EditText mDeviceNameText;
79b98463f8b0de186dc263217286449a76d6df91a8repo sync
808c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private boolean mWifiP2pEnabled;
818c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private boolean mWifiP2pSearching;
828c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private int mConnectedDevices;
837c872478ebc016d8412ebbe2667d446e67a3a7easunil duttu    private boolean mLastGroupFormed = false;
848c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff
852592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff    private PreferenceGroup mPeersGroup;
86f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    private PreferenceGroup mPersistentGroup;
872592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff    private Preference mThisDevicePref;
882592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff
898c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private static final int DIALOG_DISCONNECT  = 1;
90c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff    private static final int DIALOG_CANCEL_CONNECT = 2;
9197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff    private static final int DIALOG_RENAME = 3;
92f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    private static final int DIALOG_DELETE_GROUP = 4;
93b98463f8b0de186dc263217286449a76d6df91a8repo sync
94db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff    private static final String SAVE_DIALOG_PEER = "PEER_STATE";
955864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani    private static final String SAVE_DEVICE_NAME = "DEV_NAME";
961a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde    private static final String SAVE_SELECTED_GROUP = "GROUP_NAME";
97db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff
982592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff    private WifiP2pDevice mThisDevice;
992592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff    private WifiP2pDeviceList mPeers = new WifiP2pDeviceList();
1002592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff
1015864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani    private String mSavedDeviceName;
1025864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani
103b98463f8b0de186dc263217286449a76d6df91a8repo sync    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
104b98463f8b0de186dc263217286449a76d6df91a8repo sync        @Override
105b98463f8b0de186dc263217286449a76d6df91a8repo sync        public void onReceive(Context context, Intent intent) {
106b98463f8b0de186dc263217286449a76d6df91a8repo sync            String action = intent.getAction();
107b98463f8b0de186dc263217286449a76d6df91a8repo sync
108b98463f8b0de186dc263217286449a76d6df91a8repo sync            if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
1098c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                mWifiP2pEnabled = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,
1108c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                    WifiP2pManager.WIFI_P2P_STATE_DISABLED) == WifiP2pManager.WIFI_P2P_STATE_ENABLED;
1118c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                handleP2pStateChanged();
112b98463f8b0de186dc263217286449a76d6df91a8repo sync            } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
1139f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff                mPeers = (WifiP2pDeviceList) intent.getParcelableExtra(
1149f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff                        WifiP2pManager.EXTRA_P2P_DEVICE_LIST);
1159f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff                handlePeersChanged();
11676feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync            } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
11776feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                if (mWifiP2pManager == null) return;
11876feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(
11976feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                        WifiP2pManager.EXTRA_NETWORK_INFO);
1207c872478ebc016d8412ebbe2667d446e67a3a7easunil duttu                WifiP2pInfo wifip2pinfo = (WifiP2pInfo) intent.getParcelableExtra(
1217c872478ebc016d8412ebbe2667d446e67a3a7easunil duttu                        WifiP2pManager.EXTRA_WIFI_P2P_INFO);
12276feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                if (networkInfo.isConnected()) {
1238c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                    if (DBG) Log.d(TAG, "Connected");
1247c872478ebc016d8412ebbe2667d446e67a3a7easunil duttu                } else if (mLastGroupFormed != true) {
1253a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                    //start a search when we are disconnected
1267c872478ebc016d8412ebbe2667d446e67a3a7easunil duttu                    //but not on group removed broadcast event
1273a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                    startSearch();
12876feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                }
1297c872478ebc016d8412ebbe2667d446e67a3a7easunil duttu                mLastGroupFormed = wifip2pinfo.groupFormed;
1302592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff            } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
1312592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff                mThisDevice = (WifiP2pDevice) intent.getParcelableExtra(
1322592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff                        WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
1338c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                if (DBG) Log.d(TAG, "Update device info: " + mThisDevice);
1342592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff                updateDevicePref();
1353a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff            } else if (WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION.equals(action)) {
1363a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                int discoveryState = intent.getIntExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE,
1373a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                    WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED);
1383a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                if (DBG) Log.d(TAG, "Discovery state changed: " + discoveryState);
1393a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                if (discoveryState == WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED) {
1403a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                    updateSearchMenu(true);
1413a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                } else {
1423a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                    updateSearchMenu(false);
1433a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff                }
144f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            } else if (WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION.equals(action)) {
145f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                if (mWifiP2pManager != null) {
146f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                    mWifiP2pManager.requestPersistentGroupInfo(mChannel, WifiP2pSettings.this);
147f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                }
148b98463f8b0de186dc263217286449a76d6df91a8repo sync            }
149b98463f8b0de186dc263217286449a76d6df91a8repo sync        }
150b98463f8b0de186dc263217286449a76d6df91a8repo sync    };
151b98463f8b0de186dc263217286449a76d6df91a8repo sync
1521a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde    public WifiP2pSettings() {
1531a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        if (DBG) Log.d(TAG, "Creating WifiP2pSettings ...");
1541a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde    }
1551a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde
156b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
157db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff    public void onActivityCreated(Bundle savedInstanceState) {
158b98463f8b0de186dc263217286449a76d6df91a8repo sync        addPreferencesFromResource(R.xml.wifi_p2p_settings);
159b98463f8b0de186dc263217286449a76d6df91a8repo sync
160b98463f8b0de186dc263217286449a76d6df91a8repo sync        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
161b98463f8b0de186dc263217286449a76d6df91a8repo sync        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
16276feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
1632592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
1643a14bafcf6792e14b3d74a591af39c9d62a4cc26Irfan Sheriff        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION);
165f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION);
1668c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff
167b98463f8b0de186dc263217286449a76d6df91a8repo sync        final Activity activity = getActivity();
168b98463f8b0de186dc263217286449a76d6df91a8repo sync        mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
16976feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync        if (mWifiP2pManager != null) {
170ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff            mChannel = mWifiP2pManager.initialize(activity, getActivity().getMainLooper(), null);
17176feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync            if (mChannel == null) {
17276feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                //Failure to set up connection
17376feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                Log.e(TAG, "Failed to set up connection with wifi p2p service");
17476feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync                mWifiP2pManager = null;
17576feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync            }
17676feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync        } else {
17776feb7f1c129e8053ba72ee27cc048a0e7fd2152repo sync            Log.e(TAG, "mWifiP2pManager is null !");
178b98463f8b0de186dc263217286449a76d6df91a8repo sync        }
179b98463f8b0de186dc263217286449a76d6df91a8repo sync
180db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff        if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_DIALOG_PEER)) {
181db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            WifiP2pDevice device = savedInstanceState.getParcelable(SAVE_DIALOG_PEER);
182db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            mSelectedWifiPeer = new WifiP2pPeer(getActivity(), device);
183db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff        }
1845864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani        if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_DEVICE_NAME)) {
1855864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani            mSavedDeviceName = savedInstanceState.getString(SAVE_DEVICE_NAME);
1865864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani        }
1871a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_SELECTED_GROUP)) {
1881a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            mSelectedGroupName = savedInstanceState.getString(SAVE_SELECTED_GROUP);
1891a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        }
190db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff
19197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff        mRenameListener = new OnClickListener() {
19297617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff            @Override
19397617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff            public void onClick(DialogInterface dialog, int which) {
19497617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                if (which == DialogInterface.BUTTON_POSITIVE) {
19597617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                    if (mWifiP2pManager != null) {
19697617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                        mWifiP2pManager.setDeviceName(mChannel,
19797617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                                mDeviceNameText.getText().toString(),
19897617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                                new WifiP2pManager.ActionListener() {
19997617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                            public void onSuccess() {
20097617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                                if (DBG) Log.d(TAG, " device rename success");
20197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                            }
20297617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                            public void onFailure(int reason) {
20397617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                                Toast.makeText(getActivity(),
20497617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                                        R.string.wifi_p2p_failed_rename_message,
20597617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                                        Toast.LENGTH_LONG).show();
20697617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                            }
20797617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                        });
20897617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                    }
20997617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                }
21097617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff            }
21197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff        };
21297617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff
213b98463f8b0de186dc263217286449a76d6df91a8repo sync        //disconnect dialog listener
214b98463f8b0de186dc263217286449a76d6df91a8repo sync        mDisconnectListener = new OnClickListener() {
215b98463f8b0de186dc263217286449a76d6df91a8repo sync            @Override
216b98463f8b0de186dc263217286449a76d6df91a8repo sync            public void onClick(DialogInterface dialog, int which) {
217b98463f8b0de186dc263217286449a76d6df91a8repo sync                if (which == DialogInterface.BUTTON_POSITIVE) {
218b98463f8b0de186dc263217286449a76d6df91a8repo sync                    if (mWifiP2pManager != null) {
219ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff                        mWifiP2pManager.removeGroup(mChannel, new WifiP2pManager.ActionListener() {
220ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff                            public void onSuccess() {
2218c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                if (DBG) Log.d(TAG, " remove group success");
222ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff                            }
223ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff                            public void onFailure(int reason) {
2248c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                if (DBG) Log.d(TAG, " remove group fail " + reason);
225ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff                            }
226ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff                        });
227b98463f8b0de186dc263217286449a76d6df91a8repo sync                    }
228b98463f8b0de186dc263217286449a76d6df91a8repo sync                }
229b98463f8b0de186dc263217286449a76d6df91a8repo sync            }
230b98463f8b0de186dc263217286449a76d6df91a8repo sync        };
2318c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff
232c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff        //cancel connect dialog listener
233c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff        mCancelConnectListener = new OnClickListener() {
234c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            @Override
235c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            public void onClick(DialogInterface dialog, int which) {
236c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                if (which == DialogInterface.BUTTON_POSITIVE) {
237c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                    if (mWifiP2pManager != null) {
238c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                        mWifiP2pManager.cancelConnect(mChannel,
239c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                                new WifiP2pManager.ActionListener() {
240c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                            public void onSuccess() {
241c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                                if (DBG) Log.d(TAG, " cancel connect success");
242c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                            }
243c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                            public void onFailure(int reason) {
244c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                                if (DBG) Log.d(TAG, " cancel connect fail " + reason);
245c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                            }
246c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                        });
247c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                    }
248c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                }
249c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            }
250c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff        };
251c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff
252f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        //delete persistent group dialog listener
253f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        mDeleteGroupListener = new OnClickListener() {
254f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            @Override
255f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            public void onClick(DialogInterface dialog, int which) {
256f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                if (which == DialogInterface.BUTTON_POSITIVE) {
257f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                    if (mWifiP2pManager != null) {
2581a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                        if (mSelectedGroup != null) {
2591a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                            if (DBG) Log.d(TAG, " deleting group " + mSelectedGroup.getGroupName());
2601a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                            mWifiP2pManager.deletePersistentGroup(mChannel,
2611a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                    mSelectedGroup.getNetworkId(),
2621a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                    new WifiP2pManager.ActionListener() {
2631a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                public void onSuccess() {
2641a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                    if (DBG) Log.d(TAG, " delete group success");
2651a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                }
2661a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                public void onFailure(int reason) {
2671a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                    if (DBG) Log.d(TAG, " delete group fail " + reason);
2681a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                                }
2691a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                            });
2701a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                            mSelectedGroup = null;
2711a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                        } else {
2721a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                            if (DBG) Log.w(TAG, " No selected group to delete!" );
2731a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                        }
2741a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                    }
2751a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                } else if (which == DialogInterface.BUTTON_NEGATIVE) {
2761a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                    if (DBG) {
2771a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                        Log.d(TAG, " forgetting selected group " + mSelectedGroup.getGroupName());
278f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                    }
2791a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                    mSelectedGroup = null;
280f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                }
281f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            }
282f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        };
283f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga
284a318d1e8216670d40f3e378211891c333dd5d328Irfan Sheriff        setHasOptionsMenu(true);
285a318d1e8216670d40f3e378211891c333dd5d328Irfan Sheriff
2868c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        final PreferenceScreen preferenceScreen = getPreferenceScreen();
2878c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        preferenceScreen.removeAll();
2888c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        preferenceScreen.setOrderingAsAdded(true);
289acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng
2908c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        mThisDevicePref = new Preference(getActivity());
291acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng        mThisDevicePref.setPersistent(false);
292acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng        mThisDevicePref.setSelectable(false);
2938c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        preferenceScreen.addPreference(mThisDevicePref);
2948c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff
295a318d1e8216670d40f3e378211891c333dd5d328Irfan Sheriff        mPeersGroup = new PreferenceCategory(getActivity());
296a318d1e8216670d40f3e378211891c333dd5d328Irfan Sheriff        mPeersGroup.setTitle(R.string.wifi_p2p_peer_devices);
2976271cd01de0c22407d5d83e485e719e40cf57c50Yuhao Zheng        preferenceScreen.addPreference(mPeersGroup);
298db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff
299f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        mPersistentGroup = new PreferenceCategory(getActivity());
300f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        mPersistentGroup.setTitle(R.string.wifi_p2p_remembered_groups);
3016271cd01de0c22407d5d83e485e719e40cf57c50Yuhao Zheng        preferenceScreen.addPreference(mPersistentGroup);
302f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga
303db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff        super.onActivityCreated(savedInstanceState);
304b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
305b98463f8b0de186dc263217286449a76d6df91a8repo sync
306b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
307b98463f8b0de186dc263217286449a76d6df91a8repo sync    public void onResume() {
308b98463f8b0de186dc263217286449a76d6df91a8repo sync        super.onResume();
309b98463f8b0de186dc263217286449a76d6df91a8repo sync        getActivity().registerReceiver(mReceiver, mIntentFilter);
3105d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        if (mWifiP2pManager != null) {
3115d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng            mWifiP2pManager.requestPeers(mChannel, WifiP2pSettings.this);
3125d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        }
313b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
314b98463f8b0de186dc263217286449a76d6df91a8repo sync
315b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
316b98463f8b0de186dc263217286449a76d6df91a8repo sync    public void onPause() {
317b98463f8b0de186dc263217286449a76d6df91a8repo sync        super.onPause();
3185d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        if (mWifiP2pManager != null) {
3195d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng            mWifiP2pManager.stopPeerDiscovery(mChannel, null);
3205d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        }
321b98463f8b0de186dc263217286449a76d6df91a8repo sync        getActivity().unregisterReceiver(mReceiver);
322b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
323b98463f8b0de186dc263217286449a76d6df91a8repo sync
324b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
325b98463f8b0de186dc263217286449a76d6df91a8repo sync    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
3268c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        int textId = mWifiP2pSearching ? R.string.wifi_p2p_menu_searching :
3278c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                R.string.wifi_p2p_menu_search;
3288c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        menu.add(Menu.NONE, MENU_ID_SEARCH, 0, textId)
3298c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            .setEnabled(mWifiP2pEnabled)
330b98463f8b0de186dc263217286449a76d6df91a8repo sync            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
3318c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        menu.add(Menu.NONE, MENU_ID_RENAME, 0, R.string.wifi_p2p_menu_rename)
3328c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            .setEnabled(mWifiP2pEnabled)
333b98463f8b0de186dc263217286449a76d6df91a8repo sync            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
334b98463f8b0de186dc263217286449a76d6df91a8repo sync        super.onCreateOptionsMenu(menu, inflater);
335b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
336b98463f8b0de186dc263217286449a76d6df91a8repo sync
337b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
3388c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    public void onPrepareOptionsMenu(Menu menu) {
3398c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        MenuItem searchMenu = menu.findItem(MENU_ID_SEARCH);
3408c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        MenuItem renameMenu = menu.findItem(MENU_ID_RENAME);
3418c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        if (mWifiP2pEnabled) {
3428c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            searchMenu.setEnabled(true);
3438c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            renameMenu.setEnabled(true);
3448c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        } else {
3458c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            searchMenu.setEnabled(false);
3468c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            renameMenu.setEnabled(false);
3478c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        }
3488c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff
3498c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        if (mWifiP2pSearching) {
3508c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            searchMenu.setTitle(R.string.wifi_p2p_menu_searching);
3518c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        } else {
3528c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            searchMenu.setTitle(R.string.wifi_p2p_menu_search);
3538c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        }
3548c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    }
3558c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff
3568c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    @Override
357b98463f8b0de186dc263217286449a76d6df91a8repo sync    public boolean onOptionsItemSelected(MenuItem item) {
358b98463f8b0de186dc263217286449a76d6df91a8repo sync        switch (item.getItemId()) {
359b98463f8b0de186dc263217286449a76d6df91a8repo sync            case MENU_ID_SEARCH:
3608c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                startSearch();
361b98463f8b0de186dc263217286449a76d6df91a8repo sync                return true;
3628c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            case MENU_ID_RENAME:
36397617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                showDialog(DIALOG_RENAME);
364b98463f8b0de186dc263217286449a76d6df91a8repo sync                return true;
365b98463f8b0de186dc263217286449a76d6df91a8repo sync        }
366b98463f8b0de186dc263217286449a76d6df91a8repo sync        return super.onOptionsItemSelected(item);
367b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
368b98463f8b0de186dc263217286449a76d6df91a8repo sync
369b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
370b98463f8b0de186dc263217286449a76d6df91a8repo sync    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
371b98463f8b0de186dc263217286449a76d6df91a8repo sync        if (preference instanceof WifiP2pPeer) {
372b98463f8b0de186dc263217286449a76d6df91a8repo sync            mSelectedWifiPeer = (WifiP2pPeer) preference;
373ec10578884e3c23b3585bccde76e9c12978dda05Irfan Sheriff            if (mSelectedWifiPeer.device.status == WifiP2pDevice.CONNECTED) {
374b98463f8b0de186dc263217286449a76d6df91a8repo sync                showDialog(DIALOG_DISCONNECT);
375c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            } else if (mSelectedWifiPeer.device.status == WifiP2pDevice.INVITED) {
376c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                showDialog(DIALOG_CANCEL_CONNECT);
377b98463f8b0de186dc263217286449a76d6df91a8repo sync            } else {
3788c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                WifiP2pConfig config = new WifiP2pConfig();
3798c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                config.deviceAddress = mSelectedWifiPeer.device.deviceAddress;
3801e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff
3811e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                int forceWps = SystemProperties.getInt("wifidirect.wps", -1);
3821e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff
3831e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                if (forceWps != -1) {
3841e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                    config.wps.setup = forceWps;
3858c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                } else {
3861e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                    if (mSelectedWifiPeer.device.wpsPbcSupported()) {
3871e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                        config.wps.setup = WpsInfo.PBC;
3881e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                    } else if (mSelectedWifiPeer.device.wpsKeypadSupported()) {
3891e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                        config.wps.setup = WpsInfo.KEYPAD;
3901e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                    } else {
3911e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                        config.wps.setup = WpsInfo.DISPLAY;
3921e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff                    }
3938c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                }
3941e13143b3a40405a0e61d2b9219710e445878e43Irfan Sheriff
3958c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                mWifiP2pManager.connect(mChannel, config,
3968c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                        new WifiP2pManager.ActionListener() {
3978c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                            public void onSuccess() {
3988c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                if (DBG) Log.d(TAG, " connect success");
3998c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                            }
4008c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                            public void onFailure(int reason) {
4018c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                Log.e(TAG, " connect fail " + reason);
4028c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                Toast.makeText(getActivity(),
4038c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                        R.string.wifi_p2p_failed_connect_message,
4048c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                                        Toast.LENGTH_SHORT).show();
4058c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                            }
4068c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                    });
407b98463f8b0de186dc263217286449a76d6df91a8repo sync            }
408f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        } else if (preference instanceof WifiP2pPersistentGroup) {
409f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            mSelectedGroup = (WifiP2pPersistentGroup) preference;
410f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            showDialog(DIALOG_DELETE_GROUP);
411b98463f8b0de186dc263217286449a76d6df91a8repo sync        }
412b98463f8b0de186dc263217286449a76d6df91a8repo sync        return super.onPreferenceTreeClick(screen, preference);
413b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
414b98463f8b0de186dc263217286449a76d6df91a8repo sync
415b98463f8b0de186dc263217286449a76d6df91a8repo sync    @Override
416b98463f8b0de186dc263217286449a76d6df91a8repo sync    public Dialog onCreateDialog(int id) {
4178c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        if (id == DIALOG_DISCONNECT) {
4188c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            String deviceName = TextUtils.isEmpty(mSelectedWifiPeer.device.deviceName) ?
4198c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                    mSelectedWifiPeer.device.deviceAddress :
4208c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                    mSelectedWifiPeer.device.deviceName;
421db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            String msg;
422db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            if (mConnectedDevices > 1) {
423db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff                msg = getActivity().getString(R.string.wifi_p2p_disconnect_multiple_message,
424db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff                        deviceName, mConnectedDevices - 1);
425db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            } else {
426db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff                msg = getActivity().getString(R.string.wifi_p2p_disconnect_message, deviceName);
427db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            }
428b98463f8b0de186dc263217286449a76d6df91a8repo sync            AlertDialog dialog = new AlertDialog.Builder(getActivity())
4298c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                .setTitle(R.string.wifi_p2p_disconnect_title)
430db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff                .setMessage(msg)
431b98463f8b0de186dc263217286449a76d6df91a8repo sync                .setPositiveButton(getActivity().getString(R.string.dlg_ok), mDisconnectListener)
432b98463f8b0de186dc263217286449a76d6df91a8repo sync                .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
433b98463f8b0de186dc263217286449a76d6df91a8repo sync                .create();
434b98463f8b0de186dc263217286449a76d6df91a8repo sync            return dialog;
435c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff        } else if (id == DIALOG_CANCEL_CONNECT) {
436c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            int stringId = R.string.wifi_p2p_cancel_connect_message;
437c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            String deviceName = TextUtils.isEmpty(mSelectedWifiPeer.device.deviceName) ?
438c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                    mSelectedWifiPeer.device.deviceAddress :
439c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                    mSelectedWifiPeer.device.deviceName;
440c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff
441c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            AlertDialog dialog = new AlertDialog.Builder(getActivity())
442c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                .setTitle(R.string.wifi_p2p_cancel_connect_title)
443c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                .setMessage(getActivity().getString(stringId, deviceName))
444c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                .setPositiveButton(getActivity().getString(R.string.dlg_ok), mCancelConnectListener)
445c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
446c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff                .create();
447c08caf7a339677a7806e80f940d4d54690e4de92Irfan Sheriff            return dialog;
44897617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff        } else if (id == DIALOG_RENAME) {
44997617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff            mDeviceNameText = new EditText(getActivity());
450540f75aa922806f8af506188a36d30e9c4dbad87Irfan Sheriff            mDeviceNameText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(30)});
4515864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani            if (mSavedDeviceName != null) {
4525864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani                mDeviceNameText.setText(mSavedDeviceName);
4535864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani                mDeviceNameText.setSelection(mSavedDeviceName.length());
4545864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani            } else if (mThisDevice != null && !TextUtils.isEmpty(mThisDevice.deviceName)) {
4555864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani                mDeviceNameText.setText(mThisDevice.deviceName);
4565864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani                mDeviceNameText.setSelection(0, mThisDevice.deviceName.length());
4575864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani            }
4585864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani            mSavedDeviceName = null;
45997617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff            AlertDialog dialog = new AlertDialog.Builder(getActivity())
46097617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                .setTitle(R.string.wifi_p2p_menu_rename)
46197617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                .setView(mDeviceNameText)
46297617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                .setPositiveButton(getActivity().getString(R.string.dlg_ok), mRenameListener)
46397617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
46497617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff                .create();
46597617ce89e6f106f60a6ece48276a30b9fe8fdccIrfan Sheriff            return dialog;
466f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        } else if (id == DIALOG_DELETE_GROUP) {
467f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            int stringId = R.string.wifi_p2p_delete_group_message;
468f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga
469f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            AlertDialog dialog = new AlertDialog.Builder(getActivity())
470fb6faab59e63d4e48a9dc52b67bcf89a94f05079Irfan Sheriff                .setMessage(getActivity().getString(stringId))
471f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga                .setPositiveButton(getActivity().getString(R.string.dlg_ok), mDeleteGroupListener)
4721a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                .setNegativeButton(getActivity().getString(R.string.dlg_cancel),
4731a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                        mDeleteGroupListener).create();
474f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            return dialog;
475b98463f8b0de186dc263217286449a76d6df91a8repo sync        }
476b98463f8b0de186dc263217286449a76d6df91a8repo sync        return null;
477b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
478b98463f8b0de186dc263217286449a76d6df91a8repo sync
479db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff    @Override
480db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff    public void onSaveInstanceState(Bundle outState) {
481db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff        if (mSelectedWifiPeer != null) {
482db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff            outState.putParcelable(SAVE_DIALOG_PEER, mSelectedWifiPeer.device);
483db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff        }
4845864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani        if (mDeviceNameText != null) {
4855864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani            outState.putString(SAVE_DEVICE_NAME, mDeviceNameText.getText().toString());
4865864701197e9943a706cb9bf329975f428d7d1c8Amith Yamasani        }
4871a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        if (mSelectedGroup != null) {
4881a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            outState.putString(SAVE_SELECTED_GROUP, mSelectedGroup.getGroupName());
4891a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        }
490db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff    }
491db3d4bb8c489da99d23cd6e6713a6f1f10fb52bcIrfan Sheriff
4929f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff    private void handlePeersChanged() {
4938c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        mPeersGroup.removeAll();
4942592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff
4958c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        mConnectedDevices = 0;
4969f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff        if (DBG) Log.d(TAG, "List of available peers");
4979f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff        for (WifiP2pDevice peer: mPeers.getDeviceList()) {
4989f86b5df783ed063d1142f0050edbddf4fe3c7c2Irfan Sheriff            if (DBG) Log.d(TAG, "-> " + peer);
4998c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            mPeersGroup.addPreference(new WifiP2pPeer(getActivity(), peer));
5008c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            if (peer.status == WifiP2pDevice.CONNECTED) mConnectedDevices++;
5018c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        }
5026ac5554d3006451c2d0bf9250a6ac9e77d572b0dIrfan Sheriff        if (DBG) Log.d(TAG, " mConnectedDevices " + mConnectedDevices);
5038c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    }
504b98463f8b0de186dc263217286449a76d6df91a8repo sync
505acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng    @Override
506f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    public void onPersistentGroupInfoAvailable(WifiP2pGroupList groups) {
507f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        mPersistentGroup.removeAll();
508f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga
509f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        for (WifiP2pGroup group: groups.getGroupList()) {
510f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga            if (DBG) Log.d(TAG, " group " + group);
5111a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            WifiP2pPersistentGroup wppg = new WifiP2pPersistentGroup(getActivity(), group);
5121a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            mPersistentGroup.addPreference(wppg);
5131a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            if (wppg.getGroupName().equals(mSelectedGroupName)) {
5141a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                if (DBG) Log.d(TAG, "Selecting group " + wppg.getGroupName());
5151a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                mSelectedGroup = wppg;
5161a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde                mSelectedGroupName = null;
5171a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            }
5181a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        }
5191a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde        if (mSelectedGroupName != null) {
5201a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            // Looks like there's a dialog pending getting user confirmation to delete the
5211a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            // selected group. When user hits OK on that dialog, we won't do anything; but we
5221a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            // shouldn't be in this situation in first place, because these groups are persistent
5231a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            // groups and they shouldn't just get deleted!
5241a9819df165c6891248ca53e50ed44ac81a516beVinit Deshapnde            Log.w(TAG, " Selected group " + mSelectedGroupName + " disappered on next query ");
525f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga        }
526f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    }
527f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga
528acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng    @Override
5295d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng    public void onPeersAvailable(WifiP2pDeviceList peers) {
5305d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        if (DBG) Log.d(TAG, "Requested peers are available");
5315d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        mPeers = peers;
5325d2169eb6fa94ea84392138291735b69d0e384e5Yuhao Zheng        handlePeersChanged();
533f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga    }
534f3f14665a36544e8c4fb250ad5b4742091935963Yoshihiko Ikenaga
5358c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private void handleP2pStateChanged() {
5368c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        updateSearchMenu(false);
537acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng        mThisDevicePref.setEnabled(mWifiP2pEnabled);
538acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng        mPeersGroup.setEnabled(mWifiP2pEnabled);
539acac38011b6f596b6c74f568a53965acef4a477aYuhao Zheng        mPersistentGroup.setEnabled(mWifiP2pEnabled);
5408c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    }
5412592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff
5428c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private void updateSearchMenu(boolean searching) {
5438c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff       mWifiP2pSearching = searching;
5448c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff       Activity activity = getActivity();
5458c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff       if (activity != null) activity.invalidateOptionsMenu();
5468c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    }
5472592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff
5488c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff    private void startSearch() {
5498c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff        if (mWifiP2pManager != null && !mWifiP2pSearching) {
5508c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
5518c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                public void onSuccess() {
5528c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                }
5538c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                public void onFailure(int reason) {
5548c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                    if (DBG) Log.d(TAG, " discover fail " + reason);
5558c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff                }
5568c2ac71b34a00a863b2c3ddcd5b5dae1d9bd6a25Irfan Sheriff            });
5572592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff        }
5582592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff    }
5592592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff
5602592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff    private void updateDevicePref() {
5612592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff        if (mThisDevice != null) {
5622592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff            if (TextUtils.isEmpty(mThisDevice.deviceName)) {
5632592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff                mThisDevicePref.setTitle(mThisDevice.deviceAddress);
5642592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff            } else {
5652592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff                mThisDevicePref.setTitle(mThisDevice.deviceName);
5662592083c1fa0ab3f7e0f5bd5240160785c5544eeIrfan Sheriff            }
567b98463f8b0de186dc263217286449a76d6df91a8repo sync        }
568b98463f8b0de186dc263217286449a76d6df91a8repo sync    }
569b98463f8b0de186dc263217286449a76d6df91a8repo sync}
570