From 525e1e72c93daf5007cc72e70d63cf7b97a60cbe Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Mon, 2 Mar 2020 15:40:25 +0800 Subject: [PATCH] Fix cutout disappeared when rotation The previous CL[1] add a new parameter fromClient, which conflicts with the original constructor with parameter RoundedCornerOverlay. This CL fixes this issue and also make WindowToken ctr in addWindowTokenWithOption take this parameter. [1]: I871bd78a21dbde1286786e65c340b6259b873660 Test: atest WindowContextTests Test: atest WindowTokenTests#testWindowTokenConstructorSanity Test: manual - reproducible steps mentioned in bugs fixes: 150576746 Change-Id: I023068f9536ff56259c8f2347546a1282ab2c268 --- .../server/wm/WindowManagerService.java | 3 +- .../com/android/server/wm/WindowToken.java | 10 ++++--- .../server/wm/WindowManagerServiceTests.java | 28 +++++++++++++++++++ .../android/server/wm/WindowTokenTests.java | 26 +++++++++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 673e7e0d241ed..c57ca4d2c0071 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2609,7 +2609,8 @@ public class WindowManagerService extends IWindowManager.Stub if (type == TYPE_WALLPAPER) { new WallpaperWindowToken(this, binder, true, dc, callerCanManageAppTokens); } else { - new WindowToken(this, binder, type, true, dc, callerCanManageAppTokens); + new WindowToken(this, binder, type, true, dc, callerCanManageAppTokens, + false /* roundedCornerOverlay */, fromClientToken); } } } finally { diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 3b7b7c65a1145..8982ddb8d6ae8 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -49,6 +49,7 @@ import android.view.DisplayInfo; import android.view.InsetsState; import android.view.SurfaceControl; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.policy.WindowManagerPolicy; import com.android.server.protolog.common.ProtoLog; @@ -98,7 +99,8 @@ class WindowToken extends WindowContainer { private Configuration mLastReportedConfig; private int mLastReportedDisplay = INVALID_DISPLAY; - private final boolean mFromClientToken; + @VisibleForTesting + final boolean mFromClientToken; /** * Used to fix the transform of the token to be rotated to a rotation different than it's @@ -179,13 +181,13 @@ class WindowToken extends WindowContainer { WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty, DisplayContent dc, boolean ownerCanManageAppTokens) { this(service, _token, type, persistOnEmpty, dc, ownerCanManageAppTokens, - false /* roundedCornersOverlay */); + false /* roundedCornerOverlay */); } WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty, - DisplayContent dc, boolean ownerCanManageAppTokens, boolean fromClientToken) { + DisplayContent dc, boolean ownerCanManageAppTokens, boolean roundedCornerOverlay) { this(service, _token, type, persistOnEmpty, dc, ownerCanManageAppTokens, - false /* roundedCornersOverlay */, fromClientToken); + roundedCornerOverlay, false /* fromClientToken */); } WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty, diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index 35723abb43104..da4bde59a09e1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -16,9 +16,16 @@ package com.android.server.wm; +import static android.view.WindowManager.LayoutParams.TYPE_TOAST; + import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + import android.content.pm.PackageManager; +import android.os.IBinder; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -57,4 +64,25 @@ public class WindowManagerServiceTests extends WindowTestsBase { return getInstrumentation().getTargetContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_AUTOMOTIVE); } + + @Test + public void testAddWindowToken() { + IBinder token = mock(IBinder.class); + mWm.addWindowToken(token, TYPE_TOAST, mDisplayContent.getDisplayId()); + + WindowToken windowToken = mWm.mRoot.getWindowToken(token); + assertFalse(windowToken.mRoundedCornerOverlay); + assertFalse(windowToken.mFromClientToken); + } + + @Test + public void testAddWindowTokenWithOptions() { + IBinder token = mock(IBinder.class); + mWm.addWindowTokenWithOptions(token, TYPE_TOAST, mDisplayContent.getDisplayId(), + null /* options */, null /* options */); + + WindowToken windowToken = mWm.mRoot.getWindowToken(token); + assertFalse(windowToken.mRoundedCornerOverlay); + assertTrue(windowToken.mFromClientToken); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java index e6aed498cf1c0..38f643daec270 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java @@ -25,7 +25,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import android.os.IBinder; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -129,4 +131,28 @@ public class WindowTokenTests extends WindowTestsBase { // Verify that the token windows are no longer attached to it. assertEquals(0, token.getWindowsCount()); } + + /** + * Test that {@link WindowToken} constructor parameters is set with expectation. + */ + @Test + public void testWindowTokenConstructorSanity() { + WindowToken token = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class), + TYPE_TOAST, true /* persistOnEmpty */, mDisplayContent, + true /* ownerCanManageAppTokens */); + assertFalse(token.mRoundedCornerOverlay); + assertFalse(token.mFromClientToken); + + token = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class), TYPE_TOAST, + true /* persistOnEmpty */, mDisplayContent, true /* ownerCanManageAppTokens */, + true /* roundedCornerOverlay */); + assertTrue(token.mRoundedCornerOverlay); + assertFalse(token.mFromClientToken); + + token = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class), TYPE_TOAST, + true /* persistOnEmpty */, mDisplayContent, true /* ownerCanManageAppTokens */, + true /* roundedCornerOverlay */, true /* fromClientToken */); + assertTrue(token.mRoundedCornerOverlay); + assertTrue(token.mFromClientToken); + } }