diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 57bcc14ff3..976ad42d09 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -97,12 +97,12 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.R; +import com.android.launcher3.allapps.ActivityAllAppsContainerView; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.apppairs.AppPairIcon; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.desktop.DesktopAppLaunchTransition; import com.android.launcher3.desktop.DesktopAppLaunchTransition.AppLaunchType; -import com.android.launcher3.dot.DotInfo; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.logger.LauncherAtom; @@ -149,6 +149,7 @@ import com.android.launcher3.util.ApplicationInfoWrapper; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.Executors; +import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.RunnableList; @@ -878,17 +879,23 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } } - @Override - public DotInfo getDotInfoForItem(ItemInfo info) { - return getPopupDataProvider().getDotInfoForItem(info); - } - @NonNull @Override public PopupDataProvider getPopupDataProvider() { return mControllers.taskbarPopupController.getPopupDataProvider(); } + @NonNull + @Override + public LauncherBindableItemsContainer getContent() { + return mControllers.taskbarViewController.getContent(); + } + + @Override + public ActivityAllAppsContainerView getAppsView() { + return mControllers.taskbarAllAppsController.getAppsView(); + } + @Override public View.AccessibilityDelegate getAccessibilityDelegate() { return mAccessibilityDelegate; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index 5d8b8212a8..a9ee584e95 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -35,11 +35,7 @@ import com.android.launcher3.BubbleTextView; import com.android.launcher3.Flags; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; -import com.android.launcher3.dot.FolderDotInfo; -import com.android.launcher3.folder.Folder; -import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.model.data.AppInfo; -import com.android.launcher3.model.data.FolderInfo; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.notification.NotificationListener; @@ -49,8 +45,6 @@ import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.splitscreen.SplitShortcut; import com.android.launcher3.util.ComponentKey; -import com.android.launcher3.util.LauncherBindableItemsContainer; -import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.ShortcutUtil; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; import com.android.launcher3.views.ActivityContext; @@ -65,7 +59,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Objects; -import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -93,7 +86,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba public TaskbarPopupController(TaskbarActivityContext context) { mContext = context; - mPopupDataProvider = new PopupDataProvider(this::updateNotificationDots); + mPopupDataProvider = new PopupDataProvider(mContext); } public void init(TaskbarControllers controllers) { @@ -132,39 +125,6 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba mAllowInitialSplitSelection = allowInitialSplitSelection; } - private void updateNotificationDots(Predicate updatedDots) { - final PackageUserKey packageUserKey = new PackageUserKey(null, null); - Predicate matcher = info -> !packageUserKey.updateFromItemInfo(info) - || updatedDots.test(packageUserKey); - - LauncherBindableItemsContainer.ItemOperator op = (info, v) -> { - if (info instanceof WorkspaceItemInfo && v instanceof BubbleTextView) { - if (matcher.test(info)) { - ((BubbleTextView) v).applyDotState(info, true /* animate */); - } - } else if (info instanceof FolderInfo && v instanceof FolderIcon) { - FolderInfo fi = (FolderInfo) info; - if (fi.anyMatch(matcher)) { - FolderDotInfo folderDotInfo = new FolderDotInfo(); - for (ItemInfo si : fi.getContents()) { - folderDotInfo.addDotInfo(mPopupDataProvider.getDotInfoForItem(si)); - } - ((FolderIcon) v).setDotInfo(folderDotInfo); - } - } - - // process all the shortcuts - return false; - }; - - mControllers.taskbarViewController.mapOverItems(op); - Folder folder = Folder.getOpen(mContext); - if (folder != null) { - folder.iterateOverItems(op); - } - mControllers.taskbarAllAppsController.updateNotificationDots(updatedDots); - } - /** * Shows the notifications and deep shortcuts associated with a Taskbar {@param icon}. * @return the container if shown or null. diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index c92f20b283..de8e28639b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -62,7 +62,6 @@ import com.android.launcher3.taskbar.customization.TaskbarAllAppsButtonContainer import com.android.launcher3.taskbar.customization.TaskbarDividerContainer; import com.android.launcher3.uioverrides.PredictedAppIcon; import com.android.launcher3.util.DisplayController; -import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ActivityContext; import com.android.quickstep.util.GroupTask; @@ -1097,20 +1096,6 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar return mAllAppsButtonTranslationOffset; } - /** - * Maps {@code op} over all the child views. - */ - public void mapOverItems(LauncherBindableItemsContainer.ItemOperator op) { - // map over all the shortcuts on the taskbar - for (int i = 0; i < getChildCount(); i++) { - View item = getChildAt(i); - // TODO(b/344657629): Support GroupTask as well for notification dots/popup - if (item.getTag() instanceof ItemInfo itemInfo && op.evaluate(itemInfo, item)) { - return; - } - } - } - /** * Finds the first icon to match one of the given matchers, from highest to lowest priority. * diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 384468c9fc..d7110f2699 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -1167,11 +1167,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar mTaskbarNavButtonTranslationY.updateValue(-deviceProfile.getTaskbarOffsetY()); } - /** - * Maps the given operator to all the top-level children of TaskbarView. - */ - public void mapOverItems(LauncherBindableItemsContainer.ItemOperator op) { - mTaskbarView.mapOverItems(op); + public LauncherBindableItemsContainer getContent() { + return mModelCallbacks; } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java index ddbf3b7fc6..6c55b28845 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java @@ -35,7 +35,6 @@ import com.android.launcher3.util.PackageUserKey; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.function.Predicate; /** * Handles the all apps overlay window initialization, updates, and its data. *

@@ -120,13 +119,6 @@ public final class TaskbarAllAppsController { mZeroStateSearchSuggestions = zeroStateSearchSuggestions; } - /** Updates the current notification dots. */ - public void updateNotificationDots(Predicate updatedDots) { - if (mAppsView != null) { - mAppsView.getAppsStore().updateNotificationDots(updatedDots); - } - } - /** Toggles visibility of {@link TaskbarAllAppsContainerView} in the overlay window. */ public void toggle() { toggle(false); @@ -218,6 +210,11 @@ public final class TaskbarAllAppsController { mAppsView = null; } + @Nullable + public TaskbarAllAppsContainerView getAppsView() { + return mAppsView; + } + @VisibleForTesting public int getTaskbarAllAppsTopPadding() { // Allow null-pointer since this should only be null if the apps view is not showing. diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java index 64cc47c739..b6917c0eae 100644 --- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java @@ -18,12 +18,11 @@ package com.android.launcher3.taskbar.overlay; import android.content.Context; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; -import com.android.launcher3.dot.DotInfo; -import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.popup.PopupDataProvider; import com.android.launcher3.taskbar.BaseTaskbarContext; import com.android.launcher3.taskbar.TaskbarActivityContext; @@ -130,6 +129,7 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { return mDragController::startDragOnLongClick; } + @NonNull @Override public PopupDataProvider getPopupDataProvider() { return mTaskbarContext.getPopupDataProvider(); @@ -140,11 +140,6 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { mUiController.startSplitSelection(splitSelectSource); } - @Override - public DotInfo getDotInfoForItem(ItemInfo info) { - return mTaskbarContext.getDotInfoForItem(info); - } - @Override public void onDragStart() {} diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3edba990e7..cf17361780 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -185,7 +185,6 @@ import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.debug.TestEventEmitter; import com.android.launcher3.debug.TestEventEmitter.TestEvent; -import com.android.launcher3.dot.DotInfo; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; @@ -237,6 +236,7 @@ import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.ItemInflater; import com.android.launcher3.util.KeyboardShortcutsDelegate; +import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.LockedUserState; import com.android.launcher3.util.MSDLPlayerWrapper; import com.android.launcher3.util.PackageUserKey; @@ -544,7 +544,7 @@ public class Launcher extends StatefulActivity mItemInflater = new ItemInflater<>(this, mAppWidgetHolder, getItemOnClickListener(), mFocusHandler, new CellLayout(mWorkspace.getContext(), mWorkspace)); - mPopupDataProvider = new PopupDataProvider(this::updateNotificationDots); + mPopupDataProvider = new PopupDataProvider(this); mWidgetPickerDataProvider = new WidgetPickerDataProvider(); PillColorProvider.getInstance(mWorkspace.getContext()).registerObserver(); @@ -1598,11 +1598,6 @@ public class Launcher extends StatefulActivity private final ScreenOnListener mScreenOnListener = this::onScreenOnChanged; - private void updateNotificationDots(Predicate updatedDots) { - mWorkspace.updateNotificationDots(updatedDots); - mAppsView.getAppsStore().updateNotificationDots(updatedDots); - } - @Override public void onAttachedToWindow() { super.onAttachedToWindow(); @@ -3027,11 +3022,6 @@ public class Launcher extends StatefulActivity return mWidgetPickerDataProvider; } - @Override - public DotInfo getDotInfoForItem(ItemInfo info) { - return mPopupDataProvider.getDotInfoForItem(info); - } - @NonNull public LauncherOverlayManager getOverlayManager() { return mOverlayManager; @@ -3046,6 +3036,12 @@ public class Launcher extends StatefulActivity return mDragLayer; } + @NonNull + @Override + public LauncherBindableItemsContainer getContent() { + return mWorkspace; + } + @Override public ActivityAllAppsContainerView getAppsView() { return mAppsView; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 94ff44145b..559582879e 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -83,7 +83,6 @@ import com.android.launcher3.celllayout.CellPosMapper.CellPos; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.debug.TestEventEmitter; import com.android.launcher3.debug.TestEventEmitter.TestEvent; -import com.android.launcher3.dot.FolderDotInfo; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; @@ -119,7 +118,6 @@ import com.android.launcher3.util.IntSparseArrayMap; import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.MSDLPlayerWrapper; import com.android.launcher3.util.OverlayEdgeEffect; -import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.WallpaperOffsetInterpolator; @@ -3419,38 +3417,6 @@ public class Workspace extends PagedView return null; } - public void updateNotificationDots(Predicate updatedDots) { - final PackageUserKey packageUserKey = new PackageUserKey(null, null); - Predicate matcher = info -> !packageUserKey.updateFromItemInfo(info) - || updatedDots.test(packageUserKey); - - ItemOperator op = (info, v) -> { - if (info instanceof WorkspaceItemInfo && v instanceof BubbleTextView) { - if (matcher.test(info)) { - ((BubbleTextView) v).applyDotState(info, true /* animate */); - } - } else if (info instanceof FolderInfo && v instanceof FolderIcon) { - FolderInfo fi = (FolderInfo) info; - if (fi.anyMatch(matcher)) { - FolderDotInfo folderDotInfo = new FolderDotInfo(); - for (ItemInfo si : fi.getContents()) { - folderDotInfo.addDotInfo(mLauncher.getDotInfoForItem(si)); - } - ((FolderIcon) v).setDotInfo(folderDotInfo); - } - } - - // process all the shortcuts - return false; - }; - - mapOverItems(op); - Folder folder = Folder.getOpen(mLauncher); - if (folder != null) { - folder.iterateOverItems(op); - } - } - /** * Remove workspace icons & widget information related to items in matcher. * diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java index 8a5e388c50..318b3ceffa 100644 --- a/src/com/android/launcher3/popup/PopupDataProvider.java +++ b/src/com/android/launcher3/popup/PopupDataProvider.java @@ -23,20 +23,27 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.launcher3.BubbleTextView; +import com.android.launcher3.allapps.ActivityAllAppsContainerView; import com.android.launcher3.dot.DotInfo; +import com.android.launcher3.dot.FolderDotInfo; +import com.android.launcher3.folder.Folder; +import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.model.data.FolderInfo; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.notification.NotificationKeyData; import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.LauncherBindableItemsContainer.ItemOperator; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.ShortcutUtil; +import com.android.launcher3.views.ActivityContext; import java.io.PrintWriter; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Predicate; /** @@ -47,19 +54,49 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan private static final boolean LOGD = false; private static final String TAG = "PopupDataProvider"; - private final Consumer> mNotificationDotsChangeListener; + private final ActivityContext mContext; + + /** Maps packages to their DotInfo's . */ + private final Map mPackageUserToDotInfos = new HashMap<>(); /** Maps launcher activity components to a count of how many shortcuts they have. */ private HashMap mDeepShortcutMap = new HashMap<>(); - /** Maps packages to their DotInfo's . */ - private Map mPackageUserToDotInfos = new HashMap<>(); - public PopupDataProvider(Consumer> notificationDotsChangeListener) { - mNotificationDotsChangeListener = notificationDotsChangeListener; + public PopupDataProvider(ActivityContext context) { + mContext = context; } private void updateNotificationDots(Predicate updatedDots) { - mNotificationDotsChangeListener.accept(updatedDots); + final PackageUserKey packageUserKey = new PackageUserKey(null, null); + Predicate matcher = info -> !packageUserKey.updateFromItemInfo(info) + || updatedDots.test(packageUserKey); + + ItemOperator op = (info, v) -> { + if (v instanceof BubbleTextView && info != null && matcher.test(info)) { + ((BubbleTextView) v).applyDotState(info, true /* animate */); + } else if (v instanceof FolderIcon icon + && info instanceof FolderInfo fi && fi.anyMatch(matcher)) { + FolderDotInfo folderDotInfo = new FolderDotInfo(); + for (ItemInfo si : fi.getContents()) { + folderDotInfo.addDotInfo(getDotInfoForItem(si)); + } + icon.setDotInfo(folderDotInfo); + } + + // process all the shortcuts + return false; + }; + + mContext.getContent().mapOverItems(op); + Folder folder = Folder.getOpen(mContext); + if (folder != null) { + folder.iterateOverItems(op); + } + + ActivityAllAppsContainerView appsView = mContext.getAppsView(); + if (appsView != null) { + appsView.getAppsStore().updateNotificationDots(updatedDots); + } } @Override diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java index b1653d0fab..0c7e69b95f 100644 --- a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java +++ b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java @@ -29,6 +29,7 @@ import android.view.View.OnClickListener; import android.view.ViewAnimationUtils; import android.view.inputmethod.InputMethodManager; +import androidx.annotation.NonNull; import androidx.annotation.UiThread; import com.android.launcher3.AbstractFloatingView; @@ -131,8 +132,7 @@ public class SecondaryDisplayLauncher extends BaseActivity } mDragController.addDragListener(this); - mPopupDataProvider = new PopupDataProvider( - mAppsView.getAppsStore()::updateNotificationDots); + mPopupDataProvider = new PopupDataProvider(this); mModel.addCallbacksAndLoad(this); } @@ -306,6 +306,8 @@ public class SecondaryDisplayLauncher extends BaseActivity mStringCache = cache; } + @Override + @NonNull public PopupDataProvider getPopupDataProvider() { return mPopupDataProvider; } diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java index bbea043820..9733e27399 100644 --- a/src/com/android/launcher3/views/ActivityContext.java +++ b/src/com/android/launcher3/views/ActivityContext.java @@ -80,6 +80,7 @@ import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.popup.PopupDataProvider; import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.ApplicationInfoWrapper; +import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.SplitConfigurationOptions; @@ -101,10 +102,6 @@ public interface ActivityContext { return false; } - default DotInfo getDotInfoForItem(ItemInfo info) { - return null; - } - default AccessibilityDelegate getAccessibilityDelegate() { return null; } @@ -193,6 +190,14 @@ public interface ActivityContext { return null; } + /** + * Returns the primary content of this context + */ + @NonNull + default LauncherBindableItemsContainer getContent() { + return op -> { }; + } + /** * The all apps container, if it exists in this context. */ @@ -286,9 +291,13 @@ public interface ActivityContext { return v -> false; } - @Nullable + @NonNull default PopupDataProvider getPopupDataProvider() { - return null; + return new PopupDataProvider(this); + } + + default DotInfo getDotInfoForItem(ItemInfo info) { + return getPopupDataProvider().getDotInfoForItem(info); } /** diff --git a/tests/multivalentTests/src/com/android/launcher3/util/TestSandboxModelContextWrapper.java b/tests/multivalentTests/src/com/android/launcher3/util/TestSandboxModelContextWrapper.java index 393282f442..7183cfd83c 100644 --- a/tests/multivalentTests/src/com/android/launcher3/util/TestSandboxModelContextWrapper.java +++ b/tests/multivalentTests/src/com/android/launcher3/util/TestSandboxModelContextWrapper.java @@ -22,6 +22,7 @@ import static com.android.launcher3.util.MainThreadInitializedObject.SandboxCont import android.content.ContextWrapper; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.test.platform.app.InstrumentationRegistry; @@ -57,7 +58,7 @@ public class TestSandboxModelContextWrapper extends ActivityContextWrapper imple protected ActivityAllAppsContainerView mAppsView; - private final PopupDataProvider mPopupDataProvider = new PopupDataProvider(i -> {}); + private final PopupDataProvider mPopupDataProvider = new PopupDataProvider(this); private final WidgetPickerDataProvider mWidgetPickerDataProvider = new WidgetPickerDataProvider(); protected final UserCache mUserCache; @@ -80,7 +81,7 @@ public class TestSandboxModelContextWrapper extends ActivityContextWrapper imple mAllAppsStore = mAppsView.getAppsStore(); } - @Nullable + @NonNull @Override public PopupDataProvider getPopupDataProvider() { return mPopupDataProvider;