summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wei Sheng Shih <wilsonshih@google.com> 2020-03-23 15:08:37 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2020-03-23 15:08:37 +0000
commit2ee512971a3b840fe8272d70f4fca699cf0abc76 (patch)
tree8943dfbbfc0951c06a4cd7ea060ba7038102ec1e
parent540b2e24ac9bc9bac1aafc0cd0a25c3a6a4e3f78 (diff)
parent03e13aa7bb2dea425430773dd592c4d6fd6d9fd8 (diff)
Merge "Surface should not be created for WindowContext initially." into rvc-dev am: 4346998c88 am: 03e13aa7bb
Change-Id: Ie6327cad62f639c69c1b1f4feb3b7dc225985c5e
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java12
-rw-r--r--services/core/java/com/android/server/wm/WindowToken.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java24
3 files changed, 47 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 6c69dc625a70..a49cffb664fd 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -378,10 +378,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
if (mSurfaceControl == null) {
// If we don't yet have a surface, but we now have a parent, we should
// build a surface.
- setSurfaceControl(makeSurface().build());
- getPendingTransaction().show(mSurfaceControl);
- onSurfaceShown(getPendingTransaction());
- updateSurfacePosition();
+ createSurfaceControl(false /*force*/);
} else {
// If we have a surface but a new parent, we just need to perform a reparent. Go through
// surface animator such that hierarchy is preserved when animating, i.e.
@@ -399,6 +396,13 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
scheduleAnimation();
}
+ void createSurfaceControl(boolean force) {
+ setSurfaceControl(makeSurface().build());
+ getPendingTransaction().show(mSurfaceControl);
+ onSurfaceShown(getPendingTransaction());
+ updateSurfacePosition();
+ }
+
/**
* Called when the surface is shown for the first time.
*/
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index f965f7b80ee9..850c36238513 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -100,6 +100,9 @@ class WindowToken extends WindowContainer<WindowState> {
private Configuration mLastReportedConfig;
private int mLastReportedDisplay = INVALID_DISPLAY;
+ /**
+ * When set to {@code true}, this window token is created from {@link android.app.WindowContext}
+ */
@VisibleForTesting
final boolean mFromClientToken;
@@ -281,6 +284,11 @@ class WindowToken extends WindowContainer<WindowState> {
// Child windows are added to their parent windows.
return;
}
+ // This token is created from WindowContext and the client requests to addView now, create a
+ // surface for this token.
+ if (mSurfaceControl == null) {
+ createSurfaceControl(true /* force */);
+ }
if (!mChildren.contains(win)) {
ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Adding %s to %s", win, this);
addChild(win, mWindowComparator);
@@ -289,6 +297,13 @@ class WindowToken extends WindowContainer<WindowState> {
}
}
+ @Override
+ void createSurfaceControl(boolean force) {
+ if (!mFromClientToken || force) {
+ super.createSurfaceControl(force);
+ }
+ }
+
/** Returns true if the token windows list is empty. */
boolean isEmpty() {
return mChildren.isEmpty();
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 38f643daec27..7a347cb050be 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
@@ -18,6 +18,7 @@ package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static org.junit.Assert.assertEquals;
@@ -155,4 +156,27 @@ public class WindowTokenTests extends WindowTestsBase {
assertTrue(token.mRoundedCornerOverlay);
assertTrue(token.mFromClientToken);
}
+
+ /**
+ * Test that {@link android.view.SurfaceControl} should not be created for the
+ * {@link WindowToken} which was created for {@link android.app.WindowContext} initially, the
+ * surface should be create after addWindow for this token.
+ */
+ @Test
+ public void testSurfaceCreatedForWindowToken() {
+ final WindowToken fromClientToken = new WindowToken(mDisplayContent.mWmService,
+ mock(IBinder.class), TYPE_APPLICATION_OVERLAY, true /* persistOnEmpty */,
+ mDisplayContent, true /* ownerCanManageAppTokens */,
+ true /* roundedCornerOverlay */, true /* fromClientToken */);
+ assertNull(fromClientToken.mSurfaceControl);
+
+ createWindow(null, TYPE_APPLICATION_OVERLAY, fromClientToken, "window");
+ assertNotNull(fromClientToken.mSurfaceControl);
+
+ final WindowToken nonClientToken = new WindowToken(mDisplayContent.mWmService,
+ mock(IBinder.class), TYPE_TOAST, true /* persistOnEmpty */, mDisplayContent,
+ true /* ownerCanManageAppTokens */, true /* roundedCornerOverlay */,
+ false /* fromClientToken */);
+ assertNotNull(nonClientToken.mSurfaceControl);
+ }
}