diff options
author | fredc <fredc@broadcom.com> | 2012-05-08 17:56:24 -0700 |
---|---|---|
committer | Matthew Xie <mattx@google.com> | 2012-07-16 15:38:37 -0700 |
commit | 654a3ab77dac5acaf6e100c518ba322cc1edb3c0 (patch) | |
tree | d606131153afc25232f7b0e50a57d5a3b519c589 /src | |
parent | 2ac143fff796ff1bd5b73484db17b6934c05f18e (diff) | |
download | packages_apps_settings-654a3ab77dac5acaf6e100c518ba322cc1edb3c0.zip packages_apps_settings-654a3ab77dac5acaf6e100c518ba322cc1edb3c0.tar.gz packages_apps_settings-654a3ab77dac5acaf6e100c518ba322cc1edb3c0.tar.bz2 |
Fixed settings crash fix when profile is connected, Bluetooth turned off/of and phone is rebooted
Change-Id: I8738569c24a3c6cc9166b38719c1e918d990242c
Diffstat (limited to 'src')
4 files changed, 99 insertions, 26 deletions
diff --git a/src/com/android/settings/bluetooth/A2dpProfile.java b/src/com/android/settings/bluetooth/A2dpProfile.java index 98e45e2..e16e6b5 100755 --- a/src/com/android/settings/bluetooth/A2dpProfile.java +++ b/src/com/android/settings/bluetooth/A2dpProfile.java @@ -24,6 +24,7 @@ import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; import android.content.Context; import android.os.ParcelUuid; +import android.util.Log; import com.android.settings.R; @@ -34,7 +35,11 @@ import java.util.List; * TODO: add null checks around calls to mService object. */ final class A2dpProfile implements LocalBluetoothProfile { + private static final String TAG = "A2dpProfile"; + private static boolean V = true; + private BluetoothA2dp mService; + private boolean mIsProfileReady; static final ParcelUuid[] SINK_UUIDS = { BluetoothUuid.AudioSink, @@ -52,16 +57,22 @@ final class A2dpProfile implements LocalBluetoothProfile { implements BluetoothProfile.ServiceListener { public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (V) Log.d(TAG,"Bluetooth service disconnected"); mService = (BluetoothA2dp) proxy; mProfileManager.setA2dpServiceUp(true); + mIsProfileReady=true; } public void onServiceDisconnected(int profile) { - mService = null; + if (V) Log.d(TAG,"Bluetooth service disconnected"); mProfileManager.setA2dpServiceUp(false); + mIsProfileReady=false; } } + public boolean isProfileReady() { + return mIsProfileReady; + } A2dpProfile(Context context, LocalBluetoothProfileManager profileManager) { mProfileManager = profileManager; @@ -144,10 +155,6 @@ final class A2dpProfile implements LocalBluetoothProfile { return false; } - public boolean isProfileReady() { - return mService != null; - } - public String toString() { return NAME; } @@ -177,4 +184,16 @@ final class A2dpProfile implements LocalBluetoothProfile { public int getDrawableResource(BluetoothClass btClass) { return R.drawable.ic_bt_headphones_a2dp; } + + protected void finalize() { + if (V) Log.d(TAG, "finalize()"); + if (mService != null) { + try { + BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.A2DP, mService); + mService = null; + }catch (Throwable t) { + Log.w(TAG, "Error cleaning up A2DP proxy", t); + } + } + } } diff --git a/src/com/android/settings/bluetooth/HeadsetProfile.java b/src/com/android/settings/bluetooth/HeadsetProfile.java index 34576f7..2c1e938 100755 --- a/src/com/android/settings/bluetooth/HeadsetProfile.java +++ b/src/com/android/settings/bluetooth/HeadsetProfile.java @@ -16,6 +16,7 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; @@ -34,9 +35,10 @@ import java.util.List; */ final class HeadsetProfile implements LocalBluetoothProfile { private static final String TAG = "HeadsetProfile"; + private static boolean V = true; private BluetoothHeadset mService; - private boolean mProfileReady; + private boolean mIsProfileReady; private final LocalBluetoothAdapter mLocalAdapter; private final CachedBluetoothDeviceManager mDeviceManager; @@ -57,8 +59,8 @@ final class HeadsetProfile implements LocalBluetoothProfile { implements BluetoothProfile.ServiceListener { public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (V) Log.d(TAG,"Bluetooth service connected"); mService = (BluetoothHeadset) proxy; - mProfileReady = true; // We just bound to the service, so refresh the UI of the // headset device. List<BluetoothDevice> deviceList = mService.getConnectedDevices(); @@ -78,16 +80,21 @@ final class HeadsetProfile implements LocalBluetoothProfile { mProfileManager.callServiceConnectedListeners(); mProfileManager.setHfServiceUp(true); + mIsProfileReady=true; } public void onServiceDisconnected(int profile) { - mProfileReady = false; - mService = null; + if (V) Log.d(TAG,"Bluetooth service disconnected"); mProfileManager.callServiceDisconnectedListeners(); mProfileManager.setHfServiceUp(false); + mIsProfileReady=false; } } + public boolean isProfileReady() { + return mIsProfileReady; + } + // TODO(): The calls must get queued if mService becomes null. // It can happen when the phone app crashes for some reason. // All callers should have service listeners. Dock Service is the only @@ -174,10 +181,6 @@ final class HeadsetProfile implements LocalBluetoothProfile { } } - public synchronized boolean isProfileReady() { - return mProfileReady; - } - public String toString() { return NAME; } @@ -207,4 +210,16 @@ final class HeadsetProfile implements LocalBluetoothProfile { public int getDrawableResource(BluetoothClass btClass) { return R.drawable.ic_bt_headset_hfp; } + + protected void finalize() { + if (V) Log.d(TAG, "finalize()"); + if (mService != null) { + try { + BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.HEADSET, mService); + mService = null; + }catch (Throwable t) { + Log.w(TAG, "Error cleaning up HID proxy", t); + } + } + } } diff --git a/src/com/android/settings/bluetooth/HidProfile.java b/src/com/android/settings/bluetooth/HidProfile.java index 920f4bb..225cf2e 100644 --- a/src/com/android/settings/bluetooth/HidProfile.java +++ b/src/com/android/settings/bluetooth/HidProfile.java @@ -16,11 +16,13 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothInputDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; +import android.util.Log; import com.android.settings.R; @@ -30,8 +32,11 @@ import java.util.List; * HidProfile handles Bluetooth HID profile. */ final class HidProfile implements LocalBluetoothProfile { + private static final String TAG = "HidProfile"; + private static boolean V = true; + private BluetoothInputDevice mService; - private boolean mProfileReady; + private boolean mIsProfileReady; static final String NAME = "HID"; @@ -43,16 +48,21 @@ final class HidProfile implements LocalBluetoothProfile { implements BluetoothProfile.ServiceListener { public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (V) Log.d(TAG,"Bluetooth service connected"); mService = (BluetoothInputDevice) proxy; - mProfileReady = true; + mIsProfileReady=true; } public void onServiceDisconnected(int profile) { - mProfileReady = false; - mService = null; + if (V) Log.d(TAG,"Bluetooth service disconnected"); + mIsProfileReady=false; } } + public boolean isProfileReady() { + return mIsProfileReady; + } + HidProfile(Context context, LocalBluetoothAdapter adapter) { adapter.getProfileProxy(context, new InputDeviceServiceListener(), BluetoothProfile.INPUT_DEVICE); @@ -100,10 +110,6 @@ final class HidProfile implements LocalBluetoothProfile { } } - public boolean isProfileReady() { - return mProfileReady; - } - public String toString() { return NAME; } @@ -149,4 +155,16 @@ final class HidProfile implements LocalBluetoothProfile { return R.drawable.ic_bt_misc_hid; } } + + protected void finalize() { + if (V) Log.d(TAG, "finalize()"); + if (mService != null) { + try { + BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.INPUT_DEVICE, mService); + mService = null; + }catch (Throwable t) { + Log.w(TAG, "Error cleaning up HID proxy", t); + } + } + } } diff --git a/src/com/android/settings/bluetooth/PanProfile.java b/src/com/android/settings/bluetooth/PanProfile.java index b3c5493..bd7b760 100644 --- a/src/com/android/settings/bluetooth/PanProfile.java +++ b/src/com/android/settings/bluetooth/PanProfile.java @@ -22,6 +22,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothProfile; import android.content.Context; +import android.util.Log; import com.android.settings.R; @@ -32,7 +33,12 @@ import java.util.List; * PanProfile handles Bluetooth PAN profile (NAP and PANU). */ final class PanProfile implements LocalBluetoothProfile { + private static final String TAG = "PanProfile"; + private static boolean V = true; + private BluetoothPan mService; + private boolean mIsProfileReady; + // Tethering direction for each device private final HashMap<BluetoothDevice, Integer> mDeviceRoleMap = new HashMap<BluetoothDevice, Integer>(); @@ -47,14 +53,21 @@ final class PanProfile implements LocalBluetoothProfile { implements BluetoothProfile.ServiceListener { public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (V) Log.d(TAG,"Bluetooth service connected"); mService = (BluetoothPan) proxy; + mIsProfileReady=true; } public void onServiceDisconnected(int profile) { - + if (V) Log.d(TAG,"Bluetooth service disconnected"); + mIsProfileReady=false; } } + public boolean isProfileReady() { + return mIsProfileReady; + } + PanProfile(Context context) { BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); adapter.getProfileProxy(context, new PanServiceListener(), @@ -99,10 +112,6 @@ final class PanProfile implements LocalBluetoothProfile { // ignore: isPreferred is always true for PAN } - public boolean isProfileReady() { - return true; - } - public String toString() { return NAME; } @@ -153,4 +162,16 @@ final class PanProfile implements LocalBluetoothProfile { return false; } } + + protected void finalize() { + if (V) Log.d(TAG, "finalize()"); + if (mService != null) { + try { + BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.PAN, mService); + mService = null; + }catch (Throwable t) { + Log.w(TAG, "Error cleaning up PAN proxy", t); + } + } + } } |