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

Commit 3b9a9347 authored by Daniel Akinola's avatar Daniel Akinola Committed by Android (Google) Code Review
Browse files

Merge "Add toast when non-resizable attempts is attempted to be snap resized" into main

parents e2cb9b6f 9aeb4885
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -302,4 +302,6 @@
    <string name="desktop_mode_maximize_menu_maximize_text">Maximize Screen</string>
    <!-- Maximize menu snap buttons string. -->
    <string name="desktop_mode_maximize_menu_snap_text">Snap Screen</string>
    <!-- Snap resizing non-resizable string. -->
    <string name="desktop_mode_non_resizable_snap_text">This app can\'t be resized</string>
</resources>
+2 −2
Original line number Diff line number Diff line
@@ -608,8 +608,8 @@ public abstract class WMShellModule {
    @WMSingleton
    @Provides
    static ReturnToDragStartAnimator provideReturnToDragStartAnimator(
            InteractionJankMonitor interactionJankMonitor) {
        return new ReturnToDragStartAnimator(interactionJankMonitor);
            Context context, InteractionJankMonitor interactionJankMonitor) {
        return new ReturnToDragStartAnimator(context, interactionJankMonitor);
    }


+11 −3
Original line number Diff line number Diff line
@@ -19,23 +19,27 @@ package com.android.wm.shell.desktopmode
import android.animation.Animator
import android.animation.RectEvaluator
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Rect
import android.view.SurfaceControl
import android.widget.Toast
import androidx.core.animation.addListener
import com.android.internal.jank.InteractionJankMonitor
import com.android.wm.shell.R
import com.android.wm.shell.windowdecor.OnTaskRepositionAnimationListener
import java.util.function.Supplier

/** Animates the task surface moving from its current drag position to its pre-drag position. */
class ReturnToDragStartAnimator(
    private val context: Context,
    private val transactionSupplier: Supplier<SurfaceControl.Transaction>,
    private val interactionJankMonitor: InteractionJankMonitor
) {
    private var boundsAnimator: Animator? = null
    private lateinit var taskRepositionAnimationListener: OnTaskRepositionAnimationListener

    constructor(interactionJankMonitor: InteractionJankMonitor) :
            this(Supplier { SurfaceControl.Transaction() }, interactionJankMonitor)
    constructor(context: Context, interactionJankMonitor: InteractionJankMonitor) :
            this(context, Supplier { SurfaceControl.Transaction() }, interactionJankMonitor)

    /** Sets a listener for the start and end of the reposition animation. */
    fun setTaskRepositionAnimationListener(listener: OnTaskRepositionAnimationListener) {
@@ -76,7 +80,11 @@ class ReturnToDragStartAnimator(
                                .apply()
                            taskRepositionAnimationListener.onAnimationEnd(taskId)
                            boundsAnimator = null
                            // TODO(b/354658237) - show toast with relevant string
                            Toast.makeText(
                                context,
                                R.string.desktop_mode_non_resizable_snap_text,
                                Toast.LENGTH_SHORT
                            ).show()
                            // TODO(b/339582583) - add Jank CUJ using interactionJankMonitor
                        }
                    )
+3 −1
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import android.view.MotionEvent;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.View;
import android.widget.Toast;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;

@@ -469,7 +470,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {

        if (!decoration.mTaskInfo.isResizeable
                && DesktopModeFlags.DISABLE_SNAP_RESIZE.isEnabled(mContext)) {
            //TODO(b/354658237) - show toast with relevant string
            Toast.makeText(mContext,
                    R.string.desktop_mode_non_resizable_snap_text, Toast.LENGTH_SHORT).show();
        } else {
            mDesktopTasksController.snapToHalfScreen(decoration.mTaskInfo,
                    decoration.mTaskInfo.configuration.windowConfiguration.getBounds(),
+10 −2
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import android.view.SurfaceControl
import android.view.SurfaceView
import android.view.View
import android.view.WindowInsets.Type.statusBars
import android.widget.Toast
import android.window.WindowContainerTransaction
import android.window.WindowContainerTransaction.HierarchyOp
import androidx.test.filters.SmallTest
@@ -93,6 +94,8 @@ import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopM
import java.util.Optional
import java.util.function.Consumer
import java.util.function.Supplier
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
@@ -117,8 +120,7 @@ import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue


/**
 * Tests of [DesktopModeWindowDecorViewModel]
@@ -158,6 +160,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
    @Mock private lateinit var mockWindowManager: IWindowManager
    @Mock private lateinit var mockInteractionJankMonitor: InteractionJankMonitor
    @Mock private lateinit var mockGenericLinksParser: AppToWebGenericLinksParser
    @Mock private lateinit var mockToast: Toast
    private val bgExecutor = TestShellExecutor()
    @Mock private lateinit var mockMultiInstanceHelper: MultiInstanceHelper
    private lateinit var spyContext: TestableContext
@@ -181,6 +184,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
                .strictness(Strictness.LENIENT)
                .spyStatic(DesktopModeStatus::class.java)
                .spyStatic(DragPositioningCallbackUtility::class.java)
                .spyStatic(Toast::class.java)
                .startMocking()
        doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(Mockito.any()) }

@@ -218,6 +222,8 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {
        whenever(mockDisplayLayout.stableInsets()).thenReturn(STABLE_INSETS)
        whenever(mockInputMonitorFactory.create(any(), any())).thenReturn(mockInputMonitor)

        doReturn(mockToast).`when` { Toast.makeText(any(), anyInt(), anyInt()) }

        // InputChannel cannot be mocked because it passes to InputEventReceiver.
        val inputChannels = InputChannel.openInputChannelPair(TAG)
        inputChannels.first().dispose()
@@ -614,6 +620,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {

        verify(mockDesktopTasksController, never())
            .snapToHalfScreen(decor.mTaskInfo, currentBounds, SnapPosition.LEFT)
        verify(mockToast).show()
    }

    @Test
@@ -679,6 +686,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() {

        verify(mockDesktopTasksController, never())
            .snapToHalfScreen(decor.mTaskInfo, currentBounds, SnapPosition.RIGHT)
        verify(mockToast).show()
    }

    @Test