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

This commit is contained in:
Winson Chung
2018-12-17 17:45:39 +00:00
committed by Android (Google) Code Review
4 changed files with 72 additions and 21 deletions

View File

@@ -212,7 +212,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
removeStackReferenceIfNeeded(stack);
releaseSelfIfNeeded();
mService.updateSleepIfNeededLocked();
onStackOrderChanged();
onStackOrderChanged(stack);
}
void positionChildAtTop(ActivityStack stack, boolean includingParents) {
@@ -280,7 +280,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
if (!wasContained) {
stack.setParent(this);
}
onStackOrderChanged();
onStackOrderChanged(stack);
}
private int getTopInsertPosition(ActivityStack stack, int candidatePosition) {
@@ -1309,9 +1309,13 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
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--) {
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.
*/
interface OnStackOrderChangedListener {
void onStackOrderChanged();
void onStackOrderChanged(ActivityStack stack);
}
}

View File

@@ -387,7 +387,13 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
}
@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
// place
mWindowManager.cancelRecentsAnimationSynchronously(REORDER_KEEP_IN_PLACE,
@@ -429,7 +435,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
}
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)) {
return task.getTopActivity();
}

View File

@@ -797,7 +797,7 @@ public class ActivityStackTests extends ActivityTestsBase {
public boolean mChanged = false;
@Override
public void onStackOrderChanged() {
public void onStackOrderChanged(ActivityStack stack) {
mChanged = true;
}
}

View File

@@ -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.eq;
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.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
@@ -65,22 +64,26 @@ public class RecentsAnimationTest extends ActivityTestsBase {
}
@Test
public void testCancelAnimationOnStackOrderChange() {
ActivityStack fullscreenStack =
mService.mRootActivityContainer.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
ActivityStack recentsStack = mService.mRootActivityContainer.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS, true /* onTop */);
ActivityRecord recentsActivity = new ActivityBuilder(mService)
public void testCancelAnimationOnVisibleStackOrderChange() {
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 =
mService.mRootActivityContainer.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
ActivityRecord fsActivity = new ActivityBuilder(mService)
.setComponent(new ComponentName(mContext.getPackageName(), "App1"))
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();
@@ -97,4 +100,42 @@ public class RecentsAnimationTest extends ActivityTestsBase {
verify(mService.mWindowManager, times(1)).cancelRecentsAnimationSynchronously(
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());
}
}