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

Commit 8ba4c5ce authored by Chris Li's avatar Chris Li Committed by Automerger Merge Worker
Browse files

Merge "Determine whether to support activities in multi window (8/n)" into sc-dev am: b4aec620

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14412466

Change-Id: Ib2ed2565df13e6ef02d2bf756ddb38961a65fe4a
parents a258dcd3 b4aec620
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -182,6 +182,11 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.LayoutChan

    @Override
    public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
        if (!taskInfo.supportsMultiWindow) {
            // Dismiss AppPair if the task no longer supports multi window.
            mController.unpair(mRootTaskInfo.taskId);
            return;
        }
        if (taskInfo.taskId == getRootTaskId()) {
            if (mRootTaskInfo.isVisible != taskInfo.isVisible) {
                mSyncQueue.runInSync(t -> {
+16 −0
Original line number Diff line number Diff line
@@ -203,6 +203,22 @@ class LegacySplitScreenTaskListener implements ShellTaskOrganizer.TaskListener {
            return;
        }
        synchronized (this) {
            if (!taskInfo.supportsMultiWindow) {
                if (mSplitScreenController.isDividerVisible()) {
                    // Dismiss the split screen if the task no longer supports multi window.
                    if (taskInfo.taskId == mPrimary.taskId
                            || taskInfo.parentTaskId == mPrimary.taskId) {
                        // If the primary is focused, dismiss to primary.
                        mSplitScreenController
                                .startDismissSplit(taskInfo.isFocused /* toPrimaryTask */);
                    } else {
                        // If the secondary is not focused, dismiss to primary.
                        mSplitScreenController
                                .startDismissSplit(!taskInfo.isFocused /* toPrimaryTask */);
                    }
                }
                return;
            }
            if (taskInfo.hasParentTask()) {
                // changed messages are noisy since it reports on every ensureVisibility. This
                // conflicts with legacy app-transitions which "swaps" the position to a
+7 −0
Original line number Diff line number Diff line
@@ -908,6 +908,13 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener,
            StageCoordinator.this.onStageRootTaskVanished(this);
        }

        @Override
        public void onNoLongerSupportMultiWindow() {
            if (mMainStage.isActive()) {
                StageCoordinator.this.exitSplitScreen();
            }
        }

        private void reset() {
            mHasRootTask = false;
            mVisible = false;
+6 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
        void onStatusChanged(boolean visible, boolean hasChildren);
        void onChildTaskStatusChanged(int taskId, boolean present, boolean visible);
        void onRootTaskVanished();
        void onNoLongerSupportMultiWindow();
    }
    private final StageListenerCallbacks mCallbacks;
    private final SyncTransactionQueue mSyncQueue;
@@ -113,6 +114,11 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
    @Override
    @CallSuper
    public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
        if (!taskInfo.supportsMultiWindow) {
            // Leave split screen if the task no longer supports multi window.
            mCallbacks.onNoLongerSupportMultiWindow();
            return;
        }
        if (mRootTaskInfo.taskId == taskInfo.taskId) {
            mRootTaskInfo = taskInfo;
        } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {
+24 −1
Original line number Diff line number Diff line
@@ -18,9 +18,12 @@ package com.android.wm.shell.apppairs;

import static android.view.Display.DEFAULT_DISPLAY;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.ActivityManager;
@@ -43,7 +46,11 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

/** Tests for {@link AppPair} */
/**
 * Tests for {@link AppPair}
 * Build/Install/Run:
 *  atest WMShellUnitTests:AppPairTests
 */
@SmallTest
@RunWith(AndroidJUnit4.class)
public class AppPairTests extends ShellTestCase {
@@ -63,6 +70,7 @@ public class AppPairTests extends ShellTestCase {
                mTaskOrganizer,
                mSyncQueue,
                mDisplayController);
        spyOn(mController);
    }

    @After
@@ -97,4 +105,19 @@ public class AppPairTests extends ShellTestCase {
        assertThat(pair.contains(task1.taskId)).isFalse();
        assertThat(pair.contains(task2.taskId)).isFalse();
    }

    @Test
    @UiThreadTest
    public void testOnTaskInfoChanged_notSupportsMultiWindow() {
        final ActivityManager.RunningTaskInfo task1 = new TestRunningTaskInfoBuilder().build();
        final ActivityManager.RunningTaskInfo task2 = new TestRunningTaskInfoBuilder().build();

        final AppPair pair = mController.pairInner(task1, task2);
        assertThat(pair.contains(task1.taskId)).isTrue();
        assertThat(pair.contains(task2.taskId)).isTrue();

        task1.supportsMultiWindow = false;
        pair.onTaskInfoChanged(task1);
        verify(mController).unpair(pair.getRootTaskId());
    }
}
Loading