Loading src/com/android/launcher3/SessionCommitReceiver.java +1 −1 Original line number Diff line number Diff line Loading @@ -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())); Loading src/com/android/launcher3/model/AddWorkspaceItemsTask.java +17 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<LauncherActivityInfo> activities = launcherApps .getActivityList(packageName, item.user); boolean hasActivity = activities != null && !activities.isEmpty(); Loading Loading @@ -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)); } } } Loading src/com/android/launcher3/model/ItemInstallQueue.java +10 −3 Original line number Diff line number Diff line Loading @@ -130,6 +130,7 @@ public class ItemInstallQueue { // Add the items and clear queue if (!installQueue.isEmpty()) { // add log launcher.getModel().addAndBindAddedWorkspaceItems(installQueue); } mItems.clear(); Loading Loading @@ -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, 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); Loading src/com/android/launcher3/pm/InstallSessionHelper.java +35 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) Loading @@ -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); Loading src/com/android/launcher3/util/IOUtils.java +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading
src/com/android/launcher3/SessionCommitReceiver.java +1 −1 Original line number Diff line number Diff line Loading @@ -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())); Loading
src/com/android/launcher3/model/AddWorkspaceItemsTask.java +17 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<LauncherActivityInfo> activities = launcherApps .getActivityList(packageName, item.user); boolean hasActivity = activities != null && !activities.isEmpty(); Loading Loading @@ -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)); } } } Loading
src/com/android/launcher3/model/ItemInstallQueue.java +10 −3 Original line number Diff line number Diff line Loading @@ -130,6 +130,7 @@ public class ItemInstallQueue { // Add the items and clear queue if (!installQueue.isEmpty()) { // add log launcher.getModel().addAndBindAddedWorkspaceItems(installQueue); } mItems.clear(); Loading Loading @@ -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, 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); Loading
src/com/android/launcher3/pm/InstallSessionHelper.java +35 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) Loading @@ -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); Loading
src/com/android/launcher3/util/IOUtils.java +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading