diff options
| author | 2023-05-11 22:22:23 +0000 | |
|---|---|---|
| committer | 2023-05-11 22:22:23 +0000 | |
| commit | 047f86d6fa086efe982bee7bfcb0a5fa2bc24a5c (patch) | |
| tree | a9446ac3db499c8d3148ec7dded36f6ee4239234 | |
| parent | 4d1298eee8dea49c47a6c282961fcfa4d78c200d (diff) | |
| parent | c62c2ac8f7ab80882edbeda26c617f5b9cc63bec (diff) | |
Merge "Allow default dialer app to use the "phoneCall" FGS type." into udc-dev
| -rw-r--r-- | core/java/android/app/ForegroundServiceTypePolicy.java | 29 | ||||
| -rw-r--r-- | core/java/android/content/pm/ServiceInfo.java | 3 | ||||
| -rw-r--r-- | 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 19b31417e789..98fe61616c78 100644 --- a/core/java/android/app/ForegroundServiceTypePolicy.java +++ b/core/java/android/app/ForegroundServiceTypePolicy.java @@ -44,6 +44,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; @@ -59,6 +60,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; @@ -75,6 +77,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; /** @@ -334,7 +337,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 */ @@ -1131,6 +1135,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<String> 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. */ static class UsbDevicePermission extends ForegroundServiceTypePermission { 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 * <p>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}. --> <flag name="phoneCall" value="0x04" /> <!-- GPS, map, navigation location update. |