diff options
4 files changed, 97 insertions, 8 deletions
diff --git a/core/java/com/android/internal/policy/TransitionAnimation.java b/core/java/com/android/internal/policy/TransitionAnimation.java index 37c96e71a0a8..7ee1f17b34df 100644 --- a/core/java/com/android/internal/policy/TransitionAnimation.java +++ b/core/java/com/android/internal/policy/TransitionAnimation.java @@ -312,9 +312,9 @@ public class TransitionAnimation { /** Load animation by attribute Id from android package. */ @Nullable - public Animation loadDefaultAnimationAttr(int animAttr) { + public Animation loadDefaultAnimationAttr(int animAttr, boolean translucent) { return loadAnimationAttr(DEFAULT_PACKAGE, mDefaultWindowAnimationStyleResId, animAttr, - false /* translucent */); + translucent); } @Nullable diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index 56d51687603a..a225f4ec8349 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -408,7 +408,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { || type == TRANSIT_CLOSE || type == TRANSIT_TO_FRONT || type == TRANSIT_TO_BACK; - if (isOpenOrCloseTransition) { + final boolean isTranslucent = (change.getFlags() & FLAG_TRANSLUCENT) != 0; + if (isOpenOrCloseTransition && !isTranslucent) { // Use the overview background as the background for the animation final Context uiContext = ActivityThread.currentActivityThread() .getSystemUiContext(); @@ -729,14 +730,17 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { ? R.styleable.WindowAnimation_wallpaperCloseEnterAnimation : R.styleable.WindowAnimation_wallpaperCloseExitAnimation; } else if (type == TRANSIT_OPEN) { - if (isTask) { + // We will translucent open animation for translucent activities and tasks. Choose + // WindowAnimation_activityOpenEnterAnimation and set translucent here, then + // TransitionAnimation loads appropriate animation later. + if ((changeFlags & FLAG_TRANSLUCENT) != 0 && enter) { + translucent = true; + } + if (isTask && !translucent) { animAttr = enter ? R.styleable.WindowAnimation_taskOpenEnterAnimation : R.styleable.WindowAnimation_taskOpenExitAnimation; } else { - if ((changeFlags & FLAG_TRANSLUCENT) != 0 && enter) { - translucent = true; - } animAttr = enter ? R.styleable.WindowAnimation_activityOpenEnterAnimation : R.styleable.WindowAnimation_activityOpenExitAnimation; @@ -770,7 +774,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { .loadAnimationAttr(options.getPackageName(), options.getAnimations(), animAttr, translucent); } else { - a = mTransitionAnimation.loadDefaultAnimationAttr(animAttr); + a = mTransitionAnimation.loadDefaultAnimationAttr(animAttr, translucent); } } } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 29d17429fa6a..b096bf1412cb 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1526,6 +1526,9 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe if (task != null && task.voiceSession != null) { flags |= FLAG_IS_VOICE_INTERACTION; } + if (task != null && task.isTranslucent(null)) { + flags |= FLAG_TRANSLUCENT; + } final ActivityRecord record = wc.asActivityRecord(); if (record != null) { if (record.mUseTransferredAnimation) { 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 501f0c4ac1b3..74851972254c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -31,6 +31,7 @@ import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.window.TransitionInfo.FLAG_IS_WALLPAPER; import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER; +import static android.window.TransitionInfo.FLAG_TRANSLUCENT; import static android.window.TransitionInfo.isIndependent; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -327,6 +328,7 @@ public class TransitionTests extends WindowTestsBase { final ActivityRecord act = createActivityRecord(tasks[i]); // alternate so that the transition doesn't get promoted to the display area act.mVisibleRequested = (i % 2) == 0; // starts invisible + act.visibleIgnoringKeyguard = (i % 2) == 0; if (i == showWallpaperTask) { doReturn(true).when(act).showWallpaper(); } @@ -489,6 +491,86 @@ public class TransitionTests extends WindowTestsBase { } @Test + public void testOpenOpaqueTask() { + final Transition transition = createTestTransition(TRANSIT_OPEN); + ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges; + ArraySet<WindowContainer> participants = transition.mParticipants; + + final Task newTask = createTask(mDisplayContent); + doReturn(false).when(newTask).isTranslucent(any()); + final Task oldTask = createTask(mDisplayContent); + doReturn(false).when(oldTask).isTranslucent(any()); + + final ActivityRecord closing = createActivityRecord(oldTask); + closing.setOccludesParent(true); + final ActivityRecord opening = createActivityRecord(newTask); + opening.setOccludesParent(false); + // Start states. + changes.put(newTask, new Transition.ChangeInfo(false /* vis */, true /* exChg */)); + changes.put(oldTask, new Transition.ChangeInfo(true /* 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, newTask); + // End states. + closing.mVisibleRequested = true; + opening.mVisibleRequested = true; + + final int transit = transition.mType; + int flags = 0; + + // Check basic both tasks participating + participants.add(oldTask); + participants.add(newTask); + ArrayList<WindowContainer> targets = Transition.calculateTargets(participants, changes); + TransitionInfo info = Transition.calculateTransitionInfo(transit, flags, targets, changes); + assertEquals(2, info.getChanges().size()); + assertEquals(transit, info.getType()); + + assertTrue((info.getChanges().get(0).getFlags() & FLAG_TRANSLUCENT) == 0); + assertTrue((info.getChanges().get(1).getFlags() & FLAG_TRANSLUCENT) == 0); + } + + @Test + public void testOpenTranslucentTask() { + final Transition transition = createTestTransition(TRANSIT_OPEN); + ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges; + ArraySet<WindowContainer> participants = transition.mParticipants; + + final Task newTask = createTask(mDisplayContent); + doReturn(true).when(newTask).isTranslucent(any()); + final Task oldTask = createTask(mDisplayContent); + doReturn(false).when(oldTask).isTranslucent(any()); + + final ActivityRecord closing = createActivityRecord(oldTask); + closing.setOccludesParent(true); + final ActivityRecord opening = createActivityRecord(newTask); + opening.setOccludesParent(false); + // Start states. + changes.put(newTask, new Transition.ChangeInfo(false /* vis */, true /* exChg */)); + changes.put(oldTask, new Transition.ChangeInfo(true /* 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, newTask); + // End states. + closing.mVisibleRequested = true; + opening.mVisibleRequested = true; + + final int transit = transition.mType; + int flags = 0; + + // Check basic both tasks participating + participants.add(oldTask); + participants.add(newTask); + ArrayList<WindowContainer> targets = Transition.calculateTargets(participants, changes); + TransitionInfo info = Transition.calculateTransitionInfo(transit, flags, targets, changes); + assertEquals(2, info.getChanges().size()); + assertEquals(transit, info.getType()); + + assertTrue((info.getChanges().get(0).getFlags() & FLAG_TRANSLUCENT) != 0); + assertTrue((info.getChanges().get(1).getFlags() & FLAG_TRANSLUCENT) == 0); + } + + @Test public void testTimeout() { final TransitionController controller = new TransitionController(mAtm, mock(TaskSnapshotController.class)); |