• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5  * except in compliance with the License. You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11  * KIND, either express or implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */
14 
15 package com.android.settings.applications;
16 
17 import android.app.admin.DevicePolicyManager;
18 import android.content.Context;
19 import android.content.pm.ApplicationInfo;
20 import android.content.pm.IPackageManager;
21 import android.content.pm.PackageManager;
22 import android.os.Build;
23 import android.os.RemoteException;
24 import android.os.UserHandle;
25 
26 import com.android.settingslib.wrapper.PackageManagerWrapper;
27 
28 /**
29  * Counts installed apps across all users that have been granted one or more specific permissions by
30  * the admin.
31  */
32 public abstract class AppWithAdminGrantedPermissionsCounter extends AppCounter {
33 
34     private final String[] mPermissions;
35     private final IPackageManager mPackageManagerService;
36     private final DevicePolicyManager mDevicePolicyManager;
37 
AppWithAdminGrantedPermissionsCounter(Context context, String[] permissions, PackageManagerWrapper packageManager, IPackageManager packageManagerService, DevicePolicyManager devicePolicyManager)38     public AppWithAdminGrantedPermissionsCounter(Context context, String[] permissions,
39             PackageManagerWrapper packageManager, IPackageManager packageManagerService,
40             DevicePolicyManager devicePolicyManager) {
41         super(context, packageManager);
42         mPermissions = permissions;
43         mPackageManagerService = packageManagerService;
44         mDevicePolicyManager = devicePolicyManager;
45     }
46 
47     @Override
includeInCount(ApplicationInfo info)48     protected boolean includeInCount(ApplicationInfo info) {
49         return includeInCount(mPermissions, mDevicePolicyManager, mPm, mPackageManagerService,
50                 info);
51     }
52 
includeInCount(String[] permissions, DevicePolicyManager devicePolicyManager, PackageManagerWrapper packageManager, IPackageManager packageManagerService, ApplicationInfo info)53     public static boolean includeInCount(String[] permissions,
54             DevicePolicyManager devicePolicyManager, PackageManagerWrapper packageManager,
55             IPackageManager packageManagerService, ApplicationInfo info) {
56         if (info.targetSdkVersion >= Build.VERSION_CODES.M) {
57             // The app uses run-time permissions. Check whether one or more of the permissions were
58             // granted by enterprise policy.
59             for (final String permission : permissions) {
60                 if (devicePolicyManager.getPermissionGrantState(null /* admin */, info.packageName,
61                         permission) == DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED) {
62                     return true;
63                 }
64             }
65             return false;
66         }
67 
68         // The app uses install-time permissions. Check whether the app requested one or more of the
69         // permissions and was installed by enterprise policy, implicitly granting permissions.
70         if (packageManager.getInstallReason(info.packageName,
71                 new UserHandle(UserHandle.getUserId(info.uid)))
72                 != PackageManager.INSTALL_REASON_POLICY) {
73             return false;
74         }
75         try {
76             for (final String permission : permissions) {
77                 if (packageManagerService.checkUidPermission(permission, info.uid)
78                         == PackageManager.PERMISSION_GRANTED) {
79                     return true;
80                 }
81             }
82         } catch (RemoteException exception) {
83         }
84         return false;
85     }
86 }
87