ShortcutManagerTest6.java revision 0b9d1db5c1aab9017daf05abd0ba0f4de2c7192d
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 */
16package com.android.server.pm;
17
18import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list;
19
20import static org.mockito.Matchers.any;
21import static org.mockito.Matchers.eq;
22import static org.mockito.Mockito.doAnswer;
23
24import android.content.ComponentName;
25import android.content.Intent;
26import android.content.pm.ActivityInfo;
27import android.content.pm.ApplicationInfo;
28import android.content.pm.ResolveInfo;
29import android.test.suitebuilder.annotation.SmallTest;
30
31import java.util.List;
32
33/**
34 * Tests for {@link ShortcutService#hasShortcutHostPermissionInner}.
35 */
36@SmallTest
37public class ShortcutManagerTest6 extends BaseShortcutManagerTest {
38    public void testHasShortcutHostPermissionInner_systemLauncherOnly() {
39        // Preferred isn't set, use the system launcher.
40        prepareGetHomeActivitiesAsUser(
41                /* preferred */ null,
42                list(getSystemLauncher(), getFallbackLauncher()),
43                USER_0);
44        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
45        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
46        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
47        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
48
49        // Should be cached.
50        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
51                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
52        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
53                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
54
55        // Also make sure the last known is saved, but the cached is not.
56
57        initService();
58
59        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
60                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
61        assertEquals(null,
62                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
63    }
64
65    public void testHasShortcutHostPermissionInner_with3pLauncher() {
66        // Preferred isn't set, still use the system launcher.
67        prepareGetHomeActivitiesAsUser(
68                /* preferred */ null,
69                list(getSystemLauncher(), getFallbackLauncher(),
70                        ri(CALLING_PACKAGE_1, "name", false, 0),
71                        ri(CALLING_PACKAGE_2, "name", false, 0)
72                ),
73                USER_0);
74        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
75        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
76        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
77        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
78
79        // Should be cached.
80        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
81                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
82        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
83                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
84    }
85
86    public void testHasShortcutHostPermissionInner_with3pLauncher_complicated() {
87        // Preferred is set.  That's the default launcher.
88        prepareGetHomeActivitiesAsUser(
89                /* preferred */ cn(CALLING_PACKAGE_2, "name"),
90                list(getSystemLauncher(), getFallbackLauncher(),
91                        ri(CALLING_PACKAGE_1, "name", false, 0),
92                        ri(CALLING_PACKAGE_2, "name", false, 0)
93                ),
94                USER_0);
95        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
96        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
97        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
98        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
99
100        // Should be cached.
101        assertEquals(cn(CALLING_PACKAGE_2, "name"),
102                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
103        assertEquals(cn(CALLING_PACKAGE_2, "name"),
104                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
105
106
107        // Once set, even after the preferred launcher is cleared, SM still allows it to access
108        // shortcuts.
109        prepareGetHomeActivitiesAsUser(
110                /* preferred */ null,
111                list(getSystemLauncher(), getFallbackLauncher(),
112                        ri(CALLING_PACKAGE_1, "name", false, 0),
113                        ri(CALLING_PACKAGE_2, "name", false, 0)
114                ),
115                USER_0);
116
117        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
118        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
119        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
120        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
121
122        // Should be cached.
123        assertEquals(cn(CALLING_PACKAGE_2, "name"),
124                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
125        assertEquals(cn(CALLING_PACKAGE_2, "name"),
126                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
127
128        // However, if the component has been disabled, then we'll recalculate it.
129        mEnabledActivityChecker = (comp, user) -> false;
130
131        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
132        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
133        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
134        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
135
136        mEnabledActivityChecker = (comp, user) -> true;
137
138        // Now the preferred changed.
139        prepareGetHomeActivitiesAsUser(
140                /* preferred */ cn(CALLING_PACKAGE_1, "xyz"),
141                list(getSystemLauncher(), getFallbackLauncher(),
142                        ri(CALLING_PACKAGE_1, "name", false, 0),
143                        ri(CALLING_PACKAGE_2, "name", false, 0)
144                ),
145                USER_0);
146
147        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
148
149        // Should be cached.
150        assertEquals(cn(CALLING_PACKAGE_1, "xyz"),
151                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
152        assertEquals(cn(CALLING_PACKAGE_1, "xyz"),
153                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
154
155
156        // As long as there's the cached launcher set, even if getHomeActivitiesAsUser()
157        // returns different values, the cached one is still the default.
158        prepareGetHomeActivitiesAsUser(
159                /* preferred */ getSystemLauncher().activityInfo.getComponentName(),
160                list(getSystemLauncher(), getFallbackLauncher()),
161                USER_0);
162
163        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
164
165        // Cached ones haven't changed.
166        assertEquals(cn(CALLING_PACKAGE_1, "xyz"),
167                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
168        assertEquals(cn(CALLING_PACKAGE_1, "xyz"),
169                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
170
171        // However, now the "real" default launcher is the system one.  So if the system
172        // launcher asks for shortcuts, we'll allow it.
173        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
174
175        // Since the cache is updated, CALLING_PACKAGE_1 no longer has the permission.
176        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
177
178        // Cached ones haven't changed.
179        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
180                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
181        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
182                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
183    }
184
185    public void testHasShortcutHostPermissionInner_multiUser() {
186        prepareGetHomeActivitiesAsUser(
187                /* preferred */ null,
188                list(getSystemLauncher(), getFallbackLauncher()),
189                USER_0);
190
191        prepareGetHomeActivitiesAsUser(
192                /* preferred */ cn(CALLING_PACKAGE_2, "name"),
193                list(getSystemLauncher(), getFallbackLauncher(),
194                        ri(CALLING_PACKAGE_1, "name", false, 0),
195                        ri(CALLING_PACKAGE_2, "name", false, 0)
196                ),
197                USER_10);
198
199        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
200        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
201        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
202        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
203
204        // Check the cache.
205        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
206                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
207        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
208                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
209
210        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_10));
211        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_10));
212        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_10));
213        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_10));
214
215        // Check the cache.
216        assertEquals(cn(CALLING_PACKAGE_2, "name"),
217                mService.getUserShortcutsLocked(USER_10).getLastKnownLauncher());
218        assertEquals(cn(CALLING_PACKAGE_2, "name"),
219                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
220    }
221
222    public void testHasShortcutHostPermissionInner_clearCache() {
223        prepareGetHomeActivitiesAsUser(
224                /* preferred */ null,
225                list(getSystemLauncher(), getFallbackLauncher()),
226                USER_0);
227
228        prepareGetHomeActivitiesAsUser(
229                /* preferred */ cn(CALLING_PACKAGE_2, "name"),
230                list(getSystemLauncher(), getFallbackLauncher(),
231                        ri(CALLING_PACKAGE_1, "name", false, 0),
232                        ri(CALLING_PACKAGE_2, "name", false, 0)
233                ),
234                USER_10);
235
236        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
237        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_10));
238
239        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
240                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
241
242        assertEquals(cn(CALLING_PACKAGE_2, "name"),
243                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
244
245        // Send ACTION_PREFERRED_ACTIVITY_CHANGED on user 10.
246        // But the user is not running, so will be ignored.
247        mService.mPackageMonitor.onReceive(mServiceContext,
248                new Intent(Intent.ACTION_PREFERRED_ACTIVITY_CHANGED).putExtra(
249                        Intent.EXTRA_USER_HANDLE, USER_10));
250
251        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
252                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
253
254        assertEquals(cn(CALLING_PACKAGE_2, "name"),
255                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
256
257         // Send it again after starting the user.
258        mRunningUsers.put(USER_10, true);
259        mService.mPackageMonitor.onReceive(mServiceContext,
260                new Intent(Intent.ACTION_PREFERRED_ACTIVITY_CHANGED).putExtra(
261                        Intent.EXTRA_USER_HANDLE, USER_10));
262
263        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
264                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
265
266        // Only user-10's cache is cleared.
267        assertEquals(null,
268                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
269
270    }
271}
272