Merge "Migrate setPermittedInputMethods to policy engine" into udc-dev am: 1e9f13da34 am: 7e4987de0f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22849681

Change-Id: I057eb95223d433d202410e537f61a00674cf6dab
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Kholoud Mohamed
2023-04-26 09:30:28 +00:00
committed by Automerger Merge Worker
6 changed files with 115 additions and 62 deletions

View File

@@ -536,6 +536,12 @@ package android.app.admin {
field @NonNull public static final android.app.admin.DeviceAdminAuthority DEVICE_ADMIN_AUTHORITY; field @NonNull public static final android.app.admin.DeviceAdminAuthority DEVICE_ADMIN_AUTHORITY;
} }
public final class DevicePolicyIdentifiers {
field public static final String PERMITTED_INPUT_METHODS_POLICY = "permittedInputMethods";
field public static final String PERSONAL_APPS_SUSPENDED_POLICY = "personalAppsSuspended";
field public static final String SCREEN_CAPTURE_DISABLED_POLICY = "screenCaptureDisabled";
}
public class DevicePolicyManager { public class DevicePolicyManager {
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}) public void acknowledgeNewUserDisclaimer(); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}) public void acknowledgeNewUserDisclaimer();
method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void calculateHasIncompatibleAccounts(); method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void calculateHasIncompatibleAccounts();

View File

