From 7c76a33243a725918bb26a9bdae7e6ee1bd61962 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 17 Oct 2019 11:09:26 -0700 Subject: 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 --- .../android/launcher3/InstallShortcutReceiver.java | 17 +++++++------ src/com/android/launcher3/LauncherModel.java | 4 +-- .../launcher3/compat/LauncherAppsCompat.java | 6 +++++ .../launcher3/compat/LauncherAppsCompatVL.java | 14 +++++++++++ .../launcher3/compat/LauncherAppsCompatVQ.java | 14 ++++++++++- .../launcher3/compat/PackageInstallerCompatVL.java | 13 +++++----- .../launcher3/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 17fbb791c..f6ed70ed0 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 c0cf13544..a012412c5 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 cdb5c4d2b..39f69498b 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 1885d8f03..281274ce0 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 0a1811e34..48805afa0 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 9c57e8ab5..409b21ddc 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 dfd5a708b..1b98783a7 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 -- cgit v1.2.3