From 9d588a7013e569cd6ce79e926acbff36ab56c16e Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Tue, 10 Oct 2017 00:41:41 -0700 Subject: DO NOT MERGE: Don't let keyguard to influence orientation when dismissing When keyguard is being dismissed it still was overriding orientation for the display, which caused report of wrong configuration to activity that was becoming visible. Bug: 66979760 Bug: 36897968 Bug: 62796190 Bug: 62904487 Bug: 38494778 Test: Launch Unity 4 based game, lock and unlock screen, check UI Test: com.android.server.wm.DisplayContentTests#testOrientationDefinedByKeyguard Change-Id: I0a180b8e941a85ba4174a40cdec2ff0b8f3e00eb --- core/java/android/view/WindowManagerInternal.java | 3 --- .../java/com/android/server/am/ActivityRecord.java | 20 -------------- .../android/server/policy/PhoneWindowManager.java | 6 ++--- .../android/server/wm/WindowManagerService.java | 12 +++------ .../com/android/server/wm/DisplayContentTests.java | 31 ++++++++++++++++++++++ .../android/server/wm/TestWindowManagerPolicy.java | 4 +-- 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index 98f8dc8e3a6d..97dff6a860b9 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -225,9 +225,6 @@ public abstract class WindowManagerInternal { */ public abstract boolean isKeyguardLocked(); - /** @return {@code true} if the keyguard is going away. */ - public abstract boolean isKeyguardGoingAway(); - /** * @return Whether the keyguard is showing and not occluded. */ diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index b2bbf199bfc1..4d98f19f79b9 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2249,26 +2249,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo mTmpConfig.unset(); computeBounds(mTmpBounds); if (mTmpBounds.equals(mBounds)) { - final ActivityStack stack = getStack(); - if (!mBounds.isEmpty() || task == null || stack == null || !task.mFullscreen) { - // We don't want to influence the override configuration here if our task is in - // multi-window mode or there is a bounds specified to calculate the override - // config. In both of this cases the app should be compatible with whatever the - // current configuration is or will be. - return; - } - - // Currently limited to the top activity for now to avoid situations where non-top - // visible activity and top might have conflicting requests putting the non-top activity - // windows in an odd state. - final ActivityRecord top = mStackSupervisor.topRunningActivityLocked(); - final Configuration parentConfig = getParent().getConfiguration(); - if (top != this || isConfigurationCompatible(parentConfig)) { - onOverrideConfigurationChanged(mTmpConfig); - } else if (isConfigurationCompatible( - mLastReportedConfiguration.getMergedConfiguration())) { - onOverrideConfigurationChanged(mLastReportedConfiguration.getMergedConfiguration()); - } return; } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index f79f0e86b765..da14c360f16a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -1152,14 +1152,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { + ", mOrientationSensorEnabled=" + mOrientationSensorEnabled + ", mKeyguardDrawComplete=" + mKeyguardDrawComplete + ", mWindowManagerDrawComplete=" + mWindowManagerDrawComplete); - final boolean keyguardGoingAway = mWindowManagerInternal.isKeyguardGoingAway(); boolean disable = true; // Note: We postpone the rotating of the screen until the keyguard as well as the // window manager have reported a draw complete or the keyguard is going away in dismiss // mode. - if (mScreenOnEarly && mAwake && ((mKeyguardDrawComplete && mWindowManagerDrawComplete) - || keyguardGoingAway)) { + if (mScreenOnEarly && mAwake && ((mKeyguardDrawComplete && mWindowManagerDrawComplete))) { if (needSensorRunningLp()) { disable = false; //enable listener if not already enabled @@ -1170,7 +1168,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // the sensor reading was cleared which can cause it to relaunch the app that // will show in the wrong orientation first before correcting leading to app // launch delays. - mOrientationListener.enable(!keyguardGoingAway /* clearCurrentRotation */); + mOrientationListener.enable(true /* clearCurrentRotation */); if(localLOGV) Slog.v(TAG, "Enabling listeners"); mOrientationSensorEnabled = true; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index c8cbcd811de8..0abc84745f0e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2994,10 +2994,9 @@ public class WindowManagerService extends IWindowManager.Stub } public void setKeyguardGoingAway(boolean keyguardGoingAway) { -// TODO: Use of this can be removed. Revert ag/I8369723d6a77f2c602f1ef080371fa7cd9ee094e -// synchronized (mWindowMap) { -// mKeyguardGoingAway = keyguardGoingAway; -// } + synchronized (mWindowMap) { + mKeyguardGoingAway = keyguardGoingAway; + } } // ------------------------------------------------------------- @@ -7435,11 +7434,6 @@ public class WindowManagerService extends IWindowManager.Stub return WindowManagerService.this.isKeyguardLocked(); } - @Override - public boolean isKeyguardGoingAway() { - return WindowManagerService.this.mKeyguardGoingAway; - } - @Override public boolean isKeyguardShowingAndNotOccluded() { return WindowManagerService.this.isKeyguardShowingAndNotOccluded(); diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java index 91eb55ba3fcf..10d241357ff4 100644 --- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java @@ -17,11 +17,16 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION; + import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -30,6 +35,7 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import android.annotation.SuppressLint; import android.content.res.Configuration; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; @@ -378,6 +384,31 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(-1, orderedDisplayIds.indexOfValue(dc.getDisplayId())); } + @Test + @SuppressLint("InlinedApi") + public void testOrientationDefinedByKeyguard() { + final DisplayContent dc = createNewDisplay(); + // Create a window that requests landscape orientation. It will define device orientation + // by default. + final WindowState window = createWindow(null /* parent */, TYPE_BASE_APPLICATION, dc, "w"); + window.mAppToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); + + final WindowState keyguard = createWindow(null, TYPE_STATUS_BAR, dc, "keyguard"); + keyguard.mHasSurface = true; + keyguard.mAttrs.screenOrientation = SCREEN_ORIENTATION_UNSPECIFIED; + + assertEquals("Screen orientation must be defined by the app window by default", + SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation()); + + keyguard.mAttrs.screenOrientation = SCREEN_ORIENTATION_PORTRAIT; + assertEquals("Visible keyguard must influence device orientation", + SCREEN_ORIENTATION_PORTRAIT, dc.getOrientation()); + + sWm.setKeyguardGoingAway(true); + assertEquals("Keyguard that is going away must not influence device orientation", + SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation()); + } + private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth, int expectedBaseHeight, int expectedBaseDensity) { assertEquals(displayContent.mBaseDisplayWidth, expectedBaseWidth); diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 95adc9cd5a1a..eca27eefb2cd 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -17,7 +17,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; -import static android.view.WindowManagerPolicy.NAV_BAR_BOTTOM; +import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -188,7 +188,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { @Override public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs) { - return false; + return attrs.type == TYPE_STATUS_BAR; } @Override -- cgit v1.2.3-59-g8ed1b