summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java44
3 files changed, 48 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index ae9e80268741..7d4d7cb9c71c 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -751,8 +751,9 @@ public class TaskStack extends WindowContainer<Task> implements
* Used to make room for shadows in the pinned windowing mode.
*/
int getStackOutset() {
- if (inPinnedWindowingMode()) {
- final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics();
+ DisplayContent displayContent = getDisplayContent();
+ if (inPinnedWindowingMode() && displayContent != null) {
+ final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics();
// We multiply by two to match the client logic for converting view elevation
// to insets, as in {@link WindowManager.LayoutParams#setSurfaceInsets}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 331a0bd3da11..eab391ed74ce 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -183,6 +183,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
// build a surface.
mSurfaceControl = makeSurface().build();
getPendingTransaction().show(mSurfaceControl);
+ updateSurfacePosition();
} 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.
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
index 8446d252323f..6c7830e5cf79 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
@@ -17,6 +17,8 @@
package com.android.server.wm;
import android.support.test.filters.FlakyTest;
+import android.view.SurfaceControl;
+import android.view.SurfaceSession;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -43,6 +45,9 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyFloat;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -108,6 +113,21 @@ public class WindowContainerTests extends WindowTestsBase {
}
@Test
+ public void testAddChildSetsSurfacePosition() throws Exception {
+ MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer();
+
+ final SurfaceControl.Transaction transaction = mock(SurfaceControl.Transaction.class);
+ sWm.mTransactionFactory = () -> transaction;
+
+ WindowContainer child = new WindowContainer(sWm);
+ child.setBounds(1, 1, 10, 10);
+
+ verify(transaction, never()).setPosition(any(), anyFloat(), anyFloat());
+ top.addChild(child, 0);
+ verify(transaction, times(1)).setPosition(any(), eq(1.f), eq(1.f));
+ }
+
+ @Test
public void testAdd_AlreadyHasParent() throws Exception {
final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
final TestWindowContainer root = builder.setLayer(0).build();
@@ -825,4 +845,28 @@ public class WindowContainerTests extends WindowTestsBase {
return new TestWindowContainer(mLayer, mIsAnimating, mIsVisible, mOrientation);
}
}
+
+ private class MockSurfaceBuildingContainer extends WindowContainer<WindowContainer> {
+ final SurfaceSession mSession = new SurfaceSession();
+
+ MockSurfaceBuildingContainer() {
+ super(sWm);
+ }
+
+ class MockSurfaceBuilder extends SurfaceControl.Builder {
+ MockSurfaceBuilder(SurfaceSession ss) {
+ super(ss);
+ }
+
+ @Override
+ public SurfaceControl build() {
+ return mock(SurfaceControl.class);
+ }
+ }
+
+ @Override
+ SurfaceControl.Builder makeChildSurface(WindowContainer child) {
+ return new MockSurfaceBuilder(mSession);
+ }
+ }
}