Add logging for adding pending icons to the workspace.

Added more logging to help track down b/168788486

Bug: 168788486

Test: manual
Change-Id: I309ad3abbedaeb538c97dd4929bedf6407fdfcf1
diff --git a/src/com/android/launcher3/SessionCommitReceiver.java b/src/com/android/launcher3/SessionCommitReceiver.java
index 5036104..fe58da9 100644
--- a/src/com/android/launcher3/SessionCommitReceiver.java
+++ b/src/com/android/launcher3/SessionCommitReceiver.java
@@ -71,7 +71,7 @@
             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 fd51ba8..29287d9 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.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 @@
                     }
                     SessionInfo sessionInfo = packageInstaller.getActiveSessionInfo(item.user,
                             packageName);
+
+                    if (!packageInstaller.verifySessionInfo(sessionInfo)) {
+                        Log.d(LOG, "Item info failed session info verification: "
+                                + workspaceInfo);
+                    }
+
                     List<LauncherActivityInfo> activities = launcherApps
                             .getActivityList(packageName, item.user);
                     boolean hasActivity = activities != null && !activities.isEmpty();
@@ -171,7 +179,15 @@
                 // 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 836d804..22cb46b 100644
--- a/src/com/android/launcher3/model/ItemInstallQueue.java
+++ b/src/com/android/launcher3/model/ItemInstallQueue.java
@@ -130,6 +130,7 @@
 
         // Add the items and clear queue
         if (!installQueue.isEmpty()) {
+            // add log
             launcher.getModel().addAndBindAddedWorkspaceItems(installQueue);
         }
         mItems.clear();
@@ -184,14 +185,20 @@
     }
 
     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, Object> 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 72f1c58..88db430 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.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.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 @@
     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 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 1cec0ec..d7fa905 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 @@
         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);