Loading libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +44 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell.bubbles; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.service.notification.NotificationListenerService.REASON_CANCEL; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; Loading Loading @@ -78,6 +79,8 @@ import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import java.io.FileDescriptor; Loading Loading @@ -124,6 +127,7 @@ public class BubbleController { private final LauncherApps mLauncherApps; private final IStatusBarService mBarService; private final WindowManager mWindowManager; private final TaskStackListenerImpl mTaskStackListener; private final ShellTaskOrganizer mTaskOrganizer; // Used to post to main UI thread Loading Loading @@ -194,6 +198,7 @@ public class BubbleController { WindowManager windowManager, WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, ShellExecutor mainExecutor, Loading @@ -204,7 +209,7 @@ public class BubbleController { return new BubbleController(context, data, synchronizer, floatingContentCoordinator, new BubbleDataRepository(context, launcherApps, mainExecutor), statusBarService, windowManager, windowManagerShellWrapper, launcherApps, logger, organizer, positioner, mainExecutor, mainHandler); logger, taskStackListener, organizer, positioner, mainExecutor, mainHandler); } /** Loading @@ -221,6 +226,7 @@ public class BubbleController { WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, BubbleLogger bubbleLogger, TaskStackListenerImpl taskStackListener, ShellTaskOrganizer organizer, BubblePositioner positioner, ShellExecutor mainExecutor, Loading @@ -238,6 +244,7 @@ public class BubbleController { mLogger = bubbleLogger; mMainExecutor = mainExecutor; mMainHandler = mainHandler; mTaskStackListener = taskStackListener; mTaskOrganizer = organizer; mSurfaceSynchronizer = synchronizer; mCurrentUserId = ActivityManager.getCurrentUser(); Loading Loading @@ -319,6 +326,42 @@ public class BubbleController { packageName, validShortcuts, DISMISS_SHORTCUT_REMOVED); } }, mMainHandler); mTaskStackListener.addListener(new TaskStackListenerCallback() { @Override public void onTaskMovedToFront(int taskId) { if (mSysuiProxy == null) { return; } mSysuiProxy.isNotificationShadeExpand((expand) -> { mMainExecutor.execute(() -> { int expandedId = INVALID_TASK_ID; if (mStackView != null && mStackView.getExpandedBubble() != null && isStackExpanded() && !mStackView.isExpansionAnimating() && !expand) { expandedId = mStackView.getExpandedBubble().getTaskId(); } if (expandedId != INVALID_TASK_ID && expandedId != taskId) { mBubbleData.setExpanded(false); } }); }); } @Override public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { for (Bubble b : mBubbleData.getBubbles()) { if (task.taskId == b.getTaskId()) { mBubbleData.setSelectedBubble(b); mBubbleData.setExpanded(true); return; } } } }); } @VisibleForTesting Loading libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java +2 −0 Original line number Diff line number Diff line Loading @@ -248,6 +248,8 @@ public interface Bubbles { /** Callback to tell SysUi components execute some methods. */ interface SysuiProxy { void isNotificationShadeExpand(Consumer<Boolean> callback); void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback); void getShouldRestoredEntries(ArraySet<String> savedBubbleKeys, Loading packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java +7 −4 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.res.Configuration; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.service.notification.NotificationListenerService.RankingMap; Loading Loading @@ -85,16 +84,13 @@ import com.android.wm.shell.bubbles.Bubbles; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.function.Consumer; import java.util.function.IntConsumer; import java.util.function.Supplier; /** * The SysUi side bubbles manager which communicate with other SysUi components. Loading Loading @@ -251,6 +247,13 @@ public class BubblesManager implements Dumpable { }); mSysuiProxy = new Bubbles.SysuiProxy() { @Override public void isNotificationShadeExpand(Consumer<Boolean> callback) { sysuiMainExecutor.execute(() -> { callback.accept(mNotificationShadeWindowController.getPanelExpanded()); }); } @Override public void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback) { sysuiMainExecutor.execute(() -> { Loading packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +3 −2 Original line number Diff line number Diff line Loading @@ -186,14 +186,15 @@ public abstract class WMShellBaseModule { WindowManager windowManager, WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { return Optional.of(BubbleController.create(context, null /* synchronizer */, floatingContentCoordinator, statusBarService, windowManager, windowManagerShellWrapper, launcherApps, uiEventLogger, organizer, mainExecutor, mainHandler)); windowManagerShellWrapper, launcherApps, taskStackListener, uiEventLogger, organizer, mainExecutor, mainHandler)); } // Loading packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ import com.android.wm.shell.bubbles.BubbleStackView; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerImpl; import com.google.common.collect.ImmutableList; Loading Loading @@ -206,6 +207,8 @@ public class BubblesTest extends SysuiTestCase { @Mock private BubbleLogger mBubbleLogger; @Mock private TaskStackListenerImpl mTaskStackListener; @Mock private ShellTaskOrganizer mShellTaskOrganizer; private TestableBubblePositioner mPositioner; Loading Loading @@ -287,6 +290,7 @@ public class BubblesTest extends SysuiTestCase { mWindowManagerShellWrapper, mLauncherApps, mBubbleLogger, mTaskStackListener, mShellTaskOrganizer, mPositioner, syncExecutor, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +44 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell.bubbles; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.service.notification.NotificationListenerService.REASON_CANCEL; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; Loading Loading @@ -78,6 +79,8 @@ import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import java.io.FileDescriptor; Loading Loading @@ -124,6 +127,7 @@ public class BubbleController { private final LauncherApps mLauncherApps; private final IStatusBarService mBarService; private final WindowManager mWindowManager; private final TaskStackListenerImpl mTaskStackListener; private final ShellTaskOrganizer mTaskOrganizer; // Used to post to main UI thread Loading Loading @@ -194,6 +198,7 @@ public class BubbleController { WindowManager windowManager, WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, ShellExecutor mainExecutor, Loading @@ -204,7 +209,7 @@ public class BubbleController { return new BubbleController(context, data, synchronizer, floatingContentCoordinator, new BubbleDataRepository(context, launcherApps, mainExecutor), statusBarService, windowManager, windowManagerShellWrapper, launcherApps, logger, organizer, positioner, mainExecutor, mainHandler); logger, taskStackListener, organizer, positioner, mainExecutor, mainHandler); } /** Loading @@ -221,6 +226,7 @@ public class BubbleController { WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, BubbleLogger bubbleLogger, TaskStackListenerImpl taskStackListener, ShellTaskOrganizer organizer, BubblePositioner positioner, ShellExecutor mainExecutor, Loading @@ -238,6 +244,7 @@ public class BubbleController { mLogger = bubbleLogger; mMainExecutor = mainExecutor; mMainHandler = mainHandler; mTaskStackListener = taskStackListener; mTaskOrganizer = organizer; mSurfaceSynchronizer = synchronizer; mCurrentUserId = ActivityManager.getCurrentUser(); Loading Loading @@ -319,6 +326,42 @@ public class BubbleController { packageName, validShortcuts, DISMISS_SHORTCUT_REMOVED); } }, mMainHandler); mTaskStackListener.addListener(new TaskStackListenerCallback() { @Override public void onTaskMovedToFront(int taskId) { if (mSysuiProxy == null) { return; } mSysuiProxy.isNotificationShadeExpand((expand) -> { mMainExecutor.execute(() -> { int expandedId = INVALID_TASK_ID; if (mStackView != null && mStackView.getExpandedBubble() != null && isStackExpanded() && !mStackView.isExpansionAnimating() && !expand) { expandedId = mStackView.getExpandedBubble().getTaskId(); } if (expandedId != INVALID_TASK_ID && expandedId != taskId) { mBubbleData.setExpanded(false); } }); }); } @Override public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { for (Bubble b : mBubbleData.getBubbles()) { if (task.taskId == b.getTaskId()) { mBubbleData.setSelectedBubble(b); mBubbleData.setExpanded(true); return; } } } }); } @VisibleForTesting Loading
libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java +2 −0 Original line number Diff line number Diff line Loading @@ -248,6 +248,8 @@ public interface Bubbles { /** Callback to tell SysUi components execute some methods. */ interface SysuiProxy { void isNotificationShadeExpand(Consumer<Boolean> callback); void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback); void getShouldRestoredEntries(ArraySet<String> savedBubbleKeys, Loading
packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java +7 −4 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.res.Configuration; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.service.notification.NotificationListenerService.RankingMap; Loading Loading @@ -85,16 +84,13 @@ import com.android.wm.shell.bubbles.Bubbles; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.function.Consumer; import java.util.function.IntConsumer; import java.util.function.Supplier; /** * The SysUi side bubbles manager which communicate with other SysUi components. Loading Loading @@ -251,6 +247,13 @@ public class BubblesManager implements Dumpable { }); mSysuiProxy = new Bubbles.SysuiProxy() { @Override public void isNotificationShadeExpand(Consumer<Boolean> callback) { sysuiMainExecutor.execute(() -> { callback.accept(mNotificationShadeWindowController.getPanelExpanded()); }); } @Override public void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback) { sysuiMainExecutor.execute(() -> { Loading
packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +3 −2 Original line number Diff line number Diff line Loading @@ -186,14 +186,15 @@ public abstract class WMShellBaseModule { WindowManager windowManager, WindowManagerShellWrapper windowManagerShellWrapper, LauncherApps launcherApps, TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, ShellTaskOrganizer organizer, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { return Optional.of(BubbleController.create(context, null /* synchronizer */, floatingContentCoordinator, statusBarService, windowManager, windowManagerShellWrapper, launcherApps, uiEventLogger, organizer, mainExecutor, mainHandler)); windowManagerShellWrapper, launcherApps, taskStackListener, uiEventLogger, organizer, mainExecutor, mainHandler)); } // Loading
packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ import com.android.wm.shell.bubbles.BubbleStackView; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerImpl; import com.google.common.collect.ImmutableList; Loading Loading @@ -206,6 +207,8 @@ public class BubblesTest extends SysuiTestCase { @Mock private BubbleLogger mBubbleLogger; @Mock private TaskStackListenerImpl mTaskStackListener; @Mock private ShellTaskOrganizer mShellTaskOrganizer; private TestableBubblePositioner mPositioner; Loading Loading @@ -287,6 +290,7 @@ public class BubblesTest extends SysuiTestCase { mWindowManagerShellWrapper, mLauncherApps, mBubbleLogger, mTaskStackListener, mShellTaskOrganizer, mPositioner, syncExecutor, Loading