blob: 4ccd598d14b0810498fd78f5a78349a99842e5c9 [file] [log] [blame]
Robert Greenwalt3901edb2010-01-26 10:22:37 -08001/*
2 * Copyright (C) 2008 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;
18
Irfan Sheriff65cff172010-02-08 10:46:30 -080019import com.android.settings.wifi.WifiApEnabler;
20
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -070021import android.app.Activity;
Robert Greenwaltc3c93e52010-03-15 17:21:16 -070022import android.app.AlertDialog;
Irfan Sheriff0b266962010-04-06 15:16:44 -070023import android.app.Dialog;
Danica Chang32711b62010-08-10 18:41:29 -070024import android.bluetooth.BluetoothAdapter;
25import android.bluetooth.BluetoothPan;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080026import android.content.BroadcastReceiver;
27import android.content.Context;
28import android.content.Intent;
29import android.content.IntentFilter;
Robert Greenwalt4c3b2f02010-04-19 12:22:48 -070030import android.content.res.AssetManager;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080031import android.net.ConnectivityManager;
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -070032import android.os.Bundle;
Mike Lockwood26dad3e2010-03-03 06:19:55 -050033import android.os.Environment;
Robert Greenwalt209177a2010-03-04 13:29:02 -080034import android.preference.CheckBoxPreference;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080035import android.preference.Preference;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080036import android.preference.PreferenceScreen;
Amith Yamasani476d7952011-01-21 09:28:31 -080037import android.view.LayoutInflater;
38import android.view.View;
39import android.view.ViewGroup;
40import android.view.ViewParent;
Robert Greenwaltc3c93e52010-03-15 17:21:16 -070041import android.webkit.WebView;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080042
Robert Greenwalt4c3b2f02010-04-19 12:22:48 -070043import java.io.InputStream;
Robert Greenwaltc4764d22010-02-12 14:21:37 -080044import java.util.ArrayList;
Robert Greenwaltc3c93e52010-03-15 17:21:16 -070045import java.util.Locale;
Irfan Sheriff65cff172010-02-08 10:46:30 -080046
Robert Greenwalt3901edb2010-01-26 10:22:37 -080047/*
48 * Displays preferences for Tethering.
49 */
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -070050public class TetherSettings extends SettingsPreferenceFragment {
Danica Chang32711b62010-08-10 18:41:29 -070051 private static final String TAG = "TetheringSettings";
52
Robert Greenwalt3901edb2010-01-26 10:22:37 -080053 private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
Irfan Sheriff65cff172010-02-08 10:46:30 -080054 private static final String ENABLE_WIFI_AP = "enable_wifi_ap";
55 private static final String WIFI_AP_SETTINGS = "wifi_ap_settings";
Danica Chang32711b62010-08-10 18:41:29 -070056 private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
Robert Greenwaltc3c93e52010-03-15 17:21:16 -070057 private static final String TETHERING_HELP = "tethering_help";
Robert Greenwalt38925c02010-03-18 15:31:48 -070058 private static final String USB_HELP_MODIFIER = "usb_";
59 private static final String WIFI_HELP_MODIFIER = "wifi_";
Robert Greenwalt4c3b2f02010-04-19 12:22:48 -070060 private static final String HELP_URL = "file:///android_asset/html/%y%z/tethering_%xhelp.html";
61 private static final String HELP_PATH = "html/%y%z/tethering_help.html";
Robert Greenwalt3901edb2010-01-26 10:22:37 -080062
Irfan Sheriff0b266962010-04-06 15:16:44 -070063 private static final int DIALOG_TETHER_HELP = 1;
64
65 private WebView mView;
Robert Greenwalt209177a2010-03-04 13:29:02 -080066 private CheckBoxPreference mUsbTether;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080067
Irfan Sheriff65cff172010-02-08 10:46:30 -080068 private CheckBoxPreference mEnableWifiAp;
69 private PreferenceScreen mWifiApSettings;
70 private WifiApEnabler mWifiApEnabler;
Danica Chang32711b62010-08-10 18:41:29 -070071
72 private CheckBoxPreference mBluetoothTether;
Danica Chang32711b62010-08-10 18:41:29 -070073
Robert Greenwaltc3c93e52010-03-15 17:21:16 -070074 private PreferenceScreen mTetherHelp;
Irfan Sheriff65cff172010-02-08 10:46:30 -080075
Robert Greenwalt3901edb2010-01-26 10:22:37 -080076 private BroadcastReceiver mTetherChangeReceiver;
77
Robert Greenwaltc4764d22010-02-12 14:21:37 -080078 private String[] mUsbRegexs;
Robert Greenwaltc4764d22010-02-12 14:21:37 -080079
80 private String[] mWifiRegexs;
Robert Greenwaltc4764d22010-02-12 14:21:37 -080081
Danica Chang32711b62010-08-10 18:41:29 -070082 private String[] mBluetoothRegexs;
83 private BluetoothPan mBluetoothPan;
84
Robert Greenwalt3901edb2010-01-26 10:22:37 -080085 @Override
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -070086 public void onCreate(Bundle icicle) {
Robert Greenwalt3901edb2010-01-26 10:22:37 -080087 super.onCreate(icicle);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080088 addPreferencesFromResource(R.xml.tether_prefs);
Amith Yamasani476d7952011-01-21 09:28:31 -080089
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -070090 final Activity activity = getActivity();
91 mBluetoothPan = new BluetoothPan(activity);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080092
Irfan Sheriff65cff172010-02-08 10:46:30 -080093 mEnableWifiAp = (CheckBoxPreference) findPreference(ENABLE_WIFI_AP);
94 mWifiApSettings = (PreferenceScreen) findPreference(WIFI_AP_SETTINGS);
Robert Greenwalt209177a2010-03-04 13:29:02 -080095 mUsbTether = (CheckBoxPreference) findPreference(USB_TETHER_SETTINGS);
Danica Chang32711b62010-08-10 18:41:29 -070096 mBluetoothTether = (CheckBoxPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
Robert Greenwaltc3c93e52010-03-15 17:21:16 -070097 mTetherHelp = (PreferenceScreen) findPreference(TETHERING_HELP);
Robert Greenwaltc4764d22010-02-12 14:21:37 -080098
99 ConnectivityManager cm =
100 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Irfan Sheriff47ebb782010-03-10 08:27:15 -0800101
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800102 mUsbRegexs = cm.getTetherableUsbRegexs();
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800103 mWifiRegexs = cm.getTetherableWifiRegexs();
Danica Chang32711b62010-08-10 18:41:29 -0700104 mBluetoothRegexs = cm.getTetherableBluetoothRegexs();
105
Amith Yamasanie419bc12011-02-14 14:19:08 -0800106 final boolean usbAvailable = mUsbRegexs.length != 0;
107 final boolean wifiAvailable = mWifiRegexs.length != 0;
108 final boolean bluetoothAvailable = mBluetoothRegexs.length != 0;
Danica Chang32711b62010-08-10 18:41:29 -0700109
Danica Chang32711b62010-08-10 18:41:29 -0700110 if (!usbAvailable || Utils.isMonkeyRunning()) {
111 getPreferenceScreen().removePreference(mUsbTether);
112 }
Amith Yamasanie419bc12011-02-14 14:19:08 -0800113
Danica Chang32711b62010-08-10 18:41:29 -0700114 if (!wifiAvailable) {
Irfan Sheriff65cff172010-02-08 10:46:30 -0800115 getPreferenceScreen().removePreference(mEnableWifiAp);
116 getPreferenceScreen().removePreference(mWifiApSettings);
Danica Chang32711b62010-08-10 18:41:29 -0700117 }
Amith Yamasanie419bc12011-02-14 14:19:08 -0800118
Danica Chang32711b62010-08-10 18:41:29 -0700119 if (!bluetoothAvailable) {
120 getPreferenceScreen().removePreference(mBluetoothTether);
Danica Chang32711b62010-08-10 18:41:29 -0700121 } else {
122 if (mBluetoothPan.isTetheringOn()) {
123 mBluetoothTether.setChecked(true);
Danica Chang32711b62010-08-10 18:41:29 -0700124 } else {
125 mBluetoothTether.setChecked(false);
Danica Chang32711b62010-08-10 18:41:29 -0700126 }
127 }
Amith Yamasanie419bc12011-02-14 14:19:08 -0800128
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700129 mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
130 mView = new WebView(activity);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800131 }
132
Irfan Sheriff0b266962010-04-06 15:16:44 -0700133 @Override
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700134 public Dialog onCreateDialog(int id) {
Irfan Sheriff0b266962010-04-06 15:16:44 -0700135 if (id == DIALOG_TETHER_HELP) {
136 Locale locale = Locale.getDefault();
Irfan Sheriff0b266962010-04-06 15:16:44 -0700137
Robert Greenwalt4c3b2f02010-04-19 12:22:48 -0700138 // check for the full language + country resource, if not there, try just language
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700139 final AssetManager am = getActivity().getAssets();
Robert Greenwalt4c3b2f02010-04-19 12:22:48 -0700140 String path = HELP_PATH.replace("%y", locale.getLanguage().toLowerCase());
141 path = path.replace("%z", "_"+locale.getCountry().toLowerCase());
142 boolean useCountry = true;
143 InputStream is = null;
144 try {
145 is = am.open(path);
146 } catch (Exception e) {
147 useCountry = false;
148 } finally {
149 if (is != null) {
150 try {
151 is.close();
152 } catch (Exception e) {}
153 }
154 }
155 String url = HELP_URL.replace("%y", locale.getLanguage().toLowerCase());
156 url = url.replace("%z", (useCountry ? "_"+locale.getCountry().toLowerCase() : ""));
Irfan Sheriff0b266962010-04-06 15:16:44 -0700157 if ((mUsbRegexs.length != 0) && (mWifiRegexs.length == 0)) {
158 url = url.replace("%x", USB_HELP_MODIFIER);
159 } else if ((mWifiRegexs.length != 0) && (mUsbRegexs.length == 0)) {
160 url = url.replace("%x", WIFI_HELP_MODIFIER);
161 } else {
162 // could assert that both wifi and usb have regexs, but the default
163 // is to use this anyway so no check is needed
164 url = url.replace("%x", "");
165 }
Robert Greenwalt4c3b2f02010-04-19 12:22:48 -0700166
Irfan Sheriff0b266962010-04-06 15:16:44 -0700167 mView.loadUrl(url);
Amith Yamasani476d7952011-01-21 09:28:31 -0800168 // Detach from old parent first
169 ViewParent parent = mView.getParent();
170 if (parent != null && parent instanceof ViewGroup) {
171 ((ViewGroup) parent).removeView(mView);
172 }
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700173 return new AlertDialog.Builder(getActivity())
Irfan Sheriff0b266962010-04-06 15:16:44 -0700174 .setCancelable(true)
175 .setTitle(R.string.tethering_help_button_text)
176 .setView(mView)
177 .create();
178 }
179 return null;
180 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800181
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800182 private class TetherChangeReceiver extends BroadcastReceiver {
Danica Chang32711b62010-08-10 18:41:29 -0700183 @Override
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800184 public void onReceive(Context content, Intent intent) {
Robert Greenwalta2488762010-03-10 16:57:08 -0800185 if (intent.getAction().equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) {
186 // TODO - this should understand the interface types
187 ArrayList<String> available = intent.getStringArrayListExtra(
188 ConnectivityManager.EXTRA_AVAILABLE_TETHER);
189 ArrayList<String> active = intent.getStringArrayListExtra(
190 ConnectivityManager.EXTRA_ACTIVE_TETHER);
191 ArrayList<String> errored = intent.getStringArrayListExtra(
192 ConnectivityManager.EXTRA_ERRORED_TETHER);
Danica Chang32711b62010-08-10 18:41:29 -0700193 updateState(available.toArray(new String[available.size()]),
194 active.toArray(new String[active.size()]),
195 errored.toArray(new String[errored.size()]));
Robert Greenwalta2488762010-03-10 16:57:08 -0800196 } else if (intent.getAction().equals(Intent.ACTION_MEDIA_SHARED) ||
197 intent.getAction().equals(Intent.ACTION_MEDIA_UNSHARED)) {
198 updateState();
Danica Chang32711b62010-08-10 18:41:29 -0700199 } else if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
200 updateState();
Robert Greenwalta2488762010-03-10 16:57:08 -0800201 }
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800202 }
203 }
204
205 @Override
Amith Yamasani02cf71a2010-09-21 15:48:52 -0700206 public void onStart() {
207 super.onStart();
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800208
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700209 final Activity activity = getActivity();
210
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800211 mTetherChangeReceiver = new TetherChangeReceiver();
Danica Chang32711b62010-08-10 18:41:29 -0700212 IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700213 Intent intent = activity.registerReceiver(mTetherChangeReceiver, filter);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800214
Robert Greenwaltf0ed2f32010-03-12 10:28:35 -0800215 filter = new IntentFilter();
216 filter.addAction(Intent.ACTION_MEDIA_SHARED);
217 filter.addAction(Intent.ACTION_MEDIA_UNSHARED);
218 filter.addDataScheme("file");
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700219 activity.registerReceiver(mTetherChangeReceiver, filter);
Robert Greenwaltf0ed2f32010-03-12 10:28:35 -0800220
Danica Chang32711b62010-08-10 18:41:29 -0700221 filter = new IntentFilter();
222 filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700223 activity.registerReceiver(mTetherChangeReceiver, filter);
Danica Chang32711b62010-08-10 18:41:29 -0700224
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700225 if (intent != null) mTetherChangeReceiver.onReceive(activity, intent);
Irfan Sheriff65cff172010-02-08 10:46:30 -0800226 mWifiApEnabler.resume();
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800227 }
228
229 @Override
Amith Yamasani02cf71a2010-09-21 15:48:52 -0700230 public void onStop() {
231 super.onStop();
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700232 getActivity().unregisterReceiver(mTetherChangeReceiver);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800233 mTetherChangeReceiver = null;
Irfan Sheriff65cff172010-02-08 10:46:30 -0800234 mWifiApEnabler.pause();
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800235 }
236
Robert Greenwalt209177a2010-03-04 13:29:02 -0800237 private void updateState() {
238 ConnectivityManager cm =
239 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
240
241 String[] available = cm.getTetherableIfaces();
242 String[] tethered = cm.getTetheredIfaces();
243 String[] errored = cm.getTetheringErroredIfaces();
244 updateState(available, tethered, errored);
245 }
246
Ben Clark0008d212010-07-27 16:20:59 +0100247 private void updateState(String[] available, String[] tethered,
248 String[] errored) {
Danica Chang32711b62010-08-10 18:41:29 -0700249 updateUsbState(available, tethered, errored);
250 updateBluetoothState(available, tethered, errored);
251 }
252
253
254 private void updateUsbState(String[] available, String[] tethered,
255 String[] errored) {
Robert Greenwalt209177a2010-03-04 13:29:02 -0800256 ConnectivityManager cm =
257 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800258 boolean usbTethered = false;
259 boolean usbAvailable = false;
Robert Greenwalt209177a2010-03-04 13:29:02 -0800260 int usbError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800261 boolean usbErrored = false;
Mike Lockwood26dad3e2010-03-03 06:19:55 -0500262 boolean massStorageActive =
263 Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
Ben Clark0008d212010-07-27 16:20:59 +0100264 for (String s : available) {
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800265 for (String regex : mUsbRegexs) {
Robert Greenwalt209177a2010-03-04 13:29:02 -0800266 if (s.matches(regex)) {
267 usbAvailable = true;
268 if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
269 usbError = cm.getLastTetherError(s);
270 }
271 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800272 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800273 }
Ben Clark0008d212010-07-27 16:20:59 +0100274 for (String s : tethered) {
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800275 for (String regex : mUsbRegexs) {
276 if (s.matches(regex)) usbTethered = true;
277 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800278 }
Ben Clark0008d212010-07-27 16:20:59 +0100279 for (String s: errored) {
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800280 for (String regex : mUsbRegexs) {
281 if (s.matches(regex)) usbErrored = true;
282 }
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800283 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800284
285 if (usbTethered) {
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800286 mUsbTether.setSummary(R.string.usb_tethering_active_subtext);
287 mUsbTether.setEnabled(true);
Robert Greenwalt204e7c12010-03-05 19:00:30 -0800288 mUsbTether.setChecked(true);
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800289 } else if (usbAvailable) {
Robert Greenwalt209177a2010-03-04 13:29:02 -0800290 if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
291 mUsbTether.setSummary(R.string.usb_tethering_available_subtext);
292 } else {
293 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
294 }
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800295 mUsbTether.setEnabled(true);
Robert Greenwalt204e7c12010-03-05 19:00:30 -0800296 mUsbTether.setChecked(false);
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800297 } else if (usbErrored) {
298 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
299 mUsbTether.setEnabled(false);
Robert Greenwalt204e7c12010-03-05 19:00:30 -0800300 mUsbTether.setChecked(false);
Robert Greenwalta2488762010-03-10 16:57:08 -0800301 } else if (massStorageActive) {
302 mUsbTether.setSummary(R.string.usb_tethering_storage_active_subtext);
303 mUsbTether.setEnabled(false);
304 mUsbTether.setChecked(false);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800305 } else {
306 mUsbTether.setSummary(R.string.usb_tethering_unavailable_subtext);
307 mUsbTether.setEnabled(false);
Robert Greenwalt204e7c12010-03-05 19:00:30 -0800308 mUsbTether.setChecked(false);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800309 }
310 }
Robert Greenwalt209177a2010-03-04 13:29:02 -0800311
Danica Chang32711b62010-08-10 18:41:29 -0700312 private void updateBluetoothState(String[] available, String[] tethered,
313 String[] errored) {
314 ConnectivityManager cm =
315 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
316 boolean bluetoothTethered = false;
317 boolean bluetoothAvailable = false;
318 int bluetoothError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
319 boolean bluetoothErrored = false;
320 for (String s : available) {
321 for (String regex : mBluetoothRegexs) {
322 if (s.matches(regex)) {
323 bluetoothAvailable = true;
324 if (bluetoothError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
325 bluetoothError = cm.getLastTetherError(s);
326 }
327 }
328 }
329 }
330 for (String s : tethered) {
331 for (String regex : mBluetoothRegexs) {
332 if (s.matches(regex)) bluetoothTethered = true;
333 }
334 }
335 for (String s: errored) {
336 for (String regex : mBluetoothRegexs) {
337 if (s.matches(regex)) bluetoothErrored = true;
338 }
339 }
340
341 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
342 int btState = adapter.getState();
343 if (btState == BluetoothAdapter.STATE_TURNING_OFF) {
344 mBluetoothTether.setEnabled(false);
Danica Chang32711b62010-08-10 18:41:29 -0700345 mBluetoothTether.setSummary(R.string.wifi_stopping);
346 } else if (btState == BluetoothAdapter.STATE_TURNING_ON) {
347 mBluetoothTether.setEnabled(false);
Danica Chang32711b62010-08-10 18:41:29 -0700348 mBluetoothTether.setSummary(R.string.bluetooth_turning_on);
349 } else if (mBluetoothPan.isTetheringOn()) {
350 mBluetoothTether.setChecked(true);
351 if (btState == BluetoothAdapter.STATE_ON) {
352 mBluetoothTether.setEnabled(true);
Danica Chang32711b62010-08-10 18:41:29 -0700353 if (bluetoothTethered) {
354 mBluetoothTether.setSummary(R.string.bluetooth_tethering_connected_subtext);
355 } else if (bluetoothErrored) {
356 mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
357 } else {
358 mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
359 }
360 }
361 } else {
362 mBluetoothTether.setEnabled(true);
363 mBluetoothTether.setChecked(false);
Danica Chang32711b62010-08-10 18:41:29 -0700364 mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
365 }
366 }
367
Robert Greenwalt209177a2010-03-04 13:29:02 -0800368 @Override
Daisuke Miyakawa6ebf8612010-09-10 09:48:51 -0700369 public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
Robert Greenwalt209177a2010-03-04 13:29:02 -0800370 if (preference == mUsbTether) {
371 boolean newState = mUsbTether.isChecked();
372
373 ConnectivityManager cm =
374 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
375
376 if (newState) {
377 String[] available = cm.getTetherableIfaces();
378
379 String usbIface = findIface(available, mUsbRegexs);
380 if (usbIface == null) {
381 updateState();
382 return true;
383 }
384 if (cm.tether(usbIface) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
385 mUsbTether.setChecked(false);
386 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
387 return true;
388 }
389 mUsbTether.setSummary("");
390 } else {
391 String [] tethered = cm.getTetheredIfaces();
392
393 String usbIface = findIface(tethered, mUsbRegexs);
394 if (usbIface == null) {
395 updateState();
396 return true;
397 }
398 if (cm.untether(usbIface) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
399 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
400 return true;
401 }
402 mUsbTether.setSummary("");
403 }
Danica Chang32711b62010-08-10 18:41:29 -0700404 } else if(preference == mBluetoothTether) {
405 boolean bluetoothTetherState = mBluetoothTether.isChecked();
Robert Greenwalt38925c02010-03-18 15:31:48 -0700406
Danica Chang32711b62010-08-10 18:41:29 -0700407 if (bluetoothTetherState) {
408 // turn on Bluetooth first
409 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
410 if (adapter.getState() == BluetoothAdapter.STATE_OFF) {
411 adapter.enable();
412 mBluetoothTether.setSummary(R.string.bluetooth_turning_on);
413 mBluetoothTether.setEnabled(false);
Danica Chang32711b62010-08-10 18:41:29 -0700414 }
415
Jaikumar Ganeshd2bed692010-09-02 12:11:06 -0700416 mBluetoothPan.setBluetoothTethering(true);
Danica Chang32711b62010-08-10 18:41:29 -0700417 mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
418 } else {
419 boolean errored = false;
420
421 ConnectivityManager cm =
422 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
423 String [] tethered = cm.getTetheredIfaces();
424 String bluetoothIface = findIface(tethered, mBluetoothRegexs);
425 if (bluetoothIface != null &&
426 cm.untether(bluetoothIface) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
427 errored = true;
428 }
429
Jaikumar Ganeshd2bed692010-09-02 12:11:06 -0700430 mBluetoothPan.setBluetoothTethering(false);
Danica Chang32711b62010-08-10 18:41:29 -0700431 if (errored) {
432 mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
433 } else {
434 mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
435 }
436 }
437 } else if (preference == mTetherHelp) {
Irfan Sheriff0b266962010-04-06 15:16:44 -0700438 showDialog(DIALOG_TETHER_HELP);
Daisuke Miyakawa6ebf8612010-09-10 09:48:51 -0700439 return true;
Robert Greenwalt209177a2010-03-04 13:29:02 -0800440 }
Daisuke Miyakawa9c602c42010-09-10 12:04:37 -0700441
Daisuke Miyakawa6ebf8612010-09-10 09:48:51 -0700442 return super.onPreferenceTreeClick(screen, preference);
Robert Greenwalt209177a2010-03-04 13:29:02 -0800443 }
444
445 private String findIface(String[] ifaces, String[] regexes) {
446 for (String iface : ifaces) {
447 for (String regex : regexes) {
448 if (iface.matches(regex)) {
449 return iface;
450 }
451 }
452 }
453 return null;
454 }
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800455}