From c62c2ac8f7ab80882edbeda26c617f5b9cc63bec Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Mon, 8 May 2023 22:04:49 -0700 Subject: Allow default dialer app to use the "phoneCall" FGS type. Bug: 280003654 Test: atest CtsAppFgsTestCases Change-Id: Idc00fb6a04b133c8ba455bb029a4f13f1d8bc64c --- .../android/app/ForegroundServiceTypePolicy.java | 29 +++++++++++++++++++++- core/java/android/content/pm/ServiceInfo.java | 3 ++- core/res/res/values/attrs_manifest.xml | 3 ++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/ForegroundServiceTypePolicy.java b/core/java/android/app/ForegroundServiceTypePolicy.java index c0c59a24dd8d..f10913ce94f3 100644 --- a/core/java/android/app/ForegroundServiceTypePolicy.java +++ b/core/java/android/app/ForegroundServiceTypePolicy.java @@ -43,6 +43,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.compat.CompatChanges; +import android.app.role.RoleManager; import android.compat.Compatibility; import android.compat.annotation.ChangeId; import android.compat.annotation.Disabled; @@ -58,6 +59,7 @@ import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.permission.PermissionCheckerManager; import android.provider.DeviceConfig; import android.text.TextUtils; @@ -74,6 +76,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Optional; /** @@ -333,7 +336,8 @@ public abstract class ForegroundServiceTypePolicy { new RegularPermission(Manifest.permission.FOREGROUND_SERVICE_PHONE_CALL) }, true), new ForegroundServiceTypePermissions(new ForegroundServiceTypePermission[] { - new RegularPermission(Manifest.permission.MANAGE_OWN_CALLS) + new RegularPermission(Manifest.permission.MANAGE_OWN_CALLS), + new RolePermission(RoleManager.ROLE_DIALER) }, false), FGS_TYPE_PERM_ENFORCEMENT_FLAG_PHONE_CALL /* permissionEnforcementFlag */, true /* permissionEnforcementFlagDefaultValue */ @@ -1122,6 +1126,29 @@ public abstract class ForegroundServiceTypePolicy { } } + /** + * This represents a particular role an app needs to hold for a specific service type. + */ + static class RolePermission extends ForegroundServiceTypePermission { + final String mRole; + + RolePermission(@NonNull String role) { + super(role); + mRole = role; + } + + @Override + @PackageManager.PermissionResult + public int checkPermission(@NonNull Context context, int callerUid, int callerPid, + String packageName, boolean allowWhileInUse) { + final RoleManager rm = context.getSystemService(RoleManager.class); + final List holders = rm.getRoleHoldersAsUser(mRole, + UserHandle.getUserHandleForUid(callerUid)); + return holders != null && holders.contains(packageName) + ? PERMISSION_GRANTED : PERMISSION_DENIED; + } + } + /** * This represents a special Android permission to be required for accessing usb devices. */ diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java index 7e0954a55560..be8b2a20cfb1 100644 --- a/core/java/android/content/pm/ServiceInfo.java +++ b/core/java/android/content/pm/ServiceInfo.java @@ -168,7 +168,8 @@ public class ServiceInfo extends ComponentInfo *

Starting foreground service with this type from apps targeting API level * {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE} and later, will require permission * {@link android.Manifest.permission#FOREGROUND_SERVICE_PHONE_CALL} and - * {@link android.Manifest.permission#MANAGE_OWN_CALLS}. + * {@link android.Manifest.permission#MANAGE_OWN_CALLS} or holding the default + * {@link android.app.role.RoleManager#ROLE_DIALER dialer role}. */ @RequiresPermission( allOf = { diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 1bbe8eeaf37f..ba92360e10ca 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1618,7 +1618,8 @@ {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE} and above, starting a foreground service with this type will require permission {@link android.Manifest.permission#FOREGROUND_SERVICE_PHONE_CALL} and - {@link android.Manifest.permission#MANAGE_OWN_CALLS}. + {@link android.Manifest.permission#MANAGE_OWN_CALLS} or holding the default + {@link android.app.role.RoleManager#ROLE_DIALER dialer role}. -->