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