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 f979f4d3b41f2..ce1f8707da31a 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 @@ -89,6 +89,8 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.onehanded.OneHandedController; +import com.android.wm.shell.onehanded.OneHandedTransitionCallback; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import java.io.FileDescriptor; @@ -98,6 +100,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.Executor; import java.util.function.Consumer; import java.util.function.IntConsumer; @@ -198,6 +201,9 @@ public class BubbleController { /** True when user is in status bar unlock shade. */ private boolean mIsStatusBarShade = true; + /** One handed mode controller to register transition listener. */ + private Optional mOneHandedOptional; + /** * Creates an instance of the BubbleController. */ @@ -212,6 +218,7 @@ public class BubbleController { UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, DisplayController displayController, + Optional oneHandedOptional, ShellExecutor mainExecutor, Handler mainHandler, TaskViewTransitions taskViewTransitions, @@ -222,8 +229,9 @@ public class BubbleController { return new BubbleController(context, data, synchronizer, floatingContentCoordinator, new BubbleDataRepository(context, launcherApps, mainExecutor), statusBarService, windowManager, windowManagerShellWrapper, launcherApps, - logger, taskStackListener, organizer, positioner, displayController, mainExecutor, - mainHandler, taskViewTransitions, syncQueue); + logger, taskStackListener, organizer, positioner, displayController, + oneHandedOptional, mainExecutor, mainHandler, taskViewTransitions, + syncQueue); } /** @@ -244,6 +252,7 @@ public class BubbleController { ShellTaskOrganizer organizer, BubblePositioner positioner, DisplayController displayController, + Optional oneHandedOptional, ShellExecutor mainExecutor, Handler mainHandler, TaskViewTransitions taskViewTransitions, @@ -271,9 +280,25 @@ public class BubbleController { mBubbleIconFactory = new BubbleIconFactory(context); mDisplayController = displayController; mTaskViewTransitions = taskViewTransitions; + mOneHandedOptional = oneHandedOptional; mSyncQueue = syncQueue; } + private static void registerOneHandedState(OneHandedController oneHanded) { + oneHanded.registerTransitionCallback( + new OneHandedTransitionCallback() { + @Override + public void onStartFinished(Rect bounds) { + // TODO(b/198403767) mStackView.offSetY(int bounds.top) + } + + @Override + public void onStopFinished(Rect bounds) { + // TODO(b/198403767) mStackView.offSetY(int bounds.top) + } + }); + } + public void initialize() { mBubbleData.setListener(mBubbleDataListener); mBubbleData.setSuppressionChangedListener(this::onBubbleNotificationSuppressionChanged); @@ -397,6 +422,8 @@ public class BubbleController { } } }); + + mOneHandedOptional.ifPresent(BubbleController::registerOneHandedState); } @VisibleForTesting diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index 6d158d591011b..23d9b8b14159c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -362,7 +362,6 @@ public abstract class WMShellBaseModule { return Optional.empty(); } - // // Task to Surface communication // 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 dff563589e5b1..d681a77802955 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 @@ -107,6 +107,7 @@ public class WMShellModule { UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, DisplayController displayController, + @DynamicOverride Optional oneHandedOptional, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, TaskViewTransitions taskViewTransitions, @@ -114,8 +115,8 @@ public class WMShellModule { return BubbleController.create(context, null /* synchronizer */, floatingContentCoordinator, statusBarService, windowManager, windowManagerShellWrapper, launcherApps, taskStackListener, - uiEventLogger, organizer, displayController, mainExecutor, mainHandler, - taskViewTransitions, syncQueue); + uiEventLogger, organizer, displayController, oneHandedOptional, + mainExecutor, mainHandler, taskViewTransitions, syncQueue); } // @@ -142,12 +143,10 @@ public class WMShellModule { static OneHandedController provideOneHandedController(Context context, WindowManager windowManager, DisplayController displayController, DisplayLayout displayLayout, TaskStackListenerImpl taskStackListener, - UiEventLogger uiEventLogger, - @ShellMainThread ShellExecutor mainExecutor, + UiEventLogger uiEventLogger, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { - return OneHandedController.create(context, windowManager, - displayController, displayLayout, taskStackListener, uiEventLogger, mainExecutor, - mainHandler); + return OneHandedController.create(context, windowManager, displayController, displayLayout, + taskStackListener, uiEventLogger, mainExecutor, mainHandler); } // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 72bb6552ff3de..507204ce02290 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -198,7 +198,7 @@ public class OneHandedController implements RemoteCallable, OneHandedSettingsUtil settingsUtil = new OneHandedSettingsUtil(); OneHandedAccessibilityUtil accessibilityUtil = new OneHandedAccessibilityUtil(context); OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor); - OneHandedState transitionState = new OneHandedState(); + OneHandedState oneHandedState = new OneHandedState(); OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context, settingsUtil, windowManager); OneHandedAnimationController animationController = @@ -216,7 +216,7 @@ public class OneHandedController implements RemoteCallable, ServiceManager.getService(Context.OVERLAY_SERVICE)); return new OneHandedController(context, displayController, oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler, - settingsUtil, accessibilityUtil, timeoutHandler, transitionState, + settingsUtil, accessibilityUtil, timeoutHandler, oneHandedState, oneHandedUiEventsLogger, overlayManager, taskStackListener, mainExecutor, mainHandler); } @@ -392,8 +392,10 @@ public class OneHandedController implements RemoteCallable, mEventCallback = callback; } - @VisibleForTesting - void registerTransitionCallback(OneHandedTransitionCallback callback) { + /** + * Registers {@link OneHandedTransitionCallback} to monitor the transition status + */ + public void registerTransitionCallback(OneHandedTransitionCallback callback) { mDisplayAreaOrganizer.registerTransitionCallback(callback); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 71ae5eb028a72..4dc3bc4323077 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -125,6 +125,7 @@ import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.onehanded.OneHandedController; import com.google.common.collect.ImmutableList; @@ -138,6 +139,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; +import java.util.Optional; /** * Tests the NotificationEntryManager setup with BubbleController. @@ -249,6 +251,8 @@ public class BubblesTest extends SysuiTestCase { private AuthController mAuthController; @Mock private TaskViewTransitions mTaskViewTransitions; + @Mock + private Optional mOneHandedOptional; private TestableBubblePositioner mPositioner; @@ -345,6 +349,7 @@ public class BubblesTest extends SysuiTestCase { mShellTaskOrganizer, mPositioner, mock(DisplayController.class), + mOneHandedOptional, syncExecutor, mock(Handler.class), mTaskViewTransitions, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java index 7b9e6a9efb3b1..70582ea532226 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java @@ -19,8 +19,11 @@ package com.android.systemui.wmshell; import static android.app.Notification.FLAG_BUBBLE; import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL; import static android.service.notification.NotificationListenerService.REASON_GROUP_SUMMARY_CANCELED; + import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; + import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -105,6 +108,7 @@ import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.onehanded.OneHandedController; import org.junit.Before; import org.junit.Ignore; @@ -116,6 +120,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; +import java.util.Optional; /** * Tests the NotifPipeline setup with BubbleController. @@ -220,6 +225,8 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase { private ScreenOffAnimationController mScreenOffAnimationController; @Mock private TaskViewTransitions mTaskViewTransitions; + @Mock + private Optional mOneHandedOptional; private TestableBubblePositioner mPositioner; @@ -307,6 +314,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase { mShellTaskOrganizer, mPositioner, mock(DisplayController.class), + mOneHandedOptional, syncExecutor, mock(Handler.class), mTaskViewTransitions, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java index 80834c8130e68..83f5987ac9626 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java @@ -35,6 +35,9 @@ import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.onehanded.OneHandedController; + +import java.util.Optional; /** * Testable BubbleController subclass that immediately synchronizes surfaces. @@ -55,6 +58,7 @@ public class TestableBubbleController extends BubbleController { ShellTaskOrganizer shellTaskOrganizer, BubblePositioner positioner, DisplayController displayController, + Optional oneHandedOptional, ShellExecutor shellMainExecutor, Handler shellMainHandler, TaskViewTransitions taskViewTransitions, @@ -62,7 +66,8 @@ public class TestableBubbleController extends BubbleController { super(context, data, Runnable::run, floatingContentCoordinator, dataRepository, statusBarService, windowManager, windowManagerShellWrapper, launcherApps, bubbleLogger, taskStackListener, shellTaskOrganizer, positioner, displayController, - shellMainExecutor, shellMainHandler, taskViewTransitions, syncQueue); + oneHandedOptional, shellMainExecutor, shellMainHandler, taskViewTransitions, + syncQueue); setInflateSynchronously(true); initialize(); }