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