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