17db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov/*
27db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * Copyright (C) 2015 The Android Open Source Project
37db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov *
47db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * Licensed under the Apache License, Version 2.0 (the "License");
57db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * you may not use this file except in compliance with the License.
67db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * You may obtain a copy of the License at
77db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov *
87db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov *      http://www.apache.org/licenses/LICENSE-2.0
97db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov *
107db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * Unless required by applicable law or agreed to in writing, software
117db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * distributed under the License is distributed on an "AS IS" BASIS,
127db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * See the License for the specific language governing permissions and
147db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov * limitations under the License
157db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov */
167db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
177db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovpackage android.content.pm;
187db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
197db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport android.content.Context;
207db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport android.content.Intent;
217db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport android.os.UserHandle;
227db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport android.test.AndroidTestCase;
23b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolovimport android.view.inputmethod.InputMethodInfo;
247db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
257db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport java.util.Arrays;
267db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport java.util.HashSet;
277db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovimport java.util.List;
287db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
297db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolovpublic class AppsQueryHelperTests extends AndroidTestCase {
307db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
317db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    private AppsQueryHelper mAppsQueryHelper;
327db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
337db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    @Override
347db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    public void setUp() throws Exception {
357db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        super.setUp();
361682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov        mAppsQueryHelper = new AppsQueryHelperTestable();
377db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
387db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
397db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    public void testQueryAppsSystemAppsOnly() {
407db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(0, true, UserHandle.SYSTEM);
417db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app2", "sys_app3"), apps);
427db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
437db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        apps = mAppsQueryHelper.queryApps(0, false, UserHandle.SYSTEM);
447db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app2", "sys_app3", "app4"), apps);
457db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
467db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
477db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    public void testQueryAppsNonLaunchable() {
487db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_NON_LAUNCHABLE_APPS,
497db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                true, UserHandle.SYSTEM);
507db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
517db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
527db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_NON_LAUNCHABLE_APPS,
537db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                false, UserHandle.SYSTEM);
547db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
557db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
567db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
577db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    public void testQueryAppsInteractAcrossUser() {
587db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(
597db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM, true, UserHandle.SYSTEM);
607db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
617db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
627db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        apps = mAppsQueryHelper.queryApps(
637db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM, false, UserHandle.SYSTEM);
647db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
657db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
667db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
677db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    public void testQueryApps() {
687db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(
697db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                AppsQueryHelper.GET_NON_LAUNCHABLE_APPS
707db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                        |AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM,
717db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                true, UserHandle.SYSTEM);
727db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
737db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
747db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        apps = mAppsQueryHelper.queryApps(
757db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                AppsQueryHelper.GET_NON_LAUNCHABLE_APPS
767db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                        |AppsQueryHelper.GET_APPS_WITH_INTERACT_ACROSS_USERS_PERM,
777db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                false, UserHandle.SYSTEM);
787db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "sys_app3"), apps);
797db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
807db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
811682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov    public void testQueryAppsImes() {
821682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov        // Test query system IMEs
831682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_IMES,
84b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov                true, UserHandle.of(UserHandle.myUserId()));
85b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
86b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
871682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov        // Test query IMEs
881682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_IMES, false,
89b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov                UserHandle.of(UserHandle.myUserId()));
90b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "app4"), apps);
91b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov    }
92b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
93bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov    public void testQueryAppsRequiredForSystemUser() {
94bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov        // Test query only system apps required for system user
95bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_REQUIRED_FOR_SYSTEM_USER,
96bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov                true, UserHandle.SYSTEM);
97bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app3"), apps);
98bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov
99bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov        // Test query all apps required for system user
100bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_REQUIRED_FOR_SYSTEM_USER, false,
101bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov                UserHandle.SYSTEM);
102bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app3", "app4"), apps);
103bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov    }
104bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov
1057db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    private class AppsQueryHelperTestable extends AppsQueryHelper {
1067db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1077db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        @Override
1087db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        protected List<ApplicationInfo> getAllApps(int userId) {
1097db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai1 = new ApplicationInfo();
1107db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai1.flags |= ApplicationInfo.FLAG_SYSTEM;
1117db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai1.packageName = "sys_app1";
1127db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai2 = new ApplicationInfo();
1137db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai2.flags |= ApplicationInfo.FLAG_SYSTEM;
1147db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai2.packageName = "sys_app2";
1157db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai2.flags |= ApplicationInfo.FLAG_SYSTEM;
1167db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai3 = new ApplicationInfo();
1177db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai3.packageName = "sys_app3";
1187db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai3.flags |= ApplicationInfo.FLAG_SYSTEM;
119bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov            ai3.privateFlags |= ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
1207db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai4 = new ApplicationInfo();
121bdbc9692c7cb365d9d3f239baa2377724a6f7bc8Fyodor Kupolov            ai4.privateFlags |= ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
1227db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai4.packageName = "app4";
1237db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            return Arrays.asList(ai1, ai2, ai3, ai4);
1247db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
1257db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1267db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        @Override
1277db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        protected List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int userId) {
1287db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            assertEquals(Intent.CATEGORY_LAUNCHER, intent.getCategories().iterator().next());
1297db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ResolveInfo r2 = new ResolveInfo();
1307db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r2.activityInfo = new ActivityInfo();
1317db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r2.activityInfo.packageName = "sys_app2";
1327db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r2.activityInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
1337db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ResolveInfo r4 = new ResolveInfo();
1347db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r4.activityInfo = new ActivityInfo();
1357db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r4.activityInfo.packageName = "app4";
1367db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            return Arrays.asList(r2, r4);
1377db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
1387db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1397db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        @Override
1407db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        protected List<PackageInfo> getPackagesHoldingPermission(String perm, int userId) {
1417db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final PackageInfo p1 = new PackageInfo();
1427db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            p1.packageName = "sys_app1";
1437db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            p1.applicationInfo = new ApplicationInfo();
1447db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            p1.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
1457db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            return Arrays.asList(p1);
1467db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
147b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
148b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        @Override
1491682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov        protected List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int userId) {
150b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            final ResolveInfo sysApp1 = new ResolveInfo();
151b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            sysApp1.serviceInfo = new ServiceInfo();
152b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            sysApp1.serviceInfo.packageName = "sys_app1";
153b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            sysApp1.serviceInfo.name = "name";
1541682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov            sysApp1.serviceInfo.applicationInfo = new ApplicationInfo();
1551682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov            sysApp1.serviceInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
156b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            final ResolveInfo app4 = new ResolveInfo();
157b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            app4.serviceInfo = new ServiceInfo();
158b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            app4.serviceInfo.packageName = "app4";
159b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            app4.serviceInfo.name = "name";
1601682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov            app4.serviceInfo.applicationInfo = new ApplicationInfo();
1611682dad7ed303fc43a07e70d0bb5cb42103a7624Fyodor Kupolov            return Arrays.asList(sysApp1, app4);
162b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        }
1637db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
1647db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1657db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    private static void assertEqualsIgnoreOrder(List<String> expected, List<String> actual) {
1667db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertTrue("Lists not equal. Expected " + expected + " but was " + actual,
1677db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                (expected.size() == actual.size())
1687db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                        && (new HashSet<>(expected).equals(new HashSet<>(actual))));
1697db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
1707db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov}
171