Cleaning up some build configurations
> Removing Launcher3Go-without-quickstep
> Removing src_ui_overrides to src_no_quickstep
> Removing unnecessary code swpa for GO builds
Bug: 330920490
Flag: None
Test: Presubmit, everything builds
Change-Id: I5746dbc7c5a37c1d99d78b55bf2a6adce1a711c9
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index be01d63..7fdfd72 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -47,12 +47,12 @@
import com.android.launcher3.icons.IconCache;
import com.android.launcher3.model.AddWorkspaceItemsTask;
import com.android.launcher3.model.AllAppsList;
+import com.android.launcher3.model.BaseLauncherBinder;
import com.android.launcher3.model.BaseModelUpdateTask;
import com.android.launcher3.model.BgDataModel;
import com.android.launcher3.model.BgDataModel.Callbacks;
import com.android.launcher3.model.CacheDataUpdatedTask;
import com.android.launcher3.model.ItemInstallQueue;
-import com.android.launcher3.model.LauncherBinder;
import com.android.launcher3.model.LoaderTask;
import com.android.launcher3.model.ModelDbController;
import com.android.launcher3.model.ModelDelegate;
@@ -365,7 +365,7 @@
MAIN_EXECUTOR.execute(cb::clearPendingBinds);
}
- LauncherBinder launcherBinder = new LauncherBinder(
+ BaseLauncherBinder launcherBinder = new BaseLauncherBinder(
mApp, mBgDataModel, mBgAllAppsList, callbacksList);
if (bindDirectly) {
// Divide the set of loaded items into those that we are binding synchronously,
diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
index fe327d0..addd072 100644
--- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
+++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
@@ -50,10 +50,10 @@
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.Workspace;
import com.android.launcher3.graphics.LauncherPreviewRenderer.PreviewContext;
+import com.android.launcher3.model.BaseLauncherBinder;
import com.android.launcher3.model.BgDataModel;
import com.android.launcher3.model.BgDataModel.Callbacks;
import com.android.launcher3.model.GridSizeMigrationUtil;
-import com.android.launcher3.model.LauncherBinder;
import com.android.launcher3.model.LoaderTask;
import com.android.launcher3.model.ModelDbController;
import com.android.launcher3.provider.LauncherDbUtils;
@@ -244,7 +244,7 @@
/* bgAllAppsList= */ null,
bgModel,
LauncherAppState.getInstance(previewContext).getModel().getModelDelegate(),
- new LauncherBinder(LauncherAppState.getInstance(previewContext), bgModel,
+ new BaseLauncherBinder(LauncherAppState.getInstance(previewContext), bgModel,
/* bgAllAppsList= */ null, new Callbacks[0])) {
@Override
diff --git a/src/com/android/launcher3/icons/ShortcutCachingLogic.java b/src/com/android/launcher3/icons/ShortcutCachingLogic.java
index 1791539..f40eda6 100644
--- a/src/com/android/launcher3/icons/ShortcutCachingLogic.java
+++ b/src/com/android/launcher3/icons/ShortcutCachingLogic.java
@@ -16,7 +16,7 @@
package com.android.launcher3.icons;
-import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import android.content.ComponentName;
import android.content.Context;
@@ -101,7 +101,7 @@
* Launcher specific checks
*/
public static Drawable getIcon(Context context, ShortcutInfo shortcutInfo, int density) {
- if (GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return null;
}
try {
diff --git a/src/com/android/launcher3/model/BaseLauncherBinder.java b/src/com/android/launcher3/model/BaseLauncherBinder.java
index 966b6a6..41dbe4e 100644
--- a/src/com/android/launcher3/model/BaseLauncherBinder.java
+++ b/src/com/android/launcher3/model/BaseLauncherBinder.java
@@ -16,6 +16,7 @@
package com.android.launcher3.model;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.Flags.enableWorkspaceInflation;
import static com.android.launcher3.config.FeatureFlags.ENABLE_SMARTSPACE_REMOVAL;
import static com.android.launcher3.model.ItemInstallQueue.FLAG_LOADER_RUNNING;
@@ -43,6 +44,7 @@
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
+import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.ItemInflater;
@@ -50,10 +52,12 @@
import com.android.launcher3.util.LooperIdleLock;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.RunnableList;
+import com.android.launcher3.widget.model.WidgetsListBaseEntry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -65,7 +69,7 @@
/**
* Binds the results of {@link com.android.launcher3.model.LoaderTask} to the Callbacks objects.
*/
-public abstract class BaseLauncherBinder {
+public class BaseLauncherBinder {
protected static final String TAG = "LauncherBinder";
private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons
@@ -81,8 +85,8 @@
private int mMyBindingId;
public BaseLauncherBinder(LauncherAppState app, BgDataModel dataModel,
- AllAppsList allAppsList, Callbacks[] callbacksList, LooperExecutor uiExecutor) {
- mUiExecutor = uiExecutor;
+ AllAppsList allAppsList, Callbacks[] callbacksList) {
+ mUiExecutor = MAIN_EXECUTOR;
mApp = app;
mBgDataModel = dataModel;
mBgAllAppsList = allAppsList;
@@ -158,7 +162,16 @@
/**
* BindDeepShortcuts is abstract because it is a no-op for the go launcher.
*/
- public abstract void bindDeepShortcuts();
+ public void bindDeepShortcuts() {
+ if (!WIDGETS_ENABLED) {
+ return;
+ }
+ final HashMap<ComponentKey, Integer> shortcutMapCopy;
+ synchronized (mBgDataModel) {
+ shortcutMapCopy = new HashMap<>(mBgDataModel.deepShortcutMap);
+ }
+ executeCallbacksTask(c -> c.bindDeepShortcutMap(shortcutMapCopy), mUiExecutor);
+ }
/**
* Binds the all apps results from LoaderTask to the callbacks UX.
@@ -178,12 +191,24 @@
/**
* bindWidgets is abstract because it is a no-op for the go launcher.
*/
- public abstract void bindWidgets();
+ public void bindWidgets() {
+ if (!WIDGETS_ENABLED) {
+ return;
+ }
+ final List<WidgetsListBaseEntry> widgets =
+ mBgDataModel.widgetsModel.getWidgetsListForPicker(mApp.getContext());
+ executeCallbacksTask(c -> c.bindAllWidgets(widgets), mUiExecutor);
+ }
/**
* bindWidgets is abstract because it is a no-op for the go launcher.
*/
- public abstract void bindSmartspaceWidget();
+ public void bindSmartspaceWidget() {
+ if (!WIDGETS_ENABLED) {
+ return;
+ }
+ executeCallbacksTask(c -> c.bindSmartspaceWidget(), mUiExecutor);
+ }
/**
* Sorts the set of items by hotseat, workspace (spatially from top to bottom, left to right)
diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java
index 8579d1d..0e1c8f4 100644
--- a/src/com/android/launcher3/model/BgDataModel.java
+++ b/src/com/android/launcher3/model/BgDataModel.java
@@ -18,9 +18,9 @@
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY;
import static com.android.launcher3.BuildConfig.QSB_ON_FIRST_SCREEN;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.config.FeatureFlags.ENABLE_SMARTSPACE_REMOVAL;
import static com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidget;
-import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
import static com.android.launcher3.shortcuts.ShortcutRequest.PINNED;
import static java.util.stream.Collectors.groupingBy;
@@ -305,7 +305,7 @@
* shortcuts and unpinning any extra shortcuts.
*/
public synchronized void updateShortcutPinnedState(Context context, UserHandle user) {
- if (GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return;
}
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 17cef90..f3d04b7 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -132,7 +132,7 @@
private FirstScreenBroadcast mFirstScreenBroadcast;
@NonNull
- private final LauncherBinder mLauncherBinder;
+ private final BaseLauncherBinder mLauncherBinder;
private final LauncherApps mLauncherApps;
private final UserManager mUserManager;
@@ -153,13 +153,13 @@
private String mDbName;
public LoaderTask(@NonNull LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel bgModel,
- ModelDelegate modelDelegate, @NonNull LauncherBinder launcherBinder) {
+ ModelDelegate modelDelegate, @NonNull BaseLauncherBinder launcherBinder) {
this(app, bgAllAppsList, bgModel, modelDelegate, launcherBinder, new UserManagerState());
}
@VisibleForTesting
LoaderTask(@NonNull LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel bgModel,
- ModelDelegate modelDelegate, @NonNull LauncherBinder launcherBinder,
+ ModelDelegate modelDelegate, @NonNull BaseLauncherBinder launcherBinder,
UserManagerState userManagerState) {
mApp = app;
mBgAllAppsList = bgAllAppsList;
diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java
new file mode 100644
index 0000000..91ce5ea
--- /dev/null
+++ b/src/com/android/launcher3/model/WidgetsModel.java
@@ -0,0 +1,355 @@
+
+package com.android.launcher3.model;
+
+import static android.appwidget.AppWidgetProviderInfo.WIDGET_FEATURE_HIDE_FROM_PICKER;
+
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
+import static com.android.launcher3.pm.ShortcutConfigActivityInfo.queryList;
+import static com.android.launcher3.widget.WidgetSections.NO_CATEGORY;
+
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.toList;
+
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.util.Log;
+import android.util.Pair;
+
+import androidx.annotation.Nullable;
+import androidx.collection.ArrayMap;
+
+import com.android.launcher3.AppFilter;
+import com.android.launcher3.InvariantDeviceProfile;
+import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.Utilities;
+import com.android.launcher3.compat.AlphabeticIndexCompat;
+import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.icons.ComponentWithLabelAndIcon;
+import com.android.launcher3.icons.IconCache;
+import com.android.launcher3.model.data.PackageItemInfo;
+import com.android.launcher3.pm.ShortcutConfigActivityInfo;
+import com.android.launcher3.util.IntSet;
+import com.android.launcher3.util.PackageUserKey;
+import com.android.launcher3.util.Preconditions;
+import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
+import com.android.launcher3.widget.WidgetManagerHelper;
+import com.android.launcher3.widget.WidgetSections;
+import com.android.launcher3.widget.model.WidgetsListBaseEntry;
+import com.android.launcher3.widget.model.WidgetsListContentEntry;
+import com.android.launcher3.widget.model.WidgetsListHeaderEntry;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.function.Predicate;
+
+/**
+ * Widgets data model that is used by the adapters of the widget views and controllers.
+ *
+ * <p> The widgets and shortcuts are organized using package name as its index.
+ */
+public class WidgetsModel {
+
+ private static final String TAG = "WidgetsModel";
+ private static final boolean DEBUG = false;
+
+ /* Map of widgets and shortcuts that are tracked per package. */
+ private final Map<PackageItemInfo, List<WidgetItem>> mWidgetsList = new HashMap<>();
+
+ /**
+ * Returns a list of {@link WidgetsListBaseEntry} filtered using given widget item filter. All
+ * {@link WidgetItem}s in a single row are sorted (based on label and user), but the overall
+ * list of {@link WidgetsListBaseEntry}s is not sorted.
+ *
+ * @see com.android.launcher3.widget.picker.WidgetsListAdapter#setWidgets(List)
+ */
+ public synchronized ArrayList<WidgetsListBaseEntry> getFilteredWidgetsListForPicker(
+ Context context,
+ Predicate<WidgetItem> widgetItemFilter) {
+ if (!WIDGETS_ENABLED) {
+ return new ArrayList<>();
+ }
+ ArrayList<WidgetsListBaseEntry> result = new ArrayList<>();
+ AlphabeticIndexCompat indexer = new AlphabeticIndexCompat(context);
+
+ for (Map.Entry<PackageItemInfo, List<WidgetItem>> entry : mWidgetsList.entrySet()) {
+ PackageItemInfo pkgItem = entry.getKey();
+ List<WidgetItem> widgetItems = entry.getValue()
+ .stream()
+ .filter(widgetItemFilter).toList();
+ if (!widgetItems.isEmpty()) {
+ String sectionName = (pkgItem.title == null) ? "" :
+ indexer.computeSectionName(pkgItem.title);
+ result.add(WidgetsListHeaderEntry.create(pkgItem, sectionName, widgetItems));
+ result.add(new WidgetsListContentEntry(pkgItem, sectionName, widgetItems));
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns a list of {@link WidgetsListBaseEntry}. All {@link WidgetItem} in a single row
+ * are sorted (based on label and user), but the overall list of
+ * {@link WidgetsListBaseEntry}s is not sorted.
+ *
+ * @see com.android.launcher3.widget.picker.WidgetsListAdapter#setWidgets(List)
+ */
+ public synchronized ArrayList<WidgetsListBaseEntry> getWidgetsListForPicker(Context context) {
+ // return all items
+ return getFilteredWidgetsListForPicker(context, /*widgetItemFilter=*/ item -> true);
+ }
+
+ /** Returns a mapping of packages to their widgets without static shortcuts. */
+ public synchronized Map<PackageUserKey, List<WidgetItem>> getAllWidgetsWithoutShortcuts() {
+ if (!WIDGETS_ENABLED) {
+ return Collections.emptyMap();
+ }
+ Map<PackageUserKey, List<WidgetItem>> packagesToWidgets = new HashMap<>();
+ mWidgetsList.forEach((packageItemInfo, widgetsAndShortcuts) -> {
+ List<WidgetItem> widgets = widgetsAndShortcuts.stream()
+ .filter(item -> item.widgetInfo != null)
+ .collect(toList());
+ if (widgets.size() > 0) {
+ packagesToWidgets.put(
+ new PackageUserKey(packageItemInfo.packageName, packageItemInfo.user),
+ widgets);
+ }
+ });
+ return packagesToWidgets;
+ }
+
+ /**
+ * @param packageUser If null, all widgets and shortcuts are updated and returned, otherwise
+ * only widgets and shortcuts associated with the package/user are.
+ */
+ public List<ComponentWithLabelAndIcon> update(
+ LauncherAppState app, @Nullable PackageUserKey packageUser) {
+ if (!WIDGETS_ENABLED) {
+ return Collections.emptyList();
+ }
+ Preconditions.assertWorkerThread();
+
+ Context context = app.getContext();
+ final ArrayList<WidgetItem> widgetsAndShortcuts = new ArrayList<>();
+ List<ComponentWithLabelAndIcon> updatedItems = new ArrayList<>();
+ try {
+ InvariantDeviceProfile idp = app.getInvariantDeviceProfile();
+ PackageManager pm = app.getContext().getPackageManager();
+
+ // Widgets
+ WidgetManagerHelper widgetManager = new WidgetManagerHelper(context);
+ for (AppWidgetProviderInfo widgetInfo : widgetManager.getAllProviders(packageUser)) {
+ LauncherAppWidgetProviderInfo launcherWidgetInfo =
+ LauncherAppWidgetProviderInfo.fromProviderInfo(context, widgetInfo);
+
+ widgetsAndShortcuts.add(new WidgetItem(
+ launcherWidgetInfo, idp, app.getIconCache(), app.getContext(),
+ widgetManager));
+ updatedItems.add(launcherWidgetInfo);
+ }
+
+ // Shortcuts
+ for (ShortcutConfigActivityInfo info :
+ queryList(context, packageUser)) {
+ widgetsAndShortcuts.add(new WidgetItem(info, app.getIconCache(), pm));
+ updatedItems.add(info);
+ }
+ setWidgetsAndShortcuts(widgetsAndShortcuts, app, packageUser);
+ } catch (Exception e) {
+ if (!FeatureFlags.IS_STUDIO_BUILD && Utilities.isBinderSizeError(e)) {
+ // the returned value may be incomplete and will not be refreshed until the next
+ // time Launcher starts.
+ // TODO: after figuring out a repro step, introduce a dirty bit to check when
+ // onResume is called to refresh the widget provider list.
+ } else {
+ throw e;
+ }
+ }
+
+ return updatedItems;
+ }
+
+ private synchronized void setWidgetsAndShortcuts(ArrayList<WidgetItem> rawWidgetsShortcuts,
+ LauncherAppState app, @Nullable PackageUserKey packageUser) {
+ if (DEBUG) {
+ Log.d(TAG, "addWidgetsAndShortcuts, widgetsShortcuts#=" + rawWidgetsShortcuts.size());
+ }
+
+ // Temporary cache for {@link PackageItemInfos} to avoid having to go through
+ // {@link mPackageItemInfos} to locate the key to be used for {@link #mWidgetsList}
+ PackageItemInfoCache packageItemInfoCache = new PackageItemInfoCache();
+
+ if (packageUser == null) {
+ // Clear the list if this is an update on all widgets and shortcuts.
+ mWidgetsList.clear();
+ } else {
+ // Otherwise, only clear the widgets and shortcuts for the changed package.
+ mWidgetsList.remove(packageItemInfoCache.getOrCreate(packageUser));
+ }
+
+ // add and update.
+ mWidgetsList.putAll(rawWidgetsShortcuts.stream()
+ .filter(new WidgetValidityCheck(app))
+ .flatMap(widgetItem -> getPackageUserKeys(app.getContext(), widgetItem).stream()
+ .map(key -> new Pair<>(packageItemInfoCache.getOrCreate(key), widgetItem)))
+ .collect(groupingBy(pair -> pair.first, mapping(pair -> pair.second, toList()))));
+
+ // Update each package entry
+ IconCache iconCache = app.getIconCache();
+ for (PackageItemInfo p : packageItemInfoCache.values()) {
+ iconCache.getTitleAndIconForApp(p, true /* userLowResIcon */);
+ }
+ }
+
+ public void onPackageIconsUpdated(Set<String> packageNames, UserHandle user,
+ LauncherAppState app) {
+ if (!WIDGETS_ENABLED) {
+ return;
+ }
+ WidgetManagerHelper widgetManager = new WidgetManagerHelper(app.getContext());
+ for (Entry<PackageItemInfo, List<WidgetItem>> entry : mWidgetsList.entrySet()) {
+ if (packageNames.contains(entry.getKey().packageName)) {
+ List<WidgetItem> items = entry.getValue();
+ int count = items.size();
+ for (int i = 0; i < count; i++) {
+ WidgetItem item = items.get(i);
+ if (item.user.equals(user)) {
+ if (item.activityInfo != null) {
+ items.set(i, new WidgetItem(item.activityInfo, app.getIconCache(),
+ app.getContext().getPackageManager()));
+ } else {
+ items.set(i, new WidgetItem(item.widgetInfo,
+ app.getInvariantDeviceProfile(), app.getIconCache(),
+ app.getContext(), widgetManager));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public WidgetItem getWidgetProviderInfoByProviderName(
+ ComponentName providerName, UserHandle user) {
+ if (!WIDGETS_ENABLED) {
+ return null;
+ }
+ List<WidgetItem> widgetsList = mWidgetsList.get(
+ new PackageItemInfo(providerName.getPackageName(), user));
+ if (widgetsList == null) {
+ return null;
+ }
+
+ for (WidgetItem item : widgetsList) {
+ if (item.componentName.equals(providerName)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ /** Returns {@link PackageItemInfo} of a pending widget. */
+ public static PackageItemInfo newPendingItemInfo(Context context, ComponentName provider,
+ UserHandle user) {
+ Map<ComponentName, IntSet> widgetsToCategories =
+ WidgetSections.getWidgetsToCategory(context);
+ if (widgetsToCategories.containsKey(provider)) {
+ Iterator<Integer> categoriesIterator = widgetsToCategories.get(provider).iterator();
+ int firstCategory = NO_CATEGORY;
+ while (categoriesIterator.hasNext() && firstCategory == NO_CATEGORY) {
+ firstCategory = categoriesIterator.next();
+ }
+ return new PackageItemInfo(provider.getPackageName(), firstCategory, user);
+ }
+ return new PackageItemInfo(provider.getPackageName(), user);
+ }
+
+ private List<PackageUserKey> getPackageUserKeys(Context context, WidgetItem item) {
+ Map<ComponentName, IntSet> widgetsToCategories =
+ WidgetSections.getWidgetsToCategory(context);
+ IntSet categories = widgetsToCategories.get(item.componentName);
+ if (categories == null || categories.isEmpty()) {
+ return Arrays.asList(
+ new PackageUserKey(item.componentName.getPackageName(), item.user));
+ }
+ List<PackageUserKey> packageUserKeys = new ArrayList<>();
+ categories.forEach(category -> {
+ if (category == NO_CATEGORY) {
+ packageUserKeys.add(
+ new PackageUserKey(item.componentName.getPackageName(),
+ item.user));
+ } else {
+ packageUserKeys.add(new PackageUserKey(category, item.user));
+ }
+ });
+ return packageUserKeys;
+ }
+
+ private static class WidgetValidityCheck implements Predicate<WidgetItem> {
+
+ private final InvariantDeviceProfile mIdp;
+ private final AppFilter mAppFilter;
+
+ WidgetValidityCheck(LauncherAppState app) {
+ mIdp = app.getInvariantDeviceProfile();
+ mAppFilter = new AppFilter(app.getContext());
+ }
+
+ @Override
+ public boolean test(WidgetItem item) {
+ if (item.widgetInfo != null) {
+ if ((item.widgetInfo.getWidgetFeatures() & WIDGET_FEATURE_HIDE_FROM_PICKER) != 0) {
+ // Widget is hidden from picker
+ return false;
+ }
+
+ // Ensure that all widgets we show can be added on a workspace of this size
+ if (!item.widgetInfo.isMinSizeFulfilled()) {
+ if (DEBUG) {
+ Log.d(TAG, String.format(
+ "Widget %s : can't fit on this device with a grid size: %dx%d",
+ item.componentName, mIdp.numColumns, mIdp.numRows));
+ }
+ return false;
+ }
+ }
+ if (!mAppFilter.shouldShowApp(item.componentName)) {
+ if (DEBUG) {
+ Log.d(TAG, String.format("%s is filtered and not added to the widget tray.",
+ item.componentName));
+ }
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ private static final class PackageItemInfoCache {
+ private final Map<PackageUserKey, PackageItemInfo> mMap = new ArrayMap<>();
+
+ PackageItemInfo getOrCreate(PackageUserKey key) {
+ PackageItemInfo pInfo = mMap.get(key);
+ if (pInfo == null) {
+ pInfo = new PackageItemInfo(key.mPackageName, key.mWidgetCategory, key.mUser);
+ pInfo.user = key.mUser;
+ mMap.put(key, pInfo);
+ }
+ return pInfo;
+ }
+
+ Collection<PackageItemInfo> values() {
+ return mMap.values();
+ }
+ }
+}
diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java
index 756153e..9f2b10f 100644
--- a/src/com/android/launcher3/provider/RestoreDbTask.java
+++ b/src/com/android/launcher3/provider/RestoreDbTask.java
@@ -18,6 +18,7 @@
import static android.os.Process.myUserHandle;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.Flags.enableLauncherBrMetricsFixed;
import static com.android.launcher3.InvariantDeviceProfile.TYPE_MULTI_DISPLAY;
import static com.android.launcher3.LauncherPrefs.APP_WIDGET_IDS;
@@ -64,7 +65,6 @@
import com.android.launcher3.model.DeviceGridState;
import com.android.launcher3.model.LoaderTask;
import com.android.launcher3.model.ModelDbController;
-import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
@@ -428,7 +428,7 @@
private void restoreAppWidgetIds(Context context, ModelDbController controller,
LauncherRestoreEventLogger launcherRestoreEventLogger, int[] oldWidgetIds,
int[] newWidgetIds, @NonNull AppWidgetHost host) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
FileLog.e(TAG, "Skipping widget ID remap as widgets not supported");
host.deleteHost();
launcherRestoreEventLogger.logFavoritesItemsRestoreFailed(Favorites.ITEM_TYPE_APPWIDGET,
diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java
index a5f9c2a..c10d85e 100644
--- a/src/com/android/launcher3/settings/SettingsActivity.java
+++ b/src/com/android/launcher3/settings/SettingsActivity.java
@@ -52,7 +52,6 @@
import com.android.launcher3.BuildConfig;
import com.android.launcher3.LauncherFiles;
import com.android.launcher3.R;
-import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.states.RotationHelper;
import com.android.launcher3.uioverrides.flags.DeveloperOptionsUI;
import com.android.launcher3.util.DisplayController;
@@ -238,7 +237,7 @@
protected boolean initPreference(Preference preference) {
switch (preference.getKey()) {
case NOTIFICATION_DOTS_PREFERENCE_KEY:
- return !WidgetsModel.GO_DISABLE_NOTIFICATION_DOTS;
+ return BuildConfig.NOTIFICATION_DOTS_ENABLED;
case ALLOW_ROTATION_PREFERENCE_KEY:
DisplayController.Info info =
diff --git a/src/com/android/launcher3/shortcuts/ShortcutRequest.java b/src/com/android/launcher3/shortcuts/ShortcutRequest.java
index 21efceb..015d54d 100644
--- a/src/com/android/launcher3/shortcuts/ShortcutRequest.java
+++ b/src/com/android/launcher3/shortcuts/ShortcutRequest.java
@@ -16,7 +16,7 @@
package com.android.launcher3.shortcuts;
-import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import android.content.ComponentName;
import android.content.Context;
@@ -47,7 +47,7 @@
| ShortcutQuery.FLAG_MATCH_MANIFEST;
public static final int PINNED = ShortcutQuery.FLAG_MATCH_PINNED;
- private final ShortcutQuery mQuery = GO_DISABLE_WIDGETS ? null : new ShortcutQuery();
+ private final ShortcutQuery mQuery = !WIDGETS_ENABLED ? null : new ShortcutQuery();
private final Context mContext;
private final UserHandle mUserHandle;
@@ -74,7 +74,7 @@
* @return A list of ShortcutInfo's associated with the given package.
*/
public ShortcutRequest forPackage(String packageName, @Nullable List<String> shortcutIds) {
- if (!GO_DISABLE_WIDGETS && packageName != null) {
+ if (WIDGETS_ENABLED && packageName != null) {
mQuery.setPackage(packageName);
mQuery.setShortcutIds(shortcutIds);
}
@@ -82,7 +82,7 @@
}
public ShortcutRequest withContainer(@Nullable ComponentName activity) {
- if (!GO_DISABLE_WIDGETS) {
+ if (WIDGETS_ENABLED) {
if (activity == null) {
mFailed = true;
} else {
@@ -93,7 +93,7 @@
}
public QueryResult query(int flags) {
- if (GO_DISABLE_WIDGETS || mFailed) {
+ if (!WIDGETS_ENABLED || mFailed) {
return QueryResult.DEFAULT;
}
mQuery.setQueryFlags(flags);
@@ -109,7 +109,7 @@
public static class QueryResult extends ArrayList<ShortcutInfo> {
- static final QueryResult DEFAULT = new QueryResult(GO_DISABLE_WIDGETS);
+ static final QueryResult DEFAULT = new QueryResult(!WIDGETS_ENABLED);
private final boolean mWasSuccess;
diff --git a/src/com/android/launcher3/util/GridOccupancy.java b/src/com/android/launcher3/util/GridOccupancy.java
index 43e486c..f248e58 100644
--- a/src/com/android/launcher3/util/GridOccupancy.java
+++ b/src/com/android/launcher3/util/GridOccupancy.java
@@ -7,7 +7,7 @@
/**
* Utility object to manage the occupancy in a grid.
*/
-public class GridOccupancy extends AbsGridOccupancy {
+public class GridOccupancy {
private final int mCountX;
private final int mCountY;
@@ -30,7 +30,24 @@
* @return true if a vacant cell was found
*/
public boolean findVacantCell(int[] vacantOut, int spanX, int spanY) {
- return super.findVacantCell(vacantOut, cells, mCountX, mCountY, spanX, spanY);
+ for (int y = 0; (y + spanY) <= mCountY; y++) {
+ for (int x = 0; (x + spanX) <= mCountX; x++) {
+ boolean available = !cells[x][y];
+ out:
+ for (int i = x; i < x + spanX; i++) {
+ for (int j = y; j < y + spanY; j++) {
+ available = available && !cells[i][j];
+ if (!available) break out;
+ }
+ }
+ if (available) {
+ vacantOut[0] = x;
+ vacantOut[1] = y;
+ return true;
+ }
+ }
+ }
+ return false;
}
public void copyTo(GridOccupancy dest) {
diff --git a/src/com/android/launcher3/util/ShortcutUtil.java b/src/com/android/launcher3/util/ShortcutUtil.java
index 91cf835..07b7941 100644
--- a/src/com/android/launcher3/util/ShortcutUtil.java
+++ b/src/com/android/launcher3/util/ShortcutUtil.java
@@ -15,9 +15,10 @@
*/
package com.android.launcher3.util;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
+
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.Utilities;
-import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.shortcuts.ShortcutKey;
@@ -34,7 +35,7 @@
* Returns true when we should show depp shortcuts in shortcut menu for the item.
*/
public static boolean supportsDeepShortcuts(ItemInfo info) {
- return isActive(info) && isApp(info) && !WidgetsModel.GO_DISABLE_WIDGETS;
+ return isActive(info) && isApp(info) && !!WIDGETS_ENABLED;
}
/**
diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java
index 31f5d65..bf43a22 100644
--- a/src/com/android/launcher3/views/ActivityContext.java
+++ b/src/com/android/launcher3/views/ActivityContext.java
@@ -17,12 +17,12 @@
import static android.window.SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.LauncherSettings.Animation.DEFAULT_NO_ICON;
import static com.android.launcher3.Utilities.allowBGLaunch;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_KEYBOARD_CLOSED;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_PENDING_INTENT;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP;
-import static com.android.launcher3.model.WidgetsModel.GO_DISABLE_WIDGETS;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
@@ -389,7 +389,7 @@
boolean isShortcut = (item instanceof WorkspaceItemInfo)
&& item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT
&& !((WorkspaceItemInfo) item).isPromise();
- if (isShortcut && GO_DISABLE_WIDGETS) {
+ if (isShortcut && !WIDGETS_ENABLED) {
return null;
}
ActivityOptionsWrapper options = v != null ? getActivityLaunchOptions(v, item)
diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java
index 5cdad03..62eed5c 100644
--- a/src/com/android/launcher3/views/OptionsPopupView.java
+++ b/src/com/android/launcher3/views/OptionsPopupView.java
@@ -17,6 +17,7 @@
import static androidx.core.content.ContextCompat.getColorStateList;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.LauncherState.EDIT_MODE;
import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.IGNORE;
@@ -47,7 +48,6 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.logging.StatsLogManager.EventEnum;
-import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.popup.ArrowPopup;
import com.android.launcher3.shortcuts.DeepShortcutView;
@@ -207,7 +207,7 @@
R.drawable.ic_palette,
IGNORE,
OptionsPopupView::startWallpaperPicker));
- if (!WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (WIDGETS_ENABLED) {
options.add(new OptionItem(launcher,
R.string.widget_button_text,
R.drawable.ic_widget,
diff --git a/src/com/android/launcher3/widget/LauncherWidgetHolder.java b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
index 0fb4e09..a5e22c5 100644
--- a/src/com/android/launcher3/widget/LauncherWidgetHolder.java
+++ b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
@@ -17,6 +17,7 @@
import static android.app.Activity.RESULT_CANCELED;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.Flags.enableWorkspaceInflation;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.widget.LauncherAppWidgetProviderInfo.fromProviderInfo;
@@ -40,7 +41,6 @@
import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
-import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
@@ -100,7 +100,7 @@
* Starts listening to the widget updates from the server side
*/
public void startListening() {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return;
}
@@ -177,7 +177,7 @@
* @return The allocated app widget id if allocation is successful, returns -1 otherwise
*/
public int allocateAppWidgetId() {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return AppWidgetManager.INVALID_APPWIDGET_ID;
}
@@ -210,7 +210,7 @@
*/
public void startConfigActivity(@NonNull BaseDraggingActivity activity, int widgetId,
int requestCode) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
sendActionCancelled(activity, requestCode);
return;
}
@@ -261,7 +261,7 @@
*/
public void startBindFlow(@NonNull BaseActivity activity,
int appWidgetId, @NonNull AppWidgetProviderInfo info, int requestCode) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
sendActionCancelled(activity, requestCode);
return;
}
@@ -279,7 +279,7 @@
* Stop the host from listening to the widget updates
*/
public void stopListening() {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return;
}
mWidgetHost.stopListening();
diff --git a/src/com/android/launcher3/widget/WidgetInflater.kt b/src/com/android/launcher3/widget/WidgetInflater.kt
index dd50b71..271c9c2 100644
--- a/src/com/android/launcher3/widget/WidgetInflater.kt
+++ b/src/com/android/launcher3/widget/WidgetInflater.kt
@@ -17,11 +17,11 @@
package com.android.launcher3.widget
import android.content.Context
+import com.android.launcher3.BuildConfig
import com.android.launcher3.Launcher
import com.android.launcher3.LauncherAppState
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError
import com.android.launcher3.logging.FileLog
-import com.android.launcher3.model.WidgetsModel
import com.android.launcher3.model.data.LauncherAppWidgetInfo
import com.android.launcher3.qsb.QsbContainerView
@@ -55,7 +55,7 @@
// The widget id is not valid. Try to find the widget based on the provider info.
appWidgetInfo = widgetHelper.findProvider(item.providerName, item.user)
if (appWidgetInfo == null) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!BuildConfig.WIDGETS_ENABLED) {
removalReason = "widgets are disabled on go device."
logReason = RestoreError.WIDGETS_DISABLED
} else {
diff --git a/src/com/android/launcher3/widget/WidgetManagerHelper.java b/src/com/android/launcher3/widget/WidgetManagerHelper.java
index ba7e075..d293d15 100644
--- a/src/com/android/launcher3/widget/WidgetManagerHelper.java
+++ b/src/com/android/launcher3/widget/WidgetManagerHelper.java
@@ -16,6 +16,8 @@
package com.android.launcher3.widget;
+import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
+
import android.annotation.TargetApi;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -31,7 +33,6 @@
import androidx.annotation.RequiresApi;
import com.android.launcher3.logging.FileLog;
-import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.util.PackageUserKey;
@@ -87,7 +88,7 @@
*/
@TargetApi(Build.VERSION_CODES.O)
public List<AppWidgetProviderInfo> getAllProviders(@Nullable PackageUserKey packageUser) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return Collections.emptyList();
}
@@ -112,7 +113,7 @@
*/
public boolean bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info,
Bundle options) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return false;
}
if (appWidgetId <= LauncherAppWidgetInfo.CUSTOM_WIDGET_ID) {
@@ -123,7 +124,7 @@
}
public LauncherAppWidgetProviderInfo findProvider(ComponentName provider, UserHandle user) {
- if (WidgetsModel.GO_DISABLE_WIDGETS) {
+ if (!WIDGETS_ENABLED) {
return null;
}
for (AppWidgetProviderInfo info :
@@ -139,8 +140,8 @@
* Returns if a AppWidgetProvider has marked a widget restored
*/
public boolean isAppWidgetRestored(int appWidgetId) {
- return !WidgetsModel.GO_DISABLE_WIDGETS && mAppWidgetManager.getAppWidgetOptions(
- appWidgetId).getBoolean(WIDGET_OPTION_RESTORE_COMPLETED);
+ return WIDGETS_ENABLED && mAppWidgetManager.getAppWidgetOptions(appWidgetId)
+ .getBoolean(WIDGET_OPTION_RESTORE_COMPLETED);
}