Loading services/core/java/com/android/server/wm/ActivityDisplay.java +9 −5 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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); } } } } Loading Loading @@ -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); } } } } services/core/java/com/android/server/wm/RecentsAnimation.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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(); } } Loading services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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; } } } } Loading services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +54 −13 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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()); } } } Loading
services/core/java/com/android/server/wm/ActivityDisplay.java +9 −5 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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); } } } } Loading Loading @@ -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); } } } }
services/core/java/com/android/server/wm/RecentsAnimation.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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(); } } Loading
services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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; } } } } Loading
services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +54 −13 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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()); } } }