diff options
Diffstat (limited to 'src/com/android/settings/TetherSettings.java')
-rw-r--r-- | src/com/android/settings/TetherSettings.java | 233 |
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) { |