blob: f97dd3b680bb0273e3846c31c4fd58906d7f7baf [file] [log] [blame]
Todd Kennedy82b08422017-09-28 13:32:05 -07001/*
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
17package com.android.server.pm.permission;
18
Jeff Sharkey0095a822018-02-15 13:06:53 -070019import static android.os.Process.FIRST_APPLICATION_UID;
Todd Kennedy7c4c55d2017-11-02 10:01:39 -070020
Todd Kennedy82b08422017-09-28 13:32:05 -070021import android.Manifest;
22import android.annotation.NonNull;
Todd Kennedy0eb97382017-10-03 16:57:22 -070023import android.annotation.Nullable;
Todd Kennedy82b08422017-09-28 13:32:05 -070024import android.app.ActivityManager;
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -070025import android.app.AppOpsManager;
Todd Kennedy82b08422017-09-28 13:32:05 -070026import android.app.DownloadManager;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000027import android.app.SearchManager;
Todd Kennedy82b08422017-09-28 13:32:05 -070028import android.app.admin.DevicePolicyManager;
29import android.companion.CompanionDeviceManager;
30import android.content.Context;
31import android.content.Intent;
Todd Kennedy82b08422017-09-28 13:32:05 -070032import android.content.pm.ApplicationInfo;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000033import android.content.pm.PackageInfo;
Todd Kennedy82b08422017-09-28 13:32:05 -070034import android.content.pm.PackageManager;
Jeff Sharkey7a807602018-10-18 13:21:55 -060035import android.content.pm.PackageManager.NameNotFoundException;
Todd Kennedy82b08422017-09-28 13:32:05 -070036import android.content.pm.PackageManagerInternal;
Jeff Sharkey0095a822018-02-15 13:06:53 -070037import android.content.pm.PackageManagerInternal.PackagesProvider;
38import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
Jeff Sharkey7a807602018-10-18 13:21:55 -060039import android.content.pm.PermissionInfo;
Todd Kennedy82b08422017-09-28 13:32:05 -070040import android.content.pm.ProviderInfo;
41import android.content.pm.ResolveInfo;
42import android.media.RingtoneManager;
43import android.net.Uri;
Todd Kennedy82b08422017-09-28 13:32:05 -070044import android.os.Build;
45import android.os.Environment;
46import android.os.Handler;
47import android.os.Looper;
48import android.os.Message;
49import android.os.UserHandle;
50import android.os.storage.StorageManager;
Philip P. Moltmann039678e2018-09-18 13:04:38 -070051import android.permission.PermissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -070052import android.print.PrintManager;
53import android.provider.CalendarContract;
54import android.provider.ContactsContract;
55import android.provider.MediaStore;
56import android.provider.Telephony.Sms.Intents;
Todd Kennedy82b08422017-09-28 13:32:05 -070057import android.security.Credentials;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000058import android.speech.RecognitionService;
Jeff Sharkey0095a822018-02-15 13:06:53 -070059import android.telephony.TelephonyManager;
Ye Wen8e8b2d52018-03-14 11:48:24 -070060import android.text.TextUtils;
Todd Kennedy82b08422017-09-28 13:32:05 -070061import android.util.ArrayMap;
62import android.util.ArraySet;
63import android.util.Log;
64import android.util.Slog;
65import android.util.Xml;
Jeff Sharkey0095a822018-02-15 13:06:53 -070066
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000067import com.android.internal.util.ArrayUtils;
Todd Kennedy82b08422017-09-28 13:32:05 -070068import com.android.internal.util.XmlUtils;
69import com.android.server.LocalServices;
Todd Kennedy82b08422017-09-28 13:32:05 -070070
71import org.xmlpull.v1.XmlPullParser;
72import org.xmlpull.v1.XmlPullParserException;
73
74import java.io.BufferedInputStream;
75import java.io.File;
76import java.io.FileInputStream;
77import java.io.IOException;
78import java.io.InputStream;
79import java.util.ArrayList;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000080import java.util.Arrays;
Todd Kennedy82b08422017-09-28 13:32:05 -070081import java.util.Collections;
82import java.util.List;
83import java.util.Map;
84import java.util.Set;
85
Todd Kennedy82b08422017-09-28 13:32:05 -070086/**
87 * This class is the policy for granting runtime permissions to
88 * platform components and default handlers in the system such
89 * that the device is usable out-of-the-box. For example, the
90 * shell UID is a part of the system and the Phone app should
91 * have phone related permission by default.
92 * <p>
93 * NOTE: This class is at the wrong abstraction level. It is a part of the package manager
94 * service but knows about lots of higher level subsystems. The correct way to do this is
95 * to have an interface defined in the package manager but have the impl next to other
96 * policy stuff like PhoneWindowManager
97 */
98public final class DefaultPermissionGrantPolicy {
99 private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
100 private static final boolean DEBUG = false;
101
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000102 @PackageManager.ResolveInfoFlags
103 private static final int DEFAULT_INTENT_QUERY_FLAGS =
Todd Kennedy82b08422017-09-28 13:32:05 -0700104 PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
105 | PackageManager.MATCH_UNINSTALLED_PACKAGES;
106
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000107 @PackageManager.PackageInfoFlags
108 private static final int DEFAULT_PACKAGE_INFO_QUERY_FLAGS =
109 PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS;
110
Todd Kennedy82b08422017-09-28 13:32:05 -0700111 private static final String AUDIO_MIME_TYPE = "audio/mpeg";
112
113 private static final String TAG_EXCEPTIONS = "exceptions";
114 private static final String TAG_EXCEPTION = "exception";
115 private static final String TAG_PERMISSION = "permission";
116 private static final String ATTR_PACKAGE = "package";
117 private static final String ATTR_NAME = "name";
118 private static final String ATTR_FIXED = "fixed";
119
120 private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000121
122
Todd Kennedy82b08422017-09-28 13:32:05 -0700123 static {
124 PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
125 PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
126 PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
127 PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
128 PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
129 PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
130 PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
131 }
132
133 private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>();
134 static {
135 CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
136 CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
137 CONTACTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
138 }
139
140 private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>();
141 static {
142 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
143 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
144 }
145
Calvin On5eda9dd2018-12-12 15:43:28 -0800146 private static final Set<String> ALWAYS_LOCATION_PERMISSIONS = new ArraySet<>();
147 static {
148 ALWAYS_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
149 ALWAYS_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
150 ALWAYS_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
151 }
152
Zimuzo5ac1eb92018-11-29 12:51:14 +0000153 private static final Set<String> ACTIVITY_RECOGNITION_PERMISSIONS = new ArraySet<>();
154 static {
155 ACTIVITY_RECOGNITION_PERMISSIONS.add(Manifest.permission.ACTIVITY_RECOGNITION);
156 }
157
Todd Kennedy82b08422017-09-28 13:32:05 -0700158 private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
159 static {
160 CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
161 CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR);
162 }
163
164 private static final Set<String> SMS_PERMISSIONS = new ArraySet<>();
165 static {
166 SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS);
167 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS);
168 SMS_PERMISSIONS.add(Manifest.permission.READ_SMS);
169 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH);
170 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS);
171 SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS);
172 }
173
174 private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>();
175 static {
176 MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
177 }
178
179 private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>();
180 static {
181 CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA);
182 }
183
184 private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>();
185 static {
186 SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
187 }
188
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600189 @Deprecated
Todd Kennedy82b08422017-09-28 13:32:05 -0700190 private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
191 static {
Jeff Sharkeyb1629092018-08-24 10:33:12 -0600192 // STOPSHIP(b/112545973): remove once feature enabled by default
Jeff Sharkey10ec9d82018-11-28 14:52:45 -0700193 if (!StorageManager.hasIsolatedStorage()) {
Jeff Sharkeyb1629092018-08-24 10:33:12 -0600194 STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
195 STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
196 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700197 }
198
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600199 private static final Set<String> MEDIA_AURAL_PERMISSIONS = new ArraySet<>();
200 static {
201 // STOPSHIP(b/112545973): remove once feature enabled by default
Jeff Sharkey10ec9d82018-11-28 14:52:45 -0700202 if (StorageManager.hasIsolatedStorage()) {
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600203 MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO);
Jeff Sharkey62078972019-02-20 18:10:01 -0700204
205 // STOPSHIP(b/124466734): remove these manual grants once the legacy
206 // permission logic is unified with PermissionController
207 MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
208 MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600209 }
210 }
211
212 private static final Set<String> MEDIA_VISUAL_PERMISSIONS = new ArraySet<>();
213 static {
214 // STOPSHIP(b/112545973): remove once feature enabled by default
Jeff Sharkey10ec9d82018-11-28 14:52:45 -0700215 if (StorageManager.hasIsolatedStorage()) {
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600216 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO);
Jeff Sharkey9787a9452018-11-18 17:53:02 -0700217 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES);
Jeff Sharkey62078972019-02-20 18:10:01 -0700218
219 // STOPSHIP(b/124466734): remove these manual grants once the legacy
220 // permission logic is unified with PermissionController
221 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
222 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600223 }
224 }
225
Todd Kennedy82b08422017-09-28 13:32:05 -0700226 private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
227
228 private static final String ACTION_TRACK = "com.android.fitness.TRACK";
229
230 private final Handler mHandler;
231
232 private PackagesProvider mLocationPackagesProvider;
Wei Wangffb94e62019-01-14 00:05:45 -0800233 private PackagesProvider mLocationExtraPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700234 private PackagesProvider mVoiceInteractionPackagesProvider;
235 private PackagesProvider mSmsAppPackagesProvider;
236 private PackagesProvider mDialerAppPackagesProvider;
237 private PackagesProvider mSimCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800238 private PackagesProvider mUseOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700239 private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
240
241 private ArrayMap<String, List<DefaultPermissionGrant>> mGrantExceptions;
242 private final Context mContext;
243 private final Object mLock = new Object();
244 private final PackageManagerInternal mServiceInternal;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700245 private final PermissionManagerService mPermissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -0700246 private final DefaultPermissionGrantedCallback mPermissionGrantedCallback;
247 public interface DefaultPermissionGrantedCallback {
248 /** Callback when permissions have been granted */
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000249 void onDefaultRuntimePermissionsGranted(int userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700250 }
251
252 public DefaultPermissionGrantPolicy(Context context, Looper looper,
Todd Kennedy0eb97382017-10-03 16:57:22 -0700253 @Nullable DefaultPermissionGrantedCallback callback,
254 @NonNull PermissionManagerService permissionManager) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700255 mContext = context;
256 mHandler = new Handler(looper) {
257 @Override
258 public void handleMessage(Message msg) {
259 if (msg.what == MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS) {
260 synchronized (mLock) {
261 if (mGrantExceptions == null) {
262 mGrantExceptions = readDefaultPermissionExceptionsLocked();
263 }
264 }
265 }
266 }
267 };
268 mPermissionGrantedCallback = callback;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700269 mPermissionManager = permissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -0700270 mServiceInternal = LocalServices.getService(PackageManagerInternal.class);
271 }
272
273 public void setLocationPackagesProvider(PackagesProvider provider) {
274 synchronized (mLock) {
275 mLocationPackagesProvider = provider;
276 }
277 }
278
Wei Wangffb94e62019-01-14 00:05:45 -0800279 /** Sets the provider for loction extra packages. */
280 public void setLocationExtraPackagesProvider(PackagesProvider provider) {
281 synchronized (mLock) {
282 mLocationExtraPackagesProvider = provider;
283 }
284 }
285
Todd Kennedy82b08422017-09-28 13:32:05 -0700286 public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
287 synchronized (mLock) {
288 mVoiceInteractionPackagesProvider = provider;
289 }
290 }
291
292 public void setSmsAppPackagesProvider(PackagesProvider provider) {
293 synchronized (mLock) {
294 mSmsAppPackagesProvider = provider;
295 }
296 }
297
298 public void setDialerAppPackagesProvider(PackagesProvider provider) {
299 synchronized (mLock) {
300 mDialerAppPackagesProvider = provider;
301 }
302 }
303
304 public void setSimCallManagerPackagesProvider(PackagesProvider provider) {
305 synchronized (mLock) {
306 mSimCallManagerPackagesProvider = provider;
307 }
308 }
309
Eric Enslen1e423b92017-12-18 11:30:21 -0800310 public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
311 synchronized (mLock) {
312 mUseOpenWifiAppPackagesProvider = provider;
313 }
314 }
315
Todd Kennedy82b08422017-09-28 13:32:05 -0700316 public void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider) {
317 synchronized (mLock) {
318 mSyncAdapterPackagesProvider = provider;
319 }
320 }
321
Todd Kennedy42d61602017-12-12 14:44:19 -0800322 public void grantDefaultPermissions(int userId) {
Ralph Nathanbd111582018-03-21 14:53:23 -0700323 grantPermissionsToSysComponentsAndPrivApps(userId);
324 grantDefaultSystemHandlerPermissions(userId);
325 grantDefaultPermissionExceptions(userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700326 }
327
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000328 private void grantRuntimePermissionsForSystemPackage(int userId, PackageInfo pkg) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700329 Set<String> permissions = new ArraySet<>();
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000330 for (String permission : pkg.requestedPermissions) {
Todd Kennedy0eb97382017-10-03 16:57:22 -0700331 final BasePermission bp = mPermissionManager.getPermission(permission);
332 if (bp == null) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700333 continue;
334 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700335 if (bp.isRuntime()) {
336 permissions.add(permission);
337 }
338 }
339 if (!permissions.isEmpty()) {
340 grantRuntimePermissions(pkg, permissions, true, userId);
341 }
342 }
343
Todd Kennedy82b08422017-09-28 13:32:05 -0700344 public void scheduleReadDefaultPermissionExceptions() {
345 mHandler.sendEmptyMessage(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
346 }
347
Todd Kennedy42d61602017-12-12 14:44:19 -0800348 private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700349 Log.i(TAG, "Granting permissions to platform components for user " + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000350 List<PackageInfo> packages = mContext.getPackageManager().getInstalledPackagesAsUser(
351 DEFAULT_PACKAGE_INFO_QUERY_FLAGS, UserHandle.USER_SYSTEM);
352 for (PackageInfo pkg : packages) {
Todd Kennedy42d61602017-12-12 14:44:19 -0800353 if (pkg == null) {
354 continue;
355 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700356 if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg)
357 || !doesPackageSupportRuntimePermissions(pkg)
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000358 || ArrayUtils.isEmpty(pkg.requestedPermissions)) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700359 continue;
360 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000361 grantRuntimePermissionsForSystemPackage(userId, pkg);
362 }
363 }
364
365 @SafeVarargs
366 private final void grantIgnoringSystemPackage(String packageName, int userId,
367 Set<String>... permissionGroups) {
Eugene Suslae4240e72018-11-02 10:58:11 -0700368 grantPermissionsToPackage(
369 packageName, userId, true /* ignoreSystemPackage */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000370 }
371
372 @SafeVarargs
373 private final void grantSystemFixedPermissionsToSystemPackage(String packageName, int userId,
374 Set<String>... permissionGroups) {
Eugene Suslae4240e72018-11-02 10:58:11 -0700375 grantPermissionsToSystemPackage(
376 packageName, userId, true /* systemFixed */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000377 }
378
379 @SafeVarargs
380 private final void grantPermissionsToSystemPackage(
381 String packageName, int userId, Set<String>... permissionGroups) {
Eugene Suslae4240e72018-11-02 10:58:11 -0700382 grantPermissionsToSystemPackage(
383 packageName, userId, false /* systemFixed */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000384 }
385
386 @SafeVarargs
387 private final void grantPermissionsToSystemPackage(String packageName, int userId,
Eugene Suslae4240e72018-11-02 10:58:11 -0700388 boolean systemFixed, Set<String>... permissionGroups) {
389 if (!isSystemPackage(packageName)) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000390 return;
391 }
Eugene Suslae4240e72018-11-02 10:58:11 -0700392 grantPermissionsToPackage(getSystemPackageInfo(packageName),
393 userId, systemFixed, false /* ignoreSystemPackage */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000394 }
395
396 @SafeVarargs
Eugene Suslae4240e72018-11-02 10:58:11 -0700397 private final void grantPermissionsToPackage(String packageName, int userId,
398 boolean ignoreSystemPackage, Set<String>... permissionGroups) {
399 grantPermissionsToPackage(getPackageInfo(packageName),
400 userId, false /* systemFixed */, ignoreSystemPackage, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000401 }
402
403 @SafeVarargs
Eugene Suslae4240e72018-11-02 10:58:11 -0700404 private final void grantPermissionsToPackage(PackageInfo packageName, int userId,
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000405 boolean systemFixed, boolean ignoreSystemPackage, Set<String>... permissionGroups) {
406 if (packageName == null) return;
407 if (doesPackageSupportRuntimePermissions(packageName)) {
408 for (Set<String> permissionGroup : permissionGroups) {
409 grantRuntimePermissions(packageName, permissionGroup, systemFixed,
410 ignoreSystemPackage, userId);
411 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700412 }
413 }
414
415 private void grantDefaultSystemHandlerPermissions(int userId) {
416 Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
417
418 final PackagesProvider locationPackagesProvider;
Wei Wangffb94e62019-01-14 00:05:45 -0800419 final PackagesProvider locationExtraPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700420 final PackagesProvider voiceInteractionPackagesProvider;
421 final PackagesProvider smsAppPackagesProvider;
422 final PackagesProvider dialerAppPackagesProvider;
423 final PackagesProvider simCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800424 final PackagesProvider useOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700425 final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
426
427 synchronized (mLock) {
428 locationPackagesProvider = mLocationPackagesProvider;
Wei Wangffb94e62019-01-14 00:05:45 -0800429 locationExtraPackagesProvider = mLocationExtraPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700430 voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
431 smsAppPackagesProvider = mSmsAppPackagesProvider;
432 dialerAppPackagesProvider = mDialerAppPackagesProvider;
433 simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800434 useOpenWifiAppPackagesProvider = mUseOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700435 syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
436 }
437
438 String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
439 ? voiceInteractionPackagesProvider.getPackages(userId) : null;
440 String[] locationPackageNames = (locationPackagesProvider != null)
441 ? locationPackagesProvider.getPackages(userId) : null;
Wei Wangffb94e62019-01-14 00:05:45 -0800442 String[] locationExtraPackageNames = (locationExtraPackagesProvider != null)
443 ? locationExtraPackagesProvider.getPackages(userId) : null;
Todd Kennedy82b08422017-09-28 13:32:05 -0700444 String[] smsAppPackageNames = (smsAppPackagesProvider != null)
445 ? smsAppPackagesProvider.getPackages(userId) : null;
446 String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
447 ? dialerAppPackagesProvider.getPackages(userId) : null;
448 String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
449 ? simCallManagerPackagesProvider.getPackages(userId) : null;
Eric Enslen1e423b92017-12-18 11:30:21 -0800450 String[] useOpenWifiAppPackageNames = (useOpenWifiAppPackagesProvider != null)
451 ? useOpenWifiAppPackagesProvider.getPackages(userId) : null;
Todd Kennedy82b08422017-09-28 13:32:05 -0700452 String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
453 syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
454 String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
455 syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
456
457 // Installer
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000458 grantSystemFixedPermissionsToSystemPackage(
459 getKnownPackage(PackageManagerInternal.PACKAGE_INSTALLER, userId),
460 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700461
462 // Verifier
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000463 final String verifier = getKnownPackage(PackageManagerInternal.PACKAGE_VERIFIER, userId);
464 grantSystemFixedPermissionsToSystemPackage(verifier, userId, STORAGE_PERMISSIONS);
465 grantPermissionsToSystemPackage(verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700466
467 // SetupWizard
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000468 grantPermissionsToSystemPackage(
469 getKnownPackage(PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId), userId,
470 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, LOCATION_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700471
472 // Camera
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000473 grantPermissionsToSystemPackage(
474 getDefaultSystemHandlerActivityPackage(MediaStore.ACTION_IMAGE_CAPTURE, userId),
475 userId, CAMERA_PERMISSIONS, MICROPHONE_PERMISSIONS, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700476
477 // Media provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000478 grantSystemFixedPermissionsToSystemPackage(
479 getDefaultProviderAuthorityPackage(MediaStore.AUTHORITY, userId), userId,
480 STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS, MEDIA_VISUAL_PERMISSIONS,
481 PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700482
483 // Downloads provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000484 grantSystemFixedPermissionsToSystemPackage(
485 getDefaultProviderAuthorityPackage("downloads", userId), userId,
486 STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700487
488 // Downloads UI
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000489 grantSystemFixedPermissionsToSystemPackage(
490 getDefaultSystemHandlerActivityPackage(
491 DownloadManager.ACTION_VIEW_DOWNLOADS, userId),
492 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700493
494 // Storage provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000495 grantSystemFixedPermissionsToSystemPackage(
496 getDefaultProviderAuthorityPackage("com.android.externalstorage.documents", userId),
497 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700498
499 // CertInstaller
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000500 grantSystemFixedPermissionsToSystemPackage(
501 getDefaultSystemHandlerActivityPackage(Credentials.INSTALL_ACTION, userId), userId,
502 STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700503
504 // Dialer
505 if (dialerAppPackageNames == null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000506 String dialerPackage =
507 getDefaultSystemHandlerActivityPackage(Intent.ACTION_DIAL, userId);
508 grantDefaultPermissionsToDefaultSystemDialerApp(dialerPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700509 } else {
510 for (String dialerAppPackageName : dialerAppPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000511 grantDefaultPermissionsToDefaultSystemDialerApp(dialerAppPackageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700512 }
513 }
514
515 // Sim call manager
516 if (simCallManagerPackageNames != null) {
517 for (String simCallManagerPackageName : simCallManagerPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000518 grantDefaultPermissionsToDefaultSystemSimCallManager(
519 simCallManagerPackageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700520 }
521 }
522
Eric Enslen1e423b92017-12-18 11:30:21 -0800523 // Use Open Wifi
524 if (useOpenWifiAppPackageNames != null) {
525 for (String useOpenWifiPackageName : useOpenWifiAppPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000526 grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(
527 useOpenWifiPackageName, userId);
Eric Enslen1e423b92017-12-18 11:30:21 -0800528 }
529 }
530
Todd Kennedy82b08422017-09-28 13:32:05 -0700531 // SMS
532 if (smsAppPackageNames == null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000533 String smsPackage = getDefaultSystemHandlerActivityPackageForCategory(
534 Intent.CATEGORY_APP_MESSAGING, userId);
535 grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700536 } else {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000537 for (String smsPackage : smsAppPackageNames) {
538 grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700539 }
540 }
541
542 // Cell Broadcast Receiver
Edward Savage-Jonesf3979b82018-10-15 09:38:53 +0200543 grantSystemFixedPermissionsToSystemPackage(
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000544 getDefaultSystemHandlerActivityPackage(Intents.SMS_CB_RECEIVED_ACTION, userId),
545 userId, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700546
547 // Carrier Provisioning Service
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000548 grantPermissionsToSystemPackage(
549 getDefaultSystemHandlerServicePackage(Intents.SMS_CARRIER_PROVISION_ACTION, userId),
550 userId, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700551
552 // Calendar
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000553 grantPermissionsToSystemPackage(
554 getDefaultSystemHandlerActivityPackageForCategory(
555 Intent.CATEGORY_APP_CALENDAR, userId),
556 userId, CALENDAR_PERMISSIONS, CONTACTS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700557
558 // Calendar provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000559 String calendarProvider =
560 getDefaultProviderAuthorityPackage(CalendarContract.AUTHORITY, userId);
561 grantPermissionsToSystemPackage(calendarProvider, userId,
562 CONTACTS_PERMISSIONS, STORAGE_PERMISSIONS);
563 grantSystemFixedPermissionsToSystemPackage(calendarProvider, userId, CALENDAR_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700564
565 // Calendar provider sync adapters
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000566 grantPermissionToEachSystemPackage(
567 getHeadlessSyncAdapterPackages(calendarSyncAdapterPackages, userId),
568 userId, CALENDAR_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000569
570 // Contacts
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000571 grantPermissionsToSystemPackage(
572 getDefaultSystemHandlerActivityPackageForCategory(
573 Intent.CATEGORY_APP_CONTACTS, userId),
574 userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000575
576 // Contacts provider sync adapters
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000577 grantPermissionToEachSystemPackage(
578 getHeadlessSyncAdapterPackages(contactsSyncAdapterPackages, userId),
579 userId, CONTACTS_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000580
581 // Contacts provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000582 String contactsProviderPackage =
583 getDefaultProviderAuthorityPackage(ContactsContract.AUTHORITY, userId);
584 grantSystemFixedPermissionsToSystemPackage(contactsProviderPackage, userId,
585 CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
586 grantPermissionsToSystemPackage(contactsProviderPackage, userId, STORAGE_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000587
588 // Device provisioning
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000589 grantPermissionsToSystemPackage(
590 getDefaultSystemHandlerActivityPackage(
591 DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, userId),
592 userId, CONTACTS_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000593
594 // Maps
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000595 grantPermissionsToSystemPackage(
596 getDefaultSystemHandlerActivityPackageForCategory(Intent.CATEGORY_APP_MAPS, userId),
597 userId, LOCATION_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000598
599 // Gallery
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000600 grantPermissionsToSystemPackage(
601 getDefaultSystemHandlerActivityPackageForCategory(
602 Intent.CATEGORY_APP_GALLERY, userId),
603 userId, STORAGE_PERMISSIONS, MEDIA_VISUAL_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000604
605 // Email
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000606 grantPermissionsToSystemPackage(
607 getDefaultSystemHandlerActivityPackageForCategory(
608 Intent.CATEGORY_APP_EMAIL, userId),
609 userId, CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000610
611 // Browser
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000612 String browserPackage = getKnownPackage(PackageManagerInternal.PACKAGE_BROWSER, userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000613 if (browserPackage == null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000614 browserPackage = getDefaultSystemHandlerActivityPackageForCategory(
615 Intent.CATEGORY_APP_BROWSER, userId);
616 if (!isSystemPackage(browserPackage)) {
617 browserPackage = null;
618 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000619 }
Eugene Suslae4240e72018-11-02 10:58:11 -0700620 grantPermissionsToPackage(browserPackage, userId,
621 false /* ignoreSystemPackage */, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700622
623 // Voice interaction
624 if (voiceInteractPackageNames != null) {
625 for (String voiceInteractPackageName : voiceInteractPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000626 grantPermissionsToSystemPackage(voiceInteractPackageName, userId,
627 CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS,
628 PHONE_PERMISSIONS, SMS_PERMISSIONS, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700629 }
630 }
631
632 if (ActivityManager.isLowRamDeviceStatic()) {
633 // Allow voice search on low-ram devices
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000634 grantPermissionsToSystemPackage(
635 getDefaultSystemHandlerActivityPackage(
636 SearchManager.INTENT_ACTION_GLOBAL_SEARCH, userId),
637 userId, MICROPHONE_PERMISSIONS, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700638 }
639
640 // Voice recognition
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000641 Intent voiceRecoIntent = new Intent(RecognitionService.SERVICE_INTERFACE)
642 .addCategory(Intent.CATEGORY_DEFAULT);
643 grantPermissionsToSystemPackage(
644 getDefaultSystemHandlerServicePackage(voiceRecoIntent, userId), userId,
645 MICROPHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700646
647 // Location
648 if (locationPackageNames != null) {
649 for (String packageName : locationPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000650 grantPermissionsToSystemPackage(packageName, userId,
651 CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS,
652 PHONE_PERMISSIONS, SMS_PERMISSIONS, CAMERA_PERMISSIONS,
Jeff Sharkey62078972019-02-20 18:10:01 -0700653 SENSORS_PERMISSIONS, STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000654 grantSystemFixedPermissionsToSystemPackage(packageName, userId,
Soonil Nagarkar9f48f212019-03-07 11:15:12 -0800655 ALWAYS_LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700656 }
657 }
Wei Wangffb94e62019-01-14 00:05:45 -0800658 if (locationExtraPackageNames != null) {
659 // Also grant location permission to location extra packages.
660 for (String packageName : locationExtraPackageNames) {
Soonil Nagarkar9f48f212019-03-07 11:15:12 -0800661 grantPermissionsToSystemPackage(packageName, userId, ALWAYS_LOCATION_PERMISSIONS);
Wei Wangffb94e62019-01-14 00:05:45 -0800662 }
663 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700664
665 // Music
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000666 Intent musicIntent = new Intent(Intent.ACTION_VIEW)
667 .addCategory(Intent.CATEGORY_DEFAULT)
668 .setDataAndType(Uri.fromFile(new File("foo.mp3")), AUDIO_MIME_TYPE);
669 grantPermissionsToSystemPackage(
670 getDefaultSystemHandlerActivityPackage(musicIntent, userId), userId,
671 STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700672
673 // Home
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000674 Intent homeIntent = new Intent(Intent.ACTION_MAIN)
675 .addCategory(Intent.CATEGORY_HOME)
676 .addCategory(Intent.CATEGORY_LAUNCHER_APP);
677 grantPermissionsToSystemPackage(
678 getDefaultSystemHandlerActivityPackage(homeIntent, userId), userId,
679 LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700680
681 // Watches
682 if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) {
683 // Home application on watches
Todd Kennedy82b08422017-09-28 13:32:05 -0700684
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000685 String wearPackage = getDefaultSystemHandlerActivityPackageForCategory(
686 Intent.CATEGORY_HOME_MAIN, userId);
687 grantPermissionsToSystemPackage(wearPackage, userId,
688 CONTACTS_PERMISSIONS, MICROPHONE_PERMISSIONS, LOCATION_PERMISSIONS);
689 grantSystemFixedPermissionsToSystemPackage(wearPackage, userId, PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700690
691 // Fitness tracking on watches
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000692 grantPermissionsToSystemPackage(
693 getDefaultSystemHandlerActivityPackage(ACTION_TRACK, userId), userId,
694 SENSORS_PERMISSIONS, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700695 }
696
697 // Print Spooler
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000698 grantSystemFixedPermissionsToSystemPackage(PrintManager.PRINT_SPOOLER_PACKAGE_NAME, userId,
699 LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700700
701 // EmergencyInfo
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000702 grantSystemFixedPermissionsToSystemPackage(
703 getDefaultSystemHandlerActivityPackage(
704 TelephonyManager.ACTION_EMERGENCY_ASSISTANCE, userId),
705 userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700706
707 // NFC Tag viewer
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000708 Intent nfcTagIntent = new Intent(Intent.ACTION_VIEW)
709 .setType("vnd.android.cursor.item/ndef_msg");
710 grantPermissionsToSystemPackage(
711 getDefaultSystemHandlerActivityPackage(nfcTagIntent, userId), userId,
712 CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700713
714 // Storage Manager
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000715 grantSystemFixedPermissionsToSystemPackage(
716 getDefaultSystemHandlerActivityPackage(
717 StorageManager.ACTION_MANAGE_STORAGE, userId),
718 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700719
720 // Companion devices
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000721 grantSystemFixedPermissionsToSystemPackage(
722 CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME, userId,
Calvin On5eda9dd2018-12-12 15:43:28 -0800723 ALWAYS_LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700724
725 // Ringtone Picker
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000726 grantSystemFixedPermissionsToSystemPackage(
727 getDefaultSystemHandlerActivityPackage(
728 RingtoneManager.ACTION_RINGTONE_PICKER, userId),
Jeff Sharkey55a17dc2019-02-13 15:30:17 -0700729 userId, STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700730
Abodunrinwa Toki2c01b6c2018-02-13 17:47:48 +0000731 // TextClassifier Service
Ye Wen8e8b2d52018-03-14 11:48:24 -0700732 String textClassifierPackageName =
733 mContext.getPackageManager().getSystemTextClassifierPackageName();
734 if (!TextUtils.isEmpty(textClassifierPackageName)) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000735 grantPermissionsToSystemPackage(textClassifierPackageName, userId,
736 PHONE_PERMISSIONS, SMS_PERMISSIONS, CALENDAR_PERMISSIONS,
737 LOCATION_PERMISSIONS, CONTACTS_PERMISSIONS);
Abodunrinwa Toki2c01b6c2018-02-13 17:47:48 +0000738 }
739
Anton Philippov4b3a1f52018-05-04 14:46:44 +0100740 // There is no real "marker" interface to identify the shared storage backup, it is
741 // hardcoded in BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE.
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000742 grantSystemFixedPermissionsToSystemPackage("com.android.sharedstoragebackup", userId,
743 STORAGE_PERMISSIONS);
Anton Philippov4b3a1f52018-05-04 14:46:44 +0100744
Nadav Bar6d79ab72019-01-10 10:52:11 +0200745 // Content Capture Service
746 String contentCaptureServicePackageName =
747 mContext.getPackageManager().getContentCaptureServicePackageName();
748 if (!TextUtils.isEmpty(contentCaptureServicePackageName)) {
749 grantPermissionsToSystemPackage(contentCaptureServicePackageName, userId,
750 MICROPHONE_PERMISSIONS);
751 }
752
Todd Kennedy0eb97382017-10-03 16:57:22 -0700753 if (mPermissionGrantedCallback != null) {
754 mPermissionGrantedCallback.onDefaultRuntimePermissionsGranted(userId);
755 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700756 }
757
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000758 private String getDefaultSystemHandlerActivityPackageForCategory(String category, int userId) {
759 return getDefaultSystemHandlerActivityPackage(
760 new Intent(Intent.ACTION_MAIN).addCategory(category), userId);
761 }
762
763 @SafeVarargs
764 private final void grantPermissionToEachSystemPackage(
765 ArrayList<String> packages, int userId, Set<String>... permissions) {
766 if (packages == null) return;
767 final int count = packages.size();
768 for (int i = 0; i < count; i++) {
769 grantPermissionsToSystemPackage(packages.get(i), userId, permissions);
Todd Kennedy82b08422017-09-28 13:32:05 -0700770 }
Eugene Susla47e88202018-07-02 18:48:55 -0700771 }
772
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000773 private String getKnownPackage(int knownPkgId, int userId) {
774 return mServiceInternal.getKnownPackageName(knownPkgId, userId);
775 }
776
777 private void grantDefaultPermissionsToDefaultSystemDialerApp(
778 String dialerPackage, int userId) {
779 if (dialerPackage == null) {
780 return;
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000781 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000782 boolean isPhonePermFixed =
783 mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0);
784 if (isPhonePermFixed) {
785 grantSystemFixedPermissionsToSystemPackage(dialerPackage, userId, PHONE_PERMISSIONS);
786 } else {
787 grantPermissionsToSystemPackage(dialerPackage, userId, PHONE_PERMISSIONS);
788 }
789 grantPermissionsToSystemPackage(dialerPackage, userId,
790 CONTACTS_PERMISSIONS, SMS_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
791 }
792
793 private void grantDefaultPermissionsToDefaultSystemSmsApp(String smsPackage, int userId) {
794 grantPermissionsToSystemPackage(smsPackage, userId,
795 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS,
796 STORAGE_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700797 }
798
Eric Enslen1e423b92017-12-18 11:30:21 -0800799 private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000800 String useOpenWifiPackage, int userId) {
Varun Anandd5d359d2019-02-15 10:08:33 -0800801 grantPermissionsToSystemPackage(useOpenWifiPackage, userId, ALWAYS_LOCATION_PERMISSIONS);
Eric Enslen1e423b92017-12-18 11:30:21 -0800802 }
803
Todd Kennedy82b08422017-09-28 13:32:05 -0700804 public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) {
805 Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000806 grantIgnoringSystemPackage(packageName, userId,
807 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS, STORAGE_PERMISSIONS,
808 MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700809 }
810
811 public void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000812 mServiceInternal.onDefaultDialerAppChanged(packageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700813 Log.i(TAG, "Granting permissions to default dialer app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000814 grantIgnoringSystemPackage(packageName, userId,
815 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS,
816 MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700817 }
818
Eric Enslen1e423b92017-12-18 11:30:21 -0800819 public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
820 Log.i(TAG, "Granting permissions to default Use Open WiFi app for user:" + userId);
Varun Anandd5d359d2019-02-15 10:08:33 -0800821 grantIgnoringSystemPackage(packageName, userId, ALWAYS_LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700822 }
823
824 public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) {
825 if (packageName == null) {
826 return;
827 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000828 Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
Eugene Suslae4240e72018-11-02 10:58:11 -0700829 grantPermissionsToPackage(packageName, userId, false /* ignoreSystemPackage */,
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000830 PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS);
831 }
832
833 private void grantDefaultPermissionsToDefaultSystemSimCallManager(
834 String packageName, int userId) {
835 if (isSystemPackage(packageName)) {
836 grantDefaultPermissionsToDefaultSimCallManager(packageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700837 }
838 }
839
840 public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
841 Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
842 if (packageNames == null) {
843 return;
844 }
845 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000846 grantPermissionsToSystemPackage(packageName, userId,
Ginelle Gan Gaisano80646b62019-02-21 14:27:32 -0800847 PHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700848 }
849 }
850
851 public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
852 Log.i(TAG, "Granting permissions to enabled ImsServices for user:" + userId);
853 if (packageNames == null) {
854 return;
855 }
856 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000857 grantPermissionsToSystemPackage(packageName, userId,
858 PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS, LOCATION_PERMISSIONS,
859 CAMERA_PERMISSIONS, CONTACTS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700860 }
861 }
862
Nathan Harold76ad1a32018-02-20 14:31:09 -0800863 public void grantDefaultPermissionsToEnabledTelephonyDataServices(
864 String[] packageNames, int userId) {
865 Log.i(TAG, "Granting permissions to enabled data services for user:" + userId);
866 if (packageNames == null) {
867 return;
868 }
869 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000870 // Grant these permissions as system-fixed, so that nobody can accidentally
871 // break cellular data.
872 grantSystemFixedPermissionsToSystemPackage(packageName, userId,
873 PHONE_PERMISSIONS, LOCATION_PERMISSIONS);
Nathan Harold76ad1a32018-02-20 14:31:09 -0800874 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000875
Nathan Harold76ad1a32018-02-20 14:31:09 -0800876 }
877
878 public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
879 String[] packageNames, int userId) {
880 Log.i(TAG, "Revoking permissions from disabled data services for user:" + userId);
881 if (packageNames == null) {
882 return;
883 }
884 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000885 PackageInfo pkg = getSystemPackageInfo(packageName);
886 if (isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) {
887 revokeRuntimePermissions(packageName, PHONE_PERMISSIONS, true, userId);
888 revokeRuntimePermissions(packageName, LOCATION_PERMISSIONS, true, userId);
Nathan Harold76ad1a32018-02-20 14:31:09 -0800889 }
890 }
891 }
892
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -0700893 public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
894 Log.i(TAG, "Granting permissions to active LUI app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000895 grantSystemFixedPermissionsToSystemPackage(packageName, userId, CAMERA_PERMISSIONS);
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -0700896 }
897
898 public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
899 Log.i(TAG, "Revoke permissions from LUI apps for user:" + userId);
900 if (packageNames == null) {
901 return;
902 }
903 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000904 PackageInfo pkg = getSystemPackageInfo(packageName);
905 if (isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) {
906 revokeRuntimePermissions(packageName, CAMERA_PERMISSIONS, true, userId);
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -0700907 }
908 }
909 }
910
Todd Kennedy82b08422017-09-28 13:32:05 -0700911 public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) {
912 Log.i(TAG, "Granting permissions to default browser for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000913 grantPermissionsToSystemPackage(packageName, userId, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700914 }
915
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000916 private String getDefaultSystemHandlerActivityPackage(String intentAction, int userId) {
917 return getDefaultSystemHandlerActivityPackage(new Intent(intentAction), userId);
918 }
919
920 private String getDefaultSystemHandlerActivityPackage(Intent intent, int userId) {
Eugene Susla4abd2e62018-11-02 17:35:07 -0700921 ResolveInfo handler = mContext.getPackageManager().resolveActivityAsUser(
922 intent, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700923 if (handler == null || handler.activityInfo == null) {
924 return null;
925 }
926 if (mServiceInternal.isResolveActivityComponent(handler.activityInfo)) {
927 return null;
928 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000929 String packageName = handler.activityInfo.packageName;
930 return isSystemPackage(packageName) ? packageName : null;
Todd Kennedy82b08422017-09-28 13:32:05 -0700931 }
932
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000933 private String getDefaultSystemHandlerServicePackage(String intentAction, int userId) {
934 return getDefaultSystemHandlerServicePackage(new Intent(intentAction), userId);
935 }
936
937 private String getDefaultSystemHandlerServicePackage(
Todd Kennedy82b08422017-09-28 13:32:05 -0700938 Intent intent, int userId) {
Eugene Susla4abd2e62018-11-02 17:35:07 -0700939 List<ResolveInfo> handlers = mContext.getPackageManager().queryIntentServicesAsUser(
940 intent, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700941 if (handlers == null) {
942 return null;
943 }
944 final int handlerCount = handlers.size();
945 for (int i = 0; i < handlerCount; i++) {
946 ResolveInfo handler = handlers.get(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000947 String handlerPackage = handler.serviceInfo.packageName;
948 if (isSystemPackage(handlerPackage)) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700949 return handlerPackage;
950 }
951 }
952 return null;
953 }
954
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000955 private ArrayList<String> getHeadlessSyncAdapterPackages(
Todd Kennedy82b08422017-09-28 13:32:05 -0700956 String[] syncAdapterPackageNames, int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000957 ArrayList<String> syncAdapterPackages = new ArrayList<>();
Todd Kennedy82b08422017-09-28 13:32:05 -0700958
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000959 Intent homeIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);
Todd Kennedy82b08422017-09-28 13:32:05 -0700960
961 for (String syncAdapterPackageName : syncAdapterPackageNames) {
962 homeIntent.setPackage(syncAdapterPackageName);
963
Eugene Susla4abd2e62018-11-02 17:35:07 -0700964 ResolveInfo homeActivity = mContext.getPackageManager().resolveActivityAsUser(
965 homeIntent, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700966 if (homeActivity != null) {
967 continue;
968 }
969
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000970 if (isSystemPackage(syncAdapterPackageName)) {
971 syncAdapterPackages.add(syncAdapterPackageName);
Todd Kennedy82b08422017-09-28 13:32:05 -0700972 }
973 }
974
975 return syncAdapterPackages;
976 }
977
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000978 private String getDefaultProviderAuthorityPackage(String authority, int userId) {
Eugene Susla4abd2e62018-11-02 17:35:07 -0700979 ProviderInfo provider = mContext.getPackageManager().resolveContentProviderAsUser(
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000980 authority, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700981 if (provider != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000982 return provider.packageName;
Todd Kennedy82b08422017-09-28 13:32:05 -0700983 }
984 return null;
985 }
986
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000987 private boolean isSystemPackage(String packageName) {
Philip P. Moltmannc701e7e2018-09-18 16:22:54 -0700988 return isSystemPackage(getPackageInfo(packageName));
Todd Kennedy82b08422017-09-28 13:32:05 -0700989 }
990
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000991 private boolean isSystemPackage(PackageInfo pkg) {
992 if (pkg == null) {
993 return false;
Todd Kennedy82b08422017-09-28 13:32:05 -0700994 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000995 return pkg.applicationInfo.isSystemApp()
996 && !isSysComponentOrPersistentPlatformSignedPrivApp(pkg);
Todd Kennedy82b08422017-09-28 13:32:05 -0700997 }
998
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000999 private void grantRuntimePermissions(PackageInfo pkg, Set<String> permissions,
Todd Kennedy82b08422017-09-28 13:32:05 -07001000 boolean systemFixed, int userId) {
1001 grantRuntimePermissions(pkg, permissions, systemFixed, false, userId);
1002 }
1003
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001004 private void revokeRuntimePermissions(String packageName, Set<String> permissions,
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001005 boolean systemFixed, int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001006 PackageInfo pkg = getSystemPackageInfo(packageName);
1007 if (ArrayUtils.isEmpty(pkg.requestedPermissions)) {
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001008 return;
1009 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001010 Set<String> revokablePermissions = new ArraySet<>(Arrays.asList(pkg.requestedPermissions));
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001011
1012 for (String permission : permissions) {
1013 // We can't revoke what wasn't requested.
1014 if (!revokablePermissions.contains(permission)) {
1015 continue;
1016 }
1017
Eugene Susla4abd2e62018-11-02 17:35:07 -07001018 UserHandle user = UserHandle.of(userId);
1019 final int flags = mContext.getPackageManager()
1020 .getPermissionFlags(permission, packageName, user);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001021
1022 // We didn't get this through the default grant policy. Move along.
1023 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) == 0) {
1024 continue;
1025 }
1026 // We aren't going to clobber device policy with a DefaultGrant.
1027 if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
1028 continue;
1029 }
1030 // Do not revoke system fixed permissions unless caller set them that way;
1031 // there is no refcount for the number of sources of this, so there
1032 // should be at most one grantor doing SYSTEM_FIXED for any given package.
1033 if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && !systemFixed) {
1034 continue;
1035 }
Eugene Susla4abd2e62018-11-02 17:35:07 -07001036 mContext.getPackageManager().revokeRuntimePermission(packageName, permission, user);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001037
1038 if (DEBUG) {
1039 Log.i(TAG, "revoked " + (systemFixed ? "fixed " : "not fixed ")
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001040 + permission + " to " + packageName);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001041 }
1042
1043 // Remove the GRANTED_BY_DEFAULT flag without touching the others.
1044 // Note that we do not revoke FLAG_PERMISSION_SYSTEM_FIXED. That bit remains
1045 // sticky once set.
Eugene Susla4abd2e62018-11-02 17:35:07 -07001046 mContext.getPackageManager().updatePermissionFlags(permission, packageName,
1047 PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, user);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001048 }
1049 }
1050
Philip P. Moltmann17f65af2018-10-18 15:32:29 -07001051 /**
1052 * Check if a permission is already fixed or is set by the user.
1053 *
1054 * <p>A permission should not be set by the default policy if the user or other policies already
1055 * set the permission.
1056 *
1057 * @param flags The flags of the permission
1058 *
1059 * @return {@code true} iff the permission can be set without violating a policy of the users
1060 * intention
1061 */
1062 private boolean isFixedOrUserSet(int flags) {
1063 return (flags & (PackageManager.FLAG_PERMISSION_USER_SET
1064 | PackageManager.FLAG_PERMISSION_USER_FIXED
1065 | PackageManager.FLAG_PERMISSION_POLICY_FIXED
1066 | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED)) != 0;
1067 }
1068
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001069 /**
1070 * Return the background permission for a permission.
1071 *
1072 * @param permission The name of the foreground permission
1073 *
1074 * @return The name of the background permission or {@code null} if the permission has no
1075 * background permission
1076 */
1077 private @Nullable String getBackgroundPermission(@NonNull String permission) {
1078 try {
1079 return mContext.getPackageManager().getPermissionInfo(permission,
1080 0).backgroundPermission;
1081 } catch (NameNotFoundException e) {
1082 return null;
1083 }
1084 }
1085
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001086 private void grantRuntimePermissions(PackageInfo pkg,
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001087 Set<String> permissionsWithoutSplits, boolean systemFixed, boolean ignoreSystemPackage,
1088 int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001089 if (pkg == null) {
1090 return;
1091 }
1092
1093 String[] requestedPermissions = pkg.requestedPermissions;
1094 if (ArrayUtils.isEmpty(requestedPermissions)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001095 return;
1096 }
1097
Eugene Susla31c9cd12018-12-03 15:41:31 -08001098 // Intersect the requestedPermissions for a factory image with that of its current update
1099 // in case the latter one removed a <uses-permission>
1100 String[] requestedByNonSystemPackage = getPackageInfo(pkg.packageName).requestedPermissions;
1101 int size = requestedPermissions.length;
1102 for (int i = 0; i < size; i++) {
1103 if (!ArrayUtils.contains(requestedByNonSystemPackage, requestedPermissions[i])) {
1104 requestedPermissions[i] = null;
1105 }
1106 }
1107 requestedPermissions = ArrayUtils.filterNotNull(requestedPermissions, String[]::new);
1108
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001109 PackageManager pm = mContext.getPackageManager();
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001110 final ArraySet<String> permissions = new ArraySet<>(permissionsWithoutSplits);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001111 ApplicationInfo applicationInfo = pkg.applicationInfo;
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001112
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001113 int newFlags = PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
1114 if (systemFixed) {
1115 newFlags |= PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
1116 }
1117
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001118 // Automatically attempt to grant split permissions to older APKs
Philip P. Moltmann039678e2018-09-18 13:04:38 -07001119 final List<PermissionManager.SplitPermissionInfo> splitPermissions =
1120 mContext.getSystemService(PermissionManager.class).getSplitPermissions();
1121 final int numSplitPerms = splitPermissions.size();
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001122 for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
Philip P. Moltmann039678e2018-09-18 13:04:38 -07001123 final PermissionManager.SplitPermissionInfo splitPerm =
1124 splitPermissions.get(splitPermNum);
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001125
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001126 if (applicationInfo != null
Philip P. Moltmann039678e2018-09-18 13:04:38 -07001127 && applicationInfo.targetSdkVersion < splitPerm.getTargetSdk()
Philip P. Moltmanna3ba4d92018-10-08 11:50:07 -07001128 && permissionsWithoutSplits.contains(splitPerm.getSplitPermission())) {
1129 permissions.addAll(splitPerm.getNewPermissions());
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001130 }
1131 }
1132
Todd Kennedy82b08422017-09-28 13:32:05 -07001133 Set<String> grantablePermissions = null;
1134
Eric Enslen1e423b92017-12-18 11:30:21 -08001135 // In some cases, like for the Phone or SMS app, we grant permissions regardless
1136 // of if the version on the system image declares the permission as used since
1137 // selecting the app as the default for that function the user makes a deliberate
Todd Kennedy82b08422017-09-28 13:32:05 -07001138 // choice to grant this app the permissions needed to function. For all other
1139 // apps, (default grants on first boot and user creation) we don't grant default
1140 // permissions if the version on the system image does not declare them.
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001141 if (!ignoreSystemPackage
1142 && applicationInfo != null
1143 && applicationInfo.isUpdatedSystemApp()) {
1144 final PackageInfo disabledPkg = getSystemPackageInfo(
1145 mServiceInternal.getDisabledSystemPackageName(pkg.packageName));
Todd Kennedy82b08422017-09-28 13:32:05 -07001146 if (disabledPkg != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001147 if (ArrayUtils.isEmpty(disabledPkg.requestedPermissions)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001148 return;
1149 }
1150 if (!requestedPermissions.equals(disabledPkg.requestedPermissions)) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001151 grantablePermissions = new ArraySet<>(Arrays.asList(requestedPermissions));
Todd Kennedy82b08422017-09-28 13:32:05 -07001152 requestedPermissions = disabledPkg.requestedPermissions;
1153 }
1154 }
1155 }
1156
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001157 final int numRequestedPermissions = requestedPermissions.length;
1158
1159 // Sort requested permissions so that all permissions that are a foreground permission (i.e.
1160 // permisions that have background permission) are before their background permissions.
1161 final String[] sortedRequestedPermissions = new String[numRequestedPermissions];
1162 int numForeground = 0;
1163 int numOther = 0;
1164 for (int i = 0; i < numRequestedPermissions; i++) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001165 String permission = requestedPermissions[i];
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001166 if (getBackgroundPermission(permission) != null) {
1167 sortedRequestedPermissions[numForeground] = permission;
1168 numForeground++;
1169 } else {
1170 sortedRequestedPermissions[numRequestedPermissions - 1 - numOther] =
1171 permission;
1172 numOther++;
1173 }
1174 }
1175
1176 for (int requestedPermissionNum = 0; requestedPermissionNum < numRequestedPermissions;
1177 requestedPermissionNum++) {
1178 String permission = requestedPermissions[requestedPermissionNum];
Todd Kennedy82b08422017-09-28 13:32:05 -07001179
1180 // If there is a disabled system app it may request a permission the updated
1181 // version ot the data partition doesn't, In this case skip the permission.
1182 if (grantablePermissions != null && !grantablePermissions.contains(permission)) {
1183 continue;
1184 }
1185
1186 if (permissions.contains(permission)) {
Eugene Susla4abd2e62018-11-02 17:35:07 -07001187 UserHandle user = UserHandle.of(userId);
1188 final int flags = mContext.getPackageManager().getPermissionFlags(
1189 permission, pkg.packageName, user);
Todd Kennedy82b08422017-09-28 13:32:05 -07001190
Philip P. Moltmann17f65af2018-10-18 15:32:29 -07001191 // Certain flags imply that the permission's current state by the system or
1192 // device/profile owner or the user. In these cases we do not want to clobber the
1193 // current state.
1194 //
Todd Kennedy82b08422017-09-28 13:32:05 -07001195 // Unless the caller wants to override user choices. The override is
1196 // to make sure we can grant the needed permission to the default
1197 // sms and phone apps after the user chooses this in the UI.
Philip P. Moltmann17f65af2018-10-18 15:32:29 -07001198 if (!isFixedOrUserSet(flags) || ignoreSystemPackage) {
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001199 // Never clobber policy fixed permissions.
1200 // We must allow the grant of a system-fixed permission because
1201 // system-fixed is sticky, but the permission itself may be revoked.
1202 if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001203 continue;
1204 }
1205
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001206 int uid = UserHandle.getUid(userId,
1207 UserHandle.getAppId(pkg.applicationInfo.uid));
1208 String op = AppOpsManager.permissionToOp(permission);
1209
Eugene Susla4abd2e62018-11-02 17:35:07 -07001210 mContext.getPackageManager()
1211 .grantRuntimePermission(pkg.packageName, permission, user);
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001212
1213 mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
1214 newFlags, newFlags, user);
1215
1216 List<String> fgPerms = mPermissionManager.getBackgroundPermissions()
1217 .get(permission);
1218 if (fgPerms != null) {
1219 int numFgPerms = fgPerms.size();
1220 for (int fgPermNum = 0; fgPermNum < numFgPerms; fgPermNum++) {
1221 String fgPerm = fgPerms.get(fgPermNum);
1222
1223 if (pm.checkPermission(fgPerm, pkg.packageName)
1224 == PackageManager.PERMISSION_GRANTED) {
1225 // Upgrade the app-op state of the fg permission to allow bg access
Philip P. Moltmann159d98b2018-12-20 08:30:53 -08001226 mContext.getSystemService(AppOpsManager.class).setUidMode(
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001227 AppOpsManager.permissionToOp(fgPerm), uid,
Philip P. Moltmann159d98b2018-12-20 08:30:53 -08001228 AppOpsManager.MODE_ALLOWED);
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001229
1230 break;
1231 }
1232 }
1233 }
1234
1235 String bgPerm = getBackgroundPermission(permission);
1236 if (bgPerm == null) {
1237 if (op != null) {
Philip P. Moltmann159d98b2018-12-20 08:30:53 -08001238 mContext.getSystemService(AppOpsManager.class).setUidMode(op, uid,
1239 AppOpsManager.MODE_ALLOWED);
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001240 }
1241 } else {
1242 int mode;
1243 if (pm.checkPermission(bgPerm, pkg.packageName)
1244 == PackageManager.PERMISSION_GRANTED) {
1245 mode = AppOpsManager.MODE_ALLOWED;
1246 } else {
1247 mode = AppOpsManager.MODE_FOREGROUND;
1248 }
1249
Philip P. Moltmann159d98b2018-12-20 08:30:53 -08001250 mContext.getSystemService(AppOpsManager.class).setUidMode(op, uid, mode);
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001251 }
1252
Todd Kennedy82b08422017-09-28 13:32:05 -07001253 if (DEBUG) {
1254 Log.i(TAG, "Granted " + (systemFixed ? "fixed " : "not fixed ")
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001255 + permission + " to default handler " + pkg);
Eugene Suslae4ee2c22018-11-05 12:23:30 -08001256
1257 int appOp = AppOpsManager.permissionToOpCode(permission);
1258 if (appOp != AppOpsManager.OP_NONE
1259 && AppOpsManager.opToDefaultMode(appOp)
1260 != AppOpsManager.MODE_ALLOWED) {
1261 // Permission has a corresponding appop which is not allowed by default
1262 // We must allow it as well, as it's usually checked alongside the
1263 // permission
1264 if (DEBUG) {
1265 Log.i(TAG, "Granting OP_" + AppOpsManager.opToName(appOp)
1266 + " to " + pkg.packageName);
1267 }
1268 mContext.getSystemService(AppOpsManager.class).setUidMode(
1269 appOp, pkg.applicationInfo.uid, AppOpsManager.MODE_ALLOWED);
1270 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001271 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001272 }
1273
1274 // If a component gets a permission for being the default handler A
1275 // and also default handler B, we grant the weaker grant form.
1276 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0
1277 && (flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0
1278 && !systemFixed) {
1279 if (DEBUG) {
1280 Log.i(TAG, "Granted not fixed " + permission + " to default handler "
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001281 + pkg);
Todd Kennedy82b08422017-09-28 13:32:05 -07001282 }
Eugene Susla4abd2e62018-11-02 17:35:07 -07001283 mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
1284 PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, 0, user);
Todd Kennedy82b08422017-09-28 13:32:05 -07001285 }
1286 }
1287 }
1288 }
1289
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001290 private PackageInfo getSystemPackageInfo(String pkg) {
1291 //TODO not MATCH_SYSTEM_ONLY?
1292 return getPackageInfo(pkg, PackageManager.MATCH_FACTORY_ONLY);
1293 }
1294
1295 private PackageInfo getPackageInfo(String pkg) {
1296 return getPackageInfo(pkg, 0 /* extraFlags */);
1297 }
1298
1299 private PackageInfo getPackageInfo(String pkg,
1300 @PackageManager.PackageInfoFlags int extraFlags) {
Eugene Susla4abd2e62018-11-02 17:35:07 -07001301 try {
1302 return mContext.getPackageManager().getPackageInfo(pkg,
1303 DEFAULT_PACKAGE_INFO_QUERY_FLAGS | extraFlags);
1304 } catch (NameNotFoundException e) {
Eugene Susla12523ab2019-01-22 17:46:54 -08001305 Slog.e(TAG, "PackageNot found: " + pkg, e);
Eugene Susla4abd2e62018-11-02 17:35:07 -07001306 return null;
1307 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001308 }
1309
1310 private boolean isSysComponentOrPersistentPlatformSignedPrivApp(PackageInfo pkg) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001311 if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) {
1312 return true;
1313 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001314 if (!pkg.applicationInfo.isPrivilegedApp()) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001315 return false;
1316 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001317 final PackageInfo disabledPkg = getSystemPackageInfo(
1318 mServiceInternal.getDisabledSystemPackageName(pkg.applicationInfo.packageName));
Todd Kennedy82b08422017-09-28 13:32:05 -07001319 if (disabledPkg != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001320 ApplicationInfo disabledPackageAppInfo = disabledPkg.applicationInfo;
1321 if (disabledPackageAppInfo != null
1322 && (disabledPackageAppInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001323 return false;
1324 }
1325 } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
1326 return false;
1327 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001328 return mServiceInternal.isPlatformSigned(pkg.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001329 }
1330
1331 private void grantDefaultPermissionExceptions(int userId) {
1332 mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
1333
1334 synchronized (mLock) {
1335 // mGrantExceptions is null only before the first read and then
1336 // it serves as a cache of the default grants that should be
1337 // performed for every user. If there is an entry then the app
1338 // is on the system image and supports runtime permissions.
1339 if (mGrantExceptions == null) {
1340 mGrantExceptions = readDefaultPermissionExceptionsLocked();
1341 }
1342 }
1343
1344 Set<String> permissions = null;
1345 final int exceptionCount = mGrantExceptions.size();
1346 for (int i = 0; i < exceptionCount; i++) {
1347 String packageName = mGrantExceptions.keyAt(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001348 PackageInfo pkg = getSystemPackageInfo(packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001349 List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i);
1350 final int permissionGrantCount = permissionGrants.size();
1351 for (int j = 0; j < permissionGrantCount; j++) {
1352 DefaultPermissionGrant permissionGrant = permissionGrants.get(j);
Jeff Sharkey7a807602018-10-18 13:21:55 -06001353 if (!isPermissionDangerous(permissionGrant.name)) {
1354 Log.w(TAG, "Ignoring permission " + permissionGrant.name
1355 + " which isn't dangerous");
1356 continue;
1357 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001358 if (permissions == null) {
1359 permissions = new ArraySet<>();
1360 } else {
1361 permissions.clear();
1362 }
Jeff Sharkey9d4654c2018-10-25 09:52:57 -06001363 permissions.add(permissionGrant.name);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001364 grantRuntimePermissions(pkg, permissions, permissionGrant.fixed, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -07001365 }
1366 }
1367 }
1368
1369 private File[] getDefaultPermissionFiles() {
1370 ArrayList<File> ret = new ArrayList<File>();
1371 File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
1372 if (dir.isDirectory() && dir.canRead()) {
1373 Collections.addAll(ret, dir.listFiles());
1374 }
1375 dir = new File(Environment.getVendorDirectory(), "etc/default-permissions");
1376 if (dir.isDirectory() && dir.canRead()) {
1377 Collections.addAll(ret, dir.listFiles());
1378 }
Jiyong Park0989e382018-03-13 10:26:47 +09001379 dir = new File(Environment.getOdmDirectory(), "etc/default-permissions");
1380 if (dir.isDirectory() && dir.canRead()) {
1381 Collections.addAll(ret, dir.listFiles());
1382 }
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09001383 dir = new File(Environment.getProductDirectory(), "etc/default-permissions");
1384 if (dir.isDirectory() && dir.canRead()) {
1385 Collections.addAll(ret, dir.listFiles());
1386 }
Dario Freni1ae46d72018-08-17 15:56:43 +01001387 dir = new File(Environment.getProductServicesDirectory(),
1388 "etc/default-permissions");
1389 if (dir.isDirectory() && dir.canRead()) {
1390 Collections.addAll(ret, dir.listFiles());
1391 }
Ralph Nathanbd111582018-03-21 14:53:23 -07001392 // For IoT devices, we check the oem partition for default permissions for each app.
1393 if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
1394 dir = new File(Environment.getOemDirectory(), "etc/default-permissions");
1395 if (dir.isDirectory() && dir.canRead()) {
1396 Collections.addAll(ret, dir.listFiles());
1397 }
1398 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001399 return ret.isEmpty() ? null : ret.toArray(new File[0]);
1400 }
1401
1402 private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
1403 readDefaultPermissionExceptionsLocked() {
1404 File[] files = getDefaultPermissionFiles();
1405 if (files == null) {
1406 return new ArrayMap<>(0);
1407 }
1408
1409 ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>();
1410
1411 // Iterate over the files in the directory and scan .xml files
1412 for (File file : files) {
1413 if (!file.getPath().endsWith(".xml")) {
1414 Slog.i(TAG, "Non-xml file " + file
1415 + " in " + file.getParent() + " directory, ignoring");
1416 continue;
1417 }
1418 if (!file.canRead()) {
1419 Slog.w(TAG, "Default permissions file " + file + " cannot be read");
1420 continue;
1421 }
1422 try (
1423 InputStream str = new BufferedInputStream(new FileInputStream(file))
1424 ) {
1425 XmlPullParser parser = Xml.newPullParser();
1426 parser.setInput(str, null);
1427 parse(parser, grantExceptions);
1428 } catch (XmlPullParserException | IOException e) {
1429 Slog.w(TAG, "Error reading default permissions file " + file, e);
1430 }
1431 }
1432
1433 return grantExceptions;
1434 }
1435
1436 private void parse(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1437 outGrantExceptions) throws IOException, XmlPullParserException {
1438 final int outerDepth = parser.getDepth();
1439 int type;
1440 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1441 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1442 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1443 continue;
1444 }
1445 if (TAG_EXCEPTIONS.equals(parser.getName())) {
1446 parseExceptions(parser, outGrantExceptions);
1447 } else {
1448 Log.e(TAG, "Unknown tag " + parser.getName());
1449 }
1450 }
1451 }
1452
1453 private void parseExceptions(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1454 outGrantExceptions) throws IOException, XmlPullParserException {
1455 final int outerDepth = parser.getDepth();
1456 int type;
1457 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1458 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1459 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1460 continue;
1461 }
1462 if (TAG_EXCEPTION.equals(parser.getName())) {
1463 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
1464
1465 List<DefaultPermissionGrant> packageExceptions =
1466 outGrantExceptions.get(packageName);
1467 if (packageExceptions == null) {
1468 // The package must be on the system image
Hai Zhangb157ef82018-10-04 14:53:04 -07001469 PackageInfo packageInfo = getSystemPackageInfo(packageName);
Eugene Suslaf25013c2019-03-01 15:17:54 -08001470
1471 if (packageInfo == null) {
1472 Log.w(TAG, "No such package:" + packageName);
1473 XmlUtils.skipCurrentTag(parser);
1474 continue;
1475 }
1476
Hai Zhangb157ef82018-10-04 14:53:04 -07001477 if (!isSystemPackage(packageInfo)) {
1478 Log.w(TAG, "Unknown system package:" + packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001479 XmlUtils.skipCurrentTag(parser);
1480 continue;
1481 }
1482
1483 // The package must support runtime permissions
Hai Zhangb157ef82018-10-04 14:53:04 -07001484 if (!doesPackageSupportRuntimePermissions(packageInfo)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001485 Log.w(TAG, "Skipping non supporting runtime permissions package:"
1486 + packageName);
1487 XmlUtils.skipCurrentTag(parser);
1488 continue;
1489 }
1490 packageExceptions = new ArrayList<>();
1491 outGrantExceptions.put(packageName, packageExceptions);
1492 }
1493
1494 parsePermission(parser, packageExceptions);
1495 } else {
1496 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exceptions>");
1497 }
1498 }
1499 }
1500
1501 private void parsePermission(XmlPullParser parser, List<DefaultPermissionGrant>
1502 outPackageExceptions) throws IOException, XmlPullParserException {
1503 final int outerDepth = parser.getDepth();
1504 int type;
1505 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1506 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1507 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1508 continue;
1509 }
1510
1511 if (TAG_PERMISSION.contains(parser.getName())) {
1512 String name = parser.getAttributeValue(null, ATTR_NAME);
1513 if (name == null) {
1514 Log.w(TAG, "Mandatory name attribute missing for permission tag");
1515 XmlUtils.skipCurrentTag(parser);
1516 continue;
1517 }
1518
1519 final boolean fixed = XmlUtils.readBooleanAttribute(parser, ATTR_FIXED);
1520
1521 DefaultPermissionGrant exception = new DefaultPermissionGrant(name, fixed);
1522 outPackageExceptions.add(exception);
1523 } else {
1524 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exception>");
1525 }
1526 }
1527 }
1528
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001529 private static boolean doesPackageSupportRuntimePermissions(PackageInfo pkg) {
1530 return pkg.applicationInfo != null
1531 && pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
Todd Kennedy82b08422017-09-28 13:32:05 -07001532 }
1533
Jeff Sharkey7a807602018-10-18 13:21:55 -06001534 private boolean isPermissionDangerous(String name) {
1535 try {
1536 final PermissionInfo pi = mContext.getPackageManager().getPermissionInfo(name, 0);
Jeff Sharkey9d4654c2018-10-25 09:52:57 -06001537 return (pi.getProtection() == PermissionInfo.PROTECTION_DANGEROUS);
Jeff Sharkey7a807602018-10-18 13:21:55 -06001538 } catch (NameNotFoundException e) {
1539 // When unknown assume it's dangerous to be on the safe side
1540 return true;
1541 }
1542 }
1543
Todd Kennedy82b08422017-09-28 13:32:05 -07001544 private static final class DefaultPermissionGrant {
1545 final String name;
1546 final boolean fixed;
1547
1548 public DefaultPermissionGrant(String name, boolean fixed) {
1549 this.name = name;
1550 this.fixed = fixed;
1551 }
1552 }
1553}