Advertisement
manfromnn

DefaultPermissionGrantPolicy.java

Jul 1st, 2016
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 46.60 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2015 The Android Open Source Project
  3.  * Copyright (C) 2015 Alex Naidis <[email protected]> , Team Exodus, The Linux Foundation
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17.  
  18. package com.android.server.pm;
  19.  
  20. import android.Manifest;
  21. import android.app.DownloadManager;
  22. import android.app.admin.DevicePolicyManager;
  23. import android.content.Intent;
  24. import android.content.pm.ActivityInfo;
  25. import android.content.pm.ApplicationInfo;
  26. import android.content.pm.PackageManager;
  27. import android.content.pm.PackageManagerInternal.PackagesProvider;
  28. import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
  29. import android.content.pm.PackageParser;
  30. import android.content.pm.ProviderInfo;
  31. import android.content.pm.ResolveInfo;
  32. import android.net.Uri;
  33. import android.os.Build;
  34. import android.os.UserHandle;
  35. import android.provider.CalendarContract;
  36. import android.provider.ContactsContract;
  37. import android.provider.MediaStore;
  38. import android.provider.Telephony.Sms.Intents;
  39. import android.security.Credentials;
  40. import android.util.ArraySet;
  41. import android.util.Log;
  42.  
  43. import java.io.File;
  44. import java.util.ArrayList;
  45. import java.util.List;
  46. import java.util.Set;
  47.  
  48. import static android.os.Process.FIRST_APPLICATION_UID;
  49.  
  50. /**
  51.  * This class is the policy for granting runtime permissions to
  52.  * platform components and default handlers in the system such
  53.  * that the device is usable out-of-the-box. For example, the
  54.  * shell UID is a part of the system and the Phone app should
  55.  * have phone related permission by default.
  56.  */
  57. final class DefaultPermissionGrantPolicy {
  58.     private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
  59.     private static final boolean DEBUG = false;
  60.  
  61.     private static final String AUDIO_MIME_TYPE = "audio/mpeg";
  62.  
  63.     private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
  64.     static {
  65.         PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
  66.         PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
  67.         PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
  68.         PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
  69.         PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
  70.         PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
  71.         PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
  72.     }
  73.  
  74.     private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>();
  75.     static {
  76.         CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
  77.         CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
  78.         CONTACTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
  79.     }
  80.  
  81.     private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>();
  82.     static {
  83.         LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
  84.         LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
  85.     }
  86.  
  87.     private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
  88.     static {
  89.         CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
  90.         CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR);
  91.     }
  92.  
  93.     private static final Set<String> SMS_PERMISSIONS = new ArraySet<>();
  94.     static {
  95.         SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS);
  96.         SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS);
  97.         SMS_PERMISSIONS.add(Manifest.permission.READ_SMS);
  98.         SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH);
  99.         SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS);
  100.         SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS);
  101.     }
  102.  
  103.     private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>();
  104.     static {
  105.         MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
  106.     }
  107.  
  108.     private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>();
  109.     static {
  110.         CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA);
  111.     }
  112.  
  113.     private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>();
  114.     static {
  115.         SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
  116.     }
  117.  
  118.     private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
  119.     static {
  120.         STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
  121.         STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
  122.     }
  123.  
  124.     private final PackageManagerService mService;
  125.  
  126.     private PackagesProvider mImePackagesProvider;
  127.     private PackagesProvider mLocationPackagesProvider;
  128.     private PackagesProvider mVoiceInteractionPackagesProvider;
  129.     private PackagesProvider mSmsAppPackagesProvider;
  130.     private PackagesProvider mDialerAppPackagesProvider;
  131.     private PackagesProvider mSimCallManagerPackagesProvider;
  132.     private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
  133.  
  134.     public DefaultPermissionGrantPolicy(PackageManagerService service) {
  135.         mService = service;
  136.     }
  137.  
  138.     public void setImePackagesProviderLPr(PackagesProvider provider) {
  139.         mImePackagesProvider = provider;
  140.     }
  141.  
  142.     public void setLocationPackagesProviderLPw(PackagesProvider provider) {
  143.         mLocationPackagesProvider = provider;
  144.     }
  145.  
  146.     public void setVoiceInteractionPackagesProviderLPw(PackagesProvider provider) {
  147.         mVoiceInteractionPackagesProvider = provider;
  148.     }
  149.  
  150.     public void setSmsAppPackagesProviderLPw(PackagesProvider provider) {
  151.         mSmsAppPackagesProvider = provider;
  152.     }
  153.  
  154.     public void setDialerAppPackagesProviderLPw(PackagesProvider provider) {
  155.         mDialerAppPackagesProvider = provider;
  156.     }
  157.  
  158.     public void setSimCallManagerPackagesProviderLPw(PackagesProvider provider) {
  159.         mSimCallManagerPackagesProvider = provider;
  160.     }
  161.  
  162.     public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) {
  163.         mSyncAdapterPackagesProvider = provider;
  164.     }
  165.  
  166.     public void grantDefaultPermissions(int userId) {
  167.         grantPermissionsToSysComponentsAndPrivApps(userId);
  168.         grantDefaultSystemHandlerPermissions(userId);
  169.     }
  170.  
  171.     private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
  172.         Log.i(TAG, "Granting permissions to platform components for user " + userId);
  173.  
  174.         synchronized (mService.mPackages) {
  175.             for (PackageParser.Package pkg : mService.mPackages.values()) {
  176.                 if (!isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg)
  177.                         || !doesPackageSupportRuntimePermissions(pkg)
  178.                         || pkg.requestedPermissions.isEmpty()) {
  179.                     continue;
  180.                 }
  181.                 Set<String> permissions = new ArraySet<>();
  182.                 final int permissionCount = pkg.requestedPermissions.size();
  183.                 for (int i = 0; i < permissionCount; i++) {
  184.                     String permission = pkg.requestedPermissions.get(i);
  185.                     BasePermission bp = mService.mSettings.mPermissions.get(permission);
  186.                     if (bp != null && bp.isRuntime()) {
  187.                         permissions.add(permission);
  188.                     }
  189.                 }
  190.                 if (!permissions.isEmpty()) {
  191.                     grantRuntimePermissionsLPw(pkg, permissions, true, userId);
  192.                 }
  193.             }
  194.         }
  195.     }
  196.  
  197.     private void grantDefaultSystemHandlerPermissions(int userId) {
  198.         Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
  199.  
  200.         final PackagesProvider imePackagesProvider;
  201.         final PackagesProvider locationPackagesProvider;
  202.         final PackagesProvider voiceInteractionPackagesProvider;
  203.         final PackagesProvider smsAppPackagesProvider;
  204.         final PackagesProvider dialerAppPackagesProvider;
  205.         final PackagesProvider simCallManagerPackagesProvider;
  206.         final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
  207.  
  208.         synchronized (mService.mPackages) {
  209.             imePackagesProvider = mImePackagesProvider;
  210.             locationPackagesProvider = mLocationPackagesProvider;
  211.             voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
  212.             smsAppPackagesProvider = mSmsAppPackagesProvider;
  213.             dialerAppPackagesProvider = mDialerAppPackagesProvider;
  214.             simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
  215.             syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
  216.         }
  217.  
  218.         String[] imePackageNames = (imePackagesProvider != null)
  219.                 ? imePackagesProvider.getPackages(userId) : null;
  220.         String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
  221.                 ? voiceInteractionPackagesProvider.getPackages(userId) : null;
  222.         String[] locationPackageNames = (locationPackagesProvider != null)
  223.                 ? locationPackagesProvider.getPackages(userId) : null;
  224.         String[] smsAppPackageNames = (smsAppPackagesProvider != null)
  225.                 ? smsAppPackagesProvider.getPackages(userId) : null;
  226.         String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
  227.                 ? dialerAppPackagesProvider.getPackages(userId) : null;
  228.         String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
  229.                 ? simCallManagerPackagesProvider.getPackages(userId) : null;
  230.         String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
  231.                 syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
  232.         String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
  233.                 syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
  234.  
  235.         synchronized (mService.mPackages) {
  236.             // Installer
  237.             PackageParser.Package installerPackage = getSystemPackageLPr(
  238.                     mService.mRequiredInstallerPackage);
  239.             if (installerPackage != null
  240.                     && doesPackageSupportRuntimePermissions(installerPackage)) {
  241.                 grantRuntimePermissionsLPw(installerPackage, STORAGE_PERMISSIONS, true, userId);
  242.             }
  243.  
  244.             // Verifier
  245.             PackageParser.Package verifierPackage = getSystemPackageLPr(
  246.                     mService.mRequiredVerifierPackage);
  247.             if (verifierPackage != null
  248.                     && doesPackageSupportRuntimePermissions(verifierPackage)) {
  249.                 grantRuntimePermissionsLPw(verifierPackage, STORAGE_PERMISSIONS, true, userId);
  250.                 grantRuntimePermissionsLPw(verifierPackage, PHONE_PERMISSIONS, false, userId);
  251.                 grantRuntimePermissionsLPw(verifierPackage, SMS_PERMISSIONS, false, userId);
  252.             }
  253.  
  254.             // SetupWizard
  255.             Intent setupIntent = new Intent(Intent.ACTION_MAIN);
  256.             setupIntent.addCategory(Intent.CATEGORY_SETUP_WIZARD);
  257.             PackageParser.Package setupPackage = getDefaultSystemHandlerActivityPackageLPr(
  258.                     setupIntent, userId);
  259.             if (setupPackage != null
  260.                     && doesPackageSupportRuntimePermissions(setupPackage)) {
  261.                 grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId);
  262.                 grantRuntimePermissionsLPw(setupPackage, CONTACTS_PERMISSIONS, userId);
  263.             }
  264.  
  265.             // Camera
  266.             Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  267.             PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr(
  268.                     cameraIntent, userId);
  269.             if (cameraPackage != null
  270.                     && doesPackageSupportRuntimePermissions(cameraPackage)) {
  271.                 grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId);
  272.                 grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId);
  273.                 grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId);
  274.             }
  275.  
  276.             // Media provider
  277.             PackageParser.Package mediaStorePackage = getDefaultProviderAuthorityPackageLPr(
  278.                     MediaStore.AUTHORITY, userId);
  279.             if (mediaStorePackage != null) {
  280.                 grantRuntimePermissionsLPw(mediaStorePackage, STORAGE_PERMISSIONS, true, userId);
  281.             }
  282.  
  283.             // Downloads provider
  284.             PackageParser.Package downloadsPackage = getDefaultProviderAuthorityPackageLPr(
  285.                     "downloads", userId);
  286.             if (downloadsPackage != null) {
  287.                 grantRuntimePermissionsLPw(downloadsPackage, STORAGE_PERMISSIONS, true, userId);
  288.             }
  289.  
  290.             // Downloads UI
  291.             Intent downloadsUiIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
  292.             PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActivityPackageLPr(
  293.                     downloadsUiIntent, userId);
  294.             if (downloadsUiPackage != null
  295.                     && doesPackageSupportRuntimePermissions(downloadsUiPackage)) {
  296.                 grantRuntimePermissionsLPw(downloadsUiPackage, STORAGE_PERMISSIONS, true, userId);
  297.             }
  298.  
  299.             // Storage provider
  300.             PackageParser.Package storagePackage = getDefaultProviderAuthorityPackageLPr(
  301.                     "com.android.externalstorage.documents", userId);
  302.             if (storagePackage != null) {
  303.                 grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, true, userId);
  304.             }
  305.  
  306.             // CertInstaller
  307.             Intent certInstallerIntent = new Intent(Credentials.INSTALL_ACTION);
  308.             PackageParser.Package certInstallerPackage = getDefaultSystemHandlerActivityPackageLPr(
  309.                     certInstallerIntent, userId);
  310.             if (certInstallerPackage != null
  311.                     && doesPackageSupportRuntimePermissions(certInstallerPackage)) {
  312.                 grantRuntimePermissionsLPw(certInstallerPackage, STORAGE_PERMISSIONS, true, userId);
  313.             }
  314.  
  315.             // Dialer
  316.             if (dialerAppPackageNames == null) {
  317.                 Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
  318.                 PackageParser.Package dialerPackage = getDefaultSystemHandlerActivityPackageLPr(
  319.                         dialerIntent, userId);
  320.                 if (dialerPackage != null) {
  321.                     grantDefaultPermissionsToDefaultSystemDialerAppLPr(dialerPackage, userId);
  322.                 }
  323.             } else {
  324.                 for (String dialerAppPackageName : dialerAppPackageNames) {
  325.                     PackageParser.Package dialerPackage = getSystemPackageLPr(dialerAppPackageName);
  326.                     if (dialerPackage != null) {
  327.                         grantDefaultPermissionsToDefaultSystemDialerAppLPr(dialerPackage, userId);
  328.                     }
  329.                 }
  330.             }
  331.  
  332.             // Sim call manager
  333.             if (simCallManagerPackageNames != null) {
  334.                 for (String simCallManagerPackageName : simCallManagerPackageNames) {
  335.                     PackageParser.Package simCallManagerPackage =
  336.                             getSystemPackageLPr(simCallManagerPackageName);
  337.                     if (simCallManagerPackage != null) {
  338.                         grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage,
  339.                                 userId);
  340.                     }
  341.                 }
  342.             }
  343.  
  344.             // SMS
  345.             if (smsAppPackageNames == null) {
  346.                 Intent smsIntent = new Intent(Intent.ACTION_MAIN);
  347.                 smsIntent.addCategory(Intent.CATEGORY_APP_MESSAGING);
  348.                 PackageParser.Package smsPackage = getDefaultSystemHandlerActivityPackageLPr(
  349.                         smsIntent, userId);
  350.                 if (smsPackage != null) {
  351.                    grantDefaultPermissionsToDefaultSystemSmsAppLPr(smsPackage, userId);
  352.                 }
  353.             } else {
  354.                 for (String smsPackageName : smsAppPackageNames) {
  355.                     PackageParser.Package smsPackage = getSystemPackageLPr(smsPackageName);
  356.                     if (smsPackage != null) {
  357.                         grantDefaultPermissionsToDefaultSystemSmsAppLPr(smsPackage, userId);
  358.                     }
  359.                 }
  360.             }
  361.  
  362.             // Cell Broadcast Receiver
  363.             Intent cbrIntent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
  364.             PackageParser.Package cbrPackage =
  365.                     getDefaultSystemHandlerActivityPackageLPr(cbrIntent, userId);
  366.             if (cbrPackage != null && doesPackageSupportRuntimePermissions(cbrPackage)) {
  367.                 grantRuntimePermissionsLPw(cbrPackage, SMS_PERMISSIONS, userId);
  368.             }
  369.  
  370.             // Carrier Provisioning Service
  371.             Intent carrierProvIntent = new Intent(Intents.SMS_CARRIER_PROVISION_ACTION);
  372.             PackageParser.Package carrierProvPackage =
  373.                     getDefaultSystemHandlerServicePackageLPr(carrierProvIntent, userId);
  374.             if (carrierProvPackage != null && doesPackageSupportRuntimePermissions(carrierProvPackage)) {
  375.                 grantRuntimePermissionsLPw(carrierProvPackage, SMS_PERMISSIONS, false, userId);
  376.             }
  377.  
  378.             // Calendar
  379.             Intent calendarIntent = new Intent(Intent.ACTION_MAIN);
  380.             calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR);
  381.             PackageParser.Package calendarPackage = getDefaultSystemHandlerActivityPackageLPr(
  382.                     calendarIntent, userId);
  383.             if (calendarPackage != null
  384.                     && doesPackageSupportRuntimePermissions(calendarPackage)) {
  385.                 grantRuntimePermissionsLPw(calendarPackage, CALENDAR_PERMISSIONS, userId);
  386.                 grantRuntimePermissionsLPw(calendarPackage, CONTACTS_PERMISSIONS, userId);
  387.             }
  388.  
  389.             // Calendar provider
  390.             PackageParser.Package calendarProviderPackage = getDefaultProviderAuthorityPackageLPr(
  391.                     CalendarContract.AUTHORITY, userId);
  392.             if (calendarProviderPackage != null) {
  393.                 grantRuntimePermissionsLPw(calendarProviderPackage, CONTACTS_PERMISSIONS, userId);
  394.                 grantRuntimePermissionsLPw(calendarProviderPackage, CALENDAR_PERMISSIONS,
  395.                         true, userId);
  396.                 grantRuntimePermissionsLPw(calendarProviderPackage, STORAGE_PERMISSIONS, userId);
  397.             }
  398.  
  399.             // Calendar provider sync adapters
  400.             List<PackageParser.Package> calendarSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
  401.                     calendarSyncAdapterPackages, userId);
  402.             final int calendarSyncAdapterCount = calendarSyncAdapters.size();
  403.             for (int i = 0; i < calendarSyncAdapterCount; i++) {
  404.                 PackageParser.Package calendarSyncAdapter = calendarSyncAdapters.get(i);
  405.                 if (doesPackageSupportRuntimePermissions(calendarSyncAdapter)) {
  406.                     grantRuntimePermissionsLPw(calendarSyncAdapter, CALENDAR_PERMISSIONS, userId);
  407.                 }
  408.             }
  409.  
  410.             // Contacts
  411.             Intent contactsIntent = new Intent(Intent.ACTION_MAIN);
  412.             contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS);
  413.             PackageParser.Package contactsPackage = getDefaultSystemHandlerActivityPackageLPr(
  414.                     contactsIntent, userId);
  415.             if (contactsPackage != null
  416.                     && doesPackageSupportRuntimePermissions(contactsPackage)) {
  417.                 grantRuntimePermissionsLPw(contactsPackage, CONTACTS_PERMISSIONS, userId);
  418.                 grantRuntimePermissionsLPw(contactsPackage, PHONE_PERMISSIONS, userId);
  419.             }
  420.  
  421.             // Contacts provider sync adapters
  422.             List<PackageParser.Package> contactsSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
  423.                     contactsSyncAdapterPackages, userId);
  424.             final int contactsSyncAdapterCount = contactsSyncAdapters.size();
  425.             for (int i = 0; i < contactsSyncAdapterCount; i++) {
  426.                 PackageParser.Package contactsSyncAdapter = contactsSyncAdapters.get(i);
  427.                 if (doesPackageSupportRuntimePermissions(contactsSyncAdapter)) {
  428.                     grantRuntimePermissionsLPw(contactsSyncAdapter, CONTACTS_PERMISSIONS, userId);
  429.                 }
  430.             }
  431.  
  432.             // Contacts provider
  433.             PackageParser.Package contactsProviderPackage = getDefaultProviderAuthorityPackageLPr(
  434.                     ContactsContract.AUTHORITY, userId);
  435.             if (contactsProviderPackage != null) {
  436.                 grantRuntimePermissionsLPw(contactsProviderPackage, CONTACTS_PERMISSIONS,
  437.                         true, userId);
  438.                 grantRuntimePermissionsLPw(contactsProviderPackage, PHONE_PERMISSIONS,
  439.                         true, userId);
  440.                 grantRuntimePermissionsLPw(contactsProviderPackage, STORAGE_PERMISSIONS, userId);
  441.             }
  442.  
  443.             // Device provisioning
  444.             Intent deviceProvisionIntent = new Intent(
  445.                     DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE);
  446.             PackageParser.Package deviceProvisionPackage =
  447.                     getDefaultSystemHandlerActivityPackageLPr(deviceProvisionIntent, userId);
  448.             if (deviceProvisionPackage != null
  449.                     && doesPackageSupportRuntimePermissions(deviceProvisionPackage)) {
  450.                 grantRuntimePermissionsLPw(deviceProvisionPackage, CONTACTS_PERMISSIONS, userId);
  451.             }
  452.  
  453.             // Maps
  454.             Intent mapsIntent = new Intent(Intent.ACTION_MAIN);
  455.             mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS);
  456.             PackageParser.Package mapsPackage = getDefaultSystemHandlerActivityPackageLPr(
  457.                     mapsIntent, userId);
  458.             if (mapsPackage != null
  459.                     && doesPackageSupportRuntimePermissions(mapsPackage)) {
  460.                 grantRuntimePermissionsLPw(mapsPackage, LOCATION_PERMISSIONS, userId);
  461.             }
  462.  
  463.             // Gallery
  464.             Intent galleryIntent = new Intent(Intent.ACTION_MAIN);
  465.             galleryIntent.addCategory(Intent.CATEGORY_APP_GALLERY);
  466.             PackageParser.Package galleryPackage = getDefaultSystemHandlerActivityPackageLPr(
  467.                     galleryIntent, userId);
  468.             if (galleryPackage != null
  469.                     && doesPackageSupportRuntimePermissions(galleryPackage)) {
  470.                 grantRuntimePermissionsLPw(galleryPackage, STORAGE_PERMISSIONS, userId);
  471.             }
  472.  
  473.             // Email
  474.             Intent emailIntent = new Intent(Intent.ACTION_MAIN);
  475.             emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
  476.             PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackageLPr(
  477.                     emailIntent, userId);
  478.             if (emailPackage != null
  479.                     && doesPackageSupportRuntimePermissions(emailPackage)) {
  480.                 grantRuntimePermissionsLPw(emailPackage, CONTACTS_PERMISSIONS, userId);
  481.             }
  482.  
  483.             // Browser
  484.             PackageParser.Package browserPackage = null;
  485.             String defaultBrowserPackage = mService.getDefaultBrowserPackageName(userId);
  486.             if (defaultBrowserPackage != null) {
  487.                 browserPackage = getPackageLPr(defaultBrowserPackage);
  488.             }
  489.             if (browserPackage == null) {
  490.                 Intent browserIntent = new Intent(Intent.ACTION_MAIN);
  491.                 browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
  492.                 browserPackage = getDefaultSystemHandlerActivityPackageLPr(
  493.                         browserIntent, userId);
  494.             }
  495.             if (browserPackage != null
  496.                     && doesPackageSupportRuntimePermissions(browserPackage)) {
  497.                 grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
  498.             }
  499.  
  500.             // IME
  501.             if (imePackageNames != null) {
  502.                 for (String imePackageName : imePackageNames) {
  503.                     PackageParser.Package imePackage = getSystemPackageLPr(imePackageName);
  504.                     if (imePackage != null
  505.                             && doesPackageSupportRuntimePermissions(imePackage)) {
  506.                         grantRuntimePermissionsLPw(imePackage, CONTACTS_PERMISSIONS, userId);
  507.                     }
  508.                 }
  509.             }
  510.  
  511.             // Voice interaction
  512.             if (voiceInteractPackageNames != null) {
  513.                 for (String voiceInteractPackageName : voiceInteractPackageNames) {
  514.                     PackageParser.Package voiceInteractPackage = getSystemPackageLPr(
  515.                             voiceInteractPackageName);
  516.                     if (voiceInteractPackage != null
  517.                             && doesPackageSupportRuntimePermissions(voiceInteractPackage)) {
  518.                         grantRuntimePermissionsLPw(voiceInteractPackage,
  519.                                 CONTACTS_PERMISSIONS, userId);
  520.                         grantRuntimePermissionsLPw(voiceInteractPackage,
  521.                                 CALENDAR_PERMISSIONS, userId);
  522.                         grantRuntimePermissionsLPw(voiceInteractPackage,
  523.                                 MICROPHONE_PERMISSIONS, userId);
  524.                         grantRuntimePermissionsLPw(voiceInteractPackage,
  525.                                 PHONE_PERMISSIONS, userId);
  526.                         grantRuntimePermissionsLPw(voiceInteractPackage,
  527.                                 SMS_PERMISSIONS, userId);
  528.                         grantRuntimePermissionsLPw(voiceInteractPackage,
  529.                                 LOCATION_PERMISSIONS, userId);
  530.                     }
  531.                 }
  532.             }
  533.  
  534.             // Voice recognition
  535.             Intent voiceRecoIntent = new Intent("android.speech.RecognitionService");
  536.             voiceRecoIntent.addCategory(Intent.CATEGORY_DEFAULT);
  537.             PackageParser.Package voiceRecoPackage = getDefaultSystemHandlerServicePackageLPr(
  538.                     voiceRecoIntent, userId);
  539.             if (voiceRecoPackage != null
  540.                     && doesPackageSupportRuntimePermissions(voiceRecoPackage)) {
  541.                 grantRuntimePermissionsLPw(voiceRecoPackage, MICROPHONE_PERMISSIONS, userId);
  542.             }
  543.  
  544.             // Location
  545.             if (locationPackageNames != null) {
  546.                 for (String packageName : locationPackageNames) {
  547.                     PackageParser.Package locationPackage = getSystemPackageLPr(packageName);
  548.                     if (locationPackage != null
  549.                             && doesPackageSupportRuntimePermissions(locationPackage)) {
  550.                         grantRuntimePermissionsLPw(locationPackage, CONTACTS_PERMISSIONS, userId);
  551.                         grantRuntimePermissionsLPw(locationPackage, CALENDAR_PERMISSIONS, userId);
  552.                         grantRuntimePermissionsLPw(locationPackage, MICROPHONE_PERMISSIONS, userId);
  553.                         grantRuntimePermissionsLPw(locationPackage, PHONE_PERMISSIONS, userId);
  554.                         grantRuntimePermissionsLPw(locationPackage, SMS_PERMISSIONS, userId);
  555.                         grantRuntimePermissionsLPw(locationPackage, LOCATION_PERMISSIONS,
  556.                                 true, userId);
  557.                         grantRuntimePermissionsLPw(locationPackage, CAMERA_PERMISSIONS, userId);
  558.                         grantRuntimePermissionsLPw(locationPackage, SENSORS_PERMISSIONS, userId);
  559.                         grantRuntimePermissionsLPw(locationPackage, STORAGE_PERMISSIONS, userId);
  560.                     }
  561.                 }
  562.             }
  563.  
  564.             // Music
  565.             Intent musicIntent = new Intent(Intent.ACTION_VIEW);
  566.             musicIntent.addCategory(Intent.CATEGORY_DEFAULT);
  567.             musicIntent.setDataAndType(Uri.fromFile(new File("foo.mp3")),
  568.                     AUDIO_MIME_TYPE);
  569.             PackageParser.Package musicPackage = getDefaultSystemHandlerActivityPackageLPr(
  570.                     musicIntent, userId);
  571.             if (musicPackage != null
  572.                     && doesPackageSupportRuntimePermissions(musicPackage)) {
  573.                 grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId);
  574.             }
  575.  
  576.             // Google Account
  577.             PackageParser.Package googleaccountPackage = getDefaultProviderAuthorityPackageLPr(
  578.                     "com.google.android.gsf.login", userId);
  579.             if (googleaccountPackage != null) {
  580.                 grantRuntimePermissionsLPw(googleaccountPackage, CONTACTS_PERMISSIONS, userId);
  581.                 grantRuntimePermissionsLPw(googleaccountPackage, PHONE_PERMISSIONS, userId);
  582.             }
  583.  
  584.             // Google App
  585.             PackageParser.Package googleappPackage = getDefaultProviderAuthorityPackageLPr(
  586.                     "com.google.android.googlequicksearchbox", userId);
  587.             if (googleappPackage != null) {
  588.                 grantRuntimePermissionsLPw(googleappPackage, CALENDAR_PERMISSIONS, userId);
  589.                 grantRuntimePermissionsLPw(googleappPackage, CAMERA_PERMISSIONS, userId);
  590.                 grantRuntimePermissionsLPw(googleappPackage, CONTACTS_PERMISSIONS, userId);
  591.                 grantRuntimePermissionsLPw(googleappPackage, LOCATION_PERMISSIONS, userId);
  592.                 grantRuntimePermissionsLPw(googleappPackage, MICROPHONE_PERMISSIONS, userId);
  593.                 grantRuntimePermissionsLPw(googleappPackage, PHONE_PERMISSIONS, userId);
  594.                 grantRuntimePermissionsLPw(googleappPackage, SMS_PERMISSIONS, userId);
  595.                 grantRuntimePermissionsLPw(googleappPackage, STORAGE_PERMISSIONS, userId);
  596.             }
  597.  
  598.             // Google Play Services
  599.             PackageParser.Package gmscorePackage = getDefaultProviderAuthorityPackageLPr(
  600.                     "com.google.android.gms", userId);
  601.             if (gmscorePackage != null) {
  602.                 grantRuntimePermissionsLPw(gmscorePackage, SENSORS_PERMISSIONS, userId);
  603.                 grantRuntimePermissionsLPw(gmscorePackage, CALENDAR_PERMISSIONS, userId);
  604.                 grantRuntimePermissionsLPw(gmscorePackage, CAMERA_PERMISSIONS, userId);
  605.                 grantRuntimePermissionsLPw(gmscorePackage, CONTACTS_PERMISSIONS, userId);
  606.                 grantRuntimePermissionsLPw(gmscorePackage, LOCATION_PERMISSIONS, userId);
  607.                 grantRuntimePermissionsLPw(gmscorePackage, MICROPHONE_PERMISSIONS, userId);
  608.                 grantRuntimePermissionsLPw(gmscorePackage, PHONE_PERMISSIONS, userId);
  609.                 grantRuntimePermissionsLPw(gmscorePackage, SMS_PERMISSIONS, userId);
  610.                 grantRuntimePermissionsLPw(gmscorePackage, STORAGE_PERMISSIONS, userId);
  611.             }
  612.  
  613.             // Google Connectivity Services
  614.             PackageParser.Package gcsPackage = getDefaultProviderAuthorityPackageLPr(
  615.                     "com.google.android.apps.gcs", userId);
  616.             if (gcsPackage != null) {
  617.                 grantRuntimePermissionsLPw(gcsPackage, CONTACTS_PERMISSIONS, userId);
  618.                 grantRuntimePermissionsLPw(gcsPackage, LOCATION_PERMISSIONS, userId);
  619.             }
  620.  
  621.             // Google Contacts Sync
  622.             PackageParser.Package googlecontactssyncPackage = getDefaultProviderAuthorityPackageLPr(
  623.                     "com.google.android.syncadapters.contacts", userId);
  624.             if (googlecontactssyncPackage != null) {
  625.                 grantRuntimePermissionsLPw(googlecontactssyncPackage, CONTACTS_PERMISSIONS, userId);
  626.             }          
  627.  
  628.             // Google Backup Transport
  629.             PackageParser.Package googlebackuptransportPackage = getDefaultProviderAuthorityPackageLPr(
  630.                     "com.google.android.backuptransport", userId);
  631.             if (googlebackuptransportPackage != null) {
  632.                 grantRuntimePermissionsLPw(googlebackuptransportPackage, CONTACTS_PERMISSIONS, userId);
  633.             }          
  634.            
  635.             // Google Play Framework
  636.             PackageParser.Package gsfcorePackage = getDefaultProviderAuthorityPackageLPr(
  637.                     "com.google.android.gsf", userId);
  638.             if (gsfcorePackage != null) {
  639.                 grantRuntimePermissionsLPw(gsfcorePackage, CONTACTS_PERMISSIONS, userId);
  640.                 grantRuntimePermissionsLPw(gsfcorePackage, PHONE_PERMISSIONS, userId);
  641.             }      
  642.  
  643.             // Google Setup Wizard
  644.             PackageParser.Package setupwizardPackage = getDefaultProviderAuthorityPackageLPr(
  645.                     "com.google.android.setupwizard", userId);
  646.             if (setupwizardPackage != null) {
  647.                 grantRuntimePermissionsLPw(setupwizardPackage, CONTACTS_PERMISSIONS, userId);
  648.                 grantRuntimePermissionsLPw(setupwizardPackage, PHONE_PERMISSIONS, userId);
  649.             }  
  650.  
  651.             // Google Play Store
  652.             PackageParser.Package vendingPackage = getDefaultProviderAuthorityPackageLPr(
  653.                     "com.android.vending", userId);
  654.             if (vendingPackage != null) {
  655.                 grantRuntimePermissionsLPw(vendingPackage, CONTACTS_PERMISSIONS, userId);
  656.                 grantRuntimePermissionsLPw(vendingPackage, PHONE_PERMISSIONS, userId);
  657.                 grantRuntimePermissionsLPw(vendingPackage, LOCATION_PERMISSIONS, userId);
  658.                 grantRuntimePermissionsLPw(vendingPackage, SMS_PERMISSIONS, userId);
  659.             }  
  660.                
  661.            
  662.             mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
  663.         }
  664.     }
  665.  
  666.     private void grantDefaultPermissionsToDefaultSystemDialerAppLPr(
  667.             PackageParser.Package dialerPackage, int userId) {
  668.         if (doesPackageSupportRuntimePermissions(dialerPackage)) {
  669.             grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
  670.             grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
  671.             grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
  672.             grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
  673.         }
  674.     }
  675.  
  676.     private void grantDefaultPermissionsToDefaultSystemSmsAppLPr(
  677.             PackageParser.Package smsPackage, int userId) {
  678.         if (doesPackageSupportRuntimePermissions(smsPackage)) {
  679.             grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
  680.             grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId);
  681.             grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
  682.             grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId);
  683.             grantRuntimePermissionsLPw(smsPackage, STORAGE_PERMISSIONS, true, userId);
  684.         }
  685.     }
  686.  
  687.     public void grantDefaultPermissionsToDefaultSmsAppLPr(String packageName, int userId) {
  688.         Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
  689.         if (packageName == null) {
  690.             return;
  691.         }
  692.         PackageParser.Package smsPackage = getPackageLPr(packageName);
  693.         if (smsPackage != null && doesPackageSupportRuntimePermissions(smsPackage)) {
  694.             grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, false, true, userId);
  695.             grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, false, true, userId);
  696.             grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, false, true, userId);
  697.         }
  698.     }
  699.  
  700.     public void grantDefaultPermissionsToDefaultDialerAppLPr(String packageName, int userId) {
  701.         Log.i(TAG, "Granting permissions to default dialer app for user:" + userId);
  702.         if (packageName == null) {
  703.             return;
  704.         }
  705.         PackageParser.Package dialerPackage = getPackageLPr(packageName);
  706.         if (dialerPackage != null
  707.                 && doesPackageSupportRuntimePermissions(dialerPackage)) {
  708.             grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, false, true, userId);
  709.             grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, false, true, userId);
  710.             grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, false, true, userId);
  711.             grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, false, true, userId);
  712.         }
  713.     }
  714.  
  715.     private void grantDefaultPermissionsToDefaultSimCallManagerLPr(
  716.             PackageParser.Package simCallManagerPackage, int userId) {
  717.         Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
  718.         if (doesPackageSupportRuntimePermissions(simCallManagerPackage)) {
  719.             grantRuntimePermissionsLPw(simCallManagerPackage, PHONE_PERMISSIONS, userId);
  720.             grantRuntimePermissionsLPw(simCallManagerPackage, MICROPHONE_PERMISSIONS, userId);
  721.         }
  722.     }
  723.  
  724.     public void grantDefaultPermissionsToDefaultSimCallManagerLPr(String packageName, int userId) {
  725.         if (packageName == null) {
  726.             return;
  727.         }
  728.         PackageParser.Package simCallManagerPackage = getPackageLPr(packageName);
  729.         if (simCallManagerPackage != null) {
  730.             grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage, userId);
  731.         }
  732.     }
  733.  
  734.     public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) {
  735.         Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
  736.         if (packageNames == null) {
  737.             return;
  738.         }
  739.         for (String packageName : packageNames) {
  740.             PackageParser.Package carrierPackage = getSystemPackageLPr(packageName);
  741.             if (carrierPackage != null
  742.                     && doesPackageSupportRuntimePermissions(carrierPackage)) {
  743.                 grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId);
  744.                 grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId);
  745.                 grantRuntimePermissionsLPw(carrierPackage, SMS_PERMISSIONS, userId);
  746.             }
  747.         }
  748.     }
  749.  
  750.     public void grantDefaultPermissionsToDefaultBrowserLPr(String packageName, int userId) {
  751.         Log.i(TAG, "Granting permissions to default browser for user:" + userId);
  752.         if (packageName == null) {
  753.             return;
  754.         }
  755.         PackageParser.Package browserPackage = getSystemPackageLPr(packageName);
  756.         if (browserPackage != null
  757.                 && doesPackageSupportRuntimePermissions(browserPackage)) {
  758.             grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, false, false, userId);
  759.         }
  760.     }
  761.  
  762.     private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr(
  763.             Intent intent, int userId) {
  764.         List<ResolveInfo> handlers = mService.mActivities.queryIntent(intent,
  765.                 intent.resolveType(mService.mContext.getContentResolver()),
  766.                 PackageManager.GET_DISABLED_COMPONENTS, userId);
  767.         if (handlers == null) {
  768.             return null;
  769.         }
  770.         final int handlerCount = handlers.size();
  771.         for (int i = 0; i < handlerCount; i++) {
  772.             ResolveInfo handler = handlers.get(i);
  773.             PackageParser.Package handlerPackage = getSystemPackageLPr(
  774.                     handler.activityInfo.packageName);
  775.             if (handlerPackage != null) {
  776.                 return handlerPackage;
  777.             }
  778.         }
  779.         return null;
  780.     }
  781.  
  782.     private PackageParser.Package getDefaultSystemHandlerServicePackageLPr(
  783.             Intent intent, int userId) {
  784.         List<ResolveInfo> handlers = mService.queryIntentServices(intent,
  785.                 intent.resolveType(mService.mContext.getContentResolver()),
  786.                 PackageManager.GET_DISABLED_COMPONENTS, userId);
  787.         if (handlers == null) {
  788.             return null;
  789.         }
  790.         final int handlerCount = handlers.size();
  791.         for (int i = 0; i < handlerCount; i++) {
  792.             ResolveInfo handler = handlers.get(i);
  793.             PackageParser.Package handlerPackage = getSystemPackageLPr(
  794.                     handler.serviceInfo.packageName);
  795.             if (handlerPackage != null) {
  796.                 return handlerPackage;
  797.             }
  798.         }
  799.         return null;
  800.     }
  801.  
  802.     private List<PackageParser.Package> getHeadlessSyncAdapterPackagesLPr(
  803.             String[] syncAdapterPackageNames, int userId) {
  804.         List<PackageParser.Package> syncAdapterPackages = new ArrayList<>();
  805.  
  806.         Intent homeIntent = new Intent(Intent.ACTION_MAIN);
  807.         homeIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  808.  
  809.         for (String syncAdapterPackageName : syncAdapterPackageNames) {
  810.             homeIntent.setPackage(syncAdapterPackageName);
  811.  
  812.             List<ResolveInfo> homeActivities = mService.mActivities.queryIntent(homeIntent,
  813.                     homeIntent.resolveType(mService.mContext.getContentResolver()),
  814.                     PackageManager.GET_DISABLED_COMPONENTS, userId);
  815.             if (!homeActivities.isEmpty()) {
  816.                 continue;
  817.             }
  818.  
  819.             PackageParser.Package syncAdapterPackage = getSystemPackageLPr(syncAdapterPackageName);
  820.             if (syncAdapterPackage != null) {
  821.                 syncAdapterPackages.add(syncAdapterPackage);
  822.             }
  823.         }
  824.  
  825.         return syncAdapterPackages;
  826.     }
  827.  
  828.     private PackageParser.Package getDefaultProviderAuthorityPackageLPr(
  829.             String authority, int userId) {
  830.         ProviderInfo provider = mService.resolveContentProvider(authority, 0, userId);
  831.         if (provider != null) {
  832.             return getSystemPackageLPr(provider.packageName);
  833.         }
  834.         return null;
  835.     }
  836.  
  837.     private PackageParser.Package getPackageLPr(String packageName) {
  838.         return mService.mPackages.get(packageName);
  839.     }
  840.  
  841.     private PackageParser.Package getSystemPackageLPr(String packageName) {
  842.         PackageParser.Package pkg = getPackageLPr(packageName);
  843.         if (pkg != null && pkg.isSystemApp()) {
  844.             return !isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) ? pkg : null;
  845.         }
  846.         return null;
  847.     }
  848.  
  849.     private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
  850.             int userId) {
  851.         grantRuntimePermissionsLPw(pkg, permissions, false, false, userId);
  852.     }
  853.  
  854.     private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
  855.             boolean systemFixed, int userId) {
  856.         grantRuntimePermissionsLPw(pkg, permissions, systemFixed, false, userId);
  857.     }
  858.  
  859.     private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
  860.             boolean systemFixed, boolean overrideUserChoice,  int userId) {
  861.         if (pkg.requestedPermissions.isEmpty()) {
  862.             return;
  863.         }
  864.  
  865.         List<String> requestedPermissions = pkg.requestedPermissions;
  866.         Set<String> grantablePermissions = null;
  867.  
  868.         if (pkg.isUpdatedSystemApp()) {
  869.             PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
  870.             if (sysPs != null) {
  871.                 if (sysPs.pkg.requestedPermissions.isEmpty()) {
  872.                     return;
  873.                 }
  874.                 if (!requestedPermissions.equals(sysPs.pkg.requestedPermissions)) {
  875.                     grantablePermissions = new ArraySet<>(requestedPermissions);
  876.                     requestedPermissions = sysPs.pkg.requestedPermissions;
  877.                 }
  878.             }
  879.         }
  880.  
  881.         final int grantablePermissionCount = requestedPermissions.size();
  882.         for (int i = 0; i < grantablePermissionCount; i++) {
  883.             String permission = requestedPermissions.get(i);
  884.  
  885.             // If there is a disabled system app it may request a permission the updated
  886.             // version ot the data partition doesn't, In this case skip the permission.
  887.             if (grantablePermissions != null && !grantablePermissions.contains(permission)) {
  888.                 continue;
  889.             }
  890.  
  891.             if (permissions.contains(permission)) {
  892.                 final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId);
  893.  
  894.                 // If any flags are set to the permission, then it is either set in
  895.                 // its current state by the system or device/profile owner or the user.
  896.                 // In all these cases we do not want to clobber the current state.
  897.                 // Unless the caller wants to override user choices. The override is
  898.                 // to make sure we can grant the needed permission to the default
  899.                 // sms and phone apps after the user chooses this in the UI.
  900.                 if (flags == 0 || overrideUserChoice) {
  901.                     // Never clobber policy or system.
  902.                     final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
  903.                             | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
  904.                     if ((flags & fixedFlags) != 0) {
  905.                         continue;
  906.                     }
  907.  
  908.                     mService.grantRuntimePermission(pkg.packageName, permission, userId);
  909.                     if (DEBUG) {
  910.                         Log.i(TAG, "Granted " + permission + " to default handler "
  911.                                 + pkg.packageName);
  912.                     }
  913.  
  914.                     int newFlags = PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
  915.                     if (systemFixed) {
  916.                         newFlags |= PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
  917.                     }
  918.  
  919.                     mService.updatePermissionFlags(permission, pkg.packageName,
  920.                             newFlags, newFlags, userId);
  921.                 }
  922.             }
  923.         }
  924.     }
  925.  
  926.     private boolean isSysComponentOrPersistentPlatformSignedPrivAppLPr(PackageParser.Package pkg) {
  927.         if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) {
  928.             return true;
  929.         }
  930.         if (!pkg.isPrivilegedApp()) {
  931.             return false;
  932.         }
  933.         PackageSetting sysPkg = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
  934.         if (sysPkg != null) {
  935.             if ((sysPkg.pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
  936.                 return false;
  937.             }
  938.         } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
  939.             return false;
  940.         }
  941.         return PackageManagerService.compareSignatures(mService.mPlatformPackage.mSignatures,
  942.                 pkg.mSignatures) == PackageManager.SIGNATURE_MATCH;
  943.     }
  944.  
  945.     private static boolean doesPackageSupportRuntimePermissions(PackageParser.Package pkg) {
  946.         return pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
  947.     }
  948. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement