diff options
Diffstat (limited to 'libs')
10 files changed, 76 insertions, 8 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 348f13a493b1..8efeecb56dbf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -1449,6 +1449,15 @@ public class BubbleController implements ConfigurationChangeListener, } /** + * Expands and selects a bubble created from a running task in a different mode. + * + * @param taskInfo the task. + */ + public void expandStackAndSelectBubble(ActivityManager.RunningTaskInfo taskInfo) { + // TODO(384976265): Not implemented yet + } + + /** * Expands and selects a bubble based on the provided {@link BubbleEntry}. If no bubble * exists for this entry, and it is able to bubble, a new bubble will be created. * diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index d8c7f4cbb698..48b0a6cb364b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -736,7 +736,8 @@ public abstract class WMShellModule { DesktopModeEventLogger desktopModeEventLogger, DesktopModeUiEventLogger desktopModeUiEventLogger, DesktopTilingDecorViewModel desktopTilingDecorViewModel, - DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider) { + DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider, + Optional<BubbleController> bubbleController) { return new DesktopTasksController( context, shellInit, @@ -768,7 +769,8 @@ public abstract class WMShellModule { desktopModeEventLogger, desktopModeUiEventLogger, desktopTilingDecorViewModel, - desktopWallpaperActivityTokenProvider); + desktopWallpaperActivityTokenProvider, + bubbleController); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 4e7cba23116c..d180ea7b79ff 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -73,6 +73,7 @@ import com.android.wm.shell.Flags.enableFlexibleSplit import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer +import com.android.wm.shell.bubbles.BubbleController import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.ExternalInterfaceBinder @@ -172,6 +173,7 @@ class DesktopTasksController( private val desktopModeUiEventLogger: DesktopModeUiEventLogger, private val desktopTilingDecorViewModel: DesktopTilingDecorViewModel, private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider, + private val bubbleController: Optional<BubbleController>, ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler, @@ -2190,6 +2192,19 @@ class DesktopTasksController( } } + /** Requests a task be transitioned from whatever mode it's in to a bubble. */ + fun requestFloat(taskInfo: RunningTaskInfo) { + val isDragging = dragToDesktopTransitionHandler.inProgress + val shouldRequestFloat = + taskInfo.isFullscreen || taskInfo.isFreeform || isDragging || taskInfo.isMultiWindow + if (!shouldRequestFloat) return + if (isDragging) { + releaseVisualIndicator() + } else { + bubbleController.ifPresent { it.expandStackAndSelectBubble(taskInfo) } + } + } + private fun getDefaultDensityDpi(): Int { return context.resources.displayMetrics.densityDpi } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index e80016d07f15..1689bb5778ae 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -329,7 +329,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { @ColorInt int backgroundColorForTransition = 0; final int wallpaperTransit = getWallpaperTransitType(info); - boolean isDisplayRotationAnimationStarted = false; + int animatingDisplayId = Integer.MIN_VALUE; final boolean isDreamTransition = isDreamTransition(info); final boolean isOnlyTranslucent = isOnlyTranslucent(info); final boolean isActivityLevel = isActivityLevelOnly(info); @@ -361,7 +361,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { ? ScreenRotationAnimation.FLAG_HAS_WALLPAPER : 0; startRotationAnimation(startTransaction, change, info, anim, flags, animations, onAnimFinish); - isDisplayRotationAnimationStarted = true; + animatingDisplayId = change.getEndDisplayId(); continue; } } else { @@ -426,8 +426,11 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { // Hide the invisible surface directly without animating it if there is a display // rotation animation playing. - if (isDisplayRotationAnimationStarted && TransitionUtil.isClosingType(mode)) { - startTransaction.hide(change.getLeash()); + if (animatingDisplayId == change.getEndDisplayId()) { + if (TransitionUtil.isClosingType(mode)) { + startTransaction.hide(change.getLeash()); + } + // Only need to play display level animation. continue; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index a7a5f09c88f8..046cb202fb11 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -776,6 +776,18 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, DesktopUiEventEnum.DESKTOP_WINDOW_APP_HANDLE_MENU_TAP_TO_SPLIT_SCREEN); } + private void onToFloat(int taskId) { + final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); + if (decoration == null) { + return; + } + decoration.closeHandleMenu(); + // When the app enters float, the handle will no longer be visible, meaning + // we shouldn't receive input for it any longer. + decoration.disposeStatusBarInputLayer(); + mDesktopTasksController.requestFloat(decoration.mTaskInfo); + } + private void onNewWindow(int taskId) { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); if (decoration == null) { @@ -1731,6 +1743,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, onToSplitScreen(taskInfo.taskId); return Unit.INSTANCE; }); + windowDecoration.setOnToFloatClickListener(() -> { + onToFloat(taskInfo.taskId); + return Unit.INSTANCE; + }); windowDecoration.setOpenInBrowserClickListener((intent) -> { onOpenInBrowser(taskInfo.taskId, intent); }); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 0d1960ad6e29..4ac89546c9c7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -155,6 +155,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private Consumer<DesktopModeTransitionSource> mOnToDesktopClickListener; private Function0<Unit> mOnToFullscreenClickListener; private Function0<Unit> mOnToSplitscreenClickListener; + private Function0<Unit> mOnToFloatClickListener; private Function0<Unit> mOnNewWindowClickListener; private Function0<Unit> mOnManageWindowsClickListener; private Function0<Unit> mOnChangeAspectRatioClickListener; @@ -351,6 +352,11 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mOnToSplitscreenClickListener = listener; } + /** Registers a listener to be called when the decoration's to-split action is triggered. */ + void setOnToFloatClickListener(Function0<Unit> listener) { + mOnToFloatClickListener = listener; + } + /** * Adds a drag resize observer that gets notified on the task being drag resized. * @@ -1372,6 +1378,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin }, /* onToFullscreenClickListener= */ mOnToFullscreenClickListener, /* onToSplitScreenClickListener= */ mOnToSplitscreenClickListener, + /* onToFloatClickListener= */ mOnToFloatClickListener, /* onNewWindowClickListener= */ mOnNewWindowClickListener, /* onManageWindowsClickListener= */ mOnManageWindowsClickListener, /* onAspectRatioSettingsClickListener= */ mOnChangeAspectRatioClickListener, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt index bb19a2cc2ad4..9d73950abcf0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt @@ -144,6 +144,7 @@ class HandleMenu( onToDesktopClickListener: () -> Unit, onToFullscreenClickListener: () -> Unit, onToSplitScreenClickListener: () -> Unit, + onToFloatClickListener: () -> Unit, onNewWindowClickListener: () -> Unit, onManageWindowsClickListener: () -> Unit, onChangeAspectRatioClickListener: () -> Unit, @@ -162,6 +163,7 @@ class HandleMenu( onToDesktopClickListener = onToDesktopClickListener, onToFullscreenClickListener = onToFullscreenClickListener, onToSplitScreenClickListener = onToSplitScreenClickListener, + onToFloatClickListener = onToFloatClickListener, onNewWindowClickListener = onNewWindowClickListener, onManageWindowsClickListener = onManageWindowsClickListener, onChangeAspectRatioClickListener = onChangeAspectRatioClickListener, @@ -183,6 +185,7 @@ class HandleMenu( onToDesktopClickListener: () -> Unit, onToFullscreenClickListener: () -> Unit, onToSplitScreenClickListener: () -> Unit, + onToFloatClickListener: () -> Unit, onNewWindowClickListener: () -> Unit, onManageWindowsClickListener: () -> Unit, onChangeAspectRatioClickListener: () -> Unit, @@ -208,6 +211,7 @@ class HandleMenu( this.onToDesktopClickListener = onToDesktopClickListener this.onToFullscreenClickListener = onToFullscreenClickListener this.onToSplitScreenClickListener = onToSplitScreenClickListener + this.onToFloatClickListener = onToFloatClickListener this.onNewWindowClickListener = onNewWindowClickListener this.onManageWindowsClickListener = onManageWindowsClickListener this.onChangeAspectRatioClickListener = onChangeAspectRatioClickListener @@ -502,6 +506,7 @@ class HandleMenu( var onToDesktopClickListener: (() -> Unit)? = null var onToFullscreenClickListener: (() -> Unit)? = null var onToSplitScreenClickListener: (() -> Unit)? = null + var onToFloatClickListener: (() -> Unit)? = null var onNewWindowClickListener: (() -> Unit)? = null var onManageWindowsClickListener: (() -> Unit)? = null var onChangeAspectRatioClickListener: (() -> Unit)? = null @@ -515,6 +520,7 @@ class HandleMenu( splitscreenBtn.setOnClickListener { onToSplitScreenClickListener?.invoke() } desktopBtn.setOnClickListener { onToDesktopClickListener?.invoke() } openInAppOrBrowserBtn.setOnClickListener { onOpenInAppOrBrowserClickListener?.invoke() } + floatingBtn.setOnClickListener { onToFloatClickListener?.invoke() } openByDefaultBtn.setOnClickListener { onOpenByDefaultClickListener?.invoke() } @@ -640,8 +646,9 @@ class HandleMenu( private fun bindWindowingPill(style: MenuStyle) { windowingPill.background.setTint(style.backgroundColor) - // TODO: Remove once implemented. - floatingBtn.visibility = View.GONE + if (!com.android.wm.shell.Flags.enableBubbleAnything()) { + floatingBtn.visibility = View.GONE + } fullscreenBtn.isSelected = taskInfo.isFullscreen fullscreenBtn.isEnabled = !taskInfo.isFullscreen diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index fe0852689ee9..e032616e7d43 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -93,6 +93,7 @@ import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase import com.android.wm.shell.TestRunningTaskInfoBuilder import com.android.wm.shell.TestShellExecutor +import com.android.wm.shell.bubbles.BubbleController import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.common.MultiInstanceHelper @@ -232,6 +233,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock private lateinit var mockToast: Toast private lateinit var mockitoSession: StaticMockitoSession @Mock private lateinit var desktopTilingDecorViewModel: DesktopTilingDecorViewModel + @Mock private lateinit var bubbleController: BubbleController @Mock private lateinit var desktopWindowDecoration: DesktopModeWindowDecoration @Mock private lateinit var resources: Resources @Mock @@ -383,6 +385,7 @@ class DesktopTasksControllerTest : ShellTestCase() { desktopModeUiEventLogger, desktopTilingDecorViewModel, desktopWallpaperActivityTokenProvider, + Optional.of(bubbleController), ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java index e99e5cce8b27..7dac0859b7e9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -1091,6 +1091,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), openInBrowserCaptor.capture(), any(), any(), @@ -1127,6 +1128,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), openInBrowserCaptor.capture(), any(), any(), @@ -1158,6 +1160,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), openInBrowserCaptor.capture(), any(), any(), @@ -1226,6 +1229,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), closeClickListener.capture(), any(), anyBoolean() @@ -1258,6 +1262,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { any(), any(), any(), + any(), /* forceShowSystemBars= */ eq(true) ); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt index cbfb57edc72d..f90988e90b22 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/HandleMenuTest.kt @@ -307,6 +307,7 @@ class HandleMenuTest : ShellTestCase() { onToDesktopClickListener = mock(), onToFullscreenClickListener = mock(), onToSplitScreenClickListener = mock(), + onToFloatClickListener = mock(), onNewWindowClickListener = mock(), onManageWindowsClickListener = mock(), onChangeAspectRatioClickListener = mock(), |