Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.server.pm;
     17 
     18 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDisabled;
     19 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamic;
     20 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamicOrPinned;
     21 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllEnabled;
     22 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveIntents;
     23 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllHaveTitle;
     24 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllImmutable;
     25 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllKeyFieldsOnly;
     26 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllManifest;
     27 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotHaveIntents;
     28 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotHaveTitle;
     29 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotKeyFieldsOnly;
     30 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllNotManifest;
     31 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllPinned;
     32 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllUnique;
     33 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertBitmapSize;
     34 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertBundleEmpty;
     35 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertCallbackNotReceived;
     36 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertCallbackReceived;
     37 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertCannotUpdateImmutable;
     38 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertDynamicAndPinned;
     39 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertDynamicOnly;
     40 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertDynamicShortcutCountExceeded;
     41 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertEmpty;
     42 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertExpectException;
     43 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertForLauncherCallback;
     44 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertShortcutIds;
     45 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertWith;
     46 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.filterByActivity;
     47 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.findShortcut;
     48 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.hashSet;
     49 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list;
     50 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makeBundle;
     51 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.pfdToBitmap;
     52 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.resetAll;
     53 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.set;
     54 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.waitOnMainThread;
     55 
     56 import static org.mockito.Matchers.any;
     57 import static org.mockito.Matchers.anyInt;
     58 import static org.mockito.Matchers.anyString;
     59 import static org.mockito.Matchers.eq;
     60 import static org.mockito.Mockito.doReturn;
     61 import static org.mockito.Mockito.mock;
     62 import static org.mockito.Mockito.reset;
     63 import static org.mockito.Mockito.times;
     64 import static org.mockito.Mockito.verify;
     65 
     66 import android.Manifest.permission;
     67 import android.app.ActivityManager;
     68 import android.content.ActivityNotFoundException;
     69 import android.content.ComponentName;
     70 import android.content.Intent;
     71 import android.content.pm.ApplicationInfo;
     72 import android.content.pm.LauncherApps;
     73 import android.content.pm.LauncherApps.ShortcutQuery;
     74 import android.content.pm.ShortcutInfo;
     75 import android.graphics.Bitmap;
     76 import android.graphics.Bitmap.CompressFormat;
     77 import android.graphics.BitmapFactory;
     78 import android.graphics.drawable.Icon;
     79 import android.net.Uri;
     80 import android.os.Bundle;
     81 import android.os.Handler;
     82 import android.os.Looper;
     83 import android.os.Process;
     84 import android.os.UserHandle;
     85 import android.test.suitebuilder.annotation.SmallTest;
     86 import android.util.Log;
     87 import android.util.SparseArray;
     88 
     89 import com.android.frameworks.servicestests.R;
     90 import com.android.server.pm.ShortcutService.ConfigConstants;
     91 import com.android.server.pm.ShortcutService.FileOutputStreamWithPath;
     92 import com.android.server.pm.ShortcutUser.PackageWithUser;
     93 
     94 import org.mockito.ArgumentCaptor;
     95 
     96 import java.io.File;
     97 import java.io.IOException;
     98 import java.util.List;
     99 import java.util.Locale;
    100 
    101 /**
    102  * Tests for ShortcutService and ShortcutManager.
    103  *
    104  m FrameworksServicesTests &&
    105  adb install \
    106  -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
    107  adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest1 \
    108  -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
    109  */
    110 @SmallTest
    111 public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
    112 
    113     /**
    114      * Test for the first launch path, no settings file available.
    115      */
    116     public void testFirstInitialize() {
    117         assertResetTimes(START_TIME, START_TIME + INTERVAL);
    118     }
    119 
    120     /**
    121      * Test for {@link ShortcutService#getLastResetTimeLocked()} and
    122      * {@link ShortcutService#getNextResetTimeLocked()}.
    123      */
    124     public void testUpdateAndGetNextResetTimeLocked() {
    125         assertResetTimes(START_TIME, START_TIME + INTERVAL);
    126 
    127         // Advance clock.
    128         mInjectedCurrentTimeMillis += 100;
    129 
    130         // Shouldn't have changed.
    131         assertResetTimes(START_TIME, START_TIME + INTERVAL);
    132 
    133         // Advance clock, almost the reset time.
    134         mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
    135 
    136         // Shouldn't have changed.
    137         assertResetTimes(START_TIME, START_TIME + INTERVAL);
    138 
    139         // Advance clock.
    140         mInjectedCurrentTimeMillis += 1;
    141 
    142         assertResetTimes(START_TIME + INTERVAL, START_TIME + 2 * INTERVAL);
    143 
    144         // Advance further; 4 hours since start.
    145         mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50;
    146 
    147         assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
    148     }
    149 
    150     /**
    151      * Test for the restoration from saved file.
    152      */
    153     public void testInitializeFromSavedFile() {
    154 
    155         mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50;
    156         assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
    157 
    158         mService.saveBaseStateLocked();
    159 
    160         dumpBaseStateFile();
    161 
    162         mService.saveDirtyInfo();
    163 
    164         // Restore.
    165         initService();
    166 
    167         assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
    168     }
    169 
    170     /**
    171      * Test for the restoration from restored file.
    172      */
    173     public void testLoadFromBrokenFile() {
    174         // TODO Add various broken cases.
    175     }
    176 
    177     public void testLoadConfig() {
    178         mService.updateConfigurationLocked(
    179                 ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123,"
    180                         + ConfigConstants.KEY_MAX_SHORTCUTS + "=4,"
    181                         + ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=5,"
    182                         + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
    183                         + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
    184                         + ConfigConstants.KEY_ICON_FORMAT + "=WEBP,"
    185                         + ConfigConstants.KEY_ICON_QUALITY + "=75");
    186         assertEquals(123000, mService.getResetIntervalForTest());
    187         assertEquals(4, mService.getMaxShortcutsForTest());
    188         assertEquals(5, mService.getMaxUpdatesPerIntervalForTest());
    189         assertEquals(100, mService.getMaxIconDimensionForTest());
    190         assertEquals(CompressFormat.WEBP, mService.getIconPersistFormatForTest());
    191         assertEquals(75, mService.getIconPersistQualityForTest());
    192 
    193         mInjectedIsLowRamDevice = true;
    194         mService.updateConfigurationLocked(
    195                 ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
    196                         + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
    197                         + ConfigConstants.KEY_ICON_FORMAT + "=JPEG");
    198         assertEquals(ShortcutService.DEFAULT_RESET_INTERVAL_SEC * 1000,
    199                 mService.getResetIntervalForTest());
    200 
    201         assertEquals(ShortcutService.DEFAULT_MAX_SHORTCUTS_PER_APP,
    202                 mService.getMaxShortcutsForTest());
    203 
    204         assertEquals(ShortcutService.DEFAULT_MAX_UPDATES_PER_INTERVAL,
    205                 mService.getMaxUpdatesPerIntervalForTest());
    206 
    207         assertEquals(50, mService.getMaxIconDimensionForTest());
    208 
    209         assertEquals(CompressFormat.JPEG, mService.getIconPersistFormatForTest());
    210 
    211         assertEquals(ShortcutService.DEFAULT_ICON_PERSIST_QUALITY,
    212                 mService.getIconPersistQualityForTest());
    213     }
    214 
    215     // === Test for app side APIs ===
    216 
    217     /** Test for {@link android.content.pm.ShortcutManager#getMaxShortcutCountForActivity()} */
    218     public void testGetMaxDynamicShortcutCount() {
    219         assertEquals(MAX_SHORTCUTS, mManager.getMaxShortcutCountForActivity());
    220     }
    221 
    222     /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
    223     public void testGetRemainingCallCount() {
    224         assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount());
    225     }
    226 
    227     public void testGetIconMaxDimensions() {
    228         assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxWidth());
    229         assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxHeight());
    230     }
    231 
    232     /** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */
    233     public void testGetRateLimitResetTime() {
    234         assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
    235 
    236         mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50;
    237 
    238         assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime());
    239     }
    240 
    241     public void testSetDynamicShortcuts() {
    242         setCaller(CALLING_PACKAGE_1, USER_0);
    243 
    244         final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1);
    245         final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
    246                 getTestContext().getResources(), R.drawable.icon2));
    247 
    248         final ShortcutInfo si1 = makeShortcut(
    249                 "shortcut1",
    250                 "Title 1",
    251                 makeComponent(ShortcutActivity.class),
    252                 icon1,
    253                 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
    254                         "key1", "val1", "nest", makeBundle("key", 123)),
    255                 /* weight */ 10);
    256 
    257         final ShortcutInfo si2 = makeShortcut(
    258                 "shortcut2",
    259                 "Title 2",
    260                 /* activity */ null,
    261                 icon2,
    262                 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
    263                 /* weight */ 12);
    264         final ShortcutInfo si3 = makeShortcut("shortcut3");
    265 
    266         assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
    267         assertShortcutIds(assertAllNotKeyFieldsOnly(
    268                 mManager.getDynamicShortcuts()),
    269                 "shortcut1", "shortcut2");
    270         assertEquals(2, mManager.getRemainingCallCount());
    271 
    272         // TODO: Check fields
    273 
    274         assertTrue(mManager.setDynamicShortcuts(list(si1)));
    275         assertShortcutIds(assertAllNotKeyFieldsOnly(
    276                 mManager.getDynamicShortcuts()),
    277                 "shortcut1");
    278         assertEquals(1, mManager.getRemainingCallCount());
    279 
    280         assertTrue(mManager.setDynamicShortcuts(list()));
    281         assertEquals(0, mManager.getDynamicShortcuts().size());
    282         assertEquals(0, mManager.getRemainingCallCount());
    283 
    284         dumpsysOnLogcat();
    285 
    286         mInjectedCurrentTimeMillis++; // Need to advance the clock for reset to work.
    287         mService.resetThrottlingInner(UserHandle.USER_SYSTEM);
    288 
    289         dumpsysOnLogcat();
    290 
    291         assertTrue(mManager.setDynamicShortcuts(list(si2, si3)));
    292         assertEquals(2, mManager.getDynamicShortcuts().size());
    293 
    294         // TODO Check max number
    295 
    296         mRunningUsers.put(USER_10, true);
    297 
    298         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
    299             assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"))));
    300         });
    301     }
    302 
    303     public void testAddDynamicShortcuts() {
    304         setCaller(CALLING_PACKAGE_1, USER_0);
    305 
    306         final ShortcutInfo si1 = makeShortcut("shortcut1");
    307         final ShortcutInfo si2 = makeShortcut("shortcut2");
    308         final ShortcutInfo si3 = makeShortcut("shortcut3");
    309 
    310         assertEquals(3, mManager.getRemainingCallCount());
    311 
    312         assertTrue(mManager.setDynamicShortcuts(list(si1)));
    313         assertEquals(2, mManager.getRemainingCallCount());
    314         assertShortcutIds(assertAllNotKeyFieldsOnly(
    315                 mManager.getDynamicShortcuts()),
    316                 "shortcut1");
    317 
    318         assertTrue(mManager.addDynamicShortcuts(list(si2, si3)));
    319         assertEquals(1, mManager.getRemainingCallCount());
    320         assertShortcutIds(assertAllNotKeyFieldsOnly(
    321                 mManager.getDynamicShortcuts()),
    322                 "shortcut1", "shortcut2", "shortcut3");
    323 
    324         // This should not crash.  It'll still consume the quota.
    325         assertTrue(mManager.addDynamicShortcuts(list()));
    326         assertEquals(0, mManager.getRemainingCallCount());
    327         assertShortcutIds(assertAllNotKeyFieldsOnly(
    328                 mManager.getDynamicShortcuts()),
    329                 "shortcut1", "shortcut2", "shortcut3");
    330 
    331         mInjectedCurrentTimeMillis += INTERVAL; // reset
    332 
    333         // Add with the same ID
    334         assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("shortcut1"))));
    335         assertEquals(2, mManager.getRemainingCallCount());
    336         assertShortcutIds(assertAllNotKeyFieldsOnly(
    337                 mManager.getDynamicShortcuts()),
    338                 "shortcut1", "shortcut2", "shortcut3");
    339 
    340         // TODO Check max number
    341 
    342         // TODO Check fields.
    343 
    344         mRunningUsers.put(USER_10, true);
    345 
    346         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
    347             assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("s1"))));
    348         });
    349     }
    350 
    351     public void testPublishWithNoActivity() {
    352         // If activity is not explicitly set, use the default one.
    353 
    354         mRunningUsers.put(USER_10, true);
    355 
    356         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
    357             // s1 and s3 has no activities.
    358             final ShortcutInfo si1 = new ShortcutInfo.Builder(mClientContext, "si1")
    359                     .setShortLabel("label1")
    360                     .setIntent(new Intent("action1"))
    361                     .build();
    362             final ShortcutInfo si2 = new ShortcutInfo.Builder(mClientContext, "si2")
    363                     .setShortLabel("label2")
    364                     .setActivity(new ComponentName(getCallingPackage(), "abc"))
    365                     .setIntent(new Intent("action2"))
    366                     .build();
    367             final ShortcutInfo si3 = new ShortcutInfo.Builder(mClientContext, "si3")
    368                     .setShortLabel("label3")
    369                     .setIntent(new Intent("action3"))
    370                     .build();
    371 
    372             // Set test 1
    373             assertTrue(mManager.setDynamicShortcuts(list(si1)));
    374 
    375             assertWith(getCallerShortcuts())
    376                     .haveIds("si1")
    377                     .forShortcutWithId("si1", si -> {
    378                         assertEquals(new ComponentName(getCallingPackage(),
    379                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    380                     });
    381 
    382             // Set test 2
    383             assertTrue(mManager.setDynamicShortcuts(list(si2, si1)));
    384 
    385             assertWith(getCallerShortcuts())
    386                     .haveIds("si1", "si2")
    387                     .forShortcutWithId("si1", si -> {
    388                         assertEquals(new ComponentName(getCallingPackage(),
    389                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    390                     })
    391                     .forShortcutWithId("si2", si -> {
    392                         assertEquals(new ComponentName(getCallingPackage(),
    393                                 "abc"), si.getActivity());
    394                     });
    395 
    396 
    397             // Set test 3
    398             assertTrue(mManager.setDynamicShortcuts(list(si3, si1)));
    399 
    400             assertWith(getCallerShortcuts())
    401                     .haveIds("si1", "si3")
    402                     .forShortcutWithId("si1", si -> {
    403                         assertEquals(new ComponentName(getCallingPackage(),
    404                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    405                     })
    406                     .forShortcutWithId("si3", si -> {
    407                         assertEquals(new ComponentName(getCallingPackage(),
    408                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    409                     });
    410 
    411             mInjectedCurrentTimeMillis += INTERVAL; // reset throttling
    412 
    413             // Add test 1
    414             mManager.removeAllDynamicShortcuts();
    415             assertTrue(mManager.addDynamicShortcuts(list(si1)));
    416 
    417             assertWith(getCallerShortcuts())
    418                     .haveIds("si1")
    419                     .forShortcutWithId("si1", si -> {
    420                         assertEquals(new ComponentName(getCallingPackage(),
    421                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    422                     });
    423 
    424             // Add test 2
    425             mManager.removeAllDynamicShortcuts();
    426             assertTrue(mManager.addDynamicShortcuts(list(si2, si1)));
    427 
    428             assertWith(getCallerShortcuts())
    429                     .haveIds("si1", "si2")
    430                     .forShortcutWithId("si1", si -> {
    431                         assertEquals(new ComponentName(getCallingPackage(),
    432                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    433                     })
    434                     .forShortcutWithId("si2", si -> {
    435                         assertEquals(new ComponentName(getCallingPackage(),
    436                                 "abc"), si.getActivity());
    437                     });
    438 
    439 
    440             // Add test 3
    441             mManager.removeAllDynamicShortcuts();
    442             assertTrue(mManager.addDynamicShortcuts(list(si3, si1)));
    443 
    444             assertWith(getCallerShortcuts())
    445                     .haveIds("si1", "si3")
    446                     .forShortcutWithId("si1", si -> {
    447                         assertEquals(new ComponentName(getCallingPackage(),
    448                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    449                     })
    450                     .forShortcutWithId("si3", si -> {
    451                         assertEquals(new ComponentName(getCallingPackage(),
    452                                 MAIN_ACTIVITY_CLASS), si.getActivity());
    453                     });
    454         });
    455     }
    456 
    457     public void testPublishWithNoActivity_noMainActivityInPackage() {
    458         mRunningUsers.put(USER_10, true);
    459 
    460         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
    461             final ShortcutInfo si1 = new ShortcutInfo.Builder(mClientContext, "si1")
    462                     .setShortLabel("label1")
    463                     .setIntent(new Intent("action1"))
    464                     .build();
    465 
    466             // Returning null means there's no main activity in this package.
    467             mMainActivityFetcher = (packageName, userId) -> null;
    468 
    469             assertExpectException(
    470                     RuntimeException.class, "Launcher activity not found for", () -> {
    471                         assertTrue(mManager.setDynamicShortcuts(list(si1)));
    472                     });
    473         });
    474     }
    475 
    476     public void testDeleteDynamicShortcuts() {
    477         final ShortcutInfo si1 = makeShortcut("shortcut1");
    478         final ShortcutInfo si2 = makeShortcut("shortcut2");
    479         final ShortcutInfo si3 = makeShortcut("shortcut3");
    480         final ShortcutInfo si4 = makeShortcut("shortcut4");
    481 
    482         assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3, si4)));
    483         assertShortcutIds(assertAllNotKeyFieldsOnly(
    484                 mManager.getDynamicShortcuts()),
    485                 "shortcut1", "shortcut2", "shortcut3", "shortcut4");
    486 
    487         assertEquals(2, mManager.getRemainingCallCount());
    488 
    489         mManager.removeDynamicShortcuts(list("shortcut1"));
    490         assertShortcutIds(assertAllNotKeyFieldsOnly(
    491                 mManager.getDynamicShortcuts()),
    492                 "shortcut2", "shortcut3", "shortcut4");
    493 
    494         mManager.removeDynamicShortcuts(list("shortcut1"));
    495         assertShortcutIds(assertAllNotKeyFieldsOnly(
    496                 mManager.getDynamicShortcuts()),
    497                 "shortcut2", "shortcut3", "shortcut4");
    498 
    499         mManager.removeDynamicShortcuts(list("shortcutXXX"));
    500         assertShortcutIds(assertAllNotKeyFieldsOnly(
    501                 mManager.getDynamicShortcuts()),
    502                 "shortcut2", "shortcut3", "shortcut4");
    503 
    504         mManager.removeDynamicShortcuts(list("shortcut2", "shortcut4"));
    505         assertShortcutIds(assertAllNotKeyFieldsOnly(
    506                 mManager.getDynamicShortcuts()),
    507                 "shortcut3");
    508 
    509         mManager.removeDynamicShortcuts(list("shortcut3"));
    510         assertShortcutIds(assertAllNotKeyFieldsOnly(
    511                 mManager.getDynamicShortcuts()));
    512 
    513         // Still 2 calls left.
    514         assertEquals(2, mManager.getRemainingCallCount());
    515     }
    516 
    517     public void testDeleteAllDynamicShortcuts() {
    518         final ShortcutInfo si1 = makeShortcut("shortcut1");
    519         final ShortcutInfo si2 = makeShortcut("shortcut2");
    520         final ShortcutInfo si3 = makeShortcut("shortcut3");
    521 
    522         assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
    523         assertShortcutIds(assertAllNotKeyFieldsOnly(
    524                 mManager.getDynamicShortcuts()),
    525                 "shortcut1", "shortcut2", "shortcut3");
    526 
    527         assertEquals(2, mManager.getRemainingCallCount());
    528 
    529         mManager.removeAllDynamicShortcuts();
    530         assertEquals(0, mManager.getDynamicShortcuts().size());
    531         assertEquals(2, mManager.getRemainingCallCount());
    532 
    533         // Note delete shouldn't affect throttling, so...
    534         assertEquals(0, mManager.getDynamicShortcuts().size());
    535         assertEquals(0, mManager.getDynamicShortcuts().size());
    536         assertEquals(0, mManager.getDynamicShortcuts().size());
    537 
    538         // This should still work.
    539         assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
    540         assertEquals(3, mManager.getDynamicShortcuts().size());
    541 
    542         // Still 1 call left
    543         assertEquals(1, mManager.getRemainingCallCount());
    544     }
    545 
    546     public void testIcons() throws IOException {
    547         final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
    548         final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
    549         final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512);
    550 
    551         final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
    552                 getTestContext().getResources(), R.drawable.black_32x32));
    553         final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
    554                 getTestContext().getResources(), R.drawable.black_64x64));
    555         final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource(
    556                 getTestContext().getResources(), R.drawable.black_512x512));
    557 
    558         // Set from package 1
    559         setCaller(CALLING_PACKAGE_1);
    560         assertTrue(mManager.setDynamicShortcuts(list(
    561                 makeShortcutWithIcon("res32x32", res32x32),
    562                 makeShortcutWithIcon("res64x64", res64x64),
    563                 makeShortcutWithIcon("bmp32x32", bmp32x32),
    564                 makeShortcutWithIcon("bmp64x64", bmp64x64),
    565                 makeShortcutWithIcon("bmp512x512", bmp512x512),
    566                 makeShortcut("none")
    567         )));
    568 
    569         // getDynamicShortcuts() shouldn't return icons, thus assertAllNotHaveIcon().
    570         assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
    571                 "res32x32",
    572                 "res64x64",
    573                 "bmp32x32",
    574                 "bmp64x64",
    575                 "bmp512x512",
    576                 "none");
    577 
    578         // Call from another caller with the same ID, just to make sure storage is per-package.
    579         setCaller(CALLING_PACKAGE_2);
    580         assertTrue(mManager.setDynamicShortcuts(list(
    581                 makeShortcutWithIcon("res32x32", res512x512),
    582                 makeShortcutWithIcon("res64x64", res512x512),
    583                 makeShortcutWithIcon("none", res512x512)
    584         )));
    585         assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
    586                 "res32x32",
    587                 "res64x64",
    588                 "none");
    589 
    590         // Different profile.  Note the names and the contents don't match.
    591         setCaller(CALLING_PACKAGE_1, USER_P0);
    592         assertTrue(mManager.setDynamicShortcuts(list(
    593                 makeShortcutWithIcon("res32x32", res512x512),
    594                 makeShortcutWithIcon("bmp32x32", bmp512x512)
    595         )));
    596         assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
    597                 "res32x32",
    598                 "bmp32x32");
    599 
    600         // Re-initialize and load from the files.
    601         mService.saveDirtyInfo();
    602         initService();
    603 
    604         // Load from launcher.
    605         Bitmap bmp;
    606 
    607         setCaller(LAUNCHER_1);
    608         // Check hasIconResource()/hasIconFile().
    609         assertShortcutIds(assertAllHaveIconResId(
    610                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_0))),
    611                 "res32x32");
    612 
    613         assertShortcutIds(assertAllHaveIconResId(
    614                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res64x64", USER_0))),
    615                 "res64x64");
    616 
    617         assertShortcutIds(assertAllHaveIconFile(
    618                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_0))),
    619                 "bmp32x32");
    620 
    621         assertShortcutIds(assertAllHaveIconFile(
    622                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp64x64", USER_0))),
    623                 "bmp64x64");
    624 
    625         assertShortcutIds(assertAllHaveIconFile(
    626                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0))),
    627                 "bmp512x512");
    628 
    629         assertShortcutIds(assertAllHaveIconResId(
    630                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_P0))),
    631                 "res32x32");
    632         assertShortcutIds(assertAllHaveIconFile(
    633                 list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_P0))),
    634                 "bmp32x32");
    635 
    636         // Check
    637         assertEquals(
    638                 R.drawable.black_32x32,
    639                 mLauncherApps.getShortcutIconResId(
    640                         getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_0)));
    641 
    642         assertEquals(
    643                 R.drawable.black_64x64,
    644                 mLauncherApps.getShortcutIconResId(
    645                         getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res64x64", USER_0)));
    646 
    647         assertEquals(
    648                 0, // because it's not a resource
    649                 mLauncherApps.getShortcutIconResId(
    650                         getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_0)));
    651         assertEquals(
    652                 0, // because it's not a resource
    653                 mLauncherApps.getShortcutIconResId(
    654                         getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp64x64", USER_0)));
    655         assertEquals(
    656                 0, // because it's not a resource
    657                 mLauncherApps.getShortcutIconResId(
    658                         getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0)));
    659 
    660         bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
    661                 getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_0)));
    662         assertBitmapSize(32, 32, bmp);
    663 
    664         bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
    665                 getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp64x64", USER_0)));
    666         assertBitmapSize(64, 64, bmp);
    667 
    668         bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
    669                 getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0)));
    670         assertBitmapSize(128, 128, bmp);
    671 
    672         assertEquals(
    673                 R.drawable.black_512x512,
    674                 mLauncherApps.getShortcutIconResId(
    675                         getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_P0)));
    676         // Should be 512x512, so shrunk.
    677         bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
    678                 getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp32x32", USER_P0)));
    679         assertBitmapSize(128, 128, bmp);
    680 
    681         // Also check the overload APIs too.
    682         assertEquals(
    683                 R.drawable.black_32x32,
    684                 mLauncherApps.getShortcutIconResId(CALLING_PACKAGE_1, "res32x32", HANDLE_USER_0));
    685         assertEquals(
    686                 R.drawable.black_64x64,
    687                 mLauncherApps.getShortcutIconResId(CALLING_PACKAGE_1, "res64x64", HANDLE_USER_0));
    688         assertEquals(
    689                 R.drawable.black_512x512,
    690                 mLauncherApps.getShortcutIconResId(CALLING_PACKAGE_1, "res32x32", HANDLE_USER_P0));
    691         bmp = pfdToBitmap(
    692                 mLauncherApps.getShortcutIconFd(CALLING_PACKAGE_1, "bmp32x32", HANDLE_USER_P0));
    693         assertBitmapSize(128, 128, bmp);
    694     }
    695 
    696     public void testCleanupDanglingBitmaps() throws Exception {
    697         assertBitmapDirectories(USER_0, EMPTY_STRINGS);
    698         assertBitmapDirectories(USER_10, EMPTY_STRINGS);
    699 
    700         // Make some shortcuts with bitmap icons.
    701         final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
    702                 getTestContext().getResources(), R.drawable.black_32x32));
    703 
    704         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
    705             mManager.setDynamicShortcuts(list(
    706                     makeShortcutWithIcon("s1", bmp32x32),
    707                     makeShortcutWithIcon("s2", bmp32x32),
    708                     makeShortcutWithIcon("s3", bmp32x32)
    709             ));
    710         });
    711 
    712         // Increment the time (which actually we don't have to), which is used for filenames.
    713         mInjectedCurrentTimeMillis++;
    714 
    715         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
    716             mManager.setDynamicShortcuts(list(
    717                     makeShortcutWithIcon("s4", bmp32x32),
    718                     makeShortcutWithIcon("s5", bmp32x32),
    719                     makeShortcutWithIcon("s6", bmp32x32)
    720             ));
    721         });
    722 
    723         // Increment the time, which is used for filenames.
    724         mInjectedCurrentTimeMillis++;
    725 
    726         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
    727             mManager.setDynamicShortcuts(list(
    728             ));
    729         });
    730 
    731         // For USER-10, let's try without updating the times.
    732         mRunningUsers.put(USER_10, true);
    733 
    734         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
    735             mManager.setDynamicShortcuts(list(
    736                     makeShortcutWithIcon("10s1", bmp32x32),
    737                     makeShortcutWithIcon("10s2", bmp32x32),
    738                     makeShortcutWithIcon("10s3", bmp32x32)
    739             ));
    740         });
    741         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
    742             mManager.setDynamicShortcuts(list(
    743                     makeShortcutWithIcon("10s4", bmp32x32),
    744                     makeShortcutWithIcon("10s5", bmp32x32),
    745                     makeShortcutWithIcon("10s6", bmp32x32)
    746             ));
    747         });
    748         runWithCaller(CALLING_PACKAGE_3, USER_10, () -> {
    749             mManager.setDynamicShortcuts(list(
    750             ));
    751         });
    752 
    753         dumpsysOnLogcat();
    754 
    755         // Check files and directories.
    756         // Package 3 has no bitmaps, so we don't create a directory.
    757         assertBitmapDirectories(USER_0, CALLING_PACKAGE_1, CALLING_PACKAGE_2);
    758         assertBitmapDirectories(USER_10, CALLING_PACKAGE_1, CALLING_PACKAGE_2);
    759 
    760         assertBitmapFiles(USER_0, CALLING_PACKAGE_1,
    761                 getBitmapFilename(USER_0, CALLING_PACKAGE_1, "s1"),
    762                 getBitmapFilename(USER_0, CALLING_PACKAGE_1, "s2"),
    763                 getBitmapFilename(USER_0, CALLING_PACKAGE_1, "s3")
    764         );
    765         assertBitmapFiles(USER_0, CALLING_PACKAGE_2,
    766                 getBitmapFilename(USER_0, CALLING_PACKAGE_2, "s4"),
    767                 getBitmapFilename(USER_0, CALLING_PACKAGE_2, "s5"),
    768                 getBitmapFilename(USER_0, CALLING_PACKAGE_2, "s6")
    769         );
    770         assertBitmapFiles(USER_0, CALLING_PACKAGE_3,
    771                 EMPTY_STRINGS
    772         );
    773         assertBitmapFiles(USER_10, CALLING_PACKAGE_1,
    774                 getBitmapFilename(USER_10, CALLING_PACKAGE_1, "10s1"),
    775                 getBitmapFilename(USER_10, CALLING_PACKAGE_1, "10s2"),
    776                 getBitmapFilename(USER_10, CALLING_PACKAGE_1, "10s3")
    777         );
    778         assertBitmapFiles(USER_10, CALLING_PACKAGE_2,
    779                 getBitmapFilename(USER_10, CALLING_PACKAGE_2, "10s4"),
    780                 getBitmapFilename(USER_10, CALLING_PACKAGE_2, "10s5"),
    781                 getBitmapFilename(USER_10, CALLING_PACKAGE_2, "10s6")
    782         );
    783         assertBitmapFiles(USER_10, CALLING_PACKAGE_3,
    784                 EMPTY_STRINGS
    785         );
    786 
    787         // Then create random directories and files.
    788         makeFile(mService.getUserBitmapFilePath(USER_0), "a.b.c").mkdir();
    789         makeFile(mService.getUserBitmapFilePath(USER_0), "d.e.f").mkdir();
    790         makeFile(mService.getUserBitmapFilePath(USER_0), "d.e.f", "123").createNewFile();
    791         makeFile(mService.getUserBitmapFilePath(USER_0), "d.e.f", "456").createNewFile();
    792 
    793         makeFile(mService.getUserBitmapFilePath(USER_0), CALLING_PACKAGE_3).mkdir();
    794 
    795         makeFile(mService.getUserBitmapFilePath(USER_0), CALLING_PACKAGE_1, "1").createNewFile();
    796         makeFile(mService.getUserBitmapFilePath(USER_0), CALLING_PACKAGE_1, "2").createNewFile();
    797         makeFile(mService.getUserBitmapFilePath(USER_0), CALLING_PACKAGE_1, "3").createNewFile();
    798         makeFile(mService.getUserBitmapFilePath(USER_0), CALLING_PACKAGE_1, "4").createNewFile();
    799 
    800         makeFile(mService.getUserBitmapFilePath(USER_10), "10a.b.c").mkdir();
    801         makeFile(mService.getUserBitmapFilePath(USER_10), "10d.e.f").mkdir();
    802         makeFile(mService.getUserBitmapFilePath(USER_10), "10d.e.f", "123").createNewFile();
    803         makeFile(mService.getUserBitmapFilePath(USER_10), "10d.e.f", "456").createNewFile();
    804 
    805         makeFile(mService.getUserBitmapFilePath(USER_10), CALLING_PACKAGE_2, "1").createNewFile();
    806         makeFile(mService.getUserBitmapFilePath(USER_10), CALLING_PACKAGE_2, "2").createNewFile();
    807         makeFile(mService.getUserBitmapFilePath(USER_10), CALLING_PACKAGE_2, "3").createNewFile();
    808         makeFile(mService.getUserBitmapFilePath(USER_10), CALLING_PACKAGE_2, "4").createNewFile();
    809 
    810         assertBitmapDirectories(USER_0, CALLING_PACKAGE_1, CALLING_PACKAGE_2, CALLING_PACKAGE_3,
    811                 "a.b.c", "d.e.f");
    812 
    813         // Save and load.  When a user is loaded, we do the cleanup.
    814         mService.saveDirtyInfo();
    815         initService();
    816 
    817         mService.handleUnlockUser(USER_0);
    818         mService.handleUnlockUser(USER_10);
    819         mService.handleUnlockUser(20); // Make sure the logic will still work for nonexistent user.
    820 
    821         // The below check is the same as above, except this time USER_0 use the CALLING_PACKAGE_3
    822         // directory.
    823 
    824         assertBitmapDirectories(USER_0, CALLING_PACKAGE_1, CALLING_PACKAGE_2, CALLING_PACKAGE_3);
    825         assertBitmapDirectories(USER_10, CALLING_PACKAGE_1, CALLING_PACKAGE_2);
    826 
    827         assertBitmapFiles(USER_0, CALLING_PACKAGE_1,
    828                 getBitmapFilename(USER_0, CALLING_PACKAGE_1, "s1"),
    829                 getBitmapFilename(USER_0, CALLING_PACKAGE_1, "s2"),
    830                 getBitmapFilename(USER_0, CALLING_PACKAGE_1, "s3")
    831         );
    832         assertBitmapFiles(USER_0, CALLING_PACKAGE_2,
    833                 getBitmapFilename(USER_0, CALLING_PACKAGE_2, "s4"),
    834                 getBitmapFilename(USER_0, CALLING_PACKAGE_2, "s5"),
    835                 getBitmapFilename(USER_0, CALLING_PACKAGE_2, "s6")
    836         );
    837         assertBitmapFiles(USER_0, CALLING_PACKAGE_3,
    838                 EMPTY_STRINGS
    839         );
    840         assertBitmapFiles(USER_10, CALLING_PACKAGE_1,
    841                 getBitmapFilename(USER_10, CALLING_PACKAGE_1, "10s1"),
    842                 getBitmapFilename(USER_10, CALLING_PACKAGE_1, "10s2"),
    843                 getBitmapFilename(USER_10, CALLING_PACKAGE_1, "10s3")
    844         );
    845         assertBitmapFiles(USER_10, CALLING_PACKAGE_2,
    846                 getBitmapFilename(USER_10, CALLING_PACKAGE_2, "10s4"),
    847                 getBitmapFilename(USER_10, CALLING_PACKAGE_2, "10s5"),
    848                 getBitmapFilename(USER_10, CALLING_PACKAGE_2, "10s6")
    849         );
    850         assertBitmapFiles(USER_10, CALLING_PACKAGE_3,
    851                 EMPTY_STRINGS
    852         );
    853     }
    854 
    855     protected void checkShrinkBitmap(int expectedWidth, int expectedHeight, int resId, int maxSize) {
    856         assertBitmapSize(expectedWidth, expectedHeight,
    857                 ShortcutService.shrinkBitmap(BitmapFactory.decodeResource(
    858                         getTestContext().getResources(), resId),
    859                         maxSize));
    860     }
    861 
    862     public void testShrinkBitmap() {
    863         checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32);
    864         checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511);
    865         checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512);
    866 
    867         checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4096);
    868         checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4100);
    869         checkShrinkBitmap(512, 2048, R.drawable.black_1024x4096, 2048);
    870 
    871         checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4096);
    872         checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4100);
    873         checkShrinkBitmap(2048, 512, R.drawable.black_4096x1024, 2048);
    874     }
    875 
    876     protected File openIconFileForWriteAndGetPath(int userId, String packageName)
    877             throws IOException {
    878         // Shortcut IDs aren't used in the path, so just pass the same ID.
    879         final FileOutputStreamWithPath out =
    880                 mService.openIconFileForWrite(userId, makePackageShortcut(packageName, "id"));
    881         out.close();
    882         return out.getFile();
    883     }
    884 
    885     public void testOpenIconFileForWrite() throws IOException {
    886         mInjectedCurrentTimeMillis = 1000;
    887 
    888         final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
    889         final File p10_1_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
    890 
    891         final File p10_2_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
    892         final File p10_2_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
    893 
    894         final File p11_1_1 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
    895         final File p11_1_2 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
    896 
    897         mInjectedCurrentTimeMillis++;
    898 
    899         final File p10_1_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
    900         final File p10_1_4 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
    901         final File p10_1_5 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
    902 
    903         final File p10_2_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
    904         final File p11_1_3 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
    905 
    906         // Make sure their paths are all unique
    907         assertAllUnique(list(
    908                 p10_1_1,
    909                 p10_1_2,
    910                 p10_1_3,
    911                 p10_1_4,
    912                 p10_1_5,
    913 
    914                 p10_2_1,
    915                 p10_2_2,
    916                 p10_2_3,
    917 
    918                 p11_1_1,
    919                 p11_1_2,
    920                 p11_1_3
    921         ));
    922 
    923         // Check each set has the same parent.
    924         assertEquals(p10_1_1.getParent(), p10_1_2.getParent());
    925         assertEquals(p10_1_1.getParent(), p10_1_3.getParent());
    926         assertEquals(p10_1_1.getParent(), p10_1_4.getParent());
    927         assertEquals(p10_1_1.getParent(), p10_1_5.getParent());
    928 
    929         assertEquals(p10_2_1.getParent(), p10_2_2.getParent());
    930         assertEquals(p10_2_1.getParent(), p10_2_3.getParent());
    931 
    932         assertEquals(p11_1_1.getParent(), p11_1_2.getParent());
    933         assertEquals(p11_1_1.getParent(), p11_1_3.getParent());
    934 
    935         // Check the parents are still unique.
    936         assertAllUnique(list(
    937                 p10_1_1.getParent(),
    938                 p10_2_1.getParent(),
    939                 p11_1_1.getParent()
    940         ));
    941 
    942         // All files created at the same time for the same package/user, expcet for the first ones,
    943         // will have "_" in the path.
    944         assertFalse(p10_1_1.getName().contains("_"));
    945         assertTrue(p10_1_2.getName().contains("_"));
    946         assertFalse(p10_1_3.getName().contains("_"));
    947         assertTrue(p10_1_4.getName().contains("_"));
    948         assertTrue(p10_1_5.getName().contains("_"));
    949 
    950         assertFalse(p10_2_1.getName().contains("_"));
    951         assertTrue(p10_2_2.getName().contains("_"));
    952         assertFalse(p10_2_3.getName().contains("_"));
    953 
    954         assertFalse(p11_1_1.getName().contains("_"));
    955         assertTrue(p11_1_2.getName().contains("_"));
    956         assertFalse(p11_1_3.getName().contains("_"));
    957     }
    958 
    959     public void testUpdateShortcuts() {
    960         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
    961             assertTrue(mManager.setDynamicShortcuts(list(
    962                     makeShortcut("s1"),
    963                     makeShortcut("s2"),
    964                     makeShortcut("s3"),
    965                     makeShortcut("s4"),
    966                     makeShortcut("s5")
    967             )));
    968         });
    969         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
    970             assertTrue(mManager.setDynamicShortcuts(list(
    971                     makeShortcut("s1"),
    972                     makeShortcut("s2"),
    973                     makeShortcut("s3"),
    974                     makeShortcut("s4"),
    975                     makeShortcut("s5")
    976             )));
    977         });
    978         runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
    979             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3"),
    980                     getCallingUser());
    981             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s4", "s5"),
    982                     getCallingUser());
    983         });
    984         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
    985             mManager.removeDynamicShortcuts(list("s1"));
    986             mManager.removeDynamicShortcuts(list("s2"));
    987         });
    988         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
    989             mManager.removeDynamicShortcuts(list("s1"));
    990             mManager.removeDynamicShortcuts(list("s3"));
    991             mManager.removeDynamicShortcuts(list("s5"));
    992         });
    993         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
    994             assertShortcutIds(assertAllDynamic(
    995                     mManager.getDynamicShortcuts()),
    996                     "s3", "s4", "s5");
    997             assertShortcutIds(assertAllPinned(
    998                     mManager.getPinnedShortcuts()),
    999                     "s2", "s3");
   1000         });
   1001         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
   1002             assertShortcutIds(assertAllDynamic(
   1003                     mManager.getDynamicShortcuts()),
   1004                     "s2", "s4");
   1005             assertShortcutIds(assertAllPinned(
   1006                     mManager.getPinnedShortcuts()),
   1007                     "s4", "s5");
   1008         });
   1009 
   1010         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   1011             ShortcutInfo s2 = makeShortcutBuilder()
   1012                     .setId("s2")
   1013                     .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32))
   1014                     .build();
   1015 
   1016             ShortcutInfo s4 = makeShortcutBuilder()
   1017                     .setId("s4")
   1018                     .setTitle("new title")
   1019                     .build();
   1020 
   1021             mManager.updateShortcuts(list(s2, s4));
   1022         });
   1023         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
   1024             ShortcutInfo s2 = makeShortcutBuilder()
   1025                     .setId("s2")
   1026                     .setIntent(makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
   1027                             "key1", "val1"))
   1028                     .build();
   1029 
   1030             ShortcutInfo s4 = makeShortcutBuilder()
   1031                     .setId("s4")
   1032                     .setIntent(new Intent(Intent.ACTION_ALL_APPS))
   1033                     .build();
   1034 
   1035             mManager.updateShortcuts(list(s2, s4));
   1036         });
   1037 
   1038         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   1039             assertShortcutIds(assertAllDynamic(
   1040                     mManager.getDynamicShortcuts()),
   1041                     "s3", "s4", "s5");
   1042             assertShortcutIds(assertAllPinned(
   1043                     mManager.getPinnedShortcuts()),
   1044                     "s2", "s3");
   1045 
   1046             ShortcutInfo s = getCallerShortcut("s2");
   1047             assertTrue(s.hasIconResource());
   1048             assertEquals(R.drawable.black_32x32, s.getIconResourceId());
   1049             assertEquals("string/r" + R.drawable.black_32x32, s.getIconResName());
   1050             assertEquals("Title-s2", s.getTitle());
   1051 
   1052             s = getCallerShortcut("s4");
   1053             assertFalse(s.hasIconResource());
   1054             assertEquals(0, s.getIconResourceId());
   1055             assertEquals("new title", s.getTitle());
   1056         });
   1057         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
   1058             assertShortcutIds(assertAllDynamic(
   1059                     mManager.getDynamicShortcuts()),
   1060                     "s2", "s4");
   1061             assertShortcutIds(assertAllPinned(
   1062                     mManager.getPinnedShortcuts()),
   1063                     "s4", "s5");
   1064 
   1065             ShortcutInfo s = getCallerShortcut("s2");
   1066             assertFalse(s.hasIconResource());
   1067             assertEquals(0, s.getIconResourceId());
   1068             assertEquals("Title-s2", s.getTitle());
   1069             assertEquals(Intent.ACTION_ANSWER, s.getIntent().getAction());
   1070             assertEquals(1, s.getIntent().getExtras().size());
   1071 
   1072             s = getCallerShortcut("s4");
   1073             assertFalse(s.hasIconResource());
   1074             assertEquals(0, s.getIconResourceId());
   1075             assertEquals("Title-s4", s.getTitle());
   1076             assertEquals(Intent.ACTION_ALL_APPS, s.getIntent().getAction());
   1077             assertBundleEmpty(s.getIntent().getExtras());
   1078         });
   1079         // TODO Check with other fields too.
   1080 
   1081         // TODO Check bitmap removal too.
   1082 
   1083         mRunningUsers.put(USER_11, true);
   1084 
   1085         runWithCaller(CALLING_PACKAGE_2, USER_11, () -> {
   1086             mManager.updateShortcuts(list());
   1087         });
   1088     }
   1089 
   1090     public void testUpdateShortcuts_icons() {
   1091         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   1092             assertTrue(mManager.setDynamicShortcuts(list(
   1093                     makeShortcut("s1")
   1094             )));
   1095 
   1096             // Set resource icon
   1097             assertTrue(mManager.updateShortcuts(list(
   1098                     new ShortcutInfo.Builder(mClientContext, "s1")
   1099                     .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32))
   1100                     .build()
   1101             )));
   1102 
   1103             assertWith(getCallerShortcuts())
   1104                     .forShortcutWithId("s1", si -> {
   1105                         assertTrue(si.hasIconResource());
   1106                         assertEquals(R.drawable.black_32x32, si.getIconResourceId());
   1107                     });
   1108 
   1109             // Set bitmap icon
   1110             assertTrue(mManager.updateShortcuts(list(
   1111                     new ShortcutInfo.Builder(mClientContext, "s1")
   1112                     .setIcon(Icon.createWithBitmap(BitmapFactory.decodeResource(
   1113                             getTestContext().getResources(), R.drawable.black_64x64)))
   1114                     .build()
   1115             )));
   1116 
   1117             assertWith(getCallerShortcuts())
   1118                     .forShortcutWithId("s1", si -> {
   1119                         assertTrue(si.hasIconFile());
   1120                     });
   1121 
   1122             mInjectedCurrentTimeMillis += INTERVAL; // reset throttling
   1123 
   1124             // Do it again, with the reverse order (bitmap -> icon)
   1125             assertTrue(mManager.setDynamicShortcuts(list(
   1126                     makeShortcut("s1")
   1127             )));
   1128 
   1129             // Set bitmap icon
   1130             assertTrue(mManager.updateShortcuts(list(
   1131                     new ShortcutInfo.Builder(mClientContext, "s1")
   1132                             .setIcon(Icon.createWithBitmap(BitmapFactory.decodeResource(
   1133                                     getTestContext().getResources(), R.drawable.black_64x64)))
   1134                             .build()
   1135             )));
   1136 
   1137             assertWith(getCallerShortcuts())
   1138                     .forShortcutWithId("s1", si -> {
   1139                         assertTrue(si.hasIconFile());
   1140                     });
   1141 
   1142             // Set resource icon
   1143             assertTrue(mManager.updateShortcuts(list(
   1144                     new ShortcutInfo.Builder(mClientContext, "s1")
   1145                             .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32))
   1146                             .build()
   1147             )));
   1148 
   1149             assertWith(getCallerShortcuts())
   1150                     .forShortcutWithId("s1", si -> {
   1151                         assertTrue(si.hasIconResource());
   1152                         assertEquals(R.drawable.black_32x32, si.getIconResourceId());
   1153                     });
   1154         });
   1155     }
   1156 
   1157     // === Test for launcher side APIs ===
   1158 
   1159     public void testGetShortcuts() {
   1160 
   1161         // Set up shortcuts.
   1162 
   1163         setCaller(CALLING_PACKAGE_1);
   1164         final ShortcutInfo s1_1 = makeShortcut("s1");
   1165         final ShortcutInfo s1_2 = makeShortcut("s2");
   1166 
   1167         assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
   1168 
   1169         // Because setDynamicShortcuts will update the timestamps when ranks are changing,
   1170         // we explicitly set timestamps here.
   1171         getCallerShortcut("s1").setTimestamp(5000);
   1172         getCallerShortcut("s2").setTimestamp(1000);
   1173 
   1174         setCaller(CALLING_PACKAGE_2);
   1175         final ShortcutInfo s2_2 = makeShortcut("s2");
   1176         final ShortcutInfo s2_3 = makeShortcutWithActivity("s3",
   1177                 makeComponent(ShortcutActivity2.class));
   1178         final ShortcutInfo s2_4 = makeShortcutWithActivity("s4",
   1179                 makeComponent(ShortcutActivity.class));
   1180         assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
   1181 
   1182         getCallerShortcut("s2").setTimestamp(1500);
   1183         getCallerShortcut("s3").setTimestamp(3000);
   1184         getCallerShortcut("s4").setTimestamp(500);
   1185 
   1186         setCaller(CALLING_PACKAGE_3);
   1187         final ShortcutInfo s3_2 = makeShortcut("s3");
   1188         assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
   1189 
   1190         getCallerShortcut("s3").setTimestamp(START_TIME + 5000);
   1191 
   1192         setCaller(LAUNCHER_1);
   1193 
   1194         // Get dynamic
   1195         assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertAllStringsResolved(
   1196                 assertShortcutIds(
   1197                         assertAllNotKeyFieldsOnly(
   1198                                 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1199                         /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1200                         "s1", "s2")))));
   1201 
   1202         // Get pinned
   1203         assertShortcutIds(
   1204                 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1205                         /* activity =*/ null,
   1206                         ShortcutQuery.FLAG_GET_PINNED), getCallingUser())
   1207                 /* none */);
   1208 
   1209         // Get both, with timestamp
   1210         assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1211                 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1212                         /* time =*/ 1000, CALLING_PACKAGE_2,
   1213                         /* activity =*/ null,
   1214                         ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC),
   1215                         getCallingUser())),
   1216                 "s2", "s3"))));
   1217 
   1218         // FLAG_GET_KEY_FIELDS_ONLY
   1219         assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1220                 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1221                         /* time =*/ 1000, CALLING_PACKAGE_2,
   1222                         /* activity =*/ null,
   1223                         ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
   1224                         getCallingUser())),
   1225                 "s2", "s3"))));
   1226 
   1227         // Filter by activity
   1228         assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1229                 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1230                         /* time =*/ 0, CALLING_PACKAGE_2,
   1231                         new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   1232                         ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC),
   1233                         getCallingUser())),
   1234                 "s4"))));
   1235 
   1236         // With ID.
   1237         assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1238                 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1239                         /* time =*/ 1000, CALLING_PACKAGE_2, list("s3"),
   1240                         /* activity =*/ null,
   1241                         ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
   1242                         getCallingUser())),
   1243                 "s3"))));
   1244         assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1245                 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1246                         /* time =*/ 1000, CALLING_PACKAGE_2, list("s3", "s2", "ss"),
   1247                         /* activity =*/ null,
   1248                         ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
   1249                         getCallingUser())),
   1250                 "s2", "s3"))));
   1251         assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1252                 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1253                         /* time =*/ 1000, CALLING_PACKAGE_2, list("s3x", "s2x"),
   1254                         /* activity =*/ null,
   1255                         ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
   1256                         getCallingUser()))
   1257                 /* empty */))));
   1258         assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1259                 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1260                         /* time =*/ 1000, CALLING_PACKAGE_2, list(),
   1261                         /* activity =*/ null,
   1262                         ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
   1263                         getCallingUser()))
   1264                 /* empty */))));
   1265 
   1266         // Pin some shortcuts.
   1267         mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   1268                 list("s3", "s4"), getCallingUser());
   1269 
   1270         // Pinned ones only
   1271         assertAllPinned(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
   1272                 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
   1273                         /* time =*/ 1000, CALLING_PACKAGE_2,
   1274                         /* activity =*/ null,
   1275                         ShortcutQuery.FLAG_GET_PINNED),
   1276                         getCallingUser())),
   1277                 "s3"))));
   1278 
   1279         // All packages.
   1280         assertShortcutIds(assertAllNotKeyFieldsOnly(
   1281                 mLauncherApps.getShortcuts(buildQuery(
   1282                         /* time =*/ 5000, /* package= */ null,
   1283                         /* activity =*/ null,
   1284                         ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED),
   1285                         getCallingUser())),
   1286                 "s1", "s3");
   1287 
   1288         assertExpectException(
   1289                 IllegalArgumentException.class, "package name must also be set", () -> {
   1290                     mLauncherApps.getShortcuts(buildQuery(
   1291                     /* time =*/ 0, /* package= */ null, list("id"),
   1292                     /* activity =*/ null, /* flags */ 0), getCallingUser());
   1293                 });
   1294 
   1295         // TODO More tests: pinned but dynamic.
   1296     }
   1297 
   1298     public void testGetShortcuts_shortcutKinds() throws Exception {
   1299         // Create 3 manifest and 3 dynamic shortcuts
   1300         addManifestShortcutResource(
   1301                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   1302                 R.xml.shortcut_3);
   1303         updatePackageVersion(CALLING_PACKAGE_1, 1);
   1304         mService.mPackageMonitor.onReceive(getTestContext(),
   1305                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   1306 
   1307         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1308             assertTrue(mManager.setDynamicShortcuts(list(
   1309                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   1310         });
   1311 
   1312         // Pin 2 and 3
   1313         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1314             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2", "ms3", "s2", "s3"),
   1315                     HANDLE_USER_0);
   1316         });
   1317 
   1318         // Remove ms3 and s3
   1319         addManifestShortcutResource(
   1320                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   1321                 R.xml.shortcut_2);
   1322         updatePackageVersion(CALLING_PACKAGE_1, 1);
   1323         mService.mPackageMonitor.onReceive(getTestContext(),
   1324                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   1325 
   1326         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1327             assertTrue(mManager.setDynamicShortcuts(list(
   1328                     makeShortcut("s1"), makeShortcut("s2"))));
   1329         });
   1330 
   1331         // Check their status.
   1332         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1333             assertWith(getCallerShortcuts())
   1334                     .haveIds("ms1", "ms2", "ms3", "s1", "s2", "s3")
   1335 
   1336                     .selectByIds("ms1", "ms2")
   1337                     .areAllManifest()
   1338                     .areAllImmutable()
   1339                     .areAllNotDynamic()
   1340 
   1341                     .revertToOriginalList()
   1342                     .selectByIds("ms3")
   1343                     .areAllNotManifest()
   1344                     .areAllImmutable()
   1345                     .areAllDisabled()
   1346                     .areAllNotDynamic()
   1347 
   1348                     .revertToOriginalList()
   1349                     .selectByIds("s1", "s2")
   1350                     .areAllNotManifest()
   1351                     .areAllMutable()
   1352                     .areAllDynamic()
   1353 
   1354                     .revertToOriginalList()
   1355                     .selectByIds("s3")
   1356                     .areAllNotManifest()
   1357                     .areAllMutable()
   1358                     .areAllEnabled()
   1359                     .areAllNotDynamic()
   1360 
   1361                     .revertToOriginalList()
   1362                     .selectByIds("s1", "ms1")
   1363                     .areAllNotPinned()
   1364 
   1365                     .revertToOriginalList()
   1366                     .selectByIds("s2", "s3", "ms2", "ms3")
   1367                     .areAllPinned()
   1368             ;
   1369         });
   1370 
   1371         // Finally, actual tests.
   1372         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1373             assertWith(mLauncherApps.getShortcuts(
   1374                     buildQueryWithFlags(ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0))
   1375                     .haveIds("s1", "s2");
   1376             assertWith(mLauncherApps.getShortcuts(
   1377                     buildQueryWithFlags(ShortcutQuery.FLAG_GET_MANIFEST), HANDLE_USER_0))
   1378                     .haveIds("ms1", "ms2");
   1379             assertWith(mLauncherApps.getShortcuts(
   1380                     buildQueryWithFlags(ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0))
   1381                     .haveIds("s2", "s3", "ms2", "ms3");
   1382 
   1383             assertWith(mLauncherApps.getShortcuts(
   1384                     buildQueryWithFlags(
   1385                             ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED
   1386                     ), HANDLE_USER_0))
   1387                     .haveIds("s1", "s2", "s3", "ms2", "ms3");
   1388 
   1389             assertWith(mLauncherApps.getShortcuts(
   1390                     buildQueryWithFlags(
   1391                             ShortcutQuery.FLAG_GET_MANIFEST | ShortcutQuery.FLAG_GET_PINNED
   1392                     ), HANDLE_USER_0))
   1393                     .haveIds("ms1", "s2", "s3", "ms2", "ms3");
   1394 
   1395             assertWith(mLauncherApps.getShortcuts(
   1396                     buildQueryWithFlags(
   1397                             ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_MANIFEST
   1398                     ), HANDLE_USER_0))
   1399                     .haveIds("ms1", "ms2", "s1", "s2");
   1400 
   1401             assertWith(mLauncherApps.getShortcuts(
   1402                     buildQueryWithFlags(
   1403                             ShortcutQuery.FLAG_GET_ALL_KINDS
   1404                     ), HANDLE_USER_0))
   1405                     .haveIds("ms1", "ms2", "ms3", "s1", "s2", "s3");
   1406         });
   1407     }
   1408 
   1409     public void testGetShortcuts_resolveStrings() throws Exception {
   1410         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1411             ShortcutInfo si = new ShortcutInfo.Builder(mClientContext)
   1412                     .setId("id")
   1413                     .setActivity(new ComponentName(mClientContext, "dummy"))
   1414                     .setTitleResId(10)
   1415                     .setTextResId(11)
   1416                     .setDisabledMessageResId(12)
   1417                     .setIntent(makeIntent("action", ShortcutActivity.class))
   1418                     .build();
   1419             mManager.setDynamicShortcuts(list(si));
   1420         });
   1421         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
   1422             ShortcutInfo si = new ShortcutInfo.Builder(mClientContext)
   1423                     .setId("id")
   1424                     .setActivity(new ComponentName(mClientContext, "dummy"))
   1425                     .setTitleResId(10)
   1426                     .setTextResId(11)
   1427                     .setDisabledMessageResId(12)
   1428                     .setIntent(makeIntent("action", ShortcutActivity.class))
   1429                     .build();
   1430             mManager.setDynamicShortcuts(list(si));
   1431         });
   1432 
   1433         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1434             final ShortcutQuery q = new ShortcutQuery();
   1435             q.setQueryFlags(ShortcutQuery.FLAG_GET_DYNAMIC);
   1436 
   1437             // USER 0
   1438             List<ShortcutInfo> ret = assertShortcutIds(
   1439                     assertAllStringsResolved(mLauncherApps.getShortcuts(q, HANDLE_USER_0)),
   1440                     "id");
   1441             assertEquals("string-com.android.test.1-user:0-res:10/en", ret.get(0).getTitle());
   1442             assertEquals("string-com.android.test.1-user:0-res:11/en", ret.get(0).getText());
   1443             assertEquals("string-com.android.test.1-user:0-res:12/en",
   1444                     ret.get(0).getDisabledMessage());
   1445 
   1446             // USER P0
   1447             ret = assertShortcutIds(
   1448                     assertAllStringsResolved(mLauncherApps.getShortcuts(q, HANDLE_USER_P0)),
   1449                     "id");
   1450             assertEquals("string-com.android.test.1-user:20-res:10/en", ret.get(0).getTitle());
   1451             assertEquals("string-com.android.test.1-user:20-res:11/en", ret.get(0).getText());
   1452             assertEquals("string-com.android.test.1-user:20-res:12/en",
   1453                     ret.get(0).getDisabledMessage());
   1454         });
   1455     }
   1456 
   1457     // TODO resource
   1458     public void testGetShortcutInfo() {
   1459         // Create shortcuts.
   1460         setCaller(CALLING_PACKAGE_1);
   1461         final ShortcutInfo s1_1 = makeShortcut(
   1462                 "s1",
   1463                 "Title 1",
   1464                 makeComponent(ShortcutActivity.class),
   1465                 /* icon =*/ null,
   1466                 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
   1467                         "key1", "val1", "nest", makeBundle("key", 123)),
   1468                 /* weight */ 10);
   1469 
   1470         final ShortcutInfo s1_2 = makeShortcut(
   1471                 "s2",
   1472                 "Title 2",
   1473                 /* activity */ null,
   1474                 /* icon =*/ null,
   1475                 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
   1476                 /* weight */ 12);
   1477 
   1478         assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
   1479         dumpsysOnLogcat();
   1480 
   1481         setCaller(CALLING_PACKAGE_2);
   1482         final ShortcutInfo s2_1 = makeShortcut(
   1483                 "s1",
   1484                 "ABC",
   1485                 makeComponent(ShortcutActivity2.class),
   1486                 /* icon =*/ null,
   1487                 makeIntent(Intent.ACTION_ANSWER, ShortcutActivity2.class,
   1488                         "key1", "val1", "nest", makeBundle("key", 123)),
   1489                 /* weight */ 10);
   1490         assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
   1491         dumpsysOnLogcat();
   1492 
   1493         // Pin some.
   1494         setCaller(LAUNCHER_1);
   1495 
   1496         mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   1497                 list("s2"), getCallingUser());
   1498 
   1499         dumpsysOnLogcat();
   1500 
   1501         // Delete some.
   1502         setCaller(CALLING_PACKAGE_1);
   1503         assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1504         mManager.removeDynamicShortcuts(list("s2"));
   1505         assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1506 
   1507         dumpsysOnLogcat();
   1508 
   1509         setCaller(LAUNCHER_1);
   1510         List<ShortcutInfo> list;
   1511 
   1512         // Note we don't guarantee the orders.
   1513         list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
   1514                 assertAllNotKeyFieldsOnly(
   1515                         mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
   1516                                 list("s2", "s1", "s3", null), getCallingUser())))),
   1517                 "s1", "s2");
   1518         assertEquals("Title 1", findById(list, "s1").getTitle());
   1519         assertEquals("Title 2", findById(list, "s2").getTitle());
   1520 
   1521         assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
   1522                 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
   1523                         list("s3"), getCallingUser())))
   1524                 /* none */);
   1525 
   1526         list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
   1527                 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_2,
   1528                         list("s1", "s2", "s3"), getCallingUser()))),
   1529                 "s1");
   1530         assertEquals("ABC", findById(list, "s1").getTitle());
   1531     }
   1532 
   1533     public void testPinShortcutAndGetPinnedShortcuts() {
   1534         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1535             final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
   1536             final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
   1537 
   1538             assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
   1539         });
   1540 
   1541         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1542             final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
   1543             final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
   1544             final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
   1545             assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
   1546         });
   1547 
   1548         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   1549             final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s2", 1000);
   1550             assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
   1551         });
   1552 
   1553         // Pin some.
   1554         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1555             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   1556                     list("s2", "s3"), getCallingUser());
   1557 
   1558             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   1559                     list("s3", "s4", "s5"), getCallingUser());
   1560 
   1561             mLauncherApps.pinShortcuts(CALLING_PACKAGE_3,
   1562                     list("s3"), getCallingUser());  // Note ID doesn't exist
   1563         });
   1564 
   1565         // Delete some.
   1566         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1567             assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1568             mManager.removeDynamicShortcuts(list("s2"));
   1569             assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1570 
   1571             assertShortcutIds(mManager.getDynamicShortcuts(), "s1");
   1572         });
   1573 
   1574         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1575             assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
   1576             mManager.removeDynamicShortcuts(list("s3"));
   1577             assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
   1578 
   1579             assertShortcutIds(mManager.getDynamicShortcuts(), "s2", "s4");
   1580         });
   1581 
   1582         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   1583             assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
   1584             mManager.removeDynamicShortcuts(list("s2"));
   1585             assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
   1586 
   1587             assertEmpty(mManager.getDynamicShortcuts());
   1588         });
   1589 
   1590         // Get pinned shortcuts from launcher
   1591         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1592             // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists.
   1593             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(assertAllEnabled(
   1594                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1595                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))),
   1596                     "s2");
   1597 
   1598             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(assertAllEnabled(
   1599                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1600                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))),
   1601                     "s3", "s4");
   1602 
   1603             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(assertAllEnabled(
   1604                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_3,
   1605                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))))
   1606                     /* none */);
   1607         });
   1608     }
   1609 
   1610     /**
   1611      * This is similar to the above test, except it used "disable" instead of "remove".  It also
   1612      * does "enable".
   1613      */
   1614     public void testDisableAndEnableShortcuts() {
   1615         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1616             final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
   1617             final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
   1618 
   1619             assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
   1620         });
   1621 
   1622         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1623             final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
   1624             final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
   1625             final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
   1626             assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
   1627         });
   1628 
   1629         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   1630             final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s2", 1000);
   1631             assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
   1632         });
   1633 
   1634         // Pin some.
   1635         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1636             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   1637                     list("s2", "s3"), getCallingUser());
   1638 
   1639             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   1640                     list("s3", "s4", "s5"), getCallingUser());
   1641 
   1642             mLauncherApps.pinShortcuts(CALLING_PACKAGE_3,
   1643                     list("s3"), getCallingUser());  // Note ID doesn't exist
   1644         });
   1645 
   1646         // Disable some.
   1647         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1648             assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1649 
   1650             mManager.disableShortcuts(list("s2"));
   1651 
   1652             assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1653             assertShortcutIds(mManager.getDynamicShortcuts(), "s1");
   1654         });
   1655 
   1656         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1657             assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
   1658 
   1659             // disable should work even if a shortcut is not dynamic, so try calling "remove" first
   1660             // here.
   1661             mManager.removeDynamicShortcuts(list("s3"));
   1662             mManager.disableShortcuts(list("s3"));
   1663 
   1664             assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
   1665             assertShortcutIds(mManager.getDynamicShortcuts(), "s2", "s4");
   1666         });
   1667 
   1668         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   1669             assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
   1670 
   1671             mManager.disableShortcuts(list("s2"));
   1672 
   1673             assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
   1674 
   1675             assertEmpty(mManager.getDynamicShortcuts());
   1676             assertEmpty(getCallerShortcuts());
   1677         });
   1678 
   1679         // Get pinned shortcuts from launcher
   1680         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1681             // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists, and disabled.
   1682             assertWith(mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1683                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))
   1684                     .haveIds("s2")
   1685                     .areAllPinned()
   1686                     .areAllNotWithKeyFieldsOnly()
   1687                     .areAllDisabled();
   1688             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_0,
   1689                     ActivityNotFoundException.class);
   1690 
   1691             // Here, s4 is still enabled and launchable, but s3 is disabled.
   1692             assertWith(mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1693                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))
   1694                     .haveIds("s3", "s4")
   1695                     .areAllPinned()
   1696                     .areAllNotWithKeyFieldsOnly()
   1697 
   1698                     .selectByIds("s3")
   1699                     .areAllDisabled()
   1700 
   1701                     .revertToOriginalList()
   1702                     .selectByIds("s4")
   1703                     .areAllEnabled();
   1704 
   1705             assertStartShortcutThrowsException(CALLING_PACKAGE_2, "s3", USER_0,
   1706                     ActivityNotFoundException.class);
   1707             assertShortcutLaunchable(CALLING_PACKAGE_2, "s4", USER_0);
   1708 
   1709             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(assertAllEnabled(
   1710                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_3,
   1711                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))))
   1712                     /* none */);
   1713         });
   1714 
   1715         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1716             mManager.enableShortcuts(list("s2"));
   1717 
   1718             assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
   1719             assertShortcutIds(mManager.getDynamicShortcuts(), "s1");
   1720         });
   1721         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1722             // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists.
   1723             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(assertAllEnabled(
   1724                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1725                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))),
   1726                     "s2");
   1727             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
   1728         });
   1729     }
   1730 
   1731     public void testDisableShortcuts_thenRepublish() {
   1732         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1733             assertTrue(mManager.setDynamicShortcuts(list(
   1734                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   1735 
   1736             runWithCaller(LAUNCHER_1, USER_0, () -> {
   1737                 mLauncherApps.pinShortcuts(
   1738                         CALLING_PACKAGE_1, list("s1", "s2", "s3"), HANDLE_USER_0);
   1739             });
   1740 
   1741             mManager.disableShortcuts(list("s1", "s2", "s3"));
   1742 
   1743             assertWith(getCallerShortcuts())
   1744                     .haveIds("s1", "s2", "s3")
   1745                     .areAllNotDynamic()
   1746                     .areAllPinned()
   1747                     .areAllDisabled();
   1748 
   1749             // Make sure updateShortcuts() will not re-enable them.
   1750             assertTrue(mManager.updateShortcuts(list(
   1751                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   1752 
   1753             assertWith(getCallerShortcuts())
   1754                     .haveIds("s1", "s2", "s3")
   1755                     .areAllNotDynamic()
   1756                     .areAllPinned()
   1757                     .areAllDisabled();
   1758 
   1759             // Re-publish s1 with setDynamicShortcuts.
   1760             mInjectedCurrentTimeMillis += INTERVAL; // reset throttling
   1761 
   1762             assertTrue(mManager.setDynamicShortcuts(list(
   1763                     makeShortcut("s1"))));
   1764 
   1765             assertWith(getCallerShortcuts())
   1766                     .haveIds("s1", "s2", "s3")
   1767 
   1768                     .selectByIds("s1")
   1769                     .areAllDynamic()
   1770                     .areAllPinned()
   1771                     .areAllEnabled()
   1772 
   1773                     .revertToOriginalList()
   1774                     .selectByIds("s2", "s3")
   1775                     .areAllNotDynamic()
   1776                     .areAllPinned()
   1777                     .areAllDisabled();
   1778 
   1779             // Re-publish s2 with addDynamicShortcuts.
   1780             mInjectedCurrentTimeMillis += INTERVAL; // reset throttling
   1781 
   1782             assertTrue(mManager.addDynamicShortcuts(list(
   1783                     makeShortcut("s2"))));
   1784 
   1785             assertWith(getCallerShortcuts())
   1786                     .haveIds("s1", "s2", "s3")
   1787 
   1788                     .selectByIds("s1", "s2")
   1789                     .areAllDynamic()
   1790                     .areAllPinned()
   1791                     .areAllEnabled()
   1792 
   1793                     .revertToOriginalList()
   1794                     .selectByIds("s3")
   1795                     .areAllNotDynamic()
   1796                     .areAllPinned()
   1797                     .areAllDisabled();
   1798         });
   1799     }
   1800 
   1801     public void testPinShortcutAndGetPinnedShortcuts_multi() {
   1802         // Create some shortcuts.
   1803         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1804             assertTrue(mManager.setDynamicShortcuts(list(
   1805                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   1806         });
   1807 
   1808         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1809             assertTrue(mManager.setDynamicShortcuts(list(
   1810                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   1811         });
   1812 
   1813         dumpsysOnLogcat();
   1814 
   1815         // Pin some.
   1816         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1817             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   1818                     list("s3", "s4"), getCallingUser());
   1819 
   1820             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   1821                     list("s1", "s2", "s4"), getCallingUser());
   1822         });
   1823 
   1824         dumpsysOnLogcat();
   1825 
   1826         // Delete some.
   1827         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1828             assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
   1829             mManager.removeDynamicShortcuts(list("s3"));
   1830             assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
   1831         });
   1832 
   1833         dumpsysOnLogcat();
   1834 
   1835         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1836             assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
   1837             mManager.removeDynamicShortcuts(list("s1"));
   1838             mManager.removeDynamicShortcuts(list("s3"));
   1839             assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
   1840         });
   1841 
   1842         dumpsysOnLogcat();
   1843 
   1844         // Get pinned shortcuts from launcher
   1845         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1846             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1847                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1848                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1849                     "s3");
   1850 
   1851             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1852                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1853                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1854                     "s1", "s2");
   1855 
   1856             assertShortcutIds(assertAllDynamicOrPinned(
   1857                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1858                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1859                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1860                     "s1", "s2", "s3");
   1861 
   1862             assertShortcutIds(assertAllDynamicOrPinned(
   1863                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1864                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1865                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1866                     "s1", "s2");
   1867         });
   1868 
   1869         dumpsysOnLogcat();
   1870 
   1871         runWithCaller(LAUNCHER_2, USER_0, () -> {
   1872             // Launcher2 still has no pinned ones.
   1873             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1874                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1875                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
   1876                     /* none */);
   1877             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1878                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1879                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
   1880                     /* none */);
   1881 
   1882             assertShortcutIds(assertAllDynamic(
   1883                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1884                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1885                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1886                     "s1", "s2");
   1887             assertShortcutIds(assertAllDynamic(
   1888                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1889                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1890                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1891                     "s2");
   1892 
   1893             // Now pin some.
   1894             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   1895                     list("s1", "s2"), getCallingUser());
   1896 
   1897             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   1898                     list("s1", "s2"), getCallingUser());
   1899 
   1900             assertShortcutIds(assertAllDynamic(
   1901                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1902                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1903                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1904                     "s1", "s2");
   1905 
   1906             // S1 was not visible to it, so shouldn't be pinned.
   1907             assertShortcutIds(assertAllDynamic(
   1908                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1909                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1910                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1911                     "s2");
   1912         });
   1913 
   1914         // Re-initialize and load from the files.
   1915         mService.saveDirtyInfo();
   1916         initService();
   1917 
   1918         // Load from file.
   1919         mService.handleUnlockUser(USER_0);
   1920 
   1921         // Make sure package info is restored too.
   1922         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1923             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1924                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1925                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1926                     "s3");
   1927             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1928                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1929                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1930                     "s1", "s2");
   1931         });
   1932         runWithCaller(LAUNCHER_2, USER_0, () -> {
   1933             assertShortcutIds(assertAllDynamic(
   1934                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1935                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1936                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1937                     "s1", "s2");
   1938             assertShortcutIds(assertAllDynamic(
   1939                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1940                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
   1941                                     | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
   1942                     "s2");
   1943         });
   1944 
   1945         // Delete all dynamic.
   1946         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1947             mManager.removeAllDynamicShortcuts();
   1948 
   1949             assertEquals(0, mManager.getDynamicShortcuts().size());
   1950             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
   1951         });
   1952         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   1953             mManager.removeAllDynamicShortcuts();
   1954 
   1955             assertEquals(0, mManager.getDynamicShortcuts().size());
   1956             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2", "s1");
   1957         });
   1958 
   1959         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1960             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1961                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1962                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1963                     "s3");
   1964 
   1965             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1966                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   1967                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1968                     "s1", "s2");
   1969 
   1970             // from all packages.
   1971             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1972                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, null,
   1973                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1974                     "s1", "s2", "s3");
   1975 
   1976             // Update pined.  Note s2 and s3 are actually available, but not visible to this
   1977             // launcher, so still can't be pinned.
   1978             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
   1979                     getCallingUser());
   1980 
   1981             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1982                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1983                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1984                     "s3");
   1985         });
   1986         // Re-publish s1.
   1987         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   1988             assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("s1"))));
   1989 
   1990             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
   1991             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
   1992         });
   1993         runWithCaller(LAUNCHER_1, USER_0, () -> {
   1994             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   1995                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   1996                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   1997                     "s3");
   1998 
   1999             // Now "s1" is visible, so can be pinned.
   2000             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
   2001                     getCallingUser());
   2002 
   2003             assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
   2004                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2005                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
   2006                     "s1", "s3");
   2007         });
   2008 
   2009         // Now clear pinned shortcuts.  First, from launcher 1.
   2010         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2011             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
   2012             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
   2013 
   2014             assertEquals(0,
   2015                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2016                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
   2017             assertEquals(0,
   2018                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2019                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
   2020         });
   2021         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2022             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
   2023             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2");
   2024         });
   2025         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   2026             assertEquals(0, mManager.getDynamicShortcuts().size());
   2027             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2");
   2028         });
   2029 
   2030         // Clear all pins from launcher 2.
   2031         runWithCaller(LAUNCHER_2, USER_0, () -> {
   2032             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
   2033             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
   2034 
   2035             assertEquals(0,
   2036                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2037                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
   2038             assertEquals(0,
   2039                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2040                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
   2041         });
   2042         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2043             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
   2044             assertEquals(0, mManager.getPinnedShortcuts().size());
   2045         });
   2046         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   2047             assertEquals(0, mManager.getDynamicShortcuts().size());
   2048             assertEquals(0, mManager.getPinnedShortcuts().size());
   2049         });
   2050     }
   2051 
   2052     public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() {
   2053         // Create some shortcuts.
   2054         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2055             assertTrue(mManager.setDynamicShortcuts(list(
   2056                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   2057         });
   2058         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   2059             assertTrue(mManager.setDynamicShortcuts(list(
   2060                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   2061         });
   2062 
   2063         mRunningUsers.put(USER_10, true);
   2064 
   2065         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   2066             assertTrue(mManager.setDynamicShortcuts(list(
   2067                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
   2068                     makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
   2069         });
   2070 
   2071         // Pin some shortcuts and see the result.
   2072 
   2073         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2074             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   2075                     list("s1"), HANDLE_USER_0);
   2076 
   2077             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   2078                     list("s1", "s2", "s3"), HANDLE_USER_0);
   2079         });
   2080 
   2081         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   2082             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   2083                     list("s2"), HANDLE_USER_0);
   2084 
   2085             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   2086                     list("s2", "s3"), HANDLE_USER_0);
   2087         });
   2088 
   2089         runWithCaller(LAUNCHER_2, USER_P0, () -> {
   2090             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   2091                     list("s3"), HANDLE_USER_0);
   2092 
   2093             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   2094                     list("s3"), HANDLE_USER_0);
   2095         });
   2096 
   2097         runWithCaller(LAUNCHER_2, USER_10, () -> {
   2098             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   2099                     list("s1", "s2", "s3"), HANDLE_USER_10);
   2100         });
   2101 
   2102         // Cross profile pinning.
   2103         final int PIN_AND_DYNAMIC = ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC;
   2104 
   2105         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2106             assertShortcutIds(assertAllPinned(
   2107                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2108                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2109                     "s1");
   2110             assertShortcutIds(assertAllDynamic(
   2111                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2112                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2113                     "s1", "s2", "s3");
   2114             assertShortcutIds(assertAllDynamicOrPinned(
   2115                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2116                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2117                     "s1", "s2", "s3");
   2118 
   2119             assertShortcutIds(assertAllPinned(
   2120                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2121                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2122                     "s1", "s2", "s3");
   2123             assertShortcutIds(assertAllDynamic(
   2124                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2125                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2126                     "s1", "s2", "s3");
   2127             assertShortcutIds(assertAllDynamicOrPinned(
   2128                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2129                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2130                     "s1", "s2", "s3");
   2131 
   2132             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2133             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
   2134             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
   2135 
   2136             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2137             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2138             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2139 
   2140             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2141                     SecurityException.class);
   2142             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2143                     SecurityException.class);
   2144             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2145                     SecurityException.class);
   2146             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2147                     SecurityException.class);
   2148             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2149                     SecurityException.class);
   2150             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2151                     SecurityException.class);
   2152         });
   2153         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   2154             assertShortcutIds(assertAllPinned(
   2155                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2156                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2157                     "s2");
   2158             assertShortcutIds(assertAllDynamic(
   2159                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2160                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2161                     "s1", "s2", "s3");
   2162             assertShortcutIds(assertAllDynamicOrPinned(
   2163                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2164                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2165                     "s1", "s2", "s3");
   2166 
   2167             assertShortcutIds(assertAllPinned(
   2168                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2169                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2170                     "s2", "s3");
   2171             assertShortcutIds(assertAllDynamic(
   2172                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2173                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2174                     "s1", "s2", "s3");
   2175             assertShortcutIds(assertAllDynamicOrPinned(
   2176                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2177                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2178                     "s1", "s2", "s3");
   2179 
   2180             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2181             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
   2182             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
   2183 
   2184             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2185             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2186             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2187 
   2188             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2189                     SecurityException.class);
   2190             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2191                     SecurityException.class);
   2192             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2193                     SecurityException.class);
   2194             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2195                     SecurityException.class);
   2196             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2197                     SecurityException.class);
   2198             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2199                     SecurityException.class);
   2200         });
   2201         runWithCaller(LAUNCHER_2, USER_P0, () -> {
   2202             assertShortcutIds(assertAllPinned(
   2203                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2204                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2205                     "s3");
   2206             assertShortcutIds(assertAllDynamic(
   2207                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2208                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2209                     "s1", "s2", "s3");
   2210             assertShortcutIds(assertAllDynamicOrPinned(
   2211                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2212                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2213                     "s1", "s2", "s3");
   2214 
   2215             assertShortcutIds(assertAllPinned(
   2216                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2217                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2218                     "s3");
   2219             assertShortcutIds(assertAllDynamic(
   2220                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2221                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2222                     "s1", "s2", "s3");
   2223             assertShortcutIds(assertAllDynamicOrPinned(
   2224                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2225                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2226                     "s1", "s2", "s3");
   2227 
   2228             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2229             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
   2230             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
   2231 
   2232             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2233             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2234             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2235 
   2236             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2237                     SecurityException.class);
   2238             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2239                     SecurityException.class);
   2240             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2241                     SecurityException.class);
   2242             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2243                     SecurityException.class);
   2244             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2245                     SecurityException.class);
   2246             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2247                     SecurityException.class);
   2248         });
   2249         runWithCaller(LAUNCHER_2, USER_10, () -> {
   2250             assertShortcutIds(assertAllPinned(
   2251                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2252                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
   2253                     "s1", "s2", "s3");
   2254             assertShortcutIds(assertAllDynamic(
   2255                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2256                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
   2257                     "s1", "s2", "s3", "s4", "s5", "s6");
   2258             assertShortcutIds(assertAllDynamicOrPinned(
   2259                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2260                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
   2261                     "s1", "s2", "s3", "s4", "s5", "s6");
   2262         });
   2263 
   2264         // Remove some dynamic shortcuts.
   2265 
   2266         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2267             assertTrue(mManager.setDynamicShortcuts(list(
   2268                     makeShortcut("s1"))));
   2269         });
   2270         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   2271             assertTrue(mManager.setDynamicShortcuts(list(
   2272                     makeShortcut("s1"))));
   2273         });
   2274         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   2275             assertTrue(mManager.setDynamicShortcuts(list(
   2276                     makeShortcut("s1"))));
   2277         });
   2278 
   2279         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2280             assertShortcutIds(assertAllPinned(
   2281                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2282                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2283                     "s1");
   2284             assertShortcutIds(assertAllDynamic(
   2285                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2286                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2287                     "s1");
   2288             assertShortcutIds(assertAllDynamicOrPinned(
   2289                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2290                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2291                     "s1");
   2292 
   2293             assertShortcutIds(assertAllPinned(
   2294                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2295                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2296                     "s1", "s2", "s3");
   2297             assertShortcutIds(assertAllDynamic(
   2298                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2299                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2300                     "s1");
   2301             assertShortcutIds(assertAllDynamicOrPinned(
   2302                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2303                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2304                     "s1", "s2", "s3");
   2305 
   2306             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2307             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_0,
   2308                     ActivityNotFoundException.class);
   2309             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_0,
   2310                     ActivityNotFoundException.class);
   2311 
   2312             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2313             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2314             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2315 
   2316             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2317                     SecurityException.class);
   2318             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2319                     SecurityException.class);
   2320             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2321                     SecurityException.class);
   2322             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2323                     SecurityException.class);
   2324             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2325                     SecurityException.class);
   2326             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2327                     SecurityException.class);
   2328         });
   2329         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   2330             assertShortcutIds(assertAllPinned(
   2331                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2332                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2333                     "s2");
   2334             assertShortcutIds(assertAllDynamic(
   2335                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2336                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2337                     "s1");
   2338             assertShortcutIds(assertAllDynamicOrPinned(
   2339                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2340                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2341                     "s1", "s2");
   2342 
   2343             assertShortcutIds(assertAllPinned(
   2344                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2345                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2346                     "s2", "s3");
   2347             assertShortcutIds(assertAllDynamic(
   2348                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2349                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2350                     "s1");
   2351             assertShortcutIds(assertAllDynamicOrPinned(
   2352                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2353                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2354                     "s1", "s2", "s3");
   2355 
   2356             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2357             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
   2358             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_0,
   2359                     ActivityNotFoundException.class);
   2360 
   2361             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2362             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2363             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2364 
   2365             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2366                     SecurityException.class);
   2367             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2368                     SecurityException.class);
   2369             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2370                     SecurityException.class);
   2371             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2372                     SecurityException.class);
   2373             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2374                     SecurityException.class);
   2375             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2376                     SecurityException.class);
   2377         });
   2378         runWithCaller(LAUNCHER_2, USER_P0, () -> {
   2379             assertShortcutIds(assertAllPinned(
   2380                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2381                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2382                     "s3");
   2383             assertShortcutIds(assertAllDynamic(
   2384                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2385                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2386                     "s1");
   2387             assertShortcutIds(assertAllDynamicOrPinned(
   2388                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2389                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2390                     "s1", "s3");
   2391 
   2392             assertShortcutIds(assertAllPinned(
   2393                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2394                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2395                     "s3");
   2396             assertShortcutIds(assertAllDynamic(
   2397                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2398                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2399                     "s1");
   2400             assertShortcutIds(assertAllDynamicOrPinned(
   2401                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2402                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2403                     "s1", "s3");
   2404 
   2405             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2406             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_0,
   2407                     ActivityNotFoundException.class);
   2408             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
   2409 
   2410             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2411             assertStartShortcutThrowsException(CALLING_PACKAGE_2, "s2", USER_0,
   2412                     ActivityNotFoundException.class);
   2413             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2414 
   2415             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2416                     SecurityException.class);
   2417             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2418                     SecurityException.class);
   2419             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2420                     SecurityException.class);
   2421             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2422                     SecurityException.class);
   2423             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2424                     SecurityException.class);
   2425             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2426                     SecurityException.class);
   2427         });
   2428         runWithCaller(LAUNCHER_2, USER_10, () -> {
   2429             assertShortcutIds(assertAllPinned(
   2430                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2431                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
   2432                     "s1", "s2", "s3");
   2433             assertShortcutIds(assertAllDynamic(
   2434                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2435                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
   2436                     "s1");
   2437             assertShortcutIds(assertAllDynamicOrPinned(
   2438                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2439                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
   2440                     "s1", "s2", "s3");
   2441 
   2442             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_0,
   2443                     SecurityException.class);
   2444             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_0,
   2445                     SecurityException.class);
   2446             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_0,
   2447                     SecurityException.class);
   2448 
   2449             assertStartShortcutThrowsException(CALLING_PACKAGE_2, "s1", USER_0,
   2450                     SecurityException.class);
   2451             assertStartShortcutThrowsException(CALLING_PACKAGE_2, "s2", USER_0,
   2452                     SecurityException.class);
   2453             assertStartShortcutThrowsException(CALLING_PACKAGE_2, "s3", USER_0,
   2454                     SecurityException.class);
   2455 
   2456             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
   2457             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
   2458             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
   2459             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2460                     ActivityNotFoundException.class);
   2461             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2462                     ActivityNotFoundException.class);
   2463             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2464                     ActivityNotFoundException.class);
   2465         });
   2466 
   2467         // Save & load and make sure we still have the same information.
   2468         mService.saveDirtyInfo();
   2469         initService();
   2470         mService.handleUnlockUser(USER_0);
   2471 
   2472         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2473             assertShortcutIds(assertAllPinned(
   2474                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2475                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2476                     "s1");
   2477             assertShortcutIds(assertAllDynamic(
   2478                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2479                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2480                     "s1");
   2481             assertShortcutIds(assertAllDynamicOrPinned(
   2482                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2483                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2484                     "s1");
   2485 
   2486             assertShortcutIds(assertAllPinned(
   2487                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2488                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2489                     "s1", "s2", "s3");
   2490             assertShortcutIds(assertAllDynamic(
   2491                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2492                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2493                     "s1");
   2494             assertShortcutIds(assertAllDynamicOrPinned(
   2495                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2496                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2497                     "s1", "s2", "s3");
   2498 
   2499             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2500             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_0,
   2501                     ActivityNotFoundException.class);
   2502             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_0,
   2503                     ActivityNotFoundException.class);
   2504 
   2505             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2506             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2507             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2508 
   2509             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2510                     SecurityException.class);
   2511             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2512                     SecurityException.class);
   2513             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2514                     SecurityException.class);
   2515             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2516                     SecurityException.class);
   2517             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2518                     SecurityException.class);
   2519             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2520                     SecurityException.class);
   2521         });
   2522         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   2523             assertShortcutIds(assertAllPinned(
   2524                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2525                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2526                     "s2");
   2527             assertShortcutIds(assertAllDynamic(
   2528                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2529                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2530                     "s1");
   2531             assertShortcutIds(assertAllDynamicOrPinned(
   2532                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2533                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2534                     "s1", "s2");
   2535 
   2536             assertShortcutIds(assertAllPinned(
   2537                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2538                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2539                     "s2", "s3");
   2540             assertShortcutIds(assertAllDynamic(
   2541                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2542                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2543                     "s1");
   2544             assertShortcutIds(assertAllDynamicOrPinned(
   2545                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2546                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2547                     "s1", "s2", "s3");
   2548 
   2549             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2550             assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
   2551             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_0,
   2552                     ActivityNotFoundException.class);
   2553 
   2554             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2555             assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
   2556             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2557 
   2558             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2559                     SecurityException.class);
   2560             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2561                     SecurityException.class);
   2562             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2563                     SecurityException.class);
   2564             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2565                     SecurityException.class);
   2566             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2567                     SecurityException.class);
   2568             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2569                     SecurityException.class);
   2570         });
   2571         runWithCaller(LAUNCHER_2, USER_P0, () -> {
   2572             assertShortcutIds(assertAllPinned(
   2573                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2574                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2575                     "s3");
   2576             assertShortcutIds(assertAllDynamic(
   2577                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2578                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2579                     "s1");
   2580             assertShortcutIds(assertAllDynamicOrPinned(
   2581                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
   2582                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2583                     "s1", "s3");
   2584 
   2585             assertShortcutIds(assertAllPinned(
   2586                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2587                     /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
   2588                     "s3");
   2589             assertShortcutIds(assertAllDynamic(
   2590                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2591                     /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
   2592                     "s1");
   2593             assertShortcutIds(assertAllDynamicOrPinned(
   2594                     mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
   2595                     /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
   2596                     "s1", "s3");
   2597 
   2598             assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
   2599             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_0,
   2600                     ActivityNotFoundException.class);
   2601             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
   2602 
   2603             assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
   2604             assertStartShortcutThrowsException(CALLING_PACKAGE_2, "s2", USER_0,
   2605                     ActivityNotFoundException.class);
   2606             assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
   2607 
   2608             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_10,
   2609                     SecurityException.class);
   2610             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s2", USER_10,
   2611                     SecurityException.class);
   2612             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s3", USER_10,
   2613                     SecurityException.class);
   2614             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s4", USER_10,
   2615                     SecurityException.class);
   2616             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s5", USER_10,
   2617                     SecurityException.class);
   2618             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s6", USER_10,
   2619                     SecurityException.class);
   2620         });
   2621     }
   2622 
   2623     public void testStartShortcut() {
   2624         // Create some shortcuts.
   2625         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2626             final ShortcutInfo s1_1 = makeShortcut(
   2627                     "s1",
   2628                     "Title 1",
   2629                     makeComponent(ShortcutActivity.class),
   2630                     /* icon =*/ null,
   2631                     new Intent[] {makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
   2632                             "key1", "val1", "nest", makeBundle("key", 123))
   2633                             .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
   2634                     new Intent("act2").setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)},
   2635                     /* rank */ 10);
   2636 
   2637             final ShortcutInfo s1_2 = makeShortcut(
   2638                     "s2",
   2639                     "Title 2",
   2640             /* activity */ null,
   2641             /* icon =*/ null,
   2642                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
   2643             /* rank */ 12);
   2644 
   2645             final ShortcutInfo s1_3 = makeShortcut("s3");
   2646 
   2647             assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3)));
   2648         });
   2649 
   2650         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   2651             final ShortcutInfo s2_1 = makeShortcut(
   2652                     "s1",
   2653                     "ABC",
   2654                     makeComponent(ShortcutActivity.class),
   2655                     /* icon =*/ null,
   2656                     makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
   2657                             "key1", "val1", "nest", makeBundle("key", 123)),
   2658                     /* weight */ 10);
   2659             assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
   2660         });
   2661 
   2662         // Pin some.
   2663         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2664             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   2665                     list("s1", "s2"), getCallingUser());
   2666 
   2667             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   2668                     list("s1"), getCallingUser());
   2669         });
   2670 
   2671         // Just to make it complicated, delete some.
   2672         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2673             mManager.removeDynamicShortcuts(list("s2"));
   2674         });
   2675 
   2676         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2677             final Intent[] intents = launchShortcutAndGetIntents(CALLING_PACKAGE_1, "s1", USER_0);
   2678             assertEquals(ShortcutActivity2.class.getName(),
   2679                     intents[0].getComponent().getClassName());
   2680             assertEquals(Intent.ACTION_ASSIST,
   2681                     intents[0].getAction());
   2682             assertEquals(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK,
   2683                     intents[0].getFlags());
   2684 
   2685             assertEquals("act2",
   2686                     intents[1].getAction());
   2687             assertEquals(Intent.FLAG_ACTIVITY_NO_ANIMATION,
   2688                     intents[1].getFlags());
   2689 
   2690             assertEquals(
   2691                     ShortcutActivity3.class.getName(),
   2692                     launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s2", USER_0)
   2693                             .getComponent().getClassName());
   2694             assertEquals(
   2695                     ShortcutActivity.class.getName(),
   2696                     launchShortcutAndGetIntent(CALLING_PACKAGE_2, "s1", USER_0)
   2697                             .getComponent().getClassName());
   2698 
   2699             assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
   2700 
   2701             assertShortcutNotLaunched("no-such-package", "s2", USER_0);
   2702             assertShortcutNotLaunched(CALLING_PACKAGE_1, "xxxx", USER_0);
   2703         });
   2704 
   2705         // LAUNCHER_1 is no longer the default launcher
   2706         setDefaultLauncherChecker((pkg, userId) -> false);
   2707 
   2708         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2709             // Not the default launcher, but pinned shortcuts are still lauchable.
   2710             final Intent[] intents = launchShortcutAndGetIntents(CALLING_PACKAGE_1, "s1", USER_0);
   2711             assertEquals(ShortcutActivity2.class.getName(),
   2712                     intents[0].getComponent().getClassName());
   2713             assertEquals(Intent.ACTION_ASSIST,
   2714                     intents[0].getAction());
   2715             assertEquals(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK,
   2716                     intents[0].getFlags());
   2717 
   2718             assertEquals("act2",
   2719                     intents[1].getAction());
   2720             assertEquals(Intent.FLAG_ACTIVITY_NO_ANIMATION,
   2721                     intents[1].getFlags());
   2722             assertEquals(
   2723                     ShortcutActivity3.class.getName(),
   2724                     launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s2", USER_0)
   2725                             .getComponent().getClassName());
   2726             assertEquals(
   2727                     ShortcutActivity.class.getName(),
   2728                     launchShortcutAndGetIntent(CALLING_PACKAGE_2, "s1", USER_0)
   2729                             .getComponent().getClassName());
   2730 
   2731             // Not pinned, so not lauchable.
   2732         });
   2733 
   2734         // Test inner errors.
   2735         runWithCaller(LAUNCHER_1, USER_0, () -> {
   2736             // Not launchable.
   2737             doReturn(ActivityManager.START_CLASS_NOT_FOUND)
   2738                     .when(mMockActivityManagerInternal).startActivitiesAsPackage(
   2739                             anyString(), anyInt(), any(Intent[].class), any(Bundle.class));
   2740             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_0,
   2741                     ActivityNotFoundException.class);
   2742 
   2743             // Still not launchable.
   2744             doReturn(ActivityManager.START_CLASS_NOT_FOUND)
   2745                     .when(mMockActivityManagerInternal)
   2746                     .startActivitiesAsPackage(
   2747                             anyString(), anyInt(), any(Intent[].class), any(Bundle.class));
   2748             assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_0,
   2749                     ActivityNotFoundException.class);
   2750         });
   2751 
   2752 
   2753         // TODO Check extra, etc
   2754     }
   2755 
   2756     public void testLauncherCallback() throws Throwable {
   2757         // Disable throttling for this test.
   2758         mService.updateConfigurationLocked(
   2759                 ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=99999999,"
   2760                         + ConfigConstants.KEY_MAX_SHORTCUTS + "=99999999"
   2761         );
   2762 
   2763         setCaller(LAUNCHER_1, USER_0);
   2764 
   2765         assertForLauncherCallback(mLauncherApps, () -> {
   2766             runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2767                 assertTrue(mManager.setDynamicShortcuts(list(
   2768                         makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   2769             });
   2770         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2771                 .haveIds("s1", "s2", "s3")
   2772                 .areAllWithKeyFieldsOnly()
   2773                 .areAllDynamic();
   2774 
   2775         // From different package.
   2776         assertForLauncherCallback(mLauncherApps, () -> {
   2777             runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   2778                 assertTrue(mManager.setDynamicShortcuts(list(
   2779                         makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   2780             });
   2781         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_2, HANDLE_USER_0)
   2782                 .haveIds("s1", "s2", "s3")
   2783                 .areAllWithKeyFieldsOnly()
   2784                 .areAllDynamic();
   2785 
   2786         mRunningUsers.put(USER_10, true);
   2787 
   2788         // Different user, callback shouldn't be called.
   2789         assertForLauncherCallback(mLauncherApps, () -> {
   2790             runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   2791                 assertTrue(mManager.setDynamicShortcuts(list(
   2792                         makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   2793             });
   2794         }).assertNoCallbackCalled();
   2795 
   2796 
   2797         // Test for addDynamicShortcuts.
   2798         assertForLauncherCallback(mLauncherApps, () -> {
   2799             runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2800                 assertTrue(mManager.addDynamicShortcuts(list(makeShortcut("s4"))));
   2801             });
   2802         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2803                 .haveIds("s1", "s2", "s3", "s4")
   2804                 .areAllWithKeyFieldsOnly()
   2805                 .areAllDynamic();
   2806 
   2807         // Test for remove
   2808         assertForLauncherCallback(mLauncherApps, () -> {
   2809             runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2810                 mManager.removeDynamicShortcuts(list("s1"));
   2811             });
   2812         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2813                 .haveIds("s2", "s3", "s4")
   2814                 .areAllWithKeyFieldsOnly()
   2815                 .areAllDynamic();
   2816 
   2817         // Test for update
   2818         assertForLauncherCallback(mLauncherApps, () -> {
   2819             runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2820                 assertTrue(mManager.updateShortcuts(list(
   2821                         makeShortcut("s1"), makeShortcut("s2"))));
   2822             });
   2823         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2824                 // All remaining shortcuts will be passed regardless of what's been updated.
   2825                 .haveIds("s2", "s3", "s4")
   2826                 .areAllWithKeyFieldsOnly()
   2827                 .areAllDynamic();
   2828 
   2829         // Test for deleteAll
   2830         assertForLauncherCallback(mLauncherApps, () -> {
   2831             runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2832                 mManager.removeAllDynamicShortcuts();
   2833             });
   2834         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2835                 .isEmpty();
   2836 
   2837         // Update package1 with manifest shortcuts
   2838         assertForLauncherCallback(mLauncherApps, () -> {
   2839             addManifestShortcutResource(
   2840                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   2841                     R.xml.shortcut_2);
   2842             updatePackageVersion(CALLING_PACKAGE_1, 1);
   2843             mService.mPackageMonitor.onReceive(getTestContext(),
   2844                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   2845         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2846                 .areAllManifest()
   2847                 .areAllWithKeyFieldsOnly()
   2848                 .haveIds("ms1", "ms2");
   2849 
   2850         // Make sure pinned shortcuts are passed too.
   2851         // 1. Add dynamic shortcuts.
   2852         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   2853             assertTrue(mManager.setDynamicShortcuts(list(
   2854                     makeShortcut("s1"), makeShortcut("s2"))));
   2855         });
   2856 
   2857         // 2. Pin some.
   2858         runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
   2859             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2", "s2"), HANDLE_USER_0);
   2860         });
   2861         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   2862             assertWith(getCallerShortcuts())
   2863                     .haveIds("ms1", "ms2", "s1", "s2")
   2864                     .areAllEnabled()
   2865 
   2866                     .selectByIds("ms1", "ms2")
   2867                     .areAllManifest()
   2868 
   2869                     .revertToOriginalList()
   2870                     .selectByIds("s1", "s2")
   2871                     .areAllDynamic()
   2872                     ;
   2873         });
   2874 
   2875         // 3 Update the app with no manifest shortcuts.  (Pinned one will survive.)
   2876         addManifestShortcutResource(
   2877                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   2878                 R.xml.shortcut_0);
   2879         updatePackageVersion(CALLING_PACKAGE_1, 1);
   2880         mService.mPackageMonitor.onReceive(getTestContext(),
   2881                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   2882 
   2883         assertForLauncherCallback(mLauncherApps, () -> {
   2884             runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2885                 mManager.removeDynamicShortcuts(list("s2"));
   2886 
   2887                 assertWith(getCallerShortcuts())
   2888                         .haveIds("ms2", "s1", "s2")
   2889 
   2890                         .selectByIds("ms2")
   2891                         .areAllNotManifest()
   2892                         .areAllPinned()
   2893                         .areAllImmutable()
   2894                         .areAllDisabled()
   2895 
   2896                         .revertToOriginalList()
   2897                         .selectByIds("s1")
   2898                         .areAllDynamic()
   2899                         .areAllNotPinned()
   2900                         .areAllEnabled()
   2901 
   2902                         .revertToOriginalList()
   2903                         .selectByIds("s2")
   2904                         .areAllNotDynamic()
   2905                         .areAllPinned()
   2906                         .areAllEnabled()
   2907                 ;
   2908             });
   2909         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   2910                 .haveIds("ms2", "s1", "s2")
   2911                 .areAllWithKeyFieldsOnly();
   2912 
   2913         // Remove CALLING_PACKAGE_2
   2914         assertForLauncherCallback(mLauncherApps, () -> {
   2915             uninstallPackage(USER_0, CALLING_PACKAGE_2);
   2916             mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_0, USER_0,
   2917                     /* appStillExists = */ false);
   2918         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_2, HANDLE_USER_0)
   2919                 .isEmpty();
   2920     }
   2921 
   2922     public void testLauncherCallback_crossProfile() throws Throwable {
   2923         prepareCrossProfileDataSet();
   2924 
   2925         final Handler h = new Handler(Looper.getMainLooper());
   2926 
   2927         final LauncherApps.Callback c0_1 = mock(LauncherApps.Callback.class);
   2928         final LauncherApps.Callback c0_2 = mock(LauncherApps.Callback.class);
   2929         final LauncherApps.Callback c0_3 = mock(LauncherApps.Callback.class);
   2930         final LauncherApps.Callback c0_4 = mock(LauncherApps.Callback.class);
   2931 
   2932         final LauncherApps.Callback cP0_1 = mock(LauncherApps.Callback.class);
   2933         final LauncherApps.Callback c10_1 = mock(LauncherApps.Callback.class);
   2934         final LauncherApps.Callback c10_2 = mock(LauncherApps.Callback.class);
   2935         final LauncherApps.Callback c11_1 = mock(LauncherApps.Callback.class);
   2936 
   2937         final List<LauncherApps.Callback> all =
   2938                 list(c0_1, c0_2, c0_3, c0_4, cP0_1, c10_1, c11_1);
   2939 
   2940         setDefaultLauncherChecker((pkg, userId) -> {
   2941             switch (userId) {
   2942                 case USER_0:
   2943                     return LAUNCHER_2.equals(pkg);
   2944                 case USER_P0:
   2945                     return LAUNCHER_1.equals(pkg);
   2946                 case USER_10:
   2947                     return LAUNCHER_1.equals(pkg);
   2948                 case USER_11:
   2949                     return LAUNCHER_1.equals(pkg);
   2950                 default:
   2951                     return false;
   2952             }
   2953         });
   2954 
   2955         runWithCaller(LAUNCHER_1, USER_0, () -> mLauncherApps.registerCallback(c0_1, h));
   2956         runWithCaller(LAUNCHER_2, USER_0, () -> mLauncherApps.registerCallback(c0_2, h));
   2957         runWithCaller(LAUNCHER_3, USER_0, () -> mLauncherApps.registerCallback(c0_3, h));
   2958         runWithCaller(LAUNCHER_4, USER_0, () -> mLauncherApps.registerCallback(c0_4, h));
   2959         runWithCaller(LAUNCHER_1, USER_P0, () -> mLauncherApps.registerCallback(cP0_1, h));
   2960         runWithCaller(LAUNCHER_1, USER_10, () -> mLauncherApps.registerCallback(c10_1, h));
   2961         runWithCaller(LAUNCHER_2, USER_10, () -> mLauncherApps.registerCallback(c10_2, h));
   2962         runWithCaller(LAUNCHER_1, USER_11, () -> mLauncherApps.registerCallback(c11_1, h));
   2963 
   2964         // User 0.
   2965 
   2966         resetAll(all);
   2967         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   2968             mManager.removeDynamicShortcuts(list());
   2969         });
   2970         waitOnMainThread();
   2971 
   2972         assertCallbackNotReceived(c0_1);
   2973         assertCallbackNotReceived(c0_3);
   2974         assertCallbackNotReceived(c0_4);
   2975         assertCallbackNotReceived(c10_1);
   2976         assertCallbackNotReceived(c10_2);
   2977         assertCallbackNotReceived(c11_1);
   2978         assertCallbackReceived(c0_2, HANDLE_USER_0, CALLING_PACKAGE_1, "s1", "s2", "s3");
   2979         assertCallbackReceived(cP0_1, HANDLE_USER_0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s4");
   2980 
   2981         // User 0, different package.
   2982 
   2983         resetAll(all);
   2984         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   2985             mManager.removeDynamicShortcuts(list());
   2986         });
   2987         waitOnMainThread();
   2988 
   2989         assertCallbackNotReceived(c0_1);
   2990         assertCallbackNotReceived(c0_3);
   2991         assertCallbackNotReceived(c0_4);
   2992         assertCallbackNotReceived(c10_1);
   2993         assertCallbackNotReceived(c10_2);
   2994         assertCallbackNotReceived(c11_1);
   2995         assertCallbackReceived(c0_2, HANDLE_USER_0, CALLING_PACKAGE_3, "s1", "s2", "s3", "s4");
   2996         assertCallbackReceived(cP0_1, HANDLE_USER_0, CALLING_PACKAGE_3,
   2997                 "s1", "s2", "s3", "s4", "s5", "s6");
   2998 
   2999         // Work profile.
   3000         resetAll(all);
   3001         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
   3002             mManager.removeDynamicShortcuts(list());
   3003         });
   3004         waitOnMainThread();
   3005 
   3006         assertCallbackNotReceived(c0_1);
   3007         assertCallbackNotReceived(c0_3);
   3008         assertCallbackNotReceived(c0_4);
   3009         assertCallbackNotReceived(c10_1);
   3010         assertCallbackNotReceived(c10_2);
   3011         assertCallbackNotReceived(c11_1);
   3012         assertCallbackReceived(c0_2, HANDLE_USER_P0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s5");
   3013         assertCallbackReceived(cP0_1, HANDLE_USER_P0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s4");
   3014 
   3015         // Normal secondary user.
   3016         mRunningUsers.put(USER_10, true);
   3017 
   3018         resetAll(all);
   3019         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   3020             mManager.removeDynamicShortcuts(list());
   3021         });
   3022         waitOnMainThread();
   3023 
   3024         assertCallbackNotReceived(c0_1);
   3025         assertCallbackNotReceived(c0_2);
   3026         assertCallbackNotReceived(c0_3);
   3027         assertCallbackNotReceived(c0_4);
   3028         assertCallbackNotReceived(cP0_1);
   3029         assertCallbackNotReceived(c10_2);
   3030         assertCallbackNotReceived(c11_1);
   3031         assertCallbackReceived(c10_1, HANDLE_USER_10, CALLING_PACKAGE_1,
   3032                 "x1", "x2", "x3", "x4", "x5");
   3033     }
   3034 
   3035     // === Test for persisting ===
   3036 
   3037     public void testSaveAndLoadUser_empty() {
   3038         assertTrue(mManager.setDynamicShortcuts(list()));
   3039 
   3040         Log.i(TAG, "Saved state");
   3041         dumpsysOnLogcat();
   3042         dumpUserFile(0);
   3043 
   3044         // Restore.
   3045         mService.saveDirtyInfo();
   3046         initService();
   3047 
   3048         assertEquals(0, mManager.getDynamicShortcuts().size());
   3049     }
   3050 
   3051     /**
   3052      * Try save and load, also stop/start the user.
   3053      */
   3054     public void testSaveAndLoadUser() {
   3055         // First, create some shortcuts and save.
   3056         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   3057             final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16);
   3058             final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
   3059                     getTestContext().getResources(), R.drawable.icon2));
   3060 
   3061             final ShortcutInfo si1 = makeShortcut(
   3062                     "s1",
   3063                     "title1-1",
   3064                     makeComponent(ShortcutActivity.class),
   3065                     icon1,
   3066                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
   3067                             "key1", "val1", "nest", makeBundle("key", 123)),
   3068                         /* weight */ 10);
   3069 
   3070             final ShortcutInfo si2 = makeShortcut(
   3071                     "s2",
   3072                     "title1-2",
   3073                         /* activity */ null,
   3074                     icon2,
   3075                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
   3076                         /* weight */ 12);
   3077 
   3078             assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
   3079 
   3080             assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
   3081             assertEquals(2, mManager.getRemainingCallCount());
   3082         });
   3083         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
   3084             final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_16x64);
   3085             final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
   3086                     getTestContext().getResources(), R.drawable.icon2));
   3087 
   3088             final ShortcutInfo si1 = makeShortcut(
   3089                     "s1",
   3090                     "title2-1",
   3091                     makeComponent(ShortcutActivity.class),
   3092                     icon1,
   3093                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
   3094                             "key1", "val1", "nest", makeBundle("key", 123)),
   3095                         /* weight */ 10);
   3096 
   3097             final ShortcutInfo si2 = makeShortcut(
   3098                     "s2",
   3099                     "title2-2",
   3100                         /* activity */ null,
   3101                     icon2,
   3102                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
   3103                         /* weight */ 12);
   3104 
   3105             assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
   3106 
   3107             assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
   3108             assertEquals(2, mManager.getRemainingCallCount());
   3109         });
   3110 
   3111         mRunningUsers.put(USER_10, true);
   3112 
   3113         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   3114             final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
   3115             final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
   3116                     getTestContext().getResources(), R.drawable.icon2));
   3117 
   3118             final ShortcutInfo si1 = makeShortcut(
   3119                     "s1",
   3120                     "title10-1-1",
   3121                     makeComponent(ShortcutActivity.class),
   3122                     icon1,
   3123                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
   3124                             "key1", "val1", "nest", makeBundle("key", 123)),
   3125                         /* weight */ 10);
   3126 
   3127             final ShortcutInfo si2 = makeShortcut(
   3128                     "s2",
   3129                     "title10-1-2",
   3130                         /* activity */ null,
   3131                     icon2,
   3132                     makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
   3133                         /* weight */ 12);
   3134 
   3135             assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
   3136 
   3137             assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
   3138             assertEquals(2, mManager.getRemainingCallCount());
   3139         });
   3140 
   3141         mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM).setLauncher(
   3142                 new ComponentName("pkg1", "class"));
   3143 
   3144         // Restore.
   3145         mService.saveDirtyInfo();
   3146         initService();
   3147 
   3148         // Before the load, the map should be empty.
   3149         assertEquals(0, mService.getShortcutsForTest().size());
   3150 
   3151         // this will pre-load the per-user info.
   3152         mService.handleUnlockUser(UserHandle.USER_SYSTEM);
   3153 
   3154         // Now it's loaded.
   3155         assertEquals(1, mService.getShortcutsForTest().size());
   3156 
   3157         runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
   3158             assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
   3159                     mManager.getDynamicShortcuts()))), "s1", "s2");
   3160             assertEquals(2, mManager.getRemainingCallCount());
   3161 
   3162             assertEquals("title1-1", getCallerShortcut("s1").getTitle());
   3163             assertEquals("title1-2", getCallerShortcut("s2").getTitle());
   3164         });
   3165         runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
   3166             assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
   3167                     mManager.getDynamicShortcuts()))), "s1", "s2");
   3168             assertEquals(2, mManager.getRemainingCallCount());
   3169 
   3170             assertEquals("title2-1", getCallerShortcut("s1").getTitle());
   3171             assertEquals("title2-2", getCallerShortcut("s2").getTitle());
   3172         });
   3173 
   3174         assertEquals("pkg1", mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM)
   3175                 .getLastKnownLauncher().getPackageName());
   3176 
   3177         // Start another user
   3178         mService.handleUnlockUser(USER_10);
   3179 
   3180         // Now the size is 2.
   3181         assertEquals(2, mService.getShortcutsForTest().size());
   3182 
   3183         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   3184             assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
   3185                     mManager.getDynamicShortcuts()))), "s1", "s2");
   3186             assertEquals(2, mManager.getRemainingCallCount());
   3187 
   3188             assertEquals("title10-1-1", getCallerShortcut("s1").getTitle());
   3189             assertEquals("title10-1-2", getCallerShortcut("s2").getTitle());
   3190         });
   3191         assertNull(mService.getShortcutsForTest().get(USER_10).getLastKnownLauncher());
   3192 
   3193         // Try stopping the user
   3194         mService.handleCleanupUser(USER_10);
   3195 
   3196         // Now it's unloaded.
   3197         assertEquals(1, mService.getShortcutsForTest().size());
   3198 
   3199         // TODO Check all other fields
   3200     }
   3201 
   3202     public void testCleanupPackage() {
   3203         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3204             assertTrue(mManager.setDynamicShortcuts(list(
   3205                     makeShortcut("s0_1"))));
   3206         });
   3207         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   3208             assertTrue(mManager.setDynamicShortcuts(list(
   3209                     makeShortcut("s0_2"))));
   3210         });
   3211         runWithCaller(LAUNCHER_1, USER_0, () -> {
   3212             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
   3213                     HANDLE_USER_0);
   3214             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
   3215                     HANDLE_USER_0);
   3216         });
   3217         runWithCaller(LAUNCHER_2, USER_0, () -> {
   3218             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
   3219                     HANDLE_USER_0);
   3220             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
   3221                     HANDLE_USER_0);
   3222         });
   3223 
   3224         mRunningUsers.put(USER_10, true);
   3225 
   3226         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   3227             assertTrue(mManager.setDynamicShortcuts(list(
   3228                     makeShortcut("s10_1"))));
   3229         });
   3230         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   3231             assertTrue(mManager.setDynamicShortcuts(list(
   3232                     makeShortcut("s10_2"))));
   3233         });
   3234         runWithCaller(LAUNCHER_1, USER_10, () -> {
   3235             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
   3236                     HANDLE_USER_10);
   3237             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
   3238                     HANDLE_USER_10);
   3239         });
   3240         runWithCaller(LAUNCHER_2, USER_10, () -> {
   3241             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
   3242                     HANDLE_USER_10);
   3243             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
   3244                     HANDLE_USER_10);
   3245         });
   3246 
   3247         // Remove all dynamic shortcuts; now all shortcuts are just pinned.
   3248         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3249             mManager.removeAllDynamicShortcuts();
   3250         });
   3251         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   3252             mManager.removeAllDynamicShortcuts();
   3253         });
   3254         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   3255             mManager.removeAllDynamicShortcuts();
   3256         });
   3257         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   3258             mManager.removeAllDynamicShortcuts();
   3259         });
   3260 
   3261 
   3262         final SparseArray<ShortcutUser> users =  mService.getShortcutsForTest();
   3263         assertEquals(2, users.size());
   3264         assertEquals(USER_0, users.keyAt(0));
   3265         assertEquals(USER_10, users.keyAt(1));
   3266 
   3267         final ShortcutUser user0 =  users.get(USER_0);
   3268         final ShortcutUser user10 =  users.get(USER_10);
   3269 
   3270 
   3271         // Check the registered packages.
   3272         dumpsysOnLogcat();
   3273         assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
   3274                 hashSet(user0.getAllPackagesForTest().keySet()));
   3275         assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
   3276                 hashSet(user10.getAllPackagesForTest().keySet()));
   3277         assertEquals(
   3278                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3279                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3280                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3281         assertEquals(
   3282                 set(PackageWithUser.of(USER_10, LAUNCHER_1),
   3283                         PackageWithUser.of(USER_10, LAUNCHER_2)),
   3284                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3285         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3286                 "s0_1", "s0_2");
   3287         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3288                 "s0_1", "s0_2");
   3289         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
   3290                 "s10_1", "s10_2");
   3291         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
   3292                 "s10_1", "s10_2");
   3293         assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3294         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3295         assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3296         assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3297 
   3298         mService.saveDirtyInfo();
   3299 
   3300         // Nonexistent package.
   3301         uninstallPackage(USER_0, "abc");
   3302         mService.cleanUpPackageLocked("abc", USER_0, USER_0, /* appStillExists = */ false);
   3303 
   3304         // No changes.
   3305         assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
   3306                 hashSet(user0.getAllPackagesForTest().keySet()));
   3307         assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
   3308                 hashSet(user10.getAllPackagesForTest().keySet()));
   3309         assertEquals(
   3310                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3311                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3312                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3313         assertEquals(
   3314                 set(PackageWithUser.of(USER_10, LAUNCHER_1),
   3315                         PackageWithUser.of(USER_10, LAUNCHER_2)),
   3316                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3317         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3318                 "s0_1", "s0_2");
   3319         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3320                 "s0_1", "s0_2");
   3321         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
   3322                 "s10_1", "s10_2");
   3323         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
   3324                 "s10_1", "s10_2");
   3325         assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3326         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3327         assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3328         assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3329 
   3330         mService.saveDirtyInfo();
   3331 
   3332         // Remove a package.
   3333         uninstallPackage(USER_0, CALLING_PACKAGE_1);
   3334         mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_0, USER_0,
   3335                 /* appStillExists = */ false);
   3336 
   3337         assertEquals(set(CALLING_PACKAGE_2),
   3338                 hashSet(user0.getAllPackagesForTest().keySet()));
   3339         assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
   3340                 hashSet(user10.getAllPackagesForTest().keySet()));
   3341         assertEquals(
   3342                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3343                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3344                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3345         assertEquals(
   3346                 set(PackageWithUser.of(USER_10, LAUNCHER_1),
   3347                         PackageWithUser.of(USER_10, LAUNCHER_2)),
   3348                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3349         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3350                 "s0_2");
   3351         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3352                 "s0_2");
   3353         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
   3354                 "s10_1", "s10_2");
   3355         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
   3356                 "s10_1", "s10_2");
   3357         assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3358         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3359         assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3360         assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3361 
   3362         mService.saveDirtyInfo();
   3363 
   3364         // Remove a launcher.
   3365         uninstallPackage(USER_10, LAUNCHER_1);
   3366         mService.cleanUpPackageLocked(LAUNCHER_1, USER_10, USER_10, /* appStillExists = */ false);
   3367 
   3368         assertEquals(set(CALLING_PACKAGE_2),
   3369                 hashSet(user0.getAllPackagesForTest().keySet()));
   3370         assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
   3371                 hashSet(user10.getAllPackagesForTest().keySet()));
   3372         assertEquals(
   3373                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3374                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3375                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3376         assertEquals(
   3377                 set(PackageWithUser.of(USER_10, LAUNCHER_2)),
   3378                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3379         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3380                 "s0_2");
   3381         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3382                 "s0_2");
   3383         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
   3384                 "s10_1", "s10_2");
   3385         assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3386         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3387         assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3388         assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3389 
   3390         mService.saveDirtyInfo();
   3391 
   3392         // Remove a package.
   3393         uninstallPackage(USER_10, CALLING_PACKAGE_2);
   3394         mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_10, USER_10,
   3395                 /* appStillExists = */ false);
   3396 
   3397         assertEquals(set(CALLING_PACKAGE_2),
   3398                 hashSet(user0.getAllPackagesForTest().keySet()));
   3399         assertEquals(set(CALLING_PACKAGE_1),
   3400                 hashSet(user10.getAllPackagesForTest().keySet()));
   3401         assertEquals(
   3402                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3403                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3404                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3405         assertEquals(
   3406                 set(PackageWithUser.of(USER_10, LAUNCHER_2)),
   3407                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3408         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3409                 "s0_2");
   3410         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3411                 "s0_2");
   3412         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
   3413                 "s10_1");
   3414         assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3415         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3416         assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3417         assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3418 
   3419         mService.saveDirtyInfo();
   3420 
   3421         // Remove the other launcher from user 10 too.
   3422         uninstallPackage(USER_10, LAUNCHER_2);
   3423         mService.cleanUpPackageLocked(LAUNCHER_2, USER_10, USER_10,
   3424                 /* appStillExists = */ false);
   3425 
   3426         assertEquals(set(CALLING_PACKAGE_2),
   3427                 hashSet(user0.getAllPackagesForTest().keySet()));
   3428         assertEquals(set(CALLING_PACKAGE_1),
   3429                 hashSet(user10.getAllPackagesForTest().keySet()));
   3430         assertEquals(
   3431                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3432                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3433                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3434         assertEquals(
   3435                 set(),
   3436                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3437         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3438                 "s0_2");
   3439         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3440                 "s0_2");
   3441 
   3442         // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
   3443         assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3444         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3445         assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3446         assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3447 
   3448         mService.saveDirtyInfo();
   3449 
   3450         // More remove.
   3451         uninstallPackage(USER_10, CALLING_PACKAGE_1);
   3452         mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_10, USER_10,
   3453                 /* appStillExists = */ false);
   3454 
   3455         assertEquals(set(CALLING_PACKAGE_2),
   3456                 hashSet(user0.getAllPackagesForTest().keySet()));
   3457         assertEquals(set(),
   3458                 hashSet(user10.getAllPackagesForTest().keySet()));
   3459         assertEquals(
   3460                 set(PackageWithUser.of(USER_0, LAUNCHER_1),
   3461                         PackageWithUser.of(USER_0, LAUNCHER_2)),
   3462                 hashSet(user0.getAllLaunchersForTest().keySet()));
   3463         assertEquals(set(),
   3464                 hashSet(user10.getAllLaunchersForTest().keySet()));
   3465         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
   3466                 "s0_2");
   3467         assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
   3468                 "s0_2");
   3469 
   3470         // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
   3471         assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
   3472         assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
   3473         assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
   3474         assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
   3475 
   3476         mService.saveDirtyInfo();
   3477     }
   3478 
   3479     public void testCleanupPackage_republishManifests() {
   3480         addManifestShortcutResource(
   3481                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   3482                 R.xml.shortcut_2);
   3483         updatePackageVersion(CALLING_PACKAGE_1, 1);
   3484                 mService.mPackageMonitor.onReceive(getTestContext(),
   3485                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   3486 
   3487         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3488             assertTrue(mManager.setDynamicShortcuts(list(
   3489                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   3490         });
   3491         runWithCaller(LAUNCHER_1, USER_0, () -> {
   3492             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   3493                     list("s2", "s3", "ms1", "ms2"), HANDLE_USER_0);
   3494         });
   3495 
   3496         // Remove ms2 from manifest.
   3497         addManifestShortcutResource(
   3498                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   3499                 R.xml.shortcut_1);
   3500         updatePackageVersion(CALLING_PACKAGE_1, 1);
   3501                 mService.mPackageMonitor.onReceive(getTestContext(),
   3502                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   3503 
   3504         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3505             assertTrue(mManager.setDynamicShortcuts(list(
   3506                     makeShortcut("s1"), makeShortcut("s2"))));
   3507 
   3508             // Make sure the shortcuts are in the intended state.
   3509             assertWith(getCallerShortcuts())
   3510                     .haveIds("ms1", "ms2", "s1", "s2", "s3")
   3511 
   3512                     .selectByIds("ms1")
   3513                     .areAllManifest()
   3514                     .areAllPinned()
   3515 
   3516                     .revertToOriginalList()
   3517                     .selectByIds("ms2")
   3518                     .areAllNotManifest()
   3519                     .areAllPinned()
   3520 
   3521                     .revertToOriginalList()
   3522                     .selectByIds("s1")
   3523                     .areAllDynamic()
   3524                     .areAllNotPinned()
   3525 
   3526                     .revertToOriginalList()
   3527                     .selectByIds("s2")
   3528                     .areAllDynamic()
   3529                     .areAllPinned()
   3530 
   3531                     .revertToOriginalList()
   3532                     .selectByIds("s3")
   3533                     .areAllNotDynamic()
   3534                     .areAllPinned();
   3535         });
   3536 
   3537         // Clean up + re-publish manifests.
   3538         mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_0, USER_0,
   3539                 /* appStillExists = */ true);
   3540         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3541             assertWith(getCallerShortcuts())
   3542                     .haveIds("ms1")
   3543                     .areAllManifest();
   3544         });
   3545     }
   3546 
   3547     public void testHandleGonePackage_crossProfile() {
   3548         // Create some shortcuts.
   3549         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3550             assertTrue(mManager.setDynamicShortcuts(list(
   3551                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   3552         });
   3553         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
   3554             assertTrue(mManager.setDynamicShortcuts(list(
   3555                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   3556         });
   3557         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   3558             assertTrue(mManager.setDynamicShortcuts(list(
   3559                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   3560         });
   3561 
   3562         mRunningUsers.put(USER_10, true);
   3563 
   3564         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   3565             assertTrue(mManager.setDynamicShortcuts(list(
   3566                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   3567         });
   3568 
   3569         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3570         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3571         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3572 
   3573         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3574         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3575         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3576 
   3577         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3578         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3579         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3580 
   3581         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3582         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3583         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3584 
   3585         // Pin some.
   3586 
   3587         runWithCaller(LAUNCHER_1, USER_0, () -> {
   3588             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   3589                     list("s1"), HANDLE_USER_0);
   3590 
   3591             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   3592                     list("s2"), UserHandle.of(USER_P0));
   3593 
   3594             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   3595                     list("s3"), HANDLE_USER_0);
   3596         });
   3597 
   3598         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   3599             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   3600                     list("s2"), HANDLE_USER_0);
   3601 
   3602             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   3603                     list("s3"), UserHandle.of(USER_P0));
   3604 
   3605             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
   3606                     list("s1"), HANDLE_USER_0);
   3607         });
   3608 
   3609         runWithCaller(LAUNCHER_1, USER_10, () -> {
   3610             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   3611                     list("s3"), HANDLE_USER_10);
   3612         });
   3613 
   3614         // Check the state.
   3615 
   3616         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3617         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3618         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3619 
   3620         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3621         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3622         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3623 
   3624         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3625         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3626         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3627 
   3628         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3629         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3630         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3631 
   3632         // Make sure all the information is persisted.
   3633         mService.saveDirtyInfo();
   3634         initService();
   3635         mService.handleUnlockUser(USER_0);
   3636         mService.handleUnlockUser(USER_P0);
   3637         mService.handleUnlockUser(USER_10);
   3638 
   3639         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3640         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3641         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3642 
   3643         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3644         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3645         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3646 
   3647         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3648         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3649         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3650 
   3651         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3652         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3653         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3654 
   3655         // Start uninstalling.
   3656         uninstallPackage(USER_10, LAUNCHER_1);
   3657         mService.checkPackageChanges(USER_10);
   3658 
   3659         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3660         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3661         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3662 
   3663         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3664         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3665         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3666 
   3667         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3668         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3669         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3670 
   3671         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3672         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3673         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3674 
   3675         // Uninstall.
   3676         uninstallPackage(USER_10, CALLING_PACKAGE_1);
   3677         mService.checkPackageChanges(USER_10);
   3678 
   3679         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3680         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3681         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3682 
   3683         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3684         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3685         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3686 
   3687         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3688         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3689         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3690 
   3691         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3692         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3693         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3694 
   3695         uninstallPackage(USER_P0, LAUNCHER_1);
   3696         mService.checkPackageChanges(USER_0);
   3697 
   3698         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3699         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3700         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3701 
   3702         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3703         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3704         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3705 
   3706         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3707         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3708         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3709 
   3710         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3711         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3712         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3713 
   3714         mService.checkPackageChanges(USER_P0);
   3715 
   3716         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3717         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3718         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3719 
   3720         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3721         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3722         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3723 
   3724         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3725         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3726         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3727 
   3728         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3729         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3730         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3731 
   3732         uninstallPackage(USER_P0, CALLING_PACKAGE_1);
   3733 
   3734         mService.saveDirtyInfo();
   3735         initService();
   3736         mService.handleUnlockUser(USER_0);
   3737         mService.handleUnlockUser(USER_P0);
   3738         mService.handleUnlockUser(USER_10);
   3739 
   3740         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3741         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3742         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3743 
   3744         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3745         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3746         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3747 
   3748         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3749         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3750         assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3751 
   3752         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3753         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3754         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3755 
   3756         // Uninstall
   3757         uninstallPackage(USER_0, LAUNCHER_1);
   3758 
   3759         mService.saveDirtyInfo();
   3760         initService();
   3761         mService.handleUnlockUser(USER_0);
   3762         mService.handleUnlockUser(USER_P0);
   3763         mService.handleUnlockUser(USER_10);
   3764 
   3765         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3766         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3767         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3768 
   3769         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3770         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3771         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3772 
   3773         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3774         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3775         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3776 
   3777         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3778         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3779         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3780 
   3781         uninstallPackage(USER_0, CALLING_PACKAGE_2);
   3782 
   3783         mService.saveDirtyInfo();
   3784         initService();
   3785         mService.handleUnlockUser(USER_0);
   3786         mService.handleUnlockUser(USER_P0);
   3787         mService.handleUnlockUser(USER_10);
   3788 
   3789         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
   3790         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
   3791         assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
   3792 
   3793         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
   3794         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
   3795         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
   3796 
   3797         assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
   3798         assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
   3799         assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
   3800 
   3801         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
   3802         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
   3803         assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
   3804     }
   3805 
   3806     protected void checkCanRestoreTo(boolean expected, ShortcutPackageInfo spi,
   3807             int version, String... signatures) {
   3808         assertEquals(expected, spi.canRestoreTo(mService, genPackage(
   3809                 "dummy", /* uid */ 0, version, signatures)));
   3810     }
   3811 
   3812     public void testCanRestoreTo() {
   3813         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1");
   3814         addPackage(CALLING_PACKAGE_2, CALLING_UID_1, 10, "sig1", "sig2");
   3815 
   3816         final ShortcutPackageInfo spi1 = ShortcutPackageInfo.generateForInstalledPackageForTest(
   3817                 mService, CALLING_PACKAGE_1, USER_0);
   3818         final ShortcutPackageInfo spi2 = ShortcutPackageInfo.generateForInstalledPackageForTest(
   3819                 mService, CALLING_PACKAGE_2, USER_0);
   3820 
   3821         checkCanRestoreTo(true, spi1, 10, "sig1");
   3822         checkCanRestoreTo(true, spi1, 10, "x", "sig1");
   3823         checkCanRestoreTo(true, spi1, 10, "sig1", "y");
   3824         checkCanRestoreTo(true, spi1, 10, "x", "sig1", "y");
   3825         checkCanRestoreTo(true, spi1, 11, "sig1");
   3826 
   3827         checkCanRestoreTo(false, spi1, 10 /* empty */);
   3828         checkCanRestoreTo(false, spi1, 10, "x");
   3829         checkCanRestoreTo(false, spi1, 10, "x", "y");
   3830         checkCanRestoreTo(false, spi1, 10, "x");
   3831         checkCanRestoreTo(false, spi1, 9, "sig1");
   3832 
   3833         checkCanRestoreTo(true, spi2, 10, "sig1", "sig2");
   3834         checkCanRestoreTo(true, spi2, 10, "sig2", "sig1");
   3835         checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2");
   3836         checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1");
   3837         checkCanRestoreTo(true, spi2, 10, "sig1", "sig2", "y");
   3838         checkCanRestoreTo(true, spi2, 10, "sig2", "sig1", "y");
   3839         checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2", "y");
   3840         checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1", "y");
   3841         checkCanRestoreTo(true, spi2, 11, "x", "sig2", "sig1", "y");
   3842 
   3843         checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x");
   3844         checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x");
   3845         checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2");
   3846         checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1");
   3847         checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x", "y");
   3848         checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x", "y");
   3849         checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2", "y");
   3850         checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1", "y");
   3851         checkCanRestoreTo(false, spi2, 11, "x", "sig2x", "sig1", "y");
   3852     }
   3853 
   3854     public void testHandlePackageDelete() {
   3855         final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
   3856                 getTestContext().getResources(), R.drawable.black_32x32));
   3857         setCaller(CALLING_PACKAGE_1, USER_0);
   3858         assertTrue(mManager.addDynamicShortcuts(list(
   3859                 makeShortcutWithIcon("s1", bmp32x32), makeShortcutWithIcon("s2", bmp32x32)
   3860         )));
   3861         // Also add a manifest shortcut, which should be removed too.
   3862         addManifestShortcutResource(
   3863                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   3864                 R.xml.shortcut_1);
   3865         updatePackageVersion(CALLING_PACKAGE_1, 1);
   3866                 mService.mPackageMonitor.onReceive(getTestContext(),
   3867                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   3868         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   3869             assertWith(getCallerShortcuts())
   3870                     .haveIds("s1", "s2", "ms1")
   3871 
   3872                     .selectManifest()
   3873                     .haveIds("ms1");
   3874         });
   3875 
   3876         setCaller(CALLING_PACKAGE_2, USER_0);
   3877         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3878 
   3879         setCaller(CALLING_PACKAGE_3, USER_0);
   3880         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3881 
   3882         mRunningUsers.put(USER_10, true);
   3883 
   3884         setCaller(CALLING_PACKAGE_1, USER_10);
   3885         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3886 
   3887         setCaller(CALLING_PACKAGE_2, USER_10);
   3888         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3889 
   3890         setCaller(CALLING_PACKAGE_3, USER_10);
   3891         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3892 
   3893         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   3894         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   3895         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   3896         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   3897         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   3898         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   3899 
   3900         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   3901         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   3902         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   3903         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   3904         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   3905         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   3906 
   3907         uninstallPackage(USER_0, CALLING_PACKAGE_1);
   3908                 mService.mPackageMonitor.onReceive(getTestContext(),
   3909                 genPackageDeleteIntent(CALLING_PACKAGE_1, USER_0));
   3910 
   3911         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   3912         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   3913         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   3914         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   3915         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   3916         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   3917 
   3918         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   3919         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   3920         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   3921         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   3922         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   3923         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   3924 
   3925         mRunningUsers.put(USER_10, true);
   3926 
   3927         uninstallPackage(USER_10, CALLING_PACKAGE_2);
   3928                 mService.mPackageMonitor.onReceive(getTestContext(),
   3929                 genPackageDeleteIntent(CALLING_PACKAGE_2, USER_10));
   3930 
   3931         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   3932         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   3933         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   3934         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   3935         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   3936         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   3937 
   3938         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   3939         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   3940         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   3941         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   3942         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   3943         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   3944 
   3945         mInjectedPackages.remove(CALLING_PACKAGE_1);
   3946         mInjectedPackages.remove(CALLING_PACKAGE_3);
   3947 
   3948         mService.checkPackageChanges(USER_0);
   3949 
   3950         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   3951         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   3952         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));  // ---------------
   3953         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   3954         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   3955         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   3956 
   3957         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   3958         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   3959         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   3960         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   3961         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   3962         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   3963 
   3964         mService.checkPackageChanges(USER_10);
   3965 
   3966         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   3967         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   3968         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   3969         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   3970         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   3971         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   3972 
   3973         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   3974         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   3975         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   3976         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   3977         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   3978         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   3979     }
   3980 
   3981     /** Almost ame as testHandlePackageDelete, except it doesn't uninstall packages. */
   3982     public void testHandlePackageClearData() {
   3983         final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
   3984                 getTestContext().getResources(), R.drawable.black_32x32));
   3985         setCaller(CALLING_PACKAGE_1, USER_0);
   3986         assertTrue(mManager.addDynamicShortcuts(list(
   3987                 makeShortcutWithIcon("s1", bmp32x32), makeShortcutWithIcon("s2", bmp32x32)
   3988         )));
   3989 
   3990         setCaller(CALLING_PACKAGE_2, USER_0);
   3991         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3992 
   3993         setCaller(CALLING_PACKAGE_3, USER_0);
   3994         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   3995 
   3996         mRunningUsers.put(USER_10, true);
   3997 
   3998         setCaller(CALLING_PACKAGE_1, USER_10);
   3999         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   4000 
   4001         setCaller(CALLING_PACKAGE_2, USER_10);
   4002         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   4003 
   4004         setCaller(CALLING_PACKAGE_3, USER_10);
   4005         assertTrue(mManager.addDynamicShortcuts(list(makeShortcutWithIcon("s1", bmp32x32))));
   4006 
   4007         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   4008         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   4009         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   4010         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   4011         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   4012         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   4013 
   4014         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   4015         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   4016         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   4017         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   4018         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   4019         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   4020 
   4021                 mService.mPackageMonitor.onReceive(getTestContext(),
   4022                 genPackageDataClear(CALLING_PACKAGE_1, USER_0));
   4023 
   4024         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   4025         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   4026         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   4027         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   4028         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   4029         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   4030 
   4031         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   4032         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   4033         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   4034         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   4035         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   4036         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   4037 
   4038         mRunningUsers.put(USER_10, true);
   4039 
   4040                 mService.mPackageMonitor.onReceive(getTestContext(),
   4041                 genPackageDataClear(CALLING_PACKAGE_2, USER_10));
   4042 
   4043         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
   4044         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
   4045         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
   4046         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
   4047         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
   4048         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
   4049 
   4050         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_0));
   4051         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_0));
   4052         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_0));
   4053         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_1, USER_10));
   4054         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
   4055         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
   4056     }
   4057 
   4058     public void testHandlePackageClearData_manifestRepublished() {
   4059 
   4060         mRunningUsers.put(USER_10, true);
   4061 
   4062         // Add two manifests and two dynamics.
   4063         addManifestShortcutResource(
   4064                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   4065                 R.xml.shortcut_2);
   4066         updatePackageVersion(CALLING_PACKAGE_1, 1);
   4067                 mService.mPackageMonitor.onReceive(getTestContext(),
   4068                 genPackageAddIntent(CALLING_PACKAGE_1, USER_10));
   4069 
   4070         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4071             assertTrue(mManager.addDynamicShortcuts(list(
   4072                     makeShortcut("s1"), makeShortcut("s2"))));
   4073         });
   4074         runWithCaller(LAUNCHER_1, USER_10, () -> {
   4075             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2", "s2"), HANDLE_USER_10);
   4076         });
   4077 
   4078         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4079             assertWith(getCallerShortcuts())
   4080                     .haveIds("ms1", "ms2", "s1", "s2")
   4081                     .areAllEnabled()
   4082 
   4083                     .selectPinned()
   4084                     .haveIds("ms2", "s2");
   4085         });
   4086 
   4087         // Clear data
   4088         mService.mPackageMonitor.onReceive(getTestContext(),
   4089                 genPackageDataClear(CALLING_PACKAGE_1, USER_10));
   4090 
   4091         // Only manifest shortcuts will remain, and are no longer pinned.
   4092         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4093             assertWith(getCallerShortcuts())
   4094                     .haveIds("ms1", "ms2")
   4095                     .areAllEnabled()
   4096                     .areAllNotPinned();
   4097         });
   4098     }
   4099 
   4100     public void testHandlePackageUpdate() throws Throwable {
   4101         // Set up shortcuts and launchers.
   4102 
   4103         final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
   4104         final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
   4105                 getTestContext().getResources(), R.drawable.black_32x32));
   4106 
   4107         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4108             assertTrue(mManager.setDynamicShortcuts(list(
   4109                     makeShortcut("s1"),
   4110                     makeShortcutWithIcon("s2", res32x32),
   4111                     makeShortcutWithIcon("s3", res32x32),
   4112                     makeShortcutWithIcon("s4", bmp32x32))));
   4113         });
   4114         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4115             assertTrue(mManager.setDynamicShortcuts(list(
   4116                     makeShortcut("s1"),
   4117                     makeShortcutWithIcon("s2", bmp32x32))));
   4118         });
   4119         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   4120             assertTrue(mManager.setDynamicShortcuts(list(
   4121                     makeShortcutWithIcon("s1", res32x32))));
   4122         });
   4123 
   4124         mRunningUsers.put(USER_10, true);
   4125 
   4126         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4127             assertTrue(mManager.setDynamicShortcuts(list(
   4128                     makeShortcutWithIcon("s1", res32x32),
   4129                     makeShortcutWithIcon("s2", res32x32))));
   4130         });
   4131         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   4132             assertTrue(mManager.setDynamicShortcuts(list(
   4133                     makeShortcutWithIcon("s1", bmp32x32),
   4134                     makeShortcutWithIcon("s2", bmp32x32))));
   4135         });
   4136 
   4137         LauncherApps.Callback c0 = mock(LauncherApps.Callback.class);
   4138         LauncherApps.Callback c10 = mock(LauncherApps.Callback.class);
   4139 
   4140         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4141             mLauncherApps.registerCallback(c0, new Handler(Looper.getMainLooper()));
   4142         });
   4143         runWithCaller(LAUNCHER_1, USER_10, () -> {
   4144             mLauncherApps.registerCallback(c10, new Handler(Looper.getMainLooper()));
   4145         });
   4146 
   4147         mInjectedCurrentTimeMillis = START_TIME + 100;
   4148 
   4149         ArgumentCaptor<List> shortcuts;
   4150 
   4151         // Update the version info for package 1.
   4152         reset(c0);
   4153         reset(c10);
   4154         updatePackageVersion(CALLING_PACKAGE_1, 1);
   4155 
   4156         // Then send the broadcast, to only user-0.
   4157         mService.mPackageMonitor.onReceive(getTestContext(),
   4158                 genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
   4159 
   4160         waitOnMainThread();
   4161 
   4162         // User-0 should get the notification.
   4163         shortcuts = ArgumentCaptor.forClass(List.class);
   4164         verify(c0).onShortcutsChanged(
   4165                 eq(CALLING_PACKAGE_1),
   4166                 shortcuts.capture(),
   4167                 eq(HANDLE_USER_0));
   4168 
   4169         // User-10 shouldn't yet get the notification.
   4170         verify(c10, times(0)).onShortcutsChanged(
   4171                 eq(CALLING_PACKAGE_1),
   4172                 any(List.class),
   4173                 any(UserHandle.class));
   4174         assertShortcutIds(shortcuts.getValue(), "s1", "s2", "s3", "s4");
   4175         assertEquals(START_TIME,
   4176                 findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
   4177         assertEquals(START_TIME + 100,
   4178                 findShortcut(shortcuts.getValue(), "s2").getLastChangedTimestamp());
   4179         assertEquals(START_TIME + 100,
   4180                 findShortcut(shortcuts.getValue(), "s3").getLastChangedTimestamp());
   4181         assertEquals(START_TIME,
   4182                 findShortcut(shortcuts.getValue(), "s4").getLastChangedTimestamp());
   4183 
   4184         // Next, send unlock even on user-10.  Now we scan packages on this user and send a
   4185         // notification to the launcher.
   4186         mInjectedCurrentTimeMillis = START_TIME + 200;
   4187 
   4188         mRunningUsers.put(USER_10, true);
   4189         mUnlockedUsers.put(USER_10, true);
   4190 
   4191         reset(c0);
   4192         reset(c10);
   4193         setPackageLastUpdateTime(CALLING_PACKAGE_1, mInjectedCurrentTimeMillis);
   4194         mService.handleUnlockUser(USER_10);
   4195         mService.checkPackageChanges(USER_10);
   4196 
   4197         waitOnMainThread();
   4198 
   4199         shortcuts = ArgumentCaptor.forClass(List.class);
   4200         verify(c0, times(0)).onShortcutsChanged(
   4201                 eq(CALLING_PACKAGE_1),
   4202                 any(List.class),
   4203                 any(UserHandle.class));
   4204 
   4205         verify(c10).onShortcutsChanged(
   4206                 eq(CALLING_PACKAGE_1),
   4207                 shortcuts.capture(),
   4208                 eq(HANDLE_USER_10));
   4209 
   4210         assertShortcutIds(shortcuts.getValue(), "s1", "s2");
   4211         assertEquals(START_TIME + 200,
   4212                 findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
   4213         assertEquals(START_TIME + 200,
   4214                 findShortcut(shortcuts.getValue(), "s2").getLastChangedTimestamp());
   4215 
   4216 
   4217         // Do the same thing for package 2, which doesn't have resource icons.
   4218         mInjectedCurrentTimeMillis = START_TIME + 300;
   4219 
   4220         reset(c0);
   4221         reset(c10);
   4222         updatePackageVersion(CALLING_PACKAGE_2, 10);
   4223 
   4224         // Then send the broadcast, to only user-0.
   4225                 mService.mPackageMonitor.onReceive(getTestContext(),
   4226                 genPackageUpdateIntent(CALLING_PACKAGE_2, USER_0));
   4227         mService.checkPackageChanges(USER_10);
   4228 
   4229         waitOnMainThread();
   4230 
   4231         verify(c0, times(0)).onShortcutsChanged(
   4232                 eq(CALLING_PACKAGE_1),
   4233                 any(List.class),
   4234                 any(UserHandle.class));
   4235 
   4236         verify(c10, times(0)).onShortcutsChanged(
   4237                 eq(CALLING_PACKAGE_1),
   4238                 any(List.class),
   4239                 any(UserHandle.class));
   4240 
   4241         // Do the same thing for package 3
   4242         mInjectedCurrentTimeMillis = START_TIME + 400;
   4243 
   4244         reset(c0);
   4245         reset(c10);
   4246         updatePackageVersion(CALLING_PACKAGE_3, 100);
   4247 
   4248         // Then send the broadcast, to only user-0.
   4249         mService.mPackageMonitor.onReceive(getTestContext(),
   4250                 genPackageUpdateIntent(CALLING_PACKAGE_3, USER_0));
   4251         mService.checkPackageChanges(USER_10);
   4252 
   4253         waitOnMainThread();
   4254 
   4255         shortcuts = ArgumentCaptor.forClass(List.class);
   4256         verify(c0).onShortcutsChanged(
   4257                 eq(CALLING_PACKAGE_3),
   4258                 shortcuts.capture(),
   4259                 eq(HANDLE_USER_0));
   4260 
   4261         // User 10 doesn't have package 3, so no callback.
   4262         verify(c10, times(0)).onShortcutsChanged(
   4263                 eq(CALLING_PACKAGE_3),
   4264                 any(List.class),
   4265                 any(UserHandle.class));
   4266 
   4267         assertShortcutIds(shortcuts.getValue(), "s1");
   4268         assertEquals(START_TIME + 400,
   4269                 findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
   4270     }
   4271 
   4272     /**
   4273      * Test the case where an updated app has resource IDs changed.
   4274      */
   4275     public void testHandlePackageUpdate_resIdChanged() throws Exception {
   4276         final Icon icon1 = Icon.createWithResource(getTestContext(), /* res ID */ 1000);
   4277         final Icon icon2 = Icon.createWithResource(getTestContext(), /* res ID */ 1001);
   4278 
   4279         // Set up shortcuts.
   4280         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4281             // Note resource strings are not officially supported (they're hidden), but
   4282             // should work.
   4283 
   4284             final ShortcutInfo s1 = new ShortcutInfo.Builder(mClientContext)
   4285                     .setId("s1")
   4286                     .setActivity(makeComponent(ShortcutActivity.class))
   4287                     .setIntent(new Intent(Intent.ACTION_VIEW))
   4288                     .setIcon(icon1)
   4289                     .setTitleResId(10000)
   4290                     .setTextResId(10001)
   4291                     .setDisabledMessageResId(10002)
   4292                     .build();
   4293 
   4294             final ShortcutInfo s2 = new ShortcutInfo.Builder(mClientContext)
   4295                     .setId("s2")
   4296                     .setActivity(makeComponent(ShortcutActivity.class))
   4297                     .setIntent(new Intent(Intent.ACTION_VIEW))
   4298                     .setIcon(icon2)
   4299                     .setTitleResId(20000)
   4300                     .build();
   4301 
   4302             assertTrue(mManager.setDynamicShortcuts(list(s1, s2)));
   4303         });
   4304 
   4305         // Verify.
   4306         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4307             final ShortcutInfo s1 = getCallerShortcut("s1");
   4308             final ShortcutInfo s2 = getCallerShortcut("s2");
   4309 
   4310             assertEquals(1000, s1.getIconResourceId());
   4311             assertEquals(10000, s1.getTitleResId());
   4312             assertEquals(10001, s1.getTextResId());
   4313             assertEquals(10002, s1.getDisabledMessageResourceId());
   4314 
   4315             assertEquals(1001, s2.getIconResourceId());
   4316             assertEquals(20000, s2.getTitleResId());
   4317             assertEquals(0, s2.getTextResId());
   4318             assertEquals(0, s2.getDisabledMessageResourceId());
   4319         });
   4320 
   4321         mService.saveDirtyInfo();
   4322         initService();
   4323 
   4324         // Set up the mock resources again, with an "adjustment".
   4325         // When the package is updated, the service will fetch the updated res-IDs with res-names,
   4326         // and the new IDs will have this offset.
   4327         setUpAppResources(10);
   4328 
   4329         // Update the package.
   4330         updatePackageVersion(CALLING_PACKAGE_1, 1);
   4331                 mService.mPackageMonitor.onReceive(getTestContext(),
   4332                 genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
   4333 
   4334         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4335             final ShortcutInfo s1 = getCallerShortcut("s1");
   4336             final ShortcutInfo s2 = getCallerShortcut("s2");
   4337 
   4338             assertEquals(1010, s1.getIconResourceId());
   4339             assertEquals(10010, s1.getTitleResId());
   4340             assertEquals(10011, s1.getTextResId());
   4341             assertEquals(10012, s1.getDisabledMessageResourceId());
   4342 
   4343             assertEquals(1011, s2.getIconResourceId());
   4344             assertEquals(20010, s2.getTitleResId());
   4345             assertEquals(0, s2.getTextResId());
   4346             assertEquals(0, s2.getDisabledMessageResourceId());
   4347         });
   4348     }
   4349 
   4350     public void testHandlePackageUpdate_systemAppUpdate() {
   4351 
   4352         // Package1 is a system app.  Package 2 is not a system app, so it's not scanned
   4353         // in this test at all.
   4354         mSystemPackages.add(CALLING_PACKAGE_1);
   4355 
   4356         // Initial state: no shortcuts.
   4357         mService.checkPackageChanges(USER_0);
   4358 
   4359         assertEquals(mInjectedCurrentTimeMillis,
   4360                 mService.getUserShortcutsLocked(USER_0).getLastAppScanTime());
   4361         assertEquals(mInjectedBuildFingerprint,
   4362                 mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint());
   4363 
   4364         // They have no shortcuts.
   4365         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4366             assertWith(getCallerShortcuts())
   4367                     .isEmpty();
   4368         });
   4369 
   4370         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4371             assertWith(getCallerShortcuts())
   4372                     .isEmpty();
   4373         });
   4374 
   4375         // Next.
   4376         // Update the packages -- now they have 1 manifest shortcut.
   4377         // But checkPackageChanges() don't notice it, since their version code / timestamp haven't
   4378         // changed.
   4379         addManifestShortcutResource(
   4380                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   4381                 R.xml.shortcut_1);
   4382         addManifestShortcutResource(
   4383                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   4384                 R.xml.shortcut_1);
   4385         mInjectedCurrentTimeMillis += 1000;
   4386         mService.checkPackageChanges(USER_0);
   4387 
   4388         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4389             assertWith(getCallerShortcuts())
   4390                     .isEmpty();
   4391         });
   4392         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4393             assertWith(getCallerShortcuts())
   4394                     .isEmpty();
   4395         });
   4396 
   4397         // Next.
   4398         // Update the build finger print.  All system apps will be scanned now.
   4399         mInjectedBuildFingerprint = "update1";
   4400         mInjectedCurrentTimeMillis += 1000;
   4401         mService.checkPackageChanges(USER_0);
   4402 
   4403         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4404             assertWith(getCallerShortcuts())
   4405                     .haveIds("ms1");
   4406         });
   4407         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4408             assertWith(getCallerShortcuts())
   4409                     .isEmpty();
   4410         });
   4411 
   4412         // Next.
   4413         // Update manifest shortcuts.
   4414         mInjectedBuildFingerprint = "update2";
   4415         addManifestShortcutResource(
   4416                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   4417                 R.xml.shortcut_2);
   4418         addManifestShortcutResource(
   4419                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   4420                 R.xml.shortcut_2);
   4421         mInjectedCurrentTimeMillis += 1000;
   4422         mService.checkPackageChanges(USER_0);
   4423 
   4424         // Fingerprint hasn't changed, so CALLING_PACKAGE_1 wasn't scanned.
   4425         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4426             assertWith(getCallerShortcuts())
   4427                     .haveIds("ms1");
   4428         });
   4429         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4430             assertWith(getCallerShortcuts())
   4431                     .isEmpty();
   4432         });
   4433 
   4434         // Update the fingerprint, but CALLING_PACKAGE_1's version code hasn't changed, so
   4435         // still not scanned.
   4436         mInjectedBuildFingerprint = "update2";
   4437         mInjectedCurrentTimeMillis += 1000;
   4438         mService.checkPackageChanges(USER_0);
   4439 
   4440         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4441             assertWith(getCallerShortcuts())
   4442                     .haveIds("ms1");
   4443         });
   4444         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4445             assertWith(getCallerShortcuts())
   4446                     .isEmpty();
   4447         });
   4448 
   4449         // Now update the version code, so CALLING_PACKAGE_1 is scanned again.
   4450         mInjectedBuildFingerprint = "update3";
   4451         mInjectedCurrentTimeMillis += 1000;
   4452         updatePackageVersion(CALLING_PACKAGE_1, 1);
   4453         mService.checkPackageChanges(USER_0);
   4454 
   4455         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4456             assertWith(getCallerShortcuts())
   4457                     .haveIds("ms1", "ms2");
   4458         });
   4459         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4460             assertWith(getCallerShortcuts())
   4461                     .isEmpty();
   4462         });
   4463 
   4464         // Make sure getLastAppScanTime / getLastAppScanOsFingerprint are persisted.
   4465         initService();
   4466         assertEquals(mInjectedCurrentTimeMillis,
   4467                 mService.getUserShortcutsLocked(USER_0).getLastAppScanTime());
   4468         assertEquals(mInjectedBuildFingerprint,
   4469                 mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint());
   4470     }
   4471 
   4472     public void testHandlePackageChanged() {
   4473         final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1");
   4474         final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2");
   4475 
   4476         addManifestShortcutResource(ACTIVITY1, R.xml.shortcut_1);
   4477         addManifestShortcutResource(ACTIVITY2, R.xml.shortcut_1_alt);
   4478 
   4479         mRunningUsers.put(USER_10, true);
   4480 
   4481         updatePackageVersion(CALLING_PACKAGE_1, 1);
   4482                 mService.mPackageMonitor.onReceive(getTestContext(),
   4483                 genPackageAddIntent(CALLING_PACKAGE_1, USER_10));
   4484 
   4485         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4486             assertTrue(mManager.addDynamicShortcuts(list(
   4487                     makeShortcutWithActivity("s1", ACTIVITY1),
   4488                     makeShortcutWithActivity("s2", ACTIVITY2)
   4489             )));
   4490         });
   4491         runWithCaller(LAUNCHER_1, USER_10, () -> {
   4492             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms1-alt", "s2"), HANDLE_USER_10);
   4493         });
   4494 
   4495         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4496             assertWith(getCallerShortcuts())
   4497                     .haveIds("ms1", "ms1-alt", "s1", "s2")
   4498                     .areAllEnabled()
   4499 
   4500                     .selectPinned()
   4501                     .haveIds("ms1-alt", "s2")
   4502 
   4503                     .revertToOriginalList()
   4504                     .selectByIds("ms1", "s1")
   4505                     .areAllWithActivity(ACTIVITY1)
   4506 
   4507                     .revertToOriginalList()
   4508                     .selectByIds("ms1-alt", "s2")
   4509                     .areAllWithActivity(ACTIVITY2)
   4510                     ;
   4511         });
   4512 
   4513         // First, no changes.
   4514                 mService.mPackageMonitor.onReceive(getTestContext(),
   4515                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
   4516 
   4517         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4518             assertWith(getCallerShortcuts())
   4519                     .haveIds("ms1", "ms1-alt", "s1", "s2")
   4520                     .areAllEnabled()
   4521 
   4522                     .selectPinned()
   4523                     .haveIds("ms1-alt", "s2")
   4524 
   4525                     .revertToOriginalList()
   4526                     .selectByIds("ms1", "s1")
   4527                     .areAllWithActivity(ACTIVITY1)
   4528 
   4529                     .revertToOriginalList()
   4530                     .selectByIds("ms1-alt", "s2")
   4531                     .areAllWithActivity(ACTIVITY2)
   4532             ;
   4533         });
   4534 
   4535         // Disable activity 1
   4536         mEnabledActivityChecker = (activity, userId) -> !ACTIVITY1.equals(activity);
   4537                 mService.mPackageMonitor.onReceive(getTestContext(),
   4538                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
   4539 
   4540         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4541             assertWith(getCallerShortcuts())
   4542                     .haveIds("ms1-alt", "s2")
   4543                     .areAllEnabled()
   4544 
   4545                     .selectPinned()
   4546                     .haveIds("ms1-alt", "s2")
   4547 
   4548                     .revertToOriginalList()
   4549                     .selectByIds("ms1-alt", "s2")
   4550                     .areAllWithActivity(ACTIVITY2)
   4551             ;
   4552         });
   4553 
   4554         // Re-enable activity 1.
   4555         // Manifest shortcuts will be re-published, but dynamic ones are not.
   4556         mEnabledActivityChecker = (activity, userId) -> true;
   4557                 mService.mPackageMonitor.onReceive(getTestContext(),
   4558                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
   4559 
   4560         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4561             assertWith(getCallerShortcuts())
   4562                     .haveIds("ms1", "ms1-alt", "s2")
   4563                     .areAllEnabled()
   4564 
   4565                     .selectPinned()
   4566                     .haveIds("ms1-alt", "s2")
   4567 
   4568                     .revertToOriginalList()
   4569                     .selectByIds("ms1")
   4570                     .areAllWithActivity(ACTIVITY1)
   4571 
   4572                     .revertToOriginalList()
   4573                     .selectByIds("ms1-alt", "s2")
   4574                     .areAllWithActivity(ACTIVITY2)
   4575                     ;
   4576         });
   4577 
   4578         // Disable activity 2
   4579         // Because "ms1-alt" and "s2" are both pinned, they will remain, but disabled.
   4580         mEnabledActivityChecker = (activity, userId) -> !ACTIVITY2.equals(activity);
   4581                 mService.mPackageMonitor.onReceive(getTestContext(),
   4582                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
   4583 
   4584         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   4585             assertWith(getCallerShortcuts())
   4586                     .haveIds("ms1", "ms1-alt", "s2")
   4587 
   4588                     .selectDynamic().isEmpty().revertToOriginalList() // no dynamics.
   4589 
   4590                     .selectPinned()
   4591                     .haveIds("ms1-alt", "s2")
   4592                     .areAllDisabled()
   4593 
   4594                     .revertToOriginalList()
   4595                     .selectByIds("ms1")
   4596                     .areAllWithActivity(ACTIVITY1)
   4597                     .areAllEnabled()
   4598             ;
   4599         });
   4600     }
   4601 
   4602     public void testHandlePackageUpdate_activityNoLongerMain() throws Throwable {
   4603         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4604             assertTrue(mManager.setDynamicShortcuts(list(
   4605                     makeShortcutWithActivity("s1a",
   4606                             new ComponentName(getCallingPackage(), "act1")),
   4607                     makeShortcutWithActivity("s1b",
   4608                             new ComponentName(getCallingPackage(), "act1")),
   4609                     makeShortcutWithActivity("s2a",
   4610                             new ComponentName(getCallingPackage(), "act2")),
   4611                     makeShortcutWithActivity("s2b",
   4612                             new ComponentName(getCallingPackage(), "act2")),
   4613                     makeShortcutWithActivity("s3a",
   4614                             new ComponentName(getCallingPackage(), "act3")),
   4615                     makeShortcutWithActivity("s3b",
   4616                             new ComponentName(getCallingPackage(), "act3"))
   4617             )));
   4618             assertWith(getCallerShortcuts())
   4619                     .haveIds("s1a", "s1b", "s2a", "s2b", "s3a", "s3b")
   4620                     .areAllDynamic();
   4621         });
   4622         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4623             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   4624                     list("s1b", "s2b", "s3b"),
   4625                     HANDLE_USER_0);
   4626         });
   4627         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4628             assertWith(getCallerShortcuts())
   4629                     .haveIds("s1a", "s1b", "s2a", "s2b", "s3a", "s3b")
   4630                     .areAllDynamic()
   4631 
   4632                     .selectByIds("s1b", "s2b", "s3b")
   4633                     .areAllPinned();
   4634         });
   4635 
   4636         // Update the app and act2 and act3 are no longer main.
   4637         mMainActivityChecker = (activity, userId) -> {
   4638             return activity.getClassName().equals("act1");
   4639         };
   4640 
   4641         setCaller(LAUNCHER_1, USER_0);
   4642         assertForLauncherCallback(mLauncherApps, () -> {
   4643             updatePackageVersion(CALLING_PACKAGE_1, 1);
   4644                     mService.mPackageMonitor.onReceive(getTestContext(),
   4645                     genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
   4646         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   4647                 // Make sure the launcher gets callbacks.
   4648                 .haveIds("s1a", "s1b", "s2b", "s3b")
   4649                 .areAllWithKeyFieldsOnly();
   4650 
   4651         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4652             // s2a and s3a are gone, but s2b and s3b will remain because they're pinned, and
   4653             // disabled.
   4654             assertWith(getCallerShortcuts())
   4655                     .haveIds("s1a", "s1b", "s2b", "s3b")
   4656 
   4657                     .selectByIds("s1a", "s1b")
   4658                     .areAllDynamic()
   4659                     .areAllEnabled()
   4660 
   4661                     .revertToOriginalList()
   4662                     .selectByIds("s2b", "s3b")
   4663                     .areAllNotDynamic()
   4664                     .areAllDisabled()
   4665                     .areAllPinned()
   4666                     ;
   4667         });
   4668     }
   4669 
   4670     protected void prepareForBackupTest() {
   4671 
   4672         prepareCrossProfileDataSet();
   4673 
   4674         backupAndRestore();
   4675     }
   4676 
   4677     /**
   4678      * Make sure the backup data doesn't have the following information:
   4679      * - Launchers on other users.
   4680      * - Non-backup app information.
   4681      *
   4682      * But restores all other infomation.
   4683      *
   4684      * It also omits the following pieces of information, but that's tested in
   4685      * {@link ShortcutManagerTest2#testShortcutInfoSaveAndLoad_forBackup}.
   4686      * - Unpinned dynamic shortcuts
   4687      * - Bitmaps
   4688      */
   4689     public void testBackupAndRestore() {
   4690         prepareForBackupTest();
   4691 
   4692         checkBackupAndRestore_success();
   4693     }
   4694 
   4695     public void testBackupAndRestore_backupRestoreTwice() {
   4696         prepareForBackupTest();
   4697 
   4698         // Note doing a backup & restore again here shouldn't affect the result.
   4699         dumpsysOnLogcat("Before second backup");
   4700 
   4701         backupAndRestore();
   4702 
   4703         dumpsysOnLogcat("After second backup");
   4704 
   4705         checkBackupAndRestore_success();
   4706     }
   4707 
   4708     public void testBackupAndRestore_backupRestoreMultiple() {
   4709         prepareForBackupTest();
   4710 
   4711         // Note doing a backup & restore again here shouldn't affect the result.
   4712         backupAndRestore();
   4713 
   4714         // This also shouldn't affect the result.
   4715         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4716             assertTrue(mManager.setDynamicShortcuts(list(
   4717                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
   4718                     makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
   4719         });
   4720 
   4721         backupAndRestore();
   4722 
   4723         checkBackupAndRestore_success();
   4724     }
   4725 
   4726     public void testBackupAndRestore_restoreToNewVersion() {
   4727         prepareForBackupTest();
   4728 
   4729         // Note doing a backup & restore again here shouldn't affect the result.
   4730         backupAndRestore();
   4731 
   4732         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2);
   4733         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 5);
   4734 
   4735         checkBackupAndRestore_success();
   4736     }
   4737 
   4738     public void testBackupAndRestore_restoreToSuperSetSignatures() {
   4739         prepareForBackupTest();
   4740 
   4741         // Note doing a backup & restore again here shouldn't affect the result.
   4742         backupAndRestore();
   4743 
   4744         // Change package signatures.
   4745         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1, "sigx", CALLING_PACKAGE_1);
   4746         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4, LAUNCHER_1, "sigy");
   4747 
   4748         checkBackupAndRestore_success();
   4749     }
   4750 
   4751     protected void checkBackupAndRestore_success() {
   4752         // Make sure non-system user is not restored.
   4753         final ShortcutUser userP0 = mService.getUserShortcutsLocked(USER_P0);
   4754         assertEquals(0, userP0.getAllPackagesForTest().size());
   4755         assertEquals(0, userP0.getAllLaunchersForTest().size());
   4756 
   4757         // Make sure only "allowBackup" apps are restored, and are shadow.
   4758         final ShortcutUser user0 = mService.getUserShortcutsLocked(USER_0);
   4759         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_1));
   4760         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_2));
   4761         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
   4762                 PackageWithUser.of(USER_0, LAUNCHER_1)));
   4763         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
   4764                 PackageWithUser.of(USER_0, LAUNCHER_2)));
   4765 
   4766         assertNull(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
   4767         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
   4768         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
   4769 
   4770         installPackage(USER_0, CALLING_PACKAGE_1);
   4771         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4772             assertWith(getCallerVisibleShortcuts())
   4773                     .selectDynamic()
   4774                     .isEmpty()
   4775 
   4776                     .revertToOriginalList()
   4777                     .selectPinned()
   4778                     .haveIds("s1", "s2");
   4779         });
   4780 
   4781         installPackage(USER_0, LAUNCHER_1);
   4782         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4783             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4784                     .areAllPinned()
   4785                     .haveIds("s1");
   4786 
   4787             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   4788                     .isEmpty();
   4789 
   4790             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4791                     .isEmpty();
   4792 
   4793             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
   4794                     .isEmpty();
   4795         });
   4796 
   4797         installPackage(USER_0, CALLING_PACKAGE_2);
   4798         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4799             assertWith(getCallerVisibleShortcuts())
   4800                     .selectDynamic()
   4801                     .isEmpty()
   4802 
   4803                     .revertToOriginalList()
   4804                     .selectPinned()
   4805                     .haveIds("s1", "s2", "s3");
   4806         });
   4807 
   4808         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4809             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4810                     .areAllPinned()
   4811                     .haveIds("s1");
   4812 
   4813             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   4814                     .areAllPinned()
   4815                     .haveIds("s1", "s2");
   4816 
   4817             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4818                     .isEmpty();
   4819 
   4820             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
   4821                     .isEmpty();
   4822         });
   4823 
   4824         // 3 shouldn't be backed up, so no pinned shortcuts.
   4825         installPackage(USER_0, CALLING_PACKAGE_3);
   4826         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   4827             assertWith(getCallerVisibleShortcuts())
   4828                     .isEmpty();
   4829         });
   4830 
   4831         // Launcher on a different profile shouldn't be restored.
   4832         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   4833             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4834                     .isEmpty();
   4835             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   4836                     .isEmpty();
   4837             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4838                     .isEmpty();
   4839         });
   4840 
   4841         // Package on a different profile, no restore.
   4842         installPackage(USER_P0, CALLING_PACKAGE_1);
   4843         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
   4844             assertWith(getCallerVisibleShortcuts())
   4845                     .isEmpty();
   4846         });
   4847 
   4848         // Restore launcher 2 on user 0.
   4849         installPackage(USER_0, LAUNCHER_2);
   4850         runWithCaller(LAUNCHER_2, USER_0, () -> {
   4851             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4852                     .areAllPinned()
   4853                     .haveIds("s2");
   4854 
   4855             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   4856                     .areAllPinned()
   4857                     .haveIds("s2", "s3");
   4858 
   4859             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4860                     .isEmpty();
   4861 
   4862             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
   4863                     .isEmpty();
   4864         });
   4865 
   4866 
   4867         // Restoration of launcher2 shouldn't affect other packages; so do the same checks and
   4868         // make sure they still have the same result.
   4869         installPackage(USER_0, CALLING_PACKAGE_1);
   4870         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4871             assertWith(getCallerVisibleShortcuts())
   4872                     .areAllPinned()
   4873                     .haveIds("s1", "s2");
   4874         });
   4875 
   4876         installPackage(USER_0, LAUNCHER_1);
   4877         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4878             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4879                     .areAllPinned()
   4880                     .haveIds("s1");
   4881 
   4882             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   4883                     .areAllPinned()
   4884                     .haveIds("s1", "s2");
   4885 
   4886             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4887                     .isEmpty();
   4888 
   4889             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
   4890                     .isEmpty();
   4891         });
   4892 
   4893         installPackage(USER_0, CALLING_PACKAGE_2);
   4894         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4895             assertWith(getCallerVisibleShortcuts())
   4896                     .areAllPinned()
   4897                     .haveIds("s1", "s2", "s3");
   4898         });
   4899     }
   4900 
   4901     public void testBackupAndRestore_publisherLowerVersion() {
   4902         prepareForBackupTest();
   4903 
   4904         // Note doing a backup & restore again here shouldn't affect the result.
   4905         backupAndRestore();
   4906 
   4907         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 0); // Lower version
   4908 
   4909         checkBackupAndRestore_publisherNotRestored();
   4910     }
   4911 
   4912     public void testBackupAndRestore_publisherWrongSignature() {
   4913         prepareForBackupTest();
   4914 
   4915         // Note doing a backup & restore again here shouldn't affect the result.
   4916         backupAndRestore();
   4917 
   4918         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature
   4919 
   4920         checkBackupAndRestore_publisherNotRestored();
   4921     }
   4922 
   4923     public void testBackupAndRestore_publisherNoLongerBackupTarget() {
   4924         prepareForBackupTest();
   4925 
   4926         // Note doing a backup & restore again here shouldn't affect the result.
   4927         backupAndRestore();
   4928 
   4929         updatePackageInfo(CALLING_PACKAGE_1,
   4930                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
   4931 
   4932         checkBackupAndRestore_publisherNotRestored();
   4933     }
   4934 
   4935     protected void checkBackupAndRestore_publisherNotRestored() {
   4936         installPackage(USER_0, CALLING_PACKAGE_1);
   4937         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   4938             assertEquals(0, mManager.getDynamicShortcuts().size());
   4939             assertEquals(0, mManager.getPinnedShortcuts().size());
   4940         });
   4941 
   4942         installPackage(USER_0, CALLING_PACKAGE_2);
   4943         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   4944             assertEquals(0, mManager.getDynamicShortcuts().size());
   4945             assertShortcutIds(assertAllPinned(
   4946                     mManager.getPinnedShortcuts()),
   4947                     "s1", "s2", "s3");
   4948         });
   4949 
   4950         installPackage(USER_0, LAUNCHER_1);
   4951         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4952             assertShortcutIds(assertAllPinned(
   4953                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4954                     /* empty */);
   4955             assertShortcutIds(assertAllPinned(
   4956                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   4957                     "s1", "s2");
   4958             assertShortcutIds(assertAllPinned(
   4959                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4960                     /* empty */);
   4961         });
   4962         installPackage(USER_0, LAUNCHER_2);
   4963         runWithCaller(LAUNCHER_2, USER_0, () -> {
   4964             assertShortcutIds(assertAllPinned(
   4965                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4966                     /* empty */);
   4967             assertShortcutIds(assertAllPinned(
   4968                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   4969                     "s2", "s3");
   4970             assertShortcutIds(assertAllPinned(
   4971                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4972                     /* empty */);
   4973         });
   4974 
   4975         installPackage(USER_0, CALLING_PACKAGE_3);
   4976         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   4977             assertEquals(0, mManager.getDynamicShortcuts().size());
   4978             assertEquals(0, mManager.getPinnedShortcuts().size());
   4979         });
   4980 
   4981         runWithCaller(LAUNCHER_1, USER_0, () -> {
   4982             assertShortcutIds(assertAllPinned(
   4983                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4984                     /* empty */);
   4985             assertShortcutIds(assertAllPinned(
   4986                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   4987                     "s1", "s2");
   4988             assertShortcutIds(assertAllPinned(
   4989                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   4990                     /* empty */);
   4991         });
   4992         runWithCaller(LAUNCHER_2, USER_0, () -> {
   4993             assertShortcutIds(assertAllPinned(
   4994                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   4995                     /* empty */);
   4996             assertShortcutIds(assertAllPinned(
   4997                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   4998                     "s2", "s3");
   4999             assertShortcutIds(assertAllPinned(
   5000                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5001                     /* empty */);
   5002         });
   5003     }
   5004 
   5005     public void testBackupAndRestore_launcherLowerVersion() {
   5006         prepareForBackupTest();
   5007 
   5008         // Note doing a backup & restore again here shouldn't affect the result.
   5009         backupAndRestore();
   5010 
   5011         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version
   5012 
   5013         checkBackupAndRestore_launcherNotRestored();
   5014     }
   5015 
   5016     public void testBackupAndRestore_launcherWrongSignature() {
   5017         prepareForBackupTest();
   5018 
   5019         // Note doing a backup & restore again here shouldn't affect the result.
   5020         backupAndRestore();
   5021 
   5022         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature
   5023 
   5024         checkBackupAndRestore_launcherNotRestored();
   5025     }
   5026 
   5027     public void testBackupAndRestore_launcherNoLongerBackupTarget() {
   5028         prepareForBackupTest();
   5029 
   5030         // Note doing a backup & restore again here shouldn't affect the result.
   5031         backupAndRestore();
   5032 
   5033         updatePackageInfo(LAUNCHER_1,
   5034                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
   5035 
   5036         checkBackupAndRestore_launcherNotRestored();
   5037     }
   5038 
   5039     protected void checkBackupAndRestore_launcherNotRestored() {
   5040         installPackage(USER_0, CALLING_PACKAGE_1);
   5041         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5042             assertEquals(0, mManager.getDynamicShortcuts().size());
   5043 
   5044             // s1 was pinned by launcher 1, which is not restored, yet, so we still see "s1" here.
   5045             assertShortcutIds(assertAllPinned(
   5046                     mManager.getPinnedShortcuts()),
   5047                     "s1", "s2");
   5048         });
   5049 
   5050         installPackage(USER_0, CALLING_PACKAGE_2);
   5051         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5052             assertEquals(0, mManager.getDynamicShortcuts().size());
   5053             assertShortcutIds(assertAllPinned(
   5054                     mManager.getPinnedShortcuts()),
   5055                     "s1", "s2", "s3");
   5056         });
   5057 
   5058         // Now we try to restore launcher 1.  Then we realize it's not restorable, so L1 has no pinned
   5059         // shortcuts.
   5060         installPackage(USER_0, LAUNCHER_1);
   5061         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5062             assertShortcutIds(assertAllPinned(
   5063                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5064                     /* empty */);
   5065             assertShortcutIds(assertAllPinned(
   5066                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   5067                     /* empty */);
   5068             assertShortcutIds(assertAllPinned(
   5069                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5070                     /* empty */);
   5071         });
   5072 
   5073         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5074             assertEquals(0, mManager.getDynamicShortcuts().size());
   5075 
   5076             // Now CALLING_PACKAGE_1 realizes "s1" is no longer pinned.
   5077             assertShortcutIds(assertAllPinned(
   5078                     mManager.getPinnedShortcuts()),
   5079                     "s2");
   5080         });
   5081 
   5082         installPackage(USER_0, LAUNCHER_2);
   5083         runWithCaller(LAUNCHER_2, USER_0, () -> {
   5084             assertShortcutIds(assertAllPinned(
   5085                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
   5086                     "s2");
   5087             assertShortcutIds(assertAllPinned(
   5088                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   5089                     "s2", "s3");
   5090             assertShortcutIds(assertAllPinned(
   5091                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5092                     /* empty */);
   5093         });
   5094 
   5095         installPackage(USER_0, CALLING_PACKAGE_3);
   5096         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5097             assertEquals(0, mManager.getDynamicShortcuts().size());
   5098             assertEquals(0, mManager.getPinnedShortcuts().size());
   5099         });
   5100 
   5101         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5102             assertShortcutIds(assertAllPinned(
   5103                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5104                     /* empty */);
   5105             assertShortcutIds(assertAllPinned(
   5106                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   5107                     /* empty */);
   5108             assertShortcutIds(assertAllPinned(
   5109                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5110                     /* empty */);
   5111         });
   5112         runWithCaller(LAUNCHER_2, USER_0, () -> {
   5113             assertShortcutIds(assertAllPinned(
   5114                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
   5115                     "s2");
   5116             assertShortcutIds(assertAllPinned(
   5117                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   5118                     "s2", "s3");
   5119             assertShortcutIds(assertAllPinned(
   5120                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5121                     /* empty */);
   5122         });
   5123     }
   5124 
   5125     public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() {
   5126         prepareForBackupTest();
   5127 
   5128         // Note doing a backup & restore again here shouldn't affect the result.
   5129         backupAndRestore();
   5130 
   5131         updatePackageInfo(CALLING_PACKAGE_1,
   5132                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
   5133 
   5134         updatePackageInfo(LAUNCHER_1,
   5135                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
   5136 
   5137         checkBackupAndRestore_publisherAndLauncherNotRestored();
   5138     }
   5139 
   5140     protected void checkBackupAndRestore_publisherAndLauncherNotRestored() {
   5141         installPackage(USER_0, CALLING_PACKAGE_1);
   5142         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5143             assertEquals(0, mManager.getDynamicShortcuts().size());
   5144             assertEquals(0, mManager.getPinnedShortcuts().size());
   5145         });
   5146 
   5147         installPackage(USER_0, CALLING_PACKAGE_2);
   5148         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5149             assertEquals(0, mManager.getDynamicShortcuts().size());
   5150             assertShortcutIds(assertAllPinned(
   5151                     mManager.getPinnedShortcuts()),
   5152                     "s1", "s2", "s3");
   5153         });
   5154 
   5155         installPackage(USER_0, LAUNCHER_1);
   5156         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5157             assertShortcutIds(assertAllPinned(
   5158                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5159                     /* empty */);
   5160             assertShortcutIds(assertAllPinned(
   5161                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   5162                     /* empty */);
   5163             assertShortcutIds(assertAllPinned(
   5164                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5165                     /* empty */);
   5166         });
   5167         installPackage(USER_0, LAUNCHER_2);
   5168         runWithCaller(LAUNCHER_2, USER_0, () -> {
   5169             assertShortcutIds(assertAllPinned(
   5170                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5171                     /* empty */);
   5172             assertShortcutIds(assertAllPinned(
   5173                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   5174                     "s2", "s3");
   5175             assertShortcutIds(assertAllPinned(
   5176                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5177                     /* empty */);
   5178         });
   5179 
   5180         // Because launcher 1 wasn't restored, "s1" is no longer pinned.
   5181         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5182             assertEquals(0, mManager.getDynamicShortcuts().size());
   5183             assertShortcutIds(assertAllPinned(
   5184                     mManager.getPinnedShortcuts()),
   5185                     "s2", "s3");
   5186         });
   5187 
   5188         installPackage(USER_0, CALLING_PACKAGE_3);
   5189         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5190             assertEquals(0, mManager.getDynamicShortcuts().size());
   5191             assertEquals(0, mManager.getPinnedShortcuts().size());
   5192         });
   5193 
   5194         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5195             assertShortcutIds(assertAllPinned(
   5196                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5197                     /* empty */);
   5198             assertShortcutIds(assertAllPinned(
   5199                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   5200                     /* empty */);
   5201             assertShortcutIds(assertAllPinned(
   5202                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5203                     /* empty */);
   5204         });
   5205         runWithCaller(LAUNCHER_2, USER_0, () -> {
   5206             assertShortcutIds(assertAllPinned(
   5207                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5208                     /* empty */);
   5209             assertShortcutIds(assertAllPinned(
   5210                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
   5211                     "s2", "s3");
   5212             assertShortcutIds(assertAllPinned(
   5213                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5214                     /* empty */);
   5215         });
   5216     }
   5217 
   5218     public void testBackupAndRestore_disabled() {
   5219         prepareCrossProfileDataSet();
   5220 
   5221         // Before doing backup & restore, disable s1.
   5222         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5223             mManager.disableShortcuts(list("s1"));
   5224         });
   5225 
   5226         backupAndRestore();
   5227 
   5228         // Below is copied from checkBackupAndRestore_success.
   5229 
   5230         // Make sure non-system user is not restored.
   5231         final ShortcutUser userP0 = mService.getUserShortcutsLocked(USER_P0);
   5232         assertEquals(0, userP0.getAllPackagesForTest().size());
   5233         assertEquals(0, userP0.getAllLaunchersForTest().size());
   5234 
   5235         // Make sure only "allowBackup" apps are restored, and are shadow.
   5236         final ShortcutUser user0 = mService.getUserShortcutsLocked(USER_0);
   5237         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_1));
   5238         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_2));
   5239         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
   5240                 PackageWithUser.of(USER_0, LAUNCHER_1)));
   5241         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
   5242                 PackageWithUser.of(USER_0, LAUNCHER_2)));
   5243 
   5244         assertNull(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
   5245         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
   5246         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
   5247 
   5248         installPackage(USER_0, CALLING_PACKAGE_1);
   5249         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5250             assertWith(getCallerVisibleShortcuts())
   5251                     .areAllEnabled() // disabled shortcuts shouldn't be restored.
   5252 
   5253                     .selectDynamic()
   5254                     .isEmpty()
   5255 
   5256                     .revertToOriginalList()
   5257                     .selectPinned()
   5258                     // s1 is not restored.
   5259                     .haveIds("s2");
   5260         });
   5261 
   5262         installPackage(USER_0, LAUNCHER_1);
   5263         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5264             // Note, s1 was pinned by launcher 1, but was disabled, so isn't restored.
   5265             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
   5266                     .isEmpty();
   5267 
   5268             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
   5269                     .isEmpty();
   5270 
   5271             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
   5272                     .isEmpty();
   5273 
   5274             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
   5275                     .isEmpty();
   5276         });
   5277     }
   5278 
   5279 
   5280     public void testBackupAndRestore_manifestRePublished() {
   5281         // Publish two manifest shortcuts.
   5282         addManifestShortcutResource(
   5283                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5284                 R.xml.shortcut_2);
   5285         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5286         mService.mPackageMonitor.onReceive(mServiceContext,
   5287                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   5288 
   5289         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5290             assertTrue(mManager.setDynamicShortcuts(list(
   5291                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   5292         });
   5293 
   5294         // Pin from launcher 1.
   5295         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5296             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   5297                     list("ms1", "ms2", "s1", "s2"), HANDLE_USER_0);
   5298         });
   5299 
   5300         // Update and now ms2 is gone -> disabled.
   5301         addManifestShortcutResource(
   5302                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5303                 R.xml.shortcut_1);
   5304         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5305         mService.mPackageMonitor.onReceive(mServiceContext,
   5306                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   5307 
   5308         // Make sure the manifest shortcuts have been published.
   5309         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5310             assertWith(getCallerShortcuts())
   5311                     .selectManifest()
   5312                     .haveIds("ms1")
   5313 
   5314                     .revertToOriginalList()
   5315                     .selectDynamic()
   5316                     .haveIds("s1", "s2", "s3")
   5317 
   5318                     .revertToOriginalList()
   5319                     .selectPinned()
   5320                     .haveIds("ms1", "ms2", "s1", "s2")
   5321 
   5322                     .revertToOriginalList()
   5323                     .selectByIds("ms1")
   5324                     .areAllManifest()
   5325                     .areAllEnabled()
   5326 
   5327                     .revertToOriginalList()
   5328                     .selectByIds("ms2")
   5329                     .areAllNotManifest()
   5330                     .areAllDisabled();
   5331         });
   5332 
   5333         backupAndRestore();
   5334 
   5335         // When re-installing the app, the manifest shortcut should be re-published.
   5336         mService.mPackageMonitor.onReceive(mServiceContext,
   5337                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   5338         mService.mPackageMonitor.onReceive(mServiceContext,
   5339                 genPackageAddIntent(LAUNCHER_1, USER_0));
   5340 
   5341         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5342             assertWith(getCallerVisibleShortcuts())
   5343                     .selectPinned()
   5344                     // ms2 was disabled, so not restored.
   5345                     .haveIds("ms1", "s1", "s2")
   5346                     .areAllEnabled()
   5347 
   5348                     .revertToOriginalList()
   5349                     .selectByIds("ms1")
   5350                     .areAllManifest()
   5351 
   5352                     .revertToOriginalList()
   5353                     .selectByIds("s1", "s2")
   5354                     .areAllNotDynamic()
   5355                     ;
   5356         });
   5357     }
   5358 
   5359     /**
   5360      * It's the case with preintalled apps -- when applyRestore() is called, the system
   5361      * apps are already installed, so manifest shortcuts need to be re-published.
   5362      *
   5363      * Also, when a restore target app is already installed, and
   5364      * - if it has allowBackup=true, we'll restore normally, so all existing shortcuts will be
   5365      * replaced. (but manifest shortcuts will be re-published anyway.)  We log a warning on
   5366      * logcat.
   5367      * - if it has allowBackup=false, we don't touch any of the existing shortcuts.
   5368      */
   5369     public void testBackupAndRestore_appAlreadyInstalledWhenRestored() {
   5370         // Pre-backup.  Same as testBackupAndRestore_manifestRePublished().
   5371 
   5372         // Publish two manifest shortcuts.
   5373         addManifestShortcutResource(
   5374                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5375                 R.xml.shortcut_2);
   5376         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5377         mService.mPackageMonitor.onReceive(mServiceContext,
   5378                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   5379 
   5380         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5381             assertTrue(mManager.setDynamicShortcuts(list(
   5382                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
   5383         });
   5384 
   5385         // Pin from launcher 1.
   5386         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5387             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   5388                     list("ms1", "ms2", "s1", "s2"), HANDLE_USER_0);
   5389         });
   5390 
   5391         // Update and now ms2 is gone -> disabled.
   5392         addManifestShortcutResource(
   5393                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5394                 R.xml.shortcut_1);
   5395         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5396         mService.mPackageMonitor.onReceive(mServiceContext,
   5397                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   5398 
   5399         // Set up shortcuts for package 3, which won't be backed up / restored.
   5400         addManifestShortcutResource(
   5401                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
   5402                 R.xml.shortcut_1);
   5403         updatePackageVersion(CALLING_PACKAGE_3, 1);
   5404         mService.mPackageMonitor.onReceive(mServiceContext,
   5405                 genPackageAddIntent(CALLING_PACKAGE_3, USER_0));
   5406 
   5407         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5408             assertTrue(getManager().setDynamicShortcuts(list(
   5409                     makeShortcut("s1"))));
   5410         });
   5411 
   5412         // Make sure the manifest shortcuts have been published.
   5413         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5414             assertWith(getCallerShortcuts())
   5415                     .selectManifest()
   5416                     .haveIds("ms1")
   5417 
   5418                     .revertToOriginalList()
   5419                     .selectDynamic()
   5420                     .haveIds("s1", "s2", "s3")
   5421 
   5422                     .revertToOriginalList()
   5423                     .selectPinned()
   5424                     .haveIds("ms1", "ms2", "s1", "s2")
   5425 
   5426                     .revertToOriginalList()
   5427                     .selectByIds("ms1")
   5428                     .areAllManifest()
   5429                     .areAllEnabled()
   5430 
   5431                     .revertToOriginalList()
   5432                     .selectByIds("ms2")
   5433                     .areAllNotManifest()
   5434                     .areAllDisabled();
   5435         });
   5436 
   5437         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5438             assertWith(getCallerShortcuts())
   5439                     .haveIds("s1", "ms1");
   5440         });
   5441 
   5442         // Backup and *without restarting the service, just call applyRestore()*.
   5443         {
   5444             int prevUid = mInjectedCallingUid;
   5445             mInjectedCallingUid = Process.SYSTEM_UID; // Only system can call it.
   5446 
   5447             dumpsysOnLogcat("Before backup");
   5448 
   5449             final byte[] payload = mService.getBackupPayload(USER_0);
   5450             if (ENABLE_DUMP) {
   5451                 final String xml = new String(payload);
   5452                 Log.v(TAG, "Backup payload:");
   5453                 for (String line : xml.split("\n")) {
   5454                     Log.v(TAG, line);
   5455                 }
   5456             }
   5457             mService.applyRestore(payload, USER_0);
   5458 
   5459             dumpsysOnLogcat("After restore");
   5460 
   5461             mInjectedCallingUid = prevUid;
   5462         }
   5463 
   5464         // The check is also the same as testBackupAndRestore_manifestRePublished().
   5465         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5466             assertWith(getCallerVisibleShortcuts())
   5467                     .selectPinned()
   5468                     // ms2 was disabled, so not restored.
   5469                     .haveIds("ms1", "s1", "s2")
   5470                     .areAllEnabled()
   5471 
   5472                     .revertToOriginalList()
   5473                     .selectByIds("ms1")
   5474                     .areAllManifest()
   5475 
   5476                     .revertToOriginalList()
   5477                     .selectByIds("s1", "s2")
   5478                     .areAllNotDynamic()
   5479             ;
   5480         });
   5481 
   5482         // Package 3 still has the same shortcuts.
   5483         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5484             assertWith(getCallerShortcuts())
   5485                     .haveIds("s1", "ms1");
   5486         });
   5487     }
   5488 
   5489     public void testSaveAndLoad_crossProfile() {
   5490         prepareCrossProfileDataSet();
   5491 
   5492         dumpsysOnLogcat("Before save & load");
   5493 
   5494         mService.saveDirtyInfo();
   5495         initService();
   5496 
   5497         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5498             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
   5499                     "s1", "s2", "s3");
   5500             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
   5501                     "s1", "s2", "s3", "s4");
   5502         });
   5503         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5504             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
   5505                     "s1", "s2", "s3");
   5506             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
   5507                     "s1", "s2", "s3", "s4", "s5");
   5508         });
   5509         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5510             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
   5511                     "s1", "s2", "s3");
   5512             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
   5513                     "s1", "s2", "s3", "s4", "s5", "s6");
   5514         });
   5515         runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
   5516             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
   5517                     /* empty */);
   5518             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
   5519                     /* empty */);
   5520         });
   5521         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
   5522             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
   5523                     "s1", "s2", "s3");
   5524             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
   5525                     "s1", "s2", "s3", "s4", "s5", "s6");
   5526         });
   5527         runWithCaller(CALLING_PACKAGE_2, USER_P0, () -> {
   5528             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
   5529                     /* empty */);
   5530             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
   5531                     /* empty */);
   5532         });
   5533         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   5534             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
   5535                     "x1", "x2", "x3");
   5536             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
   5537                     "x4", "x5");
   5538         });
   5539         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5540             assertShortcutIds(
   5541                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
   5542                     "s1");
   5543             assertShortcutIds(
   5544                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
   5545                     "s1", "s2");
   5546             assertShortcutIds(
   5547                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
   5548                     "s1", "s2", "s3");
   5549             assertShortcutIds(
   5550                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
   5551                     /* empty */);
   5552             assertShortcutIds(
   5553                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
   5554                     "s1", "s4");
   5555             assertShortcutIds(
   5556                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
   5557                     /* empty */);
   5558             assertExpectException(
   5559                     SecurityException.class, "", () -> {
   5560                         mLauncherApps.getShortcuts(
   5561                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
   5562                     });
   5563         });
   5564         runWithCaller(LAUNCHER_2, USER_0, () -> {
   5565             assertShortcutIds(
   5566                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
   5567                     "s2");
   5568             assertShortcutIds(
   5569                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
   5570                     "s2", "s3");
   5571             assertShortcutIds(
   5572                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
   5573                     "s2", "s3", "s4");
   5574             assertShortcutIds(
   5575                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
   5576                     /* empty */);
   5577             assertShortcutIds(
   5578                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
   5579                     "s2", "s5");
   5580             assertShortcutIds(
   5581                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
   5582                     /* empty */);
   5583         });
   5584         runWithCaller(LAUNCHER_3, USER_0, () -> {
   5585             assertShortcutIds(
   5586                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
   5587                     "s3");
   5588             assertShortcutIds(
   5589                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
   5590                     "s3", "s4");
   5591             assertShortcutIds(
   5592                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
   5593                     "s3", "s4", "s5");
   5594             assertShortcutIds(
   5595                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
   5596                     /* empty */);
   5597             assertShortcutIds(
   5598                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
   5599                     "s3", "s6");
   5600             assertShortcutIds(
   5601                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
   5602                     /* empty */);
   5603         });
   5604         runWithCaller(LAUNCHER_4, USER_0, () -> {
   5605             assertShortcutIds(
   5606                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0)
   5607                     /* empty */);
   5608             assertShortcutIds(
   5609                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0)
   5610                     /* empty */);
   5611             assertShortcutIds(
   5612                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0)
   5613                     /* empty */);
   5614             assertShortcutIds(
   5615                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
   5616                     /* empty */);
   5617             assertShortcutIds(
   5618                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0)
   5619                     /* empty */);
   5620             assertShortcutIds(
   5621                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
   5622                     /* empty */);
   5623         });
   5624         runWithCaller(LAUNCHER_1, USER_P0, () -> {
   5625             assertShortcutIds(
   5626                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
   5627                     "s3", "s4");
   5628             assertShortcutIds(
   5629                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
   5630                     "s3", "s4", "s5");
   5631             assertShortcutIds(
   5632                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
   5633                     "s3", "s4", "s5", "s6");
   5634             assertShortcutIds(
   5635                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
   5636                     "s1", "s4");
   5637             assertExpectException(
   5638                     SecurityException.class, "unrelated profile", () -> {
   5639                         mLauncherApps.getShortcuts(
   5640                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
   5641                     });
   5642         });
   5643         runWithCaller(LAUNCHER_1, USER_10, () -> {
   5644             assertShortcutIds(
   5645                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_10),
   5646                     "x4", "x5");
   5647             assertShortcutIds(
   5648                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_10)
   5649                     /* empty */);
   5650             assertShortcutIds(
   5651                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_10)
   5652                     /* empty */);
   5653             assertExpectException(
   5654                     SecurityException.class, "unrelated profile", () -> {
   5655                         mLauncherApps.getShortcuts(
   5656                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0);
   5657                     });
   5658             assertExpectException(
   5659                     SecurityException.class, "unrelated profile", () -> {
   5660                         mLauncherApps.getShortcuts(
   5661                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_P0);
   5662                     });
   5663         });
   5664         // Check the user-IDs.
   5665         assertEquals(USER_0,
   5666                 mService.getUserShortcutsLocked(USER_0).getPackageShortcuts(CALLING_PACKAGE_1)
   5667                         .getOwnerUserId());
   5668         assertEquals(USER_0,
   5669                 mService.getUserShortcutsLocked(USER_0).getPackageShortcuts(CALLING_PACKAGE_1)
   5670                         .getPackageUserId());
   5671         assertEquals(USER_P0,
   5672                 mService.getUserShortcutsLocked(USER_P0).getPackageShortcuts(CALLING_PACKAGE_1)
   5673                         .getOwnerUserId());
   5674         assertEquals(USER_P0,
   5675                 mService.getUserShortcutsLocked(USER_P0).getPackageShortcuts(CALLING_PACKAGE_1)
   5676                         .getPackageUserId());
   5677 
   5678         assertEquals(USER_0,
   5679                 mService.getUserShortcutsLocked(USER_0).getLauncherShortcuts(LAUNCHER_1, USER_0)
   5680                         .getOwnerUserId());
   5681         assertEquals(USER_0,
   5682                 mService.getUserShortcutsLocked(USER_0).getLauncherShortcuts(LAUNCHER_1, USER_0)
   5683                         .getPackageUserId());
   5684         assertEquals(USER_P0,
   5685                 mService.getUserShortcutsLocked(USER_P0).getLauncherShortcuts(LAUNCHER_1, USER_0)
   5686                         .getOwnerUserId());
   5687         assertEquals(USER_0,
   5688                 mService.getUserShortcutsLocked(USER_P0).getLauncherShortcuts(LAUNCHER_1, USER_0)
   5689                         .getPackageUserId());
   5690     }
   5691 
   5692     public void testOnApplicationActive_permission() {
   5693         assertExpectException(SecurityException.class, "Missing permission", () ->
   5694                 mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0));
   5695 
   5696         // Has permission, now it should pass.
   5697         mCallerPermissions.add(permission.RESET_SHORTCUT_MANAGER_THROTTLING);
   5698         mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0);
   5699     }
   5700 
   5701     public void testDumpsys_crossProfile() {
   5702         prepareCrossProfileDataSet();
   5703         dumpsysOnLogcat("test1", /* force= */ true);
   5704     }
   5705 
   5706     public void testDumpsys_withIcons() throws IOException {
   5707         testIcons();
   5708         // Dump after having some icons.
   5709         dumpsysOnLogcat("test1", /* force= */ true);
   5710     }
   5711 
   5712     public void testManifestShortcut_publishOnUnlockUser() {
   5713         addManifestShortcutResource(
   5714                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5715                 R.xml.shortcut_1);
   5716         addManifestShortcutResource(
   5717                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   5718                 R.xml.shortcut_2);
   5719         addManifestShortcutResource(
   5720                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
   5721                 R.xml.shortcut_5);
   5722 
   5723         // Unlock user-0.
   5724         mService.handleUnlockUser(USER_0);
   5725 
   5726         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5727             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5728                     mManager.getManifestShortcuts()))),
   5729                     "ms1");
   5730             assertEmpty(mManager.getPinnedShortcuts());
   5731         });
   5732 
   5733         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5734             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5735                     mManager.getManifestShortcuts()))),
   5736                     "ms1", "ms2");
   5737             assertEmpty(mManager.getPinnedShortcuts());
   5738         });
   5739 
   5740         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5741             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5742                     mManager.getManifestShortcuts()))),
   5743                     "ms1", "ms2", "ms3", "ms4", "ms5");
   5744             assertEmpty(mManager.getPinnedShortcuts());
   5745         });
   5746 
   5747         // Try on another user, with some packages uninstalled.
   5748         mRunningUsers.put(USER_10, true);
   5749 
   5750         uninstallPackage(USER_10, CALLING_PACKAGE_1);
   5751         uninstallPackage(USER_10, CALLING_PACKAGE_3);
   5752 
   5753         mService.handleUnlockUser(USER_10);
   5754 
   5755         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
   5756             assertEmpty(mManager.getManifestShortcuts());
   5757             assertEmpty(mManager.getPinnedShortcuts());
   5758         });
   5759 
   5760         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   5761             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5762                     mManager.getManifestShortcuts()))),
   5763                     "ms1", "ms2");
   5764             assertEmpty(mManager.getPinnedShortcuts());
   5765         });
   5766 
   5767         runWithCaller(CALLING_PACKAGE_3, USER_10, () -> {
   5768             assertEmpty(mManager.getManifestShortcuts());
   5769             assertEmpty(mManager.getPinnedShortcuts());
   5770         });
   5771 
   5772         // Now change the resources for package 1, and unlock again.
   5773         // But we still see *old* shortcuts, because the package version and install time
   5774         // hasn't changed.
   5775         shutdownServices();
   5776 
   5777         addManifestShortcutResource(
   5778                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5779                 R.xml.shortcut_5);
   5780         addManifestShortcutResource(
   5781                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
   5782                 R.xml.shortcut_1);
   5783 
   5784         initService();
   5785         mService.handleUnlockUser(USER_0);
   5786 
   5787         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5788             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5789                     mManager.getManifestShortcuts()))),
   5790                     "ms1");
   5791             assertEmpty(mManager.getPinnedShortcuts());
   5792         });
   5793 
   5794         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5795             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5796                     mManager.getManifestShortcuts()))),
   5797                     "ms1", "ms2");
   5798             assertEmpty(mManager.getPinnedShortcuts());
   5799         });
   5800 
   5801         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5802             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5803                     mManager.getManifestShortcuts()))),
   5804                     "ms1", "ms2", "ms3", "ms4", "ms5");
   5805             assertEmpty(mManager.getPinnedShortcuts());
   5806         });
   5807 
   5808         // Do it again, but this time we change the app version, so we do detect the changes.
   5809         shutdownServices();
   5810 
   5811         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5812         updatePackageLastUpdateTime(CALLING_PACKAGE_3, 1);
   5813 
   5814         initService();
   5815         mService.handleUnlockUser(USER_0);
   5816 
   5817         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5818             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5819                     mManager.getManifestShortcuts()))),
   5820                     "ms1", "ms2", "ms3", "ms4", "ms5");
   5821             assertEmpty(mManager.getPinnedShortcuts());
   5822         });
   5823 
   5824         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5825             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5826                     mManager.getManifestShortcuts()))),
   5827                     "ms1", "ms2");
   5828             assertEmpty(mManager.getPinnedShortcuts());
   5829         });
   5830 
   5831         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5832             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5833                     mManager.getManifestShortcuts()))),
   5834                     "ms1");
   5835             assertEmpty(mManager.getPinnedShortcuts());
   5836         });
   5837 
   5838         // Next, try removing all shortcuts, with some of them pinned.
   5839         runWithCaller(LAUNCHER_1, USER_0, () -> {
   5840             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms3"), HANDLE_USER_0);
   5841             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("ms2"), HANDLE_USER_0);
   5842             mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("ms1"), HANDLE_USER_0);
   5843         });
   5844         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5845             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5846                     mManager.getManifestShortcuts()))),
   5847                     "ms1", "ms2", "ms3", "ms4", "ms5");
   5848             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllManifest(
   5849                     assertAllEnabled(mManager.getPinnedShortcuts())))),
   5850                     "ms3");
   5851         });
   5852 
   5853         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5854             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5855                     mManager.getManifestShortcuts()))),
   5856                     "ms1", "ms2");
   5857             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllManifest(
   5858                     assertAllEnabled(mManager.getPinnedShortcuts())))),
   5859                     "ms2");
   5860         });
   5861 
   5862         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5863             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5864                     mManager.getManifestShortcuts()))),
   5865                     "ms1");
   5866             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllManifest(
   5867                     assertAllEnabled(mManager.getPinnedShortcuts())))),
   5868                     "ms1");
   5869         });
   5870 
   5871         shutdownServices();
   5872 
   5873         addManifestShortcutResource(
   5874                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5875                 R.xml.shortcut_0);
   5876         addManifestShortcutResource(
   5877                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   5878                 R.xml.shortcut_1);
   5879         addManifestShortcutResource(
   5880                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
   5881                 R.xml.shortcut_0);
   5882 
   5883         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5884         updatePackageVersion(CALLING_PACKAGE_2, 1);
   5885         updatePackageVersion(CALLING_PACKAGE_3, 1);
   5886 
   5887         initService();
   5888         mService.handleUnlockUser(USER_0);
   5889 
   5890         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5891             assertEmpty(mManager.getManifestShortcuts());
   5892             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllNotManifest(
   5893                     assertAllDisabled(mManager.getPinnedShortcuts())))),
   5894                     "ms3");
   5895         });
   5896 
   5897         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5898             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5899                     mManager.getManifestShortcuts()))),
   5900                     "ms1");
   5901             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllNotManifest(
   5902                     assertAllDisabled(mManager.getPinnedShortcuts())))),
   5903                     "ms2");
   5904         });
   5905 
   5906         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5907             assertEmpty(mManager.getManifestShortcuts());
   5908             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllNotManifest(
   5909                     assertAllDisabled(mManager.getPinnedShortcuts())))),
   5910                     "ms1");
   5911         });
   5912 
   5913         // Make sure we don't have ShortcutPackage for packages that don't have shortcuts.
   5914         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_4, USER_0));
   5915         assertNull(mService.getPackageShortcutForTest(LAUNCHER_1, USER_0));
   5916     }
   5917 
   5918     public void testManifestShortcut_publishOnBroadcast() {
   5919         // First, no packages are installed.
   5920         uninstallPackage(USER_0, CALLING_PACKAGE_1);
   5921         uninstallPackage(USER_0, CALLING_PACKAGE_2);
   5922         uninstallPackage(USER_0, CALLING_PACKAGE_3);
   5923         uninstallPackage(USER_0, CALLING_PACKAGE_4);
   5924         uninstallPackage(USER_10, CALLING_PACKAGE_1);
   5925         uninstallPackage(USER_10, CALLING_PACKAGE_2);
   5926         uninstallPackage(USER_10, CALLING_PACKAGE_3);
   5927         uninstallPackage(USER_10, CALLING_PACKAGE_4);
   5928 
   5929         mService.handleUnlockUser(USER_0);
   5930 
   5931         mRunningUsers.put(USER_10, true);
   5932         mService.handleUnlockUser(USER_10);
   5933 
   5934         // Originally no manifest shortcuts.
   5935         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5936             assertEmpty(mManager.getManifestShortcuts());
   5937             assertEmpty(mManager.getPinnedShortcuts());
   5938         });
   5939 
   5940         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5941             assertEmpty(mManager.getManifestShortcuts());
   5942             assertEmpty(mManager.getPinnedShortcuts());
   5943         });
   5944 
   5945         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
   5946             assertEmpty(mManager.getManifestShortcuts());
   5947             assertEmpty(mManager.getPinnedShortcuts());
   5948         });
   5949 
   5950         // Package 1 updated, with manifest shortcuts.
   5951         addManifestShortcutResource(
   5952                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   5953                 R.xml.shortcut_1);
   5954         updatePackageVersion(CALLING_PACKAGE_1, 1);
   5955                 mService.mPackageMonitor.onReceive(getTestContext(),
   5956                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   5957 
   5958         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5959             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5960                     mManager.getManifestShortcuts()))),
   5961                     "ms1");
   5962             assertEmpty(mManager.getPinnedShortcuts());
   5963         });
   5964 
   5965         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5966             assertEmpty(mManager.getManifestShortcuts());
   5967             assertEmpty(mManager.getPinnedShortcuts());
   5968         });
   5969 
   5970         // Package 2 updated, with manifest shortcuts.
   5971 
   5972         addManifestShortcutResource(
   5973                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   5974                 R.xml.shortcut_5);
   5975         updatePackageVersion(CALLING_PACKAGE_2, 1);
   5976                 mService.mPackageMonitor.onReceive(getTestContext(),
   5977                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
   5978 
   5979         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   5980             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5981                     mManager.getManifestShortcuts()))),
   5982                     "ms1");
   5983             assertEmpty(mManager.getPinnedShortcuts());
   5984         });
   5985 
   5986         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   5987             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   5988                     mManager.getManifestShortcuts()))),
   5989                     "ms1", "ms2", "ms3", "ms4", "ms5");
   5990             assertWith(getCallerShortcuts()).selectManifest()
   5991                     .selectByActivity(
   5992                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
   5993                     .haveRanksInOrder("ms1", "ms2", "ms3", "ms4", "ms5");
   5994             assertEmpty(mManager.getPinnedShortcuts());
   5995         });
   5996 
   5997         // Package 2 updated, with less manifest shortcuts.
   5998         // This time we use updatePackageLastUpdateTime() instead of updatePackageVersion().
   5999 
   6000         dumpsysOnLogcat("Before pinning");
   6001 
   6002         // Also pin some.
   6003         runWithCaller(LAUNCHER_1, USER_0, () -> {
   6004             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("ms2", "ms3"), HANDLE_USER_0);
   6005         });
   6006 
   6007         dumpsysOnLogcat("After pinning");
   6008 
   6009         addManifestShortcutResource(
   6010                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   6011                 R.xml.shortcut_2);
   6012         updatePackageLastUpdateTime(CALLING_PACKAGE_2, 1);
   6013                 mService.mPackageMonitor.onReceive(getTestContext(),
   6014                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
   6015 
   6016         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6017             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6018                     mManager.getManifestShortcuts()))),
   6019                     "ms1");
   6020             assertEmpty(mManager.getPinnedShortcuts());
   6021         });
   6022 
   6023         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   6024             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6025                     mManager.getManifestShortcuts()))),
   6026                     "ms1", "ms2");
   6027             assertWith(getCallerShortcuts()).selectManifest()
   6028                     .selectByActivity(
   6029                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
   6030                     .haveRanksInOrder("ms1", "ms2");
   6031             assertShortcutIds(assertAllImmutable(assertAllPinned(
   6032                     mManager.getPinnedShortcuts())),
   6033                     "ms2", "ms3");
   6034             // ms3 is no longer in manifest, so should be disabled.
   6035             // but ms1 and ms2 should be enabled.
   6036             assertAllEnabled(list(getCallerShortcut("ms1")));
   6037             assertAllEnabled(list(getCallerShortcut("ms2")));
   6038             assertAllDisabled(list(getCallerShortcut("ms3")));
   6039         });
   6040 
   6041         // Package 2 on user 10 has no shortcuts yet.
   6042         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   6043             assertEmpty(mManager.getManifestShortcuts());
   6044             assertEmpty(mManager.getPinnedShortcuts());
   6045         });
   6046         // Send add broadcast, but the user is not running, so should be ignored.
   6047         mService.handleCleanupUser(USER_10);
   6048         mRunningUsers.put(USER_10, false);
   6049         mUnlockedUsers.put(USER_10, false);
   6050 
   6051         mService.mPackageMonitor.onReceive(getTestContext(),
   6052                 genPackageAddIntent(CALLING_PACKAGE_2, USER_10));
   6053         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   6054             // Don't use the mManager APIs to get shortcuts, because they'll trigger the package
   6055             // update check.
   6056             // So look the internal data directly using getCallerShortcuts().
   6057             assertEmpty(getCallerShortcuts());
   6058         });
   6059 
   6060         // Try again, but the user is locked, so still ignored.
   6061         mRunningUsers.put(USER_10, true);
   6062                 mService.mPackageMonitor.onReceive(getTestContext(),
   6063                 genPackageAddIntent(CALLING_PACKAGE_2, USER_10));
   6064         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   6065             // Don't use the mManager APIs to get shortcuts, because they'll trigger the package
   6066             // update check.
   6067             // So look the internal data directly using getCallerShortcuts().
   6068             assertEmpty(getCallerShortcuts());
   6069         });
   6070 
   6071         // Unlock the user, now it should work.
   6072         mUnlockedUsers.put(USER_10, true);
   6073 
   6074         // Send PACKAGE_ADD broadcast to have Package 2 on user-10 publish manifest shortcuts.
   6075                 mService.mPackageMonitor.onReceive(getTestContext(),
   6076                 genPackageAddIntent(CALLING_PACKAGE_2, USER_10));
   6077 
   6078         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
   6079             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6080                     mManager.getManifestShortcuts()))),
   6081                     "ms1", "ms2");
   6082             assertWith(getCallerShortcuts()).selectManifest()
   6083                     .selectByActivity(
   6084                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
   6085                     .haveRanksInOrder("ms1", "ms2");
   6086             assertEmpty(mManager.getPinnedShortcuts());
   6087         });
   6088 
   6089         // But it shouldn't affect user-0.
   6090         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   6091             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6092                     mManager.getManifestShortcuts()))),
   6093                     "ms1", "ms2");
   6094             assertWith(getCallerShortcuts()).selectManifest()
   6095                     .selectByActivity(
   6096                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
   6097                     .haveRanksInOrder("ms1", "ms2");
   6098             assertShortcutIds(assertAllImmutable(assertAllPinned(
   6099                     mManager.getPinnedShortcuts())),
   6100                     "ms2", "ms3");
   6101             assertAllEnabled(list(getCallerShortcut("ms1")));
   6102             assertAllEnabled(list(getCallerShortcut("ms2")));
   6103             assertAllDisabled(list(getCallerShortcut("ms3")));
   6104         });
   6105 
   6106         // Multiple activities.
   6107         // Add shortcuts on activity 2 for package 2.
   6108         addManifestShortcutResource(
   6109                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   6110                 R.xml.shortcut_5_alt);
   6111         addManifestShortcutResource(
   6112                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity2.class.getName()),
   6113                 R.xml.shortcut_5_reverse);
   6114 
   6115         updatePackageLastUpdateTime(CALLING_PACKAGE_2, 1);
   6116                 mService.mPackageMonitor.onReceive(getTestContext(),
   6117                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
   6118 
   6119         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   6120             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6121                     mManager.getManifestShortcuts()))),
   6122                     "ms1", "ms2", "ms3", "ms4", "ms5",
   6123                     "ms1_alt", "ms2_alt", "ms3_alt", "ms4_alt", "ms5_alt");
   6124 
   6125             // Make sure they have the correct ranks, regardless of their ID's alphabetical order.
   6126             assertWith(getCallerShortcuts()).selectManifest()
   6127                     .selectByActivity(
   6128                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
   6129                     .haveRanksInOrder("ms1_alt", "ms2_alt", "ms3_alt", "ms4_alt", "ms5_alt");
   6130             assertWith(getCallerShortcuts()).selectManifest()
   6131                     .selectByActivity(
   6132                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity2.class.getName()))
   6133                     .haveRanksInOrder("ms5", "ms4", "ms3", "ms2", "ms1");
   6134         });
   6135 
   6136         // Package 2 now has no manifest shortcuts.
   6137         addManifestShortcutResource(
   6138                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
   6139                 R.xml.shortcut_0);
   6140         addManifestShortcutResource(
   6141                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity2.class.getName()),
   6142                 R.xml.shortcut_0);
   6143         updatePackageLastUpdateTime(CALLING_PACKAGE_2, 1);
   6144                 mService.mPackageMonitor.onReceive(getTestContext(),
   6145                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
   6146 
   6147         // No manifest shortcuts, and pinned ones are disabled.
   6148         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
   6149             assertEmpty(mManager.getManifestShortcuts());
   6150             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllDisabled(
   6151                     mManager.getPinnedShortcuts()))),
   6152                     "ms2", "ms3");
   6153         });
   6154     }
   6155 
   6156     public void testManifestShortcuts_missingMandatoryFields() {
   6157         // Start with no apps installed.
   6158         uninstallPackage(USER_0, CALLING_PACKAGE_1);
   6159         uninstallPackage(USER_0, CALLING_PACKAGE_2);
   6160         uninstallPackage(USER_0, CALLING_PACKAGE_3);
   6161         uninstallPackage(USER_0, CALLING_PACKAGE_4);
   6162 
   6163         mService.handleUnlockUser(USER_0);
   6164 
   6165         // Make sure no manifest shortcuts.
   6166         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6167             assertEmpty(mManager.getManifestShortcuts());
   6168         });
   6169 
   6170         // Package 1 updated, which has one valid manifest shortcut and one invalid.
   6171         addManifestShortcutResource(
   6172                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6173                 R.xml.shortcut_error_1);
   6174         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6175                 mService.mPackageMonitor.onReceive(getTestContext(),
   6176                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6177 
   6178         // Only the valid one is published.
   6179         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6180             assertWith(getCallerShortcuts())
   6181                     .areAllManifest()
   6182                     .areAllImmutable()
   6183                     .areAllEnabled()
   6184                     .haveIds("x1");
   6185         });
   6186 
   6187         // Package 1 updated, which has one valid manifest shortcut and one invalid.
   6188         addManifestShortcutResource(
   6189                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6190                 R.xml.shortcut_error_2);
   6191         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6192                 mService.mPackageMonitor.onReceive(getTestContext(),
   6193                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6194 
   6195         // Only the valid one is published.
   6196         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6197             assertWith(getCallerShortcuts())
   6198                     .areAllManifest()
   6199                     .areAllImmutable()
   6200                     .areAllEnabled()
   6201                     .haveIds("x2");
   6202         });
   6203 
   6204         // Package 1 updated, which has one valid manifest shortcut and one invalid.
   6205         addManifestShortcutResource(
   6206                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6207                 R.xml.shortcut_error_3);
   6208         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6209                 mService.mPackageMonitor.onReceive(getTestContext(),
   6210                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6211 
   6212         // Only the valid one is published.
   6213         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6214             assertWith(getCallerShortcuts())
   6215                     .areAllManifest()
   6216                     .areAllImmutable()
   6217                     .areAllEnabled()
   6218                     .haveIds("x3")
   6219                     .forShortcutWithId("x3", si -> {
   6220                         assertEquals(set("cat2"), si.getCategories());
   6221                      });
   6222         });
   6223     }
   6224 
   6225     public void testManifestShortcuts_intentDefinitions() {
   6226         addManifestShortcutResource(
   6227                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6228                 R.xml.shortcut_error_4);
   6229         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6230                 mService.mPackageMonitor.onReceive(getTestContext(),
   6231                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6232 
   6233         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6234             // Make sure invalid ones are not published.
   6235             // Note that at this point disabled ones don't show up because they weren't pinned.
   6236             assertWith(getCallerShortcuts())
   6237                     .haveIds("ms1", "ms2")
   6238                     .areAllManifest()
   6239                     .areAllNotDynamic()
   6240                     .areAllNotPinned()
   6241                     .areAllImmutable()
   6242                     .areAllEnabled()
   6243                     .forShortcutWithId("ms1", si -> {
   6244                         assertTrue(si.isEnabled());
   6245                         assertEquals(1, si.getIntents().length);
   6246 
   6247                         assertEquals("action1", si.getIntent().getAction());
   6248                         assertEquals("value1", si.getIntent().getStringExtra("key1"));
   6249                         assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK |
   6250                                 Intent.FLAG_ACTIVITY_CLEAR_TASK |
   6251                                 Intent.FLAG_ACTIVITY_TASK_ON_HOME, si.getIntent().getFlags());
   6252 
   6253                         assertEquals("action1", si.getIntents()[0].getAction());
   6254                         assertEquals("value1", si.getIntents()[0].getStringExtra("key1"));
   6255                         assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK |
   6256                                 Intent.FLAG_ACTIVITY_CLEAR_TASK |
   6257                                 Intent.FLAG_ACTIVITY_TASK_ON_HOME, si.getIntents()[0].getFlags());
   6258                     })
   6259                     .forShortcutWithId("ms2", si -> {
   6260                         assertTrue(si.isEnabled());
   6261                         assertEquals(2, si.getIntents().length);
   6262 
   6263                         // getIntent will return the last one.
   6264                         assertEquals("action2_2", si.getIntent().getAction());
   6265                         assertEquals("value2", si.getIntent().getStringExtra("key2"));
   6266                         assertEquals(0, si.getIntent().getFlags());
   6267 
   6268                         final Intent i1 = si.getIntents()[0];
   6269                         final Intent i2 = si.getIntents()[1];
   6270 
   6271                         assertEquals("action2_1", i1.getAction());
   6272                         assertEquals("value1", i1.getStringExtra("key1"));
   6273                         assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK |
   6274                                         Intent.FLAG_ACTIVITY_CLEAR_TASK |
   6275                                         Intent.FLAG_ACTIVITY_TASK_ON_HOME, i1.getFlags());
   6276 
   6277                         assertEquals("action2_2", i2.getAction());
   6278                         assertEquals("value2", i2.getStringExtra("key2"));
   6279                         assertEquals(0, i2.getFlags());
   6280                     });
   6281         });
   6282 
   6283         // Publish 5 enabled to pin some, so we can later test disabled manfiest shortcuts..
   6284         addManifestShortcutResource(
   6285                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6286                 R.xml.shortcut_5);
   6287         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6288                 mService.mPackageMonitor.onReceive(getTestContext(),
   6289                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6290 
   6291         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6292             // Make sure 5 manifest shortcuts are published.
   6293             assertWith(getCallerShortcuts())
   6294                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
   6295                     .areAllManifest()
   6296                     .areAllNotDynamic()
   6297                     .areAllNotPinned()
   6298                     .areAllImmutable()
   6299                     .areAllEnabled();
   6300         });
   6301 
   6302         runWithCaller(LAUNCHER_1, USER_0, () -> {
   6303             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
   6304                     list("ms3", "ms4", "ms5"), HANDLE_USER_0);
   6305         });
   6306 
   6307         // Make sure they're pinned.
   6308         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6309             assertWith(getCallerShortcuts())
   6310                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
   6311                     .selectByIds("ms1", "ms2")
   6312                     .areAllNotPinned()
   6313                     .areAllEnabled()
   6314 
   6315                     .revertToOriginalList()
   6316                     .selectByIds("ms3", "ms4", "ms5")
   6317                     .areAllPinned()
   6318                     .areAllEnabled();
   6319         });
   6320 
   6321         // Update the app.
   6322         addManifestShortcutResource(
   6323                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6324                 R.xml.shortcut_error_4);
   6325         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6326                 mService.mPackageMonitor.onReceive(getTestContext(),
   6327                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6328 
   6329         // Make sure 3, 4 and 5 still exist but disabled.
   6330         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6331             assertWith(getCallerShortcuts())
   6332                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
   6333                     .areAllNotDynamic()
   6334                     .areAllImmutable()
   6335 
   6336                     .selectByIds("ms1", "ms2")
   6337                     .areAllManifest()
   6338                     .areAllNotPinned()
   6339                     .areAllEnabled()
   6340 
   6341                     .revertToOriginalList()
   6342                     .selectByIds("ms3", "ms4", "ms5")
   6343                     .areAllNotManifest()
   6344                     .areAllPinned()
   6345                     .areAllDisabled()
   6346 
   6347                     .revertToOriginalList()
   6348                     .forShortcutWithId("ms1", si -> {
   6349                         assertEquals(si.getId(), "action1", si.getIntent().getAction());
   6350                     })
   6351                     .forShortcutWithId("ms2", si -> {
   6352                         // getIntent returns the last one.
   6353                         assertEquals(si.getId(), "action2_2", si.getIntent().getAction());
   6354                     })
   6355                     .forShortcutWithId("ms3", si -> {
   6356                         assertEquals(si.getId(), Intent.ACTION_VIEW, si.getIntent().getAction());
   6357                     })
   6358                     .forShortcutWithId("ms4", si -> {
   6359                         assertEquals(si.getId(), Intent.ACTION_VIEW, si.getIntent().getAction());
   6360                     })
   6361                     .forShortcutWithId("ms5", si -> {
   6362                         assertEquals(si.getId(), "action", si.getIntent().getAction());
   6363                     });
   6364         });
   6365     }
   6366 
   6367     public void testManifestShortcuts_checkAllFields() {
   6368         mService.handleUnlockUser(USER_0);
   6369 
   6370         // Package 1 updated, which has one valid manifest shortcut and one invalid.
   6371         addManifestShortcutResource(
   6372                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6373                 R.xml.shortcut_5);
   6374         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6375                 mService.mPackageMonitor.onReceive(getTestContext(),
   6376                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6377 
   6378         // Only the valid one is published.
   6379         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6380             assertWith(getCallerShortcuts())
   6381                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
   6382                     .areAllManifest()
   6383                     .areAllImmutable()
   6384                     .areAllEnabled()
   6385                     .areAllNotPinned()
   6386                     .areAllNotDynamic()
   6387 
   6388                     .forShortcutWithId("ms1", si -> {
   6389                         assertEquals(R.drawable.icon1, si.getIconResourceId());
   6390                         assertEquals(new ComponentName(CALLING_PACKAGE_1,
   6391                                 ShortcutActivity.class.getName()),
   6392                                 si.getActivity());
   6393 
   6394                         assertEquals(R.string.shortcut_title1, si.getTitleResId());
   6395                         assertEquals("r" + R.string.shortcut_title1, si.getTitleResName());
   6396                         assertEquals(R.string.shortcut_text1, si.getTextResId());
   6397                         assertEquals("r" + R.string.shortcut_text1, si.getTextResName());
   6398                         assertEquals(R.string.shortcut_disabled_message1,
   6399                                 si.getDisabledMessageResourceId());
   6400                         assertEquals("r" + R.string.shortcut_disabled_message1,
   6401                                 si.getDisabledMessageResName());
   6402 
   6403                         assertEquals(set("android.shortcut.conversation", "android.shortcut.media"),
   6404                                 si.getCategories());
   6405                         assertEquals("action1", si.getIntent().getAction());
   6406                         assertEquals(Uri.parse("http://a.b.c/1"), si.getIntent().getData());
   6407                     })
   6408 
   6409                     .forShortcutWithId("ms2", si -> {
   6410                         assertEquals("ms2", si.getId());
   6411                         assertEquals(R.drawable.icon2, si.getIconResourceId());
   6412 
   6413                         assertEquals(R.string.shortcut_title2, si.getTitleResId());
   6414                         assertEquals("r" + R.string.shortcut_title2, si.getTitleResName());
   6415                         assertEquals(R.string.shortcut_text2, si.getTextResId());
   6416                         assertEquals("r" + R.string.shortcut_text2, si.getTextResName());
   6417                         assertEquals(R.string.shortcut_disabled_message2,
   6418                                 si.getDisabledMessageResourceId());
   6419                         assertEquals("r" + R.string.shortcut_disabled_message2,
   6420                                 si.getDisabledMessageResName());
   6421 
   6422                         assertEquals(set("android.shortcut.conversation"), si.getCategories());
   6423                         assertEquals("action2", si.getIntent().getAction());
   6424                         assertEquals(null, si.getIntent().getData());
   6425                     })
   6426 
   6427                     .forShortcutWithId("ms3", si -> {
   6428                         assertEquals(0, si.getIconResourceId());
   6429                         assertEquals(R.string.shortcut_title1, si.getTitleResId());
   6430                         assertEquals("r" + R.string.shortcut_title1, si.getTitleResName());
   6431 
   6432                         assertEquals(0, si.getTextResId());
   6433                         assertEquals(null, si.getTextResName());
   6434                         assertEquals(0, si.getDisabledMessageResourceId());
   6435                         assertEquals(null, si.getDisabledMessageResName());
   6436 
   6437                         assertEmpty(si.getCategories());
   6438                         assertEquals("android.intent.action.VIEW", si.getIntent().getAction());
   6439                         assertEquals(null, si.getIntent().getData());
   6440                     })
   6441 
   6442                     .forShortcutWithId("ms4", si -> {
   6443                         assertEquals(0, si.getIconResourceId());
   6444                         assertEquals(R.string.shortcut_title2, si.getTitleResId());
   6445                         assertEquals("r" + R.string.shortcut_title2, si.getTitleResName());
   6446 
   6447                         assertEquals(0, si.getTextResId());
   6448                         assertEquals(null, si.getTextResName());
   6449                         assertEquals(0, si.getDisabledMessageResourceId());
   6450                         assertEquals(null, si.getDisabledMessageResName());
   6451 
   6452                         assertEquals(set("cat"), si.getCategories());
   6453                         assertEquals("android.intent.action.VIEW2", si.getIntent().getAction());
   6454                         assertEquals(null, si.getIntent().getData());
   6455                     })
   6456 
   6457                     .forShortcutWithId("ms5", si -> {
   6458                         si = getCallerShortcut("ms5");
   6459                         assertEquals("action", si.getIntent().getAction());
   6460                         assertEquals("http://www/", si.getIntent().getData().toString());
   6461                         assertEquals("foo/bar", si.getIntent().getType());
   6462                         assertEquals(
   6463                                 new ComponentName("abc", ".xyz"), si.getIntent().getComponent());
   6464 
   6465                         assertEquals(set("cat1", "cat2"), si.getIntent().getCategories());
   6466                         assertEquals("value1", si.getIntent().getStringExtra("key1"));
   6467                         assertEquals("value2", si.getIntent().getStringExtra("key2"));
   6468                     });
   6469         });
   6470     }
   6471 
   6472     public void testManifestShortcuts_localeChange() throws InterruptedException {
   6473         mService.handleUnlockUser(USER_0);
   6474 
   6475         // Package 1 updated, which has one valid manifest shortcut and one invalid.
   6476         addManifestShortcutResource(
   6477                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6478                 R.xml.shortcut_2);
   6479         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6480                 mService.mPackageMonitor.onReceive(getTestContext(),
   6481                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6482 
   6483         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6484             mManager.setDynamicShortcuts(list(makeShortcutWithTitle("s1", "title")));
   6485 
   6486             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6487                     mManager.getManifestShortcuts()))),
   6488                     "ms1", "ms2");
   6489 
   6490             // check first shortcut.
   6491             ShortcutInfo si = getCallerShortcut("ms1");
   6492 
   6493             assertEquals("ms1", si.getId());
   6494             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title1 + "/en",
   6495                     si.getTitle());
   6496             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text1 + "/en",
   6497                     si.getText());
   6498             assertEquals("string-com.android.test.1-user:0-res:"
   6499                             + R.string.shortcut_disabled_message1 + "/en",
   6500                     si.getDisabledMessage());
   6501             assertEquals(START_TIME, si.getLastChangedTimestamp());
   6502 
   6503             // check another
   6504             si = getCallerShortcut("ms2");
   6505 
   6506             assertEquals("ms2", si.getId());
   6507             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title2 + "/en",
   6508                     si.getTitle());
   6509             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text2 + "/en",
   6510                     si.getText());
   6511             assertEquals("string-com.android.test.1-user:0-res:"
   6512                             + R.string.shortcut_disabled_message2 + "/en",
   6513                     si.getDisabledMessage());
   6514             assertEquals(START_TIME, si.getLastChangedTimestamp());
   6515 
   6516             // Check the dynamic one.
   6517             si = getCallerShortcut("s1");
   6518 
   6519             assertEquals("s1", si.getId());
   6520             assertEquals("title", si.getTitle());
   6521             assertEquals(null, si.getText());
   6522             assertEquals(null, si.getDisabledMessage());
   6523             assertEquals(START_TIME, si.getLastChangedTimestamp());
   6524         });
   6525 
   6526         mInjectedCurrentTimeMillis++;
   6527 
   6528         // Change the locale and send the broadcast, make sure the launcher gets a callback too.
   6529         mInjectedLocale = Locale.JAPANESE;
   6530 
   6531         setCaller(LAUNCHER_1, USER_0);
   6532 
   6533         assertForLauncherCallback(mLauncherApps, () -> {
   6534             mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
   6535         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
   6536                 .haveIds("ms1", "ms2", "s1");
   6537 
   6538         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6539             // check first shortcut.
   6540             ShortcutInfo si = getCallerShortcut("ms1");
   6541 
   6542             assertEquals("ms1", si.getId());
   6543             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title1 + "/ja",
   6544                     si.getTitle());
   6545             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text1 + "/ja",
   6546                     si.getText());
   6547             assertEquals("string-com.android.test.1-user:0-res:"
   6548                             + R.string.shortcut_disabled_message1 + "/ja",
   6549                     si.getDisabledMessage());
   6550             assertEquals(START_TIME + 1, si.getLastChangedTimestamp());
   6551 
   6552             // check another
   6553             si = getCallerShortcut("ms2");
   6554 
   6555             assertEquals("ms2", si.getId());
   6556             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title2 + "/ja",
   6557                     si.getTitle());
   6558             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text2 + "/ja",
   6559                     si.getText());
   6560             assertEquals("string-com.android.test.1-user:0-res:"
   6561                             + R.string.shortcut_disabled_message2 + "/ja",
   6562                     si.getDisabledMessage());
   6563             assertEquals(START_TIME + 1, si.getLastChangedTimestamp());
   6564 
   6565             // Check the dynamic one.  (locale change shouldn't affect.)
   6566             si = getCallerShortcut("s1");
   6567 
   6568             assertEquals("s1", si.getId());
   6569             assertEquals("title", si.getTitle());
   6570             assertEquals(null, si.getText());
   6571             assertEquals(null, si.getDisabledMessage());
   6572             assertEquals(START_TIME, si.getLastChangedTimestamp()); // Not changed.
   6573         });
   6574     }
   6575 
   6576     public void testManifestShortcuts_updateAndDisabled_notPinned() {
   6577         mService.handleUnlockUser(USER_0);
   6578 
   6579         // First, just publish a manifest shortcut.
   6580         addManifestShortcutResource(
   6581                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6582                 R.xml.shortcut_1);
   6583         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6584                 mService.mPackageMonitor.onReceive(getTestContext(),
   6585                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6586 
   6587         // Only the valid one is published.
   6588         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6589             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6590                     mManager.getManifestShortcuts()))),
   6591                     "ms1");
   6592             assertEmpty(mManager.getPinnedShortcuts());
   6593 
   6594             // Make sure there's no other dangling shortcuts.
   6595             assertShortcutIds(getCallerShortcuts(), "ms1");
   6596         });
   6597 
   6598         // Now version up, the manifest shortcut is disabled now.
   6599         addManifestShortcutResource(
   6600                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6601                 R.xml.shortcut_1_disable);
   6602         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6603                 mService.mPackageMonitor.onReceive(getTestContext(),
   6604                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6605 
   6606         // Because shortcut 1 wasn't pinned, it'll just go away.
   6607         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6608             assertEmpty(mManager.getManifestShortcuts());
   6609             assertEmpty(mManager.getPinnedShortcuts());
   6610 
   6611             // Make sure there's no other dangling shortcuts.
   6612             assertEmpty(getCallerShortcuts());
   6613         });
   6614     }
   6615 
   6616     public void testManifestShortcuts_updateAndDisabled_pinned() {
   6617         mService.handleUnlockUser(USER_0);
   6618 
   6619         // First, just publish a manifest shortcut.
   6620         addManifestShortcutResource(
   6621                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6622                 R.xml.shortcut_1);
   6623         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6624                 mService.mPackageMonitor.onReceive(getTestContext(),
   6625                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6626 
   6627         // Only the valid one is published.
   6628         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6629             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6630                     mManager.getManifestShortcuts()))),
   6631                     "ms1");
   6632             assertEmpty(mManager.getPinnedShortcuts());
   6633 
   6634             // Make sure there's no other dangling shortcuts.
   6635             assertShortcutIds(getCallerShortcuts(), "ms1");
   6636         });
   6637 
   6638         runWithCaller(LAUNCHER_1, USER_0, () -> {
   6639             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms1"), HANDLE_USER_0);
   6640         });
   6641 
   6642         // Now upgrade, the manifest shortcut is disabled now.
   6643         addManifestShortcutResource(
   6644                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6645                 R.xml.shortcut_1_disable);
   6646         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6647                 mService.mPackageMonitor.onReceive(getTestContext(),
   6648                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6649 
   6650         // Because shortcut 1 was pinned, it'll still exist as pinned, but disabled.
   6651         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6652             assertEmpty(mManager.getManifestShortcuts());
   6653             assertShortcutIds(assertAllNotManifest(assertAllImmutable(assertAllDisabled(
   6654                     mManager.getPinnedShortcuts()))),
   6655                     "ms1");
   6656 
   6657             // Make sure the fields are updated.
   6658             ShortcutInfo si = getCallerShortcut("ms1");
   6659 
   6660             assertEquals("ms1", si.getId());
   6661             assertEquals(R.drawable.icon2, si.getIconResourceId());
   6662             assertEquals(R.string.shortcut_title2, si.getTitleResId());
   6663             assertEquals(R.string.shortcut_text2, si.getTextResId());
   6664             assertEquals(R.string.shortcut_disabled_message2, si.getDisabledMessageResourceId());
   6665             assertEquals(Intent.ACTION_VIEW, si.getIntent().getAction());
   6666 
   6667             // Make sure there's no other dangling shortcuts.
   6668             assertShortcutIds(getCallerShortcuts(), "ms1");
   6669         });
   6670     }
   6671 
   6672     public void testManifestShortcuts_duplicateInSingleActivity() {
   6673         mService.handleUnlockUser(USER_0);
   6674 
   6675         // The XML has two shortcuts with the same ID.
   6676         addManifestShortcutResource(
   6677                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6678                 R.xml.shortcut_2_duplicate);
   6679         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6680                 mService.mPackageMonitor.onReceive(getTestContext(),
   6681                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6682 
   6683         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6684             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6685                     mManager.getManifestShortcuts()))),
   6686                     "ms1");
   6687 
   6688             // Make sure the first one has survived.  (the second one has a different title.)
   6689             ShortcutInfo si = getCallerShortcut("ms1");
   6690             assertEquals(R.string.shortcut_title1, si.getTitleResId());
   6691 
   6692             // Make sure there's no other dangling shortcuts.
   6693             assertShortcutIds(getCallerShortcuts(), "ms1");
   6694         });
   6695     }
   6696 
   6697     public void testManifestShortcuts_duplicateInTwoActivities() {
   6698         mService.handleUnlockUser(USER_0);
   6699 
   6700         // ShortcutActivity has shortcut ms1
   6701         addManifestShortcutResource(
   6702                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6703                 R.xml.shortcut_1);
   6704 
   6705         // ShortcutActivity2 has two shortcuts, ms1 and ms2.
   6706         addManifestShortcutResource(
   6707                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
   6708                 R.xml.shortcut_5);
   6709         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6710                 mService.mPackageMonitor.onReceive(getTestContext(),
   6711                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6712 
   6713         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6714             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
   6715                     mManager.getManifestShortcuts()))),
   6716                     "ms1", "ms2", "ms3", "ms4", "ms5");
   6717 
   6718             // ms1 should belong to ShortcutActivity.
   6719             ShortcutInfo si = getCallerShortcut("ms1");
   6720             assertEquals(R.string.shortcut_title1, si.getTitleResId());
   6721             assertEquals(new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6722                     si.getActivity());
   6723             assertEquals(0, si.getRank());
   6724 
   6725             // ms2 should belong to ShortcutActivity*2*.
   6726             si = getCallerShortcut("ms2");
   6727             assertEquals(R.string.shortcut_title2, si.getTitleResId());
   6728             assertEquals(new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
   6729                     si.getActivity());
   6730 
   6731             // Also check the ranks
   6732             assertWith(getCallerShortcuts()).selectManifest()
   6733                     .selectByActivity(
   6734                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()))
   6735                     .haveRanksInOrder("ms1");
   6736             assertWith(getCallerShortcuts()).selectManifest()
   6737                     .selectByActivity(
   6738                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()))
   6739                     .haveRanksInOrder("ms2", "ms3", "ms4", "ms5");
   6740 
   6741             // Make sure there's no other dangling shortcuts.
   6742             assertShortcutIds(getCallerShortcuts(), "ms1", "ms2", "ms3", "ms4", "ms5");
   6743         });
   6744     }
   6745 
   6746     /**
   6747      * Manifest shortcuts cannot override shortcuts that were published via the APIs.
   6748      */
   6749     public void testManifestShortcuts_cannotOverrideNonManifest() {
   6750         mService.handleUnlockUser(USER_0);
   6751 
   6752         // Create a non-pinned dynamic shortcut and a non-dynamic pinned shortcut.
   6753 
   6754         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6755             mManager.setDynamicShortcuts(list(
   6756                     makeShortcut("ms1", "title1",
   6757                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6758                     /* icon */ null, new Intent("action1"), /* rank */ 0),
   6759                     makeShortcut("ms2", "title2",
   6760                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6761                     /* icon */ null, new Intent("action1"), /* rank */ 0)));
   6762         });
   6763 
   6764         runWithCaller(LAUNCHER_1, USER_0, () -> {
   6765             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2"), HANDLE_USER_0);
   6766         });
   6767 
   6768         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6769             mManager.removeDynamicShortcuts(list("ms2"));
   6770 
   6771             assertShortcutIds(mManager.getDynamicShortcuts(), "ms1");
   6772             assertShortcutIds(mManager.getPinnedShortcuts(), "ms2");
   6773             assertEmpty(mManager.getManifestShortcuts());
   6774         });
   6775 
   6776         // Then update the app with 5 manifest shortcuts.
   6777         // Make sure "ms1" and "ms2" won't be replaced.
   6778         addManifestShortcutResource(
   6779                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6780                 R.xml.shortcut_5);
   6781         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6782                 mService.mPackageMonitor.onReceive(getTestContext(),
   6783                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6784 
   6785         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6786             assertShortcutIds(assertAllNotManifest(mManager.getDynamicShortcuts()), "ms1");
   6787             assertShortcutIds(assertAllNotManifest(mManager.getPinnedShortcuts()), "ms2");
   6788             assertShortcutIds(assertAllManifest(mManager.getManifestShortcuts()),
   6789                     "ms3", "ms4", "ms5");
   6790 
   6791             // ms1 and ms2 shouold keep the original title.
   6792             ShortcutInfo si = getCallerShortcut("ms1");
   6793             assertEquals("title1", si.getTitle());
   6794 
   6795             si = getCallerShortcut("ms2");
   6796             assertEquals("title2", si.getTitle());
   6797         });
   6798     }
   6799 
   6800     protected void checkManifestShortcuts_immutable_verify() {
   6801         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6802             assertShortcutIds(assertAllNotManifest(assertAllEnabled(
   6803                     mManager.getDynamicShortcuts())),
   6804                     "s1");
   6805             assertShortcutIds(assertAllManifest(assertAllEnabled(
   6806                     mManager.getManifestShortcuts())),
   6807                     "ms1");
   6808             assertShortcutIds(assertAllNotManifest(assertAllDisabled(
   6809                     mManager.getPinnedShortcuts())),
   6810                     "ms2");
   6811 
   6812             assertEquals("t1", getCallerShortcut("s1").getTitle());
   6813 
   6814             // Make sure there are no other shortcuts.
   6815             assertShortcutIds(getCallerShortcuts(), "s1", "ms1", "ms2");
   6816         });
   6817     }
   6818 
   6819     /**
   6820      * Make sure the APIs won't work on manifest shortcuts.
   6821      */
   6822     public void testManifestShortcuts_immutable() {
   6823         mService.handleUnlockUser(USER_0);
   6824 
   6825         // Create a non-pinned manifest shortcut, a pinned shortcut that was originally
   6826         // a manifest shortcut, as well as a dynamic shortcut.
   6827 
   6828         addManifestShortcutResource(
   6829                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6830                 R.xml.shortcut_2);
   6831         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6832                 mService.mPackageMonitor.onReceive(getTestContext(),
   6833                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6834 
   6835         runWithCaller(LAUNCHER_1, USER_0, () -> {
   6836             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2"), HANDLE_USER_0);
   6837         });
   6838 
   6839         addManifestShortcutResource(
   6840                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6841                 R.xml.shortcut_1);
   6842         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6843                 mService.mPackageMonitor.onReceive(getTestContext(),
   6844                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6845 
   6846         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6847             mManager.addDynamicShortcuts(list(makeShortcutWithTitle("s1", "t1")));
   6848         });
   6849 
   6850         checkManifestShortcuts_immutable_verify();
   6851 
   6852         // Note that even though the first argument is not immutable and only the second one
   6853         // is immutable, the first argument should not be executed either.
   6854 
   6855         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6856             assertCannotUpdateImmutable(() -> {
   6857                 mManager.setDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms1")));
   6858             });
   6859             assertCannotUpdateImmutable(() -> {
   6860                 mManager.setDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms2")));
   6861             });
   6862         });
   6863         checkManifestShortcuts_immutable_verify();
   6864 
   6865         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6866             assertCannotUpdateImmutable(() -> {
   6867                 mManager.addDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms1")));
   6868             });
   6869             assertCannotUpdateImmutable(() -> {
   6870                 mManager.addDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms2")));
   6871             });
   6872         });
   6873         checkManifestShortcuts_immutable_verify();
   6874 
   6875 
   6876         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6877             assertCannotUpdateImmutable(() -> {
   6878                 mManager.updateShortcuts(list(makeShortcut("s1"), makeShortcut("ms1")));
   6879             });
   6880             assertCannotUpdateImmutable(() -> {
   6881                 mManager.updateShortcuts(list(makeShortcut("s1"), makeShortcut("ms2")));
   6882             });
   6883         });
   6884         checkManifestShortcuts_immutable_verify();
   6885 
   6886         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6887             assertCannotUpdateImmutable(() -> {
   6888                 mManager.removeDynamicShortcuts(list("s1", "ms1"));
   6889             });
   6890             assertCannotUpdateImmutable(() -> {
   6891                 mManager.removeDynamicShortcuts(list("s2", "ms2"));
   6892             });
   6893         });
   6894         checkManifestShortcuts_immutable_verify();
   6895 
   6896         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6897             assertCannotUpdateImmutable(() -> {
   6898                 mManager.disableShortcuts(list("s1", "ms1"));
   6899             });
   6900         });
   6901         checkManifestShortcuts_immutable_verify();
   6902 
   6903         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6904             assertCannotUpdateImmutable(() -> {
   6905                 mManager.enableShortcuts(list("s1", "ms2"));
   6906             });
   6907         });
   6908         checkManifestShortcuts_immutable_verify();
   6909     }
   6910 
   6911 
   6912     /**
   6913      * Make sure the APIs won't work on manifest shortcuts.
   6914      */
   6915     public void testManifestShortcuts_tooMany() {
   6916         // Change the max number of shortcuts.
   6917         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
   6918 
   6919         mService.handleUnlockUser(USER_0);
   6920 
   6921         addManifestShortcutResource(
   6922                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6923                 R.xml.shortcut_5);
   6924         updatePackageVersion(CALLING_PACKAGE_1, 1);
   6925                 mService.mPackageMonitor.onReceive(getTestContext(),
   6926                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6927 
   6928         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6929             // Only the first 3 should be published.
   6930             assertShortcutIds(mManager.getManifestShortcuts(), "ms1", "ms2", "ms3");
   6931         });
   6932     }
   6933 
   6934     public void testMaxShortcutCount_set() {
   6935         // Change the max number of shortcuts.
   6936         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
   6937 
   6938         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   6939             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
   6940             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
   6941             final ShortcutInfo s1_1 = makeShortcutWithActivity("s11", a1);
   6942             final ShortcutInfo s1_2 = makeShortcutWithActivity("s12", a1);
   6943             final ShortcutInfo s1_3 = makeShortcutWithActivity("s13", a1);
   6944             final ShortcutInfo s1_4 = makeShortcutWithActivity("s14", a1);
   6945             final ShortcutInfo s1_5 = makeShortcutWithActivity("s15", a1);
   6946             final ShortcutInfo s1_6 = makeShortcutWithActivity("s16", a1);
   6947             final ShortcutInfo s2_1 = makeShortcutWithActivity("s21", a2);
   6948             final ShortcutInfo s2_2 = makeShortcutWithActivity("s22", a2);
   6949             final ShortcutInfo s2_3 = makeShortcutWithActivity("s23", a2);
   6950             final ShortcutInfo s2_4 = makeShortcutWithActivity("s24", a2);
   6951 
   6952             // 3 shortcuts for 2 activities -> okay
   6953             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
   6954             assertShortcutIds(mManager.getDynamicShortcuts(),
   6955                     "s11", "s12", "s13", "s21", "s22", "s23");
   6956 
   6957             mManager.removeAllDynamicShortcuts();
   6958 
   6959             // 4 shortcut for activity 1 -> too many.
   6960             assertDynamicShortcutCountExceeded(() -> {
   6961                 mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s1_4, s2_1, s2_2, s2_3));
   6962             });
   6963             assertEmpty(mManager.getDynamicShortcuts());
   6964 
   6965             // 4 shortcut for activity 2 -> too many.
   6966             assertDynamicShortcutCountExceeded(() -> {
   6967                 mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3, s2_4));
   6968             });
   6969             assertEmpty(mManager.getDynamicShortcuts());
   6970 
   6971             // First, set 3.  Then set 4, which should be ignored.
   6972             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3));
   6973             assertShortcutIds(mManager.getDynamicShortcuts(),
   6974                     "s11", "s12", "s13");
   6975             assertDynamicShortcutCountExceeded(() -> {
   6976                 mManager.setDynamicShortcuts(list(s2_1, s2_2, s2_3, s2_4));
   6977             });
   6978             assertShortcutIds(mManager.getDynamicShortcuts(),
   6979                     "s11", "s12", "s13");
   6980 
   6981             // Set will remove the old dynamic set, unlike add, so the following should pass.
   6982             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3));
   6983             assertShortcutIds(mManager.getDynamicShortcuts(),
   6984                     "s11", "s12", "s13");
   6985             mManager.setDynamicShortcuts(list(s1_4, s1_5, s1_6));
   6986             assertShortcutIds(mManager.getDynamicShortcuts(),
   6987                     "s14", "s15", "s16");
   6988 
   6989             // Now, test with 2 manifest shortcuts.
   6990             mManager.removeAllDynamicShortcuts();
   6991             addManifestShortcutResource(
   6992                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   6993                     R.xml.shortcut_2);
   6994             updatePackageVersion(CALLING_PACKAGE_1, 1);
   6995                     mService.mPackageMonitor.onReceive(getTestContext(),
   6996                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   6997             assertEquals(2, mManager.getManifestShortcuts().size());
   6998 
   6999             // Setting 1 to activity 1 will work.
   7000             mManager.setDynamicShortcuts(list(s1_1, s2_1, s2_2, s2_3));
   7001             assertShortcutIds(mManager.getDynamicShortcuts(),
   7002                     "s11", "s21", "s22", "s23");
   7003             assertEquals(2, mManager.getManifestShortcuts().size());
   7004 
   7005             // But setting 2 will not.
   7006             mManager.removeAllDynamicShortcuts();
   7007             assertDynamicShortcutCountExceeded(() -> {
   7008                 mManager.setDynamicShortcuts(list(s1_1, s1_2, s2_1, s2_2, s2_3));
   7009             });
   7010             assertEmpty(mManager.getDynamicShortcuts());
   7011             assertEquals(2, mManager.getManifestShortcuts().size());
   7012         });
   7013     }
   7014 
   7015     public void testMaxShortcutCount_add() {
   7016         // Change the max number of shortcuts.
   7017         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
   7018 
   7019         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   7020             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
   7021             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
   7022             final ShortcutInfo s1_1 = makeShortcutWithActivity("s11", a1);
   7023             final ShortcutInfo s1_2 = makeShortcutWithActivity("s12", a1);
   7024             final ShortcutInfo s1_3 = makeShortcutWithActivity("s13", a1);
   7025             final ShortcutInfo s1_4 = makeShortcutWithActivity("s14", a1);
   7026             final ShortcutInfo s2_1 = makeShortcutWithActivity("s21", a2);
   7027             final ShortcutInfo s2_2 = makeShortcutWithActivity("s22", a2);
   7028             final ShortcutInfo s2_3 = makeShortcutWithActivity("s23", a2);
   7029             final ShortcutInfo s2_4 = makeShortcutWithActivity("s24", a2);
   7030 
   7031             // 3 shortcuts for 2 activities -> okay
   7032             mManager.addDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
   7033             assertShortcutIds(mManager.getDynamicShortcuts(),
   7034                     "s11", "s12", "s13", "s21", "s22", "s23");
   7035 
   7036             mManager.removeAllDynamicShortcuts();
   7037 
   7038             // 4 shortcut for activity 1 -> too many.
   7039             assertDynamicShortcutCountExceeded(() -> {
   7040                 mManager.addDynamicShortcuts(list(s1_1, s1_2, s1_3, s1_4, s2_1, s2_2, s2_3));
   7041             });
   7042             assertEmpty(mManager.getDynamicShortcuts());
   7043 
   7044             // 4 shortcut for activity 2 -> too many.
   7045             assertDynamicShortcutCountExceeded(() -> {
   7046                 mManager.addDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3, s2_4));
   7047             });
   7048             assertEmpty(mManager.getDynamicShortcuts());
   7049 
   7050             // First, set 3.  Then add 1 more, which should be ignored.
   7051             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3));
   7052             assertShortcutIds(mManager.getDynamicShortcuts(),
   7053                     "s11", "s12", "s13");
   7054             assertDynamicShortcutCountExceeded(() -> {
   7055                 mManager.addDynamicShortcuts(list(s1_4, s2_1));
   7056             });
   7057             assertShortcutIds(mManager.getDynamicShortcuts(),
   7058                     "s11", "s12", "s13");
   7059 
   7060             // Update existing one, which should work.
   7061             mManager.addDynamicShortcuts(list(makeShortcutWithActivityAndTitle(
   7062                     "s11", a1, "xxx"), s2_1));
   7063             assertShortcutIds(mManager.getDynamicShortcuts(),
   7064                     "s11", "s12", "s13", "s21");
   7065             assertEquals("xxx", getCallerShortcut("s11").getTitle());
   7066 
   7067             // Make sure pinned shortcuts won't affect.
   7068             // - Pin s11 - s13, and remove all dynamic.
   7069             runWithCaller(LAUNCHER_1, USER_0, () -> {
   7070                 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s11", "s12", "s13"),
   7071                         HANDLE_USER_0);
   7072             });
   7073             mManager.removeAllDynamicShortcuts();
   7074 
   7075             assertEmpty(mManager.getDynamicShortcuts());
   7076             assertShortcutIds(mManager.getPinnedShortcuts(),
   7077                     "s11", "s12", "s13");
   7078 
   7079             // Then add dynamic.
   7080             mManager.addDynamicShortcuts(list(s1_4, s2_1, s2_2, s2_3));
   7081 
   7082             assertShortcutIds(mManager.getDynamicShortcuts(),
   7083                     "s14", "s21", "s22", "s23");
   7084             assertShortcutIds(mManager.getPinnedShortcuts(),
   7085                     "s11", "s12", "s13");
   7086 
   7087             // Adding "s11" and "s12" back, should work
   7088             mManager.addDynamicShortcuts(list(s1_1, s1_2));
   7089 
   7090             assertShortcutIds(mManager.getDynamicShortcuts(),
   7091                     "s14", "s11", "s12", "s21", "s22", "s23");
   7092             assertShortcutIds(mManager.getPinnedShortcuts(),
   7093                     "s11", "s12", "s13");
   7094 
   7095             // Adding back s13 doesn't work.
   7096             assertDynamicShortcutCountExceeded(() -> {
   7097                 mManager.addDynamicShortcuts(list(s1_3));
   7098             });
   7099 
   7100             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
   7101                     "s11", "s12", "s14");
   7102             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
   7103                     "s21", "s22", "s23");
   7104 
   7105             // Now swap the activities.
   7106             mManager.updateShortcuts(list(
   7107                     makeShortcutWithActivity("s11", a2),
   7108                     makeShortcutWithActivity("s21", a1)));
   7109 
   7110             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
   7111                     "s21", "s12", "s14");
   7112             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
   7113                     "s11", "s22", "s23");
   7114 
   7115             // Now, test with 2 manifest shortcuts.
   7116             mManager.removeAllDynamicShortcuts();
   7117             addManifestShortcutResource(
   7118                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   7119                     R.xml.shortcut_2);
   7120             updatePackageVersion(CALLING_PACKAGE_1, 1);
   7121                     mService.mPackageMonitor.onReceive(getTestContext(),
   7122                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   7123 
   7124             assertEquals(2, mManager.getManifestShortcuts().size());
   7125 
   7126             // Adding one shortcut to activity 1 works fine.
   7127             mManager.addDynamicShortcuts(list(s1_1, s2_1, s2_2, s2_3));
   7128             assertShortcutIds(mManager.getDynamicShortcuts(),
   7129                     "s11", "s21", "s22", "s23");
   7130             assertEquals(2, mManager.getManifestShortcuts().size());
   7131 
   7132             // But adding one more doesn't.
   7133             assertDynamicShortcutCountExceeded(() -> {
   7134                 mManager.addDynamicShortcuts(list(s1_4, s2_1));
   7135             });
   7136             assertShortcutIds(mManager.getDynamicShortcuts(),
   7137                     "s11", "s21", "s22", "s23");
   7138             assertEquals(2, mManager.getManifestShortcuts().size());
   7139         });
   7140     }
   7141 
   7142     public void testMaxShortcutCount_update() {
   7143         // Change the max number of shortcuts.
   7144         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
   7145 
   7146         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   7147             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
   7148             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
   7149             final ShortcutInfo s1_1 = makeShortcutWithActivity("s11", a1);
   7150             final ShortcutInfo s1_2 = makeShortcutWithActivity("s12", a1);
   7151             final ShortcutInfo s1_3 = makeShortcutWithActivity("s13", a1);
   7152             final ShortcutInfo s1_4 = makeShortcutWithActivity("s14", a1);
   7153             final ShortcutInfo s1_5 = makeShortcutWithActivity("s15", a1);
   7154             final ShortcutInfo s2_1 = makeShortcutWithActivity("s21", a2);
   7155             final ShortcutInfo s2_2 = makeShortcutWithActivity("s22", a2);
   7156             final ShortcutInfo s2_3 = makeShortcutWithActivity("s23", a2);
   7157             final ShortcutInfo s2_4 = makeShortcutWithActivity("s24", a2);
   7158 
   7159             // 3 shortcuts for 2 activities -> okay
   7160             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
   7161             assertShortcutIds(mManager.getDynamicShortcuts(),
   7162                     "s11", "s12", "s13", "s21", "s22", "s23");
   7163 
   7164             // Trying to move s11 from a1 to a2 should fail.
   7165             assertDynamicShortcutCountExceeded(() -> {
   7166                 mManager.updateShortcuts(list(makeShortcutWithActivity("s11", a2)));
   7167             });
   7168             assertShortcutIds(mManager.getDynamicShortcuts(),
   7169                     "s11", "s12", "s13", "s21", "s22", "s23");
   7170 
   7171             // Trying to move s21 from a2 to a1 should also fail.
   7172             assertDynamicShortcutCountExceeded(() -> {
   7173                 mManager.updateShortcuts(list(makeShortcutWithActivity("s21", a1)));
   7174             });
   7175             assertShortcutIds(mManager.getDynamicShortcuts(),
   7176                     "s11", "s12", "s13", "s21", "s22", "s23");
   7177 
   7178             // But, if we do these two at the same time, it should work.
   7179             mManager.updateShortcuts(list(
   7180                     makeShortcutWithActivity("s11", a2),
   7181                     makeShortcutWithActivity("s21", a1)));
   7182             assertShortcutIds(mManager.getDynamicShortcuts(),
   7183                     "s11", "s12", "s13", "s21", "s22", "s23");
   7184             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
   7185                     "s21", "s12", "s13");
   7186             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
   7187                     "s11", "s22", "s23");
   7188 
   7189             // Then reset.
   7190             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
   7191             assertShortcutIds(mManager.getDynamicShortcuts(),
   7192                     "s11", "s12", "s13", "s21", "s22", "s23");
   7193 
   7194             // Pin some to have more shortcuts for a1.
   7195             runWithCaller(LAUNCHER_1, USER_0, () -> {
   7196                 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s11", "s12", "s13"),
   7197                         HANDLE_USER_0);
   7198             });
   7199             mManager.setDynamicShortcuts(list(s1_4, s1_5, s2_1, s2_2, s2_3));
   7200             assertShortcutIds(mManager.getDynamicShortcuts(),
   7201                     "s14", "s15", "s21", "s22", "s23");
   7202             assertShortcutIds(mManager.getPinnedShortcuts(),
   7203                     "s11", "s12", "s13");
   7204 
   7205             // a1 already has 2 dynamic shortcuts (and 3 pinned shortcuts that used to belong on it)
   7206             // But that doesn't matter for update -- the following should still work.
   7207             mManager.updateShortcuts(list(
   7208                     makeShortcutWithActivityAndTitle("s11", a1, "xxx1"),
   7209                     makeShortcutWithActivityAndTitle("s12", a1, "xxx2"),
   7210                     makeShortcutWithActivityAndTitle("s13", a1, "xxx3"),
   7211                     makeShortcutWithActivityAndTitle("s14", a1, "xxx4"),
   7212                     makeShortcutWithActivityAndTitle("s15", a1, "xxx5")));
   7213             // All the shortcuts should still exist they all belong on same activities,
   7214             // with the updated titles.
   7215             assertShortcutIds(mManager.getDynamicShortcuts(),
   7216                     "s14", "s15", "s21", "s22", "s23");
   7217             assertShortcutIds(mManager.getPinnedShortcuts(),
   7218                     "s11", "s12", "s13");
   7219 
   7220             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
   7221                     "s14", "s15");
   7222             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
   7223                     "s21", "s22", "s23");
   7224 
   7225             assertEquals("xxx1", getCallerShortcut("s11").getTitle());
   7226             assertEquals("xxx2", getCallerShortcut("s12").getTitle());
   7227             assertEquals("xxx3", getCallerShortcut("s13").getTitle());
   7228             assertEquals("xxx4", getCallerShortcut("s14").getTitle());
   7229             assertEquals("xxx5", getCallerShortcut("s15").getTitle());
   7230         });
   7231     }
   7232 
   7233     public void testShortcutsPushedOutByManifest() {
   7234         // Change the max number of shortcuts.
   7235         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
   7236 
   7237         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
   7238             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
   7239             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
   7240             final ShortcutInfo s1_1 = makeShortcutWithActivityAndRank("s11", a1, 4);
   7241             final ShortcutInfo s1_2 = makeShortcutWithActivityAndRank("s12", a1, 3);
   7242             final ShortcutInfo s1_3 = makeShortcutWithActivityAndRank("s13", a1, 2);
   7243             final ShortcutInfo s1_4 = makeShortcutWithActivityAndRank("s14", a1, 1);
   7244             final ShortcutInfo s1_5 = makeShortcutWithActivityAndRank("s15", a1, 0);
   7245             final ShortcutInfo s2_1 = makeShortcutWithActivityAndRank("s21", a2, 0);
   7246             final ShortcutInfo s2_2 = makeShortcutWithActivityAndRank("s22", a2, 1);
   7247             final ShortcutInfo s2_3 = makeShortcutWithActivityAndRank("s23", a2, 2);
   7248             final ShortcutInfo s2_4 = makeShortcutWithActivityAndRank("s24", a2, 3);
   7249             final ShortcutInfo s2_5 = makeShortcutWithActivityAndRank("s25", a2, 4);
   7250 
   7251             // Initial state.
   7252             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
   7253             runWithCaller(LAUNCHER_1, USER_0, () -> {
   7254                 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s11", "s12", "s21", "s22"),
   7255                         HANDLE_USER_0);
   7256             });
   7257             mManager.setDynamicShortcuts(list(s1_2, s1_3, s1_4, s2_2, s2_3, s2_4));
   7258             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
   7259                     "s12", "s13", "s14",
   7260                     "s22", "s23", "s24");
   7261             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
   7262                     "s11", "s12",
   7263                     "s21", "s22");
   7264 
   7265             // Add 1 manifest shortcut to a1.
   7266             addManifestShortcutResource(
   7267                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   7268                     R.xml.shortcut_1);
   7269             updatePackageVersion(CALLING_PACKAGE_1, 1);
   7270                     mService.mPackageMonitor.onReceive(getTestContext(),
   7271                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   7272             assertEquals(1, mManager.getManifestShortcuts().size());
   7273 
   7274             // s12 removed.
   7275             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
   7276                     "s13", "s14",
   7277                     "s22", "s23", "s24");
   7278             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
   7279                     "s11", "s12",
   7280                     "s21", "s22");
   7281 
   7282             // Add more manifest shortcuts.
   7283             addManifestShortcutResource(
   7284                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   7285                     R.xml.shortcut_2);
   7286             addManifestShortcutResource(
   7287                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
   7288                     R.xml.shortcut_1_alt);
   7289             updatePackageVersion(CALLING_PACKAGE_1, 1);
   7290                     mService.mPackageMonitor.onReceive(getTestContext(),
   7291                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   7292             assertEquals(3, mManager.getManifestShortcuts().size());
   7293 
   7294             // Note the ones with the highest rank values (== least important) will be removed.
   7295             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
   7296                     "s14",
   7297                     "s22", "s23");
   7298             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
   7299                     "s11", "s12",
   7300                     "s21", "s22");
   7301 
   7302             // Add more manifest shortcuts.
   7303             addManifestShortcutResource(
   7304                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   7305                     R.xml.shortcut_2);
   7306             addManifestShortcutResource(
   7307                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
   7308                     R.xml.shortcut_5_alt); // manifest has 5, but max is 3, so a2 will have 3.
   7309             updatePackageVersion(CALLING_PACKAGE_1, 1);
   7310                     mService.mPackageMonitor.onReceive(getTestContext(),
   7311                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   7312             assertEquals(5, mManager.getManifestShortcuts().size());
   7313 
   7314             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
   7315                     "s14" // a1 has 1 dynamic
   7316             ); // a2 has no dynamic
   7317             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
   7318                     "s11", "s12",
   7319                     "s21", "s22");
   7320 
   7321             // Update, no manifest shortucts.  This doesn't affect anything.
   7322             addManifestShortcutResource(
   7323                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
   7324                     R.xml.shortcut_0);
   7325             addManifestShortcutResource(
   7326                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
   7327                     R.xml.shortcut_0);
   7328             updatePackageVersion(CALLING_PACKAGE_1, 1);
   7329                     mService.mPackageMonitor.onReceive(getTestContext(),
   7330                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
   7331             assertEquals(0, mManager.getManifestShortcuts().size());
   7332 
   7333             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
   7334                     "s14");
   7335             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
   7336                     "s11", "s12",
   7337                     "s21", "s22");
   7338         });
   7339     }
   7340 }
   7341