diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/Transition.java | 14 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/TransitionTests.java | 64 |
2 files changed, 76 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 147c9cb18315..96ad9ab5ff21 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1331,7 +1331,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " sibling is a participant with mode %s", TransitionInfo.modeToString(siblingMode)); - if (mode != siblingMode) { + if (reduceMode(mode) != reduceMode(siblingMode)) { ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " SKIP: common mode mismatch. was %s", TransitionInfo.modeToString(mode)); @@ -1341,6 +1341,16 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe return true; } + /** "reduces" a mode into a smaller set of modes that uniquely represents visibility change. */ + @TransitionInfo.TransitionMode + private static int reduceMode(@TransitionInfo.TransitionMode int mode) { + switch (mode) { + case TRANSIT_TO_BACK: return TRANSIT_CLOSE; + case TRANSIT_TO_FRONT: return TRANSIT_OPEN; + default: return mode; + } + } + /** * Go through topTargets and try to promote (see {@link #canPromote}) one of them. * @@ -1842,7 +1852,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe @TransitionInfo.TransitionMode int getTransitMode(@NonNull WindowContainer wc) { if ((mFlags & ChangeInfo.FLAG_ABOVE_TRANSIENT_LAUNCH) != 0) { - return TRANSIT_CLOSE; + return mExistenceChanged ? TRANSIT_CLOSE : TRANSIT_TO_BACK; } final boolean nowVisible = wc.isVisibleRequested(); if (nowVisible == mVisible) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 4435d62d7e60..e976fd455750 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -393,6 +393,70 @@ public class TransitionTests extends WindowTestsBase { } @Test + public void testCreateInfo_PromoteSimilarClose() { + final Transition transition = createTestTransition(TRANSIT_CLOSE); + ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges; + ArraySet<WindowContainer> participants = transition.mParticipants; + + final Task topTask = createTask(mDisplayContent); + final Task belowTask = createTask(mDisplayContent); + final ActivityRecord showing = createActivityRecord(belowTask); + final ActivityRecord hiding = createActivityRecord(topTask); + final ActivityRecord closing = createActivityRecord(topTask); + // Start states. + changes.put(topTask, new Transition.ChangeInfo(true /* vis */, false /* exChg */)); + changes.put(belowTask, new Transition.ChangeInfo(false /* vis */, false /* exChg */)); + changes.put(showing, new Transition.ChangeInfo(false /* vis */, false /* exChg */)); + changes.put(hiding, new Transition.ChangeInfo(true /* vis */, false /* exChg */)); + changes.put(closing, new Transition.ChangeInfo(true /* vis */, true /* exChg */)); + fillChangeMap(changes, topTask); + // End states. + showing.mVisibleRequested = true; + closing.mVisibleRequested = false; + hiding.mVisibleRequested = false; + + participants.add(belowTask); + participants.add(hiding); + participants.add(closing); + ArrayList<WindowContainer> targets = Transition.calculateTargets(participants, changes); + assertEquals(2, targets.size()); + assertTrue(targets.contains(belowTask)); + assertTrue(targets.contains(topTask)); + } + + @Test + public void testCreateInfo_PromoteSimilarOpen() { + final Transition transition = createTestTransition(TRANSIT_OPEN); + ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges; + ArraySet<WindowContainer> participants = transition.mParticipants; + + final Task topTask = createTask(mDisplayContent); + final Task belowTask = createTask(mDisplayContent); + final ActivityRecord showing = createActivityRecord(topTask); + final ActivityRecord opening = createActivityRecord(topTask); + final ActivityRecord closing = createActivityRecord(belowTask); + // Start states. + changes.put(topTask, new Transition.ChangeInfo(false /* vis */, false /* exChg */)); + changes.put(belowTask, new Transition.ChangeInfo(true /* vis */, false /* exChg */)); + changes.put(showing, new Transition.ChangeInfo(false /* vis */, false /* exChg */)); + changes.put(opening, new Transition.ChangeInfo(false /* vis */, true /* exChg */)); + changes.put(closing, new Transition.ChangeInfo(true /* vis */, false /* exChg */)); + fillChangeMap(changes, topTask); + // End states. + showing.mVisibleRequested = true; + opening.mVisibleRequested = true; + closing.mVisibleRequested = false; + + participants.add(belowTask); + participants.add(showing); + participants.add(opening); + ArrayList<WindowContainer> targets = Transition.calculateTargets(participants, changes); + assertEquals(2, targets.size()); + assertTrue(targets.contains(belowTask)); + assertTrue(targets.contains(topTask)); + } + + @Test public void testTargets_noIntermediatesToWallpaper() { final Transition transition = createTestTransition(TRANSIT_OPEN); |