summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt81
-rw-r--r--api/system-current.txt81
-rw-r--r--api/test-current.txt82
-rw-r--r--core/java/android/content/Context.java2
-rw-r--r--core/java/android/content/pm/LauncherApps.java18
-rw-r--r--core/java/android/content/pm/ShortcutInfo.java2
-rw-r--r--core/java/android/content/pm/ShortcutManager.java2
-rw-r--r--services/core/java/com/android/server/pm/LauncherAppsService.java3
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java16
-rw-r--r--services/tests/servicestests/Android.mk3
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java6092
-rw-r--r--services/tests/shortcutmanagerutils/Android.mk31
-rw-r--r--services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java516
13 files changed, 43 insertions, 6886 deletions
diff --git a/api/current.txt b/api/current.txt
index adbc76a2bf91..37e640d748b1 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -8185,7 +8185,6 @@ package android.content {
field public static final java.lang.String RESTRICTIONS_SERVICE = "restrictions";
field public static final java.lang.String SEARCH_SERVICE = "search";
field public static final java.lang.String SENSOR_SERVICE = "sensor";
- field public static final java.lang.String SHORTCUT_SERVICE = "shortcut";
field public static final java.lang.String STORAGE_SERVICE = "storage";
field public static final java.lang.String SYSTEM_HEALTH_SERVICE = "systemhealth";
field public static final java.lang.String TELECOM_SERVICE = "telecom";
@@ -9495,20 +9494,13 @@ package android.content.pm {
public class LauncherApps {
method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
- method public android.os.ParcelFileDescriptor getShortcutIconFd(android.content.pm.ShortcutInfo);
- method public android.os.ParcelFileDescriptor getShortcutIconFd(java.lang.String, java.lang.String, android.os.UserHandle);
- method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
- method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
- method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
method public void registerCallback(android.content.pm.LauncherApps.Callback);
method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler);
method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
- method public boolean startShortcut(java.lang.String, java.lang.String, android.graphics.Rect, android.os.Bundle, android.os.UserHandle);
- method public boolean startShortcut(android.content.pm.ShortcutInfo, android.graphics.Rect, android.os.Bundle);
method public void unregisterCallback(android.content.pm.LauncherApps.Callback);
}
@@ -9521,19 +9513,6 @@ package android.content.pm {
method public void onPackagesSuspended(java.lang.String[], android.os.UserHandle);
method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean);
method public void onPackagesUnsuspended(java.lang.String[], android.os.UserHandle);
- method public void onShortcutsChanged(java.lang.String, java.util.List<android.content.pm.ShortcutInfo>, android.os.UserHandle);
- }
-
- public static class LauncherApps.ShortcutQuery {
- ctor public LauncherApps.ShortcutQuery();
- method public void setActivity(android.content.ComponentName);
- method public void setChangedSince(long);
- method public void setPackage(java.lang.String);
- method public void setQueryFlags(int);
- method public void setShortcutIds(java.util.List<java.lang.String>);
- field public static final int FLAG_GET_DYNAMIC = 1; // 0x1
- field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
- field public static final int FLAG_GET_PINNED = 2; // 0x2
}
public class PackageInfo implements android.os.Parcelable {
@@ -10034,66 +10013,6 @@ package android.content.pm {
field public java.lang.String permission;
}
- public final class ShortcutInfo implements android.os.Parcelable {
- method public int describeContents();
- method public android.content.ComponentName getActivityComponent();
- method public java.util.Set<java.lang.String> getCategories();
- method public android.os.PersistableBundle getExtras();
- method public int getIconResourceId();
- method public java.lang.String getId();
- method public android.content.Intent getIntent();
- method public long getLastChangedTimestamp();
- method public java.lang.String getPackageName();
- method public java.lang.String getText();
- method public java.lang.String getTitle();
- method public android.os.UserHandle getUserHandle();
- method public int getWeight();
- method public boolean hasIconFile();
- method public boolean hasIconResource();
- method public boolean hasKeyFieldsOnly();
- method public boolean isDynamic();
- method public boolean isPinned();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int CLONE_REMOVE_FOR_CREATOR = 1; // 0x1
- field public static final int CLONE_REMOVE_FOR_LAUNCHER = 3; // 0x3
- field public static final int CLONE_REMOVE_NON_KEY_INFO = 4; // 0x4
- field public static final android.os.Parcelable.Creator<android.content.pm.ShortcutInfo> CREATOR;
- field public static final int FLAG_DYNAMIC = 1; // 0x1
- field public static final int FLAG_HAS_ICON_FILE = 8; // 0x8
- field public static final int FLAG_HAS_ICON_RES = 4; // 0x4
- field public static final int FLAG_KEY_FIELDS_ONLY = 16; // 0x10
- field public static final int FLAG_PINNED = 2; // 0x2
- field public static final java.lang.String SHORTCUT_CATEGORY_CONVERSATION = "android.shortcut.conversation";
- }
-
- public static class ShortcutInfo.Builder {
- ctor public ShortcutInfo.Builder(android.content.Context);
- method public android.content.pm.ShortcutInfo build();
- method public android.content.pm.ShortcutInfo.Builder setActivityComponent(android.content.ComponentName);
- method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
- method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
- method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
- method public android.content.pm.ShortcutInfo.Builder setId(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setIntent(android.content.Intent);
- method public android.content.pm.ShortcutInfo.Builder setText(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setTitle(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setWeight(int);
- }
-
- public class ShortcutManager {
- method public boolean addDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public java.util.List<android.content.pm.ShortcutInfo> getDynamicShortcuts();
- method public int getIconMaxDimensions();
- method public int getMaxDynamicShortcutCount();
- method public java.util.List<android.content.pm.ShortcutInfo> getPinnedShortcuts();
- method public long getRateLimitResetTime();
- method public int getRemainingCallCount();
- method public void removeAllDynamicShortcuts();
- method public void removeDynamicShortcuts(java.util.List<java.lang.String>);
- method public boolean setDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public boolean updateShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- }
-
public class Signature implements android.os.Parcelable {
ctor public Signature(byte[]);
ctor public Signature(java.lang.String);
diff --git a/api/system-current.txt b/api/system-current.txt
index 867d588bccc1..500e97461b9c 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -8507,7 +8507,6 @@ package android.content {
field public static final java.lang.String RESTRICTIONS_SERVICE = "restrictions";
field public static final java.lang.String SEARCH_SERVICE = "search";
field public static final java.lang.String SENSOR_SERVICE = "sensor";
- field public static final java.lang.String SHORTCUT_SERVICE = "shortcut";
field public static final java.lang.String STORAGE_SERVICE = "storage";
field public static final java.lang.String SYSTEM_HEALTH_SERVICE = "systemhealth";
field public static final java.lang.String TELECOM_SERVICE = "telecom";
@@ -9852,20 +9851,13 @@ package android.content.pm {
public class LauncherApps {
method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
- method public android.os.ParcelFileDescriptor getShortcutIconFd(android.content.pm.ShortcutInfo);
- method public android.os.ParcelFileDescriptor getShortcutIconFd(java.lang.String, java.lang.String, android.os.UserHandle);
- method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
- method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
- method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
method public void registerCallback(android.content.pm.LauncherApps.Callback);
method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler);
method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
- method public boolean startShortcut(java.lang.String, java.lang.String, android.graphics.Rect, android.os.Bundle, android.os.UserHandle);
- method public boolean startShortcut(android.content.pm.ShortcutInfo, android.graphics.Rect, android.os.Bundle);
method public void unregisterCallback(android.content.pm.LauncherApps.Callback);
}
@@ -9878,19 +9870,6 @@ package android.content.pm {
method public void onPackagesSuspended(java.lang.String[], android.os.UserHandle);
method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean);
method public void onPackagesUnsuspended(java.lang.String[], android.os.UserHandle);
- method public void onShortcutsChanged(java.lang.String, java.util.List<android.content.pm.ShortcutInfo>, android.os.UserHandle);
- }
-
- public static class LauncherApps.ShortcutQuery {
- ctor public LauncherApps.ShortcutQuery();
- method public void setActivity(android.content.ComponentName);
- method public void setChangedSince(long);
- method public void setPackage(java.lang.String);
- method public void setQueryFlags(int);
- method public void setShortcutIds(java.util.List<java.lang.String>);
- field public static final int FLAG_GET_DYNAMIC = 1; // 0x1
- field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
- field public static final int FLAG_GET_PINNED = 2; // 0x2
}
public class PackageInfo implements android.os.Parcelable {
@@ -10461,66 +10440,6 @@ package android.content.pm {
field public java.lang.String permission;
}
- public final class ShortcutInfo implements android.os.Parcelable {
- method public int describeContents();
- method public android.content.ComponentName getActivityComponent();
- method public java.util.Set<java.lang.String> getCategories();
- method public android.os.PersistableBundle getExtras();
- method public int getIconResourceId();
- method public java.lang.String getId();
- method public android.content.Intent getIntent();
- method public long getLastChangedTimestamp();
- method public java.lang.String getPackageName();
- method public java.lang.String getText();
- method public java.lang.String getTitle();
- method public android.os.UserHandle getUserHandle();
- method public int getWeight();
- method public boolean hasIconFile();
- method public boolean hasIconResource();
- method public boolean hasKeyFieldsOnly();
- method public boolean isDynamic();
- method public boolean isPinned();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int CLONE_REMOVE_FOR_CREATOR = 1; // 0x1
- field public static final int CLONE_REMOVE_FOR_LAUNCHER = 3; // 0x3
- field public static final int CLONE_REMOVE_NON_KEY_INFO = 4; // 0x4
- field public static final android.os.Parcelable.Creator<android.content.pm.ShortcutInfo> CREATOR;
- field public static final int FLAG_DYNAMIC = 1; // 0x1
- field public static final int FLAG_HAS_ICON_FILE = 8; // 0x8
- field public static final int FLAG_HAS_ICON_RES = 4; // 0x4
- field public static final int FLAG_KEY_FIELDS_ONLY = 16; // 0x10
- field public static final int FLAG_PINNED = 2; // 0x2
- field public static final java.lang.String SHORTCUT_CATEGORY_CONVERSATION = "android.shortcut.conversation";
- }
-
- public static class ShortcutInfo.Builder {
- ctor public ShortcutInfo.Builder(android.content.Context);
- method public android.content.pm.ShortcutInfo build();
- method public android.content.pm.ShortcutInfo.Builder setActivityComponent(android.content.ComponentName);
- method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
- method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
- method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
- method public android.content.pm.ShortcutInfo.Builder setId(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setIntent(android.content.Intent);
- method public android.content.pm.ShortcutInfo.Builder setText(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setTitle(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setWeight(int);
- }
-
- public class ShortcutManager {
- method public boolean addDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public java.util.List<android.content.pm.ShortcutInfo> getDynamicShortcuts();
- method public int getIconMaxDimensions();
- method public int getMaxDynamicShortcutCount();
- method public java.util.List<android.content.pm.ShortcutInfo> getPinnedShortcuts();
- method public long getRateLimitResetTime();
- method public int getRemainingCallCount();
- method public void removeAllDynamicShortcuts();
- method public void removeDynamicShortcuts(java.util.List<java.lang.String>);
- method public boolean setDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public boolean updateShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- }
-
public class Signature implements android.os.Parcelable {
ctor public Signature(byte[]);
ctor public Signature(java.lang.String);
diff --git a/api/test-current.txt b/api/test-current.txt
index 2f28265c4024..75a22201835e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -8192,7 +8192,6 @@ package android.content {
field public static final java.lang.String RESTRICTIONS_SERVICE = "restrictions";
field public static final java.lang.String SEARCH_SERVICE = "search";
field public static final java.lang.String SENSOR_SERVICE = "sensor";
- field public static final java.lang.String SHORTCUT_SERVICE = "shortcut";
field public static final java.lang.String STORAGE_SERVICE = "storage";
field public static final java.lang.String SYSTEM_HEALTH_SERVICE = "systemhealth";
field public static final java.lang.String TELECOM_SERVICE = "telecom";
@@ -9506,20 +9505,13 @@ package android.content.pm {
public class LauncherApps {
ctor public LauncherApps(android.content.Context);
method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
- method public android.os.ParcelFileDescriptor getShortcutIconFd(android.content.pm.ShortcutInfo);
- method public android.os.ParcelFileDescriptor getShortcutIconFd(java.lang.String, java.lang.String, android.os.UserHandle);
- method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
- method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
- method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
method public void registerCallback(android.content.pm.LauncherApps.Callback);
method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler);
method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
- method public boolean startShortcut(java.lang.String, java.lang.String, android.graphics.Rect, android.os.Bundle, android.os.UserHandle);
- method public boolean startShortcut(android.content.pm.ShortcutInfo, android.graphics.Rect, android.os.Bundle);
method public void unregisterCallback(android.content.pm.LauncherApps.Callback);
}
@@ -9532,19 +9524,6 @@ package android.content.pm {
method public void onPackagesSuspended(java.lang.String[], android.os.UserHandle);
method public abstract void onPackagesUnavailable(java.lang.String[], android.os.UserHandle, boolean);
method public void onPackagesUnsuspended(java.lang.String[], android.os.UserHandle);
- method public void onShortcutsChanged(java.lang.String, java.util.List<android.content.pm.ShortcutInfo>, android.os.UserHandle);
- }
-
- public static class LauncherApps.ShortcutQuery {
- ctor public LauncherApps.ShortcutQuery();
- method public void setActivity(android.content.ComponentName);
- method public void setChangedSince(long);
- method public void setPackage(java.lang.String);
- method public void setQueryFlags(int);
- method public void setShortcutIds(java.util.List<java.lang.String>);
- field public static final int FLAG_GET_DYNAMIC = 1; // 0x1
- field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
- field public static final int FLAG_GET_PINNED = 2; // 0x2
}
public class PackageInfo implements android.os.Parcelable {
@@ -10046,67 +10025,6 @@ package android.content.pm {
field public java.lang.String permission;
}
- public final class ShortcutInfo implements android.os.Parcelable {
- method public int describeContents();
- method public android.content.ComponentName getActivityComponent();
- method public java.util.Set<java.lang.String> getCategories();
- method public android.os.PersistableBundle getExtras();
- method public int getIconResourceId();
- method public java.lang.String getId();
- method public android.content.Intent getIntent();
- method public long getLastChangedTimestamp();
- method public java.lang.String getPackageName();
- method public java.lang.String getText();
- method public java.lang.String getTitle();
- method public android.os.UserHandle getUserHandle();
- method public int getWeight();
- method public boolean hasIconFile();
- method public boolean hasIconResource();
- method public boolean hasKeyFieldsOnly();
- method public boolean isDynamic();
- method public boolean isPinned();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int CLONE_REMOVE_FOR_CREATOR = 1; // 0x1
- field public static final int CLONE_REMOVE_FOR_LAUNCHER = 3; // 0x3
- field public static final int CLONE_REMOVE_NON_KEY_INFO = 4; // 0x4
- field public static final android.os.Parcelable.Creator<android.content.pm.ShortcutInfo> CREATOR;
- field public static final int FLAG_DYNAMIC = 1; // 0x1
- field public static final int FLAG_HAS_ICON_FILE = 8; // 0x8
- field public static final int FLAG_HAS_ICON_RES = 4; // 0x4
- field public static final int FLAG_KEY_FIELDS_ONLY = 16; // 0x10
- field public static final int FLAG_PINNED = 2; // 0x2
- field public static final java.lang.String SHORTCUT_CATEGORY_CONVERSATION = "android.shortcut.conversation";
- }
-
- public static class ShortcutInfo.Builder {
- ctor public ShortcutInfo.Builder(android.content.Context);
- method public android.content.pm.ShortcutInfo build();
- method public android.content.pm.ShortcutInfo.Builder setActivityComponent(android.content.ComponentName);
- method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
- method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
- method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
- method public android.content.pm.ShortcutInfo.Builder setId(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setIntent(android.content.Intent);
- method public android.content.pm.ShortcutInfo.Builder setText(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setTitle(java.lang.String);
- method public android.content.pm.ShortcutInfo.Builder setWeight(int);
- }
-
- public class ShortcutManager {
- ctor public ShortcutManager(android.content.Context);
- method public boolean addDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public java.util.List<android.content.pm.ShortcutInfo> getDynamicShortcuts();
- method public int getIconMaxDimensions();
- method public int getMaxDynamicShortcutCount();
- method public java.util.List<android.content.pm.ShortcutInfo> getPinnedShortcuts();
- method public long getRateLimitResetTime();
- method public int getRemainingCallCount();
- method public void removeAllDynamicShortcuts();
- method public void removeDynamicShortcuts(java.util.List<java.lang.String>);
- method public boolean setDynamicShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- method public boolean updateShortcuts(java.util.List<android.content.pm.ShortcutInfo>);
- }
-
public class Signature implements android.os.Parcelable {
ctor public Signature(byte[]);
ctor public Signature(java.lang.String);
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 8349d3da6860..8f5ddf818bf4 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3603,6 +3603,8 @@ public abstract class Context {
*
* @see #getSystemService
* @see android.content.pm.ShortcutManager
+ *
+ * @hide
*/
public static final String SHORTCUT_SERVICE = "shortcut";
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 824722d70fad..8ca27c5e0087 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -166,6 +166,8 @@ public class LauncherApps {
* @param shortcuts all shortcuts from the package (dynamic and/or pinned). Only "key"
* information will be provided, as defined in {@link ShortcutInfo#hasKeyFieldsOnly()}.
* @param user The UserHandle of the profile that generated the change.
+ *
+ * @hide
*/
public void onShortcutsChanged(@NonNull String packageName,
@NonNull List<ShortcutInfo> shortcuts, @NonNull UserHandle user) {
@@ -174,6 +176,8 @@ public class LauncherApps {
/**
* Represents a query passed to {@link #getShortcuts(ShortcutQuery, UserHandle)}.
+ *
+ * @hide
*/
public static class ShortcutQuery {
/**
@@ -422,6 +426,8 @@ public class LauncherApps {
* the user is trying a new launcher application. The user may decide to change the default
* launcher to the calling application again, so even if a launcher application loses
* this permission, it does <b>not</b> have to purge pinned shortcut information.
+ *
+ * @hide
*/
public boolean hasShortcutHostPermission() {
try {
@@ -441,6 +447,8 @@ public class LauncherApps {
* @param user The UserHandle of the profile.
*
* @return the IDs of {@link ShortcutInfo}s that match the query.
+ *
+ * @hide
*/
@Nullable
public List<ShortcutInfo> getShortcuts(@NonNull ShortcutQuery query,
@@ -480,6 +488,8 @@ public class LauncherApps {
* @param packageName The target package name.
* @param shortcutIds The IDs of the shortcut to be pinned.
* @param user The UserHandle of the profile.
+ *
+ * @hide
*/
public void pinShortcuts(@NonNull String packageName, @NonNull List<String> shortcutIds,
@NonNull UserHandle user) {
@@ -519,6 +529,8 @@ public class LauncherApps {
* #hasShortcutHostPermission()}.
*
* @param shortcut The target shortcut.
+ *
+ * @hide
*/
public ParcelFileDescriptor getShortcutIconFd(
@NonNull ShortcutInfo shortcut) {
@@ -536,6 +548,8 @@ public class LauncherApps {
* @param packageName The target package name.
* @param shortcutId The ID of the shortcut to lad rom.
* @param user The UserHandle of the profile.
+ *
+ * @hide
*/
public ParcelFileDescriptor getShortcutIconFd(
@NonNull String packageName, @NonNull String shortcutId, @NonNull UserHandle user) {
@@ -565,6 +579,8 @@ public class LauncherApps {
* @param user The UserHandle of the profile.
* @return {@code false} when the shortcut is no longer valid (e.g. the creator application
* has been uninstalled). {@code true} when the shortcut is still valid.
+ *
+ * @hide
*/
public boolean startShortcut(@NonNull String packageName, @NonNull String shortcutId,
@Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions,
@@ -584,6 +600,8 @@ public class LauncherApps {
* @param startActivityOptions Options to pass to startActivity.
* @return {@code false} when the shortcut is no longer valid (e.g. the creator application
* has been uninstalled). {@code true} when the shortcut is still valid.
+ *
+ * @hide
*/
public boolean startShortcut(@NonNull ShortcutInfo shortcut,
@Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions) {
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index bd8cae20fc4b..4340d04cee69 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -50,6 +50,8 @@ import java.util.Set;
* </ul>
*
* @see {@link ShortcutManager}.
+ *
+ * @hide
*/
public final class ShortcutInfo implements Parcelable {
/* @hide */
diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java
index ab0367dc0df4..16486e13e527 100644
--- a/core/java/android/content/pm/ShortcutManager.java
+++ b/core/java/android/content/pm/ShortcutManager.java
@@ -88,6 +88,8 @@ import java.util.List;
* Launcher applications should use {@link LauncherApps} to get shortcuts that are published from
* applications. Launcher applications can also pin shortcuts with
* {@link LauncherApps#pinShortcuts(String, List, UserHandle)}.
+ *
+ * @hide
*/
public class ShortcutManager {
private static final String TAG = "ShortcutManager";
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 43a0b9174f8e..ffe8f7568cbd 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -745,6 +745,9 @@ public class LauncherAppsService extends SystemService {
@Override
public void onShortcutChanged(@NonNull String packageName,
@UserIdInt int userId) {
+ if (!ShortcutService.FEATURE_ENABLED) {
+ return;
+ }
postToPackageMonitorHandler(() -> onShortcutChangedInner(packageName, userId));
}
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 0f1780467335..826877606333 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -125,6 +125,8 @@ import java.util.function.Predicate;
public class ShortcutService extends IShortcutService.Stub {
static final String TAG = "ShortcutService";
+ public static final boolean FEATURE_ENABLED = false;
+
static final boolean DEBUG = false; // STOPSHIP if true
static final boolean DEBUG_LOAD = false; // STOPSHIP if true
static final boolean DEBUG_PROCSTATE = false; // STOPSHIP if true
@@ -319,6 +321,9 @@ public class ShortcutService extends IShortcutService.Stub {
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mUserManager = context.getSystemService(UserManager.class);
+ if (!FEATURE_ENABLED) {
+ return;
+ }
mPackageMonitor.register(context, looper, UserHandle.ALL, /* externalStorage= */ false);
injectRegisterUidObserver(mUidObserver, ActivityManager.UID_OBSERVER_PROCSTATE
@@ -419,6 +424,7 @@ public class ShortcutService extends IShortcutService.Stub {
/** lifecycle event */
void onBootPhase(int phase) {
+ // We want to call initialize() to initialize the configurations, so we don't disable this.
if (DEBUG) {
Slog.d(TAG, "onBootPhase: " + phase);
}
@@ -431,6 +437,9 @@ public class ShortcutService extends IShortcutService.Stub {
/** lifecycle event */
void handleUnlockUser(int userId) {
+ if (!FEATURE_ENABLED) {
+ return;
+ }
synchronized (mLock) {
// Preload
getUserShortcutsLocked(userId);
@@ -441,6 +450,9 @@ public class ShortcutService extends IShortcutService.Stub {
/** lifecycle event */
void handleCleanupUser(int userId) {
+ if (!FEATURE_ENABLED) {
+ return;
+ }
synchronized (mLock) {
unloadUserLocked(userId);
}
@@ -1926,6 +1938,9 @@ public class ShortcutService extends IShortcutService.Stub {
*/
@Override
public void onSystemLocaleChangedNoLock() {
+ if (!FEATURE_ENABLED) {
+ return;
+ }
// DO NOT HOLD ANY LOCKS HERE.
// We want to reset throttling for all packages for all users. But we can't just do so
@@ -1938,7 +1953,6 @@ public class ShortcutService extends IShortcutService.Stub {
//
// This allows ShortcutUser's to detect the system locale change, so they can reset
// counters.
-
mLocaleChangeSequenceNumber.incrementAndGet();
postToHandler(() -> scheduleSaveBaseState());
}
diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk
index 59c6970d1feb..0437e1de2154 100644
--- a/services/tests/servicestests/Android.mk
+++ b/services/tests/servicestests/Android.mk
@@ -19,8 +19,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
easymocklib \
guava \
android-support-test \
- mockito-target \
- ShortcutManagerTestUtils
+ mockito-target
LOCAL_JAVA_LIBRARIES := android.test.runner
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
deleted file mode 100644
index ced7cf03e938..000000000000
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
+++ /dev/null
@@ -1,6092 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.server.pm;
-
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamic;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamicOrPinned;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveIcon;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveIconFile;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveIconResId;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveIntents;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveTitle;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllKeyFieldsOnly;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotHaveIntents;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotHaveTitle;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotKeyFieldsOnly;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllPinned;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllUnique;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertBitmapSize;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertBundleEmpty;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertCallbackNotReceived;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertCallbackReceived;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertDynamicAndPinned;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertDynamicOnly;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertExpectException;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertShortcutIds;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.findShortcut;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.hashSet;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makeBundle;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.pfdToBitmap;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.resetAll;
-import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.set;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.Manifest.permission;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.UserIdInt;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.IUidObserver;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ILauncherApps;
-import android.content.pm.LauncherApps;
-import android.content.pm.LauncherApps.ShortcutQuery;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.content.pm.ShortcutInfo;
-import android.content.pm.ShortcutManager;
-import android.content.pm.ShortcutServiceInternal;
-import android.content.pm.Signature;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.CompressFormat;
-import android.graphics.BitmapFactory;
-import android.graphics.drawable.Icon;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.FileUtils;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Parcel;
-import android.os.PersistableBundle;
-import android.os.Process;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.test.InstrumentationTestCase;
-import android.test.MoreAsserts;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
-import android.util.Pair;
-import android.util.SparseArray;
-
-import com.android.frameworks.servicestests.R;
-import com.android.internal.util.Preconditions;
-import com.android.server.LocalServices;
-import com.android.server.SystemService;
-import com.android.server.pm.LauncherAppsService.LauncherAppsImpl;
-import com.android.server.pm.ShortcutService.ConfigConstants;
-import com.android.server.pm.ShortcutService.FileOutputStreamWithPath;
-import com.android.server.pm.ShortcutUser.PackageWithUser;
-
-import org.junit.Assert;
-import org.mockito.ArgumentCaptor;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiPredicate;
-import java.util.function.Consumer;
-
-/**
- * Tests for ShortcutService and ShortcutManager.
- *
- m FrameworksServicesTests &&
- adb install \
- -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
- adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
-
- * TODO: Add checks with assertAllNotHaveIcon()
- * TODO: Detailed test for hasShortcutPermissionInner().
- * TODO: Add tests for the command line functions too.
- */
-@SmallTest
-public class ShortcutManagerTest extends InstrumentationTestCase {
- private static final String TAG = "ShortcutManagerTest";
-
- /**
- * Whether to enable dump or not. Should be only true when debugging to avoid bugs where
- * dump affecting the behavior.
- */
- private static final boolean ENABLE_DUMP = false; // DO NOT SUBMIT WITH true
-
- private static final boolean DUMP_IN_TEARDOWN = false; // DO NOT SUBMIT WITH true
-
- // public for mockito
- public class BaseContext extends MockContext {
- @Override
- public Object getSystemService(String name) {
- switch (name) {
- case Context.USER_SERVICE:
- return mMockUserManager;
- }
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getSystemServiceName(Class<?> serviceClass) {
- return getTestContext().getSystemServiceName(serviceClass);
- }
-
- @Override
- public PackageManager getPackageManager() {
- return mMockPackageManager;
- }
-
- @Override
- public Resources getResources() {
- return getTestContext().getResources();
- }
-
- @Override
- public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
- IntentFilter filter, String broadcastPermission, Handler scheduler) {
- // ignore.
- return null;
- }
- }
-
- /** Context used in the client side */
- public class ClientContext extends BaseContext {
- @Override
- public String getPackageName() {
- return mInjectedClientPackage;
- }
-
- @Override
- public int getUserId() {
- return getCallingUserId();
- }
- }
-
- /** Context used in the service side */
- public class ServiceContext extends BaseContext {
- long injectClearCallingIdentity() {
- final int prevCallingUid = mInjectedCallingUid;
- mInjectedCallingUid = Process.SYSTEM_UID;
- return prevCallingUid;
- }
-
- void injectRestoreCallingIdentity(long token) {
- mInjectedCallingUid = (int) token;
- }
-
- @Override
- public void startActivityAsUser(@RequiresPermission Intent intent, @Nullable Bundle options,
- UserHandle userId) {
- }
-
- @Override
- public int getUserId() {
- return UserHandle.USER_SYSTEM;
- }
- }
-
- /** ShortcutService with injection override methods. */
- private final class ShortcutServiceTestable extends ShortcutService {
- final ServiceContext mContext;
- IUidObserver mUidObserver;
-
- public ShortcutServiceTestable(ServiceContext context, Looper looper) {
- super(context, looper);
- mContext = context;
- }
-
- @Override
- String injectShortcutManagerConstants() {
- return ConfigConstants.KEY_RESET_INTERVAL_SEC + "=" + (INTERVAL / 1000) + ","
- + ConfigConstants.KEY_MAX_SHORTCUTS + "=" + MAX_SHORTCUTS + ","
- + ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "="
- + MAX_UPDATES_PER_INTERVAL + ","
- + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=" + MAX_ICON_DIMENSION + ","
- + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "="
- + MAX_ICON_DIMENSION_LOWRAM + ","
- + ConfigConstants.KEY_ICON_FORMAT + "=PNG,"
- + ConfigConstants.KEY_ICON_QUALITY + "=100";
- }
-
- @Override
- long injectClearCallingIdentity() {
- return mContext.injectClearCallingIdentity();
- }
-
- @Override
- void injectRestoreCallingIdentity(long token) {
- mContext.injectRestoreCallingIdentity(token);
- }
-
- @Override
- int injectDipToPixel(int dip) {
- return dip;
- }
-
- @Override
- long injectCurrentTimeMillis() {
- return mInjectedCurrentTimeLillis;
- }
-
- @Override
- long injectElapsedRealtime() {
- // TODO This should be kept separately from mInjectedCurrentTimeLillis, since
- // this should increase even if we rewind mInjectedCurrentTimeLillis in some tests.
- return mInjectedCurrentTimeLillis - START_TIME;
- }
-
- @Override
- int injectBinderCallingUid() {
- return mInjectedCallingUid;
- }
-
- @Override
- int injectGetPackageUid(String packageName, int userId) {
- return getInjectedPackageInfo(packageName, userId, false).applicationInfo.uid;
- }
-
- @Override
- File injectSystemDataPath() {
- return new File(mInjectedFilePathRoot, "system");
- }
-
- @Override
- File injectUserDataPath(@UserIdInt int userId) {
- return new File(mInjectedFilePathRoot, "user-" + userId);
- }
-
- @Override
- void injectValidateIconResPackage(ShortcutInfo shortcut, Icon icon) {
- // Can't check
- }
-
- @Override
- boolean injectIsLowRamDevice() {
- return mInjectedIsLowRamDevice;
- }
-
- @Override
- void injectRegisterUidObserver(IUidObserver observer, int which) {
- mUidObserver = observer;
- }
-
- @Override
- PackageManagerInternal injectPackageManagerInternal() {
- return mMockPackageManagerInternal;
- }
-
- @Override
- boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
- return mDefaultLauncherChecker.test(callingPackage, userId);
- }
-
- @Override
- PackageInfo injectPackageInfo(String packageName, @UserIdInt int userId,
- boolean getSignatures) {
- return getInjectedPackageInfo(packageName, userId, getSignatures);
- }
-
- @Override
- ApplicationInfo injectApplicationInfo(String packageName, @UserIdInt int userId) {
- PackageInfo pi = injectPackageInfo(packageName, userId, /* getSignatures= */ false);
- return pi != null ? pi.applicationInfo : null;
- }
-
- @Override
- void postToHandler(Runnable r) {
- final long token = mContext.injectClearCallingIdentity();
- r.run();
- mContext.injectRestoreCallingIdentity(token);
- }
-
- @Override
- void injectEnforceCallingPermission(String permission, String message) {
- if (!mCallerPermissions.contains(permission)) {
- throw new SecurityException("Missing permission: " + permission);
- }
- }
-
- @Override
- void wtf(String message, Exception e) {
- // During tests, WTF is fatal.
- fail(message + " exception: " + e);
- }
- }
-
- /** ShortcutManager with injection override methods. */
- private class ShortcutManagerTestable extends ShortcutManager {
- public ShortcutManagerTestable(Context context, ShortcutServiceTestable service) {
- super(context, service);
- }
-
- @Override
- protected int injectMyUserId() {
- return UserHandle.getUserId(mInjectedCallingUid);
- }
- }
-
- private class LauncherAppImplTestable extends LauncherAppsImpl {
- final ServiceContext mContext;
-
- public LauncherAppImplTestable(ServiceContext context) {
- super(context);
- mContext = context;
- }
-
- @Override
- public void verifyCallingPackage(String callingPackage) {
- // SKIP
- }
-
- @Override
- void postToPackageMonitorHandler(Runnable r) {
- final long token = mContext.injectClearCallingIdentity();
- r.run();
- mContext.injectRestoreCallingIdentity(token);
- }
-
- @Override
- int injectBinderCallingUid() {
- return mInjectedCallingUid;
- }
-
- @Override
- long injectClearCallingIdentity() {
- final int prevCallingUid = mInjectedCallingUid;
- mInjectedCallingUid = Process.SYSTEM_UID;
- return prevCallingUid;
- }
-
- @Override
- void injectRestoreCallingIdentity(long token) {
- mInjectedCallingUid = (int) token;
- }
- }
-
- private class LauncherAppsTestable extends LauncherApps {
- public LauncherAppsTestable(Context context, ILauncherApps service) {
- super(context, service);
- }
- }
-
- public static class ShortcutActivity extends Activity {
- }
-
- public static class ShortcutActivity2 extends Activity {
- }
-
- public static class ShortcutActivity3 extends Activity {
- }
-
- private ServiceContext mServiceContext;
- private ClientContext mClientContext;
-
- private ShortcutServiceTestable mService;
- private ShortcutManagerTestable mManager;
- private ShortcutServiceInternal mInternal;
-
- private LauncherAppImplTestable mLauncherAppImpl;
-
- // LauncherApps has per-instace state, so we need a differnt instance for each launcher.
- private final Map<Pair<Integer, String>, LauncherAppsTestable>
- mLauncherAppsMap = new HashMap<>();
- private LauncherAppsTestable mLauncherApps; // Current one
-
- private File mInjectedFilePathRoot;
-
- private long mInjectedCurrentTimeLillis;
-
- private boolean mInjectedIsLowRamDevice;
-
- private int mInjectedCallingUid;
- private String mInjectedClientPackage;
-
- private Map<String, PackageInfo> mInjectedPackages;
-
- private Set<PackageWithUser> mUninstalledPackages;
-
- private PackageManager mMockPackageManager;
- private PackageManagerInternal mMockPackageManagerInternal;
- private UserManager mMockUserManager;
-
- private static final String CALLING_PACKAGE_1 = "com.android.test.1";
- private static final int CALLING_UID_1 = 10001;
-
- private static final String CALLING_PACKAGE_2 = "com.android.test.2";
- private static final int CALLING_UID_2 = 10002;
-
- private static final String CALLING_PACKAGE_3 = "com.android.test.3";
- private static final int CALLING_UID_3 = 10003;
-
- private static final String CALLING_PACKAGE_4 = "com.android.test.4";
- private static final int CALLING_UID_4 = 10004;
-
- private static final String LAUNCHER_1 = "com.android.launcher.1";
- private static final int LAUNCHER_UID_1 = 10011;
-
- private static final String LAUNCHER_2 = "com.android.launcher.2";
- private static final int LAUNCHER_UID_2 = 10012;
-
- private static final String LAUNCHER_3 = "com.android.launcher.3";
- private static final int LAUNCHER_UID_3 = 10013;
-
- private static final String LAUNCHER_4 = "com.android.launcher.4";
- private static final int LAUNCHER_UID_4 = 10014;
-
- private static final int USER_0 = UserHandle.USER_SYSTEM;
- private static final int USER_10 = 10;
- private static final int USER_11 = 11;
- private static final int USER_P0 = 20; // profile of user 0
-
- private static final UserHandle HANDLE_USER_0 = UserHandle.of(USER_0);
- private static final UserHandle HANDLE_USER_10 = UserHandle.of(USER_10);
- private static final UserHandle HANDLE_USER_11 = UserHandle.of(USER_11);
- private static final UserHandle HANDLE_USER_P0 = UserHandle.of(USER_P0);
-
- private static final UserInfo USER_INFO_0 = withProfileGroupId(
- new UserInfo(USER_0, "user0",
- UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY | UserInfo.FLAG_INITIALIZED), 10);
-
- private static final UserInfo USER_INFO_10 =
- new UserInfo(USER_10, "user10", UserInfo.FLAG_INITIALIZED);
-
- private static final UserInfo USER_INFO_11 =
- new UserInfo(USER_11, "user11", UserInfo.FLAG_INITIALIZED);
-
- private static final UserInfo USER_INFO_P0 = withProfileGroupId(
- new UserInfo(USER_P0, "userP0",
- UserInfo.FLAG_MANAGED_PROFILE), 10);
-
- private BiPredicate<String, Integer> mDefaultLauncherChecker =
- (callingPackage, userId) ->
- LAUNCHER_1.equals(callingPackage) || LAUNCHER_2.equals(callingPackage)
- || LAUNCHER_3.equals(callingPackage) || LAUNCHER_4.equals(callingPackage);
-
- private static final long START_TIME = 1440000000101L;
-
- private static final long INTERVAL = 10000;
-
- private static final int MAX_SHORTCUTS = 10;
-
- private static final int MAX_UPDATES_PER_INTERVAL = 3;
-
- private static final int MAX_ICON_DIMENSION = 128;
-
- private static final int MAX_ICON_DIMENSION_LOWRAM = 32;
-
- private static final ShortcutQuery QUERY_ALL = new ShortcutQuery();
-
- private final ArrayList<String> mCallerPermissions = new ArrayList<>();
-
- static {
- QUERY_ALL.setQueryFlags(
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mServiceContext = spy(new ServiceContext());
- mClientContext = new ClientContext();
-
- mMockPackageManager = mock(PackageManager.class);
- mMockPackageManagerInternal = mock(PackageManagerInternal.class);
- mMockUserManager = mock(UserManager.class);
-
- // Prepare injection values.
-
- mInjectedCurrentTimeLillis = START_TIME;
-
- mInjectedPackages = new HashMap<>();;
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1);
- addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 2);
- addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 3);
- addPackage(CALLING_PACKAGE_4, CALLING_UID_4, 10);
- addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4);
- addPackage(LAUNCHER_2, LAUNCHER_UID_2, 5);
- addPackage(LAUNCHER_3, LAUNCHER_UID_3, 6);
- addPackage(LAUNCHER_4, LAUNCHER_UID_4, 10);
-
- // CALLING_PACKAGE_3 / LAUNCHER_3 are not backup target.
- updatePackageInfo(CALLING_PACKAGE_3,
- pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
- updatePackageInfo(LAUNCHER_3,
- pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
-
- mUninstalledPackages = new HashSet<>();
-
- mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files");
-
- deleteAllSavedFiles();
-
- // Set up users.
- doAnswer(inv -> {
- assertSystem();
- return USER_INFO_0;
- }).when(mMockUserManager).getUserInfo(eq(USER_0));
-
- doAnswer(inv -> {
- assertSystem();
- return USER_INFO_10;
- }).when(mMockUserManager).getUserInfo(eq(USER_10));
-
- doAnswer(inv -> {
- assertSystem();
- return USER_INFO_11;
- }).when(mMockUserManager).getUserInfo(eq(USER_11));
-
- doAnswer(inv -> {
- assertSystem();
- return USER_INFO_P0;
- }).when(mMockUserManager).getUserInfo(eq(USER_P0));
-
- // User 0 is always running.
- when(mMockUserManager.isUserRunning(eq(USER_0))).thenReturn(true);
-
- initService();
- setCaller(CALLING_PACKAGE_1);
-
- // In order to complicate the situation, we set mLocaleChangeSequenceNumber to 1 by
- // calling this. Running test with mLocaleChangeSequenceNumber == 0 might make us miss
- // some edge cases.
- mInternal.onSystemLocaleChangedNoLock();
- }
-
- private static UserInfo withProfileGroupId(UserInfo in, int groupId) {
- in.profileGroupId = groupId;
- return in;
- }
-
- @Override
- protected void tearDown() throws Exception {
- if (DUMP_IN_TEARDOWN) dumpsysOnLogcat("Teardown");
-
- shutdownServices();
-
- super.tearDown();
- }
-
- private Context getTestContext() {
- return getInstrumentation().getContext();
- }
-
- private void deleteAllSavedFiles() {
- // Empty the data directory.
- if (mInjectedFilePathRoot.exists()) {
- Assert.assertTrue("failed to delete dir",
- FileUtils.deleteContents(mInjectedFilePathRoot));
- }
- mInjectedFilePathRoot.mkdirs();
- }
-
- /** (Re-) init the manager and the service. */
- private void initService() {
- shutdownServices();
-
- LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
-
- // Instantiate targets.
- mService = new ShortcutServiceTestable(mServiceContext, Looper.getMainLooper());
- mManager = new ShortcutManagerTestable(mClientContext, mService);
-
- mInternal = LocalServices.getService(ShortcutServiceInternal.class);
-
- mLauncherAppImpl = new LauncherAppImplTestable(mServiceContext);
- mLauncherApps = null;
- mLauncherAppsMap.clear();
-
- // Load the setting file.
- mService.onBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
- }
-
- private void shutdownServices() {
- if (mService != null) {
- // Flush all the unsaved data from the previous instance.
- mService.saveDirtyInfo();
- }
- LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
-
- mService = null;
- mManager = null;
- mInternal = null;
- mLauncherAppImpl = null;
- mLauncherApps = null;
- mLauncherAppsMap.clear();
- }
-
- private void addPackage(String packageName, int uid, int version) {
- addPackage(packageName, uid, version, packageName);
- }
-
- private Signature[] genSignatures(String... signatures) {
- final Signature[] sigs = new Signature[signatures.length];
- for (int i = 0; i < signatures.length; i++){
- sigs[i] = new Signature(signatures[i].getBytes());
- }
- return sigs;
- }
-
- private PackageInfo genPackage(String packageName, int uid, int version, String... signatures) {
- final PackageInfo pi = new PackageInfo();
- pi.packageName = packageName;
- pi.applicationInfo = new ApplicationInfo();
- pi.applicationInfo.uid = uid;
- pi.applicationInfo.flags = ApplicationInfo.FLAG_INSTALLED
- | ApplicationInfo.FLAG_ALLOW_BACKUP;
- pi.versionCode = version;
- pi.applicationInfo.versionCode = version;
- pi.signatures = genSignatures(signatures);
-
- return pi;
- }
-
- private void addPackage(String packageName, int uid, int version, String... signatures) {
- mInjectedPackages.put(packageName, genPackage(packageName, uid, version, signatures));
- }
-
- private void updatePackageInfo(String packageName, Consumer<PackageInfo> c) {
- c.accept(mInjectedPackages.get(packageName));
- }
-
- private void updatePackageVersion(String packageName, int increment) {
- updatePackageInfo(packageName, pi -> {
- pi.versionCode += increment;
- pi.applicationInfo.versionCode += increment;
- });
- }
-
- private void uninstallPackage(int userId, String packageName) {
- if (ENABLE_DUMP) {
- Log.i(TAG, "Unnstall package " + packageName + " / " + userId);
- }
- mUninstalledPackages.add(PackageWithUser.of(userId, packageName));
- }
-
- private void installPackage(int userId, String packageName) {
- if (ENABLE_DUMP) {
- Log.i(TAG, "Install package " + packageName + " / " + userId);
- }
- mUninstalledPackages.remove(PackageWithUser.of(userId, packageName));
- }
-
- PackageInfo getInjectedPackageInfo(String packageName, @UserIdInt int userId,
- boolean getSignatures) {
- final PackageInfo pi = mInjectedPackages.get(packageName);
- if (pi == null) return null;
-
- final PackageInfo ret = new PackageInfo();
- ret.packageName = pi.packageName;
- ret.versionCode = pi.versionCode;
- ret.applicationInfo = new ApplicationInfo(pi.applicationInfo);
- ret.applicationInfo.uid = UserHandle.getUid(userId, pi.applicationInfo.uid);
- if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) {
- ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
- }
-
- if (getSignatures) {
- ret.signatures = pi.signatures;
- }
-
- return ret;
- }
-
- /** Replace the current calling package */
- private void setCaller(String packageName, int userId) {
- mInjectedClientPackage = packageName;
- mInjectedCallingUid =
- Preconditions.checkNotNull(getInjectedPackageInfo(packageName, userId, false),
- "Unknown package").applicationInfo.uid;
-
- // Set up LauncherApps for this caller.
- final Pair<Integer, String> key = Pair.create(userId, packageName);
- if (!mLauncherAppsMap.containsKey(key)) {
- mLauncherAppsMap.put(key, new LauncherAppsTestable(mClientContext, mLauncherAppImpl));
- }
- mLauncherApps = mLauncherAppsMap.get(key);
- }
-
- private void setCaller(String packageName) {
- setCaller(packageName, UserHandle.USER_SYSTEM);
- }
-
- private String getCallingPackage() {
- return mInjectedClientPackage;
- }
-
- private void setDefaultLauncherChecker(BiPredicate<String, Integer> p) {
- mDefaultLauncherChecker = p;
- }
-
- private void runWithCaller(String packageName, int userId, Runnable r) {
- final String previousPackage = mInjectedClientPackage;
- final int previousUserId = UserHandle.getUserId(mInjectedCallingUid);
-
- setCaller(packageName, userId);
-
- r.run();
-
- setCaller(previousPackage, previousUserId);
- }
-
- private int getCallingUserId() {
- return UserHandle.getUserId(mInjectedCallingUid);
- }
-
- private UserHandle getCallingUser() {
- return UserHandle.of(getCallingUserId());
- }
-
- /** For debugging */
- private void dumpsysOnLogcat() {
- dumpsysOnLogcat("");
- }
-
- private void dumpsysOnLogcat(String message) {
- dumpsysOnLogcat(message, false);
- }
-
- private void dumpsysOnLogcat(String message, boolean force) {
- if (force || !ENABLE_DUMP) return;
-
- final ByteArrayOutputStream out = new ByteArrayOutputStream();
- final PrintWriter pw = new PrintWriter(out);
- mService.dumpInner(pw, null);
- pw.close();
-
- Log.e(TAG, "Dumping ShortcutService: " + message);
- for (String line : out.toString().split("\n")) {
- Log.e(TAG, line);
- }
- }
-
- /**
- * For debugging, dump arbitrary file on logcat.
- */
- private void dumpFileOnLogcat(String path) {
- dumpFileOnLogcat(path, "");
- }
-
- private void dumpFileOnLogcat(String path, String message) {
- if (!ENABLE_DUMP) return;
-
- Log.i(TAG, "Dumping file: " + path + " " + message);
- final StringBuilder sb = new StringBuilder();
- try (BufferedReader br = new BufferedReader(new FileReader(path))) {
- String line;
- while ((line = br.readLine()) != null) {
- Log.i(TAG, line);
- }
- } catch (Exception e) {
- Log.e(TAG, "Couldn't read file", e);
- fail("Exception " + e);
- }
- }
-
- /**
- * For debugging, dump the main state file on logcat.
- */
- private void dumpBaseStateFile() {
- mService.saveDirtyInfo();
- dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
- + "/system/" + ShortcutService.FILENAME_BASE_STATE);
- }
-
- /**
- * For debugging, dump per-user state file on logcat.
- */
- private void dumpUserFile(int userId) {
- dumpUserFile(userId, "");
- }
-
- private void dumpUserFile(int userId, String message) {
- mService.saveDirtyInfo();
- dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
- + "/user-" + userId
- + "/" + ShortcutService.FILENAME_USER_PACKAGES, message);
- }
-
- private void waitOnMainThread() throws Throwable {
- runTestOnUiThread(() -> {});
- }
-
- /**
- * Make a shortcut with an ID.
- */
- private ShortcutInfo makeShortcut(String id) {
- return makeShortcut(
- id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
- }
-
- /**
- * Make a shortcut with an ID and timestamp.
- */
- private ShortcutInfo makeShortcutWithTimestamp(String id, long timestamp) {
- final ShortcutInfo s = makeShortcut(
- id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
- s.setTimestamp(timestamp);
- return s;
- }
-
- /**
- * Make a shortcut with an ID and icon.
- */
- private ShortcutInfo makeShortcutWithIcon(String id, Icon icon) {
- return makeShortcut(
- id, "Title-" + id, /* activity =*/ null, icon,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
- }
-
- private ShortcutInfo makePackageShortcut(String packageName, String id) {
- String origCaller = getCallingPackage();
-
- setCaller(packageName);
- ShortcutInfo s = makeShortcut(
- id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
- makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
- setCaller(origCaller); // restore the caller
-
- return s;
- }
-
- /**
- * Make multiple shortcuts with IDs.
- */
- private List<ShortcutInfo> makeShortcuts(String... ids) {
- final ArrayList<ShortcutInfo> ret = new ArrayList();
- for (String id : ids) {
- ret.add(makeShortcut(id));
- }
- return ret;
- }
-
- private ShortcutInfo.Builder makeShortcutBuilder() {
- return new ShortcutInfo.Builder(mClientContext);
- }
-
- /**
- * Make a shortcut with details.
- */
- private ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
- Icon icon, Intent intent, int weight) {
- final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext)
- .setId(id)
- .setTitle(title)
- .setWeight(weight)
- .setIntent(intent);
- if (icon != null) {
- b.setIcon(icon);
- }
- if (activity != null) {
- b.setActivityComponent(activity);
- }
- final ShortcutInfo s = b.build();
-
- s.setTimestamp(mInjectedCurrentTimeLillis); // HACK
-
- return s;
- }
-
- /**
- * Make an intent.
- */
- private Intent makeIntent(String action, Class<?> clazz, Object... bundleKeysAndValues) {
- final Intent intent = new Intent(action);
- intent.setComponent(makeComponent(clazz));
- intent.replaceExtras(makeBundle(bundleKeysAndValues));
- return intent;
- }
-
- /**
- * Make an component name, with the client context.
- */
- @NonNull
- private ComponentName makeComponent(Class<?> clazz) {
- return new ComponentName(mClientContext, clazz);
- }
-
- @NonNull
- private ShortcutInfo findById(List<ShortcutInfo> list, String id) {
- for (ShortcutInfo s : list) {
- if (s.getId().equals(id)) {
- return s;
- }
- }
- fail("Shortcut with id " + id + " not found");
- return null;
- }
-
- private void assertSystem() {
- assertEquals("Caller must be system", Process.SYSTEM_UID, mInjectedCallingUid);
- }
-
- private void assertResetTimes(long expectedLastResetTime, long expectedNextResetTime) {
- assertEquals(expectedLastResetTime, mService.getLastResetTimeLocked());
- assertEquals(expectedNextResetTime, mService.getNextResetTimeLocked());
- }
-
- public static List<ShortcutInfo> assertAllNotHaveIcon(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertNull("ID " + s.getId(), s.getIcon());
- }
- return actualShortcuts;
- }
-
- @NonNull
- private List<ShortcutInfo> assertAllHaveFlags(@NonNull List<ShortcutInfo> actualShortcuts,
- int shortcutFlags) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId() + " doesn't have flags " + shortcutFlags,
- s.hasFlags(shortcutFlags));
- }
- return actualShortcuts;
- }
-
- private ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) {
- return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
- }
-
- private void assertShortcutExists(String packageName, String shortcutId, int userId) {
- assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null);
- }
-
- private void assertShortcutNotExists(String packageName, String shortcutId, int userId) {
- assertTrue(getPackageShortcut(packageName, shortcutId, userId) == null);
- }
-
- private Intent launchShortcutAndGetIntent(
- @NonNull String packageName, @NonNull String shortcutId, int userId) {
- reset(mServiceContext);
- assertTrue(mLauncherApps.startShortcut(packageName, shortcutId, null, null,
- UserHandle.of(userId)));
-
- final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- verify(mServiceContext).startActivityAsUser(
- intentCaptor.capture(),
- any(Bundle.class),
- eq(UserHandle.of(userId)));
- return intentCaptor.getValue();
- }
-
- private Intent launchShortcutAndGetIntent_withShortcutInfo(
- @NonNull String packageName, @NonNull String shortcutId, int userId) {
- reset(mServiceContext);
-
- assertTrue(mLauncherApps.startShortcut(
- getShortcutInfoAsLauncher(packageName, shortcutId, userId), null, null));
-
- final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- verify(mServiceContext).startActivityAsUser(
- intentCaptor.capture(),
- any(Bundle.class),
- eq(UserHandle.of(userId)));
- return intentCaptor.getValue();
- }
-
- private void assertShortcutLaunchable(@NonNull String packageName, @NonNull String shortcutId,
- int userId) {
- assertNotNull(launchShortcutAndGetIntent(packageName, shortcutId, userId));
- assertNotNull(launchShortcutAndGetIntent_withShortcutInfo(packageName, shortcutId, userId));
- }
-
- private void assertShortcutNotLaunchable(@NonNull String packageName,
- @NonNull String shortcutId, int userId) {
- try {
- final boolean ok = mLauncherApps.startShortcut(packageName, shortcutId, null, null,
- UserHandle.of(userId));
- if (!ok) {
- return; // didn't launch, okay.
- }
- fail();
- } catch (SecurityException expected) {
- // security exception is okay too.
- }
- }
-
- private ShortcutInfo getPackageShortcut(String packageName, String shortcutId) {
- return getPackageShortcut(packageName, shortcutId, getCallingUserId());
- }
-
- private ShortcutInfo getCallerShortcut(String shortcutId) {
- return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId());
- }
-
- private List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) {
- final List<ShortcutInfo>[] ret = new List[1];
- runWithCaller(launcher, userId, () -> {
- final ShortcutQuery q = new ShortcutQuery();
- q.setQueryFlags(queryFlags);
- ret[0] = mLauncherApps.getShortcuts(q, UserHandle.of(userId));
- });
- return ret[0];
- }
-
- private List<ShortcutInfo> getLauncherPinnedShortcuts(String launcher, int userId) {
- return getLauncherShortcuts(launcher, userId, ShortcutQuery.FLAG_GET_PINNED);
- }
-
- private ShortcutInfo getShortcutInfoAsLauncher(String packageName, String shortcutId,
- int userId) {
- final List<ShortcutInfo> infoList =
- mLauncherApps.getShortcutInfo(packageName, list(shortcutId),
- UserHandle.of(userId));
- assertEquals("No shortcutInfo found (or too many of them)", 1, infoList.size());
- return infoList.get(0);
- }
-
- private Intent genPackageDeleteIntent(String pakcageName, int userId) {
- Intent i = new Intent(Intent.ACTION_PACKAGE_REMOVED);
- i.setData(Uri.parse("package:" + pakcageName));
- i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
- return i;
- }
-
- private Intent genPackageUpdateIntent(String pakcageName, int userId) {
- Intent i = new Intent(Intent.ACTION_PACKAGE_ADDED);
- i.setData(Uri.parse("package:" + pakcageName));
- i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
- i.putExtra(Intent.EXTRA_REPLACING, true);
- return i;
- }
- private Intent genPackageDataClear(String packageName, int userId) {
- Intent i = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED);
- i.setData(Uri.parse("package:" + packageName));
- i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
- return i;
- }
-
- private ShortcutInfo parceled(ShortcutInfo si) {
- Parcel p = Parcel.obtain();
- p.writeParcelable(si, 0);
- p.setDataPosition(0);
- ShortcutInfo si2 = p.readParcelable(getClass().getClassLoader());
- p.recycle();
- return si2;
- }
-
- /**
- * Test for the first launch path, no settings file available.
- */
- public void testFirstInitialize() {
- assertResetTimes(START_TIME, START_TIME + INTERVAL);
- }
-
- /**
- * Test for {@link ShortcutService#getLastResetTimeLocked()} and
- * {@link ShortcutService#getNextResetTimeLocked()}.
- */
- public void testUpdateAndGetNextResetTimeLocked() {
- assertResetTimes(START_TIME, START_TIME + INTERVAL);
-
- // Advance clock.
- mInjectedCurrentTimeLillis += 100;
-
- // Shouldn't have changed.
- assertResetTimes(START_TIME, START_TIME + INTERVAL);
-
- // Advance clock, almost the reset time.
- mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
-
- // Shouldn't have changed.
- assertResetTimes(START_TIME, START_TIME + INTERVAL);
-
- // Advance clock.
- mInjectedCurrentTimeLillis += 1;
-
- assertResetTimes(START_TIME + INTERVAL, START_TIME + 2 * INTERVAL);
-
- // Advance further; 4 hours since start.
- mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
-
- assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
- }
-
- /**
- * Test for the restoration from saved file.
- */
- public void testInitializeFromSavedFile() {
-
- mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
- assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
-
- mService.saveBaseStateLocked();
-
- dumpBaseStateFile();
-
- mService.saveDirtyInfo();
-
- // Restore.
- initService();
-
- assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
- }
-
- /**
- * Test for the restoration from restored file.
- */
- public void testLoadFromBrokenFile() {
- // TODO Add various broken cases.
- }
-
- public void testLoadConfig() {
- mService.updateConfigurationLocked(
- ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123,"
- + ConfigConstants.KEY_MAX_SHORTCUTS + "=4,"
- + ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=5,"
- + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
- + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
- + ConfigConstants.KEY_ICON_FORMAT + "=WEBP,"
- + ConfigConstants.KEY_ICON_QUALITY + "=75");
- assertEquals(123000, mService.getResetIntervalForTest());
- assertEquals(4, mService.getMaxDynamicShortcutsForTest());
- assertEquals(5, mService.getMaxUpdatesPerIntervalForTest());
- assertEquals(100, mService.getMaxIconDimensionForTest());
- assertEquals(CompressFormat.WEBP, mService.getIconPersistFormatForTest());
- assertEquals(75, mService.getIconPersistQualityForTest());
-
- mInjectedIsLowRamDevice = true;
- mService.updateConfigurationLocked(
- ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
- + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
- + ConfigConstants.KEY_ICON_FORMAT + "=JPEG");
- assertEquals(ShortcutService.DEFAULT_RESET_INTERVAL_SEC * 1000,
- mService.getResetIntervalForTest());
-
- assertEquals(ShortcutService.DEFAULT_MAX_SHORTCUTS_PER_APP,
- mService.getMaxDynamicShortcutsForTest());
-
- assertEquals(ShortcutService.DEFAULT_MAX_UPDATES_PER_INTERVAL,
- mService.getMaxUpdatesPerIntervalForTest());
-
- assertEquals(50, mService.getMaxIconDimensionForTest());
-
- assertEquals(CompressFormat.JPEG, mService.getIconPersistFormatForTest());
-
- assertEquals(ShortcutService.DEFAULT_ICON_PERSIST_QUALITY,
- mService.getIconPersistQualityForTest());
- }
-
- // === Test for app side APIs ===
-
- /** Test for {@link android.content.pm.ShortcutManager#getMaxDynamicShortcutCount()} */
- public void testGetMaxDynamicShortcutCount() {
- assertEquals(MAX_SHORTCUTS, mManager.getMaxDynamicShortcutCount());
- }
-
- /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
- public void testGetRemainingCallCount() {
- assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount());
- }
-
- /** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */
- public void testGetRateLimitResetTime() {
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
-
- assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime());
- }
-
- public void testSetDynamicShortcuts() {
- setCaller(CALLING_PACKAGE_1, USER_0);
-
- final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1);
- final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.icon2));
-
- final ShortcutInfo si1 = makeShortcut(
- "shortcut1",
- "Title 1",
- makeComponent(ShortcutActivity.class),
- icon1,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
-
- final ShortcutInfo si2 = makeShortcut(
- "shortcut2",
- "Title 2",
- /* activity */ null,
- icon2,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
- final ShortcutInfo si3 = makeShortcut("shortcut3");
-
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2");
- assertEquals(2, mManager.getRemainingCallCount());
-
- // TODO: Check fields
-
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1");
- assertEquals(1, mManager.getRemainingCallCount());
-
- assertTrue(mManager.setDynamicShortcuts(list()));
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getRemainingCallCount());
-
- dumpsysOnLogcat();
-
- mInjectedCurrentTimeLillis++; // Need to advance the clock for reset to work.
- mService.resetThrottlingInner(UserHandle.USER_SYSTEM);
-
- dumpsysOnLogcat();
-
- assertTrue(mManager.setDynamicShortcuts(list(si2, si3)));
- assertEquals(2, mManager.getDynamicShortcuts().size());
-
- // TODO Check max number
-
- runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"))));
- });
- }
-
- public void testAddDynamicShortcuts() {
- setCaller(CALLING_PACKAGE_1, USER_0);
-
- final ShortcutInfo si1 = makeShortcut("shortcut1");
- final ShortcutInfo si2 = makeShortcut("shortcut2");
- final ShortcutInfo si3 = makeShortcut("shortcut3");
-
- assertEquals(3, mManager.getRemainingCallCount());
-
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1");
-
- assertTrue(mManager.addDynamicShortcuts(list(si2, si3)));
- assertEquals(1, mManager.getRemainingCallCount());
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2", "shortcut3");
-
- // This should not crash. It'll still consume the quota.
- assertTrue(mManager.addDynamicShortcuts(list()));
- assertEquals(0, mManager.getRemainingCallCount());
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2", "shortcut3");
-
- mInjectedCurrentTimeLillis += INTERVAL; // reset
-
- // Add with the same ID
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("shortcut1"))));
- assertEquals(2, mManager.getRemainingCallCount());
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2", "shortcut3");
-
- // TODO Check max number
-
- // TODO Check fields.
-
- runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("s1"))));
- });
- }
-
- public void testDeleteDynamicShortcuts() {
- final ShortcutInfo si1 = makeShortcut("shortcut1");
- final ShortcutInfo si2 = makeShortcut("shortcut2");
- final ShortcutInfo si3 = makeShortcut("shortcut3");
- final ShortcutInfo si4 = makeShortcut("shortcut4");
-
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3, si4)));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2", "shortcut3", "shortcut4");
-
- assertEquals(2, mManager.getRemainingCallCount());
-
- mManager.removeDynamicShortcuts(list("shortcut1"));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut2", "shortcut3", "shortcut4");
-
- mManager.removeDynamicShortcuts(list("shortcut1"));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut2", "shortcut3", "shortcut4");
-
- mManager.removeDynamicShortcuts(list("shortcutXXX"));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut2", "shortcut3", "shortcut4");
-
- mManager.removeDynamicShortcuts(list("shortcut2", "shortcut4"));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut3");
-
- mManager.removeDynamicShortcuts(list("shortcut3"));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()));
-
- // Still 2 calls left.
- assertEquals(2, mManager.getRemainingCallCount());
- }
-
- public void testDeleteAllDynamicShortcuts() {
- final ShortcutInfo si1 = makeShortcut("shortcut1");
- final ShortcutInfo si2 = makeShortcut("shortcut2");
- final ShortcutInfo si3 = makeShortcut("shortcut3");
-
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mManager.getDynamicShortcuts()),
- "shortcut1", "shortcut2", "shortcut3");
-
- assertEquals(2, mManager.getRemainingCallCount());
-
- mManager.removeAllDynamicShortcuts();
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(2, mManager.getRemainingCallCount());
-
- // Note delete shouldn't affect throttling, so...
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getDynamicShortcuts().size());
-
- // This should still work.
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
- assertEquals(3, mManager.getDynamicShortcuts().size());
-
- // Still 1 call left
- assertEquals(1, mManager.getRemainingCallCount());
- }
-
- public void testThrottling() {
- final ShortcutInfo si1 = makeShortcut("shortcut1");
-
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(1, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- // Reached the max
-
- mInjectedCurrentTimeLillis++;
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- // Still throttled
- mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- // Now it should work.
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1))); // fail
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(1, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
-
- // 4 hours later...
- mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(1, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
-
- // Make sure getRemainingCallCount() itself gets reset without calling setDynamicShortcuts().
- mInjectedCurrentTimeLillis = START_TIME + 8 * INTERVAL;
- assertEquals(3, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
- }
-
- public void testThrottling_rewind() {
- final ShortcutInfo si1 = makeShortcut("shortcut1");
-
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- mInjectedCurrentTimeLillis = 12345; // Clock reset!
-
- // Since the clock looks invalid, the counter shouldn't have reset.
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- // Forward again. Still haven't reset yet.
- mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
- assertEquals(2, mManager.getRemainingCallCount());
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
-
- // Now rewind -- this will reset the counters.
- mInjectedCurrentTimeLillis = START_TIME - 100000;
- assertEquals(3, mManager.getRemainingCallCount());
-
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
-
- // Forward again, should be reset now.
- mInjectedCurrentTimeLillis += INTERVAL;
- assertEquals(3, mManager.getRemainingCallCount());
- }
-
- public void testThrottling_perPackage() {
- final ShortcutInfo si1 = makeShortcut("shortcut1");
-
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(2, mManager.getRemainingCallCount());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(1, mManager.getRemainingCallCount());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
-
- // Reached the max
-
- mInjectedCurrentTimeLillis++;
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
-
- // Try from a different caller.
- mInjectedClientPackage = CALLING_PACKAGE_2;
- mInjectedCallingUid = CALLING_UID_2;
-
- // Need to create a new one wit the updated package name.
- final ShortcutInfo si2 = makeShortcut("shortcut1");
-
- assertEquals(3, mManager.getRemainingCallCount());
-
- assertTrue(mManager.setDynamicShortcuts(list(si2)));
- assertEquals(2, mManager.getRemainingCallCount());
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si2)));
- assertEquals(1, mManager.getRemainingCallCount());
-
- // Back to the original caller, still throttled.
- mInjectedClientPackage = CALLING_PACKAGE_1;
- mInjectedCallingUid = CALLING_UID_1;
-
- mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
- assertEquals(0, mManager.getRemainingCallCount());
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
- assertEquals(0, mManager.getRemainingCallCount());
-
- // Now it should work.
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
-
- mInjectedCurrentTimeLillis++;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
-
- mInjectedCurrentTimeLillis++;
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
-
- mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL;
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertTrue(mManager.setDynamicShortcuts(list(si1)));
- assertFalse(mManager.setDynamicShortcuts(list(si1)));
-
- mInjectedClientPackage = CALLING_PACKAGE_2;
- mInjectedCallingUid = CALLING_UID_2;
-
- assertEquals(3, mManager.getRemainingCallCount());
-
- assertTrue(mManager.setDynamicShortcuts(list(si2)));
- assertTrue(mManager.setDynamicShortcuts(list(si2)));
- assertTrue(mManager.setDynamicShortcuts(list(si2)));
- assertFalse(mManager.setDynamicShortcuts(list(si2)));
- }
-
- public void testIcons() throws IOException {
- final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
- final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
- final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512);
-
- final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_32x32));
- final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_64x64));
- final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_512x512));
-
- // Set from package 1
- setCaller(CALLING_PACKAGE_1);
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithIcon("res32x32", res32x32),
- makeShortcutWithIcon("res64x64", res64x64),
- makeShortcutWithIcon("bmp32x32", bmp32x32),
- makeShortcutWithIcon("bmp64x64", bmp64x64),
- makeShortcutWithIcon("bmp512x512", bmp512x512),
- makeShortcut("none")
- )));
-
- // getDynamicShortcuts() shouldn't return icons, thus assertAllNotHaveIcon().
- assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
- "res32x32",
- "res64x64",
- "bmp32x32",
- "bmp64x64",
- "bmp512x512",
- "none");
-
- // Call from another caller with the same ID, just to make sure storage is per-package.
- setCaller(CALLING_PACKAGE_2);
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithIcon("res32x32", res512x512),
- makeShortcutWithIcon("res64x64", res512x512),
- makeShortcutWithIcon("none", res512x512)
- )));
- assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
- "res32x32",
- "res64x64",
- "none");
-
- // Different profile. Note the names and the contents don't match.
- setCaller(CALLING_PACKAGE_1, USER_P0);
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithIcon("res32x32", res512x512),
- makeShortcutWithIcon("bmp32x32", bmp512x512)
- )));
- assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
- "res32x32",
- "bmp32x32");
-
- // Re-initialize and load from the files.
- mService.saveDirtyInfo();
- initService();
-
- // Load from launcher.
- Bitmap bmp;
-
- setCaller(LAUNCHER_1);
- // Check hasIconResource()/hasIconFile().
- assertShortcutIds(assertAllHaveIconResId(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_0))),
- "res32x32");
-
- assertShortcutIds(assertAllHaveIconResId(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res64x64", USER_0))),
- "res64x64");
-
- assertShortcutIds(assertAllHaveIconFile(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_0))),
- "bmp32x32");
-
- assertShortcutIds(assertAllHaveIconFile(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp64x64", USER_0))),
- "bmp64x64");
-
- assertShortcutIds(assertAllHaveIconFile(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0))),
- "bmp512x512");
-
- assertShortcutIds(assertAllHaveIconResId(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_P0))),
- "res32x32");
- assertShortcutIds(assertAllHaveIconFile(
- list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_P0))),
- "bmp32x32");
-
- // Check
- assertEquals(
- R.drawable.black_32x32,
- mLauncherApps.getShortcutIconResId(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_0)));
-
- assertEquals(
- R.drawable.black_64x64,
- mLauncherApps.getShortcutIconResId(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res64x64", USER_0)));
-
- assertEquals(
- 0, // because it's not a resource
- mLauncherApps.getShortcutIconResId(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_0)));
- assertEquals(
- 0, // because it's not a resource
- mLauncherApps.getShortcutIconResId(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp64x64", USER_0)));
- assertEquals(
- 0, // because it's not a resource
- mLauncherApps.getShortcutIconResId(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0)));
-
- bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_0)));
- assertBitmapSize(32, 32, bmp);
-
- bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp64x64", USER_0)));
- assertBitmapSize(64, 64, bmp);
-
- bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0)));
- assertBitmapSize(128, 128, bmp);
-
- assertEquals(
- R.drawable.black_512x512,
- mLauncherApps.getShortcutIconResId(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_P0)));
- // Should be 512x512, so shrunk.
- bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
- getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_P0)));
- assertBitmapSize(128, 128, bmp);
-
- // Also check the overload APIs too.
- assertEquals(
- R.drawable.black_32x32,
- mLauncherApps.getShortcutIconResId(CALLING_PACKAGE_1, "res32x32", HANDLE_USER_0));
- assertEquals(
- R.drawable.black_64x64,
- mLauncherApps.getShortcutIconResId(CALLING_PACKAGE_1, "res64x64", HANDLE_USER_0));
- assertEquals(
- R.drawable.black_512x512,
- mLauncherApps.getShortcutIconResId(CALLING_PACKAGE_1, "res32x32", HANDLE_USER_P0));
- bmp = pfdToBitmap(
- mLauncherApps.getShortcutIconFd(CALLING_PACKAGE_1, "bmp32x32", HANDLE_USER_P0));
- assertBitmapSize(128, 128, bmp);
-
- // TODO Test the content URI case too.
- }
-
- private void checkShrinkBitmap(int expectedWidth, int expectedHeight, int resId, int maxSize) {
- assertBitmapSize(expectedWidth, expectedHeight,
- ShortcutService.shrinkBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), resId),
- maxSize));
- }
-
- public void testShrinkBitmap() {
- checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32);
- checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511);
- checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512);
-
- checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4096);
- checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4100);
- checkShrinkBitmap(512, 2048, R.drawable.black_1024x4096, 2048);
-
- checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4096);
- checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4100);
- checkShrinkBitmap(2048, 512, R.drawable.black_4096x1024, 2048);
- }
-
- private File openIconFileForWriteAndGetPath(int userId, String packageName)
- throws IOException {
- // Shortcut IDs aren't used in the path, so just pass the same ID.
- final FileOutputStreamWithPath out =
- mService.openIconFileForWrite(userId, makePackageShortcut(packageName, "id"));
- out.close();
- return out.getFile();
- }
-
- public void testOpenIconFileForWrite() throws IOException {
- mInjectedCurrentTimeLillis = 1000;
-
- final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
- final File p10_1_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
-
- final File p10_2_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
- final File p10_2_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
-
- final File p11_1_1 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
- final File p11_1_2 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
-
- mInjectedCurrentTimeLillis++;
-
- final File p10_1_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
- final File p10_1_4 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
- final File p10_1_5 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
-
- final File p10_2_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
- final File p11_1_3 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
-
- // Make sure their paths are all unique
- assertAllUnique(list(
- p10_1_1,
- p10_1_2,
- p10_1_3,
- p10_1_4,
- p10_1_5,
-
- p10_2_1,
- p10_2_2,
- p10_2_3,
-
- p11_1_1,
- p11_1_2,
- p11_1_3
- ));
-
- // Check each set has the same parent.
- assertEquals(p10_1_1.getParent(), p10_1_2.getParent());
- assertEquals(p10_1_1.getParent(), p10_1_3.getParent());
- assertEquals(p10_1_1.getParent(), p10_1_4.getParent());
- assertEquals(p10_1_1.getParent(), p10_1_5.getParent());
-
- assertEquals(p10_2_1.getParent(), p10_2_2.getParent());
- assertEquals(p10_2_1.getParent(), p10_2_3.getParent());
-
- assertEquals(p11_1_1.getParent(), p11_1_2.getParent());
- assertEquals(p11_1_1.getParent(), p11_1_3.getParent());
-
- // Check the parents are still unique.
- assertAllUnique(list(
- p10_1_1.getParent(),
- p10_2_1.getParent(),
- p11_1_1.getParent()
- ));
-
- // All files created at the same time for the same package/user, expcet for the first ones,
- // will have "_" in the path.
- assertFalse(p10_1_1.getName().contains("_"));
- assertTrue(p10_1_2.getName().contains("_"));
- assertFalse(p10_1_3.getName().contains("_"));
- assertTrue(p10_1_4.getName().contains("_"));
- assertTrue(p10_1_5.getName().contains("_"));
-
- assertFalse(p10_2_1.getName().contains("_"));
- assertTrue(p10_2_2.getName().contains("_"));
- assertFalse(p10_2_3.getName().contains("_"));
-
- assertFalse(p11_1_1.getName().contains("_"));
- assertTrue(p11_1_2.getName().contains("_"));
- assertFalse(p11_1_3.getName().contains("_"));
- }
-
- public void testUpdateShortcuts() {
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"),
- makeShortcut("s2"),
- makeShortcut("s3"),
- makeShortcut("s4"),
- makeShortcut("s5")
- )));
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"),
- makeShortcut("s2"),
- makeShortcut("s3"),
- makeShortcut("s4"),
- makeShortcut("s5")
- )));
- });
- runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3"),
- getCallingUser());
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s4", "s5"),
- getCallingUser());
- });
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- mManager.removeDynamicShortcuts(list("s1"));
- mManager.removeDynamicShortcuts(list("s2"));
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- mManager.removeDynamicShortcuts(list("s1"));
- mManager.removeDynamicShortcuts(list("s3"));
- mManager.removeDynamicShortcuts(list("s5"));
- });
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- assertShortcutIds(assertAllDynamic(
- mManager.getDynamicShortcuts()),
- "s3", "s4", "s5");
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s2", "s3");
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- assertShortcutIds(assertAllDynamic(
- mManager.getDynamicShortcuts()),
- "s2", "s4");
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s4", "s5");
- });
-
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- ShortcutInfo s2 = makeShortcutBuilder()
- .setId("s2")
- .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32))
- .build();
-
- ShortcutInfo s4 = makeShortcutBuilder()
- .setId("s4")
- .setTitle("new title")
- .build();
-
- mManager.updateShortcuts(list(s2, s4));
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- ShortcutInfo s2 = makeShortcutBuilder()
- .setId("s2")
- .setIntent(makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
- "key1", "val1"))
- .build();
-
- ShortcutInfo s4 = makeShortcutBuilder()
- .setId("s4")
- .setIntent(new Intent(Intent.ACTION_ALL_APPS))
- .build();
-
- mManager.updateShortcuts(list(s2, s4));
- });
-
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- assertShortcutIds(assertAllDynamic(
- mManager.getDynamicShortcuts()),
- "s3", "s4", "s5");
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s2", "s3");
-
- ShortcutInfo s = getCallerShortcut("s2");
- assertTrue(s.hasIconResource());
- assertEquals(R.drawable.black_32x32, s.getIconResourceId());
- assertEquals("Title-s2", s.getTitle());
-
- s = getCallerShortcut("s4");
- assertFalse(s.hasIconResource());
- assertEquals(0, s.getIconResourceId());
- assertEquals("new title", s.getTitle());
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- assertShortcutIds(assertAllDynamic(
- mManager.getDynamicShortcuts()),
- "s2", "s4");
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s4", "s5");
-
- ShortcutInfo s = getCallerShortcut("s2");
- assertFalse(s.hasIconResource());
- assertEquals(0, s.getIconResourceId());
- assertEquals("Title-s2", s.getTitle());
- assertEquals(Intent.ACTION_ANSWER, s.getIntent().getAction());
- assertEquals(1, s.getIntent().getExtras().size());
-
- s = getCallerShortcut("s4");
- assertFalse(s.hasIconResource());
- assertEquals(0, s.getIconResourceId());
- assertEquals("Title-s4", s.getTitle());
- assertEquals(Intent.ACTION_ALL_APPS, s.getIntent().getAction());
- assertBundleEmpty(s.getIntent().getExtras());
- });
- // TODO Check with other fields too.
-
- // TODO Check bitmap removal too.
-
- runWithCaller(CALLING_PACKAGE_2, USER_11, () -> {
- mManager.updateShortcuts(list());
- });
- }
-
- // === Test for launcher side APIs ===
-
- private static ShortcutQuery buildQuery(long changedSince,
- String packageName, ComponentName componentName,
- /* @ShortcutQuery.QueryFlags */ int flags) {
- return buildQuery(changedSince, packageName, null, componentName, flags);
- }
-
- private static ShortcutQuery buildQuery(long changedSince,
- String packageName, List<String> shortcutIds, ComponentName componentName,
- /* @ShortcutQuery.QueryFlags */ int flags) {
- final ShortcutQuery q = new ShortcutQuery();
- q.setChangedSince(changedSince);
- q.setPackage(packageName);
- q.setShortcutIds(shortcutIds);
- q.setActivity(componentName);
- q.setQueryFlags(flags);
- return q;
- }
-
- private static ShortcutQuery buildAllQuery(String packageName) {
- final ShortcutQuery q = new ShortcutQuery();
- q.setPackage(packageName);
- q.setQueryFlags(ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED);
- return q;
- }
-
- private static ShortcutQuery buildPinnedQuery(String packageName) {
- final ShortcutQuery q = new ShortcutQuery();
- q.setPackage(packageName);
- q.setQueryFlags(ShortcutQuery.FLAG_GET_PINNED);
- return q;
- }
-
- public void testGetShortcuts() {
-
- // Set up shortcuts.
-
- setCaller(CALLING_PACKAGE_1);
- final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 5000);
- final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 1000);
-
- assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
-
- setCaller(CALLING_PACKAGE_2);
- final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
- final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
- final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
- assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
-
- setCaller(CALLING_PACKAGE_3);
- final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s3", START_TIME + 5000);
- assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
-
- setCaller(LAUNCHER_1);
-
- // Get dynamic
- assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s1", "s2"))));
-
- // Get pinned
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_PINNED), getCallingUser())
- /* none */);
-
- // Get both, with timestamp
- assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2,
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC),
- getCallingUser())),
- "s2", "s3"))));
-
- // FLAG_GET_KEY_FIELDS_ONLY
- assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2,
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
- getCallingUser())),
- "s2", "s3"))));
-
- // With ID.
- assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2, list("s3"),
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
- getCallingUser())),
- "s3"))));
- assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2, list("s3", "s2", "ss"),
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
- getCallingUser())),
- "s2", "s3"))));
- assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2, list("s3x", "s2x"),
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
- getCallingUser()))
- /* empty */))));
- assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2, list(),
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
- getCallingUser()))
- /* empty */))));
-
- // Pin some shortcuts.
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s3", "s4"), getCallingUser());
-
- // Pinned ones only
- assertAllPinned(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
- assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 1000, CALLING_PACKAGE_2,
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_PINNED),
- getCallingUser())),
- "s3"))));
-
- // All packages.
- assertShortcutIds(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 5000, /* package= */ null,
- /* activity =*/ null,
- ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED),
- getCallingUser())),
- "s1", "s3");
-
- assertExpectException(
- IllegalArgumentException.class, "package name must also be set", () -> {
- mLauncherApps.getShortcuts(buildQuery(
- /* time =*/ 0, /* package= */ null, list("id"),
- /* activity =*/ null, /* flags */ 0), getCallingUser());
- });
-
- // TODO More tests: pinned but dynamic, filter by activity
- }
-
- public void testGetShortcutInfo() {
- // Create shortcuts.
- setCaller(CALLING_PACKAGE_1);
- final ShortcutInfo s1_1 = makeShortcut(
- "s1",
- "Title 1",
- makeComponent(ShortcutActivity.class),
- /* icon =*/ null,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
-
- final ShortcutInfo s1_2 = makeShortcut(
- "s2",
- "Title 2",
- /* activity */ null,
- /* icon =*/ null,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
-
- assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
- dumpsysOnLogcat();
-
- setCaller(CALLING_PACKAGE_2);
- final ShortcutInfo s2_1 = makeShortcut(
- "s1",
- "ABC",
- makeComponent(ShortcutActivity2.class),
- /* icon =*/ null,
- makeIntent(Intent.ACTION_ANSWER, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
- assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
- dumpsysOnLogcat();
-
- // Pin some.
- setCaller(LAUNCHER_1);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s2"), getCallingUser());
-
- dumpsysOnLogcat();
-
- // Delete some.
- setCaller(CALLING_PACKAGE_1);
- assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
- mManager.removeDynamicShortcuts(list("s2"));
- assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
-
- dumpsysOnLogcat();
-
- setCaller(LAUNCHER_1);
- List<ShortcutInfo> list;
-
- // Note we don't guarantee the orders.
- list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
- assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
- list("s2", "s1", "s3", null), getCallingUser())))),
- "s1", "s2");
- assertEquals("Title 1", findById(list, "s1").getTitle());
- assertEquals("Title 2", findById(list, "s2").getTitle());
-
- assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
- mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
- list("s3"), getCallingUser())))
- /* none */);
-
- list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
- mLauncherApps.getShortcutInfo(CALLING_PACKAGE_2,
- list("s1", "s2", "s3"), getCallingUser()))),
- "s1");
- assertEquals("ABC", findById(list, "s1").getTitle());
- }
-
- public void testPinShortcutAndGetPinnedShortcuts() {
- // Create some shortcuts.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
- final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
-
- assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
- });
-
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
- final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
- final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
- assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
- });
-
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s2", 1000);
- assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
- });
-
- // Pin some.
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s2", "s3"), getCallingUser());
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s3", "s4", "s5"), getCallingUser());
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3,
- list("s3"), getCallingUser()); // Note ID doesn't exist
- });
-
- // Delete some.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
- mManager.removeDynamicShortcuts(list("s2"));
- assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
- });
-
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
- mManager.removeDynamicShortcuts(list("s3"));
- assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
- });
-
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
- mManager.removeDynamicShortcuts(list("s2"));
- assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
- });
-
- // Get pinned shortcuts from launcher
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists.
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s2");
-
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s3", "s4");
-
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_3,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
- /* none */);
- });
- }
-
- public void testPinShortcutAndGetPinnedShortcuts_multi() {
- // Create some shortcuts.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
-
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
-
- dumpsysOnLogcat();
-
- // Pin some.
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s3", "s4"), getCallingUser());
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s1", "s2", "s4"), getCallingUser());
- });
-
- dumpsysOnLogcat();
-
- // Delete some.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
- mManager.removeDynamicShortcuts(list("s3"));
- assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
- });
-
- dumpsysOnLogcat();
-
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
- mManager.removeDynamicShortcuts(list("s1"));
- mManager.removeDynamicShortcuts(list("s3"));
- assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
- });
-
- dumpsysOnLogcat();
-
- // Get pinned shortcuts from launcher
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s3");
-
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s1", "s2");
-
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s1", "s2", "s3");
-
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s1", "s2");
- });
-
- dumpsysOnLogcat();
-
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- // Launcher2 still has no pinned ones.
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
- /* none */);
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
- /* none */);
-
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s1", "s2");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s2");
-
- // Now pin some.
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s1", "s2"), getCallingUser());
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s1", "s2"), getCallingUser());
-
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s1", "s2");
-
- // S1 was not visible to it, so shouldn't be pinned.
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s2");
- });
-
- // Re-initialize and load from the files.
- mService.saveDirtyInfo();
- initService();
-
- // Load from file.
- mService.handleUnlockUser(USER_0);
-
- // Make sure package info is restored too.
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s3");
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s1", "s2");
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s1", "s2");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
- | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
- "s2");
- });
-
- // Delete all dynamic.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- mManager.removeAllDynamicShortcuts();
-
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- mManager.removeAllDynamicShortcuts();
-
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2", "s1");
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s3");
-
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s1", "s2");
-
- // from all packages.
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, null,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s1", "s2", "s3");
-
- // Update pined. Note s2 and s3 are actually available, but not visible to this
- // launcher, so still can't be pinned.
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
- getCallingUser());
-
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s3");
- });
- // Re-publish s1.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("s1"))));
-
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
- });
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s3");
-
- // Now "s1" is visible, so can be pinned.
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
- getCallingUser());
-
- assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
- "s1", "s3");
- });
-
- // Now clear pinned shortcuts. First, from launcher 1.
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
-
- assertEquals(0,
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
- assertEquals(0,
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2");
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2");
- });
-
- // Clear all pins from launcher 2.
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
-
- assertEquals(0,
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
- assertEquals(0,
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
- }
-
- public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() {
- // Create some shortcuts.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
- makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
- });
-
- // Pin some shortcuts and see the result.
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s1"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s1", "s2", "s3"), HANDLE_USER_0);
- });
-
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s2"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s2", "s3"), HANDLE_USER_0);
- });
-
- runWithCaller(LAUNCHER_2, USER_P0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s3"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s3"), HANDLE_USER_0);
- });
-
- runWithCaller(LAUNCHER_2, USER_10, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s1", "s2", "s3"), HANDLE_USER_10);
- });
-
- // Cross profile pinning.
- final int PIN_AND_DYNAMIC = ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC;
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s2");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_2, USER_P0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_2, USER_10, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
- "s1", "s2", "s3", "s4", "s5", "s6");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
- "s1", "s2", "s3", "s4", "s5", "s6");
- });
-
- // Remove some dynamic shortcuts.
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"))));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"))));
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s2");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_2, USER_P0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s3");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_2, USER_10, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
- "s1", "s2", "s3");
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
-
- // Save & load and make sure we still have the same information.
- mService.saveDirtyInfo();
- initService();
- mService.handleUnlockUser(USER_0);
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s2");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s2", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- runWithCaller(LAUNCHER_2, USER_P0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s3");
-
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
- "s3");
- assertShortcutIds(assertAllDynamic(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllDynamicOrPinned(
- mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
- /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
- "s1", "s3");
-
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
-
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
- assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
- assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
-
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
- assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
- });
- }
-
- public void testStartShortcut() {
- // Create some shortcuts.
- setCaller(CALLING_PACKAGE_1);
- final ShortcutInfo s1_1 = makeShortcut(
- "s1",
- "Title 1",
- makeComponent(ShortcutActivity.class),
- /* icon =*/ null,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
-
- final ShortcutInfo s1_2 = makeShortcut(
- "s2",
- "Title 2",
- /* activity */ null,
- /* icon =*/ null,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
-
- assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
-
- setCaller(CALLING_PACKAGE_2);
- final ShortcutInfo s2_1 = makeShortcut(
- "s1",
- "ABC",
- makeComponent(ShortcutActivity.class),
- /* icon =*/ null,
- makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
- assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
-
- // Pin all.
- setCaller(LAUNCHER_1);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s1", "s2"), getCallingUser());
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s1"), getCallingUser());
-
- // Just to make it complicated, delete some.
- setCaller(CALLING_PACKAGE_1);
- mManager.removeDynamicShortcuts(list("s2"));
-
- // intent and check.
- setCaller(LAUNCHER_1);
-
- Intent intent;
- intent = launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s1", USER_0);
- assertEquals(ShortcutActivity2.class.getName(), intent.getComponent().getClassName());
-
-
- intent = launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s2", USER_0);
- assertEquals(ShortcutActivity3.class.getName(), intent.getComponent().getClassName());
-
- intent = launchShortcutAndGetIntent(CALLING_PACKAGE_2, "s1", USER_0);
- assertEquals(ShortcutActivity.class.getName(), intent.getComponent().getClassName());
-
- // TODO Check extra, etc
- }
-
- public void testLauncherCallback() throws Throwable {
- LauncherApps.Callback c0 = mock(LauncherApps.Callback.class);
-
- // Set listeners
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.registerCallback(c0, new Handler(Looper.getMainLooper()));
- });
-
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
-
- waitOnMainThread();
- ArgumentCaptor<List> shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
- "s1", "s2", "s3");
-
- // From different package.
- reset(c0);
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- waitOnMainThread();
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_2),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
- "s1", "s2", "s3");
-
- // Different user, callback shouldn't be called.
- reset(c0);
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- waitOnMainThread();
- verify(c0, times(0)).onShortcutsChanged(
- anyString(),
- any(List.class),
- any(UserHandle.class)
- );
-
- // Test for addDynamicShortcuts.
- reset(c0);
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- dumpsysOnLogcat("before addDynamicShortcuts");
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("s4"))));
- });
-
- waitOnMainThread();
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
- "s1", "s2", "s3", "s4");
-
- // Test for remove
- reset(c0);
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- mManager.removeDynamicShortcuts(list("s1"));
- });
-
- waitOnMainThread();
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
- "s2", "s3", "s4");
-
- // Test for update
- reset(c0);
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- assertTrue(mManager.updateShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"))));
- });
-
- waitOnMainThread();
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
- "s2", "s3", "s4");
-
- // Test for deleteAll
- reset(c0);
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- mManager.removeAllDynamicShortcuts();
- });
-
- waitOnMainThread();
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertEquals(0, shortcuts.getValue().size());
-
- // Remove CALLING_PACKAGE_2
- reset(c0);
- uninstallPackage(USER_0, CALLING_PACKAGE_2);
- mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_0, USER_0);
-
- // Should get a callback with an empty list.
- waitOnMainThread();
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_2),
- shortcuts.capture(),
- eq(HANDLE_USER_0)
- );
- assertEquals(0, shortcuts.getValue().size());
- }
-
- public void testLauncherCallback_crossProfile() throws Throwable {
- prepareCrossProfileDataSet();
-
- final Handler h = new Handler(Looper.getMainLooper());
-
- final LauncherApps.Callback c0_1 = mock(LauncherApps.Callback.class);
- final LauncherApps.Callback c0_2 = mock(LauncherApps.Callback.class);
- final LauncherApps.Callback c0_3 = mock(LauncherApps.Callback.class);
- final LauncherApps.Callback c0_4 = mock(LauncherApps.Callback.class);
-
- final LauncherApps.Callback cP0_1 = mock(LauncherApps.Callback.class);
- final LauncherApps.Callback c10_1 = mock(LauncherApps.Callback.class);
- final LauncherApps.Callback c10_2 = mock(LauncherApps.Callback.class);
- final LauncherApps.Callback c11_1 = mock(LauncherApps.Callback.class);
-
- final List<LauncherApps.Callback> all =
- list(c0_1, c0_2, c0_3, c0_4, cP0_1, c10_1, c11_1);
-
- setDefaultLauncherChecker((pkg, userId) -> {
- switch (userId) {
- case USER_0:
- return LAUNCHER_2.equals(pkg);
- case USER_P0:
- return LAUNCHER_1.equals(pkg);
- case USER_10:
- return LAUNCHER_1.equals(pkg);
- case USER_11:
- return LAUNCHER_1.equals(pkg);
- default:
- return false;
- }
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> mLauncherApps.registerCallback(c0_1, h));
- runWithCaller(LAUNCHER_2, USER_0, () -> mLauncherApps.registerCallback(c0_2, h));
- runWithCaller(LAUNCHER_3, USER_0, () -> mLauncherApps.registerCallback(c0_3, h));
- runWithCaller(LAUNCHER_4, USER_0, () -> mLauncherApps.registerCallback(c0_4, h));
- runWithCaller(LAUNCHER_1, USER_P0, () -> mLauncherApps.registerCallback(cP0_1, h));
- runWithCaller(LAUNCHER_1, USER_10, () -> mLauncherApps.registerCallback(c10_1, h));
- runWithCaller(LAUNCHER_2, USER_10, () -> mLauncherApps.registerCallback(c10_2, h));
- runWithCaller(LAUNCHER_1, USER_11, () -> mLauncherApps.registerCallback(c11_1, h));
-
- // User 0.
-
- resetAll(all);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- mManager.removeDynamicShortcuts(list());
- });
- waitOnMainThread();
-
- assertCallbackNotReceived(c0_1);
- assertCallbackNotReceived(c0_3);
- assertCallbackNotReceived(c0_4);
- assertCallbackNotReceived(c10_1);
- assertCallbackNotReceived(c10_2);
- assertCallbackNotReceived(c11_1);
- assertCallbackReceived(c0_2, HANDLE_USER_0, CALLING_PACKAGE_1, "s1", "s2", "s3");
- assertCallbackReceived(cP0_1, HANDLE_USER_0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s4");
-
- // User 0, different package.
-
- resetAll(all);
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- mManager.removeDynamicShortcuts(list());
- });
- waitOnMainThread();
-
- assertCallbackNotReceived(c0_1);
- assertCallbackNotReceived(c0_3);
- assertCallbackNotReceived(c0_4);
- assertCallbackNotReceived(c10_1);
- assertCallbackNotReceived(c10_2);
- assertCallbackNotReceived(c11_1);
- assertCallbackReceived(c0_2, HANDLE_USER_0, CALLING_PACKAGE_3, "s1", "s2", "s3", "s4");
- assertCallbackReceived(cP0_1, HANDLE_USER_0, CALLING_PACKAGE_3,
- "s1", "s2", "s3", "s4", "s5", "s6");
-
- // Work profile, but not running, so don't send notifications.
-
- resetAll(all);
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- mManager.removeDynamicShortcuts(list());
- });
- waitOnMainThread();
-
- assertCallbackNotReceived(c0_1);
- assertCallbackNotReceived(c0_2);
- assertCallbackNotReceived(c0_3);
- assertCallbackNotReceived(c0_4);
- assertCallbackNotReceived(cP0_1);
- assertCallbackNotReceived(c10_1);
- assertCallbackNotReceived(c10_2);
- assertCallbackNotReceived(c11_1);
-
- // Work profile, now running.
-
- when(mMockUserManager.isUserRunning(anyInt())).thenReturn(false);
- when(mMockUserManager.isUserRunning(eq(USER_P0))).thenReturn(true);
-
- resetAll(all);
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- mManager.removeDynamicShortcuts(list());
- });
- waitOnMainThread();
-
- assertCallbackNotReceived(c0_1);
- assertCallbackNotReceived(c0_3);
- assertCallbackNotReceived(c0_4);
- assertCallbackNotReceived(c10_1);
- assertCallbackNotReceived(c10_2);
- assertCallbackNotReceived(c11_1);
- assertCallbackReceived(c0_2, HANDLE_USER_P0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s5");
- assertCallbackReceived(cP0_1, HANDLE_USER_P0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s4");
-
- // Normal secondary user.
-
- when(mMockUserManager.isUserRunning(anyInt())).thenReturn(false);
- when(mMockUserManager.isUserRunning(eq(USER_10))).thenReturn(true);
-
- resetAll(all);
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- mManager.removeDynamicShortcuts(list());
- });
- waitOnMainThread();
-
- assertCallbackNotReceived(c0_1);
- assertCallbackNotReceived(c0_2);
- assertCallbackNotReceived(c0_3);
- assertCallbackNotReceived(c0_4);
- assertCallbackNotReceived(cP0_1);
- assertCallbackNotReceived(c10_2);
- assertCallbackNotReceived(c11_1);
- assertCallbackReceived(c10_1, HANDLE_USER_10, CALLING_PACKAGE_1,
- "x1", "x2", "x3", "x4", "x5");
- }
-
- // === Test for persisting ===
-
- public void testSaveAndLoadUser_empty() {
- assertTrue(mManager.setDynamicShortcuts(list()));
-
- Log.i(TAG, "Saved state");
- dumpsysOnLogcat();
- dumpUserFile(0);
-
- // Restore.
- mService.saveDirtyInfo();
- initService();
-
- assertEquals(0, mManager.getDynamicShortcuts().size());
- }
-
- /**
- * Try save and load, also stop/start the user.
- */
- public void testSaveAndLoadUser() {
- // First, create some shortcuts and save.
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16);
- final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.icon2));
-
- final ShortcutInfo si1 = makeShortcut(
- "s1",
- "title1-1",
- makeComponent(ShortcutActivity.class),
- icon1,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
-
- final ShortcutInfo si2 = makeShortcut(
- "s2",
- "title1-2",
- /* activity */ null,
- icon2,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
-
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
-
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
- assertEquals(2, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_16x64);
- final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.icon2));
-
- final ShortcutInfo si1 = makeShortcut(
- "s1",
- "title2-1",
- makeComponent(ShortcutActivity.class),
- icon1,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
-
- final ShortcutInfo si2 = makeShortcut(
- "s2",
- "title2-2",
- /* activity */ null,
- icon2,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
-
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
-
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
- assertEquals(2, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
- final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.icon2));
-
- final ShortcutInfo si1 = makeShortcut(
- "s1",
- "title10-1-1",
- makeComponent(ShortcutActivity.class),
- icon1,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
- "key1", "val1", "nest", makeBundle("key", 123)),
- /* weight */ 10);
-
- final ShortcutInfo si2 = makeShortcut(
- "s2",
- "title10-1-2",
- /* activity */ null,
- icon2,
- makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
- /* weight */ 12);
-
- assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
-
- assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
- assertEquals(2, mManager.getRemainingCallCount());
- });
-
- mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM).setLauncherComponent(
- mService, new ComponentName("pkg1", "class"));
-
- // Restore.
- mService.saveDirtyInfo();
- initService();
-
- // Before the load, the map should be empty.
- assertEquals(0, mService.getShortcutsForTest().size());
-
- // this will pre-load the per-user info.
- mService.handleUnlockUser(UserHandle.USER_SYSTEM);
-
- // Now it's loaded.
- assertEquals(1, mService.getShortcutsForTest().size());
-
- runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
- assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
- mManager.getDynamicShortcuts()))), "s1", "s2");
- assertEquals(2, mManager.getRemainingCallCount());
-
- assertEquals("title1-1", getCallerShortcut("s1").getTitle());
- assertEquals("title1-2", getCallerShortcut("s2").getTitle());
- });
- runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
- assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
- mManager.getDynamicShortcuts()))), "s1", "s2");
- assertEquals(2, mManager.getRemainingCallCount());
-
- assertEquals("title2-1", getCallerShortcut("s1").getTitle());
- assertEquals("title2-2", getCallerShortcut("s2").getTitle());
- });
-
- assertEquals("pkg1", mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM)
- .getLauncherComponent().getPackageName());
-
- // Start another user
- mService.handleUnlockUser(USER_10);
-
- // Now the size is 2.
- assertEquals(2, mService.getShortcutsForTest().size());
-
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
- mManager.getDynamicShortcuts()))), "s1", "s2");
- assertEquals(2, mManager.getRemainingCallCount());
-
- assertEquals("title10-1-1", getCallerShortcut("s1").getTitle());
- assertEquals("title10-1-2", getCallerShortcut("s2").getTitle());
- });
- assertNull(mService.getShortcutsForTest().get(USER_10).getLauncherComponent());
-
- // Try stopping the user
- mService.handleCleanupUser(USER_10);
-
- // Now it's unloaded.
- assertEquals(1, mService.getShortcutsForTest().size());
-
- // TODO Check all other fields
- }
-
- public void testCleanupPackage() {
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s0_1"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s0_2"))));
- });
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
- HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
- HANDLE_USER_0);
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
- HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
- HANDLE_USER_0);
- });
-
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s10_1"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s10_2"))));
- });
- runWithCaller(LAUNCHER_1, USER_10, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
- HANDLE_USER_10);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
- HANDLE_USER_10);
- });
- runWithCaller(LAUNCHER_2, USER_10, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
- HANDLE_USER_10);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
- HANDLE_USER_10);
- });
-
- // Remove all dynamic shortcuts; now all shortcuts are just pinned.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- mManager.removeAllDynamicShortcuts();
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- mManager.removeAllDynamicShortcuts();
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- mManager.removeAllDynamicShortcuts();
- });
- runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
- mManager.removeAllDynamicShortcuts();
- });
-
-
- final SparseArray<ShortcutUser> users = mService.getShortcutsForTest();
- assertEquals(2, users.size());
- assertEquals(USER_0, users.keyAt(0));
- assertEquals(USER_10, users.keyAt(1));
-
- final ShortcutUser user0 = users.get(USER_0);
- final ShortcutUser user10 = users.get(USER_10);
-
-
- // Check the registered packages.
- dumpsysOnLogcat();
- assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_1),
- PackageWithUser.of(USER_10, LAUNCHER_2)),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_1", "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_1", "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
- "s10_1", "s10_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
- "s10_1", "s10_2");
- assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
-
- // Nonexistent package.
- uninstallPackage(USER_0, "abc");
- mService.cleanUpPackageLocked("abc", USER_0, USER_0);
-
- // No changes.
- assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_1),
- PackageWithUser.of(USER_10, LAUNCHER_2)),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_1", "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_1", "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
- "s10_1", "s10_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
- "s10_1", "s10_2");
- assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
-
- // Remove a package.
- uninstallPackage(USER_0, CALLING_PACKAGE_1);
- mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_0, USER_0);
-
- assertEquals(set(CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_1),
- PackageWithUser.of(USER_10, LAUNCHER_2)),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
- "s10_1", "s10_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
- "s10_1", "s10_2");
- assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
-
- // Remove a launcher.
- uninstallPackage(USER_10, LAUNCHER_1);
- mService.cleanUpPackageLocked(LAUNCHER_1, USER_10, USER_10);
-
- assertEquals(set(CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_2)),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
- "s10_1", "s10_2");
- assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
-
- // Remove a package.
- uninstallPackage(USER_10, CALLING_PACKAGE_2);
- mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_10, USER_10);
-
- assertEquals(set(CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(CALLING_PACKAGE_1),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_2)),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
- "s10_1");
- assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
-
- // Remove the other launcher from user 10 too.
- uninstallPackage(USER_10, LAUNCHER_2);
- mService.cleanUpPackageLocked(LAUNCHER_2, USER_10, USER_10);
-
- assertEquals(set(CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(CALLING_PACKAGE_1),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(
- set(),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_2");
-
- // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
- assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
-
- // More remove.
- uninstallPackage(USER_10, CALLING_PACKAGE_1);
- mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_10, USER_10);
-
- assertEquals(set(CALLING_PACKAGE_2),
- hashSet(user0.getAllPackagesForTest().keySet()));
- assertEquals(set(),
- hashSet(user10.getAllPackagesForTest().keySet()));
- assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
- hashSet(user0.getAllLaunchersForTest().keySet()));
- assertEquals(set(),
- hashSet(user10.getAllLaunchersForTest().keySet()));
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
- "s0_2");
- assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
- "s0_2");
-
- // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
- assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
- assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
- assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
- assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
-
- mService.saveDirtyInfo();
- }
-
- public void testHandleGonePackage_crossProfile() {
- // Create some shortcuts.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- // Pin some.
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s1"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s2"), UserHandle.of(USER_P0));
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s3"), HANDLE_USER_0);
- });
-
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s2"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s3"), UserHandle.of(USER_P0));
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
- list("s1"), HANDLE_USER_0);
- });
-
- runWithCaller(LAUNCHER_1, USER_10, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("s3"), HANDLE_USER_10);
- });
-
- // Check the state.
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- // Make sure all the information is persisted.
- mService.saveDirtyInfo();
- initService();
- mService.handleUnlockUser(USER_0);
- mService.handleUnlockUser(USER_P0);
- mService.handleUnlockUser(USER_10);
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- // Start uninstalling.
- uninstallPackage(USER_10, LAUNCHER_1);
- mService.checkPackageChanges(USER_10);
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- // Uninstall.
- uninstallPackage(USER_10, CALLING_PACKAGE_1);
- mService.checkPackageChanges(USER_10);
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- uninstallPackage(USER_P0, LAUNCHER_1);
- mService.checkPackageChanges(USER_0);
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- mService.checkPackageChanges(USER_P0);
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- uninstallPackage(USER_P0, CALLING_PACKAGE_1);
-
- mService.saveDirtyInfo();
- initService();
- mService.handleUnlockUser(USER_0);
- mService.handleUnlockUser(USER_P0);
- mService.handleUnlockUser(USER_10);
-
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- // Uninstall
- uninstallPackage(USER_0, LAUNCHER_1);
-
- mService.saveDirtyInfo();
- initService();
- mService.handleUnlockUser(USER_0);
- mService.handleUnlockUser(USER_P0);
- mService.handleUnlockUser(USER_10);
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
-
- uninstallPackage(USER_0, CALLING_PACKAGE_2);
-
- mService.saveDirtyInfo();
- initService();
- mService.handleUnlockUser(USER_0);
- mService.handleUnlockUser(USER_P0);
- mService.handleUnlockUser(USER_10);
-
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
- assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
- assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
-
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
- assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
- }
-
- private void checkCanRestoreTo(boolean expected, ShortcutPackageInfo spi,
- int version, String... signatures) {
- assertEquals(expected, spi.canRestoreTo(mService, genPackage(
- "dummy", /* uid */ 0, version, signatures)));
- }
-
- public void testCanRestoreTo() {
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1");
- addPackage(CALLING_PACKAGE_2, CALLING_UID_1, 10, "sig1", "sig2");
-
- final ShortcutPackageInfo spi1 = ShortcutPackageInfo.generateForInstalledPackage(
- mService, CALLING_PACKAGE_1, USER_0);
- final ShortcutPackageInfo spi2 = ShortcutPackageInfo.generateForInstalledPackage(
- mService, CALLING_PACKAGE_2, USER_0);
-
- checkCanRestoreTo(true, spi1, 10, "sig1");
- checkCanRestoreTo(true, spi1, 10, "x", "sig1");
- checkCanRestoreTo(true, spi1, 10, "sig1", "y");
- checkCanRestoreTo(true, spi1, 10, "x", "sig1", "y");
- checkCanRestoreTo(true, spi1, 11, "sig1");
-
- checkCanRestoreTo(false, spi1, 10 /* empty */);
- checkCanRestoreTo(false, spi1, 10, "x");
- checkCanRestoreTo(false, spi1, 10, "x", "y");
- checkCanRestoreTo(false, spi1, 10, "x");
- checkCanRestoreTo(false, spi1, 9, "sig1");
-
- checkCanRestoreTo(true, spi2, 10, "sig1", "sig2");
- checkCanRestoreTo(true, spi2, 10, "sig2", "sig1");
- checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2");
- checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1");
- checkCanRestoreTo(true, spi2, 10, "sig1", "sig2", "y");
- checkCanRestoreTo(true, spi2, 10, "sig2", "sig1", "y");
- checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2", "y");
- checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1", "y");
- checkCanRestoreTo(true, spi2, 11, "x", "sig2", "sig1", "y");
-
- checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x");
- checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x");
- checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2");
- checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1");
- checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x", "y");
- checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x", "y");
- checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2", "y");
- checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1", "y");
- checkCanRestoreTo(false, spi2, 11, "x", "sig2x", "sig1", "y");
- }
-
- private boolean bitmapDirectoryExists(String packageName, int userId) {
- final File path = new File(mService.getUserBitmapFilePath(userId), packageName);
- return path.isDirectory();
- }
-
- public void testHandlePackageDelete() {
- final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_32x32));
- setCaller(CALLING_PACKAGE_1, USER_0);
- assertTrue(mManager.addDynamicShortcuts(list(
- makeShortcutWithIcon("s1", bmp32x32), makeShortcutWithIcon("s2", bmp32x32)
- )));
-
- setCaller(CALLING_PACKAGE_2, USER_0);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_3, USER_0);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_1, USER_10);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_2, USER_10);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_3, USER_10);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
-
- uninstallPackage(USER_0, CALLING_PACKAGE_1);
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageDeleteIntent(CALLING_PACKAGE_1, USER_0));
-
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
-
- uninstallPackage(USER_10, CALLING_PACKAGE_2);
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageDeleteIntent(CALLING_PACKAGE_2, USER_10));
-
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
-
- mInjectedPackages.remove(CALLING_PACKAGE_1);
- mInjectedPackages.remove(CALLING_PACKAGE_3);
-
- mService.handleUnlockUser(USER_0);
-
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
-
- mService.handleUnlockUser(USER_10);
-
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
- }
-
- /** Almost ame as testHandlePackageDelete, except it doesn't uninstall packages. */
- public void testHandlePackageClearData() {
- final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_32x32));
- setCaller(CALLING_PACKAGE_1, USER_0);
- assertTrue(mManager.addDynamicShortcuts(list(
- makeShortcutWithIcon("s1", bmp32x32), makeShortcutWithIcon("s2", bmp32x32)
- )));
-
- setCaller(CALLING_PACKAGE_2, USER_0);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_3, USER_0);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_1, USER_10);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_2, USER_10);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- setCaller(CALLING_PACKAGE_3, USER_10);
- assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
-
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
-
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageDataClear(CALLING_PACKAGE_1, USER_0));
-
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
-
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageDataClear(CALLING_PACKAGE_2, USER_10));
-
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
- assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
-
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
- assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
- assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
- }
-
- public void testHandlePackageUpdate() throws Throwable {
-
- // Set up shortcuts and launchers.
-
- final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
- final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_32x32));
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"),
- makeShortcutWithIcon("s2", res32x32),
- makeShortcutWithIcon("s3", res32x32),
- makeShortcutWithIcon("s4", bmp32x32))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"),
- makeShortcutWithIcon("s2", bmp32x32))));
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithIcon("s1", res32x32))));
- });
-
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithIcon("s1", res32x32),
- makeShortcutWithIcon("s2", res32x32))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithIcon("s1", bmp32x32),
- makeShortcutWithIcon("s2", bmp32x32))));
- });
-
- LauncherApps.Callback c0 = mock(LauncherApps.Callback.class);
- LauncherApps.Callback c10 = mock(LauncherApps.Callback.class);
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.registerCallback(c0, new Handler(Looper.getMainLooper()));
- });
- runWithCaller(LAUNCHER_1, USER_10, () -> {
- mLauncherApps.registerCallback(c10, new Handler(Looper.getMainLooper()));
- });
-
- mInjectedCurrentTimeLillis = START_TIME + 100;
-
- ArgumentCaptor<List> shortcuts;
-
- // First, call the event without updating the versions.
- reset(c0);
- reset(c10);
-
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageUpdateIntent(CALLING_PACKAGE_1, USER_10));
-
- waitOnMainThread();
-
- // Version not changed, so no callback.
- verify(c0, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- any(List.class),
- any(UserHandle.class));
- verify(c10, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- any(List.class),
- any(UserHandle.class));
-
- // Next, update the version info for package 1.
- reset(c0);
- reset(c10);
- updatePackageVersion(CALLING_PACKAGE_1, 1);
-
- // Then send the broadcast, to only user-0.
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
-
- waitOnMainThread();
-
- // User-0 should get the notification.
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_0));
-
- // User-10 shouldn't yet get the notification.
- verify(c10, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- any(List.class),
- any(UserHandle.class));
- assertShortcutIds(shortcuts.getValue(), "s1", "s2", "s3", "s4");
- assertEquals(START_TIME,
- findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
- assertEquals(START_TIME + 100,
- findShortcut(shortcuts.getValue(), "s2").getLastChangedTimestamp());
- assertEquals(START_TIME + 100,
- findShortcut(shortcuts.getValue(), "s3").getLastChangedTimestamp());
- assertEquals(START_TIME,
- findShortcut(shortcuts.getValue(), "s4").getLastChangedTimestamp());
-
- // Next, send unlock even on user-10. Now we scan packages on this user and send a
- // notification to the launcher.
- mInjectedCurrentTimeLillis = START_TIME + 200;
-
- when(mMockUserManager.isUserRunning(eq(USER_10))).thenReturn(true);
-
- reset(c0);
- reset(c10);
- mService.handleUnlockUser(USER_10);
-
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- any(List.class),
- any(UserHandle.class));
-
- verify(c10).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- shortcuts.capture(),
- eq(HANDLE_USER_10));
-
- assertShortcutIds(shortcuts.getValue(), "s1", "s2");
- assertEquals(START_TIME + 200,
- findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
- assertEquals(START_TIME + 200,
- findShortcut(shortcuts.getValue(), "s2").getLastChangedTimestamp());
-
-
- // Do the same thing for package 2, which doesn't have resource icons.
- mInjectedCurrentTimeLillis = START_TIME + 300;
-
- reset(c0);
- reset(c10);
- updatePackageVersion(CALLING_PACKAGE_2, 10);
-
- // Then send the broadcast, to only user-0.
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageUpdateIntent(CALLING_PACKAGE_2, USER_0));
- mService.handleUnlockUser(USER_10);
-
- waitOnMainThread();
-
- verify(c0, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- any(List.class),
- any(UserHandle.class));
-
- verify(c10, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_1),
- any(List.class),
- any(UserHandle.class));
-
- // Do the same thing for package 3
- mInjectedCurrentTimeLillis = START_TIME + 400;
-
- reset(c0);
- reset(c10);
- updatePackageVersion(CALLING_PACKAGE_3, 100);
-
- // Then send the broadcast, to only user-0.
- mService.mPackageMonitor.onReceive(getTestContext(),
- genPackageUpdateIntent(CALLING_PACKAGE_3, USER_0));
- mService.handleUnlockUser(USER_10);
-
- waitOnMainThread();
-
- shortcuts = ArgumentCaptor.forClass(List.class);
- verify(c0).onShortcutsChanged(
- eq(CALLING_PACKAGE_3),
- shortcuts.capture(),
- eq(HANDLE_USER_0));
-
- // User 10 doesn't have package 3, so no callback.
- verify(c10, times(0)).onShortcutsChanged(
- eq(CALLING_PACKAGE_3),
- any(List.class),
- any(UserHandle.class));
-
- assertShortcutIds(shortcuts.getValue(), "s1");
- assertEquals(START_TIME + 400,
- findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
- }
-
- private void backupAndRestore() {
- int prevUid = mInjectedCallingUid;
-
- mInjectedCallingUid = Process.SYSTEM_UID; // Only system can call it.
-
- dumpsysOnLogcat("Before backup");
-
- final byte[] payload = mService.getBackupPayload(USER_0);
- if (ENABLE_DUMP) {
- final String xml = new String(payload);
- Log.i(TAG, "Backup payload:");
- for (String line : xml.split("\n")) {
- Log.i(TAG, line);
- }
- }
-
- // Before doing anything else, uninstall all packages.
- for (int userId : list(USER_0, USER_P0)) {
- for (String pkg : list(CALLING_PACKAGE_1, CALLING_PACKAGE_2, CALLING_PACKAGE_3,
- LAUNCHER_1, LAUNCHER_2, LAUNCHER_3)) {
- uninstallPackage(userId, pkg);
- }
- }
-
- shutdownServices();
-
- deleteAllSavedFiles();
-
- initService();
- mService.applyRestore(payload, USER_0);
-
- // handleUnlockUser will perform the gone package check, but it shouldn't remove
- // shadow information.
- mService.handleUnlockUser(USER_0);
-
- dumpsysOnLogcat("After restore");
-
- mInjectedCallingUid = prevUid;
- }
-
- private void prepareCrossProfileDataSet() {
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
- makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
- makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
- makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list()));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
- makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("x1"), makeShortcut("x2"), makeShortcut("x3"),
- makeShortcut("x4"), makeShortcut("x5"), makeShortcut("x6"))));
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s1", "s2"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s1", "s2", "s3"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s4"), HANDLE_USER_P0);
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s2", "s3"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s2", "s3", "s4"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s5"), HANDLE_USER_P0);
- });
- runWithCaller(LAUNCHER_3, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s3", "s4"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s3", "s4", "s5"), HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3", "s6"), HANDLE_USER_P0);
- });
- runWithCaller(LAUNCHER_4, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list(), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_4, list(), HANDLE_USER_0);
- });
-
- // Launcher on a managed profile is referring ot user 0!
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3", "s4"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s3", "s4", "s5"), HANDLE_USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s3", "s4", "s5", "s6"),
- HANDLE_USER_0);
-
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s4", "s1"), HANDLE_USER_P0);
- });
- runWithCaller(LAUNCHER_1, USER_10, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("x4", "x5"), HANDLE_USER_10);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("x4", "x5", "x6"), HANDLE_USER_10);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("x4", "x5", "x6", "x1"),
- HANDLE_USER_10);
- });
-
- // Then remove some dynamic shortcuts.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list()));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("x1"), makeShortcut("x2"), makeShortcut("x3"))));
- });
- }
-
- private void prepareForBackupTest() {
-
- prepareCrossProfileDataSet();
-
- backupAndRestore();
- }
-
- private void assertExistsAndShadow(ShortcutPackageItem spi) {
- assertNotNull(spi);
- assertTrue(spi.getPackageInfo().isShadow());
- }
-
- /**
- * Make sure the backup data doesn't have the following information:
- * - Launchers on other users.
- * - Non-backup app information.
- *
- * But restores all other infomation.
- *
- * It also omits the following pieces of information, but that's tested in
- * {@link #testShortcutInfoSaveAndLoad_forBackup}.
- * - Unpinned dynamic shortcuts
- * - Bitmaps
- */
- public void testBackupAndRestore() {
- prepareForBackupTest();
-
- checkBackupAndRestore_success();
- }
-
- public void testBackupAndRestore_backupRestoreTwice() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- dumpsysOnLogcat("Before second backup");
-
- backupAndRestore();
-
- dumpsysOnLogcat("After second backup");
-
- checkBackupAndRestore_success();
- }
-
- public void testBackupAndRestore_backupRestoreMultiple() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- // This also shouldn't affect the result.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
- makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
- });
-
- backupAndRestore();
-
- checkBackupAndRestore_success();
- }
-
- public void testBackupAndRestore_restoreToNewVersion() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2);
- addPackage(LAUNCHER_1, LAUNCHER_UID_1, 5);
-
- checkBackupAndRestore_success();
- }
-
- public void testBackupAndRestore_restoreToSuperSetSignatures() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- // Change package signatures.
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1, "sigx", CALLING_PACKAGE_1);
- addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4, LAUNCHER_1, "sigy");
-
- checkBackupAndRestore_success();
- }
-
- private void checkBackupAndRestore_success() {
- // Make sure non-system user is not restored.
- final ShortcutUser userP0 = mService.getUserShortcutsLocked(USER_P0);
- assertEquals(0, userP0.getAllPackagesForTest().size());
- assertEquals(0, userP0.getAllLaunchersForTest().size());
-
- // Make sure only "allowBackup" apps are restored, and are shadow.
- final ShortcutUser user0 = mService.getUserShortcutsLocked(USER_0);
- assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_1));
- assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_2));
- assertExistsAndShadow(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_1)));
- assertExistsAndShadow(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_2)));
-
- assertNull(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
- assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
- assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
-
- installPackage(USER_0, CALLING_PACKAGE_1);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2");
- });
-
- installPackage(USER_0, LAUNCHER_1);
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
- /* empty, not restored */ );
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty, not restored */ );
-
- assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
- });
-
- installPackage(USER_0, CALLING_PACKAGE_2);
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2", "s3");
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s1", "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty, not restored */ );
-
- assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
- });
-
- // 3 shouldn't be backed up, so no pinned shortcuts.
- installPackage(USER_0, CALLING_PACKAGE_3);
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- // Launcher on a different profile shouldn't be restored.
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- assertEquals(0,
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)
- .size());
- assertEquals(0,
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)
- .size());
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* wasn't restored, so still empty */ );
- });
-
- // Package on a different profile, no restore.
- installPackage(USER_P0, CALLING_PACKAGE_1);
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- // Restore launcher 2 on user 0.
- installPackage(USER_0, LAUNCHER_2);
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
- "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* wasn't restored, so still empty */ );
-
- assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
- });
-
-
- // Restoration of launcher2 shouldn't affect other packages; so do the same checks and
- // make sure they still have the same result.
- installPackage(USER_0, CALLING_PACKAGE_1);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2");
- });
-
- installPackage(USER_0, LAUNCHER_1);
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
- "s1");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s1", "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* wasn't restored, so still empty */ );
-
- assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
- });
-
- installPackage(USER_0, CALLING_PACKAGE_2);
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2", "s3");
- });
- }
-
- public void testBackupAndRestore_publisherLowerVersion() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 0); // Lower version
-
- checkBackupAndRestore_publisherNotRestored();
- }
-
- public void testBackupAndRestore_publisherWrongSignature() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature
-
- checkBackupAndRestore_publisherNotRestored();
- }
-
- public void testBackupAndRestore_publisherNoLongerBackupTarget() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- updatePackageInfo(CALLING_PACKAGE_1,
- pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
-
- checkBackupAndRestore_publisherNotRestored();
- }
-
- private void checkBackupAndRestore_publisherNotRestored() {
- installPackage(USER_0, CALLING_PACKAGE_1);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- installPackage(USER_0, CALLING_PACKAGE_2);
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2", "s3");
- });
-
- installPackage(USER_0, LAUNCHER_1);
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s1", "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- installPackage(USER_0, LAUNCHER_2);
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
-
- installPackage(USER_0, CALLING_PACKAGE_3);
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s1", "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- }
-
- public void testBackupAndRestore_launcherLowerVersion() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version
-
- checkBackupAndRestore_launcherNotRestored();
- }
-
- public void testBackupAndRestore_launcherWrongSignature() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature
-
- checkBackupAndRestore_launcherNotRestored();
- }
-
- public void testBackupAndRestore_launcherNoLongerBackupTarget() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- updatePackageInfo(LAUNCHER_1,
- pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
-
- checkBackupAndRestore_launcherNotRestored();
- }
-
- private void checkBackupAndRestore_launcherNotRestored() {
- installPackage(USER_0, CALLING_PACKAGE_1);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
-
- // s1 was pinned by launcher 1, which is not restored, yet, so we still see "s1" here.
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2");
- });
-
- installPackage(USER_0, CALLING_PACKAGE_2);
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2", "s3");
- });
-
- // Now we try to restore launcher 1. Then we realize it's not restorable, so L1 has no pinned
- // shortcuts.
- installPackage(USER_0, LAUNCHER_1);
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
-
- // Now CALLING_PACKAGE_1 realizes "s1" is no longer pinned.
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s2");
- });
-
- installPackage(USER_0, LAUNCHER_2);
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
- "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
-
- installPackage(USER_0, CALLING_PACKAGE_3);
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
- "s2");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- }
-
- public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() {
- prepareForBackupTest();
-
- // Note doing a backup & restore again here shouldn't affect the result.
- backupAndRestore();
-
- updatePackageInfo(CALLING_PACKAGE_1,
- pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
-
- updatePackageInfo(LAUNCHER_1,
- pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
-
- checkBackupAndRestore_publisherAndLauncherNotRestored();
- }
-
- private void checkBackupAndRestore_publisherAndLauncherNotRestored() {
- installPackage(USER_0, CALLING_PACKAGE_1);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- installPackage(USER_0, CALLING_PACKAGE_2);
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s1", "s2", "s3");
- });
-
- installPackage(USER_0, LAUNCHER_1);
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- installPackage(USER_0, LAUNCHER_2);
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
-
- // Because launcher 1 wasn't restored, "s1" is no longer pinned.
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertShortcutIds(assertAllPinned(
- mManager.getPinnedShortcuts()),
- "s2", "s3");
- });
-
- installPackage(USER_0, CALLING_PACKAGE_3);
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(0, mManager.getDynamicShortcuts().size());
- assertEquals(0, mManager.getPinnedShortcuts().size());
- });
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
- /* empty */);
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
- "s2", "s3");
- assertShortcutIds(assertAllPinned(
- mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
- /* empty */);
- });
- }
-
- public void testSaveAndLoad_crossProfile() {
- prepareCrossProfileDataSet();
-
- dumpsysOnLogcat("Before save & load");
-
- mService.saveDirtyInfo();
- initService();
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
- "s1", "s2", "s3", "s4");
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
- "s1", "s2", "s3", "s4", "s5");
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
- "s1", "s2", "s3", "s4", "s5", "s6");
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
- /* empty */);
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
- /* empty */);
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
- "s1", "s2", "s3");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
- "s1", "s2", "s3", "s4", "s5", "s6");
- });
- runWithCaller(CALLING_PACKAGE_2, USER_P0, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
- /* empty */);
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
- /* empty */);
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
- "x1", "x2", "x3");
- assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
- "x4", "x5");
- });
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
- "s1");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
- "s1", "s2");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
- "s1", "s2", "s3");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
- "s1", "s4");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
- /* empty */);
- assertExpectException(
- SecurityException.class, "", () -> {
- mLauncherApps.getShortcuts(
- buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
- });
- });
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
- "s2");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
- "s2", "s3");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
- "s2", "s3", "s4");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
- "s2", "s5");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
- /* empty */);
- });
- runWithCaller(LAUNCHER_3, USER_0, () -> {
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
- "s3");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
- "s3", "s4");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
- "s3", "s4", "s5");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
- "s3", "s6");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
- /* empty */);
- });
- runWithCaller(LAUNCHER_4, USER_0, () -> {
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
- /* empty */);
- });
- runWithCaller(LAUNCHER_1, USER_P0, () -> {
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
- "s3", "s4");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
- "s3", "s4", "s5");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
- "s3", "s4", "s5", "s6");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
- "s1", "s4");
- assertExpectException(
- SecurityException.class, "unrelated profile", () -> {
- mLauncherApps.getShortcuts(
- buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
- });
- });
- runWithCaller(LAUNCHER_1, USER_10, () -> {
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_10),
- "x4", "x5");
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_10)
- /* empty */);
- assertShortcutIds(
- mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_10)
- /* empty */);
- assertExpectException(
- SecurityException.class, "unrelated profile", () -> {
- mLauncherApps.getShortcuts(
- buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0);
- });
- assertExpectException(
- SecurityException.class, "unrelated profile", () -> {
- mLauncherApps.getShortcuts(
- buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_P0);
- });
- });
- }
-
- public void testThrottling_localeChanges() {
- prepareCrossProfileDataSet();
-
- dumpsysOnLogcat("Before save & load");
-
- mService.saveDirtyInfo();
- initService();
-
- final long origSequenceNumber = mService.getLocaleChangeSequenceNumber();
-
- mInternal.onSystemLocaleChangedNoLock();
-
- assertEquals(origSequenceNumber + 1, mService.getLocaleChangeSequenceNumber());
-
- // Note at this point only user-0 is loaded, and the counters are reset for this user,
- // but it will work for other users too, because we persist when
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
-
- mService.saveDirtyInfo();
- initService();
-
- // Make sure the counter is persisted.
- assertEquals(origSequenceNumber + 1, mService.getLocaleChangeSequenceNumber());
- }
-
- public void testThrottling_foreground() throws Exception {
- prepareCrossProfileDataSet();
-
- dumpsysOnLogcat("Before save & load");
-
- mService.saveDirtyInfo();
- initService();
-
- // We need to update the current time from time to time, since some of the internal checks
- // rely on the time being correctly incremented.
- mInjectedCurrentTimeLillis++;
-
- // First, all packages have less than 3 (== initial value) remaining calls.
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mInjectedCurrentTimeLillis++;
-
- // State changed, but not foreground, so no resetting.
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mInjectedCurrentTimeLillis++;
-
- // State changed, package1 foreground, reset.
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
-
- mInjectedCurrentTimeLillis++;
-
- // Different app comes to foreground briefly, and goes back to background.
- // Now, make sure package 2's counter is reset, even in this case.
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mInjectedCurrentTimeLillis++;
-
- // Do the same thing one more time. This would catch the bug with mixuing up
- // the current time and the elapsed time.
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- mManager.updateShortcuts(list(makeShortcut("s")));
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
- mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mInjectedCurrentTimeLillis++;
-
- // Package 1 on user-10 comes to foreground.
- // Now, also try calling some APIs and make sure foreground apps don't get throttled.
- mService.mUidObserver.onUidStateChanged(
- UserHandle.getUid(USER_10, CALLING_UID_1),
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
-
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
-
- assertEquals(0, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
-
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
-
- assertEquals(0, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
-
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
-
- assertEquals(0, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
-
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
-
- assertEquals(0, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
-
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
-
- assertEquals(0, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
-
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
- mManager.setDynamicShortcuts(list(makeShortcut("s")));
-
- assertEquals(3, mManager.getRemainingCallCount()); // Still 3!
- });
- }
-
-
- public void testThrottling_resetByInternalCall() throws Exception {
- prepareCrossProfileDataSet();
-
- dumpsysOnLogcat("Before save & load");
-
- mService.saveDirtyInfo();
- initService();
-
- // First, all packages have less than 3 (== initial value) remaining calls.
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- // Simulate a call from sys UI.
- mCallerPermissions.add(permission.RESET_SHORTCUT_MANAGER_THROTTLING);
- mService.onApplicationActive(CALLING_PACKAGE_1, USER_0);
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mService.onApplicationActive(CALLING_PACKAGE_3, USER_0);
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
-
- mService.onApplicationActive(CALLING_PACKAGE_1, USER_10);
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
- MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
- });
- runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
- assertEquals(3, mManager.getRemainingCallCount());
- });
- }
-
- public void testOnApplicationActive_permission() {
- assertExpectException(SecurityException.class, "Missing permission", () ->
- mService.onApplicationActive(CALLING_PACKAGE_1, USER_0));
-
- // Has permission, now it should pass.
- mCallerPermissions.add(permission.RESET_SHORTCUT_MANAGER_THROTTLING);
- mService.onApplicationActive(CALLING_PACKAGE_1, USER_0);
- }
-
- // ShortcutInfo tests
-
- public void testShortcutInfoMissingMandatoryFields() {
- assertExpectException(
- IllegalArgumentException.class,
- "ID must be provided",
- () -> new ShortcutInfo.Builder(getTestContext()).build());
- assertExpectException(
- IllegalArgumentException.class,
- "title must be provided",
- () -> new ShortcutInfo.Builder(getTestContext()).setId("id").build()
- .enforceMandatoryFields());
- assertExpectException(
- NullPointerException.class,
- "Intent must be provided",
- () -> new ShortcutInfo.Builder(getTestContext()).setId("id").setTitle("x").build()
- .enforceMandatoryFields());
- }
-
- public void testShortcutInfoParcel() {
- setCaller(CALLING_PACKAGE_1, USER_10);
- ShortcutInfo si = parceled(new ShortcutInfo.Builder(mClientContext)
- .setId("id")
- .setTitle("title")
- .setIntent(makeIntent("action", ShortcutActivity.class))
- .build());
- assertEquals(mClientContext.getPackageName(), si.getPackageName());
- assertEquals(USER_10, si.getUserId());
- assertEquals(HANDLE_USER_10, si.getUserHandle());
- assertEquals("id", si.getId());
- assertEquals("title", si.getTitle());
- assertEquals("action", si.getIntent().getAction());
-
- PersistableBundle pb = new PersistableBundle();
- pb.putInt("k", 1);
-
- si = new ShortcutInfo.Builder(getTestContext())
- .setId("id")
- .setActivityComponent(new ComponentName("a", "b"))
- .setIcon(Icon.createWithResource(mClientContext, 123))
- .setTitle("title")
- .setText("text")
- .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
- .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
- .setWeight(123)
- .setExtras(pb)
- .build();
- si.addFlags(ShortcutInfo.FLAG_PINNED);
- si.setBitmapPath("abc");
- si.setIconResourceId(456);
-
- si = parceled(si);
-
- assertEquals(getTestContext().getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
- assertEquals(123, si.getIcon().getResId());
- assertEquals("title", si.getTitle());
- assertEquals("text", si.getText());
- assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
- assertEquals("action", si.getIntent().getAction());
- assertEquals("val", si.getIntent().getStringExtra("key"));
- assertEquals(123, si.getWeight());
- assertEquals(1, si.getExtras().getInt("k"));
-
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
- assertEquals("abc", si.getBitmapPath());
- assertEquals(456, si.getIconResourceId());
- }
-
- public void testShortcutInfoClone() {
- setCaller(CALLING_PACKAGE_1, USER_11);
-
- PersistableBundle pb = new PersistableBundle();
- pb.putInt("k", 1);
- ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
- .setId("id")
- .setActivityComponent(new ComponentName("a", "b"))
- .setIcon(Icon.createWithResource(mClientContext, 123))
- .setTitle("title")
- .setText("text")
- .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
- .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
- .setWeight(123)
- .setExtras(pb)
- .build();
- sorig.addFlags(ShortcutInfo.FLAG_PINNED);
- sorig.setBitmapPath("abc");
- sorig.setIconResourceId(456);
-
- ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
-
- assertEquals(USER_11, si.getUserId());
- assertEquals(HANDLE_USER_11, si.getUserHandle());
- assertEquals(mClientContext.getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
- assertEquals(123, si.getIcon().getResId());
- assertEquals("title", si.getTitle());
- assertEquals("text", si.getText());
- assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
- assertEquals("action", si.getIntent().getAction());
- assertEquals("val", si.getIntent().getStringExtra("key"));
- assertEquals(123, si.getWeight());
- assertEquals(1, si.getExtras().getInt("k"));
-
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
- assertEquals("abc", si.getBitmapPath());
- assertEquals(456, si.getIconResourceId());
-
- si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
-
- assertEquals(mClientContext.getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
- assertEquals(null, si.getIcon());
- assertEquals("title", si.getTitle());
- assertEquals("text", si.getText());
- assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
- assertEquals("action", si.getIntent().getAction());
- assertEquals("val", si.getIntent().getStringExtra("key"));
- assertEquals(123, si.getWeight());
- assertEquals(1, si.getExtras().getInt("k"));
-
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
- assertEquals(null, si.getBitmapPath());
-
- assertEquals(456, si.getIconResourceId());
-
- si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
-
- assertEquals(mClientContext.getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
- assertEquals(null, si.getIcon());
- assertEquals("title", si.getTitle());
- assertEquals("text", si.getText());
- assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
- assertEquals(null, si.getIntent());
- assertEquals(123, si.getWeight());
- assertEquals(1, si.getExtras().getInt("k"));
-
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
- assertEquals(null, si.getBitmapPath());
-
- assertEquals(456, si.getIconResourceId());
-
- si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
-
- assertEquals(mClientContext.getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(null, si.getActivityComponent());
- assertEquals(null, si.getIcon());
- assertEquals(null, si.getTitle());
- assertEquals(null, si.getText());
- assertEquals(null, si.getCategories());
- assertEquals(null, si.getIntent());
- assertEquals(0, si.getWeight());
- assertEquals(null, si.getExtras());
-
- assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
- assertEquals(null, si.getBitmapPath());
-
- assertEquals(456, si.getIconResourceId());
- }
-
- public void testShortcutInfoClone_minimum() {
- PersistableBundle pb = new PersistableBundle();
- pb.putInt("k", 1);
- ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
- .setId("id")
- .setTitle("title")
- .setIntent(makeIntent("action", ShortcutActivity.class))
- .build();
- ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
-
- assertEquals(getTestContext().getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals("title", si.getTitle());
- assertEquals("action", si.getIntent().getAction());
- assertEquals(null, si.getCategories());
-
- si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
-
- assertEquals(getTestContext().getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals("title", si.getTitle());
- assertEquals("action", si.getIntent().getAction());
- assertEquals(null, si.getCategories());
-
- si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
-
- assertEquals(getTestContext().getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals("title", si.getTitle());
- assertEquals(null, si.getIntent());
- assertEquals(null, si.getCategories());
-
- si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
-
- assertEquals(getTestContext().getPackageName(), si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(null, si.getTitle());
- assertEquals(null, si.getIntent());
- assertEquals(null, si.getCategories());
- }
-
- public void testShortcutInfoCopyNonNullFieldsFrom() throws InterruptedException {
- PersistableBundle pb = new PersistableBundle();
- pb.putInt("k", 1);
- ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
- .setId("id")
- .setActivityComponent(new ComponentName("a", "b"))
- .setIcon(Icon.createWithResource(mClientContext, 123))
- .setTitle("title")
- .setText("text")
- .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
- .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
- .setWeight(123)
- .setExtras(pb)
- .build();
- sorig.addFlags(ShortcutInfo.FLAG_PINNED);
- sorig.setBitmapPath("abc");
- sorig.setIconResourceId(456);
-
- ShortcutInfo si;
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setActivityComponent(new ComponentName("x", "y")).build());
- assertEquals("text", si.getText());
- assertEquals(new ComponentName("x", "y"), si.getActivityComponent());
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setIcon(Icon.createWithResource(mClientContext, 456)).build());
- assertEquals("text", si.getText());
- assertEquals(456, si.getIcon().getResId());
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setTitle("xyz").build());
- assertEquals("text", si.getText());
- assertEquals("xyz", si.getTitle());
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setText("xxx").build());
- assertEquals(123, si.getWeight());
- assertEquals("xxx", si.getText());
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setCategories(set()).build());
- assertEquals("text", si.getText());
- assertEquals(set(), si.getCategories());
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setCategories(set("x")).build());
- assertEquals("text", si.getText());
- assertEquals(set("x"), si.getCategories());
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setIntent(makeIntent("action2", ShortcutActivity.class)).build());
- assertEquals("text", si.getText());
- assertEquals("action2", si.getIntent().getAction());
- assertEquals(null, si.getIntent().getStringExtra("key"));
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setIntent(makeIntent("action3", ShortcutActivity.class, "key", "x")).build());
- assertEquals("text", si.getText());
- assertEquals("action3", si.getIntent().getAction());
- assertEquals("x", si.getIntent().getStringExtra("key"));
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setWeight(999).build());
- assertEquals("text", si.getText());
- assertEquals(999, si.getWeight());
-
-
- PersistableBundle pb2 = new PersistableBundle();
- pb2.putInt("x", 99);
-
- si = sorig.clone(/* flags=*/ 0);
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setExtras(pb2).build());
- assertEquals("text", si.getText());
- assertEquals(99, si.getExtras().getInt("x"));
-
- // Make sure the timestamp gets updated too.
-
- final long timestamp = si.getLastChangedTimestamp();
- Thread.sleep(2);
-
- si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
- .setTitle("xyz").build());
-
- assertTrue(si.getLastChangedTimestamp() > timestamp);
- }
-
- public void testShortcutInfoSaveAndLoad() throws InterruptedException {
- setCaller(CALLING_PACKAGE_1, USER_10);
-
- final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_32x32));
-
- PersistableBundle pb = new PersistableBundle();
- pb.putInt("k", 1);
- ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
- .setId("id")
- .setActivityComponent(new ComponentName(mClientContext, ShortcutActivity2.class))
- .setIcon(bmp32x32)
- .setTitle("title")
- .setText("text")
- .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
- .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
- .setWeight(123)
- .setExtras(pb)
- .build();
-
- mManager.addDynamicShortcuts(list(sorig));
-
- Thread.sleep(2);
- final long now = System.currentTimeMillis();
-
- // Save and load.
- mService.saveDirtyInfo();
- initService();
- mService.handleUnlockUser(USER_10);
-
- ShortcutInfo si;
- si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10);
-
- assertEquals(USER_10, si.getUserId());
- assertEquals(HANDLE_USER_10, si.getUserHandle());
- assertEquals(CALLING_PACKAGE_1, si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(ShortcutActivity2.class.getName(), si.getActivityComponent().getClassName());
- assertEquals(null, si.getIcon());
- assertEquals("title", si.getTitle());
- assertEquals("text", si.getText());
- assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
- assertEquals("action", si.getIntent().getAction());
- assertEquals("val", si.getIntent().getStringExtra("key"));
- assertEquals(123, si.getWeight());
- assertEquals(1, si.getExtras().getInt("k"));
-
- assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_FILE, si.getFlags());
- assertNotNull(si.getBitmapPath()); // Something should be set.
- assertEquals(0, si.getIconResourceId());
- assertTrue(si.getLastChangedTimestamp() < now);
- }
-
- public void testShortcutInfoSaveAndLoad_forBackup() {
- setCaller(CALLING_PACKAGE_1, USER_0);
-
- final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
- getTestContext().getResources(), R.drawable.black_32x32));
-
- PersistableBundle pb = new PersistableBundle();
- pb.putInt("k", 1);
- ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
- .setId("id")
- .setActivityComponent(new ComponentName(mClientContext, ShortcutActivity2.class))
- .setIcon(bmp32x32)
- .setTitle("title")
- .setText("text")
- .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
- .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
- .setWeight(123)
- .setExtras(pb)
- .build();
-
- mManager.addDynamicShortcuts(list(sorig));
-
- // Dynamic shortcuts won't be backed up, so we need to pin it.
- setCaller(LAUNCHER_1, USER_0);
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id"), HANDLE_USER_0);
-
- // Do backup & restore.
- backupAndRestore();
-
- mService.handleUnlockUser(USER_0); // Load user-0.
-
- ShortcutInfo si;
- si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
-
- assertEquals(CALLING_PACKAGE_1, si.getPackageName());
- assertEquals("id", si.getId());
- assertEquals(ShortcutActivity2.class.getName(), si.getActivityComponent().getClassName());
- assertEquals(null, si.getIcon());
- assertEquals("title", si.getTitle());
- assertEquals("text", si.getText());
- assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
- assertEquals("action", si.getIntent().getAction());
- assertEquals("val", si.getIntent().getStringExtra("key"));
- assertEquals(123, si.getWeight());
- assertEquals(1, si.getExtras().getInt("k"));
-
- assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
- assertNull(si.getBitmapPath()); // No icon.
- assertEquals(0, si.getIconResourceId());
- }
-
- public void testDumpsys_crossProfile() {
- prepareCrossProfileDataSet();
- dumpsysOnLogcat("test1", /* force= */ true);
- }
-
- public void testDumpsys_withIcons() throws IOException {
- testIcons();
- // Dump after having some icons.
- dumpsysOnLogcat("test1", /* force= */ true);
- }
-}
diff --git a/services/tests/shortcutmanagerutils/Android.mk b/services/tests/shortcutmanagerutils/Android.mk
deleted file mode 100644
index 701e05857142..000000000000
--- a/services/tests/shortcutmanagerutils/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, src)
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- mockito-target
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE := ShortcutManagerTestUtils
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
deleted file mode 100644
index ad49c2ff78e8..000000000000
--- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.server.pm.shortcutmanagertest;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyList;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.pm.LauncherApps;
-import android.content.pm.ShortcutInfo;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.BaseBundle;
-import android.os.Bundle;
-import android.os.ParcelFileDescriptor;
-import android.os.UserHandle;
-import android.test.MoreAsserts;
-import android.util.Log;
-
-import junit.framework.Assert;
-
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.mockito.Mockito;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BooleanSupplier;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-public class ShortcutManagerTestUtils {
- private static final String TAG = "ShortcutManagerUtils";
-
- private static final boolean ENABLE_DUMPSYS = true; // DO NOT SUBMIT WITH true
-
- private static final int STANDARD_TIMEOUT_SEC = 5;
-
- private ShortcutManagerTestUtils() {
- }
-
- private static List<String> readAll(ParcelFileDescriptor pfd) {
- try {
- try {
- final ArrayList<String> ret = new ArrayList<>();
- try (BufferedReader r = new BufferedReader(
- new FileReader(pfd.getFileDescriptor()))) {
- String line;
- while ((line = r.readLine()) != null) {
- ret.add(line);
- }
- r.readLine();
- }
- return ret;
- } finally {
- pfd.close();
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static String concatResult(List<String> result) {
- final StringBuilder sb = new StringBuilder();
- for (String s : result) {
- sb.append(s);
- sb.append("\n");
- }
- return sb.toString();
- }
-
- private static List<String> runCommand(Instrumentation instrumentation, String command) {
- return runCommand(instrumentation, command, null);
- }
- private static List<String> runCommand(Instrumentation instrumentation, String command,
- Predicate<List<String>> resultAsserter) {
- Log.d(TAG, "Running command: " + command);
- final List<String> result;
- try {
- result = readAll(
- instrumentation.getUiAutomation().executeShellCommand(command));
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- if (resultAsserter != null && !resultAsserter.test(result)) {
- fail("Command '" + command + "' failed, output was:\n" + concatResult(result));
- }
- return result;
- }
-
- private static void runCommandForNoOutput(Instrumentation instrumentation, String command) {
- runCommand(instrumentation, command, result -> result.size() == 0);
- }
-
- private static List<String> runShortcutCommand(Instrumentation instrumentation, String command,
- Predicate<List<String>> resultAsserter) {
- return runCommand(instrumentation, "cmd shortcut " + command, resultAsserter);
- }
-
- public static List<String> runShortcutCommandForSuccess(Instrumentation instrumentation,
- String command) {
- return runShortcutCommand(instrumentation, command, result -> result.contains("Success"));
- }
-
- public static String getDefaultLauncher(Instrumentation instrumentation) {
- final String PREFIX = "Launcher: ComponentInfo{";
- final String POSTFIX = "}";
- final List<String> result = runShortcutCommandForSuccess(
- instrumentation, "get-default-launcher");
- for (String s : result) {
- if (s.startsWith(PREFIX) && s.endsWith(POSTFIX)) {
- return s.substring(PREFIX.length(), s.length() - POSTFIX.length());
- }
- }
- fail("Default launcher not found");
- return null;
- }
-
- public static void setDefaultLauncher(Instrumentation instrumentation, String component) {
- runCommandForNoOutput(instrumentation, "cmd package set-home-activity " + component);
- }
-
- public static void setDefaultLauncher(Instrumentation instrumentation, Context packageContext) {
- setDefaultLauncher(instrumentation, packageContext.getPackageName()
- + "/android.content.pm.cts.shortcutmanager.packages.Launcher");
- }
-
- public static void overrideConfig(Instrumentation instrumentation, String config) {
- runShortcutCommandForSuccess(instrumentation, "override-config " + config);
- }
-
- public static void resetConfig(Instrumentation instrumentation) {
- runShortcutCommandForSuccess(instrumentation, "reset-config");
- }
-
- public static void resetThrottling(Instrumentation instrumentation) {
- runShortcutCommandForSuccess(instrumentation, "reset-throttling");
- }
-
- public static void resetAllThrottling(Instrumentation instrumentation) {
- runShortcutCommandForSuccess(instrumentation, "reset-all-throttling");
- }
-
- public static void clearShortcuts(Instrumentation instrumentation, int userId,
- String packageName) {
- runShortcutCommandForSuccess(instrumentation, "clear-shortcuts "
- + " --user " + userId + " " + packageName);
- }
-
- public static void dumpsysShortcut(Instrumentation instrumentation) {
- if (!ENABLE_DUMPSYS) {
- return;
- }
- for (String s : runCommand(instrumentation, "dumpsys shortcut")) {
- Log.e(TAG, s);
- }
- }
-
- public static Bundle makeBundle(Object... keysAndValues) {
- assertTrue((keysAndValues.length % 2) == 0);
-
- if (keysAndValues.length == 0) {
- return null;
- }
- final Bundle ret = new Bundle();
-
- for (int i = keysAndValues.length - 2; i >= 0; i -= 2) {
- final String key = keysAndValues[i].toString();
- final Object value = keysAndValues[i + 1];
-
- if (value == null) {
- ret.putString(key, null);
- } else if (value instanceof Integer) {
- ret.putInt(key, (Integer) value);
- } else if (value instanceof String) {
- ret.putString(key, (String) value);
- } else if (value instanceof Bundle) {
- ret.putBundle(key, (Bundle) value);
- } else {
- fail("Type not supported yet: " + value.getClass().getName());
- }
- }
- return ret;
- }
-
- public static <T> List<T> list(T... array) {
- return Arrays.asList(array);
- }
-
- public static <T> Set<T> hashSet(Set<T> in) {
- return new HashSet<T>(in);
- }
-
- public static <T> Set<T> set(T... values) {
- return set(v -> v, values);
- }
-
- public static <T, V> Set<T> set(Function<V, T> converter, V... values) {
- return set(converter, Arrays.asList(values));
- }
-
- public static <T, V> Set<T> set(Function<V, T> converter, List<V> values) {
- final HashSet<T> ret = new HashSet<>();
- for (V v : values) {
- ret.add(converter.apply(v));
- }
- return ret;
- }
-
- public static void resetAll(Collection<?> mocks) {
- for (Object o : mocks) {
- reset(o);
- }
- }
- public static void assertExpectException(Class<? extends Throwable> expectedExceptionType,
- String expectedExceptionMessageRegex, Runnable r) {
- assertExpectException("", expectedExceptionType, expectedExceptionMessageRegex, r);
- }
-
- public static void assertDynamicShortcutCountExceeded(Runnable r) {
- assertExpectException(IllegalArgumentException.class,
- "Max number of dynamic shortcuts exceeded", r);
- }
-
- public static void assertExpectException(String message,
- Class<? extends Throwable> expectedExceptionType,
- String expectedExceptionMessageRegex, Runnable r) {
- try {
- r.run();
- Assert.fail("Expected exception type " + expectedExceptionType.getName()
- + " was not thrown (message=" + message + ")");
- } catch (Throwable e) {
- Assert.assertTrue(
- "Expected exception type was " + expectedExceptionType.getName()
- + " but caught " + e + " (message=" + message + ")",
- expectedExceptionType.isAssignableFrom(e.getClass()));
- if (expectedExceptionMessageRegex != null) {
- MoreAsserts.assertContainsRegex(expectedExceptionMessageRegex, e.getMessage());
- }
- }
- }
-
- public static List<ShortcutInfo> assertShortcutIds(List<ShortcutInfo> actualShortcuts,
- String... expectedIds) {
- final HashSet<String> expected = new HashSet<>(list(expectedIds));
- final HashSet<String> actual = new HashSet<>();
- for (ShortcutInfo s : actualShortcuts) {
- actual.add(s.getId());
- }
-
- // Compare the sets.
- assertEquals(expected, actual);
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllHaveIntents(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertNotNull("ID " + s.getId(), s.getIntent());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllNotHaveIntents(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertNull("ID " + s.getId(), s.getIntent());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllHaveTitle(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertNotNull("ID " + s.getId(), s.getTitle());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllNotHaveTitle(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertNull("ID " + s.getId(), s.getTitle());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllHaveIconResId(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId() + " not have icon res ID", s.hasIconResource());
- assertFalse("ID " + s.getId() + " shouldn't have icon FD", s.hasIconFile());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllHaveIconFile(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertFalse("ID " + s.getId() + " shouldn't have icon res ID", s.hasIconResource());
- assertTrue("ID " + s.getId() + " not have icon FD", s.hasIconFile());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllHaveIcon(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId() + " has no icon ", s.hasIconFile() || s.hasIconResource());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllKeyFieldsOnly(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId(), s.hasKeyFieldsOnly());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllNotKeyFieldsOnly(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertFalse("ID " + s.getId(), s.hasKeyFieldsOnly());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllDynamic(List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId(), s.isDynamic());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllPinned(List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId(), s.isPinned());
- }
- return actualShortcuts;
- }
-
- public static List<ShortcutInfo> assertAllDynamicOrPinned(
- List<ShortcutInfo> actualShortcuts) {
- for (ShortcutInfo s : actualShortcuts) {
- assertTrue("ID " + s.getId(), s.isDynamic() || s.isPinned());
- }
- return actualShortcuts;
- }
-
- public static void assertDynamicOnly(ShortcutInfo si) {
- assertTrue(si.isDynamic());
- assertFalse(si.isPinned());
- }
-
- public static void assertPinnedOnly(ShortcutInfo si) {
- assertFalse(si.isDynamic());
- assertTrue(si.isPinned());
- }
-
- public static void assertDynamicAndPinned(ShortcutInfo si) {
- assertTrue(si.isDynamic());
- assertTrue(si.isPinned());
- }
-
- public static void assertBitmapSize(int expectedWidth, int expectedHeight, Bitmap bitmap) {
- assertEquals("width", expectedWidth, bitmap.getWidth());
- assertEquals("height", expectedHeight, bitmap.getHeight());
- }
-
- public static <T> void assertAllUnique(Collection<T> list) {
- final Set<Object> set = new HashSet<>();
- for (T item : list) {
- if (set.contains(item)) {
- fail("Duplicate item found: " + item + " (in the list: " + list + ")");
- }
- set.add(item);
- }
- }
-
- public static ShortcutInfo findShortcut(List<ShortcutInfo> list, String id) {
- for (ShortcutInfo si : list) {
- if (si.getId().equals(id)) {
- return si;
- }
- }
- fail("Shortcut " + id + " not found in the list");
- return null;
- }
-
- public static Bitmap pfdToBitmap(ParcelFileDescriptor pfd) {
- assertNotNull(pfd);
- try {
- try {
- return BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
- } finally {
- pfd.close();
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- public static void assertBundleEmpty(BaseBundle b) {
- assertTrue(b == null || b.size() == 0);
- }
-
- public static void assertCallbackNotReceived(LauncherApps.Callback mock) {
- verify(mock, times(0)).onShortcutsChanged(anyString(), anyList(),
- any(UserHandle.class));
- }
-
- public static void assertCallbackReceived(LauncherApps.Callback mock,
- UserHandle user, String packageName, String... ids) {
- verify(mock).onShortcutsChanged(eq(packageName), checkShortcutIds(ids),
- eq(user));
- }
-
- public static boolean checkAssertSuccess(Runnable r) {
- try {
- r.run();
- return true;
- } catch (AssertionError e) {
- return false;
- }
- }
-
- public static <T> T checkArgument(Predicate<T> checker, String description,
- List<T> matchedCaptor) {
- final Matcher<T> m = new BaseMatcher<T>() {
- @Override
- public boolean matches(Object item) {
- if (item == null) {
- return false;
- }
- final T value = (T) item;
- if (!checker.test(value)) {
- return false;
- }
-
- if (matchedCaptor != null) {
- matchedCaptor.add(value);
- }
- return true;
- }
-
- @Override
- public void describeTo(Description d) {
- d.appendText(description);
- }
- };
- return Mockito.argThat(m);
- }
-
- public static List<ShortcutInfo> checkShortcutIds(String... ids) {
- return checkArgument((List<ShortcutInfo> list) -> {
- final Set<String> actualSet = set(si -> si.getId(), list);
- return actualSet.equals(set(ids));
-
- }, "Shortcut IDs=[" + Arrays.toString(ids) + "]", null);
- }
-
- public static void waitUntil(String message, BooleanSupplier condition) {
- waitUntil(message, condition, STANDARD_TIMEOUT_SEC);
- }
-
- public static void waitUntil(String message, BooleanSupplier condition, int timeoutSeconds) {
- final long timeout = System.currentTimeMillis() + (timeoutSeconds * 1000L);
- while (System.currentTimeMillis() < timeout) {
- if (condition.getAsBoolean()) {
- return;
- }
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- fail("Timed out for: " + message);
- }
-}