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