From bf7865b27ecc39e47f41707aaf0feb8c45a42c10 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Wed, 7 Jun 2023 16:47:04 +0800 Subject: [PATCH] [Settings] Fix crash when user enter bluetooth page quickly. - When SliceManager try to pinSlice, process may not have the permssion yet, so in Androix lib it use try/catch to avoid Security exception. However, if SliceManger quickly unpinSlice after pinSlice, process may still not get the permission yet, then due to no security exception, it cause the settings crash. Bug: 283065718 Test: atest passed Test: Manual test passed Change-Id: I2293fca73e65dfaa34237abe57e0c6a3fe0f62bb --- .../BlockingPrefWithSliceController.java | 16 ++++++++++++++-- .../slices/SlicePreferenceController.java | 19 ++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/bluetooth/BlockingPrefWithSliceController.java b/src/com/android/settings/bluetooth/BlockingPrefWithSliceController.java index b443047d7e8..93a2747cac0 100644 --- a/src/com/android/settings/bluetooth/BlockingPrefWithSliceController.java +++ b/src/com/android/settings/bluetooth/BlockingPrefWithSliceController.java @@ -113,15 +113,27 @@ public class BlockingPrefWithSliceController extends BasePreferenceController im @Override public void onStart() { - if (mLiveData != null) { + if (mLiveData == null) { + return; + } + + try { mLiveData.observeForever(this); + } catch (SecurityException e) { + Log.w(TAG, "observeForever - no permission"); } } @Override public void onStop() { - if (mLiveData != null) { + if (mLiveData == null) { + return; + } + + try { mLiveData.removeObserver(this); + } catch (SecurityException e) { + Log.w(TAG, "removeObserver - no permission"); } } diff --git a/src/com/android/settings/slices/SlicePreferenceController.java b/src/com/android/settings/slices/SlicePreferenceController.java index eb10bd42be1..9a88b5626dc 100644 --- a/src/com/android/settings/slices/SlicePreferenceController.java +++ b/src/com/android/settings/slices/SlicePreferenceController.java @@ -44,7 +44,6 @@ public class SlicePreferenceController extends BasePreferenceController implemen LiveData mLiveData; @VisibleForTesting SlicePreference mSlicePreference; - private boolean mIsObservering = false; private Uri mUri; public SlicePreferenceController(Context context, String preferenceKey) { @@ -74,9 +73,14 @@ public class SlicePreferenceController extends BasePreferenceController implemen @Override public void onStart() { - if (mLiveData != null && !mIsObservering) { - mIsObservering = true; + if (mLiveData == null) { + return; + } + + try { mLiveData.observeForever(this); + } catch (SecurityException e) { + Log.w(TAG, "observeForever - no permission"); } } @@ -91,9 +95,14 @@ public class SlicePreferenceController extends BasePreferenceController implemen } private void removeLiveDataObserver() { - if (mLiveData != null && mIsObservering && mLiveData.hasActiveObservers()) { - mIsObservering = false; + if (mLiveData == null) { + return; + } + + try { mLiveData.removeObserver(this); + } catch (SecurityException e) { + Log.w(TAG, "removeLiveDataObserver - no permission"); } } }