1/*
2 * Copyright (C) 2015 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
17package android.content.pm;
18
19import android.content.Context;
20import android.content.Intent;
21import android.os.UserHandle;
22import android.test.AndroidTestCase;
23import android.view.inputmethod.InputMethodInfo;
24
25import java.util.Arrays;
26import java.util.HashSet;
27import java.util.List;
28
29public class AppsQueryHelperTests extends AndroidTestCase {
30
31    private AppsQueryHelper mAppsQueryHelper;
32
33    @Override
34    public void setUp() throws Exception {
35        super.setUp();
36        mAppsQueryHelper = new AppsQueryHelperTestable();
37    }
38
39    public void testQueryAppsSystemAppsOnly() {
40        List<String> apps = mAppsQueryHelper.queryApps(0, true, UserHandle.SYSTEM);
41        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app2", "sys_app3"), apps);
42
43        apps = mAppsQueryHelper.queryApps(0, false, UserHandle.SYSTEM);
44        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app2", "sys_app3", "app4"), apps);
45    }
46
47    public void testQueryAppsNonLaunchable() {
48        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_NON_LAUNCHABLE_APPS,
49                true, UserHandle.SYSTEM);
50        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
51
52        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_NON_LAUNCHABLE_APPS,
53                false, UserHandle.SYSTEM);
54        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
55    }
56
57    public void testQueryAppsInteractAcrossUser() {
58        List<String> apps = mAppsQueryHelper.queryApps(
59                AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM, true, UserHandle.SYSTEM);
60        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
61
62        apps = mAppsQueryHelper.queryApps(
63                AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM, false, UserHandle.SYSTEM);
64        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
65    }
66
67    public void testQueryApps() {
68        List<String> apps = mAppsQueryHelper.queryApps(
69                AppsQueryHelper.GET_NON_LAUNCHABLE_APPS
70                        |AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM,
71                true, UserHandle.SYSTEM);
72        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
73
74        apps = mAppsQueryHelper.queryApps(
75                AppsQueryHelper.GET_NON_LAUNCHABLE_APPS
76                        |AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM,
77                false, UserHandle.SYSTEM);
78        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
79    }
80
81    public void testQueryAppsImes() {
82        // Test query system IMEs
83        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_IMES,
84                true, UserHandle.of(UserHandle.myUserId()));
85        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
86
87        // Test query IMEs
88        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_IMES, false,
89                UserHandle.of(UserHandle.myUserId()));
90        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "app4"), apps);
91    }
92
93    public void testQueryAppsRequiredForSystemUser() {
94        // Test query only system apps required for system user
95        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_REQUIRED_FOR_SYSTEM_USER,
96                true, UserHandle.SYSTEM);
97        assertEqualsIgnoreOrder(Arrays.asList("sys_app3"), apps);
98
99        // Test query all apps required for system user
100        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_REQUIRED_FOR_SYSTEM_USER, false,
101                UserHandle.SYSTEM);
102        assertEqualsIgnoreOrder(Arrays.asList("sys_app3", "app4"), apps);
103    }
104
105    private class AppsQueryHelperTestable extends AppsQueryHelper {
106
107        @Override
108        protected List<ApplicationInfo> getAllApps(int userId) {
109            final ApplicationInfo ai1 = new ApplicationInfo();
110            ai1.flags |= ApplicationInfo.FLAG_SYSTEM;
111            ai1.packageName = "sys_app1";
112            final ApplicationInfo ai2 = new ApplicationInfo();
113            ai2.flags |= ApplicationInfo.FLAG_SYSTEM;
114            ai2.packageName = "sys_app2";
115            ai2.flags |= ApplicationInfo.FLAG_SYSTEM;
116            final ApplicationInfo ai3 = new ApplicationInfo();
117            ai3.packageName = "sys_app3";
118            ai3.flags |= ApplicationInfo.FLAG_SYSTEM;
119            ai3.privateFlags |= ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
120            final ApplicationInfo ai4 = new ApplicationInfo();
121            ai4.privateFlags |= ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
122            ai4.packageName = "app4";
123            return Arrays.asList(ai1, ai2, ai3, ai4);
124        }
125
126        @Override
127        protected List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int userId) {
128            assertEquals(Intent.CATEGORY_LAUNCHER, intent.getCategories().iterator().next());
129            final ResolveInfo r2 = new ResolveInfo();
130            r2.activityInfo = new ActivityInfo();
131            r2.activityInfo.packageName = "sys_app2";
132            r2.activityInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
133            final ResolveInfo r4 = new ResolveInfo();
134            r4.activityInfo = new ActivityInfo();
135            r4.activityInfo.packageName = "app4";
136            return Arrays.asList(r2, r4);
137        }
138
139        @Override
140        protected List<PackageInfo> getPackagesHoldingPermission(String perm, int userId) {
141            final PackageInfo p1 = new PackageInfo();
142            p1.packageName = "sys_app1";
143            p1.applicationInfo = new ApplicationInfo();
144            p1.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
145            return Arrays.asList(p1);
146        }
147
148        @Override
149        protected List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int userId) {
150            final ResolveInfo sysApp1 = new ResolveInfo();
151            sysApp1.serviceInfo = new ServiceInfo();
152            sysApp1.serviceInfo.packageName = "sys_app1";
153            sysApp1.serviceInfo.name = "name";
154            sysApp1.serviceInfo.applicationInfo = new ApplicationInfo();
155            sysApp1.serviceInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
156            final ResolveInfo app4 = new ResolveInfo();
157            app4.serviceInfo = new ServiceInfo();
158            app4.serviceInfo.packageName = "app4";
159            app4.serviceInfo.name = "name";
160            app4.serviceInfo.applicationInfo = new ApplicationInfo();
161            return Arrays.asList(sysApp1, app4);
162        }
163    }
164
165    private static void assertEqualsIgnoreOrder(List<String> expected, List<String> actual) {
166        assertTrue("Lists not equal. Expected " + expected + " but was " + actual,
167                (expected.size() == actual.size())
168                        && (new HashSet<>(expected).equals(new HashSet<>(actual))));
169    }
170}
171