Merge "Consider "similar" change modes the same for promotion purposes" into tm-qpr-dev

This commit is contained in:
Evan Rosky
2022-10-05 23:01:18 +00:00
committed by Android (Google) Code Review
2 changed files with 76 additions and 2 deletions

View File

@@ -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) {

View File

@@ -392,6 +392,70 @@ public class TransitionTests extends WindowTestsBase {
tasks[showWallpaperTask].mRemoteToken.toWindowContainerToken()).getFlags());
}
@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);