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

Commit c28098f6 authored by Winson's avatar Winson
Browse files

Add ability to cancel task window transitions.

Bug: 25392381

Change-Id: I45f48edc21c058df0e4c22ceaf7e9aef5899a29c
parent 15ca73ac
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -201,6 +201,11 @@ interface IWindowManager
     */
    void setScreenCaptureDisabled(int userId, boolean disabled);

    /**
     * Cancels the window transitions for the given task.
     */
    void cancelTaskWindowTransition(int taskId);

    // These can only be called with the SET_ORIENTATION permission.
    /**
     * Update the current screen rotation based on the current state of
+9 −0
Original line number Diff line number Diff line
@@ -517,6 +517,15 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
                boolean hasRepKeyTimeElapsed = (SystemClock.elapsedRealtime() -
                        mLastTabKeyEventTime) > altTabKeyDelay;
                if (event.getRepeatCount() <= 0 || hasRepKeyTimeElapsed) {
                    // As we iterate to the next/previous task, cancel any current/lagging window
                    // transition animations
                    RecentsConfiguration config = Recents.getConfiguration();
                    RecentsActivityLaunchState launchState = config.getLaunchState();
                    if (launchState.launchedToTaskId != -1) {
                        SystemServicesProxy ssp = Recents.getSystemServices();
                        ssp.cancelWindowTransition(launchState.launchedToTaskId);
                    }

                    // Focus the next task in the stack
                    final boolean backward = event.isShiftPressed();
                    if (backward) {
+14 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import android.util.MutableBoolean;
import android.util.Pair;
import android.view.Display;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager;
import com.android.internal.app.AssistUtils;
import com.android.internal.os.BackgroundThread;
@@ -335,6 +336,19 @@ public class SystemServicesProxy {
        return stackInfo != null;
    }

    /**
     * Cancels the current window transtion to/from Recents for the given task id.
     */
    public void cancelWindowTransition(int taskId) {
        if (mWm == null) return;

        try {
            WindowManagerGlobal.getWindowManagerService().cancelTaskWindowTransition(taskId);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    /** Returns the top task thumbnail for the given task id */
    public Bitmap getTaskThumbnail(int taskId) {
        if (mAm == null) return null;
+41 −21
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsActivity;
import com.android.systemui.recents.RecentsActivityLaunchState;
import com.android.systemui.recents.RecentsAppWidgetHostView;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.events.EventBus;
@@ -587,6 +588,20 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
        return new AppTransitionAnimationSpec(taskId, b, rect);
    }

    /**
     * Cancels any running window transitions for the launched task (the task animating into
     * Recents).
     */
    private void cancelLaunchedTaskWindowTransition(final Task task) {
        SystemServicesProxy ssp = Recents.getSystemServices();
        RecentsConfiguration config = Recents.getConfiguration();
        RecentsActivityLaunchState launchState = config.getLaunchState();
        if (launchState.launchedToTaskId != -1 &&
                launchState.launchedToTaskId != task.key.id) {
            ssp.cancelWindowTransition(launchState.launchedToTaskId);
        }
    }

    /**** TaskStackView.TaskStackCallbacks Implementation ****/

    @Override
@@ -617,16 +632,20 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV

        // Compute the thumbnail to scale up from
        final SystemServicesProxy ssp = Recents.getSystemServices();
        boolean screenPinningRequested = false;
        ActivityOptions opts = null;
        ActivityOptions.OnAnimationStartedListener animStartedListener = null;
        if (task.thumbnail != null && task.thumbnail.getWidth() > 0 &&
                task.thumbnail.getHeight() > 0) {
            if (lockToTask) {
            animStartedListener = new ActivityOptions.OnAnimationStartedListener() {
                    boolean mTriggered = false;
                @Override
                public void onAnimationStarted() {
                        if (!mTriggered) {
                    // If we are launching into another task, cancel the previous task's
                    // window transition
                    cancelLaunchedTaskWindowTransition(task);

                    if (lockToTask) {
                        // Request screen pinning after the animation runs
                        postDelayed(new Runnable() {
                            @Override
                            public void run() {
@@ -634,17 +653,16 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
                                        getContext(), ssp));
                            }
                        }, 350);
                            mTriggered = true;
                    }
                }
            };
            }
            postDrawHeaderThumbnailTransitionRunnable(stackView, tv, offsetX, offsetY, stackScroll,
                    animStartedListener, destinationStack);
            opts = ActivityOptions.makeThumbnailAspectScaleUpAnimation(sourceView,
                    Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8).createAshmemBitmap(),
                    offsetX, offsetY, (int) transform.rect.width(), (int) transform.rect.height(),
                    sourceView.getHandler(), animStartedListener);
            screenPinningRequested = true;
        } else {
            opts = ActivityOptions.makeBasic();
        }
@@ -652,7 +670,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
            opts.setBounds(bounds.isEmpty() ? null : bounds);
        }
        final ActivityOptions launchOpts = opts;
        final boolean screenPinningRequested = (animStartedListener == null) && lockToTask;
        final boolean finalScreenPinningRequested = screenPinningRequested;
        final Runnable launchRunnable = new Runnable() {
            @Override
            public void run() {
@@ -660,9 +678,11 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
                    // Bring an active task to the foreground
                    ssp.moveTaskToFront(task.key.id, launchOpts);
                } else {
                    if (ssp.startActivityFromRecents(getContext(), task.key.id,
                            task.activityLabel, launchOpts)) {
                        if (screenPinningRequested) {
                    if (ssp.startActivityFromRecents(getContext(), task.key.id, task.activityLabel,
                            launchOpts)) {
                        if (!finalScreenPinningRequested) {
                            // If we have not requested this already to be run after the window
                            // transition, then just run it now
                            EventBus.getDefault().send(new ScreenPinningRequestEvent(
                                    getContext(), ssp));
                        }
+9 −0
Original line number Diff line number Diff line
@@ -320,6 +320,15 @@ class Task implements DimLayer.DimLayerUser {
        }
    }

    /**
     * Cancels any running app transitions associated with the task.
     */
    void cancelTaskWindowTransition() {
        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
            mAppTokens.get(activityNdx).mAppAnimator.clearAnimation();
        }
    }

    boolean showForAllUsers() {
        final int tokensCount = mAppTokens.size();
        return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers;
Loading