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

Commit 1dd19baf authored by Gustav Sennton's avatar Gustav Sennton Committed by Android (Google) Code Review
Browse files

Merge changes I9758ce69,I47c035c2,I33751555 into main

* changes:
  Split window limit minimize Change into its own transition
  Support splitting task limit minimize Change into its own transition
  Add TRANSIT_MINIMIZE_LIMIT transition type
parents 22260e0a ac886d87
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.view.SurfaceControl.Transaction
import android.window.TransitionInfo.Change
import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
import com.android.internal.jank.InteractionJankMonitor
import java.time.Duration

/** Creates minimization animation */
object MinimizeAnimator {
@@ -48,6 +49,7 @@ object MinimizeAnimator {
     * @param animationHandler the Handler that the animation is running on.
     */
    @JvmStatic
    @JvmOverloads
    fun create(
        context: Context,
        change: Change,
@@ -55,6 +57,7 @@ object MinimizeAnimator {
        onAnimFinish: (Animator) -> Unit,
        interactionJankMonitor: InteractionJankMonitor,
        animationHandler: Handler,
        startAnimDelay: Duration = Duration.ZERO,
    ): Animator {
        val boundsAnimator = WindowAnimator.createBoundsAnimator(
            context.resources.displayMetrics,
@@ -91,6 +94,7 @@ object MinimizeAnimator {
            }
        }
        return AnimatorSet().apply {
            startDelay = startAnimDelay.toMillis()
            playTogether(boundsAnimator, alphaAnimator)
            addListener(listener)
        }
+3 −1
Original line number Diff line number Diff line
@@ -944,7 +944,8 @@ public abstract class WMShellModule {
            ShellTaskOrganizer shellTaskOrganizer,
            DesksOrganizer desksOrganizer,
            DesktopConfig desktopConfig,
            DesktopState desktopState) {
            DesktopState desktopState,
            Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler) {
        if (!desktopState.canEnterDesktopMode()
                || !ENABLE_DESKTOP_WINDOWING_TASK_LIMIT.isTrue()) {
            return Optional.empty();
@@ -956,6 +957,7 @@ public abstract class WMShellModule {
                        desktopUserRepositories,
                        shellTaskOrganizer,
                        desksOrganizer,
                        desktopMixedTransitionHandler.get(),
                        maxTaskLimit <= 0 ? null : maxTaskLimit));
    }

+28 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.animation.Animator
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.os.Handler
import android.os.IBinder
import android.os.SystemProperties
import android.view.SurfaceControl.Transaction
import android.view.WindowManager.TRANSIT_TO_BACK
import android.window.TransitionInfo
@@ -29,10 +30,12 @@ import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.TransitionUtil
import com.android.wm.shell.shared.animation.MinimizeAnimator.create
import com.android.wm.shell.transition.Transitions
import java.time.Duration

/**
 * The [Transitions.TransitionHandler] that handles transitions for tasks that are:
@@ -63,7 +66,9 @@ class DesktopMinimizationTransitionHandler(
        finishCallback: Transitions.TransitionFinishCallback,
    ): Boolean {
        val shouldAnimate =
            TransitionUtil.isClosingType(info.type) || info.type == Transitions.TRANSIT_MINIMIZE
            TransitionUtil.isClosingType(info.type) ||
                info.type == Transitions.TRANSIT_MINIMIZE ||
                info.type == TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE
        if (!shouldAnimate) return false

        val animations = mutableListOf<Animator>()
@@ -80,14 +85,24 @@ class DesktopMinimizationTransitionHandler(

        val checkChangeMode = { change: TransitionInfo.Change ->
            change.mode == info.type ||
                (info.type == Transitions.TRANSIT_MINIMIZE && change.mode == TRANSIT_TO_BACK)
                (info.type == Transitions.TRANSIT_MINIMIZE && change.mode == TRANSIT_TO_BACK) ||
                (info.type == TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE &&
                    change.mode == TRANSIT_TO_BACK)
        }
        val startAnimDelay =
            if (info.type == TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE) {
                TASK_LIMIT_ANIM_START_DELAY
            } else {
                Duration.ZERO
            }
        animations +=
            info.changes
                .filter {
                    checkChangeMode(it) && it.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM
                }
                .mapNotNull { createMinimizeAnimation(it, finishTransaction, onAnimFinish) }
                .mapNotNull {
                    createMinimizeAnimation(it, finishTransaction, onAnimFinish, startAnimDelay)
                }
        if (animations.isEmpty()) return false
        animExecutor.execute { animations.forEach(Animator::start) }
        return true
@@ -97,6 +112,7 @@ class DesktopMinimizationTransitionHandler(
        change: TransitionInfo.Change,
        finishTransaction: Transaction,
        onAnimFinish: (Animator) -> Unit,
        startAnimDelay: Duration,
    ): Animator? {
        val t = Transaction()
        val sc = change.leash
@@ -117,6 +133,7 @@ class DesktopMinimizationTransitionHandler(
            onAnimFinish,
            InteractionJankMonitor.getInstance(),
            animHandler,
            startAnimDelay,
        )
    }

@@ -125,6 +142,14 @@ class DesktopMinimizationTransitionHandler(
            ProtoLog.w(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
        }

        private val TASK_LIMIT_ANIM_START_DELAY =
            Duration.ofMillis(
                SystemProperties.getLong(
                    "persist.wm.debug.desktop_transitions.minimize.start_delay_ms",
                    /* def= */ 0,
                )
            )

        const val TAG = "DesktopMinimizationTransitionHandler"
    }
}
+15 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.view.SurfaceControl
import android.view.WindowManager
import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_OPEN
import android.window.DesktopExperienceFlags
import android.window.DesktopModeFlags
import android.window.TransitionInfo
import android.window.TransitionInfo.Change
@@ -34,6 +35,7 @@ import androidx.annotation.VisibleForTesting
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE
import com.android.wm.shell.freeform.FreeformTaskTransitionHandler
import com.android.wm.shell.freeform.FreeformTaskTransitionStarter
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
@@ -97,6 +99,17 @@ class DesktopMixedTransitionHandler(
            }
    }

    /** Starts a task limit minimize transition for [taskId]. */
    fun startTaskLimitMinimizeTransition(wct: WindowContainerTransaction, taskId: Int): IBinder {
        return transitions
            .startTransition(TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE, wct, /* handler= */ this)
            .also { transition ->
                pendingMixedTransitions.add(
                    PendingMixedTransition.Minimize(transition, taskId, isLastTask = false)
                )
            }
    }

    /** Delegates starting PiP transition to [FreeformTaskTransitionHandler]. */
    override fun startPipTransition(wct: WindowContainerTransaction?): IBinder =
        freeformTaskTransitionHandler.startPipTransition(wct)
@@ -324,6 +337,8 @@ class DesktopMixedTransitionHandler(
        val shouldAnimate =
            if (info.type == Transitions.TRANSIT_MINIMIZE) {
                DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_BY_MINIMIZE_TRANSITION_BUGFIX.isTrue
            } else if (info.type == TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE) {
                DesktopExperienceFlags.ENABLE_DESKTOP_TASK_LIMIT_SEPARATE_TRANSITION.isTrue
            } else {
                DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue
            }
+4 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ object DesktopModeTransitionTypes {
    /** Transition type to animate the toggle resize between the max and default desktop sizes. */
    const val TRANSIT_DESKTOP_MODE_TOGGLE_RESIZE = TRANSIT_DESKTOP_MODE_TYPES + 12

    /** Transition type to animate the minimization triggered when reaching the task limit. */
    const val TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE = TRANSIT_DESKTOP_MODE_TYPES + 13

    /** Return whether the [TransitionType] corresponds to a transition to enter desktop mode. */
    @JvmStatic
    fun @receiver:TransitionType Int.isEnterDesktopModeTransition(): Boolean {
@@ -116,6 +119,7 @@ object DesktopModeTransitionTypes {
            TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP -> "DESKTOP_MODE_END_DRAG_TO_DESKTOP"
            TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP -> "DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP"
            TRANSIT_DESKTOP_MODE_TOGGLE_RESIZE -> "DESKTOP_MODE_TOGGLE_RESIZE"
            TRANSIT_DESKTOP_MODE_TASK_LIMIT_MINIMIZE -> "DESKTOP_MODE_TASK_LIMIT_MINIMIZE"
            else -> ""
        }
}
Loading