1 /* 2 * Copyright 2017, 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 */ 16 17 package com.android.server.devicepolicy; 18 19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE; 20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; 21 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; 22 import static android.app.admin.DevicePolicyManager.REQUIRED_APP_MANAGED_DEVICE; 23 import static android.app.admin.DevicePolicyManager.REQUIRED_APP_MANAGED_PROFILE; 24 import static android.app.admin.DevicePolicyManager.REQUIRED_APP_MANAGED_USER; 25 26 import static com.google.common.truth.Truth.assertThat; 27 import static com.google.common.truth.Truth.assertWithMessage; 28 29 import static org.mockito.ArgumentMatchers.any; 30 import static org.mockito.Matchers.eq; 31 import static org.mockito.Mockito.when; 32 33 import android.content.ComponentName; 34 import android.content.Context; 35 import android.content.Intent; 36 import android.content.pm.ActivityInfo; 37 import android.content.pm.ApplicationInfo; 38 import android.content.pm.ModuleInfo; 39 import android.content.pm.PackageInfo; 40 import android.content.pm.PackageManager; 41 import android.content.pm.ResolveInfo; 42 import android.content.pm.ServiceInfo; 43 import android.content.res.Resources; 44 import android.os.Bundle; 45 import android.test.mock.MockPackageManager; 46 import android.view.inputmethod.InputMethodInfo; 47 48 import androidx.annotation.NonNull; 49 import androidx.test.InstrumentationRegistry; 50 import androidx.test.runner.AndroidJUnit4; 51 52 import com.android.internal.R; 53 54 import org.junit.Before; 55 import org.junit.Test; 56 import org.junit.runner.RunWith; 57 import org.mockito.Mock; 58 import org.mockito.MockitoAnnotations; 59 60 import java.util.ArrayList; 61 import java.util.Arrays; 62 import java.util.HashMap; 63 import java.util.HashSet; 64 import java.util.List; 65 import java.util.Map; 66 import java.util.Set; 67 68 /** 69 * Run this test with: 70 * 71 * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.OwnersTest} 72 * 73 */ 74 @RunWith(AndroidJUnit4.class) 75 public class OverlayPackagesProviderTest { 76 private static final String TEST_DPC_PACKAGE_NAME = "dpc.package.name"; 77 private static final ComponentName TEST_MDM_COMPONENT_NAME = new ComponentName( 78 TEST_DPC_PACKAGE_NAME, "pc.package.name.DeviceAdmin"); 79 private static final int TEST_USER_ID = 123; 80 private static final String ROLE_HOLDER_PACKAGE_NAME = "test.role.holder.package.name"; 81 82 private @Mock Resources mResources; 83 84 private @Mock OverlayPackagesProvider.Injector mInjector; 85 private @Mock Context mTestContext; 86 private Resources mRealResources; 87 88 private FakePackageManager mPackageManager; 89 private String[] mSystemAppsWithLauncher; 90 private Set<String> mRegularMainlineModules = new HashSet<>(); 91 private Map<String, String> mMainlineModuleToDeclaredMetadataMap = new HashMap<>(); 92 private OverlayPackagesProvider mHelper; 93 94 @Before setUp()95 public void setUp() { 96 MockitoAnnotations.initMocks(this); 97 mPackageManager = new FakePackageManager(); 98 when(mTestContext.getResources()).thenReturn(mResources); 99 when(mTestContext.getPackageManager()).thenReturn(mPackageManager); 100 when(mTestContext.getFilesDir()).thenReturn( 101 InstrumentationRegistry.getTargetContext().getCacheDir()); 102 103 setSystemInputMethods(); 104 setRequiredAppsManagedDevice(); 105 setVendorRequiredAppsManagedDevice(); 106 setDisallowedAppsManagedDevice(); 107 setVendorDisallowedAppsManagedDevice(); 108 setRequiredAppsManagedProfile(); 109 setVendorRequiredAppsManagedProfile(); 110 setDisallowedAppsManagedProfile(); 111 setVendorDisallowedAppsManagedProfile(); 112 setRequiredAppsManagedUser(); 113 setVendorRequiredAppsManagedUser(); 114 setDisallowedAppsManagedUser(); 115 setVendorDisallowedAppsManagedUser(); 116 117 mRealResources = InstrumentationRegistry.getTargetContext().getResources(); 118 mHelper = new OverlayPackagesProvider(mTestContext, mInjector); 119 } 120 121 @Test testAppsWithLauncherAreNonRequiredByDefault()122 public void testAppsWithLauncherAreNonRequiredByDefault() { 123 setSystemAppsWithLauncher("app.a", "app.b"); 124 125 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a", "app.b"); 126 } 127 128 @Test testDeviceOwnerRequiredApps()129 public void testDeviceOwnerRequiredApps() { 130 setSystemAppsWithLauncher("app.a", "app.b", "app.c"); 131 setRequiredAppsManagedDevice("app.a"); 132 setVendorRequiredAppsManagedDevice("app.b"); 133 134 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.c"); 135 } 136 137 @Test testProfileOwnerRequiredApps()138 public void testProfileOwnerRequiredApps() { 139 setSystemAppsWithLauncher("app.a", "app.b", "app.c"); 140 setRequiredAppsManagedProfile("app.a"); 141 setVendorRequiredAppsManagedProfile("app.b"); 142 143 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, "app.c"); 144 } 145 146 @Test testManagedUserRequiredApps()147 public void testManagedUserRequiredApps() { 148 setSystemAppsWithLauncher("app.a", "app.b", "app.c"); 149 setRequiredAppsManagedUser("app.a"); 150 setVendorRequiredAppsManagedUser("app.b"); 151 152 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, "app.c"); 153 } 154 155 @Test testDpcIsRequired()156 public void testDpcIsRequired() { 157 setSystemAppsWithLauncher("app.a", TEST_DPC_PACKAGE_NAME); 158 159 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a"); 160 } 161 162 @Test testDisallowedAppsAreNonRequiredEvenIfNoLauncher()163 public void testDisallowedAppsAreNonRequiredEvenIfNoLauncher() { 164 setSystemAppsWithLauncher(); 165 setDisallowedAppsManagedDevice("app.a"); 166 setVendorDisallowedAppsManagedDevice("app.b"); 167 168 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a", "app.b"); 169 } 170 171 @Test testDeviceOwnerImesAreRequired()172 public void testDeviceOwnerImesAreRequired() { 173 setSystemAppsWithLauncher("app.a", "app.b"); 174 setSystemInputMethods("app.a"); 175 176 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.b"); 177 } 178 179 @Test testProfileOwnerImesAreNonRequired()180 public void testProfileOwnerImesAreNonRequired() { 181 setSystemAppsWithLauncher("app.a", "app.b"); 182 setSystemInputMethods("app.a"); 183 184 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, "app.b"); 185 } 186 187 @Test testManagedUserImesAreRequired()188 public void testManagedUserImesAreRequired() { 189 setSystemAppsWithLauncher("app.a", "app.b"); 190 setSystemInputMethods("app.a"); 191 192 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, "app.b"); 193 } 194 195 @Test testDisallowedAppsAreNonInstalled()196 public void testDisallowedAppsAreNonInstalled() { 197 setSystemAppsWithLauncher("app.a"); 198 setDisallowedAppsManagedDevice("app.c"); 199 200 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a", "app.c"); 201 } 202 203 /** 204 * If an app is listed as both required and disallowed, it should be only in the disallowed 205 * list. Therefore, it should be present in the non-required list. 206 */ 207 @Test testAllowedAndDisallowedAtTheSameTimeManagedDevice()208 public void testAllowedAndDisallowedAtTheSameTimeManagedDevice() { 209 setDisallowedAppsManagedDevice(TEST_DPC_PACKAGE_NAME); 210 setRequiredAppsManagedDevice(TEST_DPC_PACKAGE_NAME); 211 212 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, TEST_DPC_PACKAGE_NAME); 213 } 214 215 /** 216 * @see {@link #testAllowedAndDisallowedAtTheSameTimeManagedDevice} 217 */ 218 @Test testAllowedAndDisallowedAtTheSameTimeManagedUser()219 public void testAllowedAndDisallowedAtTheSameTimeManagedUser() { 220 setDisallowedAppsManagedUser(TEST_DPC_PACKAGE_NAME); 221 setRequiredAppsManagedUser(TEST_DPC_PACKAGE_NAME); 222 223 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, TEST_DPC_PACKAGE_NAME); 224 } 225 226 /** 227 * @see {@link #testAllowedAndDisallowedAtTheSameTimeManagedDevice} 228 */ 229 @Test testAllowedAndDisallowedAtTheSameTimeManagedProfile()230 public void testAllowedAndDisallowedAtTheSameTimeManagedProfile() { 231 setDisallowedAppsManagedProfile(TEST_DPC_PACKAGE_NAME); 232 setRequiredAppsManagedProfile(TEST_DPC_PACKAGE_NAME); 233 234 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, TEST_DPC_PACKAGE_NAME); 235 } 236 237 @Test testNotRequiredAndDisallowedInResManagedDevice()238 public void testNotRequiredAndDisallowedInResManagedDevice() { 239 verifyEmptyIntersection(R.array.required_apps_managed_device, 240 R.array.disallowed_apps_managed_device); 241 } 242 243 @Test testNotRequiredAndDisallowedInResManagedUser()244 public void testNotRequiredAndDisallowedInResManagedUser() { 245 verifyEmptyIntersection(R.array.required_apps_managed_user, 246 R.array.disallowed_apps_managed_user); 247 } 248 249 @Test testNotRequiredAndDisallowedInResManagedProfile()250 public void testNotRequiredAndDisallowedInResManagedProfile() { 251 verifyEmptyIntersection(R.array.required_apps_managed_profile, 252 R.array.disallowed_apps_managed_profile); 253 } 254 255 @Test testNotRequiredAndDisallowedInResManagedDeviceVendor()256 public void testNotRequiredAndDisallowedInResManagedDeviceVendor() { 257 verifyEmptyIntersection(R.array.vendor_required_apps_managed_device, 258 R.array.vendor_disallowed_apps_managed_device); 259 } 260 261 @Test testNotRequiredAndDisallowedInResManagedUserVendor()262 public void testNotRequiredAndDisallowedInResManagedUserVendor() { 263 verifyEmptyIntersection(R.array.vendor_required_apps_managed_user, 264 R.array.vendor_disallowed_apps_managed_user); 265 } 266 267 @Test testNotRequiredAndDisallowedInResManagedProfileVendor()268 public void testNotRequiredAndDisallowedInResManagedProfileVendor() { 269 verifyEmptyIntersection(R.array.vendor_required_apps_managed_profile, 270 R.array.vendor_disallowed_apps_managed_profile); 271 } 272 273 @Test testGetNonRequiredApps_mainlineModules_managedProfile_works()274 public void testGetNonRequiredApps_mainlineModules_managedProfile_works() { 275 setupApexModulesWithManagedProfile("package1"); 276 setupRegularModulesWithManagedProfile("package2"); 277 setSystemAppsWithLauncher("package1", "package2", "package3"); 278 279 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, "package3"); 280 } 281 282 @Test testGetNonRequiredApps_mainlineModules_managedDevice_works()283 public void testGetNonRequiredApps_mainlineModules_managedDevice_works() { 284 setupApexModulesWithManagedDevice("package1"); 285 setupRegularModulesWithManagedDevice("package2"); 286 setSystemAppsWithLauncher("package1", "package2", "package3"); 287 288 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "package3"); 289 } 290 291 @Test testGetNonRequiredApps_mainlineModules_managedUser_works()292 public void testGetNonRequiredApps_mainlineModules_managedUser_works() { 293 setupApexModulesWithManagedUser("package1"); 294 setupRegularModulesWithManagedUser("package2"); 295 setSystemAppsWithLauncher("package1", "package2", "package3"); 296 297 verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, "package3"); 298 } 299 300 @Test testGetNonRequiredApps_mainlineModules_noMetadata_works()301 public void testGetNonRequiredApps_mainlineModules_noMetadata_works() { 302 setupApexModulesWithNoMetadata("package1"); 303 setupRegularModulesWithNoMetadata("package2"); 304 setSystemAppsWithLauncher("package1", "package2", "package3"); 305 306 verifyAppsAreNonRequired( 307 ACTION_PROVISION_MANAGED_PROFILE, "package1", "package2", "package3"); 308 } 309 310 @Test testGetNonRequiredApps_managedProfile_roleHolder_works()311 public void testGetNonRequiredApps_managedProfile_roleHolder_works() { 312 when(mInjector.getDevicePolicyManagementRoleHolderPackageName(any())) 313 .thenReturn(ROLE_HOLDER_PACKAGE_NAME); 314 setSystemAppsWithLauncher("package1", "package2", ROLE_HOLDER_PACKAGE_NAME); 315 316 verifyAppsAreNonRequired( 317 ACTION_PROVISION_MANAGED_PROFILE, "package1", "package2"); 318 } 319 320 @Test testGetNonRequiredApps_managedDevice_roleHolder_works()321 public void testGetNonRequiredApps_managedDevice_roleHolder_works() { 322 when(mInjector.getDevicePolicyManagementRoleHolderPackageName(any())) 323 .thenReturn(ROLE_HOLDER_PACKAGE_NAME); 324 setSystemAppsWithLauncher("package1", "package2", ROLE_HOLDER_PACKAGE_NAME); 325 326 verifyAppsAreNonRequired( 327 ACTION_PROVISION_MANAGED_DEVICE, "package1", "package2"); 328 } 329 setupRegularModulesWithManagedUser(String... regularModules)330 private void setupRegularModulesWithManagedUser(String... regularModules) { 331 setupRegularModulesWithMetadata(regularModules, REQUIRED_APP_MANAGED_USER); 332 } 333 setupRegularModulesWithManagedDevice(String... regularModules)334 private void setupRegularModulesWithManagedDevice(String... regularModules) { 335 setupRegularModulesWithMetadata(regularModules, REQUIRED_APP_MANAGED_DEVICE); 336 } 337 setupRegularModulesWithManagedProfile(String... regularModules)338 private void setupRegularModulesWithManagedProfile(String... regularModules) { 339 setupRegularModulesWithMetadata(regularModules, REQUIRED_APP_MANAGED_PROFILE); 340 } 341 setupRegularModulesWithNoMetadata(String... regularModules)342 private void setupRegularModulesWithNoMetadata(String... regularModules) { 343 mRegularMainlineModules.addAll(Arrays.asList(regularModules)); 344 } 345 setupRegularModulesWithMetadata(String[] regularModules, String metadataKey)346 private void setupRegularModulesWithMetadata(String[] regularModules, String metadataKey) { 347 for (String regularModule : regularModules) { 348 mRegularMainlineModules.add(regularModule); 349 mMainlineModuleToDeclaredMetadataMap.put(regularModule, metadataKey); 350 } 351 } 352 setupApexModulesWithManagedUser(String... apexPackageNames)353 private void setupApexModulesWithManagedUser(String... apexPackageNames) { 354 setupApexModulesWithMetadata(apexPackageNames, REQUIRED_APP_MANAGED_USER); 355 } 356 setupApexModulesWithManagedDevice(String... apexPackageNames)357 private void setupApexModulesWithManagedDevice(String... apexPackageNames) { 358 setupApexModulesWithMetadata(apexPackageNames, REQUIRED_APP_MANAGED_DEVICE); 359 } 360 setupApexModulesWithManagedProfile(String... apexPackageNames)361 private void setupApexModulesWithManagedProfile(String... apexPackageNames) { 362 setupApexModulesWithMetadata(apexPackageNames, REQUIRED_APP_MANAGED_PROFILE); 363 } 364 setupApexModulesWithNoMetadata(String... apexPackageNames)365 private void setupApexModulesWithNoMetadata(String... apexPackageNames) { 366 for (String apexPackageName : apexPackageNames) { 367 when(mInjector.getActiveApexPackageNameContainingPackage(eq(apexPackageName))) 368 .thenReturn("apex"); 369 } 370 } 371 setupApexModulesWithMetadata(String[] apexPackageNames, String metadataKey)372 private void setupApexModulesWithMetadata(String[] apexPackageNames, String metadataKey) { 373 for (String apexPackageName : apexPackageNames) { 374 when(mInjector.getActiveApexPackageNameContainingPackage(eq(apexPackageName))) 375 .thenReturn("apex"); 376 mMainlineModuleToDeclaredMetadataMap.put(apexPackageName, metadataKey); 377 } 378 } 379 getStringArrayInRealResources(int id)380 private ArrayList<String> getStringArrayInRealResources(int id) { 381 return new ArrayList<>(Arrays.asList(mRealResources.getStringArray(id))); 382 } 383 verifyEmptyIntersection(int requiredId, int disallowedId)384 private void verifyEmptyIntersection(int requiredId, int disallowedId) { 385 ArrayList<String> required = getStringArrayInRealResources(requiredId); 386 ArrayList<String> disallowed = getStringArrayInRealResources(disallowedId); 387 required.retainAll(disallowed); 388 assertThat(required.isEmpty()).isTrue(); 389 } 390 verifyAppsAreNonRequired(String action, String... appArray)391 private void verifyAppsAreNonRequired(String action, String... appArray) { 392 assertThat(mHelper.getNonRequiredApps(TEST_MDM_COMPONENT_NAME, TEST_USER_ID, action)) 393 .containsExactlyElementsIn(setFromArray(appArray)); 394 } 395 setRequiredAppsManagedDevice(String... apps)396 private void setRequiredAppsManagedDevice(String... apps) { 397 setStringArray(R.array.required_apps_managed_device, apps); 398 } 399 setVendorRequiredAppsManagedDevice(String... apps)400 private void setVendorRequiredAppsManagedDevice(String... apps) { 401 setStringArray(R.array.vendor_required_apps_managed_device, apps); 402 } 403 setDisallowedAppsManagedDevice(String... apps)404 private void setDisallowedAppsManagedDevice(String... apps) { 405 setStringArray(R.array.disallowed_apps_managed_device, apps); 406 } 407 setVendorDisallowedAppsManagedDevice(String... apps)408 private void setVendorDisallowedAppsManagedDevice(String... apps) { 409 setStringArray(R.array.vendor_disallowed_apps_managed_device, apps); 410 } 411 setRequiredAppsManagedProfile(String... apps)412 private void setRequiredAppsManagedProfile(String... apps) { 413 setStringArray(R.array.required_apps_managed_profile, apps); 414 } 415 setVendorRequiredAppsManagedProfile(String... apps)416 private void setVendorRequiredAppsManagedProfile(String... apps) { 417 setStringArray(R.array.vendor_required_apps_managed_profile, apps); 418 } 419 setDisallowedAppsManagedProfile(String... apps)420 private void setDisallowedAppsManagedProfile(String... apps) { 421 setStringArray(R.array.disallowed_apps_managed_profile, apps); 422 } 423 setVendorDisallowedAppsManagedProfile(String... apps)424 private void setVendorDisallowedAppsManagedProfile(String... apps) { 425 setStringArray(R.array.vendor_disallowed_apps_managed_profile, apps); 426 } 427 setRequiredAppsManagedUser(String... apps)428 private void setRequiredAppsManagedUser(String... apps) { 429 setStringArray(R.array.required_apps_managed_user, apps); 430 } 431 setVendorRequiredAppsManagedUser(String... apps)432 private void setVendorRequiredAppsManagedUser(String... apps) { 433 setStringArray(R.array.vendor_required_apps_managed_user, apps); 434 } 435 setDisallowedAppsManagedUser(String... apps)436 private void setDisallowedAppsManagedUser(String... apps) { 437 setStringArray(R.array.disallowed_apps_managed_user, apps); 438 } 439 setVendorDisallowedAppsManagedUser(String... apps)440 private void setVendorDisallowedAppsManagedUser(String... apps) { 441 setStringArray(R.array.vendor_disallowed_apps_managed_user, apps); 442 } 443 setStringArray(int resourceId, String[] strs)444 private void setStringArray(int resourceId, String[] strs) { 445 when(mResources.getStringArray(eq(resourceId))) 446 .thenReturn(strs); 447 } 448 setSystemInputMethods(String... packageNames)449 private void setSystemInputMethods(String... packageNames) { 450 List<InputMethodInfo> inputMethods = new ArrayList<InputMethodInfo>(); 451 for (String packageName : packageNames) { 452 ApplicationInfo aInfo = new ApplicationInfo(); 453 aInfo.flags = ApplicationInfo.FLAG_SYSTEM; 454 ServiceInfo serviceInfo = new ServiceInfo(); 455 serviceInfo.applicationInfo = aInfo; 456 serviceInfo.packageName = packageName; 457 serviceInfo.name = ""; 458 ResolveInfo ri = new ResolveInfo(); 459 ri.serviceInfo = serviceInfo; 460 InputMethodInfo inputMethodInfo = new InputMethodInfo(ri, false, null, null, 0, false); 461 inputMethods.add(inputMethodInfo); 462 } 463 when(mInjector.getInputMethodListAsUser(eq(TEST_USER_ID))).thenReturn(inputMethods); 464 } 465 setSystemAppsWithLauncher(String... apps)466 private void setSystemAppsWithLauncher(String... apps) { 467 mSystemAppsWithLauncher = apps; 468 } 469 setFromArray(T... array)470 private <T> Set<T> setFromArray(T... array) { 471 if (array == null) { 472 return null; 473 } 474 return new HashSet<>(Arrays.asList(array)); 475 } 476 477 class FakePackageManager extends MockPackageManager { 478 @Override queryIntentActivitiesAsUser(Intent intent, int flags, int userId)479 public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) { 480 assertWithMessage("Expected an intent with action ACTION_MAIN") 481 .that(Intent.ACTION_MAIN.equals(intent.getAction())).isTrue(); 482 assertWithMessage("Expected an intent with category CATEGORY_LAUNCHER") 483 .that(intent.getCategories()).containsExactly(Intent.CATEGORY_LAUNCHER); 484 assertWithMessage("Expected the flag MATCH_UNINSTALLED_PACKAGES") 485 .that((flags & PackageManager.MATCH_UNINSTALLED_PACKAGES)).isNotEqualTo(0); 486 assertWithMessage("Expected the flag MATCH_DISABLED_COMPONENTS") 487 .that((flags & PackageManager.MATCH_DISABLED_COMPONENTS)).isNotEqualTo(0); 488 assertWithMessage("Expected the flag MATCH_DIRECT_BOOT_AWARE") 489 .that((flags & PackageManager.MATCH_DIRECT_BOOT_AWARE)).isNotEqualTo(0); 490 assertWithMessage("Expected the flag MATCH_DIRECT_BOOT_UNAWARE") 491 .that((flags & PackageManager.MATCH_DIRECT_BOOT_UNAWARE)).isNotEqualTo(0); 492 assertThat(TEST_USER_ID).isEqualTo(userId); 493 List<ResolveInfo> result = new ArrayList<>(); 494 if (mSystemAppsWithLauncher == null) { 495 return result; 496 } 497 for (String packageName : mSystemAppsWithLauncher) { 498 ActivityInfo ai = new ActivityInfo(); 499 ai.packageName = packageName; 500 ResolveInfo ri = new ResolveInfo(); 501 ri.activityInfo = ai; 502 result.add(ri); 503 } 504 return result; 505 } 506 507 @NonNull 508 @Override getPackageInfo(String packageName, int flags)509 public PackageInfo getPackageInfo(String packageName, int flags) { 510 final PackageInfo packageInfo = new PackageInfo(); 511 final ApplicationInfo applicationInfo = new ApplicationInfo(); 512 applicationInfo.metaData = new Bundle(); 513 if (mMainlineModuleToDeclaredMetadataMap.containsKey(packageName)) { 514 applicationInfo.metaData.putBoolean( 515 mMainlineModuleToDeclaredMetadataMap.get(packageName), true); 516 } 517 packageInfo.applicationInfo = applicationInfo; 518 return packageInfo; 519 } 520 521 @NonNull 522 @Override getModuleInfo(@onNull String packageName, int flags)523 public ModuleInfo getModuleInfo(@NonNull String packageName, int flags) 524 throws NameNotFoundException { 525 if (!mRegularMainlineModules.contains(packageName)) { 526 throw new NameNotFoundException("package does not exist"); 527 } 528 return new ModuleInfo().setName(packageName); 529 } 530 } 531 } 532