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

Commit c892ddf1 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactor desktop specific callbacks..." into main

parents cb130ecb 43479778
Loading
Loading
Loading
Loading
+28 −2
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_PO
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT;
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT;


import static com.android.systemui.Flags.enableViewCaptureTracing;
import static com.android.systemui.Flags.enableViewCaptureTracing;
import static com.android.window.flags.Flags.enableInorderTransitionCallbacksForDesktop;


import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
@@ -100,6 +101,7 @@ import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver;
import com.android.wm.shell.desktopmode.DesktopDisplayEventHandler;
import com.android.wm.shell.desktopmode.DesktopDisplayEventHandler;
import com.android.wm.shell.desktopmode.DesktopImeHandler;
import com.android.wm.shell.desktopmode.DesktopImeHandler;
import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.DesktopInOrderTransitionObserver;
import com.android.wm.shell.desktopmode.DesktopMinimizationTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopMinimizationTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopModeDragAndDropAnimatorHelper;
import com.android.wm.shell.desktopmode.DesktopModeDragAndDropAnimatorHelper;
@@ -532,7 +534,8 @@ public abstract class WMShellModule {
            Optional<DesksTransitionObserver> desksTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver,
            DesktopState desktopState,
            DesktopState desktopState,
            Optional<DesktopImeHandler> desktopImeHandler,
            Optional<DesktopImeHandler> desktopImeHandler,
            Optional<DesktopBackNavTransitionObserver> desktopBackNavTransitionObserver) {
            Optional<DesktopBackNavTransitionObserver> desktopBackNavTransitionObserver,
            Optional<DesktopInOrderTransitionObserver> desktopInOrderTransitionObserver) {
        return new FreeformTaskTransitionObserver(
        return new FreeformTaskTransitionObserver(
                shellInit,
                shellInit,
                transitions,
                transitions,
@@ -544,7 +547,8 @@ public abstract class WMShellModule {
                desksTransitionObserver,
                desksTransitionObserver,
                desktopState,
                desktopState,
                desktopImeHandler,
                desktopImeHandler,
                desktopBackNavTransitionObserver);
                desktopBackNavTransitionObserver,
                desktopInOrderTransitionObserver);
    }
    }


    @WMSingleton
    @WMSingleton
@@ -994,6 +998,28 @@ public abstract class WMShellModule {
        return Optional.empty();
        return Optional.empty();
    }
    }


    @WMSingleton
    @Provides
    static Optional<DesktopInOrderTransitionObserver> provideDesktopInOrderTransitionObserver(
            ShellInit shellInit,
            Optional<DesktopImmersiveController> desktopImmersiveController,
            FocusTransitionObserver focusTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver,
            DesktopState desktopState,
            Optional<DesktopImeHandler> desktopImeHandler,
            Optional<DesktopBackNavTransitionObserver> desktopBackNavTransitionObserver) {
        if (enableInorderTransitionCallbacksForDesktop()
                && ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()
                && desktopState.canEnterDesktopMode()) {
            return Optional.of(new DesktopInOrderTransitionObserver(
                    desktopImmersiveController,
                    focusTransitionObserver,
                    desksTransitionObserver,
                    desktopImeHandler,
                    desktopBackNavTransitionObserver));
        }
        return Optional.empty();
    }
    @WMSingleton
    @WMSingleton
    @Provides
    @Provides
    static Optional<DesktopTasksLimiter> provideDesktopTasksLimiter(
    static Optional<DesktopTasksLimiter> provideDesktopTasksLimiter(
+99 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.desktopmode

import android.os.IBinder
import android.view.SurfaceControl
import android.window.DesktopModeFlags
import android.window.TransitionInfo
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.transition.FocusTransitionObserver
import com.android.wm.shell.transition.Transitions
import java.util.Optional

/** Keeps the Desktop related [TransitionObserver] callbacks in sync. */
class DesktopInOrderTransitionObserver(
    private val desktopImmersiveController: Optional<DesktopImmersiveController>,
    private val focusTransitionObserver: FocusTransitionObserver,
    private val desksTransitionObserver: Optional<DesksTransitionObserver>,
    private val desktopImeHandler: Optional<DesktopImeHandler>,
    private val desktopBackNavTransitionObserver: Optional<DesktopBackNavTransitionObserver>,
) : Transitions.TransitionObserver {

    override fun onTransitionReady(
        transition: IBinder,
        info: TransitionInfo,
        startT: SurfaceControl.Transaction,
        finishT: SurfaceControl.Transaction,
    ) {
        // Update desk state first, otherwise [TaskChangeListener] may update desktop task state
        // under an outdated active desk if a desk switch and a task update happen in the same
        // transition, such as when unminimizing a task from an inactive desk.
        desksTransitionObserver.ifPresent { it.onTransitionReady(transition, info) }

        if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) {
            // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository
            //  is updated from there **before** the |mWindowDecorViewModel| methods are invoked.
            //  Otherwise window decoration relayout won't run with the immersive state up to date.
            desktopImmersiveController.ifPresent {
                it.onTransitionReady(transition, info, startT, finishT)
            }
        }
        // Update focus state first to ensure the correct state can be queried from listeners.
        // TODO(371503964): Remove this once the unified task repository is ready.
        focusTransitionObserver.updateFocusState(info)

        // Call after the focus state update to have the correct focused window.
        desktopImeHandler.ifPresent { it.onTransitionReady(transition, info) }
        desktopBackNavTransitionObserver.ifPresent { it.onTransitionReady(transition, info) }
    }

    override fun onTransitionStarting(transition: IBinder) {
        if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) {
            // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
            desktopImmersiveController.ifPresent { it.onTransitionStarting(transition) }
        }
    }

    override fun onTransitionMerged(merged: IBinder, playing: IBinder) {
        desksTransitionObserver.ifPresent { it.onTransitionMerged(merged, playing) }
        if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) {
            // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
            desktopImmersiveController.ifPresent { it.onTransitionMerged(merged, playing) }
        }
    }

    override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {
        desksTransitionObserver.ifPresent { it.onTransitionFinished(transition) }
        if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue) {
            // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
            desktopImmersiveController.ifPresent { h ->
                h.onTransitionFinished(transition, aborted)
            }
        }
    }

    private fun logD(msg: String, vararg arguments: Any?) {
        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }

    companion object {
        private const val TAG = "DesktopInOrderTransitionObserver"
    }
}
+56 −29
Original line number Original line Diff line number Diff line
@@ -30,9 +30,11 @@ import android.window.WindowContainerToken;
import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.VisibleForTesting;


import com.android.window.flags.Flags;
import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver;
import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver;
import com.android.wm.shell.desktopmode.DesktopImeHandler;
import com.android.wm.shell.desktopmode.DesktopImeHandler;
import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.DesktopInOrderTransitionObserver;
import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer;
import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer;
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver;
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver;
import com.android.wm.shell.shared.desktopmode.DesktopState;
import com.android.wm.shell.shared.desktopmode.DesktopState;
@@ -63,6 +65,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
    private final Optional<DesksTransitionObserver> mDesksTransitionObserver;
    private final Optional<DesksTransitionObserver> mDesksTransitionObserver;
    private final Optional<DesktopImeHandler> mDesktopImeHandler;
    private final Optional<DesktopImeHandler> mDesktopImeHandler;
    private final Optional<DesktopBackNavTransitionObserver> mDesktopBackNavTransitionObserver;
    private final Optional<DesktopBackNavTransitionObserver> mDesktopBackNavTransitionObserver;
    private final Optional<DesktopInOrderTransitionObserver> mDesktopInOrderTransitionObserver;


    private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo =
    private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo =
            new HashMap<>();
            new HashMap<>();
@@ -81,7 +84,8 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
            Optional<DesksTransitionObserver> desksTransitionObserver,
            Optional<DesksTransitionObserver> desksTransitionObserver,
            DesktopState desktopState,
            DesktopState desktopState,
            Optional<DesktopImeHandler> desktopImeHandler,
            Optional<DesktopImeHandler> desktopImeHandler,
            Optional<DesktopBackNavTransitionObserver> desktopBackNavTransitionObserver) {
            Optional<DesktopBackNavTransitionObserver> desktopBackNavTransitionObserver,
            Optional<DesktopInOrderTransitionObserver> desktopInOrderTransitionObserver) {
        mTransitions = transitions;
        mTransitions = transitions;
        mDesktopImmersiveController = desktopImmersiveController;
        mDesktopImmersiveController = desktopImmersiveController;
        mWindowDecorViewModel = windowDecorViewModel;
        mWindowDecorViewModel = windowDecorViewModel;
@@ -91,6 +95,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
        mDesksTransitionObserver = desksTransitionObserver;
        mDesksTransitionObserver = desksTransitionObserver;
        mDesktopImeHandler = desktopImeHandler;
        mDesktopImeHandler = desktopImeHandler;
        mDesktopBackNavTransitionObserver = desktopBackNavTransitionObserver;
        mDesktopBackNavTransitionObserver = desktopBackNavTransitionObserver;
        mDesktopInOrderTransitionObserver = desktopInOrderTransitionObserver;
        if (FreeformComponents.requiresFreeformComponents(desktopState)) {
        if (FreeformComponents.requiresFreeformComponents(desktopState)) {
            shellInit.addInitCallback(this::onInit, this);
            shellInit.addInitCallback(this::onInit, this);
        }
        }
@@ -107,14 +112,21 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
            @NonNull TransitionInfo info,
            @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startT,
            @NonNull SurfaceControl.Transaction startT,
            @NonNull SurfaceControl.Transaction finishT) {
            @NonNull SurfaceControl.Transaction finishT) {
        if (Flags.enableInorderTransitionCallbacksForDesktop()) {
            mDesktopInOrderTransitionObserver.ifPresent(
                    o -> o.onTransitionReady(transition, info, startT, finishT));
        } else {
            // Update desk state first, otherwise [TaskChangeListener] may update desktop task state
            // Update desk state first, otherwise [TaskChangeListener] may update desktop task state
            // under an outdated active desk if a desk switch and a task update happen in the same
            // under an outdated active desk if a desk switch and a task update happen in the same
            // transition, such as when unminimizing a task from an inactive desk.
            // transition, such as when unminimizing a task from an inactive desk.
            mDesksTransitionObserver.ifPresent(o -> o.onTransitionReady(transition, info));
            mDesksTransitionObserver.ifPresent(o -> o.onTransitionReady(transition, info));
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
            // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the
            //  is updated from there **before** the |mWindowDecorViewModel| methods are invoked.
                //  repository
            //  Otherwise window decoration relayout won't run with the immersive state up to date.
                //  is updated from there **before** the |mWindowDecorViewModel| methods are
                //  invoked.
                //  Otherwise window decoration relayout won't run with the immersive state up to
                //  date.
                mDesktopImmersiveController.ifPresent(
                mDesktopImmersiveController.ifPresent(
                        h -> h.onTransitionReady(transition, info, startT, finishT));
                        h -> h.onTransitionReady(transition, info, startT, finishT));
            }
            }
