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