blob: 5016ec0d4be0dae8922ede2ed38df16c72e9e55f [file] [log] [blame]
Svet Ganovadc1cf42015-06-15 16:36:24 -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;
18
19import android.Manifest;
Svet Ganov59020bf2016-08-18 12:32:35 -070020import android.annotation.NonNull;
Dianne Hackbornca8e6da2015-06-24 15:19:17 -070021import android.app.DownloadManager;
Dianne Hackborn388cd2c2015-06-26 17:32:36 -070022import android.app.admin.DevicePolicyManager;
Svet Ganovadc1cf42015-06-15 16:36:24 -070023import android.content.Intent;
Svetoslav5d05bbe2015-11-05 16:33:02 -080024import android.content.pm.ActivityInfo;
Svet Ganovadc1cf42015-06-15 16:36:24 -070025import android.content.pm.ApplicationInfo;
26import android.content.pm.PackageManager;
27import android.content.pm.PackageManagerInternal.PackagesProvider;
Svetoslav0010b702015-06-30 18:05:26 -070028import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -070029import android.content.pm.PackageParser;
Dianne Hackbornca8e6da2015-06-24 15:19:17 -070030import android.content.pm.ProviderInfo;
Svet Ganovadc1cf42015-06-15 16:36:24 -070031import android.content.pm.ResolveInfo;
32import android.net.Uri;
33import android.os.Build;
Svet Ganov59020bf2016-08-18 12:32:35 -070034import android.os.Environment;
35import android.os.Handler;
36import android.os.Message;
Svet Ganovadc1cf42015-06-15 16:36:24 -070037import android.os.UserHandle;
Daniel Nishi8d9d0fec2016-07-13 14:24:31 -070038import android.os.storage.StorageManager;
Philip P. Moltmann66c96592016-02-24 11:32:43 -080039import android.print.PrintManager;
Dianne Hackborn388cd2c2015-06-26 17:32:36 -070040import android.provider.CalendarContract;
41import android.provider.ContactsContract;
Svet Ganovadc1cf42015-06-15 16:36:24 -070042import android.provider.MediaStore;
Jack Yued79bf52015-07-06 17:23:52 -070043import android.provider.Telephony.Sms.Intents;
mariagpuyol2d290802016-02-23 18:06:36 -080044import android.telephony.TelephonyManager;
Svetoslav0e629522015-08-05 19:14:47 -070045import android.security.Credentials;
Svet Ganov59020bf2016-08-18 12:32:35 -070046import android.util.ArrayMap;
Svet Ganovadc1cf42015-06-15 16:36:24 -070047import android.util.ArraySet;
48import android.util.Log;
Svet Ganov59020bf2016-08-18 12:32:35 -070049import android.util.Slog;
50import android.util.Xml;
51import com.android.internal.util.XmlUtils;
52import org.xmlpull.v1.XmlPullParser;
53import org.xmlpull.v1.XmlPullParserException;
Svet Ganovadc1cf42015-06-15 16:36:24 -070054
Svet Ganov59020bf2016-08-18 12:32:35 -070055import java.io.BufferedInputStream;
Svet Ganovadc1cf42015-06-15 16:36:24 -070056import java.io.File;
Svet Ganov59020bf2016-08-18 12:32:35 -070057import java.io.FileInputStream;
58import java.io.IOException;
59import java.io.InputStream;
Svet Ganovadc1cf42015-06-15 16:36:24 -070060import java.util.ArrayList;
61import java.util.List;
Svet Ganov59020bf2016-08-18 12:32:35 -070062import java.util.Map;
Svet Ganovadc1cf42015-06-15 16:36:24 -070063import java.util.Set;
64
65import static android.os.Process.FIRST_APPLICATION_UID;
66
67/**
68 * This class is the policy for granting runtime permissions to
69 * platform components and default handlers in the system such
70 * that the device is usable out-of-the-box. For example, the
71 * shell UID is a part of the system and the Phone app should
72 * have phone related permission by default.
73 */
74final class DefaultPermissionGrantPolicy {
Jeff Davidson2a880312015-06-22 16:54:34 -070075 private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
Svet Ganovadc1cf42015-06-15 16:36:24 -070076 private static final boolean DEBUG = false;
77
Jeff Sharkey8a372a02016-03-16 16:25:45 -060078 private static final int DEFAULT_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE
79 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
Jeff Sharkeyba512352015-11-12 20:17:45 -080080
Jeff Sharkey7186dd32015-06-30 17:32:45 -070081 private static final String AUDIO_MIME_TYPE = "audio/mpeg";
Svet Ganovadc1cf42015-06-15 16:36:24 -070082
Svet Ganov59020bf2016-08-18 12:32:35 -070083 private static final String TAG_EXCEPTIONS = "exceptions";
84 private static final String TAG_EXCEPTION = "exception";
85 private static final String TAG_PERMISSION = "permission";
86 private static final String ATTR_PACKAGE = "package";
87 private static final String ATTR_NAME = "name";
88 private static final String ATTR_FIXED = "fixed";
89
Svet Ganovadc1cf42015-06-15 16:36:24 -070090 private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
91 static {
92 PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
93 PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
Dianne Hackborn388cd2c2015-06-26 17:32:36 -070094 PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
Svet Ganovadc1cf42015-06-15 16:36:24 -070095 PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
96 PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
97 PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
98 PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
99 }
100
101 private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>();
102 static {
103 CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
104 CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
Svetoslav Ganov54a0cf12015-07-17 20:34:18 +0000105 CONTACTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700106 }
107
108 private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>();
109 static {
110 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
111 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
112 }
113
114 private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
115 static {
116 CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
117 CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR);
118 }
119
120 private static final Set<String> SMS_PERMISSIONS = new ArraySet<>();
121 static {
122 SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS);
123 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS);
124 SMS_PERMISSIONS.add(Manifest.permission.READ_SMS);
125 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH);
126 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS);
127 SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS);
128 }
129
130 private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>();
131 static {
132 MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
133 }
134
135 private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>();
136 static {
137 CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA);
138 }
139
140 private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>();
141 static {
142 SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
143 }
144
145 private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
146 static {
Svet Ganov975fa472015-06-22 20:45:31 -0700147 STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700148 STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
149 }
150
Svet Ganov59020bf2016-08-18 12:32:35 -0700151 private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
152
Pierre-Laurent Coirier87e03712016-02-26 12:07:41 -0500153 private static final String ACTION_TWINNING =
154 "com.google.android.clockwork.intent.TWINNING_SETTINGS";
Dan Aminzadef8d60b12016-09-13 10:50:09 -0700155 private static final String ACTION_TRACK = "com.android.fitness.TRACK";
Pierre-Laurent Coirier87e03712016-02-26 12:07:41 -0500156
Svet Ganovadc1cf42015-06-15 16:36:24 -0700157 private final PackageManagerService mService;
Svet Ganov59020bf2016-08-18 12:32:35 -0700158 private final Handler mHandler;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700159
Svet Ganovadc1cf42015-06-15 16:36:24 -0700160 private PackagesProvider mLocationPackagesProvider;
161 private PackagesProvider mVoiceInteractionPackagesProvider;
Svetoslavcdfd2302015-06-25 19:07:31 -0700162 private PackagesProvider mSmsAppPackagesProvider;
163 private PackagesProvider mDialerAppPackagesProvider;
Sailesh Nepalcf855622015-07-28 19:22:14 -0700164 private PackagesProvider mSimCallManagerPackagesProvider;
Svetoslav0010b702015-06-30 18:05:26 -0700165 private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700166
Svet Ganov59020bf2016-08-18 12:32:35 -0700167 private ArrayMap<String, List<DefaultPermissionGrant>> mGrantExceptions;
168
Svet Ganovadc1cf42015-06-15 16:36:24 -0700169 public DefaultPermissionGrantPolicy(PackageManagerService service) {
170 mService = service;
Svet Ganov59020bf2016-08-18 12:32:35 -0700171 mHandler = new Handler(mService.mHandlerThread.getLooper()) {
172 @Override
173 public void handleMessage(Message msg) {
174 if (msg.what == MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS) {
175 synchronized (mService.mPackages) {
176 if (mGrantExceptions == null) {
177 mGrantExceptions = readDefaultPermissionExceptionsLPw();
178 }
179 }
180 }
181 }
182 };
Svet Ganovadc1cf42015-06-15 16:36:24 -0700183 }
184
Svet Ganovadc1cf42015-06-15 16:36:24 -0700185 public void setLocationPackagesProviderLPw(PackagesProvider provider) {
186 mLocationPackagesProvider = provider;
187 }
188
189 public void setVoiceInteractionPackagesProviderLPw(PackagesProvider provider) {
190 mVoiceInteractionPackagesProvider = provider;
191 }
192
Svetoslavcdfd2302015-06-25 19:07:31 -0700193 public void setSmsAppPackagesProviderLPw(PackagesProvider provider) {
194 mSmsAppPackagesProvider = provider;
195 }
196
197 public void setDialerAppPackagesProviderLPw(PackagesProvider provider) {
198 mDialerAppPackagesProvider = provider;
Jeff Davidson2a880312015-06-22 16:54:34 -0700199 }
200
Sailesh Nepalcf855622015-07-28 19:22:14 -0700201 public void setSimCallManagerPackagesProviderLPw(PackagesProvider provider) {
202 mSimCallManagerPackagesProvider = provider;
203 }
204
Svet Ganov50a8bf42015-07-15 11:04:18 -0700205 public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) {
Svetoslav0010b702015-06-30 18:05:26 -0700206 mSyncAdapterPackagesProvider = provider;
207 }
208
Svet Ganovadc1cf42015-06-15 16:36:24 -0700209 public void grantDefaultPermissions(int userId) {
210 grantPermissionsToSysComponentsAndPrivApps(userId);
211 grantDefaultSystemHandlerPermissions(userId);
Svet Ganov59020bf2016-08-18 12:32:35 -0700212 grantDefaultPermissionExceptions(userId);
213 }
214
215 public void scheduleReadDefaultPermissionExceptions() {
216 mHandler.sendEmptyMessage(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700217 }
218
219 private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
Jeff Sharkey7186dd32015-06-30 17:32:45 -0700220 Log.i(TAG, "Granting permissions to platform components for user " + userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700221
222 synchronized (mService.mPackages) {
223 for (PackageParser.Package pkg : mService.mPackages.values()) {
Svetoslav4aa97972015-07-29 14:00:18 -0700224 if (!isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg)
225 || !doesPackageSupportRuntimePermissions(pkg)
226 || pkg.requestedPermissions.isEmpty()) {
Svet Ganovadc1cf42015-06-15 16:36:24 -0700227 continue;
228 }
Svetoslav4aa97972015-07-29 14:00:18 -0700229 Set<String> permissions = new ArraySet<>();
Svet Ganovadc1cf42015-06-15 16:36:24 -0700230 final int permissionCount = pkg.requestedPermissions.size();
231 for (int i = 0; i < permissionCount; i++) {
232 String permission = pkg.requestedPermissions.get(i);
233 BasePermission bp = mService.mSettings.mPermissions.get(permission);
234 if (bp != null && bp.isRuntime()) {
Svetoslav4aa97972015-07-29 14:00:18 -0700235 permissions.add(permission);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700236 }
237 }
Svetoslav4aa97972015-07-29 14:00:18 -0700238 if (!permissions.isEmpty()) {
239 grantRuntimePermissionsLPw(pkg, permissions, true, userId);
240 }
Svet Ganovadc1cf42015-06-15 16:36:24 -0700241 }
242 }
243 }
244
245 private void grantDefaultSystemHandlerPermissions(int userId) {
Jeff Sharkey7186dd32015-06-30 17:32:45 -0700246 Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700247
Svet Ganovadc1cf42015-06-15 16:36:24 -0700248 final PackagesProvider locationPackagesProvider;
249 final PackagesProvider voiceInteractionPackagesProvider;
Svetoslavcdfd2302015-06-25 19:07:31 -0700250 final PackagesProvider smsAppPackagesProvider;
251 final PackagesProvider dialerAppPackagesProvider;
Sailesh Nepalcf855622015-07-28 19:22:14 -0700252 final PackagesProvider simCallManagerPackagesProvider;
Svetoslav0010b702015-06-30 18:05:26 -0700253 final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700254
255 synchronized (mService.mPackages) {
Svet Ganovadc1cf42015-06-15 16:36:24 -0700256 locationPackagesProvider = mLocationPackagesProvider;
257 voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
Svetoslavcdfd2302015-06-25 19:07:31 -0700258 smsAppPackagesProvider = mSmsAppPackagesProvider;
259 dialerAppPackagesProvider = mDialerAppPackagesProvider;
Sailesh Nepalcf855622015-07-28 19:22:14 -0700260 simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
Svetoslav0010b702015-06-30 18:05:26 -0700261 syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700262 }
263
Svet Ganovadc1cf42015-06-15 16:36:24 -0700264 String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
265 ? voiceInteractionPackagesProvider.getPackages(userId) : null;
266 String[] locationPackageNames = (locationPackagesProvider != null)
267 ? locationPackagesProvider.getPackages(userId) : null;
Svetoslavcdfd2302015-06-25 19:07:31 -0700268 String[] smsAppPackageNames = (smsAppPackagesProvider != null)
269 ? smsAppPackagesProvider.getPackages(userId) : null;
270 String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
271 ? dialerAppPackagesProvider.getPackages(userId) : null;
Sailesh Nepalcf855622015-07-28 19:22:14 -0700272 String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
273 ? simCallManagerPackagesProvider.getPackages(userId) : null;
Svetoslav0010b702015-06-30 18:05:26 -0700274 String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
275 syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
276 String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
277 syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700278
279 synchronized (mService.mPackages) {
Svetoslav3e7d9772015-07-06 18:31:23 -0700280 // Installer
281 PackageParser.Package installerPackage = getSystemPackageLPr(
282 mService.mRequiredInstallerPackage);
283 if (installerPackage != null
284 && doesPackageSupportRuntimePermissions(installerPackage)) {
285 grantRuntimePermissionsLPw(installerPackage, STORAGE_PERMISSIONS, true, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700286 }
287
Svetoslav3e7d9772015-07-06 18:31:23 -0700288 // Verifier
289 PackageParser.Package verifierPackage = getSystemPackageLPr(
290 mService.mRequiredVerifierPackage);
291 if (verifierPackage != null
292 && doesPackageSupportRuntimePermissions(verifierPackage)) {
293 grantRuntimePermissionsLPw(verifierPackage, STORAGE_PERMISSIONS, true, userId);
Svet Ganovcd946022015-09-12 10:19:54 -0700294 grantRuntimePermissionsLPw(verifierPackage, PHONE_PERMISSIONS, false, userId);
295 grantRuntimePermissionsLPw(verifierPackage, SMS_PERMISSIONS, false, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700296 }
297
298 // SetupWizard
Russell Brennerb2334662016-03-23 10:16:39 -0700299 PackageParser.Package setupPackage = getSystemPackageLPr(
300 mService.mSetupWizardPackage);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700301 if (setupPackage != null
302 && doesPackageSupportRuntimePermissions(setupPackage)) {
303 grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId);
304 grantRuntimePermissionsLPw(setupPackage, CONTACTS_PERMISSIONS, userId);
Svetoslav Ganovc5603cc72016-01-06 13:33:30 -0800305 grantRuntimePermissionsLPw(setupPackage, LOCATION_PERMISSIONS, userId);
Steven Ng76bcfb22016-02-03 11:53:25 +0000306 grantRuntimePermissionsLPw(setupPackage, CAMERA_PERMISSIONS, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700307 }
308
Svet Ganovadc1cf42015-06-15 16:36:24 -0700309 // Camera
310 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Svetoslavcdfd2302015-06-25 19:07:31 -0700311 PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr(
Svet Ganovadc1cf42015-06-15 16:36:24 -0700312 cameraIntent, userId);
313 if (cameraPackage != null
314 && doesPackageSupportRuntimePermissions(cameraPackage)) {
315 grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId);
316 grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -0700317 grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId);
318 }
319
320 // Media provider
321 PackageParser.Package mediaStorePackage = getDefaultProviderAuthorityPackageLPr(
322 MediaStore.AUTHORITY, userId);
323 if (mediaStorePackage != null) {
Svetoslav0010b702015-06-30 18:05:26 -0700324 grantRuntimePermissionsLPw(mediaStorePackage, STORAGE_PERMISSIONS, true, userId);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -0700325 }
326
327 // Downloads provider
328 PackageParser.Package downloadsPackage = getDefaultProviderAuthorityPackageLPr(
329 "downloads", userId);
330 if (downloadsPackage != null) {
Svetoslav0010b702015-06-30 18:05:26 -0700331 grantRuntimePermissionsLPw(downloadsPackage, STORAGE_PERMISSIONS, true, userId);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -0700332 }
333
334 // Downloads UI
335 Intent downloadsUiIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
Svetoslavcdfd2302015-06-25 19:07:31 -0700336 PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActivityPackageLPr(
Dianne Hackbornca8e6da2015-06-24 15:19:17 -0700337 downloadsUiIntent, userId);
338 if (downloadsUiPackage != null
339 && doesPackageSupportRuntimePermissions(downloadsUiPackage)) {
Svetoslav0010b702015-06-30 18:05:26 -0700340 grantRuntimePermissionsLPw(downloadsUiPackage, STORAGE_PERMISSIONS, true, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700341 }
342
Jeff Sharkey7186dd32015-06-30 17:32:45 -0700343 // Storage provider
344 PackageParser.Package storagePackage = getDefaultProviderAuthorityPackageLPr(
345 "com.android.externalstorage.documents", userId);
346 if (storagePackage != null) {
Svet Ganov52153f42015-08-11 08:59:12 -0700347 grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, true, userId);
Jeff Sharkey7186dd32015-06-30 17:32:45 -0700348 }
349
Svetoslav0e629522015-08-05 19:14:47 -0700350 // CertInstaller
351 Intent certInstallerIntent = new Intent(Credentials.INSTALL_ACTION);
352 PackageParser.Package certInstallerPackage = getDefaultSystemHandlerActivityPackageLPr(
353 certInstallerIntent, userId);
354 if (certInstallerPackage != null
355 && doesPackageSupportRuntimePermissions(certInstallerPackage)) {
356 grantRuntimePermissionsLPw(certInstallerPackage, STORAGE_PERMISSIONS, true, userId);
357 }
358
Svetoslava5a0d942015-07-01 19:49:58 -0700359 // Dialer
360 if (dialerAppPackageNames == null) {
361 Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
362 PackageParser.Package dialerPackage = getDefaultSystemHandlerActivityPackageLPr(
363 dialerIntent, userId);
364 if (dialerPackage != null) {
365 grantDefaultPermissionsToDefaultSystemDialerAppLPr(dialerPackage, userId);
366 }
367 } else {
368 for (String dialerAppPackageName : dialerAppPackageNames) {
369 PackageParser.Package dialerPackage = getSystemPackageLPr(dialerAppPackageName);
370 if (dialerPackage != null) {
371 grantDefaultPermissionsToDefaultSystemDialerAppLPr(dialerPackage, userId);
372 }
373 }
374 }
375
Sailesh Nepalcf855622015-07-28 19:22:14 -0700376 // Sim call manager
377 if (simCallManagerPackageNames != null) {
378 for (String simCallManagerPackageName : simCallManagerPackageNames) {
379 PackageParser.Package simCallManagerPackage =
380 getSystemPackageLPr(simCallManagerPackageName);
381 if (simCallManagerPackage != null) {
382 grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage,
383 userId);
384 }
385 }
386 }
387
Svetoslavcdfd2302015-06-25 19:07:31 -0700388 // SMS
Svetoslava5a0d942015-07-01 19:49:58 -0700389 if (smsAppPackageNames == null) {
390 Intent smsIntent = new Intent(Intent.ACTION_MAIN);
391 smsIntent.addCategory(Intent.CATEGORY_APP_MESSAGING);
392 PackageParser.Package smsPackage = getDefaultSystemHandlerActivityPackageLPr(
393 smsIntent, userId);
394 if (smsPackage != null) {
395 grantDefaultPermissionsToDefaultSystemSmsAppLPr(smsPackage, userId);
396 }
397 } else {
Svetoslavcdfd2302015-06-25 19:07:31 -0700398 for (String smsPackageName : smsAppPackageNames) {
Svetoslava5a0d942015-07-01 19:49:58 -0700399 PackageParser.Package smsPackage = getSystemPackageLPr(smsPackageName);
400 if (smsPackage != null) {
401 grantDefaultPermissionsToDefaultSystemSmsAppLPr(smsPackage, userId);
Svetoslavcdfd2302015-06-25 19:07:31 -0700402 }
403 }
Svet Ganovadc1cf42015-06-15 16:36:24 -0700404 }
405
Jack Yued79bf52015-07-06 17:23:52 -0700406 // Cell Broadcast Receiver
407 Intent cbrIntent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
408 PackageParser.Package cbrPackage =
409 getDefaultSystemHandlerActivityPackageLPr(cbrIntent, userId);
Jack Yued79bf52015-07-06 17:23:52 -0700410 if (cbrPackage != null && doesPackageSupportRuntimePermissions(cbrPackage)) {
Svet Ganov52153f42015-08-11 08:59:12 -0700411 grantRuntimePermissionsLPw(cbrPackage, SMS_PERMISSIONS, userId);
Jack Yued79bf52015-07-06 17:23:52 -0700412 }
413
Junda Liud878f532015-08-13 14:25:49 -0700414 // Carrier Provisioning Service
415 Intent carrierProvIntent = new Intent(Intents.SMS_CARRIER_PROVISION_ACTION);
416 PackageParser.Package carrierProvPackage =
417 getDefaultSystemHandlerServicePackageLPr(carrierProvIntent, userId);
418 if (carrierProvPackage != null && doesPackageSupportRuntimePermissions(carrierProvPackage)) {
419 grantRuntimePermissionsLPw(carrierProvPackage, SMS_PERMISSIONS, false, userId);
420 }
421
Svet Ganovadc1cf42015-06-15 16:36:24 -0700422 // Calendar
423 Intent calendarIntent = new Intent(Intent.ACTION_MAIN);
424 calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR);
Svetoslavcdfd2302015-06-25 19:07:31 -0700425 PackageParser.Package calendarPackage = getDefaultSystemHandlerActivityPackageLPr(
Svet Ganovadc1cf42015-06-15 16:36:24 -0700426 calendarIntent, userId);
427 if (calendarPackage != null
428 && doesPackageSupportRuntimePermissions(calendarPackage)) {
429 grantRuntimePermissionsLPw(calendarPackage, CALENDAR_PERMISSIONS, userId);
430 grantRuntimePermissionsLPw(calendarPackage, CONTACTS_PERMISSIONS, userId);
Dianne Hackborn388cd2c2015-06-26 17:32:36 -0700431 }
432
433 // Calendar provider
434 PackageParser.Package calendarProviderPackage = getDefaultProviderAuthorityPackageLPr(
435 CalendarContract.AUTHORITY, userId);
436 if (calendarProviderPackage != null) {
437 grantRuntimePermissionsLPw(calendarProviderPackage, CONTACTS_PERMISSIONS, userId);
Svetoslav0010b702015-06-30 18:05:26 -0700438 grantRuntimePermissionsLPw(calendarProviderPackage, CALENDAR_PERMISSIONS,
439 true, userId);
Dianne Hackborn388cd2c2015-06-26 17:32:36 -0700440 grantRuntimePermissionsLPw(calendarProviderPackage, STORAGE_PERMISSIONS, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700441 }
442
Svetoslav0010b702015-06-30 18:05:26 -0700443 // Calendar provider sync adapters
Svetoslava5a0d942015-07-01 19:49:58 -0700444 List<PackageParser.Package> calendarSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
Svet Ganov50a8bf42015-07-15 11:04:18 -0700445 calendarSyncAdapterPackages, userId);
Svetoslav0010b702015-06-30 18:05:26 -0700446 final int calendarSyncAdapterCount = calendarSyncAdapters.size();
447 for (int i = 0; i < calendarSyncAdapterCount; i++) {
448 PackageParser.Package calendarSyncAdapter = calendarSyncAdapters.get(i);
449 if (doesPackageSupportRuntimePermissions(calendarSyncAdapter)) {
450 grantRuntimePermissionsLPw(calendarSyncAdapter, CALENDAR_PERMISSIONS, userId);
451 }
452 }
453
Svet Ganovadc1cf42015-06-15 16:36:24 -0700454 // Contacts
455 Intent contactsIntent = new Intent(Intent.ACTION_MAIN);
456 contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS);
Svetoslavcdfd2302015-06-25 19:07:31 -0700457 PackageParser.Package contactsPackage = getDefaultSystemHandlerActivityPackageLPr(
Svet Ganovadc1cf42015-06-15 16:36:24 -0700458 contactsIntent, userId);
459 if (contactsPackage != null
460 && doesPackageSupportRuntimePermissions(contactsPackage)) {
461 grantRuntimePermissionsLPw(contactsPackage, CONTACTS_PERMISSIONS, userId);
462 grantRuntimePermissionsLPw(contactsPackage, PHONE_PERMISSIONS, userId);
Dianne Hackborn388cd2c2015-06-26 17:32:36 -0700463 }
464
Svetoslav0010b702015-06-30 18:05:26 -0700465 // Contacts provider sync adapters
Svetoslava5a0d942015-07-01 19:49:58 -0700466 List<PackageParser.Package> contactsSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
Svet Ganov50a8bf42015-07-15 11:04:18 -0700467 contactsSyncAdapterPackages, userId);
Svetoslav0010b702015-06-30 18:05:26 -0700468 final int contactsSyncAdapterCount = contactsSyncAdapters.size();
469 for (int i = 0; i < contactsSyncAdapterCount; i++) {
470 PackageParser.Package contactsSyncAdapter = contactsSyncAdapters.get(i);
471 if (doesPackageSupportRuntimePermissions(contactsSyncAdapter)) {
472 grantRuntimePermissionsLPw(contactsSyncAdapter, CONTACTS_PERMISSIONS, userId);
473 }
474 }
475
Dianne Hackborn388cd2c2015-06-26 17:32:36 -0700476 // Contacts provider
477 PackageParser.Package contactsProviderPackage = getDefaultProviderAuthorityPackageLPr(
478 ContactsContract.AUTHORITY, userId);
479 if (contactsProviderPackage != null) {
Svetoslav0010b702015-06-30 18:05:26 -0700480 grantRuntimePermissionsLPw(contactsProviderPackage, CONTACTS_PERMISSIONS,
481 true, userId);
Makoto Onuki7a4082e2015-07-06 16:59:36 -0700482 grantRuntimePermissionsLPw(contactsProviderPackage, PHONE_PERMISSIONS,
483 true, userId);
Dianne Hackborn388cd2c2015-06-26 17:32:36 -0700484 grantRuntimePermissionsLPw(contactsProviderPackage, STORAGE_PERMISSIONS, userId);
485 }
486
487 // Device provisioning
488 Intent deviceProvisionIntent = new Intent(
489 DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE);
Svet Ganovb6e00132015-06-29 20:19:25 -0700490 PackageParser.Package deviceProvisionPackage =
491 getDefaultSystemHandlerActivityPackageLPr(deviceProvisionIntent, userId);
Dianne Hackborn388cd2c2015-06-26 17:32:36 -0700492 if (deviceProvisionPackage != null
493 && doesPackageSupportRuntimePermissions(deviceProvisionPackage)) {
Makoto Onukibc924792015-07-16 11:38:00 -0700494 grantRuntimePermissionsLPw(deviceProvisionPackage, CONTACTS_PERMISSIONS, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700495 }
496
497 // Maps
498 Intent mapsIntent = new Intent(Intent.ACTION_MAIN);
499 mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS);
Svetoslavcdfd2302015-06-25 19:07:31 -0700500 PackageParser.Package mapsPackage = getDefaultSystemHandlerActivityPackageLPr(
Svet Ganovadc1cf42015-06-15 16:36:24 -0700501 mapsIntent, userId);
502 if (mapsPackage != null
503 && doesPackageSupportRuntimePermissions(mapsPackage)) {
504 grantRuntimePermissionsLPw(mapsPackage, LOCATION_PERMISSIONS, userId);
505 }
506
Svet Ganov200d4942015-07-01 20:46:02 -0700507 // Gallery
508 Intent galleryIntent = new Intent(Intent.ACTION_MAIN);
509 galleryIntent.addCategory(Intent.CATEGORY_APP_GALLERY);
510 PackageParser.Package galleryPackage = getDefaultSystemHandlerActivityPackageLPr(
511 galleryIntent, userId);
512 if (galleryPackage != null
513 && doesPackageSupportRuntimePermissions(galleryPackage)) {
514 grantRuntimePermissionsLPw(galleryPackage, STORAGE_PERMISSIONS, userId);
515 }
516
Svet Ganovadc1cf42015-06-15 16:36:24 -0700517 // Email
518 Intent emailIntent = new Intent(Intent.ACTION_MAIN);
519 emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
Svetoslavcdfd2302015-06-25 19:07:31 -0700520 PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackageLPr(
Svet Ganovadc1cf42015-06-15 16:36:24 -0700521 emailIntent, userId);
522 if (emailPackage != null
523 && doesPackageSupportRuntimePermissions(emailPackage)) {
524 grantRuntimePermissionsLPw(emailPackage, CONTACTS_PERMISSIONS, userId);
Svetoslav Ganov9df80d22016-07-25 18:27:41 -0700525 grantRuntimePermissionsLPw(emailPackage, CALENDAR_PERMISSIONS, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700526 }
527
528 // Browser
Svetoslavcdfd2302015-06-25 19:07:31 -0700529 PackageParser.Package browserPackage = null;
530 String defaultBrowserPackage = mService.getDefaultBrowserPackageName(userId);
531 if (defaultBrowserPackage != null) {
532 browserPackage = getPackageLPr(defaultBrowserPackage);
533 }
534 if (browserPackage == null) {
535 Intent browserIntent = new Intent(Intent.ACTION_MAIN);
536 browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
537 browserPackage = getDefaultSystemHandlerActivityPackageLPr(
538 browserIntent, userId);
539 }
Svet Ganovadc1cf42015-06-15 16:36:24 -0700540 if (browserPackage != null
541 && doesPackageSupportRuntimePermissions(browserPackage)) {
542 grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
543 }
544
Svet Ganovadc1cf42015-06-15 16:36:24 -0700545 // Voice interaction
546 if (voiceInteractPackageNames != null) {
547 for (String voiceInteractPackageName : voiceInteractPackageNames) {
548 PackageParser.Package voiceInteractPackage = getSystemPackageLPr(
549 voiceInteractPackageName);
550 if (voiceInteractPackage != null
551 && doesPackageSupportRuntimePermissions(voiceInteractPackage)) {
552 grantRuntimePermissionsLPw(voiceInteractPackage,
553 CONTACTS_PERMISSIONS, userId);
554 grantRuntimePermissionsLPw(voiceInteractPackage,
555 CALENDAR_PERMISSIONS, userId);
556 grantRuntimePermissionsLPw(voiceInteractPackage,
557 MICROPHONE_PERMISSIONS, userId);
558 grantRuntimePermissionsLPw(voiceInteractPackage,
559 PHONE_PERMISSIONS, userId);
560 grantRuntimePermissionsLPw(voiceInteractPackage,
561 SMS_PERMISSIONS, userId);
562 grantRuntimePermissionsLPw(voiceInteractPackage,
563 LOCATION_PERMISSIONS, userId);
564 }
565 }
566 }
567
Svetoslavc6ab8b92015-07-22 17:34:12 -0700568 // Voice recognition
569 Intent voiceRecoIntent = new Intent("android.speech.RecognitionService");
570 voiceRecoIntent.addCategory(Intent.CATEGORY_DEFAULT);
571 PackageParser.Package voiceRecoPackage = getDefaultSystemHandlerServicePackageLPr(
572 voiceRecoIntent, userId);
573 if (voiceRecoPackage != null
574 && doesPackageSupportRuntimePermissions(voiceRecoPackage)) {
575 grantRuntimePermissionsLPw(voiceRecoPackage, MICROPHONE_PERMISSIONS, userId);
576 }
577
Svet Ganovadc1cf42015-06-15 16:36:24 -0700578 // Location
579 if (locationPackageNames != null) {
580 for (String packageName : locationPackageNames) {
581 PackageParser.Package locationPackage = getSystemPackageLPr(packageName);
582 if (locationPackage != null
583 && doesPackageSupportRuntimePermissions(locationPackage)) {
584 grantRuntimePermissionsLPw(locationPackage, CONTACTS_PERMISSIONS, userId);
585 grantRuntimePermissionsLPw(locationPackage, CALENDAR_PERMISSIONS, userId);
586 grantRuntimePermissionsLPw(locationPackage, MICROPHONE_PERMISSIONS, userId);
587 grantRuntimePermissionsLPw(locationPackage, PHONE_PERMISSIONS, userId);
588 grantRuntimePermissionsLPw(locationPackage, SMS_PERMISSIONS, userId);
Svetoslav0010b702015-06-30 18:05:26 -0700589 grantRuntimePermissionsLPw(locationPackage, LOCATION_PERMISSIONS,
590 true, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700591 grantRuntimePermissionsLPw(locationPackage, CAMERA_PERMISSIONS, userId);
592 grantRuntimePermissionsLPw(locationPackage, SENSORS_PERMISSIONS, userId);
593 grantRuntimePermissionsLPw(locationPackage, STORAGE_PERMISSIONS, userId);
594 }
595 }
596 }
Jeff Davidson2a880312015-06-22 16:54:34 -0700597
Jeff Sharkey7186dd32015-06-30 17:32:45 -0700598 // Music
599 Intent musicIntent = new Intent(Intent.ACTION_VIEW);
600 musicIntent.addCategory(Intent.CATEGORY_DEFAULT);
601 musicIntent.setDataAndType(Uri.fromFile(new File("foo.mp3")),
602 AUDIO_MIME_TYPE);
603 PackageParser.Package musicPackage = getDefaultSystemHandlerActivityPackageLPr(
604 musicIntent, userId);
605 if (musicPackage != null
606 && doesPackageSupportRuntimePermissions(musicPackage)) {
607 grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId);
608 }
609
Dan Aminzadef8d60b12016-09-13 10:50:09 -0700610 // Watches
Jeff Sharkey115d2c12016-02-15 17:25:57 -0700611 if (mService.hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) {
Dan Aminzadef8d60b12016-09-13 10:50:09 -0700612 // Home application on watches
Anthony Hugh979b81a2015-09-29 16:50:35 -0700613 Intent homeIntent = new Intent(Intent.ACTION_MAIN);
614 homeIntent.addCategory(Intent.CATEGORY_HOME_MAIN);
615
616 PackageParser.Package wearHomePackage = getDefaultSystemHandlerActivityPackageLPr(
617 homeIntent, userId);
618
619 if (wearHomePackage != null
620 && doesPackageSupportRuntimePermissions(wearHomePackage)) {
621 grantRuntimePermissionsLPw(wearHomePackage, CONTACTS_PERMISSIONS, false,
622 userId);
623 grantRuntimePermissionsLPw(wearHomePackage, PHONE_PERMISSIONS, true, userId);
624 grantRuntimePermissionsLPw(wearHomePackage, MICROPHONE_PERMISSIONS, false,
625 userId);
Anthony Hugh90814f02015-10-21 11:41:34 -0700626 grantRuntimePermissionsLPw(wearHomePackage, LOCATION_PERMISSIONS, false,
627 userId);
Anthony Hugh979b81a2015-09-29 16:50:35 -0700628 }
Pierre-Laurent Coirier87e03712016-02-26 12:07:41 -0500629
Dan Aminzadef8d60b12016-09-13 10:50:09 -0700630 // Twinning on watches
Pierre-Laurent Coirier87e03712016-02-26 12:07:41 -0500631 Intent twinningIntent = new Intent(ACTION_TWINNING);
632 PackageParser.Package twinningPackage = getDefaultSystemHandlerActivityPackageLPr(
633 twinningIntent, userId);
634
635 if (twinningPackage != null
636 && doesPackageSupportRuntimePermissions(twinningPackage)) {
637 grantRuntimePermissionsLPw(twinningPackage, PHONE_PERMISSIONS, false, userId);
638 grantRuntimePermissionsLPw(twinningPackage, SMS_PERMISSIONS, false, userId);
639 }
Dan Aminzadef8d60b12016-09-13 10:50:09 -0700640
641 // Fitness tracking on watches
642 Intent trackIntent = new Intent(ACTION_TRACK);
643 PackageParser.Package trackPackage = getDefaultSystemHandlerActivityPackageLPr(
644 trackIntent, userId);
645 if (trackPackage != null
646 && doesPackageSupportRuntimePermissions(trackPackage)) {
647 grantRuntimePermissionsLPw(trackPackage, SENSORS_PERMISSIONS, false, userId);
648 grantRuntimePermissionsLPw(trackPackage, LOCATION_PERMISSIONS, false, userId);
649 }
Anthony Hugh979b81a2015-09-29 16:50:35 -0700650 }
651
Philip P. Moltmann98963262015-12-16 16:57:05 -0800652 // Print Spooler
653 PackageParser.Package printSpoolerPackage = getSystemPackageLPr(
Philip P. Moltmann66c96592016-02-24 11:32:43 -0800654 PrintManager.PRINT_SPOOLER_PACKAGE_NAME);
Philip P. Moltmann98963262015-12-16 16:57:05 -0800655 if (printSpoolerPackage != null
656 && doesPackageSupportRuntimePermissions(printSpoolerPackage)) {
657 grantRuntimePermissionsLPw(printSpoolerPackage, LOCATION_PERMISSIONS, true, userId);
658 }
659
mariagpuyol2d290802016-02-23 18:06:36 -0800660 // EmergencyInfo
661 Intent emergencyInfoIntent = new Intent(TelephonyManager.ACTION_EMERGENCY_ASSISTANCE);
662 PackageParser.Package emergencyInfoPckg = getDefaultSystemHandlerActivityPackageLPr(
663 emergencyInfoIntent, userId);
664 if (emergencyInfoPckg != null
665 && doesPackageSupportRuntimePermissions(emergencyInfoPckg)) {
666 grantRuntimePermissionsLPw(emergencyInfoPckg, CONTACTS_PERMISSIONS, true, userId);
667 grantRuntimePermissionsLPw(emergencyInfoPckg, PHONE_PERMISSIONS, true, userId);
668 }
669
Martijn Coenen284b1652016-03-30 13:46:39 +0200670 // NFC Tag viewer
671 Intent nfcTagIntent = new Intent(Intent.ACTION_VIEW);
672 nfcTagIntent.setType("vnd.android.cursor.item/ndef_msg");
673 PackageParser.Package nfcTagPkg = getDefaultSystemHandlerActivityPackageLPr(
674 nfcTagIntent, userId);
675 if (nfcTagPkg != null
676 && doesPackageSupportRuntimePermissions(nfcTagPkg)) {
677 grantRuntimePermissionsLPw(nfcTagPkg, CONTACTS_PERMISSIONS, false, userId);
678 grantRuntimePermissionsLPw(nfcTagPkg, PHONE_PERMISSIONS, false, userId);
679 }
Daniel Nishi8d9d0fec2016-07-13 14:24:31 -0700680
681 // Storage Manager
682 Intent storageManagerIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
683 PackageParser.Package storageManagerPckg = getDefaultSystemHandlerActivityPackageLPr(
684 storageManagerIntent, userId);
685 if (storageManagerPckg != null
686 && doesPackageSupportRuntimePermissions(storageManagerPckg)) {
687 grantRuntimePermissionsLPw(storageManagerPckg, STORAGE_PERMISSIONS, true, userId);
688 }
Svet Ganovba3ba812015-06-26 10:54:06 -0700689 mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700690 }
691 }
692
Svetoslava5a0d942015-07-01 19:49:58 -0700693 private void grantDefaultPermissionsToDefaultSystemDialerAppLPr(
694 PackageParser.Package dialerPackage, int userId) {
695 if (doesPackageSupportRuntimePermissions(dialerPackage)) {
Anthony Hughd4539922015-10-19 13:42:26 -0700696 boolean isPhonePermFixed =
Jeff Sharkey115d2c12016-02-15 17:25:57 -0700697 mService.hasSystemFeature(PackageManager.FEATURE_WATCH, 0);
Anthony Hughd4539922015-10-19 13:42:26 -0700698 grantRuntimePermissionsLPw(
699 dialerPackage, PHONE_PERMISSIONS, isPhonePermFixed, userId);
Svetoslava5a0d942015-07-01 19:49:58 -0700700 grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
701 grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
702 grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
Usman Abdullaha2b109a2016-07-12 13:27:20 -0700703 grantRuntimePermissionsLPw(dialerPackage, CAMERA_PERMISSIONS, userId);
Svetoslava5a0d942015-07-01 19:49:58 -0700704 }
705 }
706
Svetoslava5a0d942015-07-01 19:49:58 -0700707 private void grantDefaultPermissionsToDefaultSystemSmsAppLPr(
708 PackageParser.Package smsPackage, int userId) {
709 if (doesPackageSupportRuntimePermissions(smsPackage)) {
710 grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
711 grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId);
712 grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId);
713 }
714 }
715
Svetoslavcdfd2302015-06-25 19:07:31 -0700716 public void grantDefaultPermissionsToDefaultSmsAppLPr(String packageName, int userId) {
717 Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
718 if (packageName == null) {
719 return;
720 }
721 PackageParser.Package smsPackage = getPackageLPr(packageName);
722 if (smsPackage != null && doesPackageSupportRuntimePermissions(smsPackage)) {
Svet Ganov4bb51872015-07-16 18:56:16 -0700723 grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, false, true, userId);
724 grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, false, true, userId);
725 grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, false, true, userId);
Svetoslavcdfd2302015-06-25 19:07:31 -0700726 }
727 }
728
729 public void grantDefaultPermissionsToDefaultDialerAppLPr(String packageName, int userId) {
730 Log.i(TAG, "Granting permissions to default dialer app for user:" + userId);
731 if (packageName == null) {
732 return;
733 }
734 PackageParser.Package dialerPackage = getPackageLPr(packageName);
735 if (dialerPackage != null
736 && doesPackageSupportRuntimePermissions(dialerPackage)) {
Svet Ganov4bb51872015-07-16 18:56:16 -0700737 grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, false, true, userId);
738 grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, false, true, userId);
739 grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, false, true, userId);
740 grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, false, true, userId);
Usman Abdullaha2b109a2016-07-12 13:27:20 -0700741 grantRuntimePermissionsLPw(dialerPackage, CAMERA_PERMISSIONS, false, true, userId);
Svetoslavcdfd2302015-06-25 19:07:31 -0700742 }
743 }
744
Sailesh Nepalcf855622015-07-28 19:22:14 -0700745 private void grantDefaultPermissionsToDefaultSimCallManagerLPr(
746 PackageParser.Package simCallManagerPackage, int userId) {
747 Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
748 if (doesPackageSupportRuntimePermissions(simCallManagerPackage)) {
749 grantRuntimePermissionsLPw(simCallManagerPackage, PHONE_PERMISSIONS, userId);
750 grantRuntimePermissionsLPw(simCallManagerPackage, MICROPHONE_PERMISSIONS, userId);
751 }
752 }
753
754 public void grantDefaultPermissionsToDefaultSimCallManagerLPr(String packageName, int userId) {
755 if (packageName == null) {
756 return;
757 }
758 PackageParser.Package simCallManagerPackage = getPackageLPr(packageName);
759 if (simCallManagerPackage != null) {
760 grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage, userId);
761 }
762 }
763
Svetoslavcdfd2302015-06-25 19:07:31 -0700764 public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) {
765 Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
766 if (packageNames == null) {
767 return;
768 }
769 for (String packageName : packageNames) {
770 PackageParser.Package carrierPackage = getSystemPackageLPr(packageName);
771 if (carrierPackage != null
772 && doesPackageSupportRuntimePermissions(carrierPackage)) {
773 grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId);
774 grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId);
Shishir Agrawalad632472015-07-29 16:54:07 -0700775 grantRuntimePermissionsLPw(carrierPackage, SMS_PERMISSIONS, userId);
Svetoslavcdfd2302015-06-25 19:07:31 -0700776 }
777 }
778 }
779
780 public void grantDefaultPermissionsToDefaultBrowserLPr(String packageName, int userId) {
781 Log.i(TAG, "Granting permissions to default browser for user:" + userId);
782 if (packageName == null) {
783 return;
784 }
785 PackageParser.Package browserPackage = getSystemPackageLPr(packageName);
786 if (browserPackage != null
787 && doesPackageSupportRuntimePermissions(browserPackage)) {
Svet Ganov4bb51872015-07-16 18:56:16 -0700788 grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, false, false, userId);
Svetoslavcdfd2302015-06-25 19:07:31 -0700789 }
790 }
791
Svetoslavcdfd2302015-06-25 19:07:31 -0700792 private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr(
Svet Ganovadc1cf42015-06-15 16:36:24 -0700793 Intent intent, int userId) {
Svetoslav5d05bbe2015-11-05 16:33:02 -0800794 ResolveInfo handler = mService.resolveIntent(intent,
Jeff Sharkeyba512352015-11-12 20:17:45 -0800795 intent.resolveType(mService.mContext.getContentResolver()), DEFAULT_FLAGS, userId);
Svetoslav5d05bbe2015-11-05 16:33:02 -0800796 if (handler == null || handler.activityInfo == null) {
Svet Ganov50a8bf42015-07-15 11:04:18 -0700797 return null;
798 }
Svetoslav5d05bbe2015-11-05 16:33:02 -0800799 ActivityInfo activityInfo = handler.activityInfo;
800 if (activityInfo.packageName.equals(mService.mResolveActivity.packageName)
801 && activityInfo.name.equals(mService.mResolveActivity.name)) {
802 return null;
Svetoslav Ganovd2bbf1b2015-11-06 00:24:47 +0000803 }
Svetoslav5d05bbe2015-11-05 16:33:02 -0800804 return getSystemPackageLPr(handler.activityInfo.packageName);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700805 }
806
Svetoslavc6ab8b92015-07-22 17:34:12 -0700807 private PackageParser.Package getDefaultSystemHandlerServicePackageLPr(
808 Intent intent, int userId) {
809 List<ResolveInfo> handlers = mService.queryIntentServices(intent,
Jeff Sharkeyd5896632016-03-04 16:16:00 -0700810 intent.resolveType(mService.mContext.getContentResolver()), DEFAULT_FLAGS, userId)
811 .getList();
Svetoslavc6ab8b92015-07-22 17:34:12 -0700812 if (handlers == null) {
813 return null;
814 }
815 final int handlerCount = handlers.size();
816 for (int i = 0; i < handlerCount; i++) {
817 ResolveInfo handler = handlers.get(i);
818 PackageParser.Package handlerPackage = getSystemPackageLPr(
819 handler.serviceInfo.packageName);
820 if (handlerPackage != null) {
821 return handlerPackage;
822 }
823 }
824 return null;
825 }
826
Svetoslav0010b702015-06-30 18:05:26 -0700827 private List<PackageParser.Package> getHeadlessSyncAdapterPackagesLPr(
828 String[] syncAdapterPackageNames, int userId) {
829 List<PackageParser.Package> syncAdapterPackages = new ArrayList<>();
830
831 Intent homeIntent = new Intent(Intent.ACTION_MAIN);
Svet Ganov05069b92015-08-01 12:19:26 -0700832 homeIntent.addCategory(Intent.CATEGORY_LAUNCHER);
Svetoslav0010b702015-06-30 18:05:26 -0700833
834 for (String syncAdapterPackageName : syncAdapterPackageNames) {
835 homeIntent.setPackage(syncAdapterPackageName);
836
Svetoslav5d05bbe2015-11-05 16:33:02 -0800837 ResolveInfo homeActivity = mService.resolveIntent(homeIntent,
Jeff Sharkeyba512352015-11-12 20:17:45 -0800838 homeIntent.resolveType(mService.mContext.getContentResolver()), DEFAULT_FLAGS,
839 userId);
Svetoslav5d05bbe2015-11-05 16:33:02 -0800840 if (homeActivity != null) {
Svetoslav0010b702015-06-30 18:05:26 -0700841 continue;
842 }
843
844 PackageParser.Package syncAdapterPackage = getSystemPackageLPr(syncAdapterPackageName);
845 if (syncAdapterPackage != null) {
846 syncAdapterPackages.add(syncAdapterPackage);
847 }
848 }
849
850 return syncAdapterPackages;
851 }
852
Dianne Hackbornca8e6da2015-06-24 15:19:17 -0700853 private PackageParser.Package getDefaultProviderAuthorityPackageLPr(
854 String authority, int userId) {
Jeff Sharkeyba512352015-11-12 20:17:45 -0800855 ProviderInfo provider = mService.resolveContentProvider(authority, DEFAULT_FLAGS, userId);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -0700856 if (provider != null) {
857 return getSystemPackageLPr(provider.packageName);
858 }
859 return null;
860 }
861
Svetoslavcdfd2302015-06-25 19:07:31 -0700862 private PackageParser.Package getPackageLPr(String packageName) {
863 return mService.mPackages.get(packageName);
864 }
865
Svet Ganovadc1cf42015-06-15 16:36:24 -0700866 private PackageParser.Package getSystemPackageLPr(String packageName) {
Svetoslavcdfd2302015-06-25 19:07:31 -0700867 PackageParser.Package pkg = getPackageLPr(packageName);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700868 if (pkg != null && pkg.isSystemApp()) {
Svetoslav4aa97972015-07-29 14:00:18 -0700869 return !isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) ? pkg : null;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700870 }
871 return null;
872 }
873
Svet Ganovadc1cf42015-06-15 16:36:24 -0700874 private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
875 int userId) {
Svet Ganov4bb51872015-07-16 18:56:16 -0700876 grantRuntimePermissionsLPw(pkg, permissions, false, false, userId);
Svet Ganov6a166af2015-06-30 10:15:44 -0700877 }
878
879 private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
880 boolean systemFixed, int userId) {
Svet Ganov4bb51872015-07-16 18:56:16 -0700881 grantRuntimePermissionsLPw(pkg, permissions, systemFixed, false, userId);
882 }
883
884 private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
Svetoslav Ganov80d78dc2016-02-29 17:29:39 -0800885 boolean systemFixed, boolean isDefaultPhoneOrSms, int userId) {
Svetoslav4aa97972015-07-29 14:00:18 -0700886 if (pkg.requestedPermissions.isEmpty()) {
887 return;
888 }
889
Svet Ganovadc1cf42015-06-15 16:36:24 -0700890 List<String> requestedPermissions = pkg.requestedPermissions;
Svetoslav4aa97972015-07-29 14:00:18 -0700891 Set<String> grantablePermissions = null;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700892
Svetoslav Ganov80d78dc2016-02-29 17:29:39 -0800893 // If this is the default Phone or SMS app we grant permissions regardless
894 // whether the version on the system image declares the permission as used since
895 // selecting the app as the default Phone or SMS the user makes a deliberate
896 // choice to grant this app the permissions needed to function. For all other
897 // apps, (default grants on first boot and user creation) we don't grant default
898 // permissions if the version on the system image does not declare them.
899 if (!isDefaultPhoneOrSms && pkg.isUpdatedSystemApp()) {
Svet Ganovadc1cf42015-06-15 16:36:24 -0700900 PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
901 if (sysPs != null) {
Svetoslav4aa97972015-07-29 14:00:18 -0700902 if (sysPs.pkg.requestedPermissions.isEmpty()) {
903 return;
904 }
905 if (!requestedPermissions.equals(sysPs.pkg.requestedPermissions)) {
906 grantablePermissions = new ArraySet<>(requestedPermissions);
907 requestedPermissions = sysPs.pkg.requestedPermissions;
908 }
Svet Ganovadc1cf42015-06-15 16:36:24 -0700909 }
910 }
911
Svetoslav4aa97972015-07-29 14:00:18 -0700912 final int grantablePermissionCount = requestedPermissions.size();
913 for (int i = 0; i < grantablePermissionCount; i++) {
Svet Ganovadc1cf42015-06-15 16:36:24 -0700914 String permission = requestedPermissions.get(i);
Svetoslav4aa97972015-07-29 14:00:18 -0700915
916 // If there is a disabled system app it may request a permission the updated
917 // version ot the data partition doesn't, In this case skip the permission.
918 if (grantablePermissions != null && !grantablePermissions.contains(permission)) {
919 continue;
920 }
921
Svet Ganovadc1cf42015-06-15 16:36:24 -0700922 if (permissions.contains(permission)) {
923 final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId);
924
925 // If any flags are set to the permission, then it is either set in
926 // its current state by the system or device/profile owner or the user.
927 // In all these cases we do not want to clobber the current state.
Svet Ganov4bb51872015-07-16 18:56:16 -0700928 // Unless the caller wants to override user choices. The override is
929 // to make sure we can grant the needed permission to the default
930 // sms and phone apps after the user chooses this in the UI.
Svetoslav Ganov80d78dc2016-02-29 17:29:39 -0800931 if (flags == 0 || isDefaultPhoneOrSms) {
Svet Ganov4bb51872015-07-16 18:56:16 -0700932 // Never clobber policy or system.
933 final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
934 | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
935 if ((flags & fixedFlags) != 0) {
936 continue;
937 }
938
Svet Ganovadc1cf42015-06-15 16:36:24 -0700939 mService.grantRuntimePermission(pkg.packageName, permission, userId);
940 if (DEBUG) {
Svetoslav5db602f2015-11-02 18:40:18 -0800941 Log.i(TAG, "Granted " + (systemFixed ? "fixed " : "not fixed ")
942 + permission + " to default handler " + pkg.packageName);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700943 }
Svet Ganov6a166af2015-06-30 10:15:44 -0700944
Svet Ganov77ab6a82015-07-03 12:03:02 -0700945 int newFlags = PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
Svet Ganov6a166af2015-06-30 10:15:44 -0700946 if (systemFixed) {
Svet Ganov77ab6a82015-07-03 12:03:02 -0700947 newFlags |= PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
Svet Ganov6a166af2015-06-30 10:15:44 -0700948 }
Svet Ganov77ab6a82015-07-03 12:03:02 -0700949
950 mService.updatePermissionFlags(permission, pkg.packageName,
951 newFlags, newFlags, userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700952 }
Svetoslav5db602f2015-11-02 18:40:18 -0800953
954 // If a component gets a permission for being the default handler A
955 // and also default handler B, we grant the weaker grant form.
956 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0
957 && (flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0
958 && !systemFixed) {
959 if (DEBUG) {
960 Log.i(TAG, "Granted not fixed " + permission + " to default handler "
961 + pkg.packageName);
962 }
963 mService.updatePermissionFlags(permission, pkg.packageName,
964 PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, 0, userId);
965 }
Svet Ganovadc1cf42015-06-15 16:36:24 -0700966 }
967 }
968 }
969
Svetoslav4aa97972015-07-29 14:00:18 -0700970 private boolean isSysComponentOrPersistentPlatformSignedPrivAppLPr(PackageParser.Package pkg) {
Svet Ganov824d4532015-07-10 18:25:48 -0700971 if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) {
972 return true;
973 }
Svetoslav4aa97972015-07-29 14:00:18 -0700974 if (!pkg.isPrivilegedApp()) {
975 return false;
976 }
977 PackageSetting sysPkg = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
Svet Ganovf4433842015-11-17 11:53:18 -0800978 if (sysPkg != null && sysPkg.pkg != null) {
Svetoslav4aa97972015-07-29 14:00:18 -0700979 if ((sysPkg.pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
980 return false;
981 }
982 } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
Svet Ganov824d4532015-07-10 18:25:48 -0700983 return false;
984 }
985 return PackageManagerService.compareSignatures(mService.mPlatformPackage.mSignatures,
986 pkg.mSignatures) == PackageManager.SIGNATURE_MATCH;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700987 }
988
Svet Ganov59020bf2016-08-18 12:32:35 -0700989 private void grantDefaultPermissionExceptions(int userId) {
990 synchronized (mService.mPackages) {
991 mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
992
993 if (mGrantExceptions == null) {
994 mGrantExceptions = readDefaultPermissionExceptionsLPw();
995 }
996
997 // mGrantExceptions is null only before the first read and then
998 // it serves as a cache of the default grants that should be
999 // performed for every user. If there is an entry then the app
1000 // is on the system image and supports runtime permissions.
1001 Set<String> permissions = null;
1002 final int exceptionCount = mGrantExceptions.size();
1003 for (int i = 0; i < exceptionCount; i++) {
1004 String packageName = mGrantExceptions.keyAt(i);
1005 PackageParser.Package pkg = getSystemPackageLPr(packageName);
1006 List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i);
1007 final int permissionGrantCount = permissionGrants.size();
1008 for (int j = 0; j < permissionGrantCount; j++) {
1009 DefaultPermissionGrant permissionGrant = permissionGrants.get(j);
1010 if (permissions == null) {
1011 permissions = new ArraySet<>();
1012 } else {
1013 permissions.clear();
1014 }
1015 permissions.add(permissionGrant.name);
1016 grantRuntimePermissionsLPw(pkg, permissions, false,
1017 permissionGrant.fixed, userId);
1018 }
1019 }
1020 }
1021 }
1022
1023 private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
1024 readDefaultPermissionExceptionsLPw() {
1025 File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
1026 if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
1027 return new ArrayMap<>(0);
1028 }
1029
1030 File[] files = dir.listFiles();
1031 if (files == null) {
1032 return new ArrayMap<>(0);
1033 }
1034
1035 ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>();
1036
1037 // Iterate over the files in the directory and scan .xml files
1038 for (File file : files) {
1039 if (!file.getPath().endsWith(".xml")) {
1040 Slog.i(TAG, "Non-xml file " + file + " in " + dir + " directory, ignoring");
1041 continue;
1042 }
1043 if (!file.canRead()) {
1044 Slog.w(TAG, "Default permissions file " + file + " cannot be read");
1045 continue;
1046 }
1047 try (
1048 InputStream str = new BufferedInputStream(new FileInputStream(file))
1049 ) {
1050 XmlPullParser parser = Xml.newPullParser();
1051 parser.setInput(str, null);
1052 parse(parser, grantExceptions);
1053 } catch (XmlPullParserException | IOException e) {
1054 Slog.w(TAG, "Error reading default permissions file " + file, e);
1055 }
1056 }
1057
1058 return grantExceptions;
1059 }
1060
1061 private void parse(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1062 outGrantExceptions) throws IOException, XmlPullParserException {
1063 final int outerDepth = parser.getDepth();
1064 int type;
1065 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1066 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1067 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1068 continue;
1069 }
1070 if (TAG_EXCEPTIONS.equals(parser.getName())) {
1071 parseExceptions(parser, outGrantExceptions);
1072 } else {
1073 Log.e(TAG, "Unknown tag " + parser.getName());
1074 }
1075 }
1076 }
1077
1078 private void parseExceptions(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1079 outGrantExceptions) throws IOException, XmlPullParserException {
1080 final int outerDepth = parser.getDepth();
1081 int type;
1082 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1083 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1084 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1085 continue;
1086 }
1087 if (TAG_EXCEPTION.equals(parser.getName())) {
1088 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
1089
1090 List<DefaultPermissionGrant> packageExceptions =
1091 outGrantExceptions.get(packageName);
1092 if (packageExceptions == null) {
1093 // The package must be on the system image
1094 PackageParser.Package pkg = getSystemPackageLPr(packageName);
1095 if (pkg == null) {
1096 Log.w(TAG, "Unknown package:" + packageName);
1097 XmlUtils.skipCurrentTag(parser);
Stuart Scott434c8db2016-09-21 14:04:22 -07001098 continue;
Svet Ganov59020bf2016-08-18 12:32:35 -07001099 }
1100
1101 // The package must support runtime permissions
1102 if (!doesPackageSupportRuntimePermissions(pkg)) {
1103 Log.w(TAG, "Skipping non supporting runtime permissions package:"
1104 + packageName);
1105 XmlUtils.skipCurrentTag(parser);
Stuart Scott434c8db2016-09-21 14:04:22 -07001106 continue;
Svet Ganov59020bf2016-08-18 12:32:35 -07001107 }
1108 packageExceptions = new ArrayList<>();
1109 outGrantExceptions.put(packageName, packageExceptions);
1110 }
1111
1112 parsePermission(parser, packageExceptions);
1113 } else {
1114 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exceptions>");
1115 }
1116 }
1117 }
1118
1119 private void parsePermission(XmlPullParser parser, List<DefaultPermissionGrant>
1120 outPackageExceptions) throws IOException, XmlPullParserException {
1121 final int outerDepth = parser.getDepth();
1122 int type;
1123 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1124 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1125 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1126 continue;
1127 }
1128
1129 if (TAG_PERMISSION.contains(parser.getName())) {
1130 String name = parser.getAttributeValue(null, ATTR_NAME);
1131 if (name == null) {
1132 Log.w(TAG, "Mandatory name attribute missing for permission tag");
1133 XmlUtils.skipCurrentTag(parser);
1134 continue;
1135 }
1136
1137 final boolean fixed = XmlUtils.readBooleanAttribute(parser, ATTR_FIXED);
1138
1139 DefaultPermissionGrant exception = new DefaultPermissionGrant(name, fixed);
1140 outPackageExceptions.add(exception);
1141 } else {
1142 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exception>");
1143 }
1144 }
1145 }
1146
Svet Ganovadc1cf42015-06-15 16:36:24 -07001147 private static boolean doesPackageSupportRuntimePermissions(PackageParser.Package pkg) {
1148 return pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
1149 }
Svet Ganov59020bf2016-08-18 12:32:35 -07001150
1151 private static final class DefaultPermissionGrant {
1152 final String name;
1153 final boolean fixed;
1154
1155 public DefaultPermissionGrant(String name, boolean fixed) {
1156 this.name = name;
1157 this.fixed = fixed;
1158 }
1159 }
Svet Ganovadc1cf42015-06-15 16:36:24 -07001160}