From 1b4d5034fbf56b227ec9697d0d43b3e3d085670d Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Wed, 3 Feb 2021 13:05:21 -0800 Subject: [PATCH] Fix icon flicker on transition from installing, to installed, to downloading incrementally. When an app finished downloading, we assumed that its progress level was 100%. This caused flicker in apps that supported incremental downloads. Added a check for the total download progress on app installation. demo: https://drive.google.com/file/d/11NwwhHj_4rmDFwpsb8gTX-uA5YSinjSj/view?usp=sharing Fixes: 178745816 Test: manual Change-Id: I08328296db2ce2c2242fc4fe87158ff4b911c659 --- .../android/launcher3/model/AllAppsList.java | 16 ++++++++++++---- .../launcher3/model/PackageUpdatedTask.java | 18 +++++++++++++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/model/AllAppsList.java b/src/com/android/launcher3/model/AllAppsList.java index d4fa2789d5..e3e4b6911f 100644 --- a/src/com/android/launcher3/model/AllAppsList.java +++ b/src/com/android/launcher3/model/AllAppsList.java @@ -203,11 +203,16 @@ public class AllAppsList { /** * Add the icons for the supplied apk called packageName. */ - public void addPackage(Context context, String packageName, UserHandle user) { - for (LauncherActivityInfo info : context.getSystemService(LauncherApps.class) - .getActivityList(packageName, user)) { + public List addPackage( + Context context, String packageName, UserHandle user) { + List activities = context.getSystemService(LauncherApps.class) + .getActivityList(packageName, user); + + for (LauncherActivityInfo info : activities) { add(new AppInfo(context, info, user), info); } + + return activities; } /** @@ -250,7 +255,8 @@ public class AllAppsList { /** * Add and remove icons for this package which has been updated. */ - public void updatePackage(Context context, String packageName, UserHandle user) { + public List updatePackage( + Context context, String packageName, UserHandle user) { final List matches = context.getSystemService(LauncherApps.class) .getActivityList(packageName, user); if (matches.size() > 0) { @@ -297,6 +303,8 @@ public class AllAppsList { } } } + + return matches; } /** diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 3275d59488..f13a109926 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -22,6 +22,7 @@ import static com.android.launcher3.model.data.WorkspaceItemInfo.FLAG_RESTORED_I import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.os.UserHandle; @@ -51,6 +52,7 @@ import com.android.launcher3.util.SafeCloseable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -95,6 +97,7 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { ? ItemInfoMatcher.ofUser(mUser) // We want to update all packages for this user : ItemInfoMatcher.ofPackages(packageSet, mUser); final HashSet removedComponents = new HashSet<>(); + final HashMap> activitiesLists = new HashMap<>(); switch (mOp) { case OP_ADD: { @@ -104,7 +107,8 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { if (FeatureFlags.PROMISE_APPS_IN_ALL_APPS.get()) { appsList.removePackage(packages[i], mUser); } - appsList.addPackage(context, packages[i], mUser); + activitiesLists.put( + packages[i], appsList.addPackage(context, packages[i], mUser)); } flagOp = FlagOp.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE); break; @@ -115,7 +119,8 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { for (int i = 0; i < N; i++) { if (DEBUG) Log.d(TAG, "mAllAppsList.updatePackage " + packages[i]); iconCache.updateIconsForPkg(packages[i], mUser); - appsList.updatePackage(context, packages[i], mUser); + activitiesLists.put( + packages[i], appsList.updatePackage(context, packages[i], mUser)); app.getWidgetCache().removePackage(packages[i], mUser); } } @@ -247,7 +252,14 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { if (isNewApkAvailable && si.itemType == Favorites.ITEM_TYPE_APPLICATION) { - si.setProgressLevel(100, PackageInstallInfo.STATUS_INSTALLED); + List activities = activitiesLists.get( + packageName); + si.setProgressLevel( + activities == null || activities.isEmpty() + ? 100 + : PackageManagerHelper.getLoadingProgress( + activities.get(0)), + PackageInstallInfo.STATUS_INSTALLED_DOWNLOADING); iconCache.getTitleAndIcon(si, si.usingLowResIcon()); infoUpdated = true; }