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

Commit 5dc397ef authored by Maryam Dehaini's avatar Maryam Dehaini Committed by Automerger Merge Worker
Browse files

Merge "Handle recents transition using DefaultTransitionHandler when Desktop...

Merge "Handle recents transition using DefaultTransitionHandler when Desktop Mode Active" into udc-qpr-dev am: 184a6e57 am: 3c4a51f0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23396776



Change-Id: Ie5053c949285e57139012bd55191f9f331a62c9d
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 62abcbd5 3c4a51f0
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -542,9 +542,12 @@ public abstract class WMShellModule {
            Optional<PipTouchHandler> pipTouchHandlerOptional,
            Optional<RecentsTransitionHandler> recentsTransitionHandler,
            KeyguardTransitionHandler keyguardTransitionHandler,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopTasksController> desktopTasksController,
            Transitions transitions) {
        return new DefaultMixedHandler(shellInit, transitions, splitScreenOptional,
                pipTouchHandlerOptional, recentsTransitionHandler, keyguardTransitionHandler);
                pipTouchHandlerOptional, recentsTransitionHandler, keyguardTransitionHandler,
                desktopModeController, desktopTasksController);
    }

    @WMSingleton
+20 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_DE
import android.app.ActivityManager.RunningTaskInfo;
import android.app.WindowConfiguration;
import android.content.Context;
import android.content.res.TypedArray;
import android.database.ContentObserver;
import android.graphics.Region;
import android.net.Uri;
@@ -413,6 +414,25 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll
        return wct;
    }

    /**
     * Applies the proper surface states (rounded corners) to tasks when desktop mode is active.
     * This is intended to be used when desktop mode is part of another animation but isn't, itself,
     * animating.
     */
    public void syncSurfaceState(@NonNull TransitionInfo info,
            SurfaceControl.Transaction finishTransaction) {
        // Add rounded corners to freeform windows
        final TypedArray ta = mContext.obtainStyledAttributes(
                new int[]{android.R.attr.dialogCornerRadius});
        final int cornerRadius = ta.getDimensionPixelSize(0, 0);
        ta.recycle();
        for (TransitionInfo.Change change: info.getChanges()) {
            if (change.getTaskInfo().getWindowingMode() == WINDOWING_MODE_FREEFORM) {
                finishTransaction.setCornerRadius(change.getLeash(), cornerRadius);
            }
        }
    }

    /**
     * A {@link ContentObserver} for listening to changes to {@link Settings.System#DESKTOP_MODE}
     */
+21 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.desktopmode

import android.R
import android.app.ActivityManager.RunningTaskInfo
import android.app.WindowConfiguration.ACTIVITY_TYPE_HOME
import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
@@ -24,6 +25,7 @@ import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED
import android.app.WindowConfiguration.WindowingMode
import android.content.Context
import android.content.res.TypedArray
import android.graphics.Point
import android.graphics.Rect
import android.graphics.Region
@@ -460,6 +462,25 @@ class DesktopTasksController(
        }
    }

    /**
     * Applies the proper surface states (rounded corners) to tasks when desktop mode is active.
     * This is intended to be used when desktop mode is part of another animation but isn't, itself,
     * animating.
     */
    fun syncSurfaceState(
            info: TransitionInfo,
            finishTransaction: SurfaceControl.Transaction
    ) {
        // Add rounded corners to freeform windows
        val ta: TypedArray = context.obtainStyledAttributes(
                intArrayOf(R.attr.dialogCornerRadius))
        val cornerRadius = ta.getDimensionPixelSize(0, 0).toFloat()
        ta.recycle()
        info.changes
                .filter { it.taskInfo.windowingMode == WINDOWING_MODE_FREEFORM }
                .forEach { finishTransaction.setCornerRadius(it.leash, cornerRadius) }
    }

    private fun handleFreeformTaskLaunch(task: RunningTaskInfo): WindowContainerTransaction? {
        val activeTasks = desktopModeTaskRepository.getActiveTasks(task.displayId)
        if (activeTasks.none { desktopModeTaskRepository.isVisibleTask(it) }) {
+54 −2
Original line number Diff line number Diff line
@@ -40,6 +40,9 @@ import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransactionCallback;

import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.desktopmode.DesktopModeController;
import com.android.wm.shell.desktopmode.DesktopModeStatus;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
import com.android.wm.shell.pip.PipTransitionController;
import com.android.wm.shell.pip.phone.PipTouchHandler;
@@ -65,6 +68,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
    private RecentsTransitionHandler mRecentsHandler;
    private StageCoordinator mSplitHandler;
    private final KeyguardTransitionHandler mKeyguardHandler;
    private DesktopModeController mDesktopModeController;
    private DesktopTasksController mDesktopTasksController;

    private static class MixedTransition {
        static final int TYPE_ENTER_PIP_FROM_SPLIT = 1;
@@ -81,6 +86,9 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
        /** Keyguard exit/occlude/unocclude transition. */
        static final int TYPE_KEYGUARD = 5;

        /** Recents Transition while in desktop mode. */
        static final int TYPE_RECENTS_DURING_DESKTOP = 6;

        /** The default animation for this mixed transition. */
        static final int ANIM_TYPE_DEFAULT = 0;

@@ -132,7 +140,9 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
            Optional<SplitScreenController> splitScreenControllerOptional,
            Optional<PipTouchHandler> pipTouchHandlerOptional,
            Optional<RecentsTransitionHandler> recentsHandlerOptional,
            KeyguardTransitionHandler keyguardHandler) {
            KeyguardTransitionHandler keyguardHandler,
            Optional<DesktopModeController> desktopModeControllerOptional,
            Optional<DesktopTasksController> desktopTasksControllerOptional) {
        mPlayer = player;
        mKeyguardHandler = keyguardHandler;
        if (Transitions.ENABLE_SHELL_TRANSITIONS && pipTouchHandlerOptional.isPresent()
@@ -149,6 +159,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
                if (mRecentsHandler != null) {
                    mRecentsHandler.addMixer(this);
                }
                mDesktopModeController = desktopModeControllerOptional.orElse(null);
                mDesktopTasksController = desktopTasksControllerOptional.orElse(null);
            }, this);
        }
    }
