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

Commit 576e3840 authored by Winson Chung's avatar Winson Chung Committed by Android (Google) Code Review
Browse files

Merge "Only cancel the recents anim upon visible stack order change"

parents 83103430 65d66d3e
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -212,7 +212,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        removeStackReferenceIfNeeded(stack);
        removeStackReferenceIfNeeded(stack);
        releaseSelfIfNeeded();
        releaseSelfIfNeeded();
        mService.updateSleepIfNeededLocked();
        mService.updateSleepIfNeededLocked();
        onStackOrderChanged();
        onStackOrderChanged(stack);
    }
    }


    void positionChildAtTop(ActivityStack stack, boolean includingParents) {
    void positionChildAtTop(ActivityStack stack, boolean includingParents) {
@@ -280,7 +280,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        if (!wasContained) {
        if (!wasContained) {
            stack.setParent(this);
            stack.setParent(this);
        }
        }
        onStackOrderChanged();
        onStackOrderChanged(stack);
    }
    }


    private int getTopInsertPosition(ActivityStack stack, int candidatePosition) {
    private int getTopInsertPosition(ActivityStack stack, int candidatePosition) {
@@ -1309,9 +1309,13 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        mStackOrderChangedCallbacks.remove(listener);
        mStackOrderChangedCallbacks.remove(listener);
    }
    }


    private void onStackOrderChanged() {
    /**
     * Notifies of a stack order change
     * @param stack The stack which triggered the order change
     */
    private void onStackOrderChanged(ActivityStack stack) {
        for (int i = mStackOrderChangedCallbacks.size() - 1; i >= 0; i--) {
        for (int i = mStackOrderChangedCallbacks.size() - 1; i >= 0; i--) {
            mStackOrderChangedCallbacks.get(i).onStackOrderChanged();
            mStackOrderChangedCallbacks.get(i).onStackOrderChanged(stack);
        }
        }
    }
    }


@@ -1390,6 +1394,6 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
     * Callback for when the order of the stacks in the display changes.
     * Callback for when the order of the stacks in the display changes.
     */
     */
    interface OnStackOrderChangedListener {
    interface OnStackOrderChangedListener {
        void onStackOrderChanged();
        void onStackOrderChanged(ActivityStack stack);
    }
    }
}
}
+8 −2
Original line number Original line Diff line number Diff line
@@ -387,7 +387,13 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
    }
    }


    @Override
    @Override
    public void onStackOrderChanged() {
    public void onStackOrderChanged(ActivityStack stack) {
        if (DEBUG) Slog.d(TAG, "onStackOrderChanged(): stack=" + stack);
        if (mDefaultDisplay.getIndexOf(stack) == -1 || !stack.shouldBeVisible(null)) {
            // The stack is not visible, so ignore this change
            return;
        }

        // If the activity display stack order changes, cancel any running recents animation in
        // If the activity display stack order changes, cancel any running recents animation in
        // place
        // place
        mWindowManager.cancelRecentsAnimationSynchronously(REORDER_KEEP_IN_PLACE,
        mWindowManager.cancelRecentsAnimationSynchronously(REORDER_KEEP_IN_PLACE,
@@ -429,7 +435,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
        }
        }


        for (int i = targetStack.getChildCount() - 1; i >= 0; i--) {
        for (int i = targetStack.getChildCount() - 1; i >= 0; i--) {
            final TaskRecord task = (TaskRecord) targetStack.getChildAt(i);
            final TaskRecord task = targetStack.getChildAt(i);
            if (task.getBaseIntent().getComponent().equals(component)) {
            if (task.getBaseIntent().getComponent().equals(component)) {
                return task.getTopActivity();
                return task.getTopActivity();
            }
            }
+1 −1
Original line number Original line Diff line number Diff line
@@ -797,7 +797,7 @@ public class ActivityStackTests extends ActivityTestsBase {
        public boolean mChanged = false;
        public boolean mChanged = false;


        @Override
        @Override
        public void onStackOrderChanged() {
        public void onStackOrderChanged(ActivityStack stack) {
            mChanged = true;
            mChanged = true;
        }
        }
    }
    }
+54 −13
Original line number Original line Diff line number Diff line
@@ -24,7 +24,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
@@ -65,22 +64,26 @@ public class RecentsAnimationTest extends ActivityTestsBase {
    }
    }


    @Test
    @Test
    public void testCancelAnimationOnStackOrderChange() {
    public void testCancelAnimationOnVisibleStackOrderChange() {
        ActivityStack fullscreenStack =
        ActivityDisplay display = mService.mRootActivityContainer.getDefaultDisplay();
                mService.mRootActivityContainer.getDefaultDisplay().createStack(
        ActivityStack fullscreenStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
                        WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
                ACTIVITY_TYPE_STANDARD, true /* onTop */);
        ActivityStack recentsStack = mService.mRootActivityContainer.getDefaultDisplay().createStack(
        new ActivityBuilder(mService)
                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS, true /* onTop */);
                .setComponent(new ComponentName(mContext.getPackageName(), "App1"))
        ActivityRecord recentsActivity = new ActivityBuilder(mService)
                .setCreateTask(true)
                .setStack(fullscreenStack)
                .build();
        ActivityStack recentsStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
                ACTIVITY_TYPE_RECENTS, true /* onTop */);
        new ActivityBuilder(mService)
                .setComponent(mRecentsComponent)
                .setComponent(mRecentsComponent)
                .setCreateTask(true)
                .setCreateTask(true)
                .setStack(recentsStack)
                .setStack(recentsStack)
                .build();
                .build();
        ActivityStack fullscreenStack2 =
        ActivityStack fullscreenStack2 = display.createStack(WINDOWING_MODE_FULLSCREEN,
                mService.mRootActivityContainer.getDefaultDisplay().createStack(
                ACTIVITY_TYPE_STANDARD, true /* onTop */);
                        WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
        new ActivityBuilder(mService)
        ActivityRecord fsActivity = new ActivityBuilder(mService)
                .setComponent(new ComponentName(mContext.getPackageName(), "App2"))
                .setComponent(new ComponentName(mContext.getPackageName(), "App1"))
                .setCreateTask(true)
                .setCreateTask(true)
                .setStack(fullscreenStack2)
                .setStack(fullscreenStack2)
                .build();
                .build();
@@ -97,4 +100,42 @@ public class RecentsAnimationTest extends ActivityTestsBase {
        verify(mService.mWindowManager, times(1)).cancelRecentsAnimationSynchronously(
        verify(mService.mWindowManager, times(1)).cancelRecentsAnimationSynchronously(
                eq(REORDER_KEEP_IN_PLACE), any());
                eq(REORDER_KEEP_IN_PLACE), any());
    }
    }

    @Test
    public void testKeepAnimationOnHiddenStackOrderChange() {
        ActivityDisplay display = mService.mRootActivityContainer.getDefaultDisplay();
        ActivityStack fullscreenStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
                ACTIVITY_TYPE_STANDARD, true /* onTop */);
        new ActivityBuilder(mService)
                .setComponent(new ComponentName(mContext.getPackageName(), "App1"))
                .setCreateTask(true)
                .setStack(fullscreenStack)
                .build();
        ActivityStack recentsStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
                ACTIVITY_TYPE_RECENTS, true /* onTop */);
        new ActivityBuilder(mService)
                .setComponent(mRecentsComponent)
                .setCreateTask(true)
                .setStack(recentsStack)
                .build();
        ActivityStack fullscreenStack2 = display.createStack(WINDOWING_MODE_FULLSCREEN,
                ACTIVITY_TYPE_STANDARD, true /* onTop */);
        new ActivityBuilder(mService)
                .setComponent(new ComponentName(mContext.getPackageName(), "App2"))
                .setCreateTask(true)
                .setStack(fullscreenStack2)
                .build();
        doReturn(true).when(mService.mWindowManager).canStartRecentsAnimation();

        // Start the recents animation
        Intent recentsIntent = new Intent();
        recentsIntent.setComponent(mRecentsComponent);
        mService.startRecentsActivity(recentsIntent, null, mock(IRecentsAnimationRunner.class));

        fullscreenStack.remove();

        // Ensure that the recents animation was NOT canceled
        verify(mService.mWindowManager, times(0)).cancelRecentsAnimationSynchronously(
                eq(REORDER_KEEP_IN_PLACE), any());
    }
}
}