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