summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ForegroundServiceTypePolicy.java29
-rw-r--r--core/java/android/content/pm/ServiceInfo.java3
-rw-r--r--core/res/res/values/attrs_manifest.xml3
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.