@@ -126,6 +138,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs
            mDesktopImeHandler.ifPresent(o -> o.onTransitionReady(transition, info));
            mDesktopImeHandler.ifPresent(o -> o.onTransitionReady(transition, info));
            mDesktopBackNavTransitionObserver.ifPresent(o -> o.onTransitionReady(transition, info));
            mDesktopBackNavTransitionObserver.ifPresent(o -> o.onTransitionReady(transition, info));


        }
        final ArrayList<ActivityManager.RunningTaskInfo> taskInfoList = new ArrayList<>();
        final ArrayList<ActivityManager.RunningTaskInfo> taskInfoList = new ArrayList<>();
        final ArrayList<WindowContainerToken> taskParents = new ArrayList<>();
        final ArrayList<WindowContainerToken> taskParents = new ArrayList<>();
        final ArrayList<TransitionInfo.Change> filteredChanges = new ArrayList<>();
        final ArrayList<TransitionInfo.Change> filteredChanges = new ArrayList<>();
@@ -268,19 +281,27 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs


    @Override
    @Override
    public void onTransitionStarting(@NonNull IBinder transition) {
    public void onTransitionStarting(@NonNull IBinder transition) {
        if (Flags.enableInorderTransitionCallbacksForDesktop()) {
            mDesktopInOrderTransitionObserver.ifPresent(o -> o.onTransitionStarting(transition));
        } else {
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
                mDesktopImmersiveController.ifPresent(h -> h.onTransitionStarting(transition));
                mDesktopImmersiveController.ifPresent(h -> h.onTransitionStarting(transition));
            }
            }
        }
        }
    }


    @Override
    @Override
    public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {
    public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {
        if (Flags.enableInorderTransitionCallbacksForDesktop()) {
            mDesktopInOrderTransitionObserver.ifPresent(o -> o.onTransitionMerged(merged, playing));
        } else {
            mDesksTransitionObserver.ifPresent(o -> o.onTransitionMerged(merged, playing));
            mDesksTransitionObserver.ifPresent(o -> o.onTransitionMerged(merged, playing));
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
                mDesktopImmersiveController.ifPresent(h -> h.onTransitionMerged(merged, playing));
                mDesktopImmersiveController.ifPresent(h -> h.onTransitionMerged(merged, playing));
            }
            }
        }


        final List<ActivityManager.RunningTaskInfo> infoOfMerged =
        final List<ActivityManager.RunningTaskInfo> infoOfMerged =
                mTransitionToTaskInfo.get(merged);
                mTransitionToTaskInfo.get(merged);
