1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.L; 4 import static android.os.Build.VERSION_CODES.M; 5 import static android.os.Build.VERSION_CODES.N; 6 import static android.os.Build.VERSION_CODES.O; 7 import static android.os.Build.VERSION_CODES.O_MR1; 8 import static android.os.Build.VERSION_CODES.P; 9 import static android.os.Build.VERSION_CODES.Q; 10 import static android.os.Build.VERSION_CODES.R; 11 import static android.os.Build.VERSION_CODES.TIRAMISU; 12 import static com.google.common.truth.Truth.assertThat; 13 import static org.junit.Assert.assertEquals; 14 import static org.junit.Assert.assertThrows; 15 import static org.junit.Assert.assertTrue; 16 import static org.robolectric.Shadows.shadowOf; 17 import static org.robolectric.util.reflector.Reflector.reflector; 18 19 import android.app.Activity; 20 import android.content.ComponentName; 21 import android.content.Context; 22 import android.content.pm.ActivityInfo; 23 import android.content.pm.ApplicationInfo; 24 import android.content.pm.IncrementalStatesInfo; 25 import android.content.pm.LauncherActivityInfo; 26 import android.content.pm.LauncherActivityInfoInternal; 27 import android.content.pm.LauncherApps; 28 import android.content.pm.LauncherApps.ShortcutQuery; 29 import android.content.pm.PackageManager.NameNotFoundException; 30 import android.content.pm.ResolveInfo; 31 import android.content.pm.ShortcutInfo; 32 import android.os.Bundle; 33 import android.os.Handler; 34 import android.os.HandlerThread; 35 import android.os.Looper; 36 import android.os.Process; 37 import android.os.UserHandle; 38 import android.os.UserManager; 39 import androidx.test.core.app.ApplicationProvider; 40 import androidx.test.ext.junit.runners.AndroidJUnit4; 41 import java.util.ArrayList; 42 import java.util.List; 43 import java.util.concurrent.CountDownLatch; 44 import java.util.concurrent.TimeUnit; 45 import org.junit.Before; 46 import org.junit.Test; 47 import org.junit.runner.RunWith; 48 import org.robolectric.Robolectric; 49 import org.robolectric.RuntimeEnvironment; 50 import org.robolectric.annotation.Config; 51 import org.robolectric.shadow.api.Shadow; 52 import org.robolectric.util.ReflectionHelpers; 53 import org.robolectric.util.ReflectionHelpers.ClassParameter; 54 import org.robolectric.util.reflector.Accessor; 55 import org.robolectric.util.reflector.ForType; 56 57 /** Robolectric test for {@link ShadowLauncherApps}. */ 58 @RunWith(AndroidJUnit4.class) 59 @Config(minSdk = O_MR1) 60 public class ShadowLauncherAppsTest { 61 private static final String TEST_PACKAGE_NAME = "test-package"; 62 private static final String TEST_PACKAGE_NAME_2 = "test-package2"; 63 private static final String TEST_PACKAGE_NAME_3 = "test-package3"; 64 private static final UserHandle USER_HANDLE = UserHandle.CURRENT; 65 private LauncherApps launcherApps; 66 67 private static class DefaultCallback extends LauncherApps.Callback { 68 @Override onPackageRemoved(String packageName, UserHandle user)69 public void onPackageRemoved(String packageName, UserHandle user) {} 70 71 @Override onPackageAdded(String packageName, UserHandle user)72 public void onPackageAdded(String packageName, UserHandle user) {} 73 74 @Override onPackageChanged(String packageName, UserHandle user)75 public void onPackageChanged(String packageName, UserHandle user) {} 76 77 @Override onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing)78 public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) {} 79 80 @Override onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing)81 public void onPackagesUnavailable(String[] packageNames, UserHandle user, boolean replacing) {} 82 } 83 84 @Before setup()85 public void setup() { 86 launcherApps = 87 (LauncherApps) 88 ApplicationProvider.getApplicationContext() 89 .getSystemService(Context.LAUNCHER_APPS_SERVICE); 90 } 91 92 @ForType(ShortcutInfo.class) 93 private interface ReflectorShortcutInfo { 94 @Accessor("mPackageName") setPackage(String packageName)95 void setPackage(String packageName); 96 } 97 shadowLooper(Looper looper)98 private ShadowLooper shadowLooper(Looper looper) { 99 return Shadow.extract(looper); 100 } 101 102 @Test testIsPackageEnabled()103 public void testIsPackageEnabled() { 104 assertThat(launcherApps.isPackageEnabled(TEST_PACKAGE_NAME, USER_HANDLE)).isFalse(); 105 106 shadowOf(launcherApps).addEnabledPackage(USER_HANDLE, TEST_PACKAGE_NAME); 107 assertThat(launcherApps.isPackageEnabled(TEST_PACKAGE_NAME, USER_HANDLE)).isTrue(); 108 } 109 110 @Test 111 @Config(minSdk = O) getShortcutConfigActivityList_getsShortcutsForPackageName()112 public void getShortcutConfigActivityList_getsShortcutsForPackageName() { 113 LauncherActivityInfo launcherActivityInfo1 = 114 createLauncherActivityInfo(TEST_PACKAGE_NAME, USER_HANDLE); 115 LauncherActivityInfo launcherActivityInfo2 = 116 createLauncherActivityInfo(TEST_PACKAGE_NAME_2, USER_HANDLE); 117 shadowOf(launcherApps).addShortcutConfigActivity(USER_HANDLE, launcherActivityInfo1); 118 shadowOf(launcherApps).addShortcutConfigActivity(USER_HANDLE, launcherActivityInfo2); 119 120 assertThat(launcherApps.getShortcutConfigActivityList(TEST_PACKAGE_NAME, USER_HANDLE)) 121 .contains(launcherActivityInfo1); 122 } 123 124 @Test 125 @Config(minSdk = O) getShortcutConfigActivityList_getsShortcutsForUserHandle()126 public void getShortcutConfigActivityList_getsShortcutsForUserHandle() { 127 LauncherActivityInfo launcherActivityInfo1 = 128 createLauncherActivityInfo(TEST_PACKAGE_NAME, USER_HANDLE); 129 LauncherActivityInfo launcherActivityInfo2 = 130 createLauncherActivityInfo(TEST_PACKAGE_NAME, UserHandle.of(10)); 131 shadowOf(launcherApps).addShortcutConfigActivity(USER_HANDLE, launcherActivityInfo1); 132 shadowOf(launcherApps).addShortcutConfigActivity(UserHandle.of(10), launcherActivityInfo2); 133 134 assertThat(launcherApps.getShortcutConfigActivityList(TEST_PACKAGE_NAME, UserHandle.of(10))) 135 .contains(launcherActivityInfo2); 136 } 137 138 @Test 139 @Config(minSdk = O) getShortcutConfigActivityList_packageNull_getsShortcutFromAllPackagesForUser()140 public void getShortcutConfigActivityList_packageNull_getsShortcutFromAllPackagesForUser() { 141 LauncherActivityInfo launcherActivityInfo1 = 142 createLauncherActivityInfo(TEST_PACKAGE_NAME, USER_HANDLE); 143 LauncherActivityInfo launcherActivityInfo2 = 144 createLauncherActivityInfo(TEST_PACKAGE_NAME_2, USER_HANDLE); 145 LauncherActivityInfo launcherActivityInfo3 = 146 createLauncherActivityInfo(TEST_PACKAGE_NAME_3, UserHandle.of(10)); 147 shadowOf(launcherApps).addShortcutConfigActivity(USER_HANDLE, launcherActivityInfo1); 148 shadowOf(launcherApps).addShortcutConfigActivity(USER_HANDLE, launcherActivityInfo2); 149 shadowOf(launcherApps).addShortcutConfigActivity(UserHandle.of(10), launcherActivityInfo3); 150 151 assertThat(launcherApps.getShortcutConfigActivityList(null, USER_HANDLE)) 152 .containsExactly(launcherActivityInfo1, launcherActivityInfo2); 153 } 154 155 @Test 156 @Config(minSdk = L, maxSdk = M) testGetActivityListPreN()157 public void testGetActivityListPreN() { 158 assertThat(launcherApps.getActivityList(TEST_PACKAGE_NAME, USER_HANDLE)).isEmpty(); 159 160 ResolveInfo info = 161 ShadowResolveInfo.newResolveInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, TEST_PACKAGE_NAME); 162 LauncherActivityInfo launcherActivityInfo = 163 ReflectionHelpers.callConstructor( 164 LauncherActivityInfo.class, 165 ClassParameter.from(Context.class, ApplicationProvider.getApplicationContext()), 166 ClassParameter.from(ResolveInfo.class, info), 167 ClassParameter.from(UserHandle.class, USER_HANDLE), 168 ClassParameter.from(long.class, System.currentTimeMillis())); 169 shadowOf(launcherApps).addActivity(USER_HANDLE, launcherActivityInfo); 170 assertThat(launcherApps.getActivityList(TEST_PACKAGE_NAME, USER_HANDLE)) 171 .contains(launcherActivityInfo); 172 } 173 174 @Test 175 @Config(minSdk = N) testGetActivityList()176 public void testGetActivityList() { 177 assertThat(launcherApps.getActivityList(TEST_PACKAGE_NAME, USER_HANDLE)).isEmpty(); 178 179 LauncherActivityInfo launcherActivityInfo1 = 180 createLauncherActivityInfo(TEST_PACKAGE_NAME, USER_HANDLE); 181 182 shadowOf(launcherApps).addActivity(USER_HANDLE, launcherActivityInfo1); 183 assertThat(launcherApps.getActivityList(TEST_PACKAGE_NAME, USER_HANDLE)) 184 .contains(launcherActivityInfo1); 185 } 186 187 @Test 188 @Config(minSdk = N) testGetActivityList_packageNull_getsActivitiesFromAllPackagesForUser()189 public void testGetActivityList_packageNull_getsActivitiesFromAllPackagesForUser() { 190 LauncherActivityInfo launcherActivityInfo1 = 191 createLauncherActivityInfo(TEST_PACKAGE_NAME, USER_HANDLE); 192 LauncherActivityInfo launcherActivityInfo2 = 193 createLauncherActivityInfo(TEST_PACKAGE_NAME_2, USER_HANDLE); 194 LauncherActivityInfo launcherActivityInfo3 = 195 createLauncherActivityInfo(TEST_PACKAGE_NAME_3, UserHandle.of(10)); 196 shadowOf(launcherApps).addActivity(USER_HANDLE, launcherActivityInfo1); 197 shadowOf(launcherApps).addActivity(USER_HANDLE, launcherActivityInfo2); 198 shadowOf(launcherApps).addActivity(UserHandle.of(10), launcherActivityInfo3); 199 200 assertThat(launcherApps.getActivityList(null, USER_HANDLE)) 201 .containsExactly(launcherActivityInfo1, launcherActivityInfo2); 202 } 203 204 @Test 205 @Config(minSdk = L) testIsActivityEnabled()206 public void testIsActivityEnabled() { 207 ComponentName c1 = new ComponentName(ApplicationProvider.getApplicationContext(), "Activity1"); 208 ComponentName c2 = new ComponentName(ApplicationProvider.getApplicationContext(), "Activity2"); 209 ComponentName c3 = new ComponentName("other", "Activity1"); 210 assertThat(launcherApps.isActivityEnabled(c1, USER_HANDLE)).isFalse(); 211 212 shadowOf(launcherApps).setActivityEnabled(USER_HANDLE, c1); 213 assertThat(launcherApps.isActivityEnabled(c1, USER_HANDLE)).isTrue(); 214 assertThat(launcherApps.isActivityEnabled(c2, USER_HANDLE)).isFalse(); 215 assertThat(launcherApps.isActivityEnabled(c3, USER_HANDLE)).isFalse(); 216 } 217 218 @Test 219 @Config(minSdk = O) testGetApplicationInfo_packageNotFound()220 public void testGetApplicationInfo_packageNotFound() throws Exception { 221 Throwable throwable = 222 assertThrows( 223 NameNotFoundException.class, 224 () -> launcherApps.getApplicationInfo(TEST_PACKAGE_NAME, 0, USER_HANDLE)); 225 226 assertThat(throwable) 227 .hasMessageThat() 228 .isEqualTo( 229 "Package " + TEST_PACKAGE_NAME + " not found for user " + USER_HANDLE.getIdentifier()); 230 } 231 232 @Test testGetApplicationInfo_incorrectPackage()233 public void testGetApplicationInfo_incorrectPackage() throws Exception { 234 ApplicationInfo applicationInfo = new ApplicationInfo(); 235 applicationInfo.name = "Test app"; 236 shadowOf(launcherApps).addApplicationInfo(USER_HANDLE, TEST_PACKAGE_NAME_2, applicationInfo); 237 238 Throwable throwable = 239 assertThrows( 240 NameNotFoundException.class, 241 () -> launcherApps.getApplicationInfo(TEST_PACKAGE_NAME, 0, USER_HANDLE)); 242 243 assertThat(throwable) 244 .hasMessageThat() 245 .isEqualTo( 246 "Package " + TEST_PACKAGE_NAME + " not found for user " + USER_HANDLE.getIdentifier()); 247 } 248 249 @Test testGetApplicationInfo_findsApplicationInfo()250 public void testGetApplicationInfo_findsApplicationInfo() throws Exception { 251 ApplicationInfo applicationInfo = new ApplicationInfo(); 252 applicationInfo.name = "Test app"; 253 shadowOf(launcherApps).addApplicationInfo(USER_HANDLE, TEST_PACKAGE_NAME, applicationInfo); 254 255 assertThat(launcherApps.getApplicationInfo(TEST_PACKAGE_NAME, 0, USER_HANDLE)) 256 .isEqualTo(applicationInfo); 257 } 258 259 @Test testCallbackFiresWhenShortcutAddedOrRemoved()260 public void testCallbackFiresWhenShortcutAddedOrRemoved() throws Exception { 261 final Boolean[] wasCalled = new Boolean[] {false}; 262 final CountDownLatch latch1 = new CountDownLatch(1); 263 final CountDownLatch latch2 = new CountDownLatch(2); 264 265 final String packageName = ApplicationProvider.getApplicationContext().getPackageName(); 266 267 HandlerThread handlerThread = new HandlerThread("test"); 268 handlerThread.start(); 269 try { 270 LauncherApps.Callback callback = 271 new DefaultCallback() { 272 @Override 273 public void onShortcutsChanged( 274 String packageName, List<ShortcutInfo> shortcuts, UserHandle user) { 275 assertEquals(shortcuts.get(0).getPackage(), packageName); 276 wasCalled[0] = true; 277 latch1.countDown(); 278 latch2.countDown(); 279 } 280 }; 281 launcherApps.registerCallback(callback, new Handler(handlerThread.getLooper())); 282 shadowOf(launcherApps) 283 .addDynamicShortcut( 284 new ShortcutInfo.Builder(ApplicationProvider.getApplicationContext(), "ID").build()); 285 shadowLooper(handlerThread.getLooper()).idle(); 286 287 latch1.await(1, TimeUnit.SECONDS); 288 assertTrue(wasCalled[0]); 289 290 wasCalled[0] = false; 291 launcherApps.pinShortcuts(packageName, new ArrayList<>(), Process.myUserHandle()); 292 shadowLooper(handlerThread.getLooper()).idle(); 293 latch2.await(1, TimeUnit.SECONDS); 294 assertTrue(wasCalled[0]); 295 } finally { 296 handlerThread.quit(); 297 } 298 } 299 300 @Test testGetShortcuts()301 public void testGetShortcuts() { 302 final ShortcutInfo shortcut1 = 303 new ShortcutInfo.Builder(ApplicationProvider.getApplicationContext(), "ID1").build(); 304 final ShortcutInfo shortcut2 = 305 new ShortcutInfo.Builder(ApplicationProvider.getApplicationContext(), "ID2").build(); 306 307 shadowOf(launcherApps).addDynamicShortcut(shortcut1); 308 shadowOf(launcherApps).addDynamicShortcut(shortcut2); 309 310 assertThat(getPinnedShortcuts(null, null)).containsExactly(shortcut1, shortcut2); 311 } 312 313 @Test testGetShortcutsWithFilters()314 public void testGetShortcutsWithFilters() { 315 String myPackage = ApplicationProvider.getApplicationContext().getPackageName(); 316 String otherPackage = "other"; 317 ComponentName c1 = new ComponentName(ApplicationProvider.getApplicationContext(), "Activity1"); 318 ComponentName c2 = new ComponentName(ApplicationProvider.getApplicationContext(), "Activity2"); 319 ComponentName c3 = new ComponentName(otherPackage, "Activity1"); 320 321 final ShortcutInfo shortcut1 = 322 new ShortcutInfo.Builder(ApplicationProvider.getApplicationContext(), "ID1") 323 .setActivity(c1) 324 .build(); 325 final ShortcutInfo shortcut2 = 326 new ShortcutInfo.Builder(ApplicationProvider.getApplicationContext(), "ID2") 327 .setActivity(c2) 328 .build(); 329 final ShortcutInfo shortcut3 = 330 new ShortcutInfo.Builder(ApplicationProvider.getApplicationContext(), "ID3") 331 .setActivity(c3) 332 .build(); 333 reflector(ReflectorShortcutInfo.class, shortcut3).setPackage(otherPackage); 334 335 shadowOf(launcherApps).addDynamicShortcut(shortcut1); 336 shadowOf(launcherApps).addDynamicShortcut(shortcut2); 337 shadowOf(launcherApps).addDynamicShortcut(shortcut3); 338 339 assertThat(getPinnedShortcuts(otherPackage, null)).containsExactly(shortcut3); 340 assertThat(getPinnedShortcuts(myPackage, null)).containsExactly(shortcut1, shortcut2); 341 assertThat(getPinnedShortcuts(null, c1)).containsExactly(shortcut1); 342 assertThat(getPinnedShortcuts(null, c2)).containsExactly(shortcut2); 343 assertThat(getPinnedShortcuts(null, c3)).containsExactly(shortcut3); 344 } 345 346 @Test testHasShortcutHostPermission()347 public void testHasShortcutHostPermission() { 348 shadowOf(launcherApps).setHasShortcutHostPermission(true); 349 assertThat(launcherApps.hasShortcutHostPermission()).isTrue(); 350 } 351 352 @Test testHasShortcutHostPermission_returnsFalseByDefault()353 public void testHasShortcutHostPermission_returnsFalseByDefault() { 354 assertThat(launcherApps.hasShortcutHostPermission()).isFalse(); 355 } 356 357 @Test 358 @Config(minSdk = P) getSuspendedPackageLauncherExtras_returnsBundle()359 public void getSuspendedPackageLauncherExtras_returnsBundle() { 360 Bundle bundle = new Bundle(); 361 bundle.putInt("suspended_app", 5); 362 shadowOf(launcherApps) 363 .addSuspendedPackageLauncherExtras(USER_HANDLE, TEST_PACKAGE_NAME_2, bundle); 364 365 assertThat(launcherApps.getSuspendedPackageLauncherExtras(TEST_PACKAGE_NAME_2, USER_HANDLE)) 366 .isEqualTo(bundle); 367 } 368 369 @Test 370 @Config(minSdk = P) getSuspendedPackageLauncherExtras_returnsEmptyBundle()371 public void getSuspendedPackageLauncherExtras_returnsEmptyBundle() { 372 Throwable throwable = 373 assertThrows( 374 NameNotFoundException.class, 375 () -> launcherApps.getSuspendedPackageLauncherExtras(TEST_PACKAGE_NAME, USER_HANDLE)); 376 377 assertThat(throwable) 378 .hasMessageThat() 379 .isEqualTo( 380 "Suspended package extras for " 381 + TEST_PACKAGE_NAME 382 + " not found for user " 383 + USER_HANDLE.getIdentifier()); 384 } 385 386 @Test 387 @Config(minSdk = Q) getProfiles_returnsMainProfileByDefault()388 public void getProfiles_returnsMainProfileByDefault() { 389 assertThat(launcherApps.getProfiles()).containsExactly(UserHandle.of(0)); 390 } 391 392 @Test 393 @Config(minSdk = Q) getProfiles_returnsAllProfiles()394 public void getProfiles_returnsAllProfiles() { 395 UserManager userManager = 396 (UserManager) 397 ApplicationProvider.getApplicationContext().getSystemService(Context.USER_SERVICE); 398 399 shadowOf(userManager).addProfile(UserHandle.myUserId(), 10, "profile10", /* profileFlags= */ 0); 400 shadowOf(userManager).addProfile(UserHandle.myUserId(), 11, "profile11", /* profileFlags= */ 0); 401 402 assertThat(launcherApps.getProfiles()) 403 .containsExactly(UserHandle.of(0), UserHandle.of(10), UserHandle.of(11)); 404 } 405 getPinnedShortcuts(String packageName, ComponentName activity)406 private List<ShortcutInfo> getPinnedShortcuts(String packageName, ComponentName activity) { 407 ShortcutQuery query = new ShortcutQuery(); 408 query.setQueryFlags(ShortcutQuery.FLAG_MATCH_DYNAMIC | ShortcutQuery.FLAG_MATCH_PINNED); 409 query.setPackage(packageName); 410 query.setActivity(activity); 411 return launcherApps.getShortcuts(query, Process.myUserHandle()); 412 } 413 createLauncherActivityInfo( String packageName, UserHandle userHandle)414 private LauncherActivityInfo createLauncherActivityInfo( 415 String packageName, UserHandle userHandle) { 416 ActivityInfo info = new ActivityInfo(); 417 info.packageName = packageName; 418 info.name = packageName; 419 info.nonLocalizedLabel = packageName; 420 if (RuntimeEnvironment.getApiLevel() <= R) { 421 return ReflectionHelpers.callConstructor( 422 LauncherActivityInfo.class, 423 ClassParameter.from(Context.class, ApplicationProvider.getApplicationContext()), 424 ClassParameter.from(ActivityInfo.class, info), 425 ClassParameter.from(UserHandle.class, userHandle)); 426 } else if (RuntimeEnvironment.getApiLevel() <= TIRAMISU) { 427 LauncherActivityInfoInternal launcherActivityInfoInternal = 428 ReflectionHelpers.callConstructor( 429 LauncherActivityInfoInternal.class, 430 ClassParameter.from(ActivityInfo.class, info), 431 ClassParameter.from(IncrementalStatesInfo.class, null)); 432 433 return ReflectionHelpers.callConstructor( 434 LauncherActivityInfo.class, 435 ClassParameter.from(Context.class, ApplicationProvider.getApplicationContext()), 436 ClassParameter.from(UserHandle.class, userHandle), 437 ClassParameter.from(LauncherActivityInfoInternal.class, launcherActivityInfoInternal)); 438 } else { 439 440 LauncherActivityInfoInternal launcherActivityInfoInternal = 441 ReflectionHelpers.callConstructor( 442 LauncherActivityInfoInternal.class, 443 ClassParameter.from(ActivityInfo.class, info), 444 ClassParameter.from(IncrementalStatesInfo.class, null), 445 ClassParameter.from(UserHandle.class, userHandle)); 446 447 return ReflectionHelpers.callConstructor( 448 LauncherActivityInfo.class, 449 ClassParameter.from(Context.class, ApplicationProvider.getApplicationContext()), 450 ClassParameter.from(LauncherActivityInfoInternal.class, launcherActivityInfoInternal)); 451 } 452 } 453 454 @Test 455 @Config(minSdk = O) launcherApps_activityContextEnabled_differentInstancesRetrieveProfiles()456 public void launcherApps_activityContextEnabled_differentInstancesRetrieveProfiles() { 457 String originalProperty = System.getProperty("robolectric.createActivityContexts", ""); 458 System.setProperty("robolectric.createActivityContexts", "true"); 459 Activity activity = null; 460 461 try { 462 LauncherApps applicationLauncherApps = 463 ApplicationProvider.getApplicationContext().getSystemService(LauncherApps.class); 464 activity = Robolectric.setupActivity(Activity.class); 465 LauncherApps activityLauncherApps = activity.getSystemService(LauncherApps.class); 466 467 assertThat(applicationLauncherApps).isNotSameInstanceAs(activityLauncherApps); 468 469 List<UserHandle> applicationProfiles = applicationLauncherApps.getProfiles(); 470 List<UserHandle> activityProfiles = activityLauncherApps.getProfiles(); 471 472 assertThat(applicationProfiles).isNotEmpty(); 473 assertThat(activityProfiles).isNotEmpty(); 474 475 assertThat(activityProfiles).isEqualTo(applicationProfiles); 476 } finally { 477 if (activity != null) { 478 activity.finish(); 479 } 480 System.setProperty("robolectric.createActivityContexts", originalProperty); 481 } 482 } 483 } 484