App Pairs (behind flag): Add new ItemInfo types and DB save functionality
This is the second of several patches implementing the App Pairs feature behind a flag.
This patch includes:
- AppPairsController, a new controller that will handle creation, launching, and deletion of app pairs
- ITEM_TYPE_APP_PAIR is a new type of FolderInfo (FolderInfo now can be either a folder or an app pair, and should probably be renamed to CollectionInfo or something more generic in future)
- Necessary plumbing for these new types
- Database code that handles saving a new app pair to the database with the correct schema
Flag: ENABLE_APP_PAIRS (set to false)
Bug: 274189428
Test: Not included in this CL, but will follow
Change-Id: Ie3aefd4eb9171f471789f54876de742849d3013b
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 4f7380a..0e155a2 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -63,6 +63,8 @@
import static com.android.launcher3.popup.SystemShortcut.WIDGETS;
import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK;
import static com.android.launcher3.states.RotationHelper.REQUEST_NONE;
+import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
+import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import static com.android.launcher3.util.ItemInfoMatcher.forFolderMatch;
import android.animation.Animator;
@@ -2475,6 +2477,12 @@
(FolderInfo) item);
break;
}
+ case LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR: {
+ FolderInfo info = (FolderInfo) item;
+ // TODO (jeremysim b/274189428): Create app pair icon
+ view = null;
+ break;
+ }
case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: {
view = inflateAppWidget((LauncherAppWidgetInfo) item);
diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java
index 1cd2a30..ad03221 100644
--- a/src/com/android/launcher3/LauncherSettings.java
+++ b/src/com/android/launcher3/LauncherSettings.java
@@ -112,6 +112,10 @@
*/
public static final int ITEM_TYPE_DEEP_SHORTCUT = 6;
+ /**
+ * The favorite is an app pair for launching split screen
+ */
+ public static final int ITEM_TYPE_APP_PAIR = 10;
// *** Below enum values are used for metrics purpose but not used in Favorites DB ***
@@ -256,6 +260,7 @@
case ITEM_TYPE_DEEP_SHORTCUT: return "DEEPSHORTCUT";
case ITEM_TYPE_TASK: return "TASK";
case ITEM_TYPE_QSB: return "QSB";
+ case ITEM_TYPE_APP_PAIR: return "APP_PAIR";
default: return String.valueOf(type);
}
}
diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
index 27119ae..a7a25f4 100644
--- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
+++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
@@ -408,6 +408,14 @@
LauncherSettings.Favorites.CONTAINER_DESKTOP,
screenId, coordinates[0], coordinates[1]);
mContext.bindItems(Collections.singletonList(info), true, accessibility);
+ } else if (item instanceof FolderInfo fi) {
+ mContext.getModelWriter().addItemToDatabase(fi,
+ LauncherSettings.Favorites.CONTAINER_DESKTOP, screenId, coordinates[0],
+ coordinates[1]);
+ fi.contents.forEach(member -> {
+ mContext.getModelWriter().addItemToDatabase(member, fi.id, -1, -1, -1);
+ });
+ mContext.bindItems(Collections.singletonList(fi), true, accessibility);
}
}));
return true;
diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java
index b0f6e13..0e3b06c 100644
--- a/src/com/android/launcher3/model/BgDataModel.java
+++ b/src/com/android/launcher3/model/BgDataModel.java
@@ -190,14 +190,15 @@
for (ItemInfo item : items) {
switch (item.itemType) {
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
+ case LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR:
folders.remove(item.id);
if (FeatureFlags.IS_STUDIO_BUILD) {
for (ItemInfo info : itemsIdMap) {
if (info.container == item.id) {
// We are deleting a folder which still contains items that
// think they are contained by that folder.
- String msg = "deleting a folder (" + item + ") which still " +
- "contains items (" + info + ")";
+ String msg = "deleting a collection (" + item + ") which still "
+ + "contains items (" + info + ")";
Log.e(TAG, msg);
}
}
@@ -238,6 +239,7 @@
itemsIdMap.put(item.id, item);
switch (item.itemType) {
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
+ case LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR:
folders.put(item.id, (FolderInfo) item);
workspaceItems.add(item);
break;
@@ -250,15 +252,14 @@
} else {
if (newItem) {
if (!folders.containsKey(item.container)) {
- // Adding an item to a folder that doesn't exist.
- String msg = "adding item: " + item + " to a folder that " +
- " doesn't exist";
+ // Adding an item to a nonexistent collection.
+ String msg = "attempted to add item: " + item + " to a nonexistent app"
+ + " collection";
Log.e(TAG, msg);
}
} else {
findOrMakeFolder(item.container).add((WorkspaceItemInfo) item, false);
}
-
}
break;
case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
diff --git a/src/com/android/launcher3/model/data/FolderInfo.java b/src/com/android/launcher3/model/data/FolderInfo.java
index 524b769..e5a0eb1 100644
--- a/src/com/android/launcher3/model/data/FolderInfo.java
+++ b/src/com/android/launcher3/model/data/FolderInfo.java
@@ -114,6 +114,17 @@
}
/**
+ * Create an app pair, a type of app collection that launches multiple apps into split screen
+ */
+ public static FolderInfo createAppPair(WorkspaceItemInfo app1, WorkspaceItemInfo app2) {
+ FolderInfo newAppPair = new FolderInfo();
+ newAppPair.itemType = LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR;
+ newAppPair.contents.add(app1);
+ newAppPair.contents.add(app2);
+ return newAppPair;
+ }
+
+ /**
* Add an app or shortcut
*
* @param item
diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java
index 41a603d..bfb80b3 100644
--- a/src/com/android/launcher3/model/data/ItemInfo.java
+++ b/src/com/android/launcher3/model/data/ItemInfo.java
@@ -90,6 +90,7 @@
* {@link Favorites#ITEM_TYPE_SHORTCUT},
* {@link Favorites#ITEM_TYPE_DEEP_SHORTCUT}
* {@link Favorites#ITEM_TYPE_FOLDER},
+ * {@link Favorites#ITEM_TYPE_APP_PAIR},
* {@link Favorites#ITEM_TYPE_APPWIDGET} or
* {@link Favorites#ITEM_TYPE_CUSTOM_APPWIDGET}.
*/