diff options
5 files changed, 24 insertions, 1 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 6d63fd0936dd..590b3db5fe84 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -70,6 +70,7 @@ import android.util.ArrayMap; import android.util.DisplayMetrics; import android.util.Singleton; import android.util.Size; +import android.view.IWindowContainer; import com.android.internal.app.LocalePicker; import com.android.internal.app.procstats.ProcessStats; @@ -2526,6 +2527,7 @@ public class ActivityManager { // Index of the stack in the display's stack list, can be used for comparison of stack order @UnsupportedAppUsage public int position; + public IWindowContainer stackToken; /** * The full configuration the stack is currently running in. * @hide @@ -2559,6 +2561,7 @@ public class ActivityManager { dest.writeInt(userId); dest.writeInt(visible ? 1 : 0); dest.writeInt(position); + dest.writeStrongInterface(stackToken); if (topActivity != null) { dest.writeInt(1); topActivity.writeToParcel(dest, 0); @@ -2590,6 +2593,7 @@ public class ActivityManager { userId = source.readInt(); visible = source.readInt() > 0; position = source.readInt(); + stackToken = IWindowContainer.Stub.asInterface(source.readStrongBinder()); if (source.readInt() > 0) { topActivity = ComponentName.readFromParcel(source); } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 6f6e65933502..22913e0f5dac 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -480,6 +480,7 @@ class ActivityStack extends TaskStack { mRootActivityContainer = mService.mRootActivityContainer; mHandler = new ActivityStackHandler(supervisor.mLooper); mWindowManager = mService.mWindowManager; + mRemoteToken = new RemoteToken(this); mCurrentUser = mService.mAmInternal.getCurrentUserId(); // Set display id before setting activity and window type to make sure it won't affect // stacks on a wrong display. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 3ef848cb0106..79c76b9ff8dc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3243,7 +3243,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private void sanitizeAndApplyConfigChange(ConfigurationContainer container, WindowContainerTransaction.Change change) { - if (!(container instanceof Task)) { + if (!(container instanceof Task || container instanceof ActivityStack)) { throw new RuntimeException("Invalid token in task transaction"); } // The "client"-facing API should prevent bad changes; however, just in case, sanitize diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 5a21016e54dc..06cce520d0bf 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -1250,6 +1250,7 @@ class RootActivityContainer extends ConfigurationContainer stack.getBounds(info.bounds); info.displayId = displayId; info.stackId = stack.mStackId; + info.stackToken = stack.mRemoteToken; info.userId = stack.mCurrentUser; info.visible = stack.shouldBeVisible(null); // A stack might be not attached to a display. diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index 39aa51a05764..a23e2f1589c1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -24,6 +25,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.app.Activity; +import android.app.ActivityManager; import android.graphics.Rect; import android.view.WindowContainerTransaction; @@ -76,5 +78,20 @@ public class ActivityTaskManagerServiceTests extends ActivityTestsBase { mService.applyContainerTransaction(t); assertEquals(newBounds, task.getBounds()); } + + @Test + public void testStackTransaction() { + removeGlobalMinSizeRestriction(); + final ActivityStack stack = new StackBuilder(mRootActivityContainer) + .setWindowingMode(WINDOWING_MODE_FREEFORM).build(); + ActivityManager.StackInfo info = + mService.getStackInfo(WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD); + WindowContainerTransaction t = new WindowContainerTransaction(); + assertEquals(stack.mRemoteToken, info.stackToken); + Rect newBounds = new Rect(10, 10, 100, 100); + t.setBounds(info.stackToken, new Rect(10, 10, 100, 100)); + mService.applyContainerTransaction(t); + assertEquals(newBounds, stack.getBounds()); + } } |