WifiP2pSettings.java revision 9ef53578b8ef7da9c372b4fcd48ea760a0d9c305
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 17package com.android.settings.wifi.p2p; 18 19import android.app.ActionBar; 20import android.app.Activity; 21import android.app.AlertDialog; 22import android.app.Dialog; 23import android.content.BroadcastReceiver; 24import android.content.Context; 25import android.content.DialogInterface; 26import android.content.DialogInterface.OnClickListener; 27import android.content.Intent; 28import android.content.IntentFilter; 29import android.net.wifi.p2p.WifiP2pConfig; 30import android.net.wifi.p2p.WifiP2pDevice; 31import android.net.wifi.p2p.WifiP2pDeviceList; 32import android.net.wifi.p2p.WifiP2pManager; 33import android.os.Bundle; 34import android.os.Handler; 35import android.os.Message; 36import android.preference.Preference; 37import android.preference.PreferenceActivity; 38import android.preference.PreferenceScreen; 39import android.util.Log; 40import android.view.Gravity; 41import android.view.Menu; 42import android.view.MenuInflater; 43import android.view.MenuItem; 44import android.widget.Switch; 45 46import com.android.settings.R; 47import com.android.settings.SettingsPreferenceFragment; 48 49import java.util.Arrays; 50import java.util.List; 51import java.util.Collection; 52 53/* 54 * Displays Wi-fi p2p settings UI 55 */ 56public class WifiP2pSettings extends SettingsPreferenceFragment { 57 58 private static final String TAG = "WifiP2pSettings"; 59 private static final int MENU_ID_SEARCH = Menu.FIRST; 60 private static final int MENU_ID_CREATE_GROUP = Menu.FIRST + 1; 61 private static final int MENU_ID_ADVANCED = Menu.FIRST +2; 62 63 64 private final IntentFilter mIntentFilter = new IntentFilter(); 65 private final Handler mHandler = new WifiP2pHandler(); 66 private WifiP2pManager mWifiP2pManager; 67 private WifiP2pEnabler mWifiP2pEnabler; 68 private WifiP2pDialog mConnectDialog; 69 private OnClickListener mConnectListener; 70 private OnClickListener mDisconnectListener; 71 private WifiP2pPeer mSelectedWifiPeer; 72 73 private static final int DIALOG_CONNECT = 1; 74 private static final int DIALOG_DISCONNECT = 2; 75 76 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 77 @Override 78 public void onReceive(Context context, Intent intent) { 79 String action = intent.getAction(); 80 81 if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 82 //TODO: nothing right now 83 } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 84 if (mWifiP2pManager != null) mWifiP2pManager.requestPeers(); 85 } 86 } 87 }; 88 89 @Override 90 public void onCreate(Bundle icicle) { 91 super.onCreate(icicle); 92 addPreferencesFromResource(R.xml.wifi_p2p_settings); 93 94 mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 95 mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 96 97 final Activity activity = getActivity(); 98 mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 99 if (!mWifiP2pManager.connectHandler(activity, mHandler)) { 100 //Failure to set up connection 101 Log.e(TAG, "Failed to set up connection with wifi p2p service"); 102 mWifiP2pManager = null; 103 } 104 105 Switch actionBarSwitch = new Switch(activity); 106 107 if (activity instanceof PreferenceActivity) { 108 PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 109 if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { 110 final int padding = activity.getResources().getDimensionPixelSize( 111 R.dimen.action_bar_switch_padding); 112 actionBarSwitch.setPadding(0, 0, padding, 0); 113 activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 114 ActionBar.DISPLAY_SHOW_CUSTOM); 115 activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( 116 ActionBar.LayoutParams.WRAP_CONTENT, 117 ActionBar.LayoutParams.WRAP_CONTENT, 118 Gravity.CENTER_VERTICAL | Gravity.RIGHT)); 119 } 120 } 121 122 mWifiP2pEnabler = new WifiP2pEnabler(activity, actionBarSwitch); 123 124 //connect dialog listener 125 mConnectListener = new OnClickListener() { 126 @Override 127 public void onClick(DialogInterface dialog, int which) { 128 if (which == DialogInterface.BUTTON_POSITIVE) { 129 WifiP2pConfig config = mConnectDialog.getConfig(); 130 if (mWifiP2pManager != null) { 131 mWifiP2pManager.connect(config); 132 } 133 } 134 } 135 }; 136 137 //disconnect dialog listener 138 mDisconnectListener = new OnClickListener() { 139 @Override 140 public void onClick(DialogInterface dialog, int which) { 141 if (which == DialogInterface.BUTTON_POSITIVE) { 142 if (mWifiP2pManager != null) { 143 mWifiP2pManager.disconnect(); 144 } 145 } 146 } 147 }; 148 setHasOptionsMenu(true); 149 } 150 151 @Override 152 public void onResume() { 153 super.onResume(); 154 getActivity().registerReceiver(mReceiver, mIntentFilter); 155 if (mWifiP2pEnabler != null) { 156 mWifiP2pEnabler.resume(); 157 } 158 if (mWifiP2pManager != null) mWifiP2pManager.discoverPeers(); 159 } 160 161 @Override 162 public void onPause() { 163 super.onPause(); 164 if (mWifiP2pEnabler != null) { 165 mWifiP2pEnabler.pause(); 166 } 167 getActivity().unregisterReceiver(mReceiver); 168 } 169 170 @Override 171 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 172 menu.add(Menu.NONE, MENU_ID_SEARCH, 0, R.string.wifi_p2p_menu_search) 173 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 174 menu.add(Menu.NONE, MENU_ID_CREATE_GROUP, 0, R.string.wifi_p2p_menu_create_group) 175 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 176 menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_p2p_menu_advanced) 177 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 178 super.onCreateOptionsMenu(menu, inflater); 179 } 180 181 @Override 182 public boolean onOptionsItemSelected(MenuItem item) { 183 switch (item.getItemId()) { 184 case MENU_ID_SEARCH: 185 mWifiP2pManager.discoverPeers(); 186 return true; 187 case MENU_ID_CREATE_GROUP: 188 mWifiP2pManager.createGroup(); 189 return true; 190 case MENU_ID_ADVANCED: 191 //TODO: add advanced settings for p2p 192 return true; 193 } 194 return super.onOptionsItemSelected(item); 195 } 196 197 @Override 198 public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 199 if (preference instanceof WifiP2pPeer) { 200 mSelectedWifiPeer = (WifiP2pPeer) preference; 201 if (mSelectedWifiPeer.device.status == WifiP2pDevice.Status.CONNECTED) { 202 showDialog(DIALOG_DISCONNECT); 203 } else { 204 showDialog(DIALOG_CONNECT); 205 } 206 } 207 return super.onPreferenceTreeClick(screen, preference); 208 } 209 210 @Override 211 public Dialog onCreateDialog(int id) { 212 if (id == DIALOG_CONNECT) { 213 mConnectDialog = new WifiP2pDialog(getActivity(), mConnectListener, 214 mSelectedWifiPeer.device); 215 return mConnectDialog; 216 } else if (id == DIALOG_DISCONNECT) { 217 AlertDialog dialog = new AlertDialog.Builder(getActivity()) 218 .setTitle("Disconnect ?") 219 .setMessage("Do you want to disconnect ?") 220 .setPositiveButton(getActivity().getString(R.string.dlg_ok), mDisconnectListener) 221 .setNegativeButton(getActivity().getString(R.string.dlg_cancel), null) 222 .create(); 223 return dialog; 224 } 225 return null; 226 } 227 228 private void updatePeers(WifiP2pDeviceList peers) { 229 final PreferenceScreen preferenceScreen = getPreferenceScreen(); 230 preferenceScreen.removeAll(); 231 232 for (WifiP2pDevice peer: peers.getDeviceList()) { 233 preferenceScreen.addPreference(new WifiP2pPeer(getActivity(), peer)); 234 } 235 } 236 237 private class WifiP2pHandler extends Handler { 238 @Override 239 public void handleMessage(Message message) { 240 switch (message.what) { 241 case WifiP2pManager.HANDLER_DISCONNECTION: 242 //Failure to set up connection 243 Log.e(TAG, "Lost connection with wifi p2p service"); 244 mWifiP2pManager = null; 245 break; 246 case WifiP2pManager.RESPONSE_PEERS: 247 updatePeers(mWifiP2pManager.peersInResponse(message)); 248 break; 249 default: 250 //Ignore 251 break; 252 } 253 } 254 } 255 256} 257