diff --git a/src/com/android/launcher3/SessionCommitReceiver.java b/src/com/android/launcher3/SessionCommitReceiver.java index 50361040f7..fe58da913a 100644 --- a/src/com/android/launcher3/SessionCommitReceiver.java +++ b/src/com/android/launcher3/SessionCommitReceiver.java @@ -71,7 +71,7 @@ public class SessionCommitReceiver extends BroadcastReceiver { return; } - Log.i(LOG, + Log.d(LOG, "Adding package name to install queue. Package name: " + info.getAppPackageName() + ", has app icon: " + (info.getAppIcon() != null) + ", has app label: " + !TextUtils.isEmpty(info.getAppLabel())); diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index fd51ba8d5b..29287d97c7 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -32,11 +32,13 @@ import com.android.launcher3.model.BgDataModel.Callbacks; 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.ItemInfoWithIcon; import com.android.launcher3.model.data.LauncherAppWidgetInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.pm.InstallSessionHelper; import com.android.launcher3.pm.PackageInstallInfo; import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.IOUtils; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.PackageManagerHelper; @@ -126,6 +128,12 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { } SessionInfo sessionInfo = packageInstaller.getActiveSessionInfo(item.user, packageName); + + if (!packageInstaller.verifySessionInfo(sessionInfo)) { + Log.d(LOG, "Item info failed session info verification: " + + workspaceInfo); + } + List activities = launcherApps .getActivityList(packageName, item.user); boolean hasActivity = activities != null && !activities.isEmpty(); @@ -171,7 +179,15 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { // Save the WorkspaceItemInfo for binding in the workspace addedItemsFinal.add(itemInfo); - Log.i(LOG, "Adding item info to workspace: " + itemInfo); + // log bitmap and label + Log.d(LOG, "Adding item info to workspace: " + itemInfo); + if (itemInfo instanceof ItemInfoWithIcon) { + ItemInfoWithIcon infoWithIcon = (ItemInfoWithIcon) itemInfo; + + Log.d(LOG, "Item info icon base 64 string: " + + infoWithIcon.bitmap.icon == null + ? "null" : IOUtils.toBase64String(infoWithIcon.bitmap.icon)); + } } } diff --git a/src/com/android/launcher3/model/ItemInstallQueue.java b/src/com/android/launcher3/model/ItemInstallQueue.java index 836d804445..22cb46b4a5 100644 --- a/src/com/android/launcher3/model/ItemInstallQueue.java +++ b/src/com/android/launcher3/model/ItemInstallQueue.java @@ -130,6 +130,7 @@ public class ItemInstallQueue { // Add the items and clear queue if (!installQueue.isEmpty()) { + // add log launcher.getModel().addAndBindAddedWorkspaceItems(installQueue); } mItems.clear(); @@ -184,14 +185,20 @@ public class ItemInstallQueue { } private void queuePendingShortcutInfo(PendingInstallShortcutInfo info) { + final Exception stackTrace = new Exception(); + // Queue the item up for adding if launcher has not loaded properly yet MODEL_EXECUTOR.post(() -> { Pair itemInfo = info.getItemInfo(mContext); if (itemInfo == null) { - Log.i(LOG, "Adding PendingInstallShortcutInfo with no attached info to queue."); + Log.d(LOG, + "Adding PendingInstallShortcutInfo with no attached info to queue.", + stackTrace); } else { - Log.i(LOG, "Adding PendingInstallShortcutInfo to queue. Attached info: " - + itemInfo.first); + Log.d(LOG, + "Adding PendingInstallShortcutInfo to queue. Attached info: " + + itemInfo.first, + stackTrace); } addToQueue(info); diff --git a/src/com/android/launcher3/pm/InstallSessionHelper.java b/src/com/android/launcher3/pm/InstallSessionHelper.java index 72f1c58905..88db4303bb 100644 --- a/src/com/android/launcher3/pm/InstallSessionHelper.java +++ b/src/com/android/launcher3/pm/InstallSessionHelper.java @@ -25,6 +25,7 @@ import android.content.pm.LauncherApps; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageManager; +import android.graphics.Bitmap; import android.os.Build; import android.os.Process; import android.os.UserHandle; @@ -40,6 +41,7 @@ import com.android.launcher3.SessionCommitReceiver; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.ItemInstallQueue; +import com.android.launcher3.util.IOUtils; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.MainThreadInitializedObject; @@ -215,14 +217,8 @@ public class InstallSessionHelper { void tryQueuePromiseAppIcon(PackageInstaller.SessionInfo sessionInfo) { if (FeatureFlags.PROMISE_APPS_NEW_INSTALLS.get() && SessionCommitReceiver.isEnabled(mAppContext) - && verify(sessionInfo) != null - && sessionInfo.getInstallReason() == PackageManager.INSTALL_REASON_USER - && sessionInfo.getAppIcon() != null - && !TextUtils.isEmpty(sessionInfo.getAppLabel()) - && !promiseIconAddedForId(sessionInfo.getSessionId()) - && !new PackageManagerHelper(mAppContext).isAppInstalled( - sessionInfo.getAppPackageName(), getUserHandle(sessionInfo))) { - Log.i(LOG, "Adding package name to install queue: " + && verifySessionInfo(sessionInfo)) { + Log.d(LOG, "Adding package name to install queue: " + sessionInfo.getAppPackageName()); ItemInstallQueue.INSTANCE.get(mAppContext) @@ -233,6 +229,37 @@ public class InstallSessionHelper { } } + public boolean verifySessionInfo(PackageInstaller.SessionInfo sessionInfo) { + boolean validSessionInfo = verify(sessionInfo) != null + && sessionInfo.getInstallReason() == PackageManager.INSTALL_REASON_USER + && sessionInfo.getAppIcon() != null + && !TextUtils.isEmpty(sessionInfo.getAppLabel()) + && !promiseIconAddedForId(sessionInfo.getSessionId()) + && !new PackageManagerHelper(mAppContext).isAppInstalled( + sessionInfo.getAppPackageName(), getUserHandle(sessionInfo)); + + if (sessionInfo != null) { + Bitmap appIcon = sessionInfo.getAppIcon(); + + Log.d(LOG, String.format( + "Verifying session info. Valid: %b, Session verified: %b, Install reason valid:" + + " %b, App icon: %s, App label: %s, Promise icon added: %b, " + + "App installed: %b.", + validSessionInfo, + verify(sessionInfo) != null, + sessionInfo.getInstallReason() == PackageManager.INSTALL_REASON_USER, + appIcon == null ? "null" : IOUtils.toBase64String(appIcon), + sessionInfo.getAppLabel(), + promiseIconAddedForId(sessionInfo.getSessionId()), + new PackageManagerHelper(mAppContext).isAppInstalled( + sessionInfo.getAppPackageName(), getUserHandle(sessionInfo)))); + } else { + Log.d(LOG, "Verifying session info failed: session info null."); + } + + return validSessionInfo; + } + public InstallSessionTracker registerInstallTracker(InstallSessionTracker.Callback callback) { InstallSessionTracker tracker = new InstallSessionTracker(this, callback); diff --git a/src/com/android/launcher3/util/IOUtils.java b/src/com/android/launcher3/util/IOUtils.java index 1cec0ecc10..d7fa9050f2 100644 --- a/src/com/android/launcher3/util/IOUtils.java +++ b/src/com/android/launcher3/util/IOUtils.java @@ -16,7 +16,9 @@ package com.android.launcher3.util; +import android.graphics.Bitmap; import android.os.FileUtils; +import android.util.Base64; import android.util.Log; import com.android.launcher3.Utilities; @@ -50,6 +52,12 @@ public class IOUtils { return out.toByteArray(); } + public static String toBase64String(Bitmap bitmap) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); + return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT); + } + public static long copy(InputStream from, OutputStream to) throws IOException { if (Utilities.ATLEAST_Q) { return FileUtils.copy(from, to);