Adding support for async view inflation
Bug: 318539160
Test: atest AsyncBindingTest; atest ItemInflaterTest
Flag: aconfig enable_workspace_inflation DEVELOPMENT
Change-Id: I77a373db7a5805f68f4b8cbfa9b586b5674252de
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index edfef5e..1ab6222 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -28,6 +28,7 @@
import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType;
import static com.android.launcher3.Flags.enableAddAppWidgetViaConfigActivityV2;
+import static com.android.launcher3.Flags.enableWorkspaceInflation;
import static com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY;
import static com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WIDGET_TRANSITION;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
@@ -1485,8 +1486,8 @@
CellPos presenterPos = getCellPosMapper().mapModelToPresenter(itemInfo);
if (showPendingWidget) {
launcherInfo.restoreStatus = LauncherAppWidgetInfo.FLAG_UI_NOT_READY;
- PendingAppWidgetHostView pendingAppWidgetHostView =
- new PendingAppWidgetHostView(this, launcherInfo, appWidgetInfo);
+ PendingAppWidgetHostView pendingAppWidgetHostView = new PendingAppWidgetHostView(
+ this, mAppWidgetHolder, launcherInfo, appWidgetInfo);
pendingAppWidgetHostView.setPreviewBitmap(widgetPreviewBitmap);
hostView = pendingAppWidgetHostView;
} else if (hostView instanceof PendingAppWidgetHostView) {
@@ -2187,17 +2188,23 @@
*/
@Override
public void bindItems(final List<ItemInfo> items, final boolean forceAnimateIcons) {
- bindItems(items.stream().map(i -> Pair.create(
+ bindInflatedItems(items.stream().map(i -> Pair.create(
i, getItemInflater().inflateItem(i, getModelWriter()))).toList(),
forceAnimateIcons ? new AnimatorSet() : null);
}
+ @Override
+ public void bindInflatedItems(List<Pair<ItemInfo, View>> items) {
+ bindInflatedItems(items, null);
+ }
+
/**
* Bind all the items in the map, ignoring any null views
*
* @param boundAnim if non-null, uses it to create and play the bounce animation for added views
*/
- public void bindItems(List<Pair<ItemInfo, View>> shortcuts, @Nullable AnimatorSet boundAnim) {
+ public void bindInflatedItems(
+ List<Pair<ItemInfo, View>> shortcuts, @Nullable AnimatorSet boundAnim) {
// Get the list of added items and intersect them with the set of items here
Workspace<?> workspace = mWorkspace;
int newItemsScreenId = -1;
@@ -2222,10 +2229,13 @@
}
}
- final View view = e.second;
+ View view = e.second;
if (view == null) {
continue;
}
+ if (enableWorkspaceInflation() && view instanceof LauncherAppWidgetHostView lv) {
+ view = getAppWidgetHolder().attachViewToHostAndGetAttachedView(lv);
+ }
workspace.addInScreenFromBind(view, item);
if (boundAnim != null) {
// Animate all the applications up now
@@ -2324,9 +2334,9 @@
@Override
public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks,
- int workspaceItemCount, boolean isBindSync) {
- mModelCallbacks.onInitialBindComplete(boundPages, pendingTasks, workspaceItemCount,
- isBindSync);
+ RunnableList onCompleteSignal, int workspaceItemCount, boolean isBindSync) {
+ mModelCallbacks.onInitialBindComplete(boundPages, pendingTasks, onCompleteSignal,
+ workspaceItemCount, isBindSync);
}
/**
@@ -3057,6 +3067,7 @@
return super.getStatsLogManager().withDefaultInstanceId(mAllAppsSessionLogId);
}
+ @Override
public ItemInflater<Launcher> getItemInflater() {
return mItemInflater;
}