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

Commit 4c05505d authored by Gustav Sennton's avatar Gustav Sennton
Browse files

Use correct display context in Desktop>Fullscreen transition handler

Use the correct display context to get correct display bounds to scale
the task size bounds by.

Bug: 429585399
Flag: EXEMPT bugfix
Test: ExitDesktopTaskTransitionHandlerTest
Change-Id: Ieb3d9c1a704736d92a9ff7a22ece5416520875b5
parent d67a95f3
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1388,9 +1388,10 @@ public abstract class WMShellModule {
            Transitions transitions,
            Context context,
            InteractionJankMonitor interactionJankMonitor,
            @ShellMainThread Handler handler) {
            @ShellMainThread Handler handler,
            DisplayController displayController) {
        return new ExitDesktopTaskTransitionHandler(
                transitions, context, interactionJankMonitor, handler);
                transitions, context, interactionJankMonitor, handler, displayController);
    }

    @WMSingleton
+12 −4
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.jank.Cuj;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.util.LatencyTracker;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.shared.annotations.ShellMainThread;
import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.transition.Transitions;
@@ -77,14 +78,17 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
    private final Supplier<SurfaceControl.Transaction> mTransactionSupplier;
    private Point mPosition;

    private final DisplayController mDisplayController;

    public ExitDesktopTaskTransitionHandler(
            Transitions transitions,
            Context context,
            InteractionJankMonitor interactionJankMonitor,
            @ShellMainThread Handler handler
            @ShellMainThread Handler handler,
            DisplayController displayController
    ) {
        this(transitions, SurfaceControl.Transaction::new, context, interactionJankMonitor,
                handler);
                handler, displayController);
    }

    private ExitDesktopTaskTransitionHandler(
@@ -92,13 +96,15 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
            Supplier<SurfaceControl.Transaction> supplier,
            Context context,
            InteractionJankMonitor interactionJankMonitor,
            @ShellMainThread Handler handler) {
            @ShellMainThread Handler handler,
            DisplayController displayController) {
        mTransitions = transitions;
        mTransactionSupplier = supplier;
        mContext = context;
        mInteractionJankMonitor = interactionJankMonitor;
        mLatencyTracker = LatencyTracker.getInstance(mContext);
        mHandler = handler;
        mDisplayController = displayController;
    }

    /**
@@ -168,7 +174,9 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
        if (isExitDesktopModeTransition(type)
                && taskInfo.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
            // This Transition animates a task to fullscreen after being dragged to status bar
            final Resources resources = mContext.getResources();
            Context displayContext = mDisplayController.getDisplayContext(taskInfo.displayId);
            if (displayContext == null) displayContext = mContext;
            final Resources resources = displayContext.getResources();
            final DisplayMetrics metrics = resources.getDisplayMetrics();
            final int screenWidth = metrics.widthPixels;
            final int screenHeight = metrics.heightPixels;
+38 −11
Original line number Diff line number Diff line
@@ -18,18 +18,19 @@ package com.android.wm.shell.desktopmode;


import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.Display.DEFAULT_DISPLAY;

import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.animation.AnimatorTestRule;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.WindowConfiguration;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
@@ -49,6 +50,7 @@ import androidx.test.filters.SmallTest;

import com.android.internal.jank.InteractionJankMonitor;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.transition.Transitions;
@@ -67,6 +69,8 @@ import java.util.function.Supplier;
@TestableLooper.RunWithLooper
@RunWith(AndroidTestingRunner.class)
public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase {
    private static final int TRANSITION_TYPE = TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN;
    private static final int TASK_ID = 1;

    @Rule
    public final AnimatorTestRule mAnimatorTestRule = new AnimatorTestRule(this);
@@ -92,6 +96,9 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase {
    @Mock
    Handler mHandler;

    @Mock
    DisplayController mDisplayController;

    private Point mPoint;
    private ExitDesktopTaskTransitionHandler mExitDesktopTaskTransitionHandler;

@@ -101,30 +108,29 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase {

        doReturn(mExecutor).when(mTransitions).getMainExecutor();
        doReturn(new SurfaceControl.Transaction()).when(mTransactionFactory).get();
        doReturn(mContext).when(mDisplayController).getDisplayContext(DEFAULT_DISPLAY);
        doReturn(mResources).when(mContext).getResources();
        doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics();
        when(mResources.getDisplayMetrics())
                .thenReturn(getContext().getResources().getDisplayMetrics());

        mExitDesktopTaskTransitionHandler = new ExitDesktopTaskTransitionHandler(mTransitions,
                mContext, mInteractionJankMonitor, mHandler);
                mContext, mInteractionJankMonitor, mHandler, mDisplayController);
        mPoint = new Point(0, 0);
    }

    @Test
    public void testTransitExitDesktopModeAnimation() {
        final int transitionType = TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN;
        final int taskId = 1;
        WindowContainerTransaction wct = new WindowContainerTransaction();
        doReturn(mToken).when(mTransitions)
                .startTransition(transitionType, wct, mExitDesktopTaskTransitionHandler);
                .startTransition(TRANSITION_TYPE, wct, mExitDesktopTaskTransitionHandler);

        mExitDesktopTaskTransitionHandler.startTransition(DesktopModeTransitionSource.UNKNOWN,
                wct, mPoint, null);

        TransitionInfo.Change change =
                createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FULLSCREEN);
        TransitionInfo info = createTransitionInfo(TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN, change);
                createChange(WindowManager.TRANSIT_CHANGE, /* displayId= */ 0);
        TransitionInfo info = createTransitionInfo(TRANSITION_TYPE, change);

        final boolean animated = mExitDesktopTaskTransitionHandler
                .startAnimation(mToken, info,
@@ -137,12 +143,33 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase {
        assertTrue(animated);
    }

    private TransitionInfo.Change createChange(@WindowManager.TransitionType int type, int taskId,
            @WindowConfiguration.WindowingMode int windowingMode) {
    @Test
    public void exitDesktop_usesCorrectDisplay() {
        final int displayId = 2;
        doReturn(mContext).when(mDisplayController).getDisplayContext(displayId);
        WindowContainerTransaction wct = new WindowContainerTransaction();
        doReturn(mToken).when(mTransitions)
                .startTransition(TRANSITION_TYPE, wct, mExitDesktopTaskTransitionHandler);
        mExitDesktopTaskTransitionHandler.startTransition(DesktopModeTransitionSource.UNKNOWN,
                wct, mPoint, null);
        TransitionInfo.Change change =
                createChange(WindowManager.TRANSIT_CHANGE, displayId);
        TransitionInfo info = createTransitionInfo(TRANSITION_TYPE, change);

        mExitDesktopTaskTransitionHandler.startAnimation(mToken, info,
                new SurfaceControl.Transaction(), new SurfaceControl.Transaction(),
                mTransitionFinishCallback);

        verify(mDisplayController).getDisplayContext(displayId);
    }

    private TransitionInfo.Change createChange(
            @WindowManager.TransitionType int type, int displayId) {
        final ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
        taskInfo.taskId = taskId;
        taskInfo.taskId = TASK_ID;
        taskInfo.token = new WindowContainerToken(mock(IWindowContainerToken.class));
        taskInfo.configuration.windowConfiguration.setWindowingMode(windowingMode);
        taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
        taskInfo.displayId = displayId;
        SurfaceControl.Builder b = new SurfaceControl.Builder()
                .setName("test task");
        final TransitionInfo.Change change = new TransitionInfo.Change(