Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b96de8d authored by Sailesh Nepal's avatar Sailesh Nepal Committed by Android (Google) Code Review
Browse files

Merge "Default permissions for sim call manager" into mnc-dev

parents a7a65ee4 cf85562b
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -82,6 +82,12 @@ public abstract class PackageManagerInternal {
     */
    public abstract void setDialerAppPackagesProvider(PackagesProvider provider);

    /**
     * Sets the sim call manager packages provider.
     * @param provider The packages provider.
     */
    public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider);

    /**
     * Sets the sync adapter packages provider.
     * @param provider The provider.
@@ -101,4 +107,12 @@ public abstract class PackageManagerInternal {
     * @param userId The user for which to grant the permissions.
     */
    public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId);

    /**
     * Requests granting of the default permissions to the current default sim call manager.
     * @param packageName The default sim call manager package name.
     * @param userId The user for which to grant the permissions.
     */
    public abstract void grantDefaultPermissionsToDefaultSimCallManager(String packageName,
            int userId);
}
+40 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ final class DefaultPermissionGrantPolicy {
    private PackagesProvider mVoiceInteractionPackagesProvider;
    private PackagesProvider mSmsAppPackagesProvider;
    private PackagesProvider mDialerAppPackagesProvider;
    private PackagesProvider mSimCallManagerPackagesProvider;
    private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;

    public DefaultPermissionGrantPolicy(PackageManagerService service) {
@@ -151,6 +152,10 @@ final class DefaultPermissionGrantPolicy {
        mDialerAppPackagesProvider = provider;
    }

    public void setSimCallManagerPackagesProviderLPw(PackagesProvider provider) {
        mSimCallManagerPackagesProvider = provider;
    }

    public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) {
        mSyncAdapterPackagesProvider = provider;
    }
@@ -201,6 +206,7 @@ final class DefaultPermissionGrantPolicy {
        final PackagesProvider voiceInteractionPackagesProvider;
        final PackagesProvider smsAppPackagesProvider;
        final PackagesProvider dialerAppPackagesProvider;
        final PackagesProvider simCallManagerPackagesProvider;
        final SyncAdapterPackagesProvider syncAdapterPackagesProvider;

        synchronized (mService.mPackages) {
@@ -209,6 +215,7 @@ final class DefaultPermissionGrantPolicy {
            voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
            smsAppPackagesProvider = mSmsAppPackagesProvider;
            dialerAppPackagesProvider = mDialerAppPackagesProvider;
            simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
            syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
        }

@@ -222,6 +229,8 @@ final class DefaultPermissionGrantPolicy {
                ? smsAppPackagesProvider.getPackages(userId) : null;
        String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
                ? dialerAppPackagesProvider.getPackages(userId) : null;
        String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
                ? simCallManagerPackagesProvider.getPackages(userId) : null;
        String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
                syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
        String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
@@ -313,6 +322,18 @@ final class DefaultPermissionGrantPolicy {
                }
            }

            // Sim call manager
            if (simCallManagerPackageNames != null) {
                for (String simCallManagerPackageName : simCallManagerPackageNames) {
                    PackageParser.Package simCallManagerPackage =
                            getSystemPackageLPr(simCallManagerPackageName);
                    if (simCallManagerPackage != null) {
                        grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage,
                                userId);
                    }
                }
            }

            // SMS
            if (smsAppPackageNames == null) {
                Intent smsIntent = new Intent(Intent.ACTION_MAIN);
@@ -590,6 +611,25 @@ final class DefaultPermissionGrantPolicy {
        }
    }

    private void grantDefaultPermissionsToDefaultSimCallManagerLPr(
            PackageParser.Package simCallManagerPackage, int userId) {
        Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
        if (doesPackageSupportRuntimePermissions(simCallManagerPackage)) {
            grantRuntimePermissionsLPw(simCallManagerPackage, PHONE_PERMISSIONS, userId);
            grantRuntimePermissionsLPw(simCallManagerPackage, MICROPHONE_PERMISSIONS, userId);
        }
    }

    public void grantDefaultPermissionsToDefaultSimCallManagerLPr(String packageName, int userId) {
        if (packageName == null) {
            return;
        }
        PackageParser.Package simCallManagerPackage = getPackageLPr(packageName);
        if (simCallManagerPackage != null) {
            grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage, userId);
        }
    }

    public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) {
        Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
        if (packageNames == null) {
+14 −0
Original line number Diff line number Diff line
@@ -16516,6 +16516,13 @@ public class PackageManagerService extends IPackageManager.Stub {
            }
        }
        @Override
        public void setSimCallManagerPackagesProvider(PackagesProvider provider) {
            synchronized (mPackages) {
                mDefaultPermissionPolicy.setSimCallManagerPackagesProviderLPw(provider);
            }
        }
        @Override
        public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) {
            synchronized (mPackages) {
@@ -16538,6 +16545,13 @@ public class PackageManagerService extends IPackageManager.Stub {
                        packageName, userId);
            }
        }
        @Override
        public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) {
            synchronized (mPackages) {
                mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultSimCallManagerLPr(
                        packageName, userId);
            }
        }
    }
    @Override
+86 −1
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@

package com.android.server.telecom;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
@@ -31,6 +33,9 @@ import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.telecom.DefaultDialerManager;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.util.IntArray;
import android.util.Slog;

@@ -39,6 +44,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.telephony.SmsApplication;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.UserManagerService;

/**
 * Starts the telecom component by binding to its ITelecomService implementation. Telecom is setup
@@ -64,7 +70,8 @@ public class TelecomLoaderService extends SystemService {
                ServiceManager.addService(Context.TELECOM_SERVICE, service);

                synchronized (mLock) {
                    if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null) {
                    if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null
                            || mDefaultSimCallManagerRequests != null) {
                        final PackageManagerInternal packageManagerInternal = LocalServices
                                .getService(PackageManagerInternal.class);

@@ -95,6 +102,23 @@ public class TelecomLoaderService extends SystemService {
                                }
                            }
                        }
                        if (mDefaultSimCallManagerRequests != null) {
                            TelecomManager telecomManager =
                                (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
                            PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager();
                            if (phoneAccount != null) {
                                final int requestCount = mDefaultSimCallManagerRequests.size();
                                final String packageName =
                                    phoneAccount.getComponentName().getPackageName();
                                for (int i = requestCount - 1; i >= 0; i--) {
                                    final int userId = mDefaultSimCallManagerRequests.get(i);
                                    mDefaultSimCallManagerRequests.remove(i);
                                    packageManagerInternal
                                            .grantDefaultPermissionsToDefaultSimCallManager(
                                                    packageName, userId);
                                }
                            }
                        }
                    }
                }
            } catch (RemoteException e) {
@@ -122,6 +146,9 @@ public class TelecomLoaderService extends SystemService {
    @GuardedBy("mLock")
    private IntArray mDefaultDialerAppRequests;

    @GuardedBy("mLock")
    private IntArray mDefaultSimCallManagerRequests;

    private final Context mContext;

    @GuardedBy("mLock")
@@ -141,6 +168,7 @@ public class TelecomLoaderService extends SystemService {
    public void onBootPhase(int phase) {
        if (phase == PHASE_ACTIVITY_MANAGER_READY) {
            registerDefaultAppNotifier();
            registerCarrierConfigChangedReceiver();
            connectToTelecom();
        }
    }
@@ -215,6 +243,30 @@ public class TelecomLoaderService extends SystemService {
                return null;
            }
        });

        // Set a callback for the package manager to query the default sim call manager.
        packageManagerInternal.setSimCallManagerPackagesProvider(
                new PackageManagerInternal.PackagesProvider() {
            @Override
            public String[] getPackages(int userId) {
                synchronized (mLock) {
                    if (mServiceConnection == null) {
                        if (mDefaultSimCallManagerRequests == null) {
                            mDefaultSimCallManagerRequests = new IntArray();
                        }
                        mDefaultSimCallManagerRequests.add(userId);
                        return null;
                    }
                }
                TelecomManager telecomManager =
                    (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
                PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
                if (phoneAccount != null) {
                    return new String[]{phoneAccount.getComponentName().getPackageName()};
                }
                return null;
            }
        });
    }

    private void registerDefaultAppNotifier() {
@@ -245,6 +297,7 @@ public class TelecomLoaderService extends SystemService {
                        packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp(
                                packageName, userId);
                    }
                    updateSimCallManagerPermissions(packageManagerInternal, userId);
                }
            }
        };
@@ -254,4 +307,36 @@ public class TelecomLoaderService extends SystemService {
        mContext.getContentResolver().registerContentObserver(defaultDialerAppUri,
                false, contentObserver, UserHandle.USER_ALL);
    }


    private void registerCarrierConfigChangedReceiver() {
        final PackageManagerInternal packageManagerInternal = LocalServices.getService(
                PackageManagerInternal.class);
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
                    for (int userId : UserManagerService.getInstance().getUserIds()) {
                        updateSimCallManagerPermissions(packageManagerInternal, userId);
                    }
                }
            }
        };

        mContext.registerReceiverAsUser(receiver, UserHandle.ALL,
            new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null, null);
    }

    private void updateSimCallManagerPermissions(PackageManagerInternal packageManagerInternal,
            int userId) {
        TelecomManager telecomManager =
            (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
        PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
        if (phoneAccount != null) {
            Slog.i(TAG, "updating sim call manager permissions for userId:" + userId);
            String packageName = phoneAccount.getComponentName().getPackageName();
            packageManagerInternal.grantDefaultPermissionsToDefaultSimCallManager(
                packageName, userId);
        }
    }
}
+20 −0
Original line number Diff line number Diff line
@@ -492,6 +492,26 @@ public class TelecomManager {
        return null;
    }

    /**
     * Returns the current SIM call manager for the specified user. Apps must be prepared for this
     * method to return {@code null}, indicating that there currently exists no user-chosen default
     * {@code PhoneAccount}.
     *
     * @return The phone account handle of the current sim call manager.
     *
     * @hide
     */
    public PhoneAccountHandle getSimCallManager(int userId) {
        try {
            if (isServiceConnected()) {
                return getTelecomService().getSimCallManagerForUser(userId);
            }
        } catch (RemoteException e) {
            Log.e(TAG, "Error calling ITelecomService#getSimCallManagerForUser");
        }
        return null;
    }

    /**
     * Returns the current connection manager. Apps must be prepared for this method to return
     * {@code null}, indicating that there currently exists no user-chosen default
Loading