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