Merge "Suppress app transition while recents is running" into tm-dev
This commit is contained in:
@@ -2485,6 +2485,12 @@
|
|||||||
"group": "WM_ERROR",
|
"group": "WM_ERROR",
|
||||||
"at": "com\/android\/server\/wm\/WindowManagerService.java"
|
"at": "com\/android\/server\/wm\/WindowManagerService.java"
|
||||||
},
|
},
|
||||||
|
"323235828": {
|
||||||
|
"message": "Delaying app transition for recents animation to finish",
|
||||||
|
"level": "VERBOSE",
|
||||||
|
"group": "WM_DEBUG_APP_TRANSITIONS",
|
||||||
|
"at": "com\/android\/server\/wm\/AppTransitionController.java"
|
||||||
|
},
|
||||||
"327461496": {
|
"327461496": {
|
||||||
"message": "Complete pause: %s",
|
"message": "Complete pause: %s",
|
||||||
"level": "VERBOSE",
|
"level": "VERBOSE",
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ import static com.android.server.wm.AppTransition.isNormalTransit;
|
|||||||
import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldAttachNavBarToApp;
|
import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldAttachNavBarToApp;
|
||||||
import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldStartNonAppWindowAnimationsForKeyguardExit;
|
import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldStartNonAppWindowAnimationsForKeyguardExit;
|
||||||
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
||||||
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
|
||||||
import static com.android.server.wm.WallpaperAnimationAdapter.shouldStartWallpaperAnimation;
|
import static com.android.server.wm.WallpaperAnimationAdapter.shouldStartWallpaperAnimation;
|
||||||
import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
|
import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
|
||||||
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
|
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
|
||||||
@@ -1142,13 +1143,17 @@ public class AppTransitionController {
|
|||||||
if (activity == null) {
|
if (activity == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (activity.isAnimating(PARENTS, ANIMATION_TYPE_RECENTS)) {
|
||||||
|
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
|
||||||
|
"Delaying app transition for recents animation to finish");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
|
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
|
||||||
"Check opening app=%s: allDrawn=%b startingDisplayed=%b "
|
"Check opening app=%s: allDrawn=%b startingDisplayed=%b "
|
||||||
+ "startingMoved=%b isRelaunching()=%b startingWindow=%s",
|
+ "startingMoved=%b isRelaunching()=%b startingWindow=%s",
|
||||||
activity, activity.allDrawn, activity.startingDisplayed,
|
activity, activity.allDrawn, activity.startingDisplayed,
|
||||||
activity.startingMoved, activity.isRelaunching(),
|
activity.startingMoved, activity.isRelaunching(),
|
||||||
activity.mStartingWindow);
|
activity.mStartingWindow);
|
||||||
|
|
||||||
final boolean allDrawn = activity.allDrawn && !activity.isRelaunching();
|
final boolean allDrawn = activity.allDrawn && !activity.isRelaunching();
|
||||||
if (!allDrawn && !activity.startingDisplayed && !activity.startingMoved) {
|
if (!allDrawn && !activity.startingDisplayed && !activity.startingMoved) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -1584,6 +1584,14 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void forAllWindowContainers(Consumer<WindowContainer> callback) {
|
||||||
|
callback.accept(this);
|
||||||
|
final int count = mChildren.size();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
mChildren.get(i).forAllWindowContainers(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For all windows at or below this container call the callback.
|
* For all windows at or below this container call the callback.
|
||||||
* @param callback Calls the {@link ToBooleanFunction#apply} method for each window found and
|
* @param callback Calls the {@link ToBooleanFunction#apply} method for each window found and
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
|
|||||||
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
|
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
|
||||||
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS;
|
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS;
|
||||||
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
|
||||||
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
||||||
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
|
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
|
||||||
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
|
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
|
||||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
|
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
|
||||||
@@ -3050,13 +3051,22 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cleanupRecentsAnimation(@RecentsAnimationController.ReorderMode int reorderMode) {
|
void cleanupRecentsAnimation(@RecentsAnimationController.ReorderMode int reorderMode) {
|
||||||
if (mRecentsAnimationController != null) {
|
if (mRecentsAnimationController != null) {
|
||||||
final RecentsAnimationController controller = mRecentsAnimationController;
|
final RecentsAnimationController controller = mRecentsAnimationController;
|
||||||
mRecentsAnimationController = null;
|
mRecentsAnimationController = null;
|
||||||
controller.cleanupAnimation(reorderMode);
|
controller.cleanupAnimation(reorderMode);
|
||||||
// TODO(mult-display): currently only default display support recents animation.
|
// TODO(multi-display): currently only default display support recents animation.
|
||||||
getDefaultDisplayContentLocked().mAppTransition.updateBooster();
|
// Cancel any existing app transition animation running in the legacy transition
|
||||||
|
// framework.
|
||||||
|
final DisplayContent dc = getDefaultDisplayContentLocked();
|
||||||
|
dc.mAppTransition.freeze();
|
||||||
|
dc.forAllWindowContainers((wc) -> {
|
||||||
|
if (wc.isAnimating(TRANSITION, ANIMATION_TYPE_APP_TRANSITION)) {
|
||||||
|
wc.cancelAnimation();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,8 +39,10 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat
|
|||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
|
||||||
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.spyOn;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
||||||
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
|
||||||
import static com.android.server.wm.WindowContainer.POSITION_TOP;
|
import static com.android.server.wm.WindowContainer.POSITION_TOP;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -48,7 +50,9 @@ import static org.junit.Assert.assertFalse;
|
|||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
@@ -404,6 +408,41 @@ public class AppTransitionTests extends WindowTestsBase {
|
|||||||
assertTrue(runner.mCancelled);
|
assertTrue(runner.mCancelled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDelayWhileRecents() {
|
||||||
|
final DisplayContent dc = createNewDisplay(Display.STATE_ON);
|
||||||
|
doReturn(false).when(dc).onDescendantOrientationChanged(any());
|
||||||
|
final Task task = createTask(dc);
|
||||||
|
|
||||||
|
// Simulate activity1 launches activity2.
|
||||||
|
final ActivityRecord activity1 = createActivityRecord(task);
|
||||||
|
activity1.setVisible(true);
|
||||||
|
activity1.mVisibleRequested = false;
|
||||||
|
activity1.allDrawn = true;
|
||||||
|
final ActivityRecord activity2 = createActivityRecord(task);
|
||||||
|
activity2.setVisible(false);
|
||||||
|
activity2.mVisibleRequested = true;
|
||||||
|
activity2.allDrawn = true;
|
||||||
|
|
||||||
|
dc.mClosingApps.add(activity1);
|
||||||
|
dc.mOpeningApps.add(activity2);
|
||||||
|
dc.prepareAppTransition(TRANSIT_OPEN);
|
||||||
|
assertTrue(dc.mAppTransition.containsTransitRequest(TRANSIT_OPEN));
|
||||||
|
|
||||||
|
// Wait until everything in animation handler get executed to prevent the exiting window
|
||||||
|
// from being removed during WindowSurfacePlacer Traversal.
|
||||||
|
waitUntilHandlersIdle();
|
||||||
|
|
||||||
|
// Start recents
|
||||||
|
doReturn(true).when(task)
|
||||||
|
.isSelfAnimating(anyInt(), eq(ANIMATION_TYPE_RECENTS));
|
||||||
|
|
||||||
|
dc.mAppTransitionController.handleAppTransitionReady();
|
||||||
|
|
||||||
|
verify(activity1, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean());
|
||||||
|
verify(activity2, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetAnimationStyleResId() {
|
public void testGetAnimationStyleResId() {
|
||||||
// Verify getAnimationStyleResId will return as LayoutParams.windowAnimations when without
|
// Verify getAnimationStyleResId will return as LayoutParams.windowAnimations when without
|
||||||
|
|||||||
Reference in New Issue
Block a user