@@ -17,6 +17,7 @@
package android.app.admin; package android.app.admin;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.TestApi;
import android.os.UserManager; import android.os.UserManager;
import java.util.Objects; import java.util.Objects;
@@ -118,6 +119,7 @@ public final class DevicePolicyIdentifiers {
* *
* @hide * @hide
*/ */
@TestApi
public static final String PERMITTED_INPUT_METHODS_POLICY = "permittedInputMethods"; public static final String PERMITTED_INPUT_METHODS_POLICY = "permittedInputMethods";
/** /**
@@ -125,6 +127,7 @@ public final class DevicePolicyIdentifiers {
* *
* @hide * @hide
*/ */
@TestApi
public static final String PERSONAL_APPS_SUSPENDED_POLICY = "personalAppsSuspended"; public static final String PERSONAL_APPS_SUSPENDED_POLICY = "personalAppsSuspended";
/** /**
@@ -132,6 +135,7 @@ public final class DevicePolicyIdentifiers {
* *
* @hide * @hide
*/ */
@TestApi
public static final String SCREEN_CAPTURE_DISABLED_POLICY = "screenCaptureDisabled"; public static final String SCREEN_CAPTURE_DISABLED_POLICY = "screenCaptureDisabled";
/** /**

View File

@@ -130,12 +130,11 @@ final class DevicePolicyEngine {
<V> void setLocalPolicy( <V> void setLocalPolicy(
@NonNull PolicyDefinition<V> policyDefinition, @NonNull PolicyDefinition<V> policyDefinition,
@NonNull EnforcingAdmin enforcingAdmin, @NonNull EnforcingAdmin enforcingAdmin,
@NonNull PolicyValue<V> value, @Nullable PolicyValue<V> value,
int userId, int userId,
boolean skipEnforcePolicy) { boolean skipEnforcePolicy) {
Objects.requireNonNull(policyDefinition); Objects.requireNonNull(policyDefinition);
Objects.requireNonNull(enforcingAdmin); Objects.requireNonNull(enforcingAdmin);
Objects.requireNonNull(value);
synchronized (mLock) { synchronized (mLock) {
PolicyState<V> localPolicyState = getLocalPolicyStateLocked(policyDefinition, userId); PolicyState<V> localPolicyState = getLocalPolicyStateLocked(policyDefinition, userId);

View File

@@ -12214,18 +12214,23 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
synchronized (getLockObject()) { synchronized (getLockObject()) {
ActiveAdmin admin; if (isPolicyEngineForFinanceFlagEnabled()) {
if (isPermissionCheckFlagEnabled()) { EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackageName);
admin = enforcePermissionAndGetEnforcingAdmin( mDevicePolicyEngine.setLocalPolicy(
who, MANAGE_DEVICE_POLICY_INPUT_METHODS, PolicyDefinition.PERMITTED_INPUT_METHODS,
caller.getPackageName(), userId).getActiveAdmin(); admin,
packageList == null
? null
: new StringSetPolicyValue(new HashSet<>(packageList)),
userId);
} else { } else {
admin = getParentOfAdminIfRequired( ActiveAdmin admin = getParentOfAdminIfRequired(
getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()), calledOnParentInstance); getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()),
} calledOnParentInstance);
admin.permittedInputMethods = packageList; admin.permittedInputMethods = packageList;
saveSettingsLocked(caller.getUserId()); saveSettingsLocked(caller.getUserId());
} }
}
DevicePolicyEventLogger DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.SET_PERMITTED_INPUT_METHODS) .createEvent(DevicePolicyEnums.SET_PERMITTED_INPUT_METHODS)
@@ -12272,21 +12277,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
synchronized (getLockObject()) { synchronized (getLockObject()) {
ActiveAdmin admin; if (isPolicyEngineForFinanceFlagEnabled()) {
if (isPermissionCheckFlagEnabled()) {
int affectedUser = calledOnParentInstance ? getProfileParentId( int affectedUser = calledOnParentInstance ? getProfileParentId(
caller.getUserId()) : caller.getUserId(); caller.getUserId()) : caller.getUserId();
admin = enforcePermissionAndGetEnforcingAdmin( Set<String> policy = mDevicePolicyEngine.getResolvedPolicy(
who, MANAGE_DEVICE_POLICY_INPUT_METHODS, caller.getPackageName(), PolicyDefinition.PERMITTED_INPUT_METHODS, affectedUser);
affectedUser).getActiveAdmin(); return policy == null ? null : new ArrayList<>(policy);
} else { } else {
admin = getParentOfAdminIfRequired( ActiveAdmin admin = getParentOfAdminIfRequired(
getProfileOwnerOrDeviceOwnerLocked( getProfileOwnerOrDeviceOwnerLocked(
caller.getUserId()), calledOnParentInstance); caller.getUserId()), calledOnParentInstance);
}
return admin.permittedInputMethods; return admin.permittedInputMethods;
} }
} }
}
@Override @Override
public @Nullable List<String> getPermittedInputMethodsAsUser(@UserIdInt int userId) { public @Nullable List<String> getPermittedInputMethodsAsUser(@UserIdInt int userId) {
@@ -12302,11 +12306,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
private @Nullable List<String> getPermittedInputMethodsUnchecked(@UserIdInt int userId) { private @Nullable List<String> getPermittedInputMethodsUnchecked(@UserIdInt int userId) {
synchronized (getLockObject()) {
List<String> result = null; List<String> result = null;
if (isPolicyEngineForFinanceFlagEnabled()) {
Set<String> policy = mDevicePolicyEngine.getResolvedPolicy(
PolicyDefinition.PERMITTED_INPUT_METHODS, userId);
result = policy == null ? null : new ArrayList<>(policy);
} else {
synchronized (getLockObject()) {
// Only device or profile owners can have permitted lists set. // Only device or profile owners can have permitted lists set.
List<ActiveAdmin> admins = getActiveAdminsForAffectedUserInclPermissionBasedAdminLocked(userId); List<ActiveAdmin> admins =
for (ActiveAdmin admin: admins) { getActiveAdminsForAffectedUserInclPermissionBasedAdminLocked(
userId);
for (ActiveAdmin admin : admins) {
List<String> fromAdmin = admin.permittedInputMethods; List<String> fromAdmin = admin.permittedInputMethods;
if (fromAdmin != null) { if (fromAdmin != null) {
if (result == null) { if (result == null) {
@@ -12316,6 +12327,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
} }
} }
}
}
// If we have a permitted list add all system input methods. // If we have a permitted list add all system input methods.
if (result != null) { if (result != null) {
@@ -12333,7 +12346,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
return result; return result;
} }
}
@Override @Override
public boolean isInputMethodPermittedByAdmin(ComponentName who, String packageName, public boolean isInputMethodPermittedByAdmin(ComponentName who, String packageName,
@@ -12347,6 +12359,26 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
String.format(NOT_SYSTEM_CALLER_MSG, String.format(NOT_SYSTEM_CALLER_MSG,
"query if an input method is disabled by admin")); "query if an input method is disabled by admin"));
if (isPolicyEngineForFinanceFlagEnabled()) {
int affectedUser = calledOnParentInstance ? getProfileParentId(userHandle) : userHandle;
Map<EnforcingAdmin, PolicyValue<Set<String>>> policies =
mDevicePolicyEngine.getLocalPoliciesSetByAdmins(
PolicyDefinition.PERMITTED_INPUT_METHODS, affectedUser);
EnforcingAdmin admin = null;
for (EnforcingAdmin a : policies.keySet()) {
if (a.getPackageName().equals(who.getPackageName())) {
if (policies.get(a).getValue() == null) {
return true;
} else {
return checkPackagesInPermittedListOrSystem(
Collections.singletonList(packageName),
new ArrayList<>(policies.get(a).getValue()), affectedUser);
}
}
}
// Admin didn't set a policy
return false;
} else {
synchronized (getLockObject()) { synchronized (getLockObject()) {
ActiveAdmin admin = getParentOfAdminIfRequired( ActiveAdmin admin = getParentOfAdminIfRequired(
getActiveAdminUncheckedLocked(who, userHandle), calledOnParentInstance); getActiveAdminUncheckedLocked(who, userHandle), calledOnParentInstance);
@@ -12360,6 +12392,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
admin.permittedInputMethods, userHandle); admin.permittedInputMethods, userHandle);
} }
} }
}
@Override @Override
public boolean setPermittedCrossProfileNotificationListeners( public boolean setPermittedCrossProfileNotificationListeners(
@@ -23793,6 +23826,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
public DevicePolicyState getDevicePolicyState() { public DevicePolicyState getDevicePolicyState() {
Preconditions.checkCallAuthorization( Preconditions.checkCallAuthorization(
hasCallingOrSelfPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS)); hasCallingOrSelfPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS));
return mInjector.binderWithCleanCallingIdentity(mDevicePolicyEngine::getDevicePolicyState); return mInjector.binderWithCleanCallingIdentity(mDevicePolicyEngine::getDevicePolicyState);
} }

View File

@@ -308,6 +308,13 @@ final class PolicyDefinition<V> {
DevicePolicyIdentifiers.ACCOUNT_MANAGEMENT_DISABLED_POLICY, accountType)); DevicePolicyIdentifiers.ACCOUNT_MANAGEMENT_DISABLED_POLICY, accountType));
} }
static PolicyDefinition<Set<String>> PERMITTED_INPUT_METHODS = new PolicyDefinition<>(
new NoArgsPolicyKey(DevicePolicyIdentifiers.PERMITTED_INPUT_METHODS_POLICY),
new MostRecent<>(),
POLICY_FLAG_LOCAL_ONLY_POLICY,
(Set<String> value, Context context, Integer userId, PolicyKey policyKey) -> true,
new StringSetPolicySerializer());
private static final Map<String, PolicyDefinition<?>> POLICY_DEFINITIONS = new HashMap<>(); private static final Map<String, PolicyDefinition<?>> POLICY_DEFINITIONS = new HashMap<>();
private static Map<String, Integer> USER_RESTRICTION_FLAGS = new HashMap<>(); private static Map<String, Integer> USER_RESTRICTION_FLAGS = new HashMap<>();
@@ -333,6 +340,8 @@ final class PolicyDefinition<V> {
GENERIC_APPLICATION_HIDDEN); GENERIC_APPLICATION_HIDDEN);
POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.ACCOUNT_MANAGEMENT_DISABLED_POLICY, POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.ACCOUNT_MANAGEMENT_DISABLED_POLICY,
GENERIC_ACCOUNT_MANAGEMENT_DISABLED); GENERIC_ACCOUNT_MANAGEMENT_DISABLED);
POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.PERMITTED_INPUT_METHODS_POLICY,
PERMITTED_INPUT_METHODS);
// User Restriction Policies // User Restriction Policies
USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_MODIFY_ACCOUNTS, /* flags= */ 0); USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_MODIFY_ACCOUNTS, /* flags= */ 0);

View File

@@ -67,9 +67,8 @@ final class PolicyState<V> {
/** /**
* Returns {@code true} if the resolved policy has changed, {@code false} otherwise. * Returns {@code true} if the resolved policy has changed, {@code false} otherwise.
*/ */
boolean addPolicy(@NonNull EnforcingAdmin admin, @NonNull PolicyValue<V> policy) { boolean addPolicy(@NonNull EnforcingAdmin admin, @Nullable PolicyValue<V> policy) {
Objects.requireNonNull(admin); Objects.requireNonNull(admin);
Objects.requireNonNull(policy);
//LinkedHashMap doesn't update the insertion order of existing keys, removing the existing //LinkedHashMap doesn't update the insertion order of existing keys, removing the existing
// key will cause it to update. // key will cause it to update.
@@ -89,9 +88,9 @@ final class PolicyState<V> {
* Returns {@code true} if the resolved policy has changed, {@code false} otherwise. * Returns {@code true} if the resolved policy has changed, {@code false} otherwise.
*/ */
boolean addPolicy( boolean addPolicy(
@NonNull EnforcingAdmin admin, @NonNull PolicyValue<V> policy, @NonNull EnforcingAdmin admin, @Nullable PolicyValue<V> policy,
LinkedHashMap<EnforcingAdmin, PolicyValue<V>> globalPoliciesSetByAdmins) { LinkedHashMap<EnforcingAdmin, PolicyValue<V>> globalPoliciesSetByAdmins) {
mPoliciesSetByAdmins.put(Objects.requireNonNull(admin), Objects.requireNonNull(policy)); mPoliciesSetByAdmins.put(Objects.requireNonNull(admin), policy);
return resolvePolicy(globalPoliciesSetByAdmins); return resolvePolicy(globalPoliciesSetByAdmins);
} }
@@ -210,10 +209,12 @@ final class PolicyState<V> {
for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) { for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) {
serializer.startTag(/* namespace= */ null, TAG_ADMIN_POLICY_ENTRY); serializer.startTag(/* namespace= */ null, TAG_ADMIN_POLICY_ENTRY);
if (mPoliciesSetByAdmins.get(admin) != null) {
serializer.startTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY); serializer.startTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY);
mPolicyDefinition.savePolicyValueToXml( mPolicyDefinition.savePolicyValueToXml(
serializer, mPoliciesSetByAdmins.get(admin).getValue()); serializer, mPoliciesSetByAdmins.get(admin).getValue());
serializer.endTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY); serializer.endTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY);
}
serializer.startTag(/* namespace= */ null, TAG_ENFORCING_ADMIN_ENTRY); serializer.startTag(/* namespace= */ null, TAG_ENFORCING_ADMIN_ENTRY);
admin.saveToXml(serializer); admin.saveToXml(serializer);
@@ -250,7 +251,7 @@ final class PolicyState<V> {
break; break;
} }
} }
if (admin != null && value != null) { if (admin != null) {
policiesSetByAdmins.put(admin, value); policiesSetByAdmins.put(admin, value);
} else { } else {
Log.e(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY"); Log.e(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY");