From 7c76a33243a725918bb26a9bdae7e6ee1bd61962 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 17 Oct 2019 11:09:26 -0700 Subject: [PATCH] Add support for work profile promise icons. - We were not getting callbacks for sessions created under work profile. - We did not pass in the user when creating the workspace item infos. - Added check for if app is installed before adding item to workspace to prevent any stale promise icons. This seems to happen when uninstalling and then immediately reinstalling an application. Bug: 141556707 Change-Id: Ie0320f3ede70b6c7543cb60c3b95a2fe398eecb5 Merged-In: I2db2d8da449c37eb248a59fbc9e7b517f50855c1 --- .../launcher3/InstallShortcutReceiver.java | 17 ++++++----- src/com/android/launcher3/LauncherModel.java | 4 +-- .../launcher3/compat/LauncherAppsCompat.java | 6 ++++ .../compat/LauncherAppsCompatVL.java | 14 +++++++++ .../compat/LauncherAppsCompatVQ.java | 14 ++++++++- .../compat/PackageInstallerCompatVL.java | 13 +++++---- .../model/AddWorkspaceItemsTask.java | 29 +++++++++++-------- 7 files changed, 68 insertions(+), 29 deletions(-) diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index 17fbb791c2..f6ed70ed0d 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -133,7 +133,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { String pkg = getIntentPackage(info.launchIntent); if (!TextUtils.isEmpty(pkg) - && !launcherApps.isPackageEnabledForProfile(pkg, info.user)) { + && !launcherApps.isPackageEnabledForProfile(pkg, info.user) + && !info.isActivity) { if (DBG) { Log.d(TAG, "Ignoring shortcut for absent package: " + info.launchIntent); } @@ -454,6 +455,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { .object() .key(LAUNCH_INTENT_KEY).value(launchIntent.toUri(0)) .key(NAME_KEY).value(name) + .key(USER_HANDLE_KEY).value( + UserManagerCompat.getInstance(mContext).getSerialNumberForUser(user)) .key(APP_SHORTCUT_TYPE_KEY).value(isActivity); if (icon != null) { byte[] iconByteArray = GraphicsUtils.flattenBitmap(icon); @@ -475,7 +478,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public Pair getItemInfo() { if (isActivity) { - WorkspaceItemInfo si = createWorkspaceItemInfo(data, + WorkspaceItemInfo si = createWorkspaceItemInfo(data, user, LauncherAppState.getInstance(mContext)); si.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; si.status |= WorkspaceItemInfo.FLAG_AUTOINSTALL_ICON; @@ -500,7 +503,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return Pair.create(widgetInfo, providerInfo); } else { WorkspaceItemInfo itemInfo = - createWorkspaceItemInfo(data, LauncherAppState.getInstance(mContext)); + createWorkspaceItemInfo(data, user, LauncherAppState.getInstance(mContext)); return Pair.create(itemInfo, null); } } @@ -618,7 +621,8 @@ public class InstallShortcutReceiver extends BroadcastReceiver { return new PendingInstallShortcutInfo(info, original.mContext); } - private static WorkspaceItemInfo createWorkspaceItemInfo(Intent data, LauncherAppState app) { + private static WorkspaceItemInfo createWorkspaceItemInfo(Intent data, UserHandle user, + LauncherAppState app) { if (data == null) { Log.e(TAG, "Can't construct WorkspaceItemInfo with null data"); return null; @@ -635,10 +639,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } final WorkspaceItemInfo info = new WorkspaceItemInfo(); - - // Only support intents for current user for now. Intents sent from other - // users wouldn't get here without intent forwarding anyway. - info.user = Process.myUserHandle(); + info.user = user; BitmapInfo iconInfo = null; LauncherIcons li = LauncherIcons.obtain(app.getContext()); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c0cf135441..a012412c53 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -134,11 +134,11 @@ public class LauncherModel extends BroadcastReceiver /** * Updates the icons and label of all pending icons for the provided package name. */ - public void updateSessionDisplayInfo(final String packageName) { + public void updateSessionDisplayInfo(final String packageName, final UserHandle user) { HashSet packages = new HashSet<>(); packages.add(packageName); enqueueModelUpdateTask(new CacheDataUpdatedTask( - CacheDataUpdatedTask.OP_SESSION_UPDATE, Process.myUserHandle(), packages)); + CacheDataUpdatedTask.OP_SESSION_UPDATE, user, packages)); } /** diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index cdb5c4d2b7..39f69498bd 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.ShortcutInfo; import android.graphics.Rect; import android.os.Bundle; @@ -30,6 +31,7 @@ import android.os.UserHandle; import androidx.annotation.Nullable; import com.android.launcher3.Utilities; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; import java.util.List; @@ -90,4 +92,8 @@ public abstract class LauncherAppsCompat { @Nullable PackageUserKey packageUser); public abstract List getAllPackageInstallerSessions(); + + public abstract void registerSessionCallback(LooperExecutor executor, + SessionCallback sessionCallback); + public abstract void unregisterSessionCallback(SessionCallback sessionCallback); } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index 1885d8f03d..281274ce00 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -23,6 +23,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionCallback; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; @@ -35,6 +36,7 @@ import android.util.Log; import com.android.launcher3.compat.ShortcutConfigActivityInfo.ShortcutConfigActivityInfoVL; import com.android.launcher3.testing.TestProtocol; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; @@ -212,5 +214,17 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat { public List getAllPackageInstallerSessions() { return mContext.getPackageManager().getPackageInstaller().getAllSessions(); } + + @Override + public void registerSessionCallback(LooperExecutor executor, SessionCallback sessionCallback) { + mContext.getPackageManager().getPackageInstaller().registerSessionCallback(sessionCallback, + executor.getHandler()); + } + + @Override + public void unregisterSessionCallback(SessionCallback sessionCallback) { + mContext.getPackageManager().getPackageInstaller() + .unregisterSessionCallback(sessionCallback); + } } diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java b/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java index 0a1811e341..48805afa0e 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVQ.java @@ -18,8 +18,10 @@ package com.android.launcher3.compat; import android.annotation.TargetApi; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionCallback; + +import com.android.launcher3.util.LooperExecutor; import java.util.List; @@ -33,4 +35,14 @@ public class LauncherAppsCompatVQ extends LauncherAppsCompatVO { public List getAllPackageInstallerSessions() { return mLauncherApps.getAllPackageInstallerSessions(); } + + @Override + public void registerSessionCallback(LooperExecutor executor, SessionCallback sessionCallback) { + mLauncherApps.registerPackageInstallerSessionCallback(executor, sessionCallback); + } + + @Override + public void unregisterSessionCallback(SessionCallback sessionCallback) { + mLauncherApps.unregisterPackageInstallerSessionCallback(sessionCallback); + } } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 9c57e8ab51..409b21ddce 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -28,7 +28,6 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.SparseArray; -import com.android.launcher3.LauncherModel; import com.android.launcher3.SessionCommitReceiver; import com.android.launcher3.Utilities; import com.android.launcher3.icons.IconCache; @@ -63,8 +62,8 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { mAppContext = context.getApplicationContext(); mInstaller = context.getPackageManager().getPackageInstaller(); mCache = LauncherAppState.getInstance(context).getIconCache(); - mInstaller.registerSessionCallback(mCallback, MODEL_EXECUTOR.getHandler()); mLauncherApps = LauncherAppsCompat.getInstance(context); + mLauncherApps.registerSessionCallback(MODEL_EXECUTOR, mCallback); mPromiseIconIds = IntSet.wrap(IntArray.fromConcatString( getPrefs(context).getString(PROMISE_ICON_IDS, ""))); @@ -126,7 +125,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Override public void onStop() { - mInstaller.unregisterSessionCallback(mCallback); + mLauncherApps.unregisterSessionCallback(mCallback); } @Thunk void sendUpdate(PackageInstallInfo info) { @@ -222,12 +221,14 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { private SessionInfo pushSessionDisplayToLauncher(int sessionId) { SessionInfo session = verify(mInstaller.getSessionInfo(sessionId)); if (session != null && session.getAppPackageName() != null) { + UserHandle user = getUserHandle(session); mActiveSessions.put(session.getSessionId(), - new PackageUserKey(session.getAppPackageName(), getUserHandle(session))); - addSessionInfoToCache(session, getUserHandle(session)); + new PackageUserKey(session.getAppPackageName(), user)); + addSessionInfoToCache(session, user); LauncherAppState app = LauncherAppState.getInstanceNoCreate(); if (app != null) { - app.getModel().updateSessionDisplayInfo(session.getAppPackageName()); + app.getModel().updateSessionDisplayInfo(session.getAppPackageName(), + user); } return session; } diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index dfd5a708bf..1b98783a74 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -117,25 +117,30 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { } SessionInfo sessionInfo = packageInstaller.getActiveSessionInfo(item.user, packageName); + List activities = launcherApps + .getActivityList(packageName, item.user); + boolean hasActivity = activities != null && !activities.isEmpty(); + if (sessionInfo == null) { - List activities = launcherApps - .getActivityList(packageName, item.user); - if (activities != null && !activities.isEmpty()) { - // App was installed while launcher was in the background. - itemInfo = new AppInfo(app.getContext(), activities.get(0), item.user) - .makeWorkspaceItem(); - WorkspaceItemInfo wii = (WorkspaceItemInfo) itemInfo; - wii.title = ""; - wii.applyFrom(app.getIconCache().getDefaultIcon(item.user)); - app.getIconCache().getTitleAndIcon(wii, - ((WorkspaceItemInfo) itemInfo).usingLowResIcon()); - } else { + if (!hasActivity) { // Session was cancelled, do not add. continue; } } else { workspaceInfo.setInstallProgress((int) sessionInfo.getProgress()); } + + if (hasActivity) { + // App was installed while launcher was in the background, + // or app was already installed for another user. + itemInfo = new AppInfo(app.getContext(), activities.get(0), item.user) + .makeWorkspaceItem(); + WorkspaceItemInfo wii = (WorkspaceItemInfo) itemInfo; + wii.title = ""; + wii.applyFrom(app.getIconCache().getDefaultIcon(item.user)); + app.getIconCache().getTitleAndIcon(wii, + ((WorkspaceItemInfo) itemInfo).usingLowResIcon()); + } } // Add the shortcut to the db