AppsQueryHelperTests.java revision b3b4f61525a3547920d642841202730f3cb16151
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();
367db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        mAppsQueryHelper = new AppsQueryHelperTestable(getContext());
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
81b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov    public void testQueryAppsDefaultIme() {
82b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        // Test query default system IMEs
83b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        List<String> apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_DEFAULT_IMES,
84b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov                true, UserHandle.of(UserHandle.myUserId()));
85b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1"), apps);
86b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
87b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        // Test query default IMEs
88b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        apps = mAppsQueryHelper.queryApps(AppsQueryHelper.GET_DEFAULT_IMES, false,
89b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov                UserHandle.of(UserHandle.myUserId()));
90b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        assertEqualsIgnoreOrder(Arrays.asList("sys_app1", "app4"), apps);
91b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
92b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        // Test that GET_DEFAULT_IMES cannot be used with a user id different from current process
93b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        try {
94b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            mAppsQueryHelper.queryApps(AppsQueryHelper.GET_DEFAULT_IMES, false,
95b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov                    UserHandle.of(UserHandle.USER_NULL));
96b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            fail("queryApps must fail if wrong user was passed");
97b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        } catch (IllegalArgumentException e) {
98b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            // OK
99b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        }
100b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov    }
101b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
1027db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    private class AppsQueryHelperTestable extends AppsQueryHelper {
1037db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1047db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        public AppsQueryHelperTestable(Context context) {
1057db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            super(context);
1067db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
1077db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1087db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        @Override
1097db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        protected List<ApplicationInfo> getAllApps(int userId) {
1107db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai1 = new ApplicationInfo();
1117db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai1.flags |= ApplicationInfo.FLAG_SYSTEM;
1127db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai1.packageName = "sys_app1";
1137db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai2 = new ApplicationInfo();
1147db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai2.flags |= ApplicationInfo.FLAG_SYSTEM;
1157db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai2.packageName = "sys_app2";
1167db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai2.flags |= ApplicationInfo.FLAG_SYSTEM;
1177db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai3 = new ApplicationInfo();
1187db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai3.packageName = "sys_app3";
1197db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai3.flags |= ApplicationInfo.FLAG_SYSTEM;
1207db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ApplicationInfo ai4 = new ApplicationInfo();
1217db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            ai4.packageName = "app4";
1227db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            return Arrays.asList(ai1, ai2, ai3, ai4);
1237db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
1247db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1257db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        @Override
1267db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        protected List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int userId) {
1277db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            assertEquals(Intent.CATEGORY_LAUNCHER, intent.getCategories().iterator().next());
1287db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ResolveInfo r2 = new ResolveInfo();
1297db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r2.activityInfo = new ActivityInfo();
1307db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r2.activityInfo.packageName = "sys_app2";
1317db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r2.activityInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
1327db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final ResolveInfo r4 = new ResolveInfo();
1337db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r4.activityInfo = new ActivityInfo();
1347db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            r4.activityInfo.packageName = "app4";
1357db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            return Arrays.asList(r2, r4);
1367db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
1377db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1387db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        @Override
1397db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        protected List<PackageInfo> getPackagesHoldingPermission(String perm, int userId) {
1407db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            final PackageInfo p1 = new PackageInfo();
1417db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            p1.packageName = "sys_app1";
1427db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            p1.applicationInfo = new ApplicationInfo();
1437db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            p1.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
1447db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov            return Arrays.asList(p1);
1457db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        }
146b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov
147b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        @Override
148b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        protected List<InputMethodInfo> getInputMethodList() {
149b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            final ResolveInfo sysApp1 = new ResolveInfo();
150b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            sysApp1.serviceInfo = new ServiceInfo();
151b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            sysApp1.serviceInfo.packageName = "sys_app1";
152b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            sysApp1.serviceInfo.name = "name";
153b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            InputMethodInfo imi1 = new InputMethodInfo(sysApp1, false, null, null, 0, true);
154b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            final ResolveInfo app4 = new ResolveInfo();
155b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            app4.serviceInfo = new ServiceInfo();
156b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            app4.serviceInfo.packageName = "app4";
157b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            app4.serviceInfo.name = "name";
158b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            InputMethodInfo imi2 = new InputMethodInfo(app4, false, null, null, 0, true);
159b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov            return Arrays.asList(imi1, imi2);
160b3b4f61525a3547920d642841202730f3cb16151Fyodor Kupolov        }
1617db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
1627db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov
1637db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    private static void assertEqualsIgnoreOrder(List<String> expected, List<String> actual) {
1647db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov        assertTrue("Lists not equal. Expected " + expected + " but was " + actual,
1657db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                (expected.size() == actual.size())
1667db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov                        && (new HashSet<>(expected).equals(new HashSet<>(actual))));
1677db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov    }
1687db5af124e551554f7a2f1abdd2a486c937910feFyodor Kupolov}
169