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