From 702928a093c7584e663eadbc77bb6e5e44e9c929 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 6 May 2021 22:46:40 +0800 Subject: [PATCH] Dismiss immersive mode confirmation on setting changed to confirm So the test won't be disturbed if the confirmation window was shown before running the test. Also change the strange invocation updateRotation to request traversal of window hierarchy. Bug: 185112691 Test: atest CtsWindowManagerDeviceTestCases Change-Id: I2d18b5a14655418992f019c5a81c59a61db7ef3d --- .../com/android/server/wm/DisplayPolicy.java | 4 ++++ .../server/wm/ImmersiveModeConfirmation.java | 9 ++++++++ .../server/wm/WindowManagerService.java | 23 +++++++++++-------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 203214d536ddf..30f69dd79f5e2 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2861,6 +2861,10 @@ public class DisplayPolicy { mImmersiveModeConfirmation.onLockTaskModeChangedLw(lockTaskState); } + boolean onSystemUiSettingsChanged() { + return mImmersiveModeConfirmation.onSettingChanged(mService.mCurrentUserId); + } + /** * Request a screenshot be taken. * diff --git a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java index b94bc5b2c61d8..747d3652e1503 100644 --- a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java @@ -148,6 +148,15 @@ public class ImmersiveModeConfirmation { } } + boolean onSettingChanged(int currentUserId) { + final boolean changed = loadSetting(currentUserId, mContext); + // Remove the window if the setting changes to be confirmed. + if (changed && sConfirmed) { + mHandler.sendEmptyMessage(H.HIDE); + } + return changed; + } + void immersiveModeChangedLw(int rootDisplayAreaId, boolean isImmersiveMode, boolean userSetupComplete, boolean navBarEmpty) { mHandler.removeMessages(H.SHOW); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1657a136d61d3..d43a76315502a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -818,7 +818,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (mImmersiveModeConfirmationsUri.equals(uri) || mPolicyControlUri.equals(uri)) { - updateSystemUiSettings(); + updateSystemUiSettings(true /* handleChange */); return; } @@ -874,17 +874,22 @@ public class WindowManagerService extends IWindowManager.Stub } void loadSettings() { - updateSystemUiSettings(); + updateSystemUiSettings(false /* handleChange */); updatePointerLocation(); } - void updateSystemUiSettings() { - boolean changed; + void updateSystemUiSettings(boolean handleChange) { synchronized (mGlobalLock) { - changed = ImmersiveModeConfirmation.loadSetting(mCurrentUserId, mContext); - } - if (changed) { - updateRotation(false /* alwaysSendConfiguration */, false /* forceRelayout */); + boolean changed = false; + if (handleChange) { + changed = getDefaultDisplayContentLocked().getDisplayPolicy() + .onSystemUiSettingsChanged(); + } else { + ImmersiveModeConfirmation.loadSetting(mCurrentUserId, mContext); + } + if (changed) { + mWindowPlacerLocked.requestTraversal(); + } } } @@ -2990,7 +2995,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void onUserSwitched() { - mSettingsObserver.updateSystemUiSettings(); + mSettingsObserver.updateSystemUiSettings(true /* handleChange */); synchronized (mGlobalLock) { // force a re-application of focused window sysui visibility on each display. mRoot.forAllDisplayPolicies(DisplayPolicy::resetSystemUiVisibilityLw);