Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 282ee67d authored by Evan Rosky's avatar Evan Rosky
Browse files

Include IWindowContainer token along with StackInfo

This is needed for stacks to participate in transactions.
Most immediate use-case will be PiP during rotation

Bug: 119687367
Test: Added ActivityTaskManagerServiceTests#testStackTransaction

Change-Id: I50a5c3cea4f23f2be4e55ba38f8a5371fa9dfe79
parent 9b96d060
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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);
            }
+1 −0
Original line number Diff line number Diff line
@@ -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.
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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.
+17 −0
Original line number Diff line number Diff line
@@ -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());
    }
}