Loading packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -40,4 +40,14 @@ public interface RecentsAnimationListener { * was running becomes ready for control. * was running becomes ready for control. */ */ void onTasksAppeared(RemoteAnimationTargetCompat[] app); void onTasksAppeared(RemoteAnimationTargetCompat[] app); /** * Called to request that the current task tile be switched out for a screenshot (if not * already). Once complete, onFinished should be called. * @return true if this impl will call onFinished. No other onSwitchToScreenshot impls will * be called afterwards (to avoid multiple calls to onFinished). */ default boolean onSwitchToScreenshot(Runnable onFinished) { return false; } } } packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java +23 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.shared.system; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_OPEN; Loading Loading @@ -244,6 +245,8 @@ public class RemoteTransitionCompat implements Parcelable { RecentsAnimationListener recents) { RecentsAnimationListener recents) { ArrayList<TransitionInfo.Change> openingTasks = null; ArrayList<TransitionInfo.Change> openingTasks = null; boolean cancelRecents = false; boolean cancelRecents = false; boolean homeGoingAway = false; boolean hasChangingApp = false; for (int i = info.getChanges().size() - 1; i >= 0; --i) { for (int i = info.getChanges().size() - 1; i >= 0; --i) { final TransitionInfo.Change change = info.getChanges().get(i); final TransitionInfo.Change change = info.getChanges().get(i); if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) { if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) { Loading @@ -257,7 +260,27 @@ public class RemoteTransitionCompat implements Parcelable { } } openingTasks.add(change); openingTasks.add(change); } } } else if (change.getMode() == TRANSIT_CLOSE || change.getMode() == TRANSIT_TO_BACK) { if (mRecentsTask.equals(change.getContainer())) { homeGoingAway = true; } } } else if (change.getMode() == TRANSIT_CHANGE) { hasChangingApp = true; } } if (hasChangingApp && homeGoingAway) { // This happens when a visible app is expanding (usually PiP). In this case, // The transition probably has a special-purpose animation, so finish recents // now and let it do its animation (since recents is going to be occluded). if (!recents.onSwitchToScreenshot(() -> { finish(true /* toHome */, false /* userLeaveHint */); })) { Log.w(TAG, "Recents callback doesn't support support switching to screenshot" + ", there might be a flicker."); finish(true /* toHome */, false /* userLeaveHint */); } return false; } } if (openingTasks == null) return false; if (openingTasks == null) return false; int pauseMatches = 0; int pauseMatches = 0; Loading Loading
packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -40,4 +40,14 @@ public interface RecentsAnimationListener { * was running becomes ready for control. * was running becomes ready for control. */ */ void onTasksAppeared(RemoteAnimationTargetCompat[] app); void onTasksAppeared(RemoteAnimationTargetCompat[] app); /** * Called to request that the current task tile be switched out for a screenshot (if not * already). Once complete, onFinished should be called. * @return true if this impl will call onFinished. No other onSwitchToScreenshot impls will * be called afterwards (to avoid multiple calls to onFinished). */ default boolean onSwitchToScreenshot(Runnable onFinished) { return false; } } }
packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java +23 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.shared.system; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_OPEN; Loading Loading @@ -244,6 +245,8 @@ public class RemoteTransitionCompat implements Parcelable { RecentsAnimationListener recents) { RecentsAnimationListener recents) { ArrayList<TransitionInfo.Change> openingTasks = null; ArrayList<TransitionInfo.Change> openingTasks = null; boolean cancelRecents = false; boolean cancelRecents = false; boolean homeGoingAway = false; boolean hasChangingApp = false; for (int i = info.getChanges().size() - 1; i >= 0; --i) { for (int i = info.getChanges().size() - 1; i >= 0; --i) { final TransitionInfo.Change change = info.getChanges().get(i); final TransitionInfo.Change change = info.getChanges().get(i); if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) { if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) { Loading @@ -257,7 +260,27 @@ public class RemoteTransitionCompat implements Parcelable { } } openingTasks.add(change); openingTasks.add(change); } } } else if (change.getMode() == TRANSIT_CLOSE || change.getMode() == TRANSIT_TO_BACK) { if (mRecentsTask.equals(change.getContainer())) { homeGoingAway = true; } } } else if (change.getMode() == TRANSIT_CHANGE) { hasChangingApp = true; } } if (hasChangingApp && homeGoingAway) { // This happens when a visible app is expanding (usually PiP). In this case, // The transition probably has a special-purpose animation, so finish recents // now and let it do its animation (since recents is going to be occluded). if (!recents.onSwitchToScreenshot(() -> { finish(true /* toHome */, false /* userLeaveHint */); })) { Log.w(TAG, "Recents callback doesn't support support switching to screenshot" + ", there might be a flicker."); finish(true /* toHome */, false /* userLeaveHint */); } return false; } } if (openingTasks == null) return false; if (openingTasks == null) return false; int pauseMatches = 0; int pauseMatches = 0; Loading