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

Commit 06449de7 authored by Jorge Gil's avatar Jorge Gil Committed by Android (Google) Code Review
Browse files

Merge "Close the decoration before removing it from the cache" into main

parents bbc6941c aa6eda44
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -133,8 +133,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
    private final ExclusionRegionListener mExclusionRegionListener =
            new ExclusionRegionListenerImpl();

    private final SparseArray<DesktopModeWindowDecoration> mWindowDecorByTaskId =
            new SparseArray<>();
    private final SparseArray<DesktopModeWindowDecoration> mWindowDecorByTaskId;
    private final DragStartListenerImpl mDragStartListener = new DragStartListenerImpl();
    private final InputMonitorFactory mInputMonitorFactory;
    private TaskOperations mTaskOperations;
@@ -201,7 +200,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                new DesktopModeWindowDecoration.Factory(),
                new InputMonitorFactory(),
                SurfaceControl.Transaction::new,
                rootTaskDisplayAreaOrganizer);
                rootTaskDisplayAreaOrganizer,
                new SparseArray<>());
    }

    @VisibleForTesting
@@ -223,7 +223,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            DesktopModeWindowDecoration.Factory desktopModeWindowDecorFactory,
            InputMonitorFactory inputMonitorFactory,
            Supplier<SurfaceControl.Transaction> transactionFactory,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            SparseArray<DesktopModeWindowDecoration> windowDecorByTaskId) {
        mContext = context;
        mMainExecutor = shellExecutor;
        mMainHandler = mainHandler;
@@ -243,6 +244,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
        mTransactionFactory = transactionFactory;
        mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer;
        mInputManager = mContext.getSystemService(InputManager.class);
        mWindowDecorByTaskId = windowDecorByTaskId;

        shellInit.addInitCallback(this::onInit, this);
    }
@@ -344,8 +346,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {

    @Override
    public void destroyWindowDecoration(RunningTaskInfo taskInfo) {
        final DesktopModeWindowDecoration decoration =
                mWindowDecorByTaskId.removeReturnOld(taskInfo.taskId);
        final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskInfo.taskId);
        if (decoration == null) return;

        decoration.close();
@@ -353,6 +354,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
        if (mEventReceiversByDisplay.contains(displayId)) {
            removeTaskFromEventReceiver(displayId);
        }
        // Remove the decoration from the cache last because WindowDecoration#close could still
        // issue CANCEL MotionEvents to touch listeners before its view host is released.
        // See b/327664694.
        mWindowDecorByTaskId.remove(taskInfo.taskId);
    }

    private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener
+20 −1
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.hardware.display.VirtualDisplay
import android.os.Handler
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import android.util.SparseArray
import android.view.Choreographer
import android.view.Display.DEFAULT_DISPLAY
import android.view.IWindowManager
@@ -72,6 +73,8 @@ import org.mockito.kotlin.eq
import org.mockito.kotlin.whenever
import java.util.Optional
import java.util.function.Supplier
import org.mockito.Mockito
import org.mockito.kotlin.spy


/** Tests of [DesktopModeWindowDecorViewModel]  */
@@ -102,6 +105,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
    private val transactionFactory = Supplier<SurfaceControl.Transaction> {
        SurfaceControl.Transaction()
    }
    private val windowDecorByTaskIdSpy = spy(SparseArray<DesktopModeWindowDecoration>())

    private lateinit var shellInit: ShellInit
    private lateinit var desktopModeOnInsetsChangedListener: DesktopModeOnInsetsChangedListener
@@ -110,6 +114,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
    @Before
    fun setUp() {
        shellInit = ShellInit(mockShellExecutor)
        windowDecorByTaskIdSpy.clear()
        desktopModeWindowDecorViewModel = DesktopModeWindowDecorViewModel(
                mContext,
                mockShellExecutor,
@@ -128,7 +133,8 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
                mockDesktopModeWindowDecorFactory,
                mockInputMonitorFactory,
                transactionFactory,
                mockRootTaskDisplayAreaOrganizer
                mockRootTaskDisplayAreaOrganizer,
            windowDecorByTaskIdSpy
        )

        whenever(mockDisplayController.getDisplayLayout(any())).thenReturn(mockDisplayLayout)
@@ -332,6 +338,19 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
        verify(decoration, times(1)).relayout(task)
    }

    @Test
    fun testDestroyWindowDecoration_closesBeforeCleanup() {
        val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM)
        val decoration = setUpMockDecorationForTask(task)
        val inOrder = Mockito.inOrder(decoration, windowDecorByTaskIdSpy)

        onTaskOpening(task)
        desktopModeWindowDecorViewModel.destroyWindowDecoration(task)

        inOrder.verify(decoration).close()
        inOrder.verify(windowDecorByTaskIdSpy).remove(task.taskId)
    }

    private fun onTaskOpening(task: RunningTaskInfo, leash: SurfaceControl = SurfaceControl()) {
        desktopModeWindowDecorViewModel.onTaskOpening(
                task,