summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2014-02-14 15:09:30 -0800
committerFabrice Di Meglio <fdimeglio@google.com>2014-02-14 23:53:44 +0000
commitce930c15aec5fcc54ca0e31a0c01680bc1e3e010 (patch)
tree475ad0216859a65350342a6ee5e8dde67f4e32fe
parentb6436276510296cfc2e13e1ab14409ab504e981a (diff)
downloadpackages_apps_Settings-ce930c15aec5fcc54ca0e31a0c01680bc1e3e010.zip
packages_apps_Settings-ce930c15aec5fcc54ca0e31a0c01680bc1e3e010.tar.gz
packages_apps_Settings-ce930c15aec5fcc54ca0e31a0c01680bc1e3e010.tar.bz2
Crash in Settings observed while changing the device orientation after renamed tablet
There was a fundamental flow in the BT code. Basically BluetoothSettings is using a singleton BluetoothDiscoverableEnabler. BluetoothDiscoverableEnabler is keeping (thru its constructor) a reference on a Context for registering/unregistering some broadcast receiver. BUMMER! When you change orientation (or more generally the device Configuration), your Context is no more the same! Hence the crash as we were trying to unregister a Receiver on a Context that is no more valid. Fix that issue by passing an updated Context to the BluetoothDiscoverableEnabler.resume() API. Bug #12991455 Change-Id: I77db15d2b59b6dd973907e26f9e6bb022202a8b5
-rwxr-xr-xsrc/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java11
-rwxr-xr-xsrc/com/android/settings/bluetooth/BluetoothSettings.java8
-rw-r--r--src/com/android/settings/bluetooth/LocalDeviceProfilesSettings.java2
3 files changed, 12 insertions, 9 deletions
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
index 79dbbbd..f47fecc 100755
--- a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
@@ -57,7 +57,7 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceClick
static final int DEFAULT_DISCOVERABLE_TIMEOUT = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
- private final Context mContext;
+ private Context mContext;
private final Handler mUiHandler;
private final Preference mDiscoveryPreference;
// Preference for visibility time out. Not final as it needs to be set through setter.
@@ -91,9 +91,8 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceClick
}
};
- BluetoothDiscoverableEnabler(Context context, LocalBluetoothAdapter adapter,
+ BluetoothDiscoverableEnabler(LocalBluetoothAdapter adapter,
Preference discoveryPreference) {
- mContext = context;
mUiHandler = new Handler();
mLocalAdapter = adapter;
mDiscoveryPreference = discoveryPreference;
@@ -105,11 +104,15 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceClick
mVisibilityTimeoutPreference = visibilityPreference;
}
- public void resume() {
+ public void resume(Context context) {
if (mLocalAdapter == null) {
return;
}
+ if (mContext != context) {
+ mContext = context;
+ }
+
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
mContext.registerReceiver(mReceiver, filter);
mDiscoveryPreference.setOnPreferenceClickListener(this);
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 14c6054..68cf37a 100755
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -156,7 +156,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
super.onResume();
if (mDiscoverableEnabler != null) {
- mDiscoverableEnabler.resume();
+ mDiscoverableEnabler.resume(getActivity());
}
getActivity().registerReceiver(mReceiver, mIntentFilter);
if (mLocalAdapter != null) {
@@ -262,9 +262,9 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
if (!isRestrictedAndNotPinProtected()) {
if (mDiscoverableEnabler == null) {
- mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
- mLocalAdapter, mMyDevicePreference);
- mDiscoverableEnabler.resume();
+ mDiscoverableEnabler = new BluetoothDiscoverableEnabler(mLocalAdapter,
+ mMyDevicePreference);
+ mDiscoverableEnabler.resume(getActivity());
LocalBluetoothManager.getInstance(getActivity()).setDiscoverableEnabler(
mDiscoverableEnabler);
}
diff --git a/src/com/android/settings/bluetooth/LocalDeviceProfilesSettings.java b/src/com/android/settings/bluetooth/LocalDeviceProfilesSettings.java
index 8d71007..ed27697 100644
--- a/src/com/android/settings/bluetooth/LocalDeviceProfilesSettings.java
+++ b/src/com/android/settings/bluetooth/LocalDeviceProfilesSettings.java
@@ -82,7 +82,7 @@ public final class LocalDeviceProfilesSettings extends SettingsPreferenceFragmen
super.onResume();
mManager.setForegroundActivity(getActivity());
mAdvertisingEnabler.resume();
- mDiscoverableEnabler.resume();
+ mDiscoverableEnabler.resume(getActivity());
}
@Override