@@ -302,10 +323,16 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs


    @Override
    @Override
    public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {
    public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {
        if (Flags.enableInorderTransitionCallbacksForDesktop()) {
            mDesktopInOrderTransitionObserver.ifPresent(
                    o -> o.onTransitionFinished(transition, aborted));
        } else {
            mDesksTransitionObserver.ifPresent(o -> o.onTransitionFinished(transition));
            mDesksTransitionObserver.ifPresent(o -> o.onTransitionFinished(transition));
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
            if (DesktopModeFlags.ENABLE_FULLY_IMMERSIVE_IN_DESKTOP.isTrue()) {
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
                // TODO(b/367268953): Remove when DesktopTaskListener is introduced.
            mDesktopImmersiveController.ifPresent(h -> h.onTransitionFinished(transition, aborted));
                mDesktopImmersiveController.ifPresent(
                        h -> h.onTransitionFinished(transition, aborted));
            }
        }
        }


        final List<ActivityManager.RunningTaskInfo> taskInfo =
        final List<ActivityManager.RunningTaskInfo> taskInfo =
+154 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.desktopmode

import android.os.IBinder
import android.platform.test.annotations.EnableFlags
import android.testing.AndroidTestingRunner
import android.view.SurfaceControl
import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
import androidx.test.filters.SmallTest
import com.android.window.flags.Flags
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver
import com.android.wm.shell.transition.FocusTransitionObserver
import com.android.wm.shell.transition.TransitionInfoBuilder
import com.android.wm.shell.util.StubTransaction
import java.util.Optional
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify

/**
 * Tests for {@link DesktopInOrderTransitionObserver}
 *
 * Build/Install/Run: atest WMShellUnitTests:DesktopInOrderTransitionObserverTest
 */
@SmallTest
@RunWith(AndroidTestingRunner::class)
class DesktopInOrderTransitionObserverTest : ShellTestCase() {
    private val desktopImmersiveController = mock<DesktopImmersiveController>()
    private val focusTransitionObserver = mock<FocusTransitionObserver>()
    private val desksTransitionObserver = mock<DesksTransitionObserver>()
    private val desktopImeHandler = mock<DesktopImeHandler>()
    private val desktopBackNavTransitionObserver = mock<DesktopBackNavTransitionObserver>()
    private lateinit var transitionObserver: DesktopInOrderTransitionObserver

    @Before
    fun setUp() {
        transitionObserver =
            DesktopInOrderTransitionObserver(
                Optional.of(desktopImmersiveController),
                focusTransitionObserver,
                Optional.of(desksTransitionObserver),
                Optional.of(desktopImeHandler),
                Optional.of(desktopBackNavTransitionObserver),
            )
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP,
        Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP,
    )
    fun onTransitionReady_forwardsToDesktopImmersiveController() {
        val transition = Mockito.mock(IBinder::class.java)
        val info = TransitionInfoBuilder(TRANSIT_CHANGE, 0).build()
        val startT = mock<SurfaceControl.Transaction>()
        val finishT = mock<SurfaceControl.Transaction>()

        transitionObserver.onTransitionReady(transition, info, startT, finishT)

        verify(desktopImmersiveController).onTransitionReady(transition, info, startT, finishT)
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP,
        Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP,
    )
    fun onTransitionMerged_forwardsToDesktopImmersiveController() {
        val merged = Mockito.mock(IBinder::class.java)
        val playing = Mockito.mock(IBinder::class.java)

        transitionObserver.onTransitionMerged(merged, playing)

        verify(desktopImmersiveController).onTransitionMerged(merged, playing)
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP,
        Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP,
    )
    fun onTransitionStarting_forwardsToDesktopImmersiveController() {
        val transition = Mockito.mock(IBinder::class.java)

        transitionObserver.onTransitionStarting(transition)

        verify(desktopImmersiveController).onTransitionStarting(transition)
    }

    @Test
    @EnableFlags(
        Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP,
        Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP,
    )
    fun onTransitionFinished_forwardsToDesktopImmersiveController() {
        val transition = Mockito.mock(IBinder::class.java)

        transitionObserver.onTransitionFinished(transition, /* aborted= */ false)

        verify(desktopImmersiveController).onTransitionFinished(transition, /* aborted= */ false)
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP)
    fun onTransitionReady_forwardsToDesksTransitionObserver() {
        val transition = Mockito.mock(IBinder::class.java)
        val info = TransitionInfoBuilder(TRANSIT_CLOSE, /* flags= */ 0).build()

        transitionObserver.onTransitionReady(transition, info, StubTransaction(), StubTransaction())

        verify(desksTransitionObserver).onTransitionReady(transition, info)
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP)
    fun onTransitionMerged_forwardsToDesksTransitionObserver() {
        val merged = Mockito.mock(IBinder::class.java)
        val playing = Mockito.mock(IBinder::class.java)

        transitionObserver.onTransitionMerged(merged, playing)

        verify(desksTransitionObserver).onTransitionMerged(merged, playing)
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_INORDER_TRANSITION_CALLBACKS_FOR_DESKTOP)
    fun onTransitionFinished_forwardsToDesksTransitionObserver() {
        val transition = Mockito.mock(IBinder::class.java)

        transitionObserver.onTransitionFinished(transition, /* aborted= */ false)

        verify(desksTransitionObserver).onTransitionFinished(transition)
    }
}
+49 −1

File changed.

Preview size limit exceeded, changes collapsed.