diff options
| author | 2021-02-17 13:26:44 +0000 | |
|---|---|---|
| committer | 2021-02-17 13:26:44 +0000 | |
| commit | 44a79fa3f3b0dc7da920f29b03a4468a19a22551 (patch) | |
| tree | 44dc10c9d178b830b13a8221227b3927bf6db12a | |
| parent | ab25c0a0dd83ef6e80549fa71e739177eed32abc (diff) | |
| parent | 2cec2e96ba1766965cc44657de25caf60de8000c (diff) | |
Merge "Cache shortcuts on People Tile creation" into sc-dev
7 files changed, 105 insertions, 22 deletions
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 0c0e4020d04a..80fecc1a3195 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -167,10 +167,17 @@ public class LauncherApps { */ public static final int FLAG_CACHE_BUBBLE_SHORTCUTS = 1; + /** + * Cache shortcuts which are used in People Tile. + * @hide + */ + public static final int FLAG_CACHE_PEOPLE_TILE_SHORTCUTS = 2; + /** @hide */ @IntDef(flag = false, prefix = { "FLAG_CACHE_" }, value = { FLAG_CACHE_NOTIFICATION_SHORTCUTS, FLAG_CACHE_BUBBLE_SHORTCUTS, + FLAG_CACHE_PEOPLE_TILE_SHORTCUTS }) @Retention(RetentionPolicy.SOURCE) public @interface ShortcutCacheFlags {} @@ -1179,6 +1186,7 @@ public class LauncherApps { * <ul> * <li>{@link #FLAG_CACHE_NOTIFICATION_SHORTCUTS} * <li>{@link #FLAG_CACHE_BUBBLE_SHORTCUTS} + * <li>{@link #FLAG_CACHE_PEOPLE_TILE_SHORTCUTS} * </ul> * @throws IllegalStateException when the user is locked, or when the {@code user} user * is locked or not running. @@ -1209,6 +1217,7 @@ public class LauncherApps { * <ul> * <li>{@link #FLAG_CACHE_NOTIFICATION_SHORTCUTS} * <li>{@link #FLAG_CACHE_BUBBLE_SHORTCUTS} + * <li>{@link #FLAG_CACHE_PEOPLE_TILE_SHORTCUTS} * </ul> * @throws IllegalStateException when the user is locked, or when the {@code user} user * is locked or not running. diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index ce0547f5d0f4..5f80ba110773 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -129,6 +129,12 @@ public final class ShortcutInfo implements Parcelable { /** @hide */ public static final int FLAG_HAS_ICON_URI = 1 << 15; + /** + * TODO(b/155135057): This is a quick and temporary fix for b/155135890. ShortcutService doesn't + * need to be aware of the outside world. Replace this with a more extensible solution. + * @hide + */ + public static final int FLAG_CACHED_PEOPLE_TILE = 1 << 29; /** * TODO(b/155135057): This is a quick and temporary fix for b/155135890. ShortcutService doesn't @@ -138,7 +144,8 @@ public final class ShortcutInfo implements Parcelable { public static final int FLAG_CACHED_BUBBLES = 1 << 30; /** @hide */ - public static final int FLAG_CACHED_ALL = FLAG_CACHED_NOTIFICATIONS | FLAG_CACHED_BUBBLES; + public static final int FLAG_CACHED_ALL = + FLAG_CACHED_NOTIFICATIONS | FLAG_CACHED_BUBBLES | FLAG_CACHED_PEOPLE_TILE; /** @hide */ @IntDef(flag = true, prefix = { "FLAG_" }, value = { @@ -159,6 +166,7 @@ public final class ShortcutInfo implements Parcelable { FLAG_HAS_ICON_URI, FLAG_CACHED_NOTIFICATIONS, FLAG_CACHED_BUBBLES, + FLAG_CACHED_PEOPLE_TILE }) @Retention(RetentionPolicy.SOURCE) public @interface ShortcutFlags {} diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java index c67aef618652..2f9b17aece8e 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java @@ -19,6 +19,8 @@ package com.android.systemui.people; import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID; import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID; +import static com.android.systemui.people.PeopleSpaceUtils.getUserHandle; + import android.app.Activity; import android.app.INotificationManager; import android.app.people.IPeopleManager; @@ -39,6 +41,7 @@ import com.android.internal.logging.UiEventLoggerImpl; import com.android.systemui.R; import com.android.systemui.statusbar.notification.NotificationEntryManager; +import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -49,6 +52,7 @@ import javax.inject.Inject; public class PeopleSpaceActivity extends Activity { private static final String TAG = "PeopleSpaceActivity"; + private static final boolean DEBUG = PeopleSpaceUtils.DEBUG; private ViewGroup mPeopleSpaceLayout; private IPeopleManager mPeopleManager; @@ -134,9 +138,11 @@ public class PeopleSpaceActivity extends Activity { /** Stores the user selected configuration for {@code mAppWidgetId}. */ private void storeWidgetConfiguration(PeopleSpaceTile tile) { if (PeopleSpaceUtils.DEBUG) { - Log.d(TAG, "Put " + tile.getUserName() + "'s shortcut ID: " - + tile.getId() + " for widget ID: " - + mAppWidgetId); + if (DEBUG) { + Log.d(TAG, "Put " + tile.getUserName() + "'s shortcut ID: " + + tile.getId() + " for widget ID: " + + mAppWidgetId); + } } PeopleSpaceUtils.setStorageForTile(mContext, tile, mAppWidgetId); @@ -144,12 +150,22 @@ public class PeopleSpaceActivity extends Activity { // TODO: Populate new widget with existing conversation notification, if there is any. PeopleSpaceUtils.updateSingleConversationWidgets(mContext, widgetIds, mAppWidgetManager, mPeopleManager); + if (mLauncherApps != null) { + try { + if (DEBUG) Log.d(TAG, "Caching shortcut for PeopleTile: " + tile.getId()); + mLauncherApps.cacheShortcuts(tile.getPackageName(), + Collections.singletonList(tile.getId()), + getUserHandle(tile), LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS); + } catch (Exception e) { + Log.w(TAG, "Exception caching shortcut:" + e); + } + } finishActivity(); } /** Finish activity with a successful widget configuration result. */ private void finishActivity() { - if (PeopleSpaceUtils.DEBUG) Log.d(TAG, "Widget added!"); + if (DEBUG) Log.d(TAG, "Widget added!"); mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_ADDED); setActivityResult(RESULT_OK); finish(); diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java index 7eb1fc175c5a..cbcbd3b892a5 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java @@ -287,7 +287,7 @@ public class PeopleSpaceUtils { SharedPreferences.Editor widgetEditor = widgetSp.edit(); widgetEditor.putString(PeopleSpaceUtils.PACKAGE_NAME, tile.getPackageName()); widgetEditor.putString(PeopleSpaceUtils.SHORTCUT_ID, tile.getId()); - int userId = UserHandle.getUserHandleForUid(tile.getUid()).getIdentifier(); + int userId = getUserId(tile); widgetEditor.putInt(PeopleSpaceUtils.USER_ID, userId); widgetEditor.apply(); SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); @@ -634,7 +634,7 @@ public class PeopleSpaceUtils { private static Long getLastInteraction(IPeopleManager peopleManager, PeopleSpaceTile tile) { try { - int userId = UserHandle.getUserHandleForUid(tile.getUid()).getIdentifier(); + int userId = getUserId(tile); String pkg = tile.getPackageName(); return peopleManager.getLastInteraction(pkg, userId, tile.getId()); } catch (Exception e) { @@ -883,4 +883,14 @@ public class PeopleSpaceUtils { public static String getKey(String shortcutId, String packageName, int userId) { return shortcutId + "/" + userId + "/" + packageName; } + + /** Returns the userId associated with a {@link PeopleSpaceTile} */ + public static int getUserId(PeopleSpaceTile tile) { + return getUserHandle(tile).getIdentifier(); + } + + /** Returns the {@link UserHandle} associated with a {@link PeopleSpaceTile} */ + public static UserHandle getUserHandle(PeopleSpaceTile tile) { + return UserHandle.getUserHandleForUid(tile.getUid()); + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java index f5577d30c75c..3d1055fdece2 100644 --- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java +++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java @@ -16,13 +16,20 @@ package com.android.systemui.people.widget; +import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME; +import static com.android.systemui.people.PeopleSpaceUtils.SHORTCUT_ID; +import static com.android.systemui.people.PeopleSpaceUtils.USER_ID; + import android.app.PendingIntent; import android.app.people.IPeopleManager; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.LauncherApps; import android.os.ServiceManager; +import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import android.widget.RemoteViews; @@ -32,6 +39,8 @@ import com.android.internal.logging.UiEventLoggerImpl; import com.android.systemui.R; import com.android.systemui.people.PeopleSpaceUtils; +import java.util.Collections; + /** People Space Widget Provider class. */ public class PeopleSpaceWidgetProvider extends AppWidgetProvider { private static final String TAG = "PeopleSpaceWidgetPvd"; @@ -88,11 +97,31 @@ public class PeopleSpaceWidgetProvider extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); + LauncherApps launcherApps = context.getSystemService(LauncherApps.class); + for (int widgetId : appWidgetIds) { if (DEBUG) Log.d(TAG, "Widget removed"); mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_DELETED); + if (launcherApps != null) { + SharedPreferences widgetSp = context.getSharedPreferences(String.valueOf(widgetId), + Context.MODE_PRIVATE); + String packageName = widgetSp.getString(PACKAGE_NAME, null); + String shortcutId = widgetSp.getString(SHORTCUT_ID, null); + int userId = widgetSp.getInt(USER_ID, -1); + + if (packageName != null && shortcutId != null && userId != -1) { + try { + if (DEBUG) Log.d(TAG, "Uncaching shortcut for PeopleTile: " + shortcutId); + launcherApps.uncacheShortcuts(packageName, + Collections.singletonList(shortcutId), + UserHandle.of(userId), + LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS); + } catch (Exception e) { + Log.d(TAG, "Exception uncaching shortcut:" + e); + } + } + } PeopleSpaceUtils.removeStorageForTile(context, widgetId); } } - } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index b06e84d9df4e..d3a56c6f67c0 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -22,6 +22,7 @@ import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.content.pm.LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS; import static android.content.pm.LauncherApps.FLAG_CACHE_NOTIFICATION_SHORTCUTS; +import static android.content.pm.LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1170,6 +1171,8 @@ public class LauncherAppsService extends SystemService { ret = ShortcutInfo.FLAG_CACHED_NOTIFICATIONS; } else if (cacheFlags == FLAG_CACHE_BUBBLE_SHORTCUTS) { ret = ShortcutInfo.FLAG_CACHED_BUBBLES; + } else if (cacheFlags == FLAG_CACHE_PEOPLE_TILE_SHORTCUTS) { + ret = ShortcutInfo.FLAG_CACHED_PEOPLE_TILE; } Preconditions.checkArgumentPositive(ret, "Invalid cache owner"); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 23fcf701a8bb..4d0beef99cca 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -103,7 +103,6 @@ import android.util.TypedXmlSerializer; import android.util.Xml; import com.android.frameworks.servicestests.R; -import com.android.internal.util.FastXmlSerializer; import com.android.server.pm.ShortcutService.ConfigConstants; import com.android.server.pm.ShortcutService.FileOutputStreamWithPath; import com.android.server.pm.ShortcutUser.PackageWithUser; @@ -111,7 +110,6 @@ import com.android.server.pm.ShortcutUser.PackageWithUser; import org.mockito.ArgumentCaptor; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -141,6 +139,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { private static final int CACHE_OWNER_0 = LauncherApps.FLAG_CACHE_NOTIFICATION_SHORTCUTS; private static final int CACHE_OWNER_1 = LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS; + private static final int CACHE_OWNER_2 = LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS; @Override protected void tearDown() throws Exception { @@ -1531,7 +1530,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"), makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"), - makeLongLivedShortcut("s4")))); + makeLongLivedShortcut("s4"), makeLongLivedShortcut("s5"), + makeLongLivedShortcut("s6")))); }); // Pin s2 @@ -1545,28 +1545,30 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mInjectCheckAccessShortcutsPermission = true; mLauncherApps.cacheShortcuts(CALLING_PACKAGE_1, list("s1", "s2"), HANDLE_USER_0, CACHE_OWNER_0); - mLauncherApps.cacheShortcuts(CALLING_PACKAGE_1, list("s2", "s4"), + mLauncherApps.cacheShortcuts(CALLING_PACKAGE_1, list("s2", "s4", "s5"), HANDLE_USER_0, CACHE_OWNER_1); + mLauncherApps.cacheShortcuts(CALLING_PACKAGE_1, list("s5", "s6"), + HANDLE_USER_0, CACHE_OWNER_2); }); setCaller(CALLING_PACKAGE_1); // Get dynamic shortcuts assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_DYNAMIC), - "s1", "s2", "s3", "s4"); + "s1", "s2", "s3", "s4", "s5", "s6"); // Get pinned shortcuts assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_PINNED), "s2"); // Get cached shortcuts assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), - "s2", "s4"); + "s2", "s4", "s5", "s6"); // Remove a dynamic cached shortcut - mManager.removeDynamicShortcuts(list("s4")); + mManager.removeDynamicShortcuts(list("s4", "s5")); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_DYNAMIC), - "s1", "s2", "s3"); + "s1", "s2", "s3", "s6"); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), - "s2", "s4"); + "s2", "s4", "s5", "s6"); runWithCaller(LAUNCHER_1, USER_0, () -> { mLauncherApps.uncacheShortcuts(CALLING_PACKAGE_1, list("s2", "s4"), @@ -1574,15 +1576,21 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); // s2 still cached by owner1. s4 wasn't cached by owner0 so didn't get removed. assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), - "s2", "s4"); + "s2", "s4", "s5", "s6"); // uncache a non-dynamic shortcut. Should be removed. runWithCaller(LAUNCHER_1, USER_0, () -> { mLauncherApps.uncacheShortcuts(CALLING_PACKAGE_1, list("s4"), HANDLE_USER_0, CACHE_OWNER_1); }); + + // uncache s6 by its only owner. s5 still cached by owner1 + runWithCaller(LAUNCHER_1, USER_0, () -> { + mLauncherApps.uncacheShortcuts(CALLING_PACKAGE_1, list("s5", "s6"), + HANDLE_USER_0, CACHE_OWNER_2); + }); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), - "s2"); + "s2", "s5"); // Cache another shortcut runWithCaller(LAUNCHER_1, USER_0, () -> { @@ -1590,14 +1598,14 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { HANDLE_USER_0, CACHE_OWNER_0); }); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), - "s2", "s3"); + "s2", "s3", "s5"); // Remove a dynamic cached pinned long lived shortcut mManager.removeLongLivedShortcuts(list("s2")); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_DYNAMIC), - "s1", "s3"); + "s1", "s3", "s6"); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), - "s3"); + "s3", "s5"); assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_PINNED), "s2"); } |