From ce930c15aec5fcc54ca0e31a0c01680bc1e3e010 Mon Sep 17 00:00:00 2001 From: Fabrice Di Meglio Date: Fri, 14 Feb 2014 15:09:30 -0800 Subject: [PATCH] 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 --- .../bluetooth/BluetoothDiscoverableEnabler.java | 11 +++++++---- .../android/settings/bluetooth/BluetoothSettings.java | 8 ++++---- .../bluetooth/LocalDeviceProfilesSettings.java | 2 +- 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 79dbbbdd26f..f47feccbe66 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 14c60541857..68cf37a061d 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 8d7100745fc..ed276970de2 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