ApplicationFeatureProviderImpl.java revision 01cfb9d8c54dd2c888cea15987e7644e8a78a3e0
1/* 2 * Copyright (C) 2016 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 17package com.android.settings.applications; 18 19import android.app.admin.DevicePolicyManager; 20import android.content.Context; 21import android.content.Intent; 22import android.content.pm.ComponentInfo; 23import android.content.pm.IPackageManager; 24import android.content.pm.PackageManager; 25import android.content.pm.ResolveInfo; 26import android.content.pm.UserInfo; 27import android.os.RemoteException; 28import android.os.UserManager; 29import android.util.ArraySet; 30 31import com.android.settingslib.wrapper.PackageManagerWrapper; 32 33import java.util.ArrayList; 34import java.util.List; 35import java.util.Set; 36 37public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvider { 38 39 private final Context mContext; 40 private final PackageManagerWrapper mPm; 41 private final IPackageManager mPms; 42 private final DevicePolicyManager mDpm; 43 private final UserManager mUm; 44 45 public ApplicationFeatureProviderImpl(Context context, PackageManagerWrapper pm, 46 IPackageManager pms, DevicePolicyManager dpm) { 47 mContext = context.getApplicationContext(); 48 mPm = pm; 49 mPms = pms; 50 mDpm = dpm; 51 mUm = UserManager.get(mContext); 52 } 53 54 @Override 55 public void calculateNumberOfPolicyInstalledApps(boolean async, NumberOfAppsCallback callback) { 56 final CurrentUserAndManagedProfilePolicyInstalledAppCounter counter = 57 new CurrentUserAndManagedProfilePolicyInstalledAppCounter(mContext, mPm, callback); 58 if (async) { 59 counter.execute(); 60 } else { 61 counter.executeInForeground(); 62 } 63 } 64 65 @Override 66 public void listPolicyInstalledApps(ListOfAppsCallback callback) { 67 final CurrentUserPolicyInstalledAppLister lister = 68 new CurrentUserPolicyInstalledAppLister(mPm, mUm, callback); 69 lister.execute(); 70 } 71 72 @Override 73 public void calculateNumberOfAppsWithAdminGrantedPermissions(String[] permissions, 74 boolean async, NumberOfAppsCallback callback) { 75 final CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter counter = 76 new CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter(mContext, 77 permissions, mPm, mPms, mDpm, callback); 78 if (async) { 79 counter.execute(); 80 } else { 81 counter.executeInForeground(); 82 } 83 } 84 85 @Override 86 public void listAppsWithAdminGrantedPermissions(String[] permissions, 87 ListOfAppsCallback callback) { 88 final CurrentUserAppWithAdminGrantedPermissionsLister lister = 89 new CurrentUserAppWithAdminGrantedPermissionsLister(permissions, mPm, mPms, mDpm, 90 mUm, callback); 91 lister.execute(); 92 } 93 94 @Override 95 public List<UserAppInfo> findPersistentPreferredActivities(int userId, Intent[] intents) { 96 final List<UserAppInfo> preferredActivities = new ArrayList<>(); 97 final Set<UserAppInfo> uniqueApps = new ArraySet<>(); 98 final UserInfo userInfo = mUm.getUserInfo(userId); 99 for (final Intent intent : intents) { 100 try { 101 final ResolveInfo resolveInfo = 102 mPms.findPersistentPreferredActivity(intent, userId); 103 if (resolveInfo != null) { 104 ComponentInfo componentInfo = null; 105 if (resolveInfo.activityInfo != null) { 106 componentInfo = resolveInfo.activityInfo; 107 } else if (resolveInfo.serviceInfo != null) { 108 componentInfo = resolveInfo.serviceInfo; 109 } else if (resolveInfo.providerInfo != null) { 110 componentInfo = resolveInfo.providerInfo; 111 } 112 if (componentInfo != null) { 113 UserAppInfo info = new UserAppInfo(userInfo, componentInfo.applicationInfo); 114 if (uniqueApps.add(info)) { 115 preferredActivities.add(info); 116 } 117 } 118 } 119 } catch (RemoteException exception) { 120 } 121 } 122 return preferredActivities; 123 } 124 125 @Override 126 public Set<String> getKeepEnabledPackages() { 127 return new ArraySet<>(); 128 } 129 130 private static class CurrentUserAndManagedProfilePolicyInstalledAppCounter 131 extends InstalledAppCounter { 132 private NumberOfAppsCallback mCallback; 133 134 CurrentUserAndManagedProfilePolicyInstalledAppCounter(Context context, 135 PackageManagerWrapper packageManager, NumberOfAppsCallback callback) { 136 super(context, PackageManager.INSTALL_REASON_POLICY, packageManager); 137 mCallback = callback; 138 } 139 140 @Override 141 protected void onCountComplete(int num) { 142 mCallback.onNumberOfAppsResult(num); 143 } 144 } 145 146 private static class CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter 147 extends AppWithAdminGrantedPermissionsCounter { 148 private NumberOfAppsCallback mCallback; 149 150 CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter(Context context, 151 String[] permissions, PackageManagerWrapper packageManager, 152 IPackageManager packageManagerService, 153 DevicePolicyManager devicePolicyManager, NumberOfAppsCallback callback) { 154 super(context, permissions, packageManager, packageManagerService, devicePolicyManager); 155 mCallback = callback; 156 } 157 158 @Override 159 protected void onCountComplete(int num) { 160 mCallback.onNumberOfAppsResult(num); 161 } 162 } 163 164 private static class CurrentUserPolicyInstalledAppLister extends InstalledAppLister { 165 private ListOfAppsCallback mCallback; 166 167 CurrentUserPolicyInstalledAppLister(PackageManagerWrapper packageManager, 168 UserManager userManager, ListOfAppsCallback callback) { 169 super(packageManager, userManager); 170 mCallback = callback; 171 } 172 173 @Override 174 protected void onAppListBuilt(List<UserAppInfo> list) { 175 mCallback.onListOfAppsResult(list); 176 } 177 } 178 179 private static class CurrentUserAppWithAdminGrantedPermissionsLister extends 180 AppWithAdminGrantedPermissionsLister { 181 private ListOfAppsCallback mCallback; 182 183 CurrentUserAppWithAdminGrantedPermissionsLister(String[] permissions, 184 PackageManagerWrapper packageManager, IPackageManager packageManagerService, 185 DevicePolicyManager devicePolicyManager, UserManager userManager, 186 ListOfAppsCallback callback) { 187 super(permissions, packageManager, packageManagerService, devicePolicyManager, 188 userManager); 189 mCallback = callback; 190 } 191 192 @Override 193 protected void onAppListBuilt(List<UserAppInfo> list) { 194 mCallback.onListOfAppsResult(list); 195 } 196 } 197 198} 199