From f22b2668e04488cb6cd800ce7fb6f96d62242be9 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Tue, 25 Jun 2024 20:55:35 +0800 Subject: [PATCH] Guard against exception when reg/unreg content observer When an app injects an entry to Settings with dynamic title/summary, and disables its content provider at runtime, Settings will crash while trying to registering/unregistering the data observer. Fix: 337567627 Test: manual Flag: EXEMPT bugfix Change-Id: I9c7f689c6696d91f0b8e40113a8df10375930ede --- .../settings/dashboard/DashboardFragment.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 9abc6c2a0fa..0808da1b4a8 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -649,8 +649,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment DynamicDataObserver observer) { Log.d(TAG, "register observer: @" + Integer.toHexString(observer.hashCode()) + ", uri: " + observer.getUri()); - resolver.registerContentObserver(observer.getUri(), false, observer); - mRegisteredObservers.add(observer); + try { + resolver.registerContentObserver(observer.getUri(), false, observer); + mRegisteredObservers.add(observer); + } catch (Exception e) { + Log.w(TAG, "Cannot register observer: " + observer.getUri(), e); + } } private void unregisterDynamicDataObservers(List observers) { @@ -661,8 +665,13 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment observers.forEach(observer -> { Log.d(TAG, "unregister observer: @" + Integer.toHexString(observer.hashCode()) + ", uri: " + observer.getUri()); - mRegisteredObservers.remove(observer); - resolver.unregisterContentObserver(observer); + if (mRegisteredObservers.remove(observer)) { + try { + resolver.unregisterContentObserver(observer); + } catch (Exception e) { + Log.w(TAG, "Cannot unregister observer: " + observer.getUri(), e); + } + } }); }