From d077ca6dd9a973ef9025f77de2b86b8e12bd2c8a Mon Sep 17 00:00:00 2001 From: Chun-Ku Lin Date: Thu, 29 Aug 2024 20:33:18 +0000 Subject: [PATCH] Pass null looper if the looper is not prepared in the calling thread **Root cause** The PreferenceController can be constructed by the SettingsSearchIndexablesProvider where the looper of the thread is not prepared. This result in not able to construct the PreferenceController that will be used as part of the SettingsSearch. Currently, if the SettingsSearchIndexablesProvider is not able to construct the PreferenceController defined in xml, it would just silently failed. Test: atest SettingsUnitTests Test: atest SettingsRoboTests Flag: EXEMPT low risk bugfix Bug: 352622249 Change-Id: I72a4ce24ec6842b9efe067e3cb7d1c73cd98a566 --- .../KeyboardVibrationTogglePreferenceController.java | 4 +++- .../VibrationMainSwitchPreferenceController.java | 4 +++- .../settings/accessibility/VibrationPreferenceConfig.java | 3 ++- .../VibrationRampingRingerTogglePreferenceController.java | 4 +++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceController.java b/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceController.java index 818eb5e4bab..45a19b78bdf 100644 --- a/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceController.java +++ b/src/com/android/settings/accessibility/KeyboardVibrationTogglePreferenceController.java @@ -27,6 +27,7 @@ import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.os.VibrationAttributes; import android.os.Vibrator; import android.provider.Settings; @@ -69,7 +70,8 @@ public class KeyboardVibrationTogglePreferenceController extends TogglePreferenc public KeyboardVibrationTogglePreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); mVibrator = context.getSystemService(Vibrator.class); - mContentObserver = new ContentObserver(new Handler(/* async= */ true)) { + Handler handler = Looper.myLooper() != null ? new Handler(/* async= */ true) : null; + mContentObserver = new ContentObserver(handler) { @Override public void onChange(boolean selfChange, Uri uri) { if (uri.equals(MAIN_VIBRATION_SWITCH_URI)) { diff --git a/src/com/android/settings/accessibility/VibrationMainSwitchPreferenceController.java b/src/com/android/settings/accessibility/VibrationMainSwitchPreferenceController.java index db184bf9d73..5b553e3df61 100644 --- a/src/com/android/settings/accessibility/VibrationMainSwitchPreferenceController.java +++ b/src/com/android/settings/accessibility/VibrationMainSwitchPreferenceController.java @@ -23,6 +23,7 @@ import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.os.VibrationAttributes; import android.os.Vibrator; import android.provider.Settings; @@ -49,7 +50,8 @@ public class VibrationMainSwitchPreferenceController extends SettingsMainSwitchP public VibrationMainSwitchPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); mVibrator = context.getSystemService(Vibrator.class); - mSettingObserver = new ContentObserver(new Handler(/* async= */ true)) { + Handler handler = Looper.myLooper() != null ? new Handler(/* async= */ true) : null; + mSettingObserver = new ContentObserver(handler) { @Override public void onChange(boolean selfChange, Uri uri) { updateState(mSwitchPreference); diff --git a/src/com/android/settings/accessibility/VibrationPreferenceConfig.java b/src/com/android/settings/accessibility/VibrationPreferenceConfig.java index ec1fab1af72..3887cece9fe 100644 --- a/src/com/android/settings/accessibility/VibrationPreferenceConfig.java +++ b/src/com/android/settings/accessibility/VibrationPreferenceConfig.java @@ -27,6 +27,7 @@ import android.database.ContentObserver; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; @@ -165,7 +166,7 @@ public abstract class VibrationPreferenceConfig { /** Creates observer for given preference. */ public SettingObserver(VibrationPreferenceConfig preferenceConfig) { - super(new Handler(/* async= */ true)); + super(Looper.myLooper() != null ? new Handler(/* async= */ true) : null); mUri = Settings.System.getUriFor(preferenceConfig.getSettingKey()); if (preferenceConfig.isRestrictedByRingerModeSilent()) { diff --git a/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java b/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java index 149bed35373..69b1e1503f6 100644 --- a/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java +++ b/src/com/android/settings/accessibility/VibrationRampingRingerTogglePreferenceController.java @@ -21,6 +21,7 @@ import android.database.ContentObserver; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.os.Vibrator; import android.provider.DeviceConfig; import android.provider.Settings; @@ -74,7 +75,8 @@ public class VibrationRampingRingerTogglePreferenceController mRingVibrationPreferenceConfig = new RingVibrationPreferenceConfig(context); mRingSettingObserver = new VibrationPreferenceConfig.SettingObserver( mRingVibrationPreferenceConfig); - mSettingObserver = new ContentObserver(new Handler(/* async= */ true)) { + Handler handler = Looper.myLooper() != null ? new Handler(/* async= */ true) : null; + mSettingObserver = new ContentObserver(handler) { @Override public void onChange(boolean selfChange, Uri uri) { updateState(mPreference);