Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 11df410f authored by Evan Rosky's avatar Evan Rosky
Browse files

Detect "expand to fullscreen" over recents and switch to it

If a pip (or any other window) is expanded to fullscreen, it will
occlude recents. In this situation, we should immediately finish
the recents "animation" and let the new one play so we don't hang.

This also adds a new "callback" for "replace with screenshot".
We need this because if we just finish recents, it will immediately
destroy the "live" tile. So this callback lets us replace the
"live" tile with a screenshot beforehand.

Bug: 223321653
Test: Put app in Pip, open another app, go to recents, expand pip
Change-Id: I8a5ca05d5eef43e37c74f38b7988003bad7cdade
parent d5826ea5
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -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;
    }
}
}
+23 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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;