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