Home | History | Annotate | Download | only in pm
      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