Loading libs/WindowManager/Shell/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ReturnToDragStartAnimator.kt +11 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 } ) Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(), Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +10 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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] Loading Loading @@ -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 Loading @@ -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()) } Loading Loading @@ -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() Loading Loading @@ -614,6 +620,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { verify(mockDesktopTasksController, never()) .snapToHalfScreen(decor.mTaskInfo, currentBounds, SnapPosition.LEFT) verify(mockToast).show() } @Test Loading Loading @@ -679,6 +686,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { verify(mockDesktopTasksController, never()) .snapToHalfScreen(decor.mTaskInfo, currentBounds, SnapPosition.RIGHT) verify(mockToast).show() } @Test Loading Loading
libs/WindowManager/Shell/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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>
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ReturnToDragStartAnimator.kt +11 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 } ) Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(), Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +10 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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] Loading Loading @@ -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 Loading @@ -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()) } Loading Loading @@ -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() Loading Loading @@ -614,6 +620,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { verify(mockDesktopTasksController, never()) .snapToHalfScreen(decor.mTaskInfo, currentBounds, SnapPosition.LEFT) verify(mockToast).show() } @Test Loading Loading @@ -679,6 +686,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { verify(mockDesktopTasksController, never()) .snapToHalfScreen(decor.mTaskInfo, currentBounds, SnapPosition.RIGHT) verify(mockToast).show() } @Test Loading