• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.wifi.p2p;
18 
19 import android.app.Activity;
20 import android.app.AlertDialog;
21 import android.app.Dialog;
22 import android.content.BroadcastReceiver;
23 import android.content.Context;
24 import android.content.DialogInterface;
25 import android.content.DialogInterface.OnClickListener;
26 import android.content.Intent;
27 import android.content.IntentFilter;
28 import android.net.NetworkInfo;
29 import android.net.wifi.WpsInfo;
30 import android.net.wifi.p2p.WifiP2pConfig;
31 import android.net.wifi.p2p.WifiP2pDevice;
32 import android.net.wifi.p2p.WifiP2pDeviceList;
33 import android.net.wifi.p2p.WifiP2pGroup;
34 import android.net.wifi.p2p.WifiP2pGroupList;
35 import android.net.wifi.p2p.WifiP2pInfo;
36 import android.net.wifi.p2p.WifiP2pManager;
37 import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
38 import android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener;
39 import android.os.Bundle;
40 import android.os.SystemProperties;
41 import android.support.v7.preference.Preference;
42 import android.support.v7.preference.PreferenceScreen;
43 import android.text.InputFilter;
44 import android.text.TextUtils;
45 import android.util.Log;
46 import android.view.Menu;
47 import android.view.MenuInflater;
48 import android.view.MenuItem;
49 import android.widget.EditText;
50 import android.widget.Toast;
51 
52 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
53 import com.android.settings.R;
54 import com.android.settings.dashboard.DashboardFragment;
55 import com.android.settingslib.core.AbstractPreferenceController;
56 
57 import java.util.ArrayList;
58 import java.util.List;
59 
60 /*
61  * Displays Wi-fi p2p settings UI
62  */
63 public class WifiP2pSettings extends DashboardFragment
64         implements PersistentGroupInfoListener, PeerListListener {
65 
66     private static final String TAG = "WifiP2pSettings";
67     private static final boolean DBG = false;
68     private static final int MENU_ID_SEARCH = Menu.FIRST;
69     private static final int MENU_ID_RENAME = Menu.FIRST + 1;
70 
71     private final IntentFilter mIntentFilter = new IntentFilter();
72     private WifiP2pManager mWifiP2pManager;
73     private WifiP2pManager.Channel mChannel;
74     private OnClickListener mRenameListener;
75     private OnClickListener mDisconnectListener;
76     private OnClickListener mCancelConnectListener;
77     private OnClickListener mDeleteGroupListener;
78     private WifiP2pPeer mSelectedWifiPeer;
79     private WifiP2pPersistentGroup mSelectedGroup;
80     private String mSelectedGroupName;
81     private EditText mDeviceNameText;
82 
83     private boolean mWifiP2pEnabled;
84     private boolean mWifiP2pSearching;
85     private int mConnectedDevices;
86     private boolean mLastGroupFormed = false;
87 
88     private P2pPeerCategoryPreferenceController mPeerCategoryController;
89     private P2pPersistentCategoryPreferenceController mPersistentCategoryController;
90     private P2pThisDevicePreferenceController mThisDevicePreferenceController;
91 
92     private static final int DIALOG_DISCONNECT  = 1;
93     private static final int DIALOG_CANCEL_CONNECT = 2;
94     private static final int DIALOG_RENAME = 3;
95     private static final int DIALOG_DELETE_GROUP = 4;
96 
97     private static final String SAVE_DIALOG_PEER = "PEER_STATE";
98     private static final String SAVE_DEVICE_NAME = "DEV_NAME";
99     private static final String SAVE_SELECTED_GROUP = "GROUP_NAME";
100 
101     private WifiP2pDevice mThisDevice;
102     private WifiP2pDeviceList mPeers = new WifiP2pDeviceList();
103 
104     private String mSavedDeviceName;
105 
106     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
107         @Override
108         public void onReceive(Context context, Intent intent) {
109             String action = intent.getAction();
110 
111             if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
112                 mWifiP2pEnabled = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,
113                     WifiP2pManager.WIFI_P2P_STATE_DISABLED) == WifiP2pManager.WIFI_P2P_STATE_ENABLED;
114                 handleP2pStateChanged();
115             } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
116                 mPeers = (WifiP2pDeviceList) intent.getParcelableExtra(
117                         WifiP2pManager.EXTRA_P2P_DEVICE_LIST);
118                 handlePeersChanged();
119             } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
120                 if (mWifiP2pManager == null) return;
121                 NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(
122                         WifiP2pManager.EXTRA_NETWORK_INFO);
123                 WifiP2pInfo wifip2pinfo = (WifiP2pInfo) intent.getParcelableExtra(
124                         WifiP2pManager.EXTRA_WIFI_P2P_INFO);
125                 if (networkInfo.isConnected()) {
126                     if (DBG) Log.d(TAG, "Connected");
127                 } else if (mLastGroupFormed != true) {
128                     //start a search when we are disconnected
129                     //but not on group removed broadcast event
130                     startSearch();
131                 }
132                 mLastGroupFormed = wifip2pinfo.groupFormed;
133             } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
134                 mThisDevice = (WifiP2pDevice) intent.getParcelableExtra(
135                         WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
136                 if (DBG) Log.d(TAG, "Update device info: " + mThisDevice);
137                 mThisDevicePreferenceController.updateDeviceName(mThisDevice);
138             } else if (WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION.equals(action)) {
139                 int discoveryState = intent.getIntExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE,
140                     WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED);
141                 if (DBG) Log.d(TAG, "Discovery state changed: " + discoveryState);
142                 if (discoveryState == WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED) {
143                     updateSearchMenu(true);
144                 } else {
145                     updateSearchMenu(false);
146                 }
147             } else if (WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION.equals(action)) {
148                 if (mWifiP2pManager != null) {
149                     mWifiP2pManager.requestPersistentGroupInfo(mChannel, WifiP2pSettings.this);
150                 }
151             }
152         }
153     };
154 
155     @Override
getLogTag()156     protected String getLogTag() {
157         return TAG;
158     }
159 
160     @Override
getPreferenceScreenResId()161     protected int getPreferenceScreenResId() {
162         return R.xml.wifi_p2p_settings;
163     }
164 
165     @Override
getMetricsCategory()166     public int getMetricsCategory() {
167         return MetricsEvent.WIFI_P2P;
168     }
169 
170     @Override
getHelpResource()171     public int getHelpResource() {
172         return R.string.help_url_wifi_p2p;
173     }
174 
175     @Override
createPreferenceControllers(Context context)176     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
177         final List<AbstractPreferenceController> controllers = new ArrayList<>();
178         mPersistentCategoryController =
179                 new P2pPersistentCategoryPreferenceController(context);
180         mPeerCategoryController =
181                 new P2pPeerCategoryPreferenceController(context);
182         mThisDevicePreferenceController = new P2pThisDevicePreferenceController(context);
183         controllers.add(mPersistentCategoryController);
184         controllers.add(mPeerCategoryController);
185         controllers.add(mThisDevicePreferenceController);
186         return controllers;
187     }
188 
189     @Override
onActivityCreated(Bundle savedInstanceState)190     public void onActivityCreated(Bundle savedInstanceState) {
191         final Activity activity = getActivity();
192         mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
193         if (mWifiP2pManager != null) {
194             mChannel = mWifiP2pManager.initialize(activity.getApplicationContext(),
195                     getActivity().getMainLooper(), null);
196             if (mChannel == null) {
197                 //Failure to set up connection
198                 Log.e(TAG, "Failed to set up connection with wifi p2p service");
199                 mWifiP2pManager = null;
200             }
201         } else {
202             Log.e(TAG, "mWifiP2pManager is null !");
203         }
204 
205         if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_DIALOG_PEER)) {
206             WifiP2pDevice device = savedInstanceState.getParcelable(SAVE_DIALOG_PEER);
207             mSelectedWifiPeer = new WifiP2pPeer(getPrefContext(), device);
208         }
209         if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_DEVICE_NAME)) {
210             mSavedDeviceName = savedInstanceState.getString(SAVE_DEVICE_NAME);
211         }
212         if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_SELECTED_GROUP)) {
213             mSelectedGroupName = savedInstanceState.getString(SAVE_SELECTED_GROUP);
214         }
215 
216         mRenameListener = new OnClickListener() {
217             @Override
218             public void onClick(DialogInterface dialog, int which) {
219                 if (which == DialogInterface.BUTTON_POSITIVE) {
220                     if (mWifiP2pManager != null) {
221                         String name = mDeviceNameText.getText().toString();
222                         if (name != null) {
223                             for (int i = 0; i < name.length(); i++) {
224                                 char cur = name.charAt(i);
225                                 if(!Character.isDigit(cur) && !Character.isLetter(cur)
226                                         && cur != '-' && cur != '_' && cur != ' ') {
227                                     Toast.makeText(getActivity(),
228                                             R.string.wifi_p2p_failed_rename_message,
229                                             Toast.LENGTH_LONG).show();
230                                     return;
231                                 }
232                             }
233                         }
234                         mWifiP2pManager.setDeviceName(mChannel,
235                                 mDeviceNameText.getText().toString(),
236                                 new WifiP2pManager.ActionListener() {
237                             public void onSuccess() {
238                                 if (DBG) Log.d(TAG, " device rename success");
239                             }
240                             public void onFailure(int reason) {
241                                 Toast.makeText(getActivity(),
242                                         R.string.wifi_p2p_failed_rename_message,
243                                         Toast.LENGTH_LONG).show();
244                             }
245                         });
246                     }
247                 }
248             }
249         };
250 
251         //disconnect dialog listener
252         mDisconnectListener = new OnClickListener() {
253             @Override
254             public void onClick(DialogInterface dialog, int which) {
255                 if (which == DialogInterface.BUTTON_POSITIVE) {
256                     if (mWifiP2pManager != null) {
257                         mWifiP2pManager.removeGroup(mChannel, new WifiP2pManager.ActionListener() {
258                             public void onSuccess() {
259                                 if (DBG) Log.d(TAG, " remove group success");
260                             }
261                             public void onFailure(int reason) {
262                                 if (DBG) Log.d(TAG, " remove group fail " + reason);
263                             }
264                         });
265                     }
266                 }
267             }
268         };
269 
270         //cancel connect dialog listener
271         mCancelConnectListener = new OnClickListener() {
272             @Override
273             public void onClick(DialogInterface dialog, int which) {
274                 if (which == DialogInterface.BUTTON_POSITIVE) {
275                     if (mWifiP2pManager != null) {
276                         mWifiP2pManager.cancelConnect(mChannel,
277                                 new WifiP2pManager.ActionListener() {
278                             public void onSuccess() {
279                                 if (DBG) Log.d(TAG, " cancel connect success");
280                             }
281                             public void onFailure(int reason) {
282                                 if (DBG) Log.d(TAG, " cancel connect fail " + reason);
283                             }
284                         });
285                     }
286                 }
287             }
288         };
289 
290         //delete persistent group dialog listener
291         mDeleteGroupListener = new OnClickListener() {
292             @Override
293             public void onClick(DialogInterface dialog, int which) {
294                 if (which == DialogInterface.BUTTON_POSITIVE) {
295                     if (mWifiP2pManager != null) {
296                         if (mSelectedGroup != null) {
297                             if (DBG) Log.d(TAG, " deleting group " + mSelectedGroup.getGroupName());
298                             mWifiP2pManager.deletePersistentGroup(mChannel,
299                                     mSelectedGroup.getNetworkId(),
300                                     new WifiP2pManager.ActionListener() {
301                                         public void onSuccess() {
302                                             if (DBG) Log.d(TAG, " delete group success");
303                                         }
304 
305                                         public void onFailure(int reason) {
306                                             if (DBG) Log.d(TAG, " delete group fail " + reason);
307                                         }
308                                     });
309                             mSelectedGroup = null;
310                         } else {
311                             if (DBG) Log.w(TAG, " No selected group to delete!");
312                         }
313                     }
314                 } else if (which == DialogInterface.BUTTON_NEGATIVE) {
315                     if (DBG) {
316                         Log.d(TAG, " forgetting selected group " + mSelectedGroup.getGroupName());
317                     }
318                     mSelectedGroup = null;
319                 }
320             }
321         };
322 
323         super.onActivityCreated(savedInstanceState);
324     }
325 
326     @Override
onResume()327     public void onResume() {
328         super.onResume();
329         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
330         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
331         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
332         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
333         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION);
334         mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION);
335         final PreferenceScreen preferenceScreen = getPreferenceScreen();
336 
337         getActivity().registerReceiver(mReceiver, mIntentFilter);
338         if (mWifiP2pManager != null) {
339             mWifiP2pManager.requestPeers(mChannel, WifiP2pSettings.this);
340         }
341     }
342 
343     @Override
onPause()344     public void onPause() {
345         super.onPause();
346         if (mWifiP2pManager != null) {
347             mWifiP2pManager.stopPeerDiscovery(mChannel, null);
348         }
349         getActivity().unregisterReceiver(mReceiver);
350     }
351 
352     @Override
onCreateOptionsMenu(Menu menu, MenuInflater inflater)353     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
354         int textId = mWifiP2pSearching ? R.string.wifi_p2p_menu_searching :
355                 R.string.wifi_p2p_menu_search;
356         menu.add(Menu.NONE, MENU_ID_SEARCH, 0, textId)
357             .setEnabled(mWifiP2pEnabled)
358             .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
359         menu.add(Menu.NONE, MENU_ID_RENAME, 0, R.string.wifi_p2p_menu_rename)
360             .setEnabled(mWifiP2pEnabled)
361             .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
362         super.onCreateOptionsMenu(menu, inflater);
363     }
364 
365     @Override
onPrepareOptionsMenu(Menu menu)366     public void onPrepareOptionsMenu(Menu menu) {
367         MenuItem searchMenu = menu.findItem(MENU_ID_SEARCH);
368         MenuItem renameMenu = menu.findItem(MENU_ID_RENAME);
369         if (mWifiP2pEnabled) {
370             searchMenu.setEnabled(true);
371             renameMenu.setEnabled(true);
372         } else {
373             searchMenu.setEnabled(false);
374             renameMenu.setEnabled(false);
375         }
376 
377         if (mWifiP2pSearching) {
378             searchMenu.setTitle(R.string.wifi_p2p_menu_searching);
379         } else {
380             searchMenu.setTitle(R.string.wifi_p2p_menu_search);
381         }
382     }
383 
384     @Override
onOptionsItemSelected(MenuItem item)385     public boolean onOptionsItemSelected(MenuItem item) {
386         switch (item.getItemId()) {
387             case MENU_ID_SEARCH:
388                 startSearch();
389                 return true;
390             case MENU_ID_RENAME:
391                 showDialog(DIALOG_RENAME);
392                 return true;
393         }
394         return super.onOptionsItemSelected(item);
395     }
396 
397     @Override
onPreferenceTreeClick(Preference preference)398     public boolean onPreferenceTreeClick(Preference preference) {
399         if (preference instanceof WifiP2pPeer) {
400             mSelectedWifiPeer = (WifiP2pPeer) preference;
401             if (mSelectedWifiPeer.device.status == WifiP2pDevice.CONNECTED) {
402                 showDialog(DIALOG_DISCONNECT);
403             } else if (mSelectedWifiPeer.device.status == WifiP2pDevice.INVITED) {
404                 showDialog(DIALOG_CANCEL_CONNECT);
405             } else {
406                 WifiP2pConfig config = new WifiP2pConfig();
407                 config.deviceAddress = mSelectedWifiPeer.device.deviceAddress;
408 
409                 int forceWps = SystemProperties.getInt("wifidirect.wps", -1);
410 
411                 if (forceWps != -1) {
412                     config.wps.setup = forceWps;
413                 } else {
414                     if (mSelectedWifiPeer.device.wpsPbcSupported()) {
415                         config.wps.setup = WpsInfo.PBC;
416                     } else if (mSelectedWifiPeer.device.wpsKeypadSupported()) {
417                         config.wps.setup = WpsInfo.KEYPAD;
418                     } else {
419                         config.wps.setup = WpsInfo.DISPLAY;
420                     }
421                 }
422 
423                 mWifiP2pManager.connect(mChannel, config,
424                         new WifiP2pManager.ActionListener() {
425                             public void onSuccess() {
426                                 if (DBG) Log.d(TAG, " connect success");
427                             }
428                             public void onFailure(int reason) {
429                                 Log.e(TAG, " connect fail " + reason);
430                                 Toast.makeText(getActivity(),
431                                         R.string.wifi_p2p_failed_connect_message,
432                                         Toast.LENGTH_SHORT).show();
433                             }
434                     });
435             }
436         } else if (preference instanceof WifiP2pPersistentGroup) {
437             mSelectedGroup = (WifiP2pPersistentGroup) preference;
438             showDialog(DIALOG_DELETE_GROUP);
439         }
440         return super.onPreferenceTreeClick(preference);
441     }
442 
443     @Override
onCreateDialog(int id)444     public Dialog onCreateDialog(int id) {
445         if (id == DIALOG_DISCONNECT) {
446             String deviceName = TextUtils.isEmpty(mSelectedWifiPeer.device.deviceName) ?
447                     mSelectedWifiPeer.device.deviceAddress :
448                     mSelectedWifiPeer.device.deviceName;
449             String msg;
450             if (mConnectedDevices > 1) {
451                 msg = getActivity().getString(R.string.wifi_p2p_disconnect_multiple_message,
452                         deviceName, mConnectedDevices - 1);
453             } else {
454                 msg = getActivity().getString(R.string.wifi_p2p_disconnect_message, deviceName);
455             }
456             AlertDialog dialog = new AlertDialog.Builder(getActivity())
457                 .setTitle(R.string.wifi_p2p_disconnect_title)
458                 .setMessage(msg)
459                 .setPositiveButton(getActivity().getString(R.string.dlg_ok), mDisconnectListener)
460                 .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
461                 .create();
462             return dialog;
463         } else if (id == DIALOG_CANCEL_CONNECT) {
464             int stringId = R.string.wifi_p2p_cancel_connect_message;
465             String deviceName = TextUtils.isEmpty(mSelectedWifiPeer.device.deviceName) ?
466                     mSelectedWifiPeer.device.deviceAddress :
467                     mSelectedWifiPeer.device.deviceName;
468 
469             AlertDialog dialog = new AlertDialog.Builder(getActivity())
470                 .setTitle(R.string.wifi_p2p_cancel_connect_title)
471                 .setMessage(getActivity().getString(stringId, deviceName))
472                 .setPositiveButton(getActivity().getString(R.string.dlg_ok), mCancelConnectListener)
473                 .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
474                 .create();
475             return dialog;
476         } else if (id == DIALOG_RENAME) {
477             mDeviceNameText = new EditText(getActivity());
478             mDeviceNameText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(30)});
479             if (mSavedDeviceName != null) {
480                 mDeviceNameText.setText(mSavedDeviceName);
481                 mDeviceNameText.setSelection(mSavedDeviceName.length());
482             } else if (mThisDevice != null && !TextUtils.isEmpty(mThisDevice.deviceName)) {
483                 mDeviceNameText.setText(mThisDevice.deviceName);
484                 mDeviceNameText.setSelection(0, mThisDevice.deviceName.length());
485             }
486             mSavedDeviceName = null;
487             AlertDialog dialog = new AlertDialog.Builder(getActivity())
488                 .setTitle(R.string.wifi_p2p_menu_rename)
489                 .setView(mDeviceNameText)
490                 .setPositiveButton(getActivity().getString(R.string.dlg_ok), mRenameListener)
491                 .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null)
492                 .create();
493             return dialog;
494         } else if (id == DIALOG_DELETE_GROUP) {
495             int stringId = R.string.wifi_p2p_delete_group_message;
496 
497             AlertDialog dialog = new AlertDialog.Builder(getActivity())
498                 .setMessage(getActivity().getString(stringId))
499                 .setPositiveButton(getActivity().getString(R.string.dlg_ok), mDeleteGroupListener)
500                 .setNegativeButton(getActivity().getString(R.string.dlg_cancel),
501                         mDeleteGroupListener).create();
502             return dialog;
503         }
504         return null;
505     }
506 
507     @Override
getDialogMetricsCategory(int dialogId)508     public int getDialogMetricsCategory(int dialogId) {
509         switch (dialogId) {
510             case DIALOG_DISCONNECT:
511                 return MetricsEvent.DIALOG_WIFI_P2P_DISCONNECT;
512             case DIALOG_CANCEL_CONNECT:
513                 return MetricsEvent.DIALOG_WIFI_P2P_CANCEL_CONNECT;
514             case DIALOG_RENAME:
515                 return MetricsEvent.DIALOG_WIFI_P2P_RENAME;
516             case DIALOG_DELETE_GROUP:
517                 return MetricsEvent.DIALOG_WIFI_P2P_DELETE_GROUP;
518         }
519         return 0;
520     }
521 
522     @Override
onSaveInstanceState(Bundle outState)523     public void onSaveInstanceState(Bundle outState) {
524         if (mSelectedWifiPeer != null) {
525             outState.putParcelable(SAVE_DIALOG_PEER, mSelectedWifiPeer.device);
526         }
527         if (mDeviceNameText != null) {
528             outState.putString(SAVE_DEVICE_NAME, mDeviceNameText.getText().toString());
529         }
530         if (mSelectedGroup != null) {
531             outState.putString(SAVE_SELECTED_GROUP, mSelectedGroup.getGroupName());
532         }
533     }
534 
handlePeersChanged()535     private void handlePeersChanged() {
536         mPeerCategoryController.removeAllChildren();
537 
538         mConnectedDevices = 0;
539         if (DBG) Log.d(TAG, "List of available peers");
540         for (WifiP2pDevice peer: mPeers.getDeviceList()) {
541             if (DBG) Log.d(TAG, "-> " + peer);
542             mPeerCategoryController.addChild(new WifiP2pPeer(getPrefContext(), peer));
543             if (peer.status == WifiP2pDevice.CONNECTED) mConnectedDevices++;
544         }
545         if (DBG) Log.d(TAG, " mConnectedDevices " + mConnectedDevices);
546     }
547 
548     @Override
onPersistentGroupInfoAvailable(WifiP2pGroupList groups)549     public void onPersistentGroupInfoAvailable(WifiP2pGroupList groups) {
550         mPersistentCategoryController.removeAllChildren();
551 
552         for (WifiP2pGroup group: groups.getGroupList()) {
553             if (DBG) Log.d(TAG, " group " + group);
554             WifiP2pPersistentGroup wppg = new WifiP2pPersistentGroup(getPrefContext(), group);
555             mPersistentCategoryController.addChild(wppg);
556             if (wppg.getGroupName().equals(mSelectedGroupName)) {
557                 if (DBG) Log.d(TAG, "Selecting group " + wppg.getGroupName());
558                 mSelectedGroup = wppg;
559                 mSelectedGroupName = null;
560             }
561         }
562         if (mSelectedGroupName != null) {
563             // Looks like there's a dialog pending getting user confirmation to delete the
564             // selected group. When user hits OK on that dialog, we won't do anything; but we
565             // shouldn't be in this situation in first place, because these groups are persistent
566             // groups and they shouldn't just get deleted!
567             Log.w(TAG, " Selected group " + mSelectedGroupName + " disappered on next query ");
568         }
569     }
570 
571     @Override
onPeersAvailable(WifiP2pDeviceList peers)572     public void onPeersAvailable(WifiP2pDeviceList peers) {
573         if (DBG) Log.d(TAG, "Requested peers are available");
574         mPeers = peers;
575         handlePeersChanged();
576     }
577 
handleP2pStateChanged()578     private void handleP2pStateChanged() {
579         updateSearchMenu(false);
580         mThisDevicePreferenceController.setEnabled(mWifiP2pEnabled);
581         mPersistentCategoryController.setEnabled(mWifiP2pEnabled);
582         mPeerCategoryController.setEnabled(mWifiP2pEnabled);
583     }
584 
updateSearchMenu(boolean searching)585     private void updateSearchMenu(boolean searching) {
586        mWifiP2pSearching = searching;
587        Activity activity = getActivity();
588        if (activity != null) activity.invalidateOptionsMenu();
589     }
590 
startSearch()591     private void startSearch() {
592         if (mWifiP2pManager != null && !mWifiP2pSearching) {
593             mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
594                 public void onSuccess() {
595                 }
596                 public void onFailure(int reason) {
597                     if (DBG) Log.d(TAG, " discover fail " + reason);
598                 }
599             });
600         }
601     }
602 }
603