summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/TetherSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/TetherSettings.java')
-rw-r--r--src/com/android/settings/TetherSettings.java233
1 files changed, 200 insertions, 33 deletions
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index b924571..87726c1 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -16,22 +16,26 @@
package com.android.settings;
+import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.wifi.WifiApEnabler;
+import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.os.Bundle;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothPan;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetManager;
import android.net.ConnectivityManager;
+import android.os.Bundle;
import android.os.Environment;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
+import android.util.Log;
import android.webkit.WebView;
import java.io.InputStream;
@@ -41,10 +45,14 @@ import java.util.Locale;
/*
* Displays preferences for Tethering.
*/
-public class TetherSettings extends PreferenceActivity {
+public class TetherSettings extends SettingsPreferenceFragment {
+ private static final String TAG = "TetheringSettings";
+
private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
private static final String ENABLE_WIFI_AP = "enable_wifi_ap";
private static final String WIFI_AP_SETTINGS = "wifi_ap_settings";
+ private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
+ private static final String BLUETOOTH_TETHER_SETTINGS = "bluetooth_tether_settings";
private static final String TETHERING_HELP = "tethering_help";
private static final String USB_HELP_MODIFIER = "usb_";
private static final String WIFI_HELP_MODIFIER = "wifi_";
@@ -59,6 +67,10 @@ public class TetherSettings extends PreferenceActivity {
private CheckBoxPreference mEnableWifiAp;
private PreferenceScreen mWifiApSettings;
private WifiApEnabler mWifiApEnabler;
+
+ private CheckBoxPreference mBluetoothTether;
+ private PreferenceScreen mBluetoothSettings;
+
private PreferenceScreen mTetherHelp;
private BroadcastReceiver mTetherChangeReceiver;
@@ -67,48 +79,85 @@ public class TetherSettings extends PreferenceActivity {
private String[] mWifiRegexs;
+ private String[] mBluetoothRegexs;
+ private BluetoothPan mBluetoothPan;
+
@Override
- protected void onCreate(Bundle icicle) {
+ public void onCreate(Bundle icicle) {
super.onCreate(icicle);
-
addPreferencesFromResource(R.xml.tether_prefs);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ final Activity activity = getActivity();
+ mBluetoothPan = new BluetoothPan(activity);
mEnableWifiAp = (CheckBoxPreference) findPreference(ENABLE_WIFI_AP);
mWifiApSettings = (PreferenceScreen) findPreference(WIFI_AP_SETTINGS);
mUsbTether = (CheckBoxPreference) findPreference(USB_TETHER_SETTINGS);
+ mBluetoothTether = (CheckBoxPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
+ mBluetoothSettings = (PreferenceScreen) findPreference(BLUETOOTH_TETHER_SETTINGS);
mTetherHelp = (PreferenceScreen) findPreference(TETHERING_HELP);
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
mUsbRegexs = cm.getTetherableUsbRegexs();
- if (mUsbRegexs.length == 0) {
- getPreferenceScreen().removePreference(mUsbTether);
+ mWifiRegexs = cm.getTetherableWifiRegexs();
+ mBluetoothRegexs = cm.getTetherableBluetoothRegexs();
- setTitle(R.string.tether_settings_title_wifi);
- }
+ boolean usbAvailable = mUsbRegexs.length != 0;
+ boolean wifiAvailable = mWifiRegexs.length != 0;
+ boolean bluetoothAvailable = mBluetoothRegexs.length != 0;
- mWifiRegexs = cm.getTetherableWifiRegexs();
- if (mWifiRegexs.length == 0) {
+
+ if (!usbAvailable || Utils.isMonkeyRunning()) {
+ getPreferenceScreen().removePreference(mUsbTether);
+ }
+ if (!wifiAvailable) {
getPreferenceScreen().removePreference(mEnableWifiAp);
getPreferenceScreen().removePreference(mWifiApSettings);
-
- setTitle(R.string.tether_settings_title_usb);
- } else if (mUsbRegexs.length != 0) {
- // have both
- setTitle(R.string.tether_settings_title_both);
}
- mWifiApEnabler = new WifiApEnabler(this, mEnableWifiAp);
- mView = new WebView(this);
+ if (!bluetoothAvailable) {
+ getPreferenceScreen().removePreference(mBluetoothTether);
+ getPreferenceScreen().removePreference(mBluetoothSettings);
+ } else {
+ if (mBluetoothPan.isTetheringOn()) {
+ mBluetoothTether.setChecked(true);
+ mBluetoothSettings.setEnabled(true);
+ } else {
+ mBluetoothTether.setChecked(false);
+ mBluetoothSettings.setEnabled(false);
+ }
+ }
+ if (wifiAvailable && usbAvailable && bluetoothAvailable){
+ activity.setTitle(R.string.tether_settings_title_all);
+ } else if (wifiAvailable && usbAvailable){
+ activity.setTitle(R.string.tether_settings_title_all);
+ } else if (wifiAvailable && bluetoothAvailable){
+ activity.setTitle(R.string.tether_settings_title_all);
+ } else if (wifiAvailable) {
+ activity.setTitle(R.string.tether_settings_title_wifi);
+ } else if (usbAvailable && bluetoothAvailable) {
+ activity.setTitle(R.string.tether_settings_title_usb_bluetooth);
+ } else if (usbAvailable) {
+ activity.setTitle(R.string.tether_settings_title_usb);
+ } else {
+ activity.setTitle(R.string.tether_settings_title_bluetooth);
+ }
+ mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
+ mView = new WebView(activity);
}
@Override
- protected Dialog onCreateDialog(int id) {
+ public Dialog onCreateDialog(int id) {
if (id == DIALOG_TETHER_HELP) {
Locale locale = Locale.getDefault();
// check for the full language + country resource, if not there, try just language
- AssetManager am = getAssets();
+ final AssetManager am = getActivity().getAssets();
String path = HELP_PATH.replace("%y", locale.getLanguage().toLowerCase());
path = path.replace("%z", "_"+locale.getCountry().toLowerCase());
boolean useCountry = true;
@@ -138,7 +187,7 @@ public class TetherSettings extends PreferenceActivity {
mView.loadUrl(url);
- return new AlertDialog.Builder(this)
+ return new AlertDialog.Builder(getActivity())
.setCancelable(true)
.setTitle(R.string.tethering_help_button_text)
.setView(mView)
@@ -148,6 +197,7 @@ public class TetherSettings extends PreferenceActivity {
}
private class TetherChangeReceiver extends BroadcastReceiver {
+ @Override
public void onReceive(Context content, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) {
// TODO - this should understand the interface types
@@ -157,37 +207,46 @@ public class TetherSettings extends PreferenceActivity {
ConnectivityManager.EXTRA_ACTIVE_TETHER);
ArrayList<String> errored = intent.getStringArrayListExtra(
ConnectivityManager.EXTRA_ERRORED_TETHER);
- updateState((String[]) available.toArray(), (String[]) active.toArray(),
- (String[]) errored.toArray());
+ updateState(available.toArray(new String[available.size()]),
+ active.toArray(new String[active.size()]),
+ errored.toArray(new String[errored.size()]));
} else if (intent.getAction().equals(Intent.ACTION_MEDIA_SHARED) ||
intent.getAction().equals(Intent.ACTION_MEDIA_UNSHARED)) {
updateState();
+ } else if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+ updateState();
}
}
}
@Override
- protected void onResume() {
+ public void onResume() {
super.onResume();
- IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
+ final Activity activity = getActivity();
+
mTetherChangeReceiver = new TetherChangeReceiver();
- Intent intent = registerReceiver(mTetherChangeReceiver, filter);
+ IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
+ Intent intent = activity.registerReceiver(mTetherChangeReceiver, filter);
filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_SHARED);
filter.addAction(Intent.ACTION_MEDIA_UNSHARED);
filter.addDataScheme("file");
- registerReceiver(mTetherChangeReceiver, filter);
+ activity.registerReceiver(mTetherChangeReceiver, filter);
+
+ filter = new IntentFilter();
+ filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ activity.registerReceiver(mTetherChangeReceiver, filter);
- if (intent != null) mTetherChangeReceiver.onReceive(this, intent);
+ if (intent != null) mTetherChangeReceiver.onReceive(activity, intent);
mWifiApEnabler.resume();
}
@Override
- protected void onPause() {
+ public void onPause() {
super.onPause();
- unregisterReceiver(mTetherChangeReceiver);
+ getActivity().unregisterReceiver(mTetherChangeReceiver);
mTetherChangeReceiver = null;
mWifiApEnabler.pause();
}
@@ -204,6 +263,13 @@ public class TetherSettings extends PreferenceActivity {
private void updateState(String[] available, String[] tethered,
String[] errored) {
+ updateUsbState(available, tethered, errored);
+ updateBluetoothState(available, tethered, errored);
+ }
+
+
+ private void updateUsbState(String[] available, String[] tethered,
+ String[] errored) {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
boolean usbTethered = false;
@@ -260,8 +326,68 @@ public class TetherSettings extends PreferenceActivity {
}
}
+ private void updateBluetoothState(String[] available, String[] tethered,
+ String[] errored) {
+ ConnectivityManager cm =
+ (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+ boolean bluetoothTethered = false;
+ boolean bluetoothAvailable = false;
+ int bluetoothError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ boolean bluetoothErrored = false;
+ for (String s : available) {
+ for (String regex : mBluetoothRegexs) {
+ if (s.matches(regex)) {
+ bluetoothAvailable = true;
+ if (bluetoothError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ bluetoothError = cm.getLastTetherError(s);
+ }
+ }
+ }
+ }
+ for (String s : tethered) {
+ for (String regex : mBluetoothRegexs) {
+ if (s.matches(regex)) bluetoothTethered = true;
+ }
+ }
+ for (String s: errored) {
+ for (String regex : mBluetoothRegexs) {
+ if (s.matches(regex)) bluetoothErrored = true;
+ }
+ }
+
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ int btState = adapter.getState();
+ if (btState == BluetoothAdapter.STATE_TURNING_OFF) {
+ mBluetoothTether.setEnabled(false);
+ mBluetoothSettings.setEnabled(false);
+ mBluetoothTether.setSummary(R.string.wifi_stopping);
+ } else if (btState == BluetoothAdapter.STATE_TURNING_ON) {
+ mBluetoothTether.setEnabled(false);
+ mBluetoothSettings.setEnabled(false);
+ mBluetoothTether.setSummary(R.string.bluetooth_turning_on);
+ } else if (mBluetoothPan.isTetheringOn()) {
+ mBluetoothTether.setChecked(true);
+ if (btState == BluetoothAdapter.STATE_ON) {
+ mBluetoothTether.setEnabled(true);
+ mBluetoothSettings.setEnabled(true);
+ if (bluetoothTethered) {
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_connected_subtext);
+ } else if (bluetoothErrored) {
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
+ } else {
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
+ }
+ }
+ } else {
+ mBluetoothTether.setEnabled(true);
+ mBluetoothTether.setChecked(false);
+ mBluetoothSettings.setEnabled(false);
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
+ }
+ }
+
@Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
if (preference == mUsbTether) {
boolean newState = mUsbTether.isChecked();
@@ -296,11 +422,52 @@ public class TetherSettings extends PreferenceActivity {
}
mUsbTether.setSummary("");
}
- } else if (preference == mTetherHelp) {
+ } else if(preference == mBluetoothTether) {
+ boolean bluetoothTetherState = mBluetoothTether.isChecked();
+
+ if (bluetoothTetherState) {
+ // turn on Bluetooth first
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter.getState() == BluetoothAdapter.STATE_OFF) {
+ adapter.enable();
+ mBluetoothTether.setSummary(R.string.bluetooth_turning_on);
+ mBluetoothTether.setEnabled(false);
+ mBluetoothSettings.setEnabled(false);
+ } else {
+ mBluetoothSettings.setEnabled(true);
+ }
+
+ mBluetoothPan.setBluetoothTethering(true);
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
+ } else {
+ boolean errored = false;
+ ConnectivityManager cm =
+ (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+ String [] tethered = cm.getTetheredIfaces();
+ String bluetoothIface = findIface(tethered, mBluetoothRegexs);
+ if (bluetoothIface != null &&
+ cm.untether(bluetoothIface) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ errored = true;
+ }
+
+ mBluetoothPan.setBluetoothTethering(false);
+ mBluetoothSettings.setEnabled(false);
+ if (errored) {
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
+ } else {
+ mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
+ }
+ }
+ } else if (preference == mBluetoothSettings) {
+ preference.getExtras().putString(BluetoothSettings.ACTION,
+ BluetoothSettings.ACTION_LAUNCH_TETHER_PICKER);
+ } else if (preference == mTetherHelp) {
showDialog(DIALOG_TETHER_HELP);
+ return true;
}
- return false;
+
+ return super.onPreferenceTreeClick(screen, preference);
}
private String findIface(String[] ifaces, String[] regexes) {