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 17 package android.content.pm; 18 19 import android.content.Context; 20 import android.content.Intent; 21 import android.os.UserHandle; 22 import android.test.AndroidTestCase; 23 import android.view.inputmethod.InputMethodInfo; 24 25 import java.util.Arrays; 26 import java.util.HashSet; 27 import java.util.List; 28 29 public 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