diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java index 4ccd598d14b..2ff32541d04 100644 --- a/src/com/android/settings/TetherSettings.java +++ b/src/com/android/settings/TetherSettings.java @@ -23,6 +23,7 @@ import android.app.AlertDialog; import android.app.Dialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothPan; +import android.bluetooth.BluetoothProfile; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -88,7 +89,12 @@ public class TetherSettings extends SettingsPreferenceFragment { addPreferencesFromResource(R.xml.tether_prefs); final Activity activity = getActivity(); - mBluetoothPan = new BluetoothPan(activity); + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if (adapter != null) { + adapter.getProfileProxy(activity.getApplicationContext(), mProfileServiceListener, + BluetoothProfile.PAN); + } + mEnableWifiAp = (CheckBoxPreference) findPreference(ENABLE_WIFI_AP); mWifiApSettings = (PreferenceScreen) findPreference(WIFI_AP_SETTINGS); @@ -119,7 +125,7 @@ public class TetherSettings extends SettingsPreferenceFragment { if (!bluetoothAvailable) { getPreferenceScreen().removePreference(mBluetoothTether); } else { - if (mBluetoothPan.isTetheringOn()) { + if (mBluetoothPan != null && mBluetoothPan.isTetheringOn()) { mBluetoothTether.setChecked(true); } else { mBluetoothTether.setChecked(false); @@ -130,6 +136,16 @@ public class TetherSettings extends SettingsPreferenceFragment { mView = new WebView(activity); } + private BluetoothProfile.ServiceListener mProfileServiceListener = + new BluetoothProfile.ServiceListener() { + public void onServiceConnected(int profile, BluetoothProfile proxy) { + mBluetoothPan = (BluetoothPan) proxy; + } + public void onServiceDisconnected(int profile) { + mBluetoothPan = null; + } + }; + @Override public Dialog onCreateDialog(int id) { if (id == DIALOG_TETHER_HELP) { diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java index fa0c2c3c64c..31747504c40 100644 --- a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java +++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java @@ -139,14 +139,14 @@ class BluetoothEventRedirector { mManager.getCachedDeviceManager().onProfileStateChanged(device, Profile.HID, newState); - } else if (action.equals(BluetoothPan.ACTION_PAN_STATE_CHANGED)) { + } else if (action.equals(BluetoothPan.ACTION_CONNECTION_STATE_CHANGED)) { final int role = intent.getIntExtra( BluetoothPan.EXTRA_LOCAL_ROLE, 0); if (role == BluetoothPan.LOCAL_PANU_ROLE) { final int newState = intent.getIntExtra( - BluetoothPan.EXTRA_PAN_STATE, 0); + BluetoothPan.EXTRA_STATE, 0); final int oldState = intent.getIntExtra( - BluetoothPan.EXTRA_PREVIOUS_PAN_STATE, 0); + BluetoothPan.EXTRA_PREVIOUS_STATE, 0); if (newState == BluetoothPan.STATE_DISCONNECTED && oldState == BluetoothPan.STATE_CONNECTING) { Log.i(TAG, "Failed to connect BT PAN"); @@ -199,7 +199,7 @@ class BluetoothEventRedirector { filter.addAction(BluetoothDevice.ACTION_PAIRING_CANCEL); // Fine-grained state broadcasts - filter.addAction(BluetoothPan.ACTION_PAN_STATE_CHANGED); + filter.addAction(BluetoothPan.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java index 889cb8ae3f9..164d2da32ae 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java @@ -736,12 +736,22 @@ abstract class LocalBluetoothProfileManager { } } - private static class PanProfileManager extends LocalBluetoothProfileManager { - private final BluetoothPan mService; + private static class PanProfileManager extends LocalBluetoothProfileManager + implements BluetoothProfile.ServiceListener { + private BluetoothPan mService; public PanProfileManager(LocalBluetoothManager localManager) { super(localManager); - mService = new BluetoothPan(localManager.getContext()); + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + adapter.getProfileProxy(localManager.getContext(), this, BluetoothProfile.PAN); + } + + public void onServiceConnected(int profile, BluetoothProfile proxy) { + mService = (BluetoothPan) proxy; + } + + public void onServiceDisconnected(int profile) { + mService = null; } @Override @@ -799,7 +809,7 @@ abstract class LocalBluetoothProfileManager { @Override public int getConnectionStatus(BluetoothDevice device) { - return convertState(mService.getPanDeviceState(device)); + return convertState(mService.getConnectionState(device)); } @Override