summaryrefslogtreecommitdiff
path: root/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
diff options
context:
space:
mode:
Diffstat (limited to 'PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java')
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java104
1 files changed, 85 insertions, 19 deletions
diff --git a/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
index 3254bc6e4..4bf5a6294 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
@@ -22,15 +22,20 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
+import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import com.android.modules.utils.build.SdkLevel;
+import com.android.role.controller.model.AppOpPermissions;
import com.android.role.controller.model.Permissions;
import com.android.role.controller.model.Role;
import com.android.role.controller.model.RoleBehavior;
+import com.android.role.controller.model.VisibilityMixin;
import com.android.role.controller.util.UserUtils;
import java.util.Arrays;
@@ -51,6 +56,18 @@ public class HomeRoleBehavior implements RoleBehavior {
android.Manifest.permission.WRITE_CALL_LOG,
android.Manifest.permission.READ_CONTACTS);
+ @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+ private static final List<String> WEAR_PERMISSIONS_T = Arrays.asList(
+ android.Manifest.permission.POST_NOTIFICATIONS,
+ android.Manifest.permission.SYSTEM_APPLICATION_OVERLAY);
+
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ private static final List<String> WEAR_PERMISSIONS_V = Arrays.asList(
+ android.Manifest.permission.ALWAYS_UPDATE_WALLPAPER);
+
+ private static final List<String> WEAR_APP_OP_PERMISSIONS = Arrays.asList(
+ android.Manifest.permission.SYSTEM_ALERT_WINDOW);
+
@Override
public boolean isAvailableAsUser(@NonNull Role role, @NonNull UserHandle user,
@NonNull Context context) {
@@ -62,10 +79,12 @@ public class HomeRoleBehavior implements RoleBehavior {
*/
@Nullable
@Override
- public String getFallbackHolder(@NonNull Role role, @NonNull Context context) {
- PackageManager packageManager = context.getPackageManager();
+ public String getFallbackHolderAsUser(@NonNull Role role, @NonNull UserHandle user,
+ @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ PackageManager userPackageManager = userContext.getPackageManager();
Intent intent = role.getRequiredComponents().get(0).getIntentFilterData().createIntent();
- List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent,
+ List<ResolveInfo> resolveInfos = userPackageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
@@ -78,7 +97,8 @@ public class HomeRoleBehavior implements RoleBehavior {
// Leave the fallback to PackageManagerService if there is only the fallback home in
// Settings, because if we fallback to it here, we cannot fallback to a normal home
// later, and user cannot see the fallback home in the UI anyway.
- if (isSettingsApplication(resolveInfo.activityInfo.applicationInfo, context)) {
+ if (isSettingsApplicationAsUser(resolveInfo.activityInfo.applicationInfo, user,
+ context)) {
continue;
}
if (resolveInfo.priority > priority) {
@@ -94,14 +114,16 @@ public class HomeRoleBehavior implements RoleBehavior {
/**
* Check if the application is a settings application
*/
- public static boolean isSettingsApplication(@NonNull ApplicationInfo applicationInfo,
- @NonNull Context context) {
- PackageManager packageManager = context.getPackageManager();
- ResolveInfo resolveInfo = packageManager.resolveActivity(new Intent(
- Settings.ACTION_SETTINGS), PackageManager.MATCH_DEFAULT_ONLY
+ private static boolean isSettingsApplicationAsUser(@NonNull ApplicationInfo applicationInfo,
+ @NonNull UserHandle user, @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ PackageManager userPackageManager = userContext.getPackageManager();
+ ResolveInfo resolveInfo = userPackageManager.resolveActivity(
+ new Intent(Settings.ACTION_SETTINGS), PackageManager.MATCH_DEFAULT_ONLY
| PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
- if (resolveInfo == null || resolveInfo.activityInfo == null) {
+ if (resolveInfo == null || resolveInfo.activityInfo == null
+ || !resolveInfo.activityInfo.exported) {
return false;
}
return Objects.equals(applicationInfo.packageName, resolveInfo.activityInfo.packageName);
@@ -119,31 +141,62 @@ public class HomeRoleBehavior implements RoleBehavior {
}
@Override
- public void grant(@NonNull Role role, @NonNull String packageName, @NonNull Context context) {
+ public void grantAsUser(@NonNull Role role, @NonNull String packageName,
+ @NonNull UserHandle user, @NonNull Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
- Permissions.grant(packageName, AUTOMOTIVE_PERMISSIONS,
- true, false, true, false, false, context);
+ Permissions.grantAsUser(packageName, AUTOMOTIVE_PERMISSIONS,
+ true, false, true, false, false, user, context);
}
// Before T, ALLOW_SLIPPERY_TOUCHES may either not exist, or may not be a role permission
if (isRolePermission(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES, context)) {
- Permissions.grant(packageName,
+ Permissions.grantAsUser(packageName,
Arrays.asList(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES),
- true, false, true, false, false, context);
+ true, false, true, false, false, user, context);
+ }
+
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+ if (SdkLevel.isAtLeastT()) {
+ Permissions.grantAsUser(packageName, WEAR_PERMISSIONS_T,
+ true, false, true, false, false, user, context);
+ for (String permission : WEAR_APP_OP_PERMISSIONS) {
+ AppOpPermissions.grantAsUser(packageName, permission, true, user, context);
+ }
+ }
+ if (SdkLevel.isAtLeastV()) {
+ Permissions.grantAsUser(packageName, WEAR_PERMISSIONS_V,
+ true, false, true, false, false, user, context);
+ }
}
}
@Override
- public void revoke(@NonNull Role role, @NonNull String packageName, @NonNull Context context) {
+ public void revokeAsUser(@NonNull Role role, @NonNull String packageName,
+ @NonNull UserHandle user, @NonNull Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
- Permissions.revoke(packageName, AUTOMOTIVE_PERMISSIONS, true, false, false, context);
+ Permissions.revokeAsUser(packageName, AUTOMOTIVE_PERMISSIONS, true, false, false,
+ user, context);
}
// Before T, ALLOW_SLIPPERY_TOUCHES may either not exist, or may not be a role permission
if (isRolePermission(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES, context)) {
- Permissions.revoke(packageName,
+ Permissions.revokeAsUser(packageName,
Arrays.asList(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES),
- true, false, false, context);
+ true, false, false, user, context);
+ }
+
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+ if (SdkLevel.isAtLeastT()) {
+ Permissions.revokeAsUser(packageName, WEAR_PERMISSIONS_T, true, false, false,
+ user, context);
+ for (String permission : WEAR_APP_OP_PERMISSIONS) {
+ AppOpPermissions.revokeAsUser(packageName, permission, user, context);
+ }
+ }
+ if (SdkLevel.isAtLeastV()) {
+ Permissions.revokeAsUser(packageName, WEAR_PERMISSIONS_V, true, false, false,
+ user, context);
+ }
}
}
@@ -161,4 +214,17 @@ public class HomeRoleBehavior implements RoleBehavior {
final int flags = permissionInfo.getProtectionFlags();
return (flags & PermissionInfo.PROTECTION_FLAG_ROLE) == PermissionInfo.PROTECTION_FLAG_ROLE;
}
+
+ @Override
+ public boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
+ @NonNull Context context) {
+ return VisibilityMixin.isVisible("config_showDefaultHome", false, user, context);
+ }
+
+ @Override
+ public boolean isApplicationVisibleAsUser(@NonNull Role role,
+ @NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user,
+ @NonNull Context context) {
+ return !isSettingsApplicationAsUser(applicationInfo, user, context);
+ }
}