diff options
| author | 2018-04-23 22:41:50 +0000 | |
|---|---|---|
| committer | 2018-04-23 22:41:50 +0000 | |
| commit | 8a4af9c3e830a5d456486593f3047e833f76b4b5 (patch) | |
| tree | 7f29d0d2dd54cc266d379ea7666c3e57218ae93a | |
| parent | 167710981c30ec8b23ecd7367a00c1d8fee7d263 (diff) | |
| parent | b1ea7ca7d3d0bb834056315cf7191524e043291a (diff) | |
Merge "Update surface position once created." into pi-dev
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); + } + } } |