diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index aea16f215ed22..de0fe27b40734 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11130,6 +11130,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 7759d0a961844..845dff9749f5a 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -247,6 +247,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 46ce95d33ff4c..e516bed086c38 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -118,6 +118,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; @@ -1282,17 +1283,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()); + } } } } @@ -22323,7 +22331,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) { @@ -22578,7 +22586,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); @@ -22587,7 +22595,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