From 82b17ca3400c7dc23d5df0c2dc1d4d7532c71107 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 6 Apr 2018 16:00:08 -0700 Subject: [PATCH] Fix issue #77721907: Add global setting to hide all error dialogs adb shell settings put global hide_error_dialogs 1 This forces the same behavior as other devices that hide all dialogs. Bug: 77721907 Test: manual Change-Id: I93e03d55f885f1874c33f46cad8cede0c759063b --- core/java/android/provider/Settings.java | 8 ++++++++ .../src/android/provider/SettingsBackupTest.java | 1 + .../server/am/ActivityManagerService.java | 16 +++++++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 98d8666ecd476..5aeb98e449e61 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11084,6 +11084,14 @@ public final class Settings { */ public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities"; + /** + * If nonzero, all system error dialogs will be hidden. For example, the + * crash and ANR dialogs will not be shown, and the system will just proceed + * as if they had been accepted by the user. + * @hide + */ + public static final String HIDE_ERROR_DIALOGS = "hide_error_dialogs"; + /** * Use Dock audio output for media: * 0 = disabled diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 002c9e2257cb1..c34a414fa6ff6 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -245,6 +245,7 @@ public class SettingsBackupTest { Settings.Global.HDMI_CONTROL_ENABLED, Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, + Settings.Global.HIDE_ERROR_DIALOGS, Settings.Global.HTTP_PROXY, HYBRID_SYSUI_BATTERY_WARNING_FLAGS, Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY, diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index db52b9700e4ef..34557a39a057c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -116,6 +116,7 @@ import static android.provider.Settings.Global.DEBUG_APP; import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT; import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES; import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL; +import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS; import static android.provider.Settings.Global.NETWORK_ACCESS_TIMEOUT_MS; import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER; import static android.provider.Settings.System.FONT_SCALE; @@ -1280,17 +1281,24 @@ public class ActivityManagerService extends IActivityManager.Stub private final class FontScaleSettingObserver extends ContentObserver { private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE); + private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS); public FontScaleSettingObserver() { super(mHandler); ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(mHideErrorDialogsUri, false, this, + UserHandle.USER_ALL); } @Override public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) { if (mFontScaleUri.equals(uri)) { updateFontScaleIfNeeded(userId); + } else if (mHideErrorDialogsUri.equals(uri)) { + synchronized (ActivityManagerService.this) { + updateShouldShowDialogsLocked(getGlobalConfiguration()); + } } } } @@ -22446,7 +22454,7 @@ public class ActivityManagerService extends IActivityManager.Stub mUserController.getCurrentUserId()); // TODO: If our config changes, should we auto dismiss any currently showing dialogs? - mShowDialogs = shouldShowDialogs(mTempConfig); + updateShouldShowDialogsLocked(mTempConfig); AttributeCache ac = AttributeCache.instance(); if (ac != null) { @@ -22701,7 +22709,7 @@ public class ActivityManagerService extends IActivityManager.Stub * A thought: SystemUI might also want to get told about this, the Power * dialog / global actions also might want different behaviors. */ - private static boolean shouldShowDialogs(Configuration config) { + private void updateShouldShowDialogsLocked(Configuration config) { final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH && config.navigation == Configuration.NAVIGATION_NONAV); @@ -22710,7 +22718,9 @@ public class ActivityManagerService extends IActivityManager.Stub && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER) && modeType != Configuration.UI_MODE_TYPE_TELEVISION && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET); - return inputMethodExists && uiModeSupportsDialogs; + final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(), + HIDE_ERROR_DIALOGS, 0) != 0; + mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet; } @Override