@@ -218,7 +230,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,

    @Override
    public Transitions.TransitionHandler handleRecentsRequest(WindowContainerTransaction outWCT) {
        if (mRecentsHandler != null && mSplitHandler.isSplitScreenVisible()) {
        if (mRecentsHandler != null && (mSplitHandler.isSplitScreenVisible()
                || DesktopModeStatus.isActive(mPlayer.getContext()))) {
            return this;
        }
        return null;
@@ -233,6 +246,13 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
                    MixedTransition.TYPE_RECENTS_DURING_SPLIT, transition);
            mixed.mLeftoversHandler = mRecentsHandler;
            mActiveTransitions.add(mixed);
        } else if (DesktopModeStatus.isActive(mPlayer.getContext())) {
            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a recents request while "
                    + "desktop mode is active, so treat it as Mixed.");
            final MixedTransition mixed = new MixedTransition(
                    MixedTransition.TYPE_RECENTS_DURING_DESKTOP, transition);
            mixed.mLeftoversHandler = mRecentsHandler;
            mActiveTransitions.add(mixed);
        } else {
            throw new IllegalStateException("Accepted a recents transition but don't know how to"
                    + " handle it");
@@ -306,6 +326,9 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
        } else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
            return animateKeyguard(mixed, info, startTransaction, finishTransaction,
                    finishCallback);
        } else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_DESKTOP) {
            return animateRecentsDuringDesktop(mixed, info, startTransaction, finishTransaction,
                    finishCallback);
        } else {
            mActiveTransitions.remove(mixed);
            throw new IllegalStateException("Starting mixed animation without a known mixed type? "
@@ -582,6 +605,30 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
        return true;
    }

    private boolean animateRecentsDuringDesktop(@NonNull final MixedTransition mixed,
            @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        boolean consumed = mRecentsHandler.startAnimation(
                mixed.mTransition, info, startTransaction, finishTransaction, finishCallback);
        if (!consumed) {
            return false;
        }
        //Sync desktop mode state (proto 1)
        if (mDesktopModeController != null) {
            mDesktopModeController.syncSurfaceState(info, finishTransaction);
            return true;
        }
        //Sync desktop mode state (proto 2)
        if (mDesktopTasksController != null) {
            mDesktopTasksController.syncSurfaceState(info, finishTransaction);
            return true;
        }

        return false;
    }

    @Override
    public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
@@ -625,6 +672,9 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
                        finishCallback);
            } else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
                mKeyguardHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback);
            } else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_DESKTOP) {
                mixed.mLeftoversHandler.mergeAnimation(transition, info, t, mergeTarget,
                        finishCallback);
            } else {
                throw new IllegalStateException("Playing a mixed transition with unknown type? "
                        + mixed.mType);
@@ -650,6 +700,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
            mixed.mLeftoversHandler.onTransitionConsumed(transition, aborted, finishT);
        } else if (mixed.mType == MixedTransition.TYPE_KEYGUARD) {
            mKeyguardHandler.onTransitionConsumed(transition, aborted, finishT);
        } else if (mixed.mType == MixedTransition.TYPE_RECENTS_DURING_DESKTOP) {
            mixed.mLeftoversHandler.onTransitionConsumed(transition, aborted, finishT);
        }
    }
}