• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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      */
testFirstInitialize()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      */
testUpdateAndGetNextResetTimeLocked()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      */
testInitializeFromSavedFile()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      */
testLoadFromBrokenFile()173     public void testLoadFromBrokenFile() {
174         // TODO Add various broken cases.
175     }
176 
testLoadConfig()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()} */
testGetMaxDynamicShortcutCount()218     public void testGetMaxDynamicShortcutCount() {
219         assertEquals(MAX_SHORTCUTS, mManager.getMaxShortcutCountForActivity());
220     }
221 
222     /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
testGetRemainingCallCount()223     public void testGetRemainingCallCount() {
224         assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount());
225     }
226 
testGetIconMaxDimensions()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()} */
testGetRateLimitResetTime()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 
testSetDynamicShortcuts()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 
testAddDynamicShortcuts()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 
testPublishWithNoActivity()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 
testPublishWithNoActivity_noMainActivityInPackage()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 
testDeleteDynamicShortcuts()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 
testDeleteAllDynamicShortcuts()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 
testIcons()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 
testCleanupDanglingBitmaps()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 
checkShrinkBitmap(int expectedWidth, int expectedHeight, int resId, int maxSize)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 
testShrinkBitmap()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 
openIconFileForWriteAndGetPath(int userId, String packageName)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 
testOpenIconFileForWrite()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 
testUpdateShortcuts()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 
testUpdateShortcuts_icons()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 
testGetShortcuts()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 
testGetShortcuts_shortcutKinds()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 
testGetShortcuts_resolveStrings()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
testGetShortcutInfo()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 
testPinShortcutAndGetPinnedShortcuts()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      */
testDisableAndEnableShortcuts()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 
testDisableShortcuts_thenRepublish()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 
testPinShortcutAndGetPinnedShortcuts_multi()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 
testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch()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 
testStartShortcut()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 
testLauncherCallback()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 
testLauncherCallback_crossProfile()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 
testSaveAndLoadUser_empty()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      */
testSaveAndLoadUser()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 
testCleanupPackage()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 
testCleanupPackage_republishManifests()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 
testHandleGonePackage_crossProfile()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 
checkCanRestoreTo(boolean expected, ShortcutPackageInfo spi, int version, String... signatures)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 
testCanRestoreTo()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.generateForInstalledPackage(
3817                 mService, CALLING_PACKAGE_1, USER_0);
3818         final ShortcutPackageInfo spi2 = ShortcutPackageInfo.generateForInstalledPackage(
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 
testHandlePackageDelete()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.handleUnlockUser(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.handleUnlockUser(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. */
testHandlePackageClearData()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 
testHandlePackageClearData_manifestRepublished()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 
testHandlePackageUpdate()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 
4190         reset(c0);
4191         reset(c10);
4192         mService.handleUnlockUser(USER_10);
4193 
4194         waitOnMainThread();
4195 
4196         shortcuts = ArgumentCaptor.forClass(List.class);
4197         verify(c0, times(0)).onShortcutsChanged(
4198                 eq(CALLING_PACKAGE_1),
4199                 any(List.class),
4200                 any(UserHandle.class));
4201 
4202         verify(c10).onShortcutsChanged(
4203                 eq(CALLING_PACKAGE_1),
4204                 shortcuts.capture(),
4205                 eq(HANDLE_USER_10));
4206 
4207         assertShortcutIds(shortcuts.getValue(), "s1", "s2");
4208         assertEquals(START_TIME + 200,
4209                 findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
4210         assertEquals(START_TIME + 200,
4211                 findShortcut(shortcuts.getValue(), "s2").getLastChangedTimestamp());
4212 
4213 
4214         // Do the same thing for package 2, which doesn't have resource icons.
4215         mInjectedCurrentTimeMillis = START_TIME + 300;
4216 
4217         reset(c0);
4218         reset(c10);
4219         updatePackageVersion(CALLING_PACKAGE_2, 10);
4220 
4221         // Then send the broadcast, to only user-0.
4222                 mService.mPackageMonitor.onReceive(getTestContext(),
4223                 genPackageUpdateIntent(CALLING_PACKAGE_2, USER_0));
4224         mService.handleUnlockUser(USER_10);
4225 
4226         waitOnMainThread();
4227 
4228         verify(c0, times(0)).onShortcutsChanged(
4229                 eq(CALLING_PACKAGE_1),
4230                 any(List.class),
4231                 any(UserHandle.class));
4232 
4233         verify(c10, times(0)).onShortcutsChanged(
4234                 eq(CALLING_PACKAGE_1),
4235                 any(List.class),
4236                 any(UserHandle.class));
4237 
4238         // Do the same thing for package 3
4239         mInjectedCurrentTimeMillis = START_TIME + 400;
4240 
4241         reset(c0);
4242         reset(c10);
4243         updatePackageVersion(CALLING_PACKAGE_3, 100);
4244 
4245         // Then send the broadcast, to only user-0.
4246                 mService.mPackageMonitor.onReceive(getTestContext(),
4247                 genPackageUpdateIntent(CALLING_PACKAGE_3, USER_0));
4248         mService.handleUnlockUser(USER_10);
4249 
4250         waitOnMainThread();
4251 
4252         shortcuts = ArgumentCaptor.forClass(List.class);
4253         verify(c0).onShortcutsChanged(
4254                 eq(CALLING_PACKAGE_3),
4255                 shortcuts.capture(),
4256                 eq(HANDLE_USER_0));
4257 
4258         // User 10 doesn't have package 3, so no callback.
4259         verify(c10, times(0)).onShortcutsChanged(
4260                 eq(CALLING_PACKAGE_3),
4261                 any(List.class),
4262                 any(UserHandle.class));
4263 
4264         assertShortcutIds(shortcuts.getValue(), "s1");
4265         assertEquals(START_TIME + 400,
4266                 findShortcut(shortcuts.getValue(), "s1").getLastChangedTimestamp());
4267     }
4268 
4269     /**
4270      * Test the case where an updated app has resource IDs changed.
4271      */
testHandlePackageUpdate_resIdChanged()4272     public void testHandlePackageUpdate_resIdChanged() throws Exception {
4273         final Icon icon1 = Icon.createWithResource(getTestContext(), /* res ID */ 1000);
4274         final Icon icon2 = Icon.createWithResource(getTestContext(), /* res ID */ 1001);
4275 
4276         // Set up shortcuts.
4277         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4278             // Note resource strings are not officially supported (they're hidden), but
4279             // should work.
4280 
4281             final ShortcutInfo s1 = new ShortcutInfo.Builder(mClientContext)
4282                     .setId("s1")
4283                     .setActivity(makeComponent(ShortcutActivity.class))
4284                     .setIntent(new Intent(Intent.ACTION_VIEW))
4285                     .setIcon(icon1)
4286                     .setTitleResId(10000)
4287                     .setTextResId(10001)
4288                     .setDisabledMessageResId(10002)
4289                     .build();
4290 
4291             final ShortcutInfo s2 = new ShortcutInfo.Builder(mClientContext)
4292                     .setId("s2")
4293                     .setActivity(makeComponent(ShortcutActivity.class))
4294                     .setIntent(new Intent(Intent.ACTION_VIEW))
4295                     .setIcon(icon2)
4296                     .setTitleResId(20000)
4297                     .build();
4298 
4299             assertTrue(mManager.setDynamicShortcuts(list(s1, s2)));
4300         });
4301 
4302         // Verify.
4303         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4304             final ShortcutInfo s1 = getCallerShortcut("s1");
4305             final ShortcutInfo s2 = getCallerShortcut("s2");
4306 
4307             assertEquals(1000, s1.getIconResourceId());
4308             assertEquals(10000, s1.getTitleResId());
4309             assertEquals(10001, s1.getTextResId());
4310             assertEquals(10002, s1.getDisabledMessageResourceId());
4311 
4312             assertEquals(1001, s2.getIconResourceId());
4313             assertEquals(20000, s2.getTitleResId());
4314             assertEquals(0, s2.getTextResId());
4315             assertEquals(0, s2.getDisabledMessageResourceId());
4316         });
4317 
4318         mService.saveDirtyInfo();
4319         initService();
4320 
4321         // Set up the mock resources again, with an "adjustment".
4322         // When the package is updated, the service will fetch the updated res-IDs with res-names,
4323         // and the new IDs will have this offset.
4324         setUpAppResources(10);
4325 
4326         // Update the package.
4327         updatePackageVersion(CALLING_PACKAGE_1, 1);
4328                 mService.mPackageMonitor.onReceive(getTestContext(),
4329                 genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
4330 
4331         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4332             final ShortcutInfo s1 = getCallerShortcut("s1");
4333             final ShortcutInfo s2 = getCallerShortcut("s2");
4334 
4335             assertEquals(1010, s1.getIconResourceId());
4336             assertEquals(10010, s1.getTitleResId());
4337             assertEquals(10011, s1.getTextResId());
4338             assertEquals(10012, s1.getDisabledMessageResourceId());
4339 
4340             assertEquals(1011, s2.getIconResourceId());
4341             assertEquals(20010, s2.getTitleResId());
4342             assertEquals(0, s2.getTextResId());
4343             assertEquals(0, s2.getDisabledMessageResourceId());
4344         });
4345     }
4346 
testHandlePackageChanged()4347     public void testHandlePackageChanged() {
4348         final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1");
4349         final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2");
4350 
4351         addManifestShortcutResource(ACTIVITY1, R.xml.shortcut_1);
4352         addManifestShortcutResource(ACTIVITY2, R.xml.shortcut_1_alt);
4353 
4354         mRunningUsers.put(USER_10, true);
4355 
4356         updatePackageVersion(CALLING_PACKAGE_1, 1);
4357                 mService.mPackageMonitor.onReceive(getTestContext(),
4358                 genPackageAddIntent(CALLING_PACKAGE_1, USER_10));
4359 
4360         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4361             assertTrue(mManager.addDynamicShortcuts(list(
4362                     makeShortcutWithActivity("s1", ACTIVITY1),
4363                     makeShortcutWithActivity("s2", ACTIVITY2)
4364             )));
4365         });
4366         runWithCaller(LAUNCHER_1, USER_10, () -> {
4367             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms1-alt", "s2"), HANDLE_USER_10);
4368         });
4369 
4370         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4371             assertWith(getCallerShortcuts())
4372                     .haveIds("ms1", "ms1-alt", "s1", "s2")
4373                     .areAllEnabled()
4374 
4375                     .selectPinned()
4376                     .haveIds("ms1-alt", "s2")
4377 
4378                     .revertToOriginalList()
4379                     .selectByIds("ms1", "s1")
4380                     .areAllWithActivity(ACTIVITY1)
4381 
4382                     .revertToOriginalList()
4383                     .selectByIds("ms1-alt", "s2")
4384                     .areAllWithActivity(ACTIVITY2)
4385                     ;
4386         });
4387 
4388         // First, no changes.
4389                 mService.mPackageMonitor.onReceive(getTestContext(),
4390                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
4391 
4392         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4393             assertWith(getCallerShortcuts())
4394                     .haveIds("ms1", "ms1-alt", "s1", "s2")
4395                     .areAllEnabled()
4396 
4397                     .selectPinned()
4398                     .haveIds("ms1-alt", "s2")
4399 
4400                     .revertToOriginalList()
4401                     .selectByIds("ms1", "s1")
4402                     .areAllWithActivity(ACTIVITY1)
4403 
4404                     .revertToOriginalList()
4405                     .selectByIds("ms1-alt", "s2")
4406                     .areAllWithActivity(ACTIVITY2)
4407             ;
4408         });
4409 
4410         // Disable activity 1
4411         mEnabledActivityChecker = (activity, userId) -> !ACTIVITY1.equals(activity);
4412                 mService.mPackageMonitor.onReceive(getTestContext(),
4413                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
4414 
4415         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4416             assertWith(getCallerShortcuts())
4417                     .haveIds("ms1-alt", "s2")
4418                     .areAllEnabled()
4419 
4420                     .selectPinned()
4421                     .haveIds("ms1-alt", "s2")
4422 
4423                     .revertToOriginalList()
4424                     .selectByIds("ms1-alt", "s2")
4425                     .areAllWithActivity(ACTIVITY2)
4426             ;
4427         });
4428 
4429         // Re-enable activity 1.
4430         // Manifest shortcuts will be re-published, but dynamic ones are not.
4431         mEnabledActivityChecker = (activity, userId) -> true;
4432                 mService.mPackageMonitor.onReceive(getTestContext(),
4433                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
4434 
4435         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4436             assertWith(getCallerShortcuts())
4437                     .haveIds("ms1", "ms1-alt", "s2")
4438                     .areAllEnabled()
4439 
4440                     .selectPinned()
4441                     .haveIds("ms1-alt", "s2")
4442 
4443                     .revertToOriginalList()
4444                     .selectByIds("ms1")
4445                     .areAllWithActivity(ACTIVITY1)
4446 
4447                     .revertToOriginalList()
4448                     .selectByIds("ms1-alt", "s2")
4449                     .areAllWithActivity(ACTIVITY2)
4450                     ;
4451         });
4452 
4453         // Disable activity 2
4454         // Because "ms1-alt" and "s2" are both pinned, they will remain, but disabled.
4455         mEnabledActivityChecker = (activity, userId) -> !ACTIVITY2.equals(activity);
4456                 mService.mPackageMonitor.onReceive(getTestContext(),
4457                 genPackageChangedIntent(CALLING_PACKAGE_1, USER_10));
4458 
4459         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4460             assertWith(getCallerShortcuts())
4461                     .haveIds("ms1", "ms1-alt", "s2")
4462 
4463                     .selectDynamic().isEmpty().revertToOriginalList() // no dynamics.
4464 
4465                     .selectPinned()
4466                     .haveIds("ms1-alt", "s2")
4467                     .areAllDisabled()
4468 
4469                     .revertToOriginalList()
4470                     .selectByIds("ms1")
4471                     .areAllWithActivity(ACTIVITY1)
4472                     .areAllEnabled()
4473             ;
4474         });
4475     }
4476 
testHandlePackageUpdate_activityNoLongerMain()4477     public void testHandlePackageUpdate_activityNoLongerMain() throws Throwable {
4478         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4479             assertTrue(mManager.setDynamicShortcuts(list(
4480                     makeShortcutWithActivity("s1a",
4481                             new ComponentName(getCallingPackage(), "act1")),
4482                     makeShortcutWithActivity("s1b",
4483                             new ComponentName(getCallingPackage(), "act1")),
4484                     makeShortcutWithActivity("s2a",
4485                             new ComponentName(getCallingPackage(), "act2")),
4486                     makeShortcutWithActivity("s2b",
4487                             new ComponentName(getCallingPackage(), "act2")),
4488                     makeShortcutWithActivity("s3a",
4489                             new ComponentName(getCallingPackage(), "act3")),
4490                     makeShortcutWithActivity("s3b",
4491                             new ComponentName(getCallingPackage(), "act3"))
4492             )));
4493             assertWith(getCallerShortcuts())
4494                     .haveIds("s1a", "s1b", "s2a", "s2b", "s3a", "s3b")
4495                     .areAllDynamic();
4496         });
4497         runWithCaller(LAUNCHER_1, USER_0, () -> {
4498             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
4499                     list("s1b", "s2b", "s3b"),
4500                     HANDLE_USER_0);
4501         });
4502         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4503             assertWith(getCallerShortcuts())
4504                     .haveIds("s1a", "s1b", "s2a", "s2b", "s3a", "s3b")
4505                     .areAllDynamic()
4506 
4507                     .selectByIds("s1b", "s2b", "s3b")
4508                     .areAllPinned();
4509         });
4510 
4511         // Update the app and act2 and act3 are no longer main.
4512         mMainActivityChecker = (activity, userId) -> {
4513             return activity.getClassName().equals("act1");
4514         };
4515 
4516         setCaller(LAUNCHER_1, USER_0);
4517         assertForLauncherCallback(mLauncherApps, () -> {
4518             updatePackageVersion(CALLING_PACKAGE_1, 1);
4519                     mService.mPackageMonitor.onReceive(getTestContext(),
4520                     genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
4521         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
4522                 // Make sure the launcher gets callbacks.
4523                 .haveIds("s1a", "s1b", "s2b", "s3b")
4524                 .areAllWithKeyFieldsOnly();
4525 
4526         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4527             // s2a and s3a are gone, but s2b and s3b will remain because they're pinned, and
4528             // disabled.
4529             assertWith(getCallerShortcuts())
4530                     .haveIds("s1a", "s1b", "s2b", "s3b")
4531 
4532                     .selectByIds("s1a", "s1b")
4533                     .areAllDynamic()
4534                     .areAllEnabled()
4535 
4536                     .revertToOriginalList()
4537                     .selectByIds("s2b", "s3b")
4538                     .areAllNotDynamic()
4539                     .areAllDisabled()
4540                     .areAllPinned()
4541                     ;
4542         });
4543     }
4544 
prepareForBackupTest()4545     protected void prepareForBackupTest() {
4546 
4547         prepareCrossProfileDataSet();
4548 
4549         backupAndRestore();
4550     }
4551 
4552     /**
4553      * Make sure the backup data doesn't have the following information:
4554      * - Launchers on other users.
4555      * - Non-backup app information.
4556      *
4557      * But restores all other infomation.
4558      *
4559      * It also omits the following pieces of information, but that's tested in
4560      * {@link ShortcutManagerTest2#testShortcutInfoSaveAndLoad_forBackup}.
4561      * - Unpinned dynamic shortcuts
4562      * - Bitmaps
4563      */
testBackupAndRestore()4564     public void testBackupAndRestore() {
4565         prepareForBackupTest();
4566 
4567         checkBackupAndRestore_success();
4568     }
4569 
testBackupAndRestore_backupRestoreTwice()4570     public void testBackupAndRestore_backupRestoreTwice() {
4571         prepareForBackupTest();
4572 
4573         // Note doing a backup & restore again here shouldn't affect the result.
4574         dumpsysOnLogcat("Before second backup");
4575 
4576         backupAndRestore();
4577 
4578         dumpsysOnLogcat("After second backup");
4579 
4580         checkBackupAndRestore_success();
4581     }
4582 
testBackupAndRestore_backupRestoreMultiple()4583     public void testBackupAndRestore_backupRestoreMultiple() {
4584         prepareForBackupTest();
4585 
4586         // Note doing a backup & restore again here shouldn't affect the result.
4587         backupAndRestore();
4588 
4589         // This also shouldn't affect the result.
4590         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4591             assertTrue(mManager.setDynamicShortcuts(list(
4592                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
4593                     makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
4594         });
4595 
4596         backupAndRestore();
4597 
4598         checkBackupAndRestore_success();
4599     }
4600 
testBackupAndRestore_restoreToNewVersion()4601     public void testBackupAndRestore_restoreToNewVersion() {
4602         prepareForBackupTest();
4603 
4604         // Note doing a backup & restore again here shouldn't affect the result.
4605         backupAndRestore();
4606 
4607         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2);
4608         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 5);
4609 
4610         checkBackupAndRestore_success();
4611     }
4612 
testBackupAndRestore_restoreToSuperSetSignatures()4613     public void testBackupAndRestore_restoreToSuperSetSignatures() {
4614         prepareForBackupTest();
4615 
4616         // Note doing a backup & restore again here shouldn't affect the result.
4617         backupAndRestore();
4618 
4619         // Change package signatures.
4620         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1, "sigx", CALLING_PACKAGE_1);
4621         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4, LAUNCHER_1, "sigy");
4622 
4623         checkBackupAndRestore_success();
4624     }
4625 
checkBackupAndRestore_success()4626     protected void checkBackupAndRestore_success() {
4627         // Make sure non-system user is not restored.
4628         final ShortcutUser userP0 = mService.getUserShortcutsLocked(USER_P0);
4629         assertEquals(0, userP0.getAllPackagesForTest().size());
4630         assertEquals(0, userP0.getAllLaunchersForTest().size());
4631 
4632         // Make sure only "allowBackup" apps are restored, and are shadow.
4633         final ShortcutUser user0 = mService.getUserShortcutsLocked(USER_0);
4634         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_1));
4635         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_2));
4636         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
4637                 PackageWithUser.of(USER_0, LAUNCHER_1)));
4638         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
4639                 PackageWithUser.of(USER_0, LAUNCHER_2)));
4640 
4641         assertNull(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
4642         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
4643         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
4644 
4645         installPackage(USER_0, CALLING_PACKAGE_1);
4646         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4647             assertWith(getCallerVisibleShortcuts())
4648                     .selectDynamic()
4649                     .isEmpty()
4650 
4651                     .revertToOriginalList()
4652                     .selectPinned()
4653                     .haveIds("s1", "s2");
4654         });
4655 
4656         installPackage(USER_0, LAUNCHER_1);
4657         runWithCaller(LAUNCHER_1, USER_0, () -> {
4658             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4659                     .areAllPinned()
4660                     .haveIds("s1");
4661 
4662             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4663                     .isEmpty();
4664 
4665             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4666                     .isEmpty();
4667 
4668             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
4669                     .isEmpty();
4670         });
4671 
4672         installPackage(USER_0, CALLING_PACKAGE_2);
4673         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4674             assertWith(getCallerVisibleShortcuts())
4675                     .selectDynamic()
4676                     .isEmpty()
4677 
4678                     .revertToOriginalList()
4679                     .selectPinned()
4680                     .haveIds("s1", "s2", "s3");
4681         });
4682 
4683         runWithCaller(LAUNCHER_1, USER_0, () -> {
4684             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4685                     .areAllPinned()
4686                     .haveIds("s1");
4687 
4688             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4689                     .areAllPinned()
4690                     .haveIds("s1", "s2");
4691 
4692             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4693                     .isEmpty();
4694 
4695             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
4696                     .isEmpty();
4697         });
4698 
4699         // 3 shouldn't be backed up, so no pinned shortcuts.
4700         installPackage(USER_0, CALLING_PACKAGE_3);
4701         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4702             assertWith(getCallerVisibleShortcuts())
4703                     .isEmpty();
4704         });
4705 
4706         // Launcher on a different profile shouldn't be restored.
4707         runWithCaller(LAUNCHER_1, USER_P0, () -> {
4708             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4709                     .isEmpty();
4710             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4711                     .isEmpty();
4712             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4713                     .isEmpty();
4714         });
4715 
4716         // Package on a different profile, no restore.
4717         installPackage(USER_P0, CALLING_PACKAGE_1);
4718         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
4719             assertWith(getCallerVisibleShortcuts())
4720                     .isEmpty();
4721         });
4722 
4723         // Restore launcher 2 on user 0.
4724         installPackage(USER_0, LAUNCHER_2);
4725         runWithCaller(LAUNCHER_2, USER_0, () -> {
4726             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4727                     .areAllPinned()
4728                     .haveIds("s2");
4729 
4730             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4731                     .areAllPinned()
4732                     .haveIds("s2", "s3");
4733 
4734             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4735                     .isEmpty();
4736 
4737             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
4738                     .isEmpty();
4739         });
4740 
4741 
4742         // Restoration of launcher2 shouldn't affect other packages; so do the same checks and
4743         // make sure they still have the same result.
4744         installPackage(USER_0, CALLING_PACKAGE_1);
4745         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4746             assertWith(getCallerVisibleShortcuts())
4747                     .areAllPinned()
4748                     .haveIds("s1", "s2");
4749         });
4750 
4751         installPackage(USER_0, LAUNCHER_1);
4752         runWithCaller(LAUNCHER_1, USER_0, () -> {
4753             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4754                     .areAllPinned()
4755                     .haveIds("s1");
4756 
4757             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4758                     .areAllPinned()
4759                     .haveIds("s1", "s2");
4760 
4761             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4762                     .isEmpty();
4763 
4764             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
4765                     .isEmpty();
4766         });
4767 
4768         installPackage(USER_0, CALLING_PACKAGE_2);
4769         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4770             assertWith(getCallerVisibleShortcuts())
4771                     .areAllPinned()
4772                     .haveIds("s1", "s2", "s3");
4773         });
4774     }
4775 
testBackupAndRestore_publisherLowerVersion()4776     public void testBackupAndRestore_publisherLowerVersion() {
4777         prepareForBackupTest();
4778 
4779         // Note doing a backup & restore again here shouldn't affect the result.
4780         backupAndRestore();
4781 
4782         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 0); // Lower version
4783 
4784         checkBackupAndRestore_publisherNotRestored();
4785     }
4786 
testBackupAndRestore_publisherWrongSignature()4787     public void testBackupAndRestore_publisherWrongSignature() {
4788         prepareForBackupTest();
4789 
4790         // Note doing a backup & restore again here shouldn't affect the result.
4791         backupAndRestore();
4792 
4793         addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature
4794 
4795         checkBackupAndRestore_publisherNotRestored();
4796     }
4797 
testBackupAndRestore_publisherNoLongerBackupTarget()4798     public void testBackupAndRestore_publisherNoLongerBackupTarget() {
4799         prepareForBackupTest();
4800 
4801         // Note doing a backup & restore again here shouldn't affect the result.
4802         backupAndRestore();
4803 
4804         updatePackageInfo(CALLING_PACKAGE_1,
4805                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
4806 
4807         checkBackupAndRestore_publisherNotRestored();
4808     }
4809 
checkBackupAndRestore_publisherNotRestored()4810     protected void checkBackupAndRestore_publisherNotRestored() {
4811         installPackage(USER_0, CALLING_PACKAGE_1);
4812         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4813             assertEquals(0, mManager.getDynamicShortcuts().size());
4814             assertEquals(0, mManager.getPinnedShortcuts().size());
4815         });
4816 
4817         installPackage(USER_0, CALLING_PACKAGE_2);
4818         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4819             assertEquals(0, mManager.getDynamicShortcuts().size());
4820             assertShortcutIds(assertAllPinned(
4821                     mManager.getPinnedShortcuts()),
4822                     "s1", "s2", "s3");
4823         });
4824 
4825         installPackage(USER_0, LAUNCHER_1);
4826         runWithCaller(LAUNCHER_1, USER_0, () -> {
4827             assertShortcutIds(assertAllPinned(
4828                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4829                     /* empty */);
4830             assertShortcutIds(assertAllPinned(
4831                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4832                     "s1", "s2");
4833             assertShortcutIds(assertAllPinned(
4834                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4835                     /* empty */);
4836         });
4837         installPackage(USER_0, LAUNCHER_2);
4838         runWithCaller(LAUNCHER_2, USER_0, () -> {
4839             assertShortcutIds(assertAllPinned(
4840                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4841                     /* empty */);
4842             assertShortcutIds(assertAllPinned(
4843                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4844                     "s2", "s3");
4845             assertShortcutIds(assertAllPinned(
4846                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4847                     /* empty */);
4848         });
4849 
4850         installPackage(USER_0, CALLING_PACKAGE_3);
4851         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4852             assertEquals(0, mManager.getDynamicShortcuts().size());
4853             assertEquals(0, mManager.getPinnedShortcuts().size());
4854         });
4855 
4856         runWithCaller(LAUNCHER_1, USER_0, () -> {
4857             assertShortcutIds(assertAllPinned(
4858                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4859                     /* empty */);
4860             assertShortcutIds(assertAllPinned(
4861                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4862                     "s1", "s2");
4863             assertShortcutIds(assertAllPinned(
4864                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4865                     /* empty */);
4866         });
4867         runWithCaller(LAUNCHER_2, USER_0, () -> {
4868             assertShortcutIds(assertAllPinned(
4869                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4870                     /* empty */);
4871             assertShortcutIds(assertAllPinned(
4872                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4873                     "s2", "s3");
4874             assertShortcutIds(assertAllPinned(
4875                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4876                     /* empty */);
4877         });
4878     }
4879 
testBackupAndRestore_launcherLowerVersion()4880     public void testBackupAndRestore_launcherLowerVersion() {
4881         prepareForBackupTest();
4882 
4883         // Note doing a backup & restore again here shouldn't affect the result.
4884         backupAndRestore();
4885 
4886         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version
4887 
4888         checkBackupAndRestore_launcherNotRestored();
4889     }
4890 
testBackupAndRestore_launcherWrongSignature()4891     public void testBackupAndRestore_launcherWrongSignature() {
4892         prepareForBackupTest();
4893 
4894         // Note doing a backup & restore again here shouldn't affect the result.
4895         backupAndRestore();
4896 
4897         addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature
4898 
4899         checkBackupAndRestore_launcherNotRestored();
4900     }
4901 
testBackupAndRestore_launcherNoLongerBackupTarget()4902     public void testBackupAndRestore_launcherNoLongerBackupTarget() {
4903         prepareForBackupTest();
4904 
4905         // Note doing a backup & restore again here shouldn't affect the result.
4906         backupAndRestore();
4907 
4908         updatePackageInfo(LAUNCHER_1,
4909                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
4910 
4911         checkBackupAndRestore_launcherNotRestored();
4912     }
4913 
checkBackupAndRestore_launcherNotRestored()4914     protected void checkBackupAndRestore_launcherNotRestored() {
4915         installPackage(USER_0, CALLING_PACKAGE_1);
4916         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4917             assertEquals(0, mManager.getDynamicShortcuts().size());
4918 
4919             // s1 was pinned by launcher 1, which is not restored, yet, so we still see "s1" here.
4920             assertShortcutIds(assertAllPinned(
4921                     mManager.getPinnedShortcuts()),
4922                     "s1", "s2");
4923         });
4924 
4925         installPackage(USER_0, CALLING_PACKAGE_2);
4926         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4927             assertEquals(0, mManager.getDynamicShortcuts().size());
4928             assertShortcutIds(assertAllPinned(
4929                     mManager.getPinnedShortcuts()),
4930                     "s1", "s2", "s3");
4931         });
4932 
4933         // Now we try to restore launcher 1.  Then we realize it's not restorable, so L1 has no pinned
4934         // shortcuts.
4935         installPackage(USER_0, LAUNCHER_1);
4936         runWithCaller(LAUNCHER_1, USER_0, () -> {
4937             assertShortcutIds(assertAllPinned(
4938                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4939                     /* empty */);
4940             assertShortcutIds(assertAllPinned(
4941                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4942                     /* empty */);
4943             assertShortcutIds(assertAllPinned(
4944                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4945                     /* empty */);
4946         });
4947 
4948         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4949             assertEquals(0, mManager.getDynamicShortcuts().size());
4950 
4951             // Now CALLING_PACKAGE_1 realizes "s1" is no longer pinned.
4952             assertShortcutIds(assertAllPinned(
4953                     mManager.getPinnedShortcuts()),
4954                     "s2");
4955         });
4956 
4957         installPackage(USER_0, LAUNCHER_2);
4958         runWithCaller(LAUNCHER_2, USER_0, () -> {
4959             assertShortcutIds(assertAllPinned(
4960                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4961                     "s2");
4962             assertShortcutIds(assertAllPinned(
4963                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4964                     "s2", "s3");
4965             assertShortcutIds(assertAllPinned(
4966                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4967                     /* empty */);
4968         });
4969 
4970         installPackage(USER_0, CALLING_PACKAGE_3);
4971         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4972             assertEquals(0, mManager.getDynamicShortcuts().size());
4973             assertEquals(0, mManager.getPinnedShortcuts().size());
4974         });
4975 
4976         runWithCaller(LAUNCHER_1, USER_0, () -> {
4977             assertShortcutIds(assertAllPinned(
4978                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4979                     /* empty */);
4980             assertShortcutIds(assertAllPinned(
4981                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4982                     /* empty */);
4983             assertShortcutIds(assertAllPinned(
4984                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4985                     /* empty */);
4986         });
4987         runWithCaller(LAUNCHER_2, USER_0, () -> {
4988             assertShortcutIds(assertAllPinned(
4989                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4990                     "s2");
4991             assertShortcutIds(assertAllPinned(
4992                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4993                     "s2", "s3");
4994             assertShortcutIds(assertAllPinned(
4995                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4996                     /* empty */);
4997         });
4998     }
4999 
testBackupAndRestore_launcherAndPackageNoLongerBackupTarget()5000     public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() {
5001         prepareForBackupTest();
5002 
5003         // Note doing a backup & restore again here shouldn't affect the result.
5004         backupAndRestore();
5005 
5006         updatePackageInfo(CALLING_PACKAGE_1,
5007                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
5008 
5009         updatePackageInfo(LAUNCHER_1,
5010                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
5011 
5012         checkBackupAndRestore_publisherAndLauncherNotRestored();
5013     }
5014 
checkBackupAndRestore_publisherAndLauncherNotRestored()5015     protected void checkBackupAndRestore_publisherAndLauncherNotRestored() {
5016         installPackage(USER_0, CALLING_PACKAGE_1);
5017         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5018             assertEquals(0, mManager.getDynamicShortcuts().size());
5019             assertEquals(0, mManager.getPinnedShortcuts().size());
5020         });
5021 
5022         installPackage(USER_0, CALLING_PACKAGE_2);
5023         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5024             assertEquals(0, mManager.getDynamicShortcuts().size());
5025             assertShortcutIds(assertAllPinned(
5026                     mManager.getPinnedShortcuts()),
5027                     "s1", "s2", "s3");
5028         });
5029 
5030         installPackage(USER_0, LAUNCHER_1);
5031         runWithCaller(LAUNCHER_1, USER_0, () -> {
5032             assertShortcutIds(assertAllPinned(
5033                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
5034                     /* empty */);
5035             assertShortcutIds(assertAllPinned(
5036                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
5037                     /* empty */);
5038             assertShortcutIds(assertAllPinned(
5039                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
5040                     /* empty */);
5041         });
5042         installPackage(USER_0, LAUNCHER_2);
5043         runWithCaller(LAUNCHER_2, USER_0, () -> {
5044             assertShortcutIds(assertAllPinned(
5045                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
5046                     /* empty */);
5047             assertShortcutIds(assertAllPinned(
5048                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
5049                     "s2", "s3");
5050             assertShortcutIds(assertAllPinned(
5051                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
5052                     /* empty */);
5053         });
5054 
5055         // Because launcher 1 wasn't restored, "s1" is no longer pinned.
5056         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5057             assertEquals(0, mManager.getDynamicShortcuts().size());
5058             assertShortcutIds(assertAllPinned(
5059                     mManager.getPinnedShortcuts()),
5060                     "s2", "s3");
5061         });
5062 
5063         installPackage(USER_0, CALLING_PACKAGE_3);
5064         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5065             assertEquals(0, mManager.getDynamicShortcuts().size());
5066             assertEquals(0, mManager.getPinnedShortcuts().size());
5067         });
5068 
5069         runWithCaller(LAUNCHER_1, USER_0, () -> {
5070             assertShortcutIds(assertAllPinned(
5071                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
5072                     /* empty */);
5073             assertShortcutIds(assertAllPinned(
5074                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
5075                     /* empty */);
5076             assertShortcutIds(assertAllPinned(
5077                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
5078                     /* empty */);
5079         });
5080         runWithCaller(LAUNCHER_2, USER_0, () -> {
5081             assertShortcutIds(assertAllPinned(
5082                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
5083                     /* empty */);
5084             assertShortcutIds(assertAllPinned(
5085                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
5086                     "s2", "s3");
5087             assertShortcutIds(assertAllPinned(
5088                     mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
5089                     /* empty */);
5090         });
5091     }
5092 
testBackupAndRestore_disabled()5093     public void testBackupAndRestore_disabled() {
5094         prepareCrossProfileDataSet();
5095 
5096         // Before doing backup & restore, disable s1.
5097         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5098             mManager.disableShortcuts(list("s1"));
5099         });
5100 
5101         backupAndRestore();
5102 
5103         // Below is copied from checkBackupAndRestore_success.
5104 
5105         // Make sure non-system user is not restored.
5106         final ShortcutUser userP0 = mService.getUserShortcutsLocked(USER_P0);
5107         assertEquals(0, userP0.getAllPackagesForTest().size());
5108         assertEquals(0, userP0.getAllLaunchersForTest().size());
5109 
5110         // Make sure only "allowBackup" apps are restored, and are shadow.
5111         final ShortcutUser user0 = mService.getUserShortcutsLocked(USER_0);
5112         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_1));
5113         assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_2));
5114         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
5115                 PackageWithUser.of(USER_0, LAUNCHER_1)));
5116         assertExistsAndShadow(user0.getAllLaunchersForTest().get(
5117                 PackageWithUser.of(USER_0, LAUNCHER_2)));
5118 
5119         assertNull(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
5120         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
5121         assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
5122 
5123         installPackage(USER_0, CALLING_PACKAGE_1);
5124         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5125             assertWith(getCallerVisibleShortcuts())
5126                     .areAllEnabled() // disabled shortcuts shouldn't be restored.
5127 
5128                     .selectDynamic()
5129                     .isEmpty()
5130 
5131                     .revertToOriginalList()
5132                     .selectPinned()
5133                     // s1 is not restored.
5134                     .haveIds("s2");
5135         });
5136 
5137         installPackage(USER_0, LAUNCHER_1);
5138         runWithCaller(LAUNCHER_1, USER_0, () -> {
5139             // Note, s1 was pinned by launcher 1, but was disabled, so isn't restored.
5140             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
5141                     .isEmpty();
5142 
5143             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
5144                     .isEmpty();
5145 
5146             assertWith(mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
5147                     .isEmpty();
5148 
5149             assertWith(mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0))
5150                     .isEmpty();
5151         });
5152     }
5153 
5154 
testBackupAndRestore_manifestRePublished()5155     public void testBackupAndRestore_manifestRePublished() {
5156         // Publish two manifest shortcuts.
5157         addManifestShortcutResource(
5158                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5159                 R.xml.shortcut_2);
5160         updatePackageVersion(CALLING_PACKAGE_1, 1);
5161         mService.mPackageMonitor.onReceive(mServiceContext,
5162                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5163 
5164         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5165             assertTrue(mManager.setDynamicShortcuts(list(
5166                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
5167         });
5168 
5169         // Pin from launcher 1.
5170         runWithCaller(LAUNCHER_1, USER_0, () -> {
5171             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
5172                     list("ms1", "ms2", "s1", "s2"), HANDLE_USER_0);
5173         });
5174 
5175         // Update and now ms2 is gone -> disabled.
5176         addManifestShortcutResource(
5177                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5178                 R.xml.shortcut_1);
5179         updatePackageVersion(CALLING_PACKAGE_1, 1);
5180         mService.mPackageMonitor.onReceive(mServiceContext,
5181                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5182 
5183         // Make sure the manifest shortcuts have been published.
5184         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5185             assertWith(getCallerShortcuts())
5186                     .selectManifest()
5187                     .haveIds("ms1")
5188 
5189                     .revertToOriginalList()
5190                     .selectDynamic()
5191                     .haveIds("s1", "s2", "s3")
5192 
5193                     .revertToOriginalList()
5194                     .selectPinned()
5195                     .haveIds("ms1", "ms2", "s1", "s2")
5196 
5197                     .revertToOriginalList()
5198                     .selectByIds("ms1")
5199                     .areAllManifest()
5200                     .areAllEnabled()
5201 
5202                     .revertToOriginalList()
5203                     .selectByIds("ms2")
5204                     .areAllNotManifest()
5205                     .areAllDisabled();
5206         });
5207 
5208         backupAndRestore();
5209 
5210         // When re-installing the app, the manifest shortcut should be re-published.
5211         mService.mPackageMonitor.onReceive(mServiceContext,
5212                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5213         mService.mPackageMonitor.onReceive(mServiceContext,
5214                 genPackageAddIntent(LAUNCHER_1, USER_0));
5215 
5216         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5217             assertWith(getCallerVisibleShortcuts())
5218                     .selectPinned()
5219                     // ms2 was disabled, so not restored.
5220                     .haveIds("ms1", "s1", "s2")
5221                     .areAllEnabled()
5222 
5223                     .revertToOriginalList()
5224                     .selectByIds("ms1")
5225                     .areAllManifest()
5226 
5227                     .revertToOriginalList()
5228                     .selectByIds("s1", "s2")
5229                     .areAllNotDynamic()
5230                     ;
5231         });
5232     }
5233 
5234     /**
5235      * It's the case with preintalled apps -- when applyRestore() is called, the system
5236      * apps are already installed, so manifest shortcuts need to be re-published.
5237      */
testBackupAndRestore_appAlreadyInstalledWhenRestored()5238     public void testBackupAndRestore_appAlreadyInstalledWhenRestored() {
5239         // Pre-backup.  Same as testBackupAndRestore_manifestRePublished().
5240 
5241         // Publish two manifest shortcuts.
5242         addManifestShortcutResource(
5243                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5244                 R.xml.shortcut_2);
5245         updatePackageVersion(CALLING_PACKAGE_1, 1);
5246         mService.mPackageMonitor.onReceive(mServiceContext,
5247                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5248 
5249         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5250             assertTrue(mManager.setDynamicShortcuts(list(
5251                     makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
5252         });
5253 
5254         // Pin from launcher 1.
5255         runWithCaller(LAUNCHER_1, USER_0, () -> {
5256             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
5257                     list("ms1", "ms2", "s1", "s2"), HANDLE_USER_0);
5258         });
5259 
5260         // Update and now ms2 is gone -> disabled.
5261         addManifestShortcutResource(
5262                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5263                 R.xml.shortcut_1);
5264         updatePackageVersion(CALLING_PACKAGE_1, 1);
5265         mService.mPackageMonitor.onReceive(mServiceContext,
5266                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5267 
5268         // Make sure the manifest shortcuts have been published.
5269         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5270             assertWith(getCallerShortcuts())
5271                     .selectManifest()
5272                     .haveIds("ms1")
5273 
5274                     .revertToOriginalList()
5275                     .selectDynamic()
5276                     .haveIds("s1", "s2", "s3")
5277 
5278                     .revertToOriginalList()
5279                     .selectPinned()
5280                     .haveIds("ms1", "ms2", "s1", "s2")
5281 
5282                     .revertToOriginalList()
5283                     .selectByIds("ms1")
5284                     .areAllManifest()
5285                     .areAllEnabled()
5286 
5287                     .revertToOriginalList()
5288                     .selectByIds("ms2")
5289                     .areAllNotManifest()
5290                     .areAllDisabled();
5291         });
5292 
5293         // Backup and *without restarting the service, just call applyRestore()*.
5294         {
5295             int prevUid = mInjectedCallingUid;
5296             mInjectedCallingUid = Process.SYSTEM_UID; // Only system can call it.
5297 
5298             dumpsysOnLogcat("Before backup");
5299 
5300             final byte[] payload = mService.getBackupPayload(USER_0);
5301             if (ENABLE_DUMP) {
5302                 final String xml = new String(payload);
5303                 Log.v(TAG, "Backup payload:");
5304                 for (String line : xml.split("\n")) {
5305                     Log.v(TAG, line);
5306                 }
5307             }
5308             mService.applyRestore(payload, USER_0);
5309 
5310             dumpsysOnLogcat("After restore");
5311 
5312             mInjectedCallingUid = prevUid;
5313         }
5314 
5315         // The check is also the same as testBackupAndRestore_manifestRePublished().
5316         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5317             assertWith(getCallerVisibleShortcuts())
5318                     .selectPinned()
5319                     // ms2 was disabled, so not restored.
5320                     .haveIds("ms1", "s1", "s2")
5321                     .areAllEnabled()
5322 
5323                     .revertToOriginalList()
5324                     .selectByIds("ms1")
5325                     .areAllManifest()
5326 
5327                     .revertToOriginalList()
5328                     .selectByIds("s1", "s2")
5329                     .areAllNotDynamic()
5330             ;
5331         });
5332     }
5333 
testSaveAndLoad_crossProfile()5334     public void testSaveAndLoad_crossProfile() {
5335         prepareCrossProfileDataSet();
5336 
5337         dumpsysOnLogcat("Before save & load");
5338 
5339         mService.saveDirtyInfo();
5340         initService();
5341 
5342         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5343             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
5344                     "s1", "s2", "s3");
5345             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
5346                     "s1", "s2", "s3", "s4");
5347         });
5348         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5349             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
5350                     "s1", "s2", "s3");
5351             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
5352                     "s1", "s2", "s3", "s4", "s5");
5353         });
5354         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5355             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
5356                     "s1", "s2", "s3");
5357             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
5358                     "s1", "s2", "s3", "s4", "s5", "s6");
5359         });
5360         runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
5361             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
5362                     /* empty */);
5363             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
5364                     /* empty */);
5365         });
5366         runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
5367             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
5368                     "s1", "s2", "s3");
5369             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
5370                     "s1", "s2", "s3", "s4", "s5", "s6");
5371         });
5372         runWithCaller(CALLING_PACKAGE_2, USER_P0, () -> {
5373             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
5374                     /* empty */);
5375             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
5376                     /* empty */);
5377         });
5378         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
5379             assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
5380                     "x1", "x2", "x3");
5381             assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
5382                     "x4", "x5");
5383         });
5384         runWithCaller(LAUNCHER_1, USER_0, () -> {
5385             assertShortcutIds(
5386                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
5387                     "s1");
5388             assertShortcutIds(
5389                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
5390                     "s1", "s2");
5391             assertShortcutIds(
5392                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
5393                     "s1", "s2", "s3");
5394             assertShortcutIds(
5395                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
5396                     /* empty */);
5397             assertShortcutIds(
5398                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
5399                     "s1", "s4");
5400             assertShortcutIds(
5401                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
5402                     /* empty */);
5403             assertExpectException(
5404                     SecurityException.class, "", () -> {
5405                         mLauncherApps.getShortcuts(
5406                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
5407                     });
5408         });
5409         runWithCaller(LAUNCHER_2, USER_0, () -> {
5410             assertShortcutIds(
5411                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
5412                     "s2");
5413             assertShortcutIds(
5414                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
5415                     "s2", "s3");
5416             assertShortcutIds(
5417                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
5418                     "s2", "s3", "s4");
5419             assertShortcutIds(
5420                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
5421                     /* empty */);
5422             assertShortcutIds(
5423                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
5424                     "s2", "s5");
5425             assertShortcutIds(
5426                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
5427                     /* empty */);
5428         });
5429         runWithCaller(LAUNCHER_3, USER_0, () -> {
5430             assertShortcutIds(
5431                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
5432                     "s3");
5433             assertShortcutIds(
5434                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
5435                     "s3", "s4");
5436             assertShortcutIds(
5437                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
5438                     "s3", "s4", "s5");
5439             assertShortcutIds(
5440                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
5441                     /* empty */);
5442             assertShortcutIds(
5443                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
5444                     "s3", "s6");
5445             assertShortcutIds(
5446                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
5447                     /* empty */);
5448         });
5449         runWithCaller(LAUNCHER_4, USER_0, () -> {
5450             assertShortcutIds(
5451                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0)
5452                     /* empty */);
5453             assertShortcutIds(
5454                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0)
5455                     /* empty */);
5456             assertShortcutIds(
5457                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0)
5458                     /* empty */);
5459             assertShortcutIds(
5460                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
5461                     /* empty */);
5462             assertShortcutIds(
5463                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0)
5464                     /* empty */);
5465             assertShortcutIds(
5466                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
5467                     /* empty */);
5468         });
5469         runWithCaller(LAUNCHER_1, USER_P0, () -> {
5470             assertShortcutIds(
5471                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
5472                     "s3", "s4");
5473             assertShortcutIds(
5474                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
5475                     "s3", "s4", "s5");
5476             assertShortcutIds(
5477                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
5478                     "s3", "s4", "s5", "s6");
5479             assertShortcutIds(
5480                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
5481                     "s1", "s4");
5482             assertExpectException(
5483                     SecurityException.class, "unrelated profile", () -> {
5484                         mLauncherApps.getShortcuts(
5485                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
5486                     });
5487         });
5488         runWithCaller(LAUNCHER_1, USER_10, () -> {
5489             assertShortcutIds(
5490                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_10),
5491                     "x4", "x5");
5492             assertShortcutIds(
5493                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_10)
5494                     /* empty */);
5495             assertShortcutIds(
5496                     mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_10)
5497                     /* empty */);
5498             assertExpectException(
5499                     SecurityException.class, "unrelated profile", () -> {
5500                         mLauncherApps.getShortcuts(
5501                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0);
5502                     });
5503             assertExpectException(
5504                     SecurityException.class, "unrelated profile", () -> {
5505                         mLauncherApps.getShortcuts(
5506                                 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_P0);
5507                     });
5508         });
5509     }
5510 
testOnApplicationActive_permission()5511     public void testOnApplicationActive_permission() {
5512         assertExpectException(SecurityException.class, "Missing permission", () ->
5513                 mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0));
5514 
5515         // Has permission, now it should pass.
5516         mCallerPermissions.add(permission.RESET_SHORTCUT_MANAGER_THROTTLING);
5517         mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0);
5518     }
5519 
testDumpsys_crossProfile()5520     public void testDumpsys_crossProfile() {
5521         prepareCrossProfileDataSet();
5522         dumpsysOnLogcat("test1", /* force= */ true);
5523     }
5524 
testDumpsys_withIcons()5525     public void testDumpsys_withIcons() throws IOException {
5526         testIcons();
5527         // Dump after having some icons.
5528         dumpsysOnLogcat("test1", /* force= */ true);
5529     }
5530 
testManifestShortcut_publishOnUnlockUser()5531     public void testManifestShortcut_publishOnUnlockUser() {
5532         addManifestShortcutResource(
5533                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5534                 R.xml.shortcut_1);
5535         addManifestShortcutResource(
5536                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
5537                 R.xml.shortcut_2);
5538         addManifestShortcutResource(
5539                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
5540                 R.xml.shortcut_5);
5541 
5542         // Unlock user-0.
5543         mService.handleUnlockUser(USER_0);
5544 
5545         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5546             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5547                     mManager.getManifestShortcuts()))),
5548                     "ms1");
5549             assertEmpty(mManager.getPinnedShortcuts());
5550         });
5551 
5552         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5553             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5554                     mManager.getManifestShortcuts()))),
5555                     "ms1", "ms2");
5556             assertEmpty(mManager.getPinnedShortcuts());
5557         });
5558 
5559         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5560             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5561                     mManager.getManifestShortcuts()))),
5562                     "ms1", "ms2", "ms3", "ms4", "ms5");
5563             assertEmpty(mManager.getPinnedShortcuts());
5564         });
5565 
5566         // Try on another user, with some packages uninstalled.
5567         mRunningUsers.put(USER_10, true);
5568 
5569         uninstallPackage(USER_10, CALLING_PACKAGE_1);
5570         uninstallPackage(USER_10, CALLING_PACKAGE_3);
5571 
5572         mService.handleUnlockUser(USER_10);
5573 
5574         runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
5575             assertEmpty(mManager.getManifestShortcuts());
5576             assertEmpty(mManager.getPinnedShortcuts());
5577         });
5578 
5579         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
5580             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5581                     mManager.getManifestShortcuts()))),
5582                     "ms1", "ms2");
5583             assertEmpty(mManager.getPinnedShortcuts());
5584         });
5585 
5586         runWithCaller(CALLING_PACKAGE_3, USER_10, () -> {
5587             assertEmpty(mManager.getManifestShortcuts());
5588             assertEmpty(mManager.getPinnedShortcuts());
5589         });
5590 
5591         // Now change the resources for package 1, and unlock again.
5592         // But we still see *old* shortcuts, because the package version and install time
5593         // hasn't changed.
5594         shutdownServices();
5595 
5596         addManifestShortcutResource(
5597                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5598                 R.xml.shortcut_5);
5599         addManifestShortcutResource(
5600                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
5601                 R.xml.shortcut_1);
5602 
5603         initService();
5604         mService.handleUnlockUser(USER_0);
5605 
5606         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5607             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5608                     mManager.getManifestShortcuts()))),
5609                     "ms1");
5610             assertEmpty(mManager.getPinnedShortcuts());
5611         });
5612 
5613         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5614             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5615                     mManager.getManifestShortcuts()))),
5616                     "ms1", "ms2");
5617             assertEmpty(mManager.getPinnedShortcuts());
5618         });
5619 
5620         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5621             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5622                     mManager.getManifestShortcuts()))),
5623                     "ms1", "ms2", "ms3", "ms4", "ms5");
5624             assertEmpty(mManager.getPinnedShortcuts());
5625         });
5626 
5627         // Do it again, but this time we change the app version, so we do detect the changes.
5628         shutdownServices();
5629 
5630         updatePackageVersion(CALLING_PACKAGE_1, 1);
5631         updatePackageLastUpdateTime(CALLING_PACKAGE_3, 1);
5632 
5633         initService();
5634         mService.handleUnlockUser(USER_0);
5635 
5636         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5637             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5638                     mManager.getManifestShortcuts()))),
5639                     "ms1", "ms2", "ms3", "ms4", "ms5");
5640             assertEmpty(mManager.getPinnedShortcuts());
5641         });
5642 
5643         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5644             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5645                     mManager.getManifestShortcuts()))),
5646                     "ms1", "ms2");
5647             assertEmpty(mManager.getPinnedShortcuts());
5648         });
5649 
5650         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5651             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5652                     mManager.getManifestShortcuts()))),
5653                     "ms1");
5654             assertEmpty(mManager.getPinnedShortcuts());
5655         });
5656 
5657         // Next, try removing all shortcuts, with some of them pinned.
5658         runWithCaller(LAUNCHER_1, USER_0, () -> {
5659             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms3"), HANDLE_USER_0);
5660             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("ms2"), HANDLE_USER_0);
5661             mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("ms1"), HANDLE_USER_0);
5662         });
5663         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5664             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5665                     mManager.getManifestShortcuts()))),
5666                     "ms1", "ms2", "ms3", "ms4", "ms5");
5667             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllManifest(
5668                     assertAllEnabled(mManager.getPinnedShortcuts())))),
5669                     "ms3");
5670         });
5671 
5672         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5673             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5674                     mManager.getManifestShortcuts()))),
5675                     "ms1", "ms2");
5676             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllManifest(
5677                     assertAllEnabled(mManager.getPinnedShortcuts())))),
5678                     "ms2");
5679         });
5680 
5681         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5682             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5683                     mManager.getManifestShortcuts()))),
5684                     "ms1");
5685             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllManifest(
5686                     assertAllEnabled(mManager.getPinnedShortcuts())))),
5687                     "ms1");
5688         });
5689 
5690         shutdownServices();
5691 
5692         addManifestShortcutResource(
5693                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5694                 R.xml.shortcut_0);
5695         addManifestShortcutResource(
5696                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
5697                 R.xml.shortcut_1);
5698         addManifestShortcutResource(
5699                 new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()),
5700                 R.xml.shortcut_0);
5701 
5702         updatePackageVersion(CALLING_PACKAGE_1, 1);
5703         updatePackageVersion(CALLING_PACKAGE_2, 1);
5704         updatePackageVersion(CALLING_PACKAGE_3, 1);
5705 
5706         initService();
5707         mService.handleUnlockUser(USER_0);
5708 
5709         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5710             assertEmpty(mManager.getManifestShortcuts());
5711             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllNotManifest(
5712                     assertAllDisabled(mManager.getPinnedShortcuts())))),
5713                     "ms3");
5714         });
5715 
5716         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5717             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5718                     mManager.getManifestShortcuts()))),
5719                     "ms1");
5720             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllNotManifest(
5721                     assertAllDisabled(mManager.getPinnedShortcuts())))),
5722                     "ms2");
5723         });
5724 
5725         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5726             assertEmpty(mManager.getManifestShortcuts());
5727             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllNotManifest(
5728                     assertAllDisabled(mManager.getPinnedShortcuts())))),
5729                     "ms1");
5730         });
5731 
5732         // Make sure we don't have ShortcutPackage for packages that don't have shortcuts.
5733         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_4, USER_0));
5734         assertNull(mService.getPackageShortcutForTest(LAUNCHER_1, USER_0));
5735     }
5736 
testManifestShortcut_publishOnBroadcast()5737     public void testManifestShortcut_publishOnBroadcast() {
5738         // First, no packages are installed.
5739         uninstallPackage(USER_0, CALLING_PACKAGE_1);
5740         uninstallPackage(USER_0, CALLING_PACKAGE_2);
5741         uninstallPackage(USER_0, CALLING_PACKAGE_3);
5742         uninstallPackage(USER_0, CALLING_PACKAGE_4);
5743         uninstallPackage(USER_10, CALLING_PACKAGE_1);
5744         uninstallPackage(USER_10, CALLING_PACKAGE_2);
5745         uninstallPackage(USER_10, CALLING_PACKAGE_3);
5746         uninstallPackage(USER_10, CALLING_PACKAGE_4);
5747 
5748         mService.handleUnlockUser(USER_0);
5749 
5750         mRunningUsers.put(USER_10, true);
5751         mService.handleUnlockUser(USER_10);
5752 
5753         // Originally no manifest shortcuts.
5754         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5755             assertEmpty(mManager.getManifestShortcuts());
5756             assertEmpty(mManager.getPinnedShortcuts());
5757         });
5758 
5759         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5760             assertEmpty(mManager.getManifestShortcuts());
5761             assertEmpty(mManager.getPinnedShortcuts());
5762         });
5763 
5764         runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
5765             assertEmpty(mManager.getManifestShortcuts());
5766             assertEmpty(mManager.getPinnedShortcuts());
5767         });
5768 
5769         // Package 1 updated, with manifest shortcuts.
5770         addManifestShortcutResource(
5771                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5772                 R.xml.shortcut_1);
5773         updatePackageVersion(CALLING_PACKAGE_1, 1);
5774                 mService.mPackageMonitor.onReceive(getTestContext(),
5775                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5776 
5777         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5778             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5779                     mManager.getManifestShortcuts()))),
5780                     "ms1");
5781             assertEmpty(mManager.getPinnedShortcuts());
5782         });
5783 
5784         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5785             assertEmpty(mManager.getManifestShortcuts());
5786             assertEmpty(mManager.getPinnedShortcuts());
5787         });
5788 
5789         // Package 2 updated, with manifest shortcuts.
5790 
5791         addManifestShortcutResource(
5792                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
5793                 R.xml.shortcut_5);
5794         updatePackageVersion(CALLING_PACKAGE_2, 1);
5795                 mService.mPackageMonitor.onReceive(getTestContext(),
5796                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
5797 
5798         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5799             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5800                     mManager.getManifestShortcuts()))),
5801                     "ms1");
5802             assertEmpty(mManager.getPinnedShortcuts());
5803         });
5804 
5805         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5806             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5807                     mManager.getManifestShortcuts()))),
5808                     "ms1", "ms2", "ms3", "ms4", "ms5");
5809             assertWith(getCallerShortcuts()).selectManifest()
5810                     .selectByActivity(
5811                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
5812                     .haveRanksInOrder("ms1", "ms2", "ms3", "ms4", "ms5");
5813             assertEmpty(mManager.getPinnedShortcuts());
5814         });
5815 
5816         // Package 2 updated, with less manifest shortcuts.
5817         // This time we use updatePackageLastUpdateTime() instead of updatePackageVersion().
5818 
5819         dumpsysOnLogcat("Before pinning");
5820 
5821         // Also pin some.
5822         runWithCaller(LAUNCHER_1, USER_0, () -> {
5823             mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("ms2", "ms3"), HANDLE_USER_0);
5824         });
5825 
5826         dumpsysOnLogcat("After pinning");
5827 
5828         addManifestShortcutResource(
5829                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
5830                 R.xml.shortcut_2);
5831         updatePackageLastUpdateTime(CALLING_PACKAGE_2, 1);
5832                 mService.mPackageMonitor.onReceive(getTestContext(),
5833                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
5834 
5835         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5836             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5837                     mManager.getManifestShortcuts()))),
5838                     "ms1");
5839             assertEmpty(mManager.getPinnedShortcuts());
5840         });
5841 
5842         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5843             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5844                     mManager.getManifestShortcuts()))),
5845                     "ms1", "ms2");
5846             assertWith(getCallerShortcuts()).selectManifest()
5847                     .selectByActivity(
5848                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
5849                     .haveRanksInOrder("ms1", "ms2");
5850             assertShortcutIds(assertAllImmutable(assertAllPinned(
5851                     mManager.getPinnedShortcuts())),
5852                     "ms2", "ms3");
5853             // ms3 is no longer in manifest, so should be disabled.
5854             // but ms1 and ms2 should be enabled.
5855             assertAllEnabled(list(getCallerShortcut("ms1")));
5856             assertAllEnabled(list(getCallerShortcut("ms2")));
5857             assertAllDisabled(list(getCallerShortcut("ms3")));
5858         });
5859 
5860         // Package 2 on user 10 has no shortcuts yet.
5861         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
5862             assertEmpty(mManager.getManifestShortcuts());
5863             assertEmpty(mManager.getPinnedShortcuts());
5864         });
5865         // Send add broadcast, but the user is not running, so should be ignored.
5866         mService.handleCleanupUser(USER_10);
5867         mRunningUsers.put(USER_10, false);
5868         mUnlockedUsers.put(USER_10, false);
5869 
5870         mService.mPackageMonitor.onReceive(getTestContext(),
5871                 genPackageAddIntent(CALLING_PACKAGE_2, USER_10));
5872         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
5873             // Don't use the mManager APIs to get shortcuts, because they'll trigger the package
5874             // update check.
5875             // So look the internal data directly using getCallerShortcuts().
5876             assertEmpty(getCallerShortcuts());
5877         });
5878 
5879         // Try again, but the user is locked, so still ignored.
5880         mRunningUsers.put(USER_10, true);
5881                 mService.mPackageMonitor.onReceive(getTestContext(),
5882                 genPackageAddIntent(CALLING_PACKAGE_2, USER_10));
5883         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
5884             // Don't use the mManager APIs to get shortcuts, because they'll trigger the package
5885             // update check.
5886             // So look the internal data directly using getCallerShortcuts().
5887             assertEmpty(getCallerShortcuts());
5888         });
5889 
5890         // Unlock the user, now it should work.
5891         mUnlockedUsers.put(USER_10, true);
5892 
5893         // Send PACKAGE_ADD broadcast to have Package 2 on user-10 publish manifest shortcuts.
5894                 mService.mPackageMonitor.onReceive(getTestContext(),
5895                 genPackageAddIntent(CALLING_PACKAGE_2, USER_10));
5896 
5897         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
5898             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5899                     mManager.getManifestShortcuts()))),
5900                     "ms1", "ms2");
5901             assertWith(getCallerShortcuts()).selectManifest()
5902                     .selectByActivity(
5903                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
5904                     .haveRanksInOrder("ms1", "ms2");
5905             assertEmpty(mManager.getPinnedShortcuts());
5906         });
5907 
5908         // But it shouldn't affect user-0.
5909         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5910             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5911                     mManager.getManifestShortcuts()))),
5912                     "ms1", "ms2");
5913             assertWith(getCallerShortcuts()).selectManifest()
5914                     .selectByActivity(
5915                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
5916                     .haveRanksInOrder("ms1", "ms2");
5917             assertShortcutIds(assertAllImmutable(assertAllPinned(
5918                     mManager.getPinnedShortcuts())),
5919                     "ms2", "ms3");
5920             assertAllEnabled(list(getCallerShortcut("ms1")));
5921             assertAllEnabled(list(getCallerShortcut("ms2")));
5922             assertAllDisabled(list(getCallerShortcut("ms3")));
5923         });
5924 
5925         // Multiple activities.
5926         // Add shortcuts on activity 2 for package 2.
5927         addManifestShortcutResource(
5928                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
5929                 R.xml.shortcut_5_alt);
5930         addManifestShortcutResource(
5931                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity2.class.getName()),
5932                 R.xml.shortcut_5_reverse);
5933 
5934         updatePackageLastUpdateTime(CALLING_PACKAGE_2, 1);
5935                 mService.mPackageMonitor.onReceive(getTestContext(),
5936                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
5937 
5938         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5939             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
5940                     mManager.getManifestShortcuts()))),
5941                     "ms1", "ms2", "ms3", "ms4", "ms5",
5942                     "ms1_alt", "ms2_alt", "ms3_alt", "ms4_alt", "ms5_alt");
5943 
5944             // Make sure they have the correct ranks, regardless of their ID's alphabetical order.
5945             assertWith(getCallerShortcuts()).selectManifest()
5946                     .selectByActivity(
5947                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()))
5948                     .haveRanksInOrder("ms1_alt", "ms2_alt", "ms3_alt", "ms4_alt", "ms5_alt");
5949             assertWith(getCallerShortcuts()).selectManifest()
5950                     .selectByActivity(
5951                             new ComponentName(CALLING_PACKAGE_2, ShortcutActivity2.class.getName()))
5952                     .haveRanksInOrder("ms5", "ms4", "ms3", "ms2", "ms1");
5953         });
5954 
5955         // Package 2 now has no manifest shortcuts.
5956         addManifestShortcutResource(
5957                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
5958                 R.xml.shortcut_0);
5959         addManifestShortcutResource(
5960                 new ComponentName(CALLING_PACKAGE_2, ShortcutActivity2.class.getName()),
5961                 R.xml.shortcut_0);
5962         updatePackageLastUpdateTime(CALLING_PACKAGE_2, 1);
5963                 mService.mPackageMonitor.onReceive(getTestContext(),
5964                 genPackageAddIntent(CALLING_PACKAGE_2, USER_0));
5965 
5966         // No manifest shortcuts, and pinned ones are disabled.
5967         runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
5968             assertEmpty(mManager.getManifestShortcuts());
5969             assertShortcutIds(assertAllImmutable(assertAllPinned(assertAllDisabled(
5970                     mManager.getPinnedShortcuts()))),
5971                     "ms2", "ms3");
5972         });
5973     }
5974 
testManifestShortcuts_missingMandatoryFields()5975     public void testManifestShortcuts_missingMandatoryFields() {
5976         // Start with no apps installed.
5977         uninstallPackage(USER_0, CALLING_PACKAGE_1);
5978         uninstallPackage(USER_0, CALLING_PACKAGE_2);
5979         uninstallPackage(USER_0, CALLING_PACKAGE_3);
5980         uninstallPackage(USER_0, CALLING_PACKAGE_4);
5981 
5982         mService.handleUnlockUser(USER_0);
5983 
5984         // Make sure no manifest shortcuts.
5985         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5986             assertEmpty(mManager.getManifestShortcuts());
5987         });
5988 
5989         // Package 1 updated, which has one valid manifest shortcut and one invalid.
5990         addManifestShortcutResource(
5991                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
5992                 R.xml.shortcut_error_1);
5993         updatePackageVersion(CALLING_PACKAGE_1, 1);
5994                 mService.mPackageMonitor.onReceive(getTestContext(),
5995                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
5996 
5997         // Only the valid one is published.
5998         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
5999             assertWith(getCallerShortcuts())
6000                     .areAllManifest()
6001                     .areAllImmutable()
6002                     .areAllEnabled()
6003                     .haveIds("x1");
6004         });
6005 
6006         // Package 1 updated, which has one valid manifest shortcut and one invalid.
6007         addManifestShortcutResource(
6008                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6009                 R.xml.shortcut_error_2);
6010         updatePackageVersion(CALLING_PACKAGE_1, 1);
6011                 mService.mPackageMonitor.onReceive(getTestContext(),
6012                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6013 
6014         // Only the valid one is published.
6015         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6016             assertWith(getCallerShortcuts())
6017                     .areAllManifest()
6018                     .areAllImmutable()
6019                     .areAllEnabled()
6020                     .haveIds("x2");
6021         });
6022 
6023         // Package 1 updated, which has one valid manifest shortcut and one invalid.
6024         addManifestShortcutResource(
6025                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6026                 R.xml.shortcut_error_3);
6027         updatePackageVersion(CALLING_PACKAGE_1, 1);
6028                 mService.mPackageMonitor.onReceive(getTestContext(),
6029                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6030 
6031         // Only the valid one is published.
6032         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6033             assertWith(getCallerShortcuts())
6034                     .areAllManifest()
6035                     .areAllImmutable()
6036                     .areAllEnabled()
6037                     .haveIds("x3")
6038                     .forShortcutWithId("x3", si -> {
6039                         assertEquals(set("cat2"), si.getCategories());
6040                      });
6041         });
6042     }
6043 
testManifestShortcuts_intentDefinitions()6044     public void testManifestShortcuts_intentDefinitions() {
6045         addManifestShortcutResource(
6046                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6047                 R.xml.shortcut_error_4);
6048         updatePackageVersion(CALLING_PACKAGE_1, 1);
6049                 mService.mPackageMonitor.onReceive(getTestContext(),
6050                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6051 
6052         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6053             // Make sure invalid ones are not published.
6054             // Note that at this point disabled ones don't show up because they weren't pinned.
6055             assertWith(getCallerShortcuts())
6056                     .haveIds("ms1", "ms2")
6057                     .areAllManifest()
6058                     .areAllNotDynamic()
6059                     .areAllNotPinned()
6060                     .areAllImmutable()
6061                     .areAllEnabled()
6062                     .forShortcutWithId("ms1", si -> {
6063                         assertTrue(si.isEnabled());
6064                         assertEquals(1, si.getIntents().length);
6065 
6066                         assertEquals("action1", si.getIntent().getAction());
6067                         assertEquals("value1", si.getIntent().getStringExtra("key1"));
6068                         assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK |
6069                                 Intent.FLAG_ACTIVITY_CLEAR_TASK |
6070                                 Intent.FLAG_ACTIVITY_TASK_ON_HOME, si.getIntent().getFlags());
6071 
6072                         assertEquals("action1", si.getIntents()[0].getAction());
6073                         assertEquals("value1", si.getIntents()[0].getStringExtra("key1"));
6074                         assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK |
6075                                 Intent.FLAG_ACTIVITY_CLEAR_TASK |
6076                                 Intent.FLAG_ACTIVITY_TASK_ON_HOME, si.getIntents()[0].getFlags());
6077                     })
6078                     .forShortcutWithId("ms2", si -> {
6079                         assertTrue(si.isEnabled());
6080                         assertEquals(2, si.getIntents().length);
6081 
6082                         // getIntent will return the last one.
6083                         assertEquals("action2_2", si.getIntent().getAction());
6084                         assertEquals("value2", si.getIntent().getStringExtra("key2"));
6085                         assertEquals(0, si.getIntent().getFlags());
6086 
6087                         final Intent i1 = si.getIntents()[0];
6088                         final Intent i2 = si.getIntents()[1];
6089 
6090                         assertEquals("action2_1", i1.getAction());
6091                         assertEquals("value1", i1.getStringExtra("key1"));
6092                         assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK |
6093                                         Intent.FLAG_ACTIVITY_CLEAR_TASK |
6094                                         Intent.FLAG_ACTIVITY_TASK_ON_HOME, i1.getFlags());
6095 
6096                         assertEquals("action2_2", i2.getAction());
6097                         assertEquals("value2", i2.getStringExtra("key2"));
6098                         assertEquals(0, i2.getFlags());
6099                     });
6100         });
6101 
6102         // Publish 5 enabled to pin some, so we can later test disabled manfiest shortcuts..
6103         addManifestShortcutResource(
6104                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6105                 R.xml.shortcut_5);
6106         updatePackageVersion(CALLING_PACKAGE_1, 1);
6107                 mService.mPackageMonitor.onReceive(getTestContext(),
6108                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6109 
6110         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6111             // Make sure 5 manifest shortcuts are published.
6112             assertWith(getCallerShortcuts())
6113                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
6114                     .areAllManifest()
6115                     .areAllNotDynamic()
6116                     .areAllNotPinned()
6117                     .areAllImmutable()
6118                     .areAllEnabled();
6119         });
6120 
6121         runWithCaller(LAUNCHER_1, USER_0, () -> {
6122             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
6123                     list("ms3", "ms4", "ms5"), HANDLE_USER_0);
6124         });
6125 
6126         // Make sure they're pinned.
6127         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6128             assertWith(getCallerShortcuts())
6129                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
6130                     .selectByIds("ms1", "ms2")
6131                     .areAllNotPinned()
6132                     .areAllEnabled()
6133 
6134                     .revertToOriginalList()
6135                     .selectByIds("ms3", "ms4", "ms5")
6136                     .areAllPinned()
6137                     .areAllEnabled();
6138         });
6139 
6140         // Update the app.
6141         addManifestShortcutResource(
6142                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6143                 R.xml.shortcut_error_4);
6144         updatePackageVersion(CALLING_PACKAGE_1, 1);
6145                 mService.mPackageMonitor.onReceive(getTestContext(),
6146                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6147 
6148         // Make sure 3, 4 and 5 still exist but disabled.
6149         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6150             assertWith(getCallerShortcuts())
6151                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
6152                     .areAllNotDynamic()
6153                     .areAllImmutable()
6154 
6155                     .selectByIds("ms1", "ms2")
6156                     .areAllManifest()
6157                     .areAllNotPinned()
6158                     .areAllEnabled()
6159 
6160                     .revertToOriginalList()
6161                     .selectByIds("ms3", "ms4", "ms5")
6162                     .areAllNotManifest()
6163                     .areAllPinned()
6164                     .areAllDisabled()
6165 
6166                     .revertToOriginalList()
6167                     .forShortcutWithId("ms1", si -> {
6168                         assertEquals(si.getId(), "action1", si.getIntent().getAction());
6169                     })
6170                     .forShortcutWithId("ms2", si -> {
6171                         // getIntent returns the last one.
6172                         assertEquals(si.getId(), "action2_2", si.getIntent().getAction());
6173                     })
6174                     .forShortcutWithId("ms3", si -> {
6175                         assertEquals(si.getId(), Intent.ACTION_VIEW, si.getIntent().getAction());
6176                     })
6177                     .forShortcutWithId("ms4", si -> {
6178                         assertEquals(si.getId(), Intent.ACTION_VIEW, si.getIntent().getAction());
6179                     })
6180                     .forShortcutWithId("ms5", si -> {
6181                         assertEquals(si.getId(), "action", si.getIntent().getAction());
6182                     });
6183         });
6184     }
6185 
testManifestShortcuts_checkAllFields()6186     public void testManifestShortcuts_checkAllFields() {
6187         mService.handleUnlockUser(USER_0);
6188 
6189         // Package 1 updated, which has one valid manifest shortcut and one invalid.
6190         addManifestShortcutResource(
6191                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6192                 R.xml.shortcut_5);
6193         updatePackageVersion(CALLING_PACKAGE_1, 1);
6194                 mService.mPackageMonitor.onReceive(getTestContext(),
6195                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6196 
6197         // Only the valid one is published.
6198         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6199             assertWith(getCallerShortcuts())
6200                     .haveIds("ms1", "ms2", "ms3", "ms4", "ms5")
6201                     .areAllManifest()
6202                     .areAllImmutable()
6203                     .areAllEnabled()
6204                     .areAllNotPinned()
6205                     .areAllNotDynamic()
6206 
6207                     .forShortcutWithId("ms1", si -> {
6208                         assertEquals(R.drawable.icon1, si.getIconResourceId());
6209                         assertEquals(new ComponentName(CALLING_PACKAGE_1,
6210                                 ShortcutActivity.class.getName()),
6211                                 si.getActivity());
6212 
6213                         assertEquals(R.string.shortcut_title1, si.getTitleResId());
6214                         assertEquals("r" + R.string.shortcut_title1, si.getTitleResName());
6215                         assertEquals(R.string.shortcut_text1, si.getTextResId());
6216                         assertEquals("r" + R.string.shortcut_text1, si.getTextResName());
6217                         assertEquals(R.string.shortcut_disabled_message1,
6218                                 si.getDisabledMessageResourceId());
6219                         assertEquals("r" + R.string.shortcut_disabled_message1,
6220                                 si.getDisabledMessageResName());
6221 
6222                         assertEquals(set("android.shortcut.conversation", "android.shortcut.media"),
6223                                 si.getCategories());
6224                         assertEquals("action1", si.getIntent().getAction());
6225                         assertEquals(Uri.parse("http://a.b.c/1"), si.getIntent().getData());
6226                     })
6227 
6228                     .forShortcutWithId("ms2", si -> {
6229                         assertEquals("ms2", si.getId());
6230                         assertEquals(R.drawable.icon2, si.getIconResourceId());
6231 
6232                         assertEquals(R.string.shortcut_title2, si.getTitleResId());
6233                         assertEquals("r" + R.string.shortcut_title2, si.getTitleResName());
6234                         assertEquals(R.string.shortcut_text2, si.getTextResId());
6235                         assertEquals("r" + R.string.shortcut_text2, si.getTextResName());
6236                         assertEquals(R.string.shortcut_disabled_message2,
6237                                 si.getDisabledMessageResourceId());
6238                         assertEquals("r" + R.string.shortcut_disabled_message2,
6239                                 si.getDisabledMessageResName());
6240 
6241                         assertEquals(set("android.shortcut.conversation"), si.getCategories());
6242                         assertEquals("action2", si.getIntent().getAction());
6243                         assertEquals(null, si.getIntent().getData());
6244                     })
6245 
6246                     .forShortcutWithId("ms3", si -> {
6247                         assertEquals(0, si.getIconResourceId());
6248                         assertEquals(R.string.shortcut_title1, si.getTitleResId());
6249                         assertEquals("r" + R.string.shortcut_title1, si.getTitleResName());
6250 
6251                         assertEquals(0, si.getTextResId());
6252                         assertEquals(null, si.getTextResName());
6253                         assertEquals(0, si.getDisabledMessageResourceId());
6254                         assertEquals(null, si.getDisabledMessageResName());
6255 
6256                         assertEmpty(si.getCategories());
6257                         assertEquals("android.intent.action.VIEW", si.getIntent().getAction());
6258                         assertEquals(null, si.getIntent().getData());
6259                     })
6260 
6261                     .forShortcutWithId("ms4", si -> {
6262                         assertEquals(0, si.getIconResourceId());
6263                         assertEquals(R.string.shortcut_title2, si.getTitleResId());
6264                         assertEquals("r" + R.string.shortcut_title2, si.getTitleResName());
6265 
6266                         assertEquals(0, si.getTextResId());
6267                         assertEquals(null, si.getTextResName());
6268                         assertEquals(0, si.getDisabledMessageResourceId());
6269                         assertEquals(null, si.getDisabledMessageResName());
6270 
6271                         assertEquals(set("cat"), si.getCategories());
6272                         assertEquals("android.intent.action.VIEW2", si.getIntent().getAction());
6273                         assertEquals(null, si.getIntent().getData());
6274                     })
6275 
6276                     .forShortcutWithId("ms5", si -> {
6277                         si = getCallerShortcut("ms5");
6278                         assertEquals("action", si.getIntent().getAction());
6279                         assertEquals("http://www/", si.getIntent().getData().toString());
6280                         assertEquals("foo/bar", si.getIntent().getType());
6281                         assertEquals(
6282                                 new ComponentName("abc", ".xyz"), si.getIntent().getComponent());
6283 
6284                         assertEquals(set("cat1", "cat2"), si.getIntent().getCategories());
6285                         assertEquals("value1", si.getIntent().getStringExtra("key1"));
6286                         assertEquals("value2", si.getIntent().getStringExtra("key2"));
6287                     });
6288         });
6289     }
6290 
testManifestShortcuts_localeChange()6291     public void testManifestShortcuts_localeChange() throws InterruptedException {
6292         mService.handleUnlockUser(USER_0);
6293 
6294         // Package 1 updated, which has one valid manifest shortcut and one invalid.
6295         addManifestShortcutResource(
6296                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6297                 R.xml.shortcut_2);
6298         updatePackageVersion(CALLING_PACKAGE_1, 1);
6299                 mService.mPackageMonitor.onReceive(getTestContext(),
6300                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6301 
6302         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6303             mManager.setDynamicShortcuts(list(makeShortcutWithTitle("s1", "title")));
6304 
6305             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
6306                     mManager.getManifestShortcuts()))),
6307                     "ms1", "ms2");
6308 
6309             // check first shortcut.
6310             ShortcutInfo si = getCallerShortcut("ms1");
6311 
6312             assertEquals("ms1", si.getId());
6313             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title1 + "/en",
6314                     si.getTitle());
6315             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text1 + "/en",
6316                     si.getText());
6317             assertEquals("string-com.android.test.1-user:0-res:"
6318                             + R.string.shortcut_disabled_message1 + "/en",
6319                     si.getDisabledMessage());
6320             assertEquals(START_TIME, si.getLastChangedTimestamp());
6321 
6322             // check another
6323             si = getCallerShortcut("ms2");
6324 
6325             assertEquals("ms2", si.getId());
6326             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title2 + "/en",
6327                     si.getTitle());
6328             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text2 + "/en",
6329                     si.getText());
6330             assertEquals("string-com.android.test.1-user:0-res:"
6331                             + R.string.shortcut_disabled_message2 + "/en",
6332                     si.getDisabledMessage());
6333             assertEquals(START_TIME, si.getLastChangedTimestamp());
6334 
6335             // Check the dynamic one.
6336             si = getCallerShortcut("s1");
6337 
6338             assertEquals("s1", si.getId());
6339             assertEquals("title", si.getTitle());
6340             assertEquals(null, si.getText());
6341             assertEquals(null, si.getDisabledMessage());
6342             assertEquals(START_TIME, si.getLastChangedTimestamp());
6343         });
6344 
6345         mInjectedCurrentTimeMillis++;
6346 
6347         // Change the locale and send the broadcast, make sure the launcher gets a callback too.
6348         mInjectedLocale = Locale.JAPANESE;
6349 
6350         setCaller(LAUNCHER_1, USER_0);
6351 
6352         assertForLauncherCallback(mLauncherApps, () -> {
6353             mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
6354         }).assertCallbackCalledForPackageAndUser(CALLING_PACKAGE_1, HANDLE_USER_0)
6355                 .haveIds("ms1", "ms2", "s1");
6356 
6357         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6358             // check first shortcut.
6359             ShortcutInfo si = getCallerShortcut("ms1");
6360 
6361             assertEquals("ms1", si.getId());
6362             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title1 + "/ja",
6363                     si.getTitle());
6364             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text1 + "/ja",
6365                     si.getText());
6366             assertEquals("string-com.android.test.1-user:0-res:"
6367                             + R.string.shortcut_disabled_message1 + "/ja",
6368                     si.getDisabledMessage());
6369             assertEquals(START_TIME + 1, si.getLastChangedTimestamp());
6370 
6371             // check another
6372             si = getCallerShortcut("ms2");
6373 
6374             assertEquals("ms2", si.getId());
6375             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_title2 + "/ja",
6376                     si.getTitle());
6377             assertEquals("string-com.android.test.1-user:0-res:" + R.string.shortcut_text2 + "/ja",
6378                     si.getText());
6379             assertEquals("string-com.android.test.1-user:0-res:"
6380                             + R.string.shortcut_disabled_message2 + "/ja",
6381                     si.getDisabledMessage());
6382             assertEquals(START_TIME + 1, si.getLastChangedTimestamp());
6383 
6384             // Check the dynamic one.  (locale change shouldn't affect.)
6385             si = getCallerShortcut("s1");
6386 
6387             assertEquals("s1", si.getId());
6388             assertEquals("title", si.getTitle());
6389             assertEquals(null, si.getText());
6390             assertEquals(null, si.getDisabledMessage());
6391             assertEquals(START_TIME, si.getLastChangedTimestamp()); // Not changed.
6392         });
6393     }
6394 
testManifestShortcuts_updateAndDisabled_notPinned()6395     public void testManifestShortcuts_updateAndDisabled_notPinned() {
6396         mService.handleUnlockUser(USER_0);
6397 
6398         // First, just publish a manifest shortcut.
6399         addManifestShortcutResource(
6400                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6401                 R.xml.shortcut_1);
6402         updatePackageVersion(CALLING_PACKAGE_1, 1);
6403                 mService.mPackageMonitor.onReceive(getTestContext(),
6404                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6405 
6406         // Only the valid one is published.
6407         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6408             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
6409                     mManager.getManifestShortcuts()))),
6410                     "ms1");
6411             assertEmpty(mManager.getPinnedShortcuts());
6412 
6413             // Make sure there's no other dangling shortcuts.
6414             assertShortcutIds(getCallerShortcuts(), "ms1");
6415         });
6416 
6417         // Now version up, the manifest shortcut is disabled now.
6418         addManifestShortcutResource(
6419                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6420                 R.xml.shortcut_1_disable);
6421         updatePackageVersion(CALLING_PACKAGE_1, 1);
6422                 mService.mPackageMonitor.onReceive(getTestContext(),
6423                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6424 
6425         // Because shortcut 1 wasn't pinned, it'll just go away.
6426         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6427             assertEmpty(mManager.getManifestShortcuts());
6428             assertEmpty(mManager.getPinnedShortcuts());
6429 
6430             // Make sure there's no other dangling shortcuts.
6431             assertEmpty(getCallerShortcuts());
6432         });
6433     }
6434 
testManifestShortcuts_updateAndDisabled_pinned()6435     public void testManifestShortcuts_updateAndDisabled_pinned() {
6436         mService.handleUnlockUser(USER_0);
6437 
6438         // First, just publish a manifest shortcut.
6439         addManifestShortcutResource(
6440                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6441                 R.xml.shortcut_1);
6442         updatePackageVersion(CALLING_PACKAGE_1, 1);
6443                 mService.mPackageMonitor.onReceive(getTestContext(),
6444                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6445 
6446         // Only the valid one is published.
6447         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6448             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
6449                     mManager.getManifestShortcuts()))),
6450                     "ms1");
6451             assertEmpty(mManager.getPinnedShortcuts());
6452 
6453             // Make sure there's no other dangling shortcuts.
6454             assertShortcutIds(getCallerShortcuts(), "ms1");
6455         });
6456 
6457         runWithCaller(LAUNCHER_1, USER_0, () -> {
6458             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms1"), HANDLE_USER_0);
6459         });
6460 
6461         // Now upgrade, the manifest shortcut is disabled now.
6462         addManifestShortcutResource(
6463                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6464                 R.xml.shortcut_1_disable);
6465         updatePackageVersion(CALLING_PACKAGE_1, 1);
6466                 mService.mPackageMonitor.onReceive(getTestContext(),
6467                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6468 
6469         // Because shortcut 1 was pinned, it'll still exist as pinned, but disabled.
6470         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6471             assertEmpty(mManager.getManifestShortcuts());
6472             assertShortcutIds(assertAllNotManifest(assertAllImmutable(assertAllDisabled(
6473                     mManager.getPinnedShortcuts()))),
6474                     "ms1");
6475 
6476             // Make sure the fields are updated.
6477             ShortcutInfo si = getCallerShortcut("ms1");
6478 
6479             assertEquals("ms1", si.getId());
6480             assertEquals(R.drawable.icon2, si.getIconResourceId());
6481             assertEquals(R.string.shortcut_title2, si.getTitleResId());
6482             assertEquals(R.string.shortcut_text2, si.getTextResId());
6483             assertEquals(R.string.shortcut_disabled_message2, si.getDisabledMessageResourceId());
6484             assertEquals(Intent.ACTION_VIEW, si.getIntent().getAction());
6485 
6486             // Make sure there's no other dangling shortcuts.
6487             assertShortcutIds(getCallerShortcuts(), "ms1");
6488         });
6489     }
6490 
testManifestShortcuts_duplicateInSingleActivity()6491     public void testManifestShortcuts_duplicateInSingleActivity() {
6492         mService.handleUnlockUser(USER_0);
6493 
6494         // The XML has two shortcuts with the same ID.
6495         addManifestShortcutResource(
6496                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6497                 R.xml.shortcut_2_duplicate);
6498         updatePackageVersion(CALLING_PACKAGE_1, 1);
6499                 mService.mPackageMonitor.onReceive(getTestContext(),
6500                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6501 
6502         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6503             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
6504                     mManager.getManifestShortcuts()))),
6505                     "ms1");
6506 
6507             // Make sure the first one has survived.  (the second one has a different title.)
6508             ShortcutInfo si = getCallerShortcut("ms1");
6509             assertEquals(R.string.shortcut_title1, si.getTitleResId());
6510 
6511             // Make sure there's no other dangling shortcuts.
6512             assertShortcutIds(getCallerShortcuts(), "ms1");
6513         });
6514     }
6515 
testManifestShortcuts_duplicateInTwoActivities()6516     public void testManifestShortcuts_duplicateInTwoActivities() {
6517         mService.handleUnlockUser(USER_0);
6518 
6519         // ShortcutActivity has shortcut ms1
6520         addManifestShortcutResource(
6521                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6522                 R.xml.shortcut_1);
6523 
6524         // ShortcutActivity2 has two shortcuts, ms1 and ms2.
6525         addManifestShortcutResource(
6526                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
6527                 R.xml.shortcut_5);
6528         updatePackageVersion(CALLING_PACKAGE_1, 1);
6529                 mService.mPackageMonitor.onReceive(getTestContext(),
6530                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6531 
6532         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6533             assertShortcutIds(assertAllManifest(assertAllImmutable(assertAllEnabled(
6534                     mManager.getManifestShortcuts()))),
6535                     "ms1", "ms2", "ms3", "ms4", "ms5");
6536 
6537             // ms1 should belong to ShortcutActivity.
6538             ShortcutInfo si = getCallerShortcut("ms1");
6539             assertEquals(R.string.shortcut_title1, si.getTitleResId());
6540             assertEquals(new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6541                     si.getActivity());
6542             assertEquals(0, si.getRank());
6543 
6544             // ms2 should belong to ShortcutActivity*2*.
6545             si = getCallerShortcut("ms2");
6546             assertEquals(R.string.shortcut_title2, si.getTitleResId());
6547             assertEquals(new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
6548                     si.getActivity());
6549 
6550             // Also check the ranks
6551             assertWith(getCallerShortcuts()).selectManifest()
6552                     .selectByActivity(
6553                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()))
6554                     .haveRanksInOrder("ms1");
6555             assertWith(getCallerShortcuts()).selectManifest()
6556                     .selectByActivity(
6557                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()))
6558                     .haveRanksInOrder("ms2", "ms3", "ms4", "ms5");
6559 
6560             // Make sure there's no other dangling shortcuts.
6561             assertShortcutIds(getCallerShortcuts(), "ms1", "ms2", "ms3", "ms4", "ms5");
6562         });
6563     }
6564 
6565     /**
6566      * Manifest shortcuts cannot override shortcuts that were published via the APIs.
6567      */
testManifestShortcuts_cannotOverrideNonManifest()6568     public void testManifestShortcuts_cannotOverrideNonManifest() {
6569         mService.handleUnlockUser(USER_0);
6570 
6571         // Create a non-pinned dynamic shortcut and a non-dynamic pinned shortcut.
6572 
6573         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6574             mManager.setDynamicShortcuts(list(
6575                     makeShortcut("ms1", "title1",
6576                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6577                     /* icon */ null, new Intent("action1"), /* rank */ 0),
6578                     makeShortcut("ms2", "title2",
6579                             new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6580                     /* icon */ null, new Intent("action1"), /* rank */ 0)));
6581         });
6582 
6583         runWithCaller(LAUNCHER_1, USER_0, () -> {
6584             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2"), HANDLE_USER_0);
6585         });
6586 
6587         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6588             mManager.removeDynamicShortcuts(list("ms2"));
6589 
6590             assertShortcutIds(mManager.getDynamicShortcuts(), "ms1");
6591             assertShortcutIds(mManager.getPinnedShortcuts(), "ms2");
6592             assertEmpty(mManager.getManifestShortcuts());
6593         });
6594 
6595         // Then update the app with 5 manifest shortcuts.
6596         // Make sure "ms1" and "ms2" won't be replaced.
6597         addManifestShortcutResource(
6598                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6599                 R.xml.shortcut_5);
6600         updatePackageVersion(CALLING_PACKAGE_1, 1);
6601                 mService.mPackageMonitor.onReceive(getTestContext(),
6602                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6603 
6604         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6605             assertShortcutIds(assertAllNotManifest(mManager.getDynamicShortcuts()), "ms1");
6606             assertShortcutIds(assertAllNotManifest(mManager.getPinnedShortcuts()), "ms2");
6607             assertShortcutIds(assertAllManifest(mManager.getManifestShortcuts()),
6608                     "ms3", "ms4", "ms5");
6609 
6610             // ms1 and ms2 shouold keep the original title.
6611             ShortcutInfo si = getCallerShortcut("ms1");
6612             assertEquals("title1", si.getTitle());
6613 
6614             si = getCallerShortcut("ms2");
6615             assertEquals("title2", si.getTitle());
6616         });
6617     }
6618 
checkManifestShortcuts_immutable_verify()6619     protected void checkManifestShortcuts_immutable_verify() {
6620         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6621             assertShortcutIds(assertAllNotManifest(assertAllEnabled(
6622                     mManager.getDynamicShortcuts())),
6623                     "s1");
6624             assertShortcutIds(assertAllManifest(assertAllEnabled(
6625                     mManager.getManifestShortcuts())),
6626                     "ms1");
6627             assertShortcutIds(assertAllNotManifest(assertAllDisabled(
6628                     mManager.getPinnedShortcuts())),
6629                     "ms2");
6630 
6631             assertEquals("t1", getCallerShortcut("s1").getTitle());
6632 
6633             // Make sure there are no other shortcuts.
6634             assertShortcutIds(getCallerShortcuts(), "s1", "ms1", "ms2");
6635         });
6636     }
6637 
6638     /**
6639      * Make sure the APIs won't work on manifest shortcuts.
6640      */
testManifestShortcuts_immutable()6641     public void testManifestShortcuts_immutable() {
6642         mService.handleUnlockUser(USER_0);
6643 
6644         // Create a non-pinned manifest shortcut, a pinned shortcut that was originally
6645         // a manifest shortcut, as well as a dynamic shortcut.
6646 
6647         addManifestShortcutResource(
6648                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6649                 R.xml.shortcut_2);
6650         updatePackageVersion(CALLING_PACKAGE_1, 1);
6651                 mService.mPackageMonitor.onReceive(getTestContext(),
6652                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6653 
6654         runWithCaller(LAUNCHER_1, USER_0, () -> {
6655             mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms2"), HANDLE_USER_0);
6656         });
6657 
6658         addManifestShortcutResource(
6659                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6660                 R.xml.shortcut_1);
6661         updatePackageVersion(CALLING_PACKAGE_1, 1);
6662                 mService.mPackageMonitor.onReceive(getTestContext(),
6663                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6664 
6665         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6666             mManager.addDynamicShortcuts(list(makeShortcutWithTitle("s1", "t1")));
6667         });
6668 
6669         checkManifestShortcuts_immutable_verify();
6670 
6671         // Note that even though the first argument is not immutable and only the second one
6672         // is immutable, the first argument should not be executed either.
6673 
6674         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6675             assertCannotUpdateImmutable(() -> {
6676                 mManager.setDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms1")));
6677             });
6678             assertCannotUpdateImmutable(() -> {
6679                 mManager.setDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms2")));
6680             });
6681         });
6682         checkManifestShortcuts_immutable_verify();
6683 
6684         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6685             assertCannotUpdateImmutable(() -> {
6686                 mManager.addDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms1")));
6687             });
6688             assertCannotUpdateImmutable(() -> {
6689                 mManager.addDynamicShortcuts(list(makeShortcut("xx"), makeShortcut("ms2")));
6690             });
6691         });
6692         checkManifestShortcuts_immutable_verify();
6693 
6694 
6695         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6696             assertCannotUpdateImmutable(() -> {
6697                 mManager.updateShortcuts(list(makeShortcut("s1"), makeShortcut("ms1")));
6698             });
6699             assertCannotUpdateImmutable(() -> {
6700                 mManager.updateShortcuts(list(makeShortcut("s1"), makeShortcut("ms2")));
6701             });
6702         });
6703         checkManifestShortcuts_immutable_verify();
6704 
6705         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6706             assertCannotUpdateImmutable(() -> {
6707                 mManager.removeDynamicShortcuts(list("s1", "ms1"));
6708             });
6709             assertCannotUpdateImmutable(() -> {
6710                 mManager.removeDynamicShortcuts(list("s2", "ms2"));
6711             });
6712         });
6713         checkManifestShortcuts_immutable_verify();
6714 
6715         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6716             assertCannotUpdateImmutable(() -> {
6717                 mManager.disableShortcuts(list("s1", "ms1"));
6718             });
6719         });
6720         checkManifestShortcuts_immutable_verify();
6721 
6722         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6723             assertCannotUpdateImmutable(() -> {
6724                 mManager.enableShortcuts(list("s1", "ms2"));
6725             });
6726         });
6727         checkManifestShortcuts_immutable_verify();
6728     }
6729 
6730 
6731     /**
6732      * Make sure the APIs won't work on manifest shortcuts.
6733      */
testManifestShortcuts_tooMany()6734     public void testManifestShortcuts_tooMany() {
6735         // Change the max number of shortcuts.
6736         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
6737 
6738         mService.handleUnlockUser(USER_0);
6739 
6740         addManifestShortcutResource(
6741                 new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6742                 R.xml.shortcut_5);
6743         updatePackageVersion(CALLING_PACKAGE_1, 1);
6744                 mService.mPackageMonitor.onReceive(getTestContext(),
6745                 genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6746 
6747         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6748             // Only the first 3 should be published.
6749             assertShortcutIds(mManager.getManifestShortcuts(), "ms1", "ms2", "ms3");
6750         });
6751     }
6752 
testMaxShortcutCount_set()6753     public void testMaxShortcutCount_set() {
6754         // Change the max number of shortcuts.
6755         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
6756 
6757         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6758             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
6759             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
6760             final ShortcutInfo s1_1 = makeShortcutWithActivity("s11", a1);
6761             final ShortcutInfo s1_2 = makeShortcutWithActivity("s12", a1);
6762             final ShortcutInfo s1_3 = makeShortcutWithActivity("s13", a1);
6763             final ShortcutInfo s1_4 = makeShortcutWithActivity("s14", a1);
6764             final ShortcutInfo s1_5 = makeShortcutWithActivity("s15", a1);
6765             final ShortcutInfo s1_6 = makeShortcutWithActivity("s16", a1);
6766             final ShortcutInfo s2_1 = makeShortcutWithActivity("s21", a2);
6767             final ShortcutInfo s2_2 = makeShortcutWithActivity("s22", a2);
6768             final ShortcutInfo s2_3 = makeShortcutWithActivity("s23", a2);
6769             final ShortcutInfo s2_4 = makeShortcutWithActivity("s24", a2);
6770 
6771             // 3 shortcuts for 2 activities -> okay
6772             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
6773             assertShortcutIds(mManager.getDynamicShortcuts(),
6774                     "s11", "s12", "s13", "s21", "s22", "s23");
6775 
6776             mManager.removeAllDynamicShortcuts();
6777 
6778             // 4 shortcut for activity 1 -> too many.
6779             assertDynamicShortcutCountExceeded(() -> {
6780                 mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s1_4, s2_1, s2_2, s2_3));
6781             });
6782             assertEmpty(mManager.getDynamicShortcuts());
6783 
6784             // 4 shortcut for activity 2 -> too many.
6785             assertDynamicShortcutCountExceeded(() -> {
6786                 mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3, s2_4));
6787             });
6788             assertEmpty(mManager.getDynamicShortcuts());
6789 
6790             // First, set 3.  Then set 4, which should be ignored.
6791             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3));
6792             assertShortcutIds(mManager.getDynamicShortcuts(),
6793                     "s11", "s12", "s13");
6794             assertDynamicShortcutCountExceeded(() -> {
6795                 mManager.setDynamicShortcuts(list(s2_1, s2_2, s2_3, s2_4));
6796             });
6797             assertShortcutIds(mManager.getDynamicShortcuts(),
6798                     "s11", "s12", "s13");
6799 
6800             // Set will remove the old dynamic set, unlike add, so the following should pass.
6801             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3));
6802             assertShortcutIds(mManager.getDynamicShortcuts(),
6803                     "s11", "s12", "s13");
6804             mManager.setDynamicShortcuts(list(s1_4, s1_5, s1_6));
6805             assertShortcutIds(mManager.getDynamicShortcuts(),
6806                     "s14", "s15", "s16");
6807 
6808             // Now, test with 2 manifest shortcuts.
6809             mManager.removeAllDynamicShortcuts();
6810             addManifestShortcutResource(
6811                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6812                     R.xml.shortcut_2);
6813             updatePackageVersion(CALLING_PACKAGE_1, 1);
6814                     mService.mPackageMonitor.onReceive(getTestContext(),
6815                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6816             assertEquals(2, mManager.getManifestShortcuts().size());
6817 
6818             // Setting 1 to activity 1 will work.
6819             mManager.setDynamicShortcuts(list(s1_1, s2_1, s2_2, s2_3));
6820             assertShortcutIds(mManager.getDynamicShortcuts(),
6821                     "s11", "s21", "s22", "s23");
6822             assertEquals(2, mManager.getManifestShortcuts().size());
6823 
6824             // But setting 2 will not.
6825             mManager.removeAllDynamicShortcuts();
6826             assertDynamicShortcutCountExceeded(() -> {
6827                 mManager.setDynamicShortcuts(list(s1_1, s1_2, s2_1, s2_2, s2_3));
6828             });
6829             assertEmpty(mManager.getDynamicShortcuts());
6830             assertEquals(2, mManager.getManifestShortcuts().size());
6831         });
6832     }
6833 
testMaxShortcutCount_add()6834     public void testMaxShortcutCount_add() {
6835         // Change the max number of shortcuts.
6836         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
6837 
6838         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6839             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
6840             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
6841             final ShortcutInfo s1_1 = makeShortcutWithActivity("s11", a1);
6842             final ShortcutInfo s1_2 = makeShortcutWithActivity("s12", a1);
6843             final ShortcutInfo s1_3 = makeShortcutWithActivity("s13", a1);
6844             final ShortcutInfo s1_4 = makeShortcutWithActivity("s14", a1);
6845             final ShortcutInfo s2_1 = makeShortcutWithActivity("s21", a2);
6846             final ShortcutInfo s2_2 = makeShortcutWithActivity("s22", a2);
6847             final ShortcutInfo s2_3 = makeShortcutWithActivity("s23", a2);
6848             final ShortcutInfo s2_4 = makeShortcutWithActivity("s24", a2);
6849 
6850             // 3 shortcuts for 2 activities -> okay
6851             mManager.addDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
6852             assertShortcutIds(mManager.getDynamicShortcuts(),
6853                     "s11", "s12", "s13", "s21", "s22", "s23");
6854 
6855             mManager.removeAllDynamicShortcuts();
6856 
6857             // 4 shortcut for activity 1 -> too many.
6858             assertDynamicShortcutCountExceeded(() -> {
6859                 mManager.addDynamicShortcuts(list(s1_1, s1_2, s1_3, s1_4, s2_1, s2_2, s2_3));
6860             });
6861             assertEmpty(mManager.getDynamicShortcuts());
6862 
6863             // 4 shortcut for activity 2 -> too many.
6864             assertDynamicShortcutCountExceeded(() -> {
6865                 mManager.addDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3, s2_4));
6866             });
6867             assertEmpty(mManager.getDynamicShortcuts());
6868 
6869             // First, set 3.  Then add 1 more, which should be ignored.
6870             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3));
6871             assertShortcutIds(mManager.getDynamicShortcuts(),
6872                     "s11", "s12", "s13");
6873             assertDynamicShortcutCountExceeded(() -> {
6874                 mManager.addDynamicShortcuts(list(s1_4, s2_1));
6875             });
6876             assertShortcutIds(mManager.getDynamicShortcuts(),
6877                     "s11", "s12", "s13");
6878 
6879             // Update existing one, which should work.
6880             mManager.addDynamicShortcuts(list(makeShortcutWithActivityAndTitle(
6881                     "s11", a1, "xxx"), s2_1));
6882             assertShortcutIds(mManager.getDynamicShortcuts(),
6883                     "s11", "s12", "s13", "s21");
6884             assertEquals("xxx", getCallerShortcut("s11").getTitle());
6885 
6886             // Make sure pinned shortcuts won't affect.
6887             // - Pin s11 - s13, and remove all dynamic.
6888             runWithCaller(LAUNCHER_1, USER_0, () -> {
6889                 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s11", "s12", "s13"),
6890                         HANDLE_USER_0);
6891             });
6892             mManager.removeAllDynamicShortcuts();
6893 
6894             assertEmpty(mManager.getDynamicShortcuts());
6895             assertShortcutIds(mManager.getPinnedShortcuts(),
6896                     "s11", "s12", "s13");
6897 
6898             // Then add dynamic.
6899             mManager.addDynamicShortcuts(list(s1_4, s2_1, s2_2, s2_3));
6900 
6901             assertShortcutIds(mManager.getDynamicShortcuts(),
6902                     "s14", "s21", "s22", "s23");
6903             assertShortcutIds(mManager.getPinnedShortcuts(),
6904                     "s11", "s12", "s13");
6905 
6906             // Adding "s11" and "s12" back, should work
6907             mManager.addDynamicShortcuts(list(s1_1, s1_2));
6908 
6909             assertShortcutIds(mManager.getDynamicShortcuts(),
6910                     "s14", "s11", "s12", "s21", "s22", "s23");
6911             assertShortcutIds(mManager.getPinnedShortcuts(),
6912                     "s11", "s12", "s13");
6913 
6914             // Adding back s13 doesn't work.
6915             assertDynamicShortcutCountExceeded(() -> {
6916                 mManager.addDynamicShortcuts(list(s1_3));
6917             });
6918 
6919             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
6920                     "s11", "s12", "s14");
6921             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
6922                     "s21", "s22", "s23");
6923 
6924             // Now swap the activities.
6925             mManager.updateShortcuts(list(
6926                     makeShortcutWithActivity("s11", a2),
6927                     makeShortcutWithActivity("s21", a1)));
6928 
6929             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
6930                     "s21", "s12", "s14");
6931             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
6932                     "s11", "s22", "s23");
6933 
6934             // Now, test with 2 manifest shortcuts.
6935             mManager.removeAllDynamicShortcuts();
6936             addManifestShortcutResource(
6937                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
6938                     R.xml.shortcut_2);
6939             updatePackageVersion(CALLING_PACKAGE_1, 1);
6940                     mService.mPackageMonitor.onReceive(getTestContext(),
6941                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
6942 
6943             assertEquals(2, mManager.getManifestShortcuts().size());
6944 
6945             // Adding one shortcut to activity 1 works fine.
6946             mManager.addDynamicShortcuts(list(s1_1, s2_1, s2_2, s2_3));
6947             assertShortcutIds(mManager.getDynamicShortcuts(),
6948                     "s11", "s21", "s22", "s23");
6949             assertEquals(2, mManager.getManifestShortcuts().size());
6950 
6951             // But adding one more doesn't.
6952             assertDynamicShortcutCountExceeded(() -> {
6953                 mManager.addDynamicShortcuts(list(s1_4, s2_1));
6954             });
6955             assertShortcutIds(mManager.getDynamicShortcuts(),
6956                     "s11", "s21", "s22", "s23");
6957             assertEquals(2, mManager.getManifestShortcuts().size());
6958         });
6959     }
6960 
testMaxShortcutCount_update()6961     public void testMaxShortcutCount_update() {
6962         // Change the max number of shortcuts.
6963         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
6964 
6965         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
6966             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
6967             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
6968             final ShortcutInfo s1_1 = makeShortcutWithActivity("s11", a1);
6969             final ShortcutInfo s1_2 = makeShortcutWithActivity("s12", a1);
6970             final ShortcutInfo s1_3 = makeShortcutWithActivity("s13", a1);
6971             final ShortcutInfo s1_4 = makeShortcutWithActivity("s14", a1);
6972             final ShortcutInfo s1_5 = makeShortcutWithActivity("s15", a1);
6973             final ShortcutInfo s2_1 = makeShortcutWithActivity("s21", a2);
6974             final ShortcutInfo s2_2 = makeShortcutWithActivity("s22", a2);
6975             final ShortcutInfo s2_3 = makeShortcutWithActivity("s23", a2);
6976             final ShortcutInfo s2_4 = makeShortcutWithActivity("s24", a2);
6977 
6978             // 3 shortcuts for 2 activities -> okay
6979             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
6980             assertShortcutIds(mManager.getDynamicShortcuts(),
6981                     "s11", "s12", "s13", "s21", "s22", "s23");
6982 
6983             // Trying to move s11 from a1 to a2 should fail.
6984             assertDynamicShortcutCountExceeded(() -> {
6985                 mManager.updateShortcuts(list(makeShortcutWithActivity("s11", a2)));
6986             });
6987             assertShortcutIds(mManager.getDynamicShortcuts(),
6988                     "s11", "s12", "s13", "s21", "s22", "s23");
6989 
6990             // Trying to move s21 from a2 to a1 should also fail.
6991             assertDynamicShortcutCountExceeded(() -> {
6992                 mManager.updateShortcuts(list(makeShortcutWithActivity("s21", a1)));
6993             });
6994             assertShortcutIds(mManager.getDynamicShortcuts(),
6995                     "s11", "s12", "s13", "s21", "s22", "s23");
6996 
6997             // But, if we do these two at the same time, it should work.
6998             mManager.updateShortcuts(list(
6999                     makeShortcutWithActivity("s11", a2),
7000                     makeShortcutWithActivity("s21", a1)));
7001             assertShortcutIds(mManager.getDynamicShortcuts(),
7002                     "s11", "s12", "s13", "s21", "s22", "s23");
7003             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
7004                     "s21", "s12", "s13");
7005             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
7006                     "s11", "s22", "s23");
7007 
7008             // Then reset.
7009             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
7010             assertShortcutIds(mManager.getDynamicShortcuts(),
7011                     "s11", "s12", "s13", "s21", "s22", "s23");
7012 
7013             // Pin some to have more shortcuts for a1.
7014             runWithCaller(LAUNCHER_1, USER_0, () -> {
7015                 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s11", "s12", "s13"),
7016                         HANDLE_USER_0);
7017             });
7018             mManager.setDynamicShortcuts(list(s1_4, s1_5, s2_1, s2_2, s2_3));
7019             assertShortcutIds(mManager.getDynamicShortcuts(),
7020                     "s14", "s15", "s21", "s22", "s23");
7021             assertShortcutIds(mManager.getPinnedShortcuts(),
7022                     "s11", "s12", "s13");
7023 
7024             // a1 already has 2 dynamic shortcuts (and 3 pinned shortcuts that used to belong on it)
7025             // But that doesn't matter for update -- the following should still work.
7026             mManager.updateShortcuts(list(
7027                     makeShortcutWithActivityAndTitle("s11", a1, "xxx1"),
7028                     makeShortcutWithActivityAndTitle("s12", a1, "xxx2"),
7029                     makeShortcutWithActivityAndTitle("s13", a1, "xxx3"),
7030                     makeShortcutWithActivityAndTitle("s14", a1, "xxx4"),
7031                     makeShortcutWithActivityAndTitle("s15", a1, "xxx5")));
7032             // All the shortcuts should still exist they all belong on same activities,
7033             // with the updated titles.
7034             assertShortcutIds(mManager.getDynamicShortcuts(),
7035                     "s14", "s15", "s21", "s22", "s23");
7036             assertShortcutIds(mManager.getPinnedShortcuts(),
7037                     "s11", "s12", "s13");
7038 
7039             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a1),
7040                     "s14", "s15");
7041             assertShortcutIds(filterByActivity(mManager.getDynamicShortcuts(), a2),
7042                     "s21", "s22", "s23");
7043 
7044             assertEquals("xxx1", getCallerShortcut("s11").getTitle());
7045             assertEquals("xxx2", getCallerShortcut("s12").getTitle());
7046             assertEquals("xxx3", getCallerShortcut("s13").getTitle());
7047             assertEquals("xxx4", getCallerShortcut("s14").getTitle());
7048             assertEquals("xxx5", getCallerShortcut("s15").getTitle());
7049         });
7050     }
7051 
testShortcutsPushedOutByManifest()7052     public void testShortcutsPushedOutByManifest() {
7053         // Change the max number of shortcuts.
7054         mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3");
7055 
7056         runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
7057             final ComponentName a1 = new ComponentName(mClientContext, ShortcutActivity.class);
7058             final ComponentName a2 = new ComponentName(mClientContext, ShortcutActivity2.class);
7059             final ShortcutInfo s1_1 = makeShortcutWithActivityAndRank("s11", a1, 4);
7060             final ShortcutInfo s1_2 = makeShortcutWithActivityAndRank("s12", a1, 3);
7061             final ShortcutInfo s1_3 = makeShortcutWithActivityAndRank("s13", a1, 2);
7062             final ShortcutInfo s1_4 = makeShortcutWithActivityAndRank("s14", a1, 1);
7063             final ShortcutInfo s1_5 = makeShortcutWithActivityAndRank("s15", a1, 0);
7064             final ShortcutInfo s2_1 = makeShortcutWithActivityAndRank("s21", a2, 0);
7065             final ShortcutInfo s2_2 = makeShortcutWithActivityAndRank("s22", a2, 1);
7066             final ShortcutInfo s2_3 = makeShortcutWithActivityAndRank("s23", a2, 2);
7067             final ShortcutInfo s2_4 = makeShortcutWithActivityAndRank("s24", a2, 3);
7068             final ShortcutInfo s2_5 = makeShortcutWithActivityAndRank("s25", a2, 4);
7069 
7070             // Initial state.
7071             mManager.setDynamicShortcuts(list(s1_1, s1_2, s1_3, s2_1, s2_2, s2_3));
7072             runWithCaller(LAUNCHER_1, USER_0, () -> {
7073                 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s11", "s12", "s21", "s22"),
7074                         HANDLE_USER_0);
7075             });
7076             mManager.setDynamicShortcuts(list(s1_2, s1_3, s1_4, s2_2, s2_3, s2_4));
7077             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
7078                     "s12", "s13", "s14",
7079                     "s22", "s23", "s24");
7080             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
7081                     "s11", "s12",
7082                     "s21", "s22");
7083 
7084             // Add 1 manifest shortcut to a1.
7085             addManifestShortcutResource(
7086                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
7087                     R.xml.shortcut_1);
7088             updatePackageVersion(CALLING_PACKAGE_1, 1);
7089                     mService.mPackageMonitor.onReceive(getTestContext(),
7090                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
7091             assertEquals(1, mManager.getManifestShortcuts().size());
7092 
7093             // s12 removed.
7094             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
7095                     "s13", "s14",
7096                     "s22", "s23", "s24");
7097             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
7098                     "s11", "s12",
7099                     "s21", "s22");
7100 
7101             // Add more manifest shortcuts.
7102             addManifestShortcutResource(
7103                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
7104                     R.xml.shortcut_2);
7105             addManifestShortcutResource(
7106                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
7107                     R.xml.shortcut_1_alt);
7108             updatePackageVersion(CALLING_PACKAGE_1, 1);
7109                     mService.mPackageMonitor.onReceive(getTestContext(),
7110                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
7111             assertEquals(3, mManager.getManifestShortcuts().size());
7112 
7113             // Note the ones with the highest rank values (== least important) will be removed.
7114             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
7115                     "s14",
7116                     "s22", "s23");
7117             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
7118                     "s11", "s12",
7119                     "s21", "s22");
7120 
7121             // Add more manifest shortcuts.
7122             addManifestShortcutResource(
7123                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
7124                     R.xml.shortcut_2);
7125             addManifestShortcutResource(
7126                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
7127                     R.xml.shortcut_5_alt); // manifest has 5, but max is 3, so a2 will have 3.
7128             updatePackageVersion(CALLING_PACKAGE_1, 1);
7129                     mService.mPackageMonitor.onReceive(getTestContext(),
7130                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
7131             assertEquals(5, mManager.getManifestShortcuts().size());
7132 
7133             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
7134                     "s14" // a1 has 1 dynamic
7135             ); // a2 has no dynamic
7136             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
7137                     "s11", "s12",
7138                     "s21", "s22");
7139 
7140             // Update, no manifest shortucts.  This doesn't affect anything.
7141             addManifestShortcutResource(
7142                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
7143                     R.xml.shortcut_0);
7144             addManifestShortcutResource(
7145                     new ComponentName(CALLING_PACKAGE_1, ShortcutActivity2.class.getName()),
7146                     R.xml.shortcut_0);
7147             updatePackageVersion(CALLING_PACKAGE_1, 1);
7148                     mService.mPackageMonitor.onReceive(getTestContext(),
7149                     genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
7150             assertEquals(0, mManager.getManifestShortcuts().size());
7151 
7152             assertShortcutIds(assertAllEnabled(mManager.getDynamicShortcuts()),
7153                     "s14");
7154             assertShortcutIds(assertAllEnabled(mManager.getPinnedShortcuts()),
7155                     "s11", "s12",
7156                     "s21", "s22");
7157         });
7158     }
7159 }
7160