Merge "Test for ShortcutManager.updateShortcuts(), also" into nyc-dev
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index 83a70cd..e41136c 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -160,10 +160,12 @@
         mIcon = b.mIcon;
         mTitle = b.mTitle;
         mIntent = b.mIntent;
-        final Bundle intentExtras = mIntent.getExtras();
-        if (intentExtras != null) {
-            mIntent.replaceExtras((Bundle) null);
-            mIntentPersistableExtras = new PersistableBundle(intentExtras);
+        if (mIntent != null) {
+            final Bundle intentExtras = mIntent.getExtras();
+            if (intentExtras != null) {
+                mIntent.replaceExtras((Bundle) null);
+                mIntentPersistableExtras = new PersistableBundle(intentExtras);
+            }
         }
         mWeight = b.mWeight;
         mExtras = b.mExtras;
@@ -194,6 +196,7 @@
 
             if ((cloneFlags & CLONE_REMOVE_ICON) == 0) {
                 mIcon = source.mIcon;
+                mBitmapPath = source.mBitmapPath;
             }
 
             mTitle = source.mTitle;
@@ -204,8 +207,6 @@
             mWeight = source.mWeight;
             mExtras = source.mExtras;
             mIconResourceId = source.mIconResourceId;
-            mBitmapPath = source.mBitmapPath;
-
         } else {
             // Set this bit.
             mFlags |= FLAG_KEY_FIELDS_ONLY;
@@ -231,9 +232,9 @@
      * @hide
      */
     public void copyNonNullFieldsFrom(ShortcutInfo source) {
-        Preconditions.checkState(mId == source.mId, "ID must match");
+        Preconditions.checkState(mId.equals(source.mId), "ID must match");
         Preconditions.checkState(mPackageName.equals(source.mPackageName),
-                "Package namae must match");
+                "Package name must match");
 
         if (source.mActivityComponent != null) {
             mActivityComponent = source.mActivityComponent;
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index e90fb32..ff6886c 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -51,6 +51,7 @@
 import android.util.Log;
 import android.util.Slog;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.util.Preconditions;
 import com.android.server.LocalServices;
@@ -76,6 +77,7 @@
         publishBinderService(Context.LAUNCHER_APPS_SERVICE, mLauncherAppsImpl);
     }
 
+    @VisibleForTesting
     static class LauncherAppsImpl extends ILauncherApps.Stub {
         private static final boolean DEBUG = false;
         private static final String TAG = "LauncherAppsService";
@@ -167,7 +169,8 @@
         /**
          * Checks if the caller is in the same group as the userToCheck.
          */
-        private void ensureInUserProfiles(UserHandle userToCheck, String message) {
+        @VisibleForTesting // We override it in unit tests
+        void ensureInUserProfiles(UserHandle userToCheck, String message) {
             final int callingUserId = UserHandle.getCallingUserId();
             final int targetUserId = userToCheck.getIdentifier();
 
@@ -187,7 +190,8 @@
             }
         }
 
-        private void verifyCallingPackage(String callingPackage) {
+        @VisibleForTesting // We override it in unit tests
+        void verifyCallingPackage(String callingPackage) {
             int packageUid = -1;
             try {
                 packageUid = mPm.getPackageUid(callingPackage,
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
index 2f4beaa..f2c42db 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
@@ -15,13 +15,18 @@
  */
 package com.android.server.pm;
 
+import static org.mockito.Mockito.mock;
+
 import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ILauncherApps;
+import android.content.pm.LauncherApps;
 import android.content.pm.LauncherApps.ShortcutQuery;
+import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
 import android.content.pm.ShortcutServiceInternal;
@@ -30,10 +35,12 @@
 import android.graphics.Bitmap.CompressFormat;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Icon;
+import android.os.BaseBundle;
 import android.os.Bundle;
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.test.AndroidTestCase;
 import android.test.mock.MockContext;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -43,6 +50,7 @@
 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;
 
@@ -75,7 +83,11 @@
  -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
 
  * TODO: Add checks with assertAllNotHaveIcon()
+ *
+ * TODO: separate, detailed tests for ShortcutInfo (CTS?) *
+ *
  * TODO: Cross-user test (do in CTS?)
+ *
  */
 @SmallTest
 public class ShortcutManagerTest extends AndroidTestCase {
@@ -87,11 +99,19 @@
      */
     private static final boolean ENABLE_DUMP = false; // DO NOT SUBMIT WITH true
 
-    /** Context used in the client side */
-    private final class ClientContext extends MockContext {
+    private class BaseContext extends MockContext {
         @Override
-        public String getPackageName() {
-            return mInjectedClientPackage;
+        public Object getSystemService(String name) {
+            switch (name) {
+                case Context.USER_SERVICE:
+                    return mMockUserManager;
+            }
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public PackageManager getPackageManager() {
+            return mMockPackageManager;
         }
 
         @Override
@@ -100,14 +120,18 @@
         }
     }
 
-    /** Context used in the service side */
-    private final class ServiceContext extends MockContext {
+    /** Context used in the client side */
+    private class ClientContext extends BaseContext {
         @Override
-        public Resources getResources() {
-            return ShortcutManagerTest.this.getContext().getResources();
+        public String getPackageName() {
+            return mInjectedClientPackage;
         }
     }
 
+    /** Context used in the service side */
+    private final class ServiceContext extends BaseContext {
+    }
+
     /** ShortcutService with injection override methods. */
     private final class ShortcutServiceTestable extends ShortcutService {
         public ShortcutServiceTestable(Context context) {
@@ -170,7 +194,7 @@
     }
 
     /** ShortcutManager with injection override methods. */
-    private final class ShortcutManagerTestable extends ShortcutManager {
+    private class ShortcutManagerTestable extends ShortcutManager {
         public ShortcutManagerTestable(Context context, ShortcutServiceTestable service) {
             super(context, service);
         }
@@ -181,6 +205,27 @@
         }
     }
 
+    private class LauncherAppImplTestable extends LauncherAppsImpl {
+        public LauncherAppImplTestable(Context context) {
+            super(context);
+        }
+
+        @Override
+        public void ensureInUserProfiles(UserHandle userToCheck, String message) {
+            // SKIP
+        }
+
+        @Override
+        public void verifyCallingPackage(String callingPackage) {
+            // SKIP
+        }
+    }
+
+    private class LauncherAppsTestable extends LauncherApps {
+        public LauncherAppsTestable(Context context, ILauncherApps service) {
+            super(context, service);
+        }
+    }
 
     public static class ShortcutActivity extends Activity {
     }
@@ -198,6 +243,9 @@
     private ShortcutManagerTestable mManager;
     private ShortcutServiceInternal mInternal;
 
+    private LauncherAppImplTestable mLauncherAppImpl;
+    private LauncherAppsTestable mLauncherApps;
+
     private File mInjectedFilePathRoot;
 
     private long mInjectedCurrentTimeLillis;
@@ -209,6 +257,9 @@
 
     private Map<String, Integer> mInjectedPackageUidMap;
 
+    private PackageManager mMockPackageManager;
+    private UserManager mMockUserManager;
+
     private static final String CALLING_PACKAGE_1 = "com.android.test.1";
     private static final int CALLING_UID_1 = 10001;
 
@@ -246,6 +297,9 @@
         mServiceContext = new ServiceContext();
         mClientContext = new ClientContext();
 
+        mMockPackageManager = mock(PackageManager.class);
+        mMockUserManager = mock(UserManager.class);
+
         // Prepare injection values.
 
         mInjectedCurrentTimeLillis = START_TIME;
@@ -280,6 +334,9 @@
 
         mInternal = LocalServices.getService(ShortcutServiceInternal.class);
 
+        mLauncherAppImpl = new LauncherAppImplTestable(mServiceContext);
+        mLauncherApps = new LauncherAppsTestable(mClientContext, mLauncherAppImpl);
+
         // Load the setting file.
         mService.onBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
     }
@@ -315,6 +372,10 @@
         return UserHandle.getUserId(mInjectedCallingUid);
     }
 
+    private UserHandle getCallingUser() {
+        return UserHandle.of(getCallingUserId());
+    }
+
     /** For debugging */
     private void dumpsysOnLogcat() {
         if (!ENABLE_DUMP) return;
@@ -434,7 +495,6 @@
         return s;
     }
 
-
     /**
      * Make multiple shortcuts with IDs.
      */
@@ -446,6 +506,10 @@
         return ret;
     }
 
+    private ShortcutInfo.Builder makeShortcutBuilder() {
+        return new ShortcutInfo.Builder(mClientContext);
+    }
+
     /**
      * Make a shortcut with details.
      */
@@ -663,6 +727,10 @@
         }
     }
 
+    private void assertBundleEmpty(BaseBundle b) {
+        assertTrue(b == null || b.size() == 0);
+    }
+
     private ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) {
         return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
     }
@@ -1132,65 +1200,61 @@
         setCaller(LAUNCHER_1);
 
         // Check hasIconResource()/hasIconFile().
-        assertShortcutIds(assertAllHaveIconResId(mInternal.getShortcutInfo(
-                getCallingPackage(), CALLING_PACKAGE_1, Arrays.asList("res32x32"),
-                getCallingUserId())), "res32x32");
+        assertShortcutIds(assertAllHaveIconResId(mLauncherApps.getShortcutInfo(
+                CALLING_PACKAGE_1, Arrays.asList("res32x32"),
+                getCallingUser())), "res32x32");
 
-        assertShortcutIds(assertAllHaveIconResId(mInternal.getShortcutInfo(
-                getCallingPackage(), CALLING_PACKAGE_1, Arrays.asList("res64x64"),
-                getCallingUserId())), "res64x64");
+        assertShortcutIds(assertAllHaveIconResId(mLauncherApps.getShortcutInfo(
+                CALLING_PACKAGE_1, Arrays.asList("res64x64"), getCallingUser())),
+                "res64x64");
 
-        assertShortcutIds(assertAllHaveIconFile(mInternal.getShortcutInfo(
-                getCallingPackage(), CALLING_PACKAGE_1, Arrays.asList("bmp32x32"),
-                getCallingUserId())), "bmp32x32");
-        assertShortcutIds(assertAllHaveIconFile(mInternal.getShortcutInfo(
-                getCallingPackage(), CALLING_PACKAGE_1, Arrays.asList("bmp64x64"),
-                getCallingUserId())), "bmp64x64");
-        assertShortcutIds(assertAllHaveIconFile(mInternal.getShortcutInfo(
-                getCallingPackage(), CALLING_PACKAGE_1, Arrays.asList("bmp512x512"),
-                getCallingUserId())), "bmp512x512");
+        assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
+                CALLING_PACKAGE_1, Arrays.asList("bmp32x32"), getCallingUser())),
+                "bmp32x32");
+
+        assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
+                CALLING_PACKAGE_1, Arrays.asList("bmp64x64"), getCallingUser())),
+                "bmp64x64");
+
+        assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
+                CALLING_PACKAGE_1, Arrays.asList("bmp512x512"), getCallingUser())),
+                "bmp512x512");
 
         // Check
         assertEquals(
                 R.drawable.black_32x32,
-                mInternal.getShortcutIconResId(getCallingPackage(),
-                        makePackageShortcut(CALLING_PACKAGE_1, "res32x32"), getCallingUserId()));
+                mLauncherApps.getShortcutIconResId(
+                        makePackageShortcut(CALLING_PACKAGE_1, "res32x32"), getCallingUser()));
 
         assertEquals(
                 R.drawable.black_64x64,
-                mInternal.getShortcutIconResId(
-                        getCallingPackage(),
-                        makePackageShortcut(CALLING_PACKAGE_1, "res64x64"), getCallingUserId()));
+                mLauncherApps.getShortcutIconResId(
+
+                        makePackageShortcut(CALLING_PACKAGE_1, "res64x64"), getCallingUser()));
 
         assertEquals(
                 0, // because it's not a resource
-                mInternal.getShortcutIconResId(
-                        getCallingPackage(),
-                        makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUserId()));
+                mLauncherApps.getShortcutIconResId(
+                        makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUser()));
         assertEquals(
                 0, // because it's not a resource
-                mInternal.getShortcutIconResId(
-                        getCallingPackage(),
-                        makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUserId()));
+                mLauncherApps.getShortcutIconResId(
+                        makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUser()));
         assertEquals(
                 0, // because it's not a resource
-                mInternal.getShortcutIconResId(
-                        getCallingPackage(),
-                        makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUserId()));
+                mLauncherApps.getShortcutIconResId(
+                        makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUser()));
 
-        bmp = pfdToBitmap(mInternal.getShortcutIconFd(
-                getCallingPackage(),
-                makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUserId()));
+        bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
+                makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUser()));
         assertBitmapSize(32, 32, bmp);
 
-        bmp = pfdToBitmap(mInternal.getShortcutIconFd(
-                getCallingPackage(),
-                makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUserId()));
+        bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
+                makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUser()));
         assertBitmapSize(64, 64, bmp);
 
-        bmp = pfdToBitmap(mInternal.getShortcutIconFd(
-                getCallingPackage(),
-                makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUserId()));
+        bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
+                makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUser()));
         assertBitmapSize(128, 128, bmp);
 
         // TODO Test the content URI case too.
@@ -1300,11 +1364,146 @@
         assertFalse(p11_1_3.getName().contains("_"));
     }
 
+    public void testUpdateShortcuts() {
+        runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
+            assertTrue(mManager.setDynamicShortcuts(Arrays.asList(
+                    makeShortcut("s1"),
+                    makeShortcut("s2"),
+                    makeShortcut("s3"),
+                    makeShortcut("s4"),
+                    makeShortcut("s5")
+            )));
+        });
+        runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
+            assertTrue(mManager.setDynamicShortcuts(Arrays.asList(
+                    makeShortcut("s1"),
+                    makeShortcut("s2"),
+                    makeShortcut("s3"),
+                    makeShortcut("s4"),
+                    makeShortcut("s5")
+            )));
+        });
+        runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
+            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, Arrays.asList("s2", "s3"),
+                    getCallingUser());
+            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, Arrays.asList("s4", "s5"),
+                    getCallingUser());
+        });
+        runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
+            mManager.deleteDynamicShortcut("s1");
+            mManager.deleteDynamicShortcut("s2");
+        });
+        runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
+            mManager.deleteDynamicShortcut("s1");
+            mManager.deleteDynamicShortcut("s3");
+            mManager.deleteDynamicShortcut("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(mContext, R.drawable.black_32x32))
+                    .build();
+
+            ShortcutInfo s4 = makeShortcutBuilder()
+                    .setId("s4")
+                    .setTitle("new title")
+                    .build();
+
+            mManager.updateShortcuts(Arrays.asList(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(Arrays.asList(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.
+    }
+
     // TODO: updateShortcuts()
     // TODO: getPinnedShortcuts()
 
     // === Test for launcher side APIs ===
 
+    private static ShortcutQuery buildQuery(long changedSince,
+            String packageName, ComponentName componentName,
+            /* @ShortcutQuery.QueryFlags */ int flags) {
+        final ShortcutQuery q = new ShortcutQuery();
+        q.setChangedSince(changedSince);
+        q.setPackage(packageName);
+        q.setActivity(componentName);
+        q.setQueryFlags(flags);
+        return q;
+    }
+
     public void testGetShortcuts() {
 
         // Set up shortcuts.
@@ -1330,56 +1529,55 @@
         // Get dynamic
         assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
                 assertAllNotKeyFieldsOnly(
-                mInternal.getShortcuts(getCallingPackage(), /* time =*/ 0, CALLING_PACKAGE_1,
-                        /* activity =*/ null,
-                    ShortcutQuery.FLAG_GET_DYNAMIC, getCallingUserId())),
+                mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
+                        /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
                 "s1", "s2"))));
 
         // Get pinned
         assertShortcutIds(
-                mInternal.getShortcuts(getCallingPackage(),  /* time =*/ 0, CALLING_PACKAGE_1,
+                mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
                         /* activity =*/ null,
-                        ShortcutQuery.FLAG_GET_PINNED, getCallingUserId())
+                        ShortcutQuery.FLAG_GET_PINNED), getCallingUser())
                 /* none */);
 
         // Get both, with timestamp
         assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
-                assertAllNotKeyFieldsOnly(mInternal.getShortcuts(getCallingPackage(),
+                assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
                         /* time =*/ 1000, CALLING_PACKAGE_2,
                         /* activity =*/ null,
-                        ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC,
-                        getCallingUserId())),
+                        ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC),
+                        getCallingUser())),
                 "s2", "s3"))));
 
         // FLAG_GET_KEY_FIELDS_ONLY
         assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
-                assertAllKeyFieldsOnly(mInternal.getShortcuts(getCallingPackage(),
+                assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
                         /* time =*/ 1000, CALLING_PACKAGE_2,
                         /* activity =*/ null,
-                        ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY,
-                        getCallingUserId())),
+                        ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
+                        getCallingUser())),
                 "s2", "s3"))));
 
         // Pin some shortcuts.
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_2,
-                Arrays.asList("s3", "s4"), getCallingUserId());
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
+                Arrays.asList("s3", "s4"), getCallingUser());
 
         // Pinned ones only
         assertAllPinned(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
-                assertAllNotKeyFieldsOnly(mInternal.getShortcuts(getCallingPackage(),
+                assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
                         /* time =*/ 1000, CALLING_PACKAGE_2,
                         /* activity =*/ null,
-                        ShortcutQuery.FLAG_GET_PINNED,
-                        getCallingUserId())),
+                        ShortcutQuery.FLAG_GET_PINNED),
+                        getCallingUser())),
                 "s3"))));
 
         // All packages.
         assertShortcutIds(assertAllNotKeyFieldsOnly(
-                mInternal.getShortcuts(getCallingPackage(),
+                mLauncherApps.getShortcuts(buildQuery(
                         /* time =*/ 5000, /* package= */ null,
                         /* activity =*/ null,
-                        ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED,
-                        getCallingUserId())),
+                        ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED),
+                        getCallingUser())),
                 "s1", "s3");
 
         // TODO More tests: pinned but dynamic, filter by activity
@@ -1423,8 +1621,8 @@
         // Pin some.
         setCaller(LAUNCHER_1);
 
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_1,
-                Arrays.asList("s2"), getCallingUserId());
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
+                Arrays.asList("s2"), getCallingUser());
 
         dumpsysOnLogcat();
 
@@ -1442,20 +1640,20 @@
         // Note we don't guarantee the orders.
         list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
                 assertAllNotKeyFieldsOnly(
-                mInternal.getShortcutInfo(getCallingPackage(), CALLING_PACKAGE_1,
-                Arrays.asList("s2", "s1", "s3", null), getCallingUserId())))),
+                mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
+                Arrays.asList("s2", "s1", "s3", null), getCallingUser())))),
                 "s1", "s2");
         assertEquals("Title 1", findById(list, "s1").getTitle());
         assertEquals("Title 2", findById(list, "s2").getTitle());
 
         assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
-                mInternal.getShortcutInfo(getCallingPackage(), CALLING_PACKAGE_1,
-                        Arrays.asList("s3"), getCallingUserId())))
+                mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
+                        Arrays.asList("s3"), getCallingUser())))
                 /* none */);
 
         list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
-                mInternal.getShortcutInfo(getCallingPackage(), CALLING_PACKAGE_2,
-                        Arrays.asList("s1", "s2", "s3"), getCallingUserId()))),
+                mLauncherApps.getShortcutInfo(CALLING_PACKAGE_2,
+                        Arrays.asList("s1", "s2", "s3"), getCallingUser()))),
                 "s1");
         assertEquals("ABC", findById(list, "s1").getTitle());
     }
@@ -1481,14 +1679,14 @@
         // Pin some.
         setCaller(LAUNCHER_1);
 
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_1,
-                Arrays.asList("s2", "s3"), getCallingUserId());
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
+                Arrays.asList("s2", "s3"), getCallingUser());
 
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_2,
-                Arrays.asList("s3", "s4", "s5"), getCallingUserId());
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
+                Arrays.asList("s3", "s4", "s5"), getCallingUser());
 
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_3,
-                Arrays.asList("s3"), getCallingUserId());  // Note ID doesn't exist
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_3,
+                Arrays.asList("s3"), getCallingUser());  // Note ID doesn't exist
 
         // Delete some.
         setCaller(CALLING_PACKAGE_1);
@@ -1511,18 +1709,18 @@
 
         // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists.
         assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
-                mInternal.getShortcuts(getCallingPackage(), /* time =*/ 0, CALLING_PACKAGE_1,
-                /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED, getCallingUserId()))),
+                mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
+                /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
                 "s2");
 
         assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
-                mInternal.getShortcuts(getCallingPackage(), /* time =*/ 0, CALLING_PACKAGE_2,
-                /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED, getCallingUserId()))),
+                mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
+                /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
                 "s3", "s4");
 
         assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
-                mInternal.getShortcuts(getCallingPackage(), /* time =*/ 0, CALLING_PACKAGE_3,
-                /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED, getCallingUserId())))
+                mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_3,
+                /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
                 /* none */);
     }
 
@@ -1561,11 +1759,11 @@
 
         // Pin all.
         setCaller(LAUNCHER_1);
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_1,
-                Arrays.asList("s1", "s2"), getCallingUserId());
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
+                Arrays.asList("s1", "s2"), getCallingUser());
 
-        mInternal.pinShortcuts(getCallingPackage(), CALLING_PACKAGE_2,
-                Arrays.asList("s1"), getCallingUserId());
+        mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
+                Arrays.asList("s1"), getCallingUser());
 
         // Just to make it complicated, delete some.
         setCaller(CALLING_PACKAGE_1);