ShortcutManagerTest6.java revision 9c850012cacf0af4a392294566a8c7c897dc8771
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        mRunningUsers.put(USER_10, true);
187
188        prepareGetHomeActivitiesAsUser(
189                /* preferred */ null,
190                list(getSystemLauncher(), getFallbackLauncher()),
191                USER_0);
192
193        prepareGetHomeActivitiesAsUser(
194                /* preferred */ cn(CALLING_PACKAGE_2, "name"),
195                list(getSystemLauncher(), getFallbackLauncher(),
196                        ri(CALLING_PACKAGE_1, "name", false, 0),
197                        ri(CALLING_PACKAGE_2, "name", false, 0)
198                ),
199                USER_10);
200
201        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
202        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_0));
203        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_0));
204        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_0));
205
206        // Check the cache.
207        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
208                mService.getUserShortcutsLocked(USER_0).getLastKnownLauncher());
209        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
210                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
211
212        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_10));
213        assertFalse(mService.hasShortcutHostPermissionInner(PACKAGE_FALLBACK_LAUNCHER, USER_10));
214        assertFalse(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_1, USER_10));
215        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_10));
216
217        // Check the cache.
218        assertEquals(cn(CALLING_PACKAGE_2, "name"),
219                mService.getUserShortcutsLocked(USER_10).getLastKnownLauncher());
220        assertEquals(cn(CALLING_PACKAGE_2, "name"),
221                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
222    }
223
224    public void testHasShortcutHostPermissionInner_clearCache() {
225        mRunningUsers.put(USER_10, true);
226
227        prepareGetHomeActivitiesAsUser(
228                /* preferred */ null,
229                list(getSystemLauncher(), getFallbackLauncher()),
230                USER_0);
231
232        prepareGetHomeActivitiesAsUser(
233                /* preferred */ cn(CALLING_PACKAGE_2, "name"),
234                list(getSystemLauncher(), getFallbackLauncher(),
235                        ri(CALLING_PACKAGE_1, "name", false, 0),
236                        ri(CALLING_PACKAGE_2, "name", false, 0)
237                ),
238                USER_10);
239
240        assertTrue(mService.hasShortcutHostPermissionInner(PACKAGE_SYSTEM_LAUNCHER, USER_0));
241        assertTrue(mService.hasShortcutHostPermissionInner(CALLING_PACKAGE_2, USER_10));
242
243        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
244                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
245
246        assertEquals(cn(CALLING_PACKAGE_2, "name"),
247                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
248
249        // Test it on a non-running user.
250        // Send ACTION_PREFERRED_ACTIVITY_CHANGED on user 10.
251        // But the user is not running, so will be ignored.
252        mRunningUsers.put(USER_10, false);
253
254        mService.mPackageMonitor.onReceive(mServiceContext,
255                new Intent(Intent.ACTION_PREFERRED_ACTIVITY_CHANGED).putExtra(
256                        Intent.EXTRA_USER_HANDLE, USER_10));
257
258        // Need to run the user again to access the internal status.
259        mRunningUsers.put(USER_10, true);
260
261        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
262                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
263
264        assertEquals(cn(CALLING_PACKAGE_2, "name"),
265                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
266
267         // Send it again after starting the user.
268        mRunningUsers.put(USER_10, true);
269        mService.mPackageMonitor.onReceive(mServiceContext,
270                new Intent(Intent.ACTION_PREFERRED_ACTIVITY_CHANGED).putExtra(
271                        Intent.EXTRA_USER_HANDLE, USER_10));
272
273        assertEquals(cn(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME),
274                mService.getUserShortcutsLocked(USER_0).getCachedLauncher());
275
276        // Only user-10's cache is cleared.
277        assertEquals(null,
278                mService.getUserShortcutsLocked(USER_10).getCachedLauncher());
279
280    }
281}
282