Fix policy engine serialisation

Bug: 273494642
Test: btest a.d.c.DeviceManagementCoexistenceTest
Change-Id: I75805b12117d106f75e0252c460f65f0cdab3c8a
This commit is contained in:
Kholoud Mohamed
2023-04-05 16:31:40 +00:00
parent 6f28cbfc39
commit 003bcd4948
13 changed files with 209 additions and 120 deletions

View File

@@ -28,7 +28,9 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import com.android.internal.util.XmlUtils;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
@@ -45,6 +47,10 @@ import java.util.Objects;
*/
@SystemApi
public final class IntentFilterPolicyKey extends PolicyKey {
private static final String TAG = "IntentFilterPolicyKey";
private static final String TAG_INTENT_FILTER_ENTRY = "filter";
private final IntentFilter mFilter;
/**
@@ -83,7 +89,9 @@ public final class IntentFilterPolicyKey extends PolicyKey {
@Override
public void saveToXml(TypedXmlSerializer serializer) throws IOException {
serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier());
serializer.startTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY);
mFilter.writeToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_INTENT_FILTER_ENTRY);
}
/**
@@ -93,11 +101,27 @@ public final class IntentFilterPolicyKey extends PolicyKey {
public IntentFilterPolicyKey readFromXml(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
String identifier = parser.getAttributeValue(/* namespace= */ null, ATTR_POLICY_IDENTIFIER);
IntentFilter filter = new IntentFilter();
filter.readFromXml(parser);
IntentFilter filter = readIntentFilterFromXml(parser);
return new IntentFilterPolicyKey(identifier, filter);
}
@Nullable
private IntentFilter readIntentFilterFromXml(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
int outerDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, outerDepth)) {
String tag = parser.getName();
if (tag.equals(TAG_INTENT_FILTER_ENTRY)) {
IntentFilter filter = new IntentFilter();
filter.readFromXml(parser);
return filter;
}
Log.e(TAG, "Unknown tag: " + tag);
}
Log.e(TAG, "Error parsing IntentFilterPolicyKey, IntentFilter not found");
return null;
}
/**
* @hide
*/

View File

@@ -32,22 +32,25 @@ import java.util.Objects;
final class BooleanPolicySerializer extends PolicySerializer<Boolean> {
private static final String ATTR_VALUE = "value";
private static final String TAG = "BooleanPolicySerializer";
@Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName,
@NonNull Boolean value)
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull Boolean value)
throws IOException {
Objects.requireNonNull(value);
serializer.attributeBoolean(/* namespace= */ null, attributeName, value);
serializer.attributeBoolean(/* namespace= */ null, ATTR_VALUE, value);
}
@Nullable
@Override
BooleanPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) {
BooleanPolicyValue readFromXml(TypedXmlPullParser parser) {
try {
return new BooleanPolicyValue(
parser.getAttributeBoolean(/* namespace= */ null, attributeName));
parser.getAttributeBoolean(/* namespace= */ null, ATTR_VALUE));
} catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing Boolean policy value", e);
Log.e(TAG, "Error parsing Boolean policy value", e);
return null;
}
}

View File

@@ -53,6 +53,10 @@ import java.util.Objects;
// rather than in its own files.
final class BundlePolicySerializer extends PolicySerializer<Bundle> {
private static final String TAG = "BundlePolicySerializer";
private static final String ATTR_FILE_NAME = "file-name";
private static final String RESTRICTIONS_FILE_PREFIX = "AppRestrictions_";
private static final String XML_SUFFIX = ".xml";
@@ -72,7 +76,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
@Override
void saveToXml(@NonNull PolicyKey policyKey, TypedXmlSerializer serializer,
String attributeName, @NonNull Bundle value) throws IOException {
@NonNull Bundle value) throws IOException {
Objects.requireNonNull(value);
Objects.requireNonNull(policyKey);
if (!(policyKey instanceof PackagePolicyKey)) {
@@ -82,13 +86,13 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
String packageName = ((PackagePolicyKey) policyKey).getPackageName();
String fileName = packageToRestrictionsFileName(packageName, value);
writeApplicationRestrictionsLAr(fileName, value);
serializer.attribute(/* namespace= */ null, attributeName, fileName);
serializer.attribute(/* namespace= */ null, ATTR_FILE_NAME, fileName);
}
@Nullable
@Override
BundlePolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) {
String fileName = parser.getAttributeValue(/* namespace= */ null, attributeName);
BundlePolicyValue readFromXml(TypedXmlPullParser parser) {
String fileName = parser.getAttributeValue(/* namespace= */ null, ATTR_FILE_NAME);
return new BundlePolicyValue(readApplicationRestrictions(fileName));
}
@@ -119,7 +123,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
XmlUtils.nextElement(parser);
if (parser.getEventType() != XmlPullParser.START_TAG) {
Slog.e(DevicePolicyEngine.TAG, "Unable to read restrictions file "
Slog.e(TAG, "Unable to read restrictions file "
+ restrictionsFile.getBaseFile());
return restrictions;
}
@@ -127,7 +131,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
readEntry(restrictions, values, parser);
}
} catch (IOException | XmlPullParserException e) {
Slog.w(DevicePolicyEngine.TAG, "Error parsing " + restrictionsFile.getBaseFile(), e);
Slog.w(TAG, "Error parsing " + restrictionsFile.getBaseFile(), e);
} finally {
IoUtils.closeQuietly(fis);
}
@@ -209,7 +213,7 @@ final class BundlePolicySerializer extends PolicySerializer<Bundle> {
restrictionsFile.finishWrite(fos);
} catch (Exception e) {
restrictionsFile.failWrite(fos);
Slog.e(DevicePolicyEngine.TAG, "Error writing application restrictions list", e);
Slog.e(TAG, "Error writing application restrictions list", e);
}
}

View File

@@ -30,30 +30,31 @@ import java.io.IOException;
import java.util.Objects;
final class ComponentNamePolicySerializer extends PolicySerializer<ComponentName> {
private static final String ATTR_PACKAGE_NAME = ":package-name";
private static final String ATTR_CLASS_NAME = ":class-name";
private static final String TAG = "ComponentNamePolicySerializer";
private static final String ATTR_PACKAGE_NAME = "package-name";
private static final String ATTR_CLASS_NAME = "class-name";
@Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix,
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull ComponentName value) throws IOException {
Objects.requireNonNull(value);
serializer.attribute(
/* namespace= */ null,
attributeNamePrefix + ATTR_PACKAGE_NAME, value.getPackageName());
/* namespace= */ null, ATTR_PACKAGE_NAME, value.getPackageName());
serializer.attribute(
/* namespace= */ null,
attributeNamePrefix + ATTR_CLASS_NAME, value.getClassName());
/* namespace= */ null, ATTR_CLASS_NAME, value.getClassName());
}
@Nullable
@Override
ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) {
ComponentNamePolicyValue readFromXml(TypedXmlPullParser parser) {
String packageName = parser.getAttributeValue(
/* namespace= */ null, attributeNamePrefix + ATTR_PACKAGE_NAME);
/* namespace= */ null, ATTR_PACKAGE_NAME);
String className = parser.getAttributeValue(
/* namespace= */ null, attributeNamePrefix + ATTR_CLASS_NAME);
/* namespace= */ null, ATTR_CLASS_NAME);
if (packageName == null || className == null) {
Log.e(DevicePolicyEngine.TAG, "Error parsing ComponentName policy.");
Log.e(TAG, "Error parsing ComponentName policy.");
return null;
}
return new ComponentNamePolicyValue(new ComponentName(packageName, className));

View File

@@ -1181,7 +1181,8 @@ final class DevicePolicyEngine {
private static final String DEVICE_POLICIES_XML = "device_policy_state.xml";
private static final String TAG_LOCAL_POLICY_ENTRY = "local-policy-entry";
private static final String TAG_GLOBAL_POLICY_ENTRY = "global-policy-entry";
private static final String TAG_ADMINS_POLICY_ENTRY = "admins-policy-entry";
private static final String TAG_POLICY_STATE_ENTRY = "policy-state-entry";
private static final String TAG_POLICY_KEY_ENTRY = "policy-key-entry";
private static final String TAG_ENFORCING_ADMINS_ENTRY = "enforcing-admins-entry";
private static final String ATTR_USER_ID = "user-id";
@@ -1236,11 +1237,14 @@ final class DevicePolicyEngine {
serializer.startTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY);
serializer.attributeInt(/* namespace= */ null, ATTR_USER_ID, userId);
policy.getKey().saveToXml(serializer);
serializer.startTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY);
policy.getKey().saveToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY);
policy.getValue().saveToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY);
serializer.endTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY);
serializer.endTag(/* namespace= */ null, TAG_LOCAL_POLICY_ENTRY);
}
@@ -1253,11 +1257,13 @@ final class DevicePolicyEngine {
for (Map.Entry<PolicyKey, PolicyState<?>> policy : mGlobalPolicies.entrySet()) {
serializer.startTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY);
policy.getKey().saveToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_POLICY_KEY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY);
policy.getValue().saveToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_ADMINS_POLICY_ENTRY);
serializer.endTag(/* namespace= */ null, TAG_POLICY_STATE_ENTRY);
serializer.endTag(/* namespace= */ null, TAG_GLOBAL_POLICY_ENTRY);
}
@@ -1323,28 +1329,56 @@ final class DevicePolicyEngine {
private void readLocalPoliciesInner(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser);
if (!mLocalPolicies.contains(userId)) {
mLocalPolicies.put(userId, new HashMap<>());
PolicyKey policyKey = null;
PolicyState<?> policyState = null;
int outerDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, outerDepth)) {
String tag = parser.getName();
switch (tag) {
case TAG_POLICY_KEY_ENTRY:
policyKey = PolicyDefinition.readPolicyKeyFromXml(parser);
break;
case TAG_POLICY_STATE_ENTRY:
policyState = PolicyState.readFromXml(parser);
break;
default:
Log.e(TAG, "Unknown tag for local policy entry" + tag);
}
}
PolicyState<?> adminsPolicy = parseAdminsPolicy(parser);
if (adminsPolicy != null) {
mLocalPolicies.get(userId).put(policyKey, adminsPolicy);
if (policyKey != null && policyState != null) {
if (!mLocalPolicies.contains(userId)) {
mLocalPolicies.put(userId, new HashMap<>());
}
mLocalPolicies.get(userId).put(policyKey, policyState);
} else {
Log.e(TAG,
"Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy.");
Log.e(TAG, "Error parsing local policy");
}
}
private void readGlobalPoliciesInner(TypedXmlPullParser parser)
throws IOException, XmlPullParserException {
PolicyKey policyKey = PolicyDefinition.readPolicyKeyFromXml(parser);
PolicyState<?> adminsPolicy = parseAdminsPolicy(parser);
if (adminsPolicy != null) {
mGlobalPolicies.put(policyKey, adminsPolicy);
PolicyKey policyKey = null;
PolicyState<?> policyState = null;
int outerDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, outerDepth)) {
String tag = parser.getName();
switch (tag) {
case TAG_POLICY_KEY_ENTRY:
policyKey = PolicyDefinition.readPolicyKeyFromXml(parser);
break;
case TAG_POLICY_STATE_ENTRY:
policyState = PolicyState.readFromXml(parser);
break;
default:
Log.e(TAG, "Unknown tag for local policy entry" + tag);
}
}
if (policyKey != null && policyState != null) {
mGlobalPolicies.put(policyKey, policyState);
} else {
Log.e(TAG,
"Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy.");
Log.e(TAG, "Error parsing global policy");
}
}
@@ -1356,20 +1390,5 @@ final class DevicePolicyEngine {
}
mEnforcingAdmins.get(admin.getUserId()).add(admin);
}
@Nullable
private PolicyState<?> parseAdminsPolicy(TypedXmlPullParser parser)
throws XmlPullParserException, IOException {
int outerDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, outerDepth)) {
String tag = parser.getName();
if (tag.equals(TAG_ADMINS_POLICY_ENTRY)) {
return PolicyState.readFromXml(parser);
}
Log.e(TAG, "Unknown tag " + tag);
}
Log.e(TAG, "Error parsing file, AdminsPolicy not found");
return null;
}
}
}

View File

@@ -11337,7 +11337,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
for (PolicyKey key : keys) {
if (!(key instanceof IntentFilterPolicyKey)) {
throw new IllegalStateException("PolicyKey for PERSISTENT_PREFERRED_ACTIVITY is not"
+ "of type PersistentPreferredActivityPolicyKey");
+ "of type IntentFilterPolicyKey");
}
IntentFilterPolicyKey parsedKey =
(IntentFilterPolicyKey) key;

View File

@@ -32,21 +32,25 @@ import java.util.Objects;
final class IntegerPolicySerializer extends PolicySerializer<Integer> {
private static final String TAG = "IntegerPolicySerializer";
private static final String ATTR_VALUE = "value";
@Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName,
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull Integer value) throws IOException {
Objects.requireNonNull(value);
serializer.attributeInt(/* namespace= */ null, attributeName, value);
serializer.attributeInt(/* namespace= */ null, ATTR_VALUE, value);
}
@Nullable
@Override
IntegerPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) {
IntegerPolicyValue readFromXml(TypedXmlPullParser parser) {
try {
return new IntegerPolicyValue(
parser.getAttributeInt(/* namespace= */ null, attributeName));
parser.getAttributeInt(/* namespace= */ null, ATTR_VALUE));
} catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing Integer policy value", e);
Log.e(TAG, "Error parsing Integer policy value", e);
return null;
}
}

View File

@@ -32,12 +32,14 @@ import java.util.Set;
final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> {
private static final String ATTR_PACKAGES = ":packages";
private static final String TAG = "LockTaskPolicySerializer";
private static final String ATTR_PACKAGES = "packages";
private static final String ATTR_PACKAGES_SEPARATOR = ";";
private static final String ATTR_FLAGS = ":flags";
private static final String ATTR_FLAGS = "flags";
@Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix,
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull LockTaskPolicy value) throws IOException {
Objects.requireNonNull(value);
if (value.getPackages() == null || value.getPackages().isEmpty()) {
@@ -46,31 +48,31 @@ final class LockTaskPolicySerializer extends PolicySerializer<LockTaskPolicy> {
}
serializer.attribute(
/* namespace= */ null,
attributeNamePrefix + ATTR_PACKAGES,
ATTR_PACKAGES,
String.join(ATTR_PACKAGES_SEPARATOR, value.getPackages()));
serializer.attributeInt(
/* namespace= */ null,
attributeNamePrefix + ATTR_FLAGS,
ATTR_FLAGS,
value.getFlags());
}
@Override
LockTaskPolicy readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) {
LockTaskPolicy readFromXml(TypedXmlPullParser parser) {
String packagesStr = parser.getAttributeValue(
/* namespace= */ null,
attributeNamePrefix + ATTR_PACKAGES);
ATTR_PACKAGES);
if (packagesStr == null) {
Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value.");
Log.e(TAG, "Error parsing LockTask policy value.");
return null;
}
Set<String> packages = Set.of(packagesStr.split(ATTR_PACKAGES_SEPARATOR));
try {
int flags = parser.getAttributeInt(
/* namespace= */ null,
attributeNamePrefix + ATTR_FLAGS);
ATTR_FLAGS);
return new LockTaskPolicy(packages, flags);
} catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing LockTask policy value", e);
Log.e(TAG, "Error parsing LockTask policy value", e);
return null;
}
}

View File

@@ -32,21 +32,25 @@ import java.util.Objects;
final class LongPolicySerializer extends PolicySerializer<Long> {
private static final String TAG = "LongPolicySerializer";
private static final String ATTR_VALUE = "value";
@Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeName,
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull Long value) throws IOException {
Objects.requireNonNull(value);
serializer.attributeLong(/* namespace= */ null, attributeName, value);
serializer.attributeLong(/* namespace= */ null, ATTR_VALUE, value);
}
@Nullable
@Override
LongPolicyValue readFromXml(TypedXmlPullParser parser, String attributeName) {
LongPolicyValue readFromXml(TypedXmlPullParser parser) {
try {
return new LongPolicyValue(
parser.getAttributeLong(/* namespace= */ null, attributeName));
parser.getAttributeLong(/* namespace= */ null, ATTR_VALUE));
} catch (XmlPullParserException e) {
Log.e(DevicePolicyEngine.TAG, "Error parsing Long policy value", e);
Log.e(TAG, "Error parsing Long policy value", e);
return null;
}
}

View File

@@ -531,7 +531,6 @@ final class PolicyDefinition<V> {
}
void saveToXml(TypedXmlSerializer serializer) throws IOException {
// TODO: here and elsewhere, add tags to ensure attributes aren't overridden by duplication.
mPolicyKey.saveToXml(serializer);
}
@@ -554,14 +553,14 @@ final class PolicyDefinition<V> {
return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
}
void savePolicyValueToXml(TypedXmlSerializer serializer, String attributeName, V value)
void savePolicyValueToXml(TypedXmlSerializer serializer, V value)
throws IOException {
mPolicySerializer.saveToXml(mPolicyKey, serializer, attributeName, value);
mPolicySerializer.saveToXml(mPolicyKey, serializer, value);
}
@Nullable
PolicyValue<V> readPolicyValueFromXml(TypedXmlPullParser parser, String attributeName) {
return mPolicySerializer.readFromXml(parser, attributeName);
PolicyValue<V> readPolicyValueFromXml(TypedXmlPullParser parser) {
return mPolicySerializer.readFromXml(parser);
}
@Override

View File

@@ -26,8 +26,7 @@ import com.android.modules.utils.TypedXmlSerializer;
import java.io.IOException;
abstract class PolicySerializer<V> {
abstract void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
String attributeName, @NonNull V value)
abstract void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, @NonNull V value)
throws IOException;
abstract PolicyValue<V> readFromXml(TypedXmlPullParser parser, String attributeName);
abstract PolicyValue<V> readFromXml(TypedXmlPullParser parser);
}

View File

@@ -35,11 +35,14 @@ import java.util.Objects;
* Class containing all values set for a certain policy by different admins.
*/
final class PolicyState<V> {
private static final String TAG_ADMIN_POLICY_ENTRY = "admin-policy-entry";
private static final String TAG_ENFORCING_ADMIN_ENTRY = "enforcing-admin-entry";
private static final String ATTR_POLICY_VALUE = "policy-value";
private static final String ATTR_RESOLVED_POLICY = "resolved-policy";
private static final String TAG = "PolicyState";
private static final String TAG_ADMIN_POLICY_ENTRY = "admin-policy-entry";
private static final String TAG_POLICY_DEFINITION_ENTRY = "policy-definition-entry";
private static final String TAG_RESOLVED_VALUE_ENTRY = "resolved-value-entry";
private static final String TAG_ENFORCING_ADMIN_ENTRY = "enforcing-admin-entry";
private static final String TAG_POLICY_VALUE_ENTRY = "policy-value-entry";
private final PolicyDefinition<V> mPolicyDefinition;
private final LinkedHashMap<EnforcingAdmin, PolicyValue<V>> mPoliciesSetByAdmins =
new LinkedHashMap<>();
@@ -193,18 +196,24 @@ final class PolicyState<V> {
}
void saveToXml(TypedXmlSerializer serializer) throws IOException {
serializer.startTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
mPolicyDefinition.saveToXml(serializer);
serializer.endTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
if (mCurrentResolvedPolicy != null) {
serializer.startTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY);
mPolicyDefinition.savePolicyValueToXml(
serializer, ATTR_RESOLVED_POLICY, mCurrentResolvedPolicy.getValue());
serializer, mCurrentResolvedPolicy.getValue());
serializer.endTag(/* namespace= */ null, TAG_RESOLVED_VALUE_ENTRY);
}
for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) {
serializer.startTag(/* namespace= */ null, TAG_ADMIN_POLICY_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY);
mPolicyDefinition.savePolicyValueToXml(
serializer, ATTR_POLICY_VALUE, mPoliciesSetByAdmins.get(admin).getValue());
serializer, mPoliciesSetByAdmins.get(admin).getValue());
serializer.endTag(/* namespace= */ null, TAG_POLICY_VALUE_ENTRY);
serializer.startTag(/* namespace= */ null, TAG_ENFORCING_ADMIN_ENTRY);
admin.saveToXml(serializer);
@@ -217,32 +226,57 @@ final class PolicyState<V> {
static <V> PolicyState<V> readFromXml(TypedXmlPullParser parser)
throws IOException, XmlPullParserException {
PolicyDefinition<V> policyDefinition = PolicyDefinition.readFromXml(parser);
PolicyDefinition<V> policyDefinition = null;
PolicyValue<V> currentResolvedPolicy = policyDefinition.readPolicyValueFromXml(
parser, ATTR_RESOLVED_POLICY);
PolicyValue<V> currentResolvedPolicy = null;
LinkedHashMap<EnforcingAdmin, PolicyValue<V>> policiesSetByAdmins = new LinkedHashMap<>();
int outerDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, outerDepth)) {
String tag = parser.getName();
if (TAG_ADMIN_POLICY_ENTRY.equals(tag)) {
PolicyValue<V> value = policyDefinition.readPolicyValueFromXml(
parser, ATTR_POLICY_VALUE);
EnforcingAdmin admin;
int adminPolicyDepth = parser.getDepth();
if (XmlUtils.nextElementWithin(parser, adminPolicyDepth)
&& parser.getName().equals(TAG_ENFORCING_ADMIN_ENTRY)) {
admin = EnforcingAdmin.readFromXml(parser);
policiesSetByAdmins.put(admin, value);
}
} else {
Log.e(DevicePolicyEngine.TAG, "Unknown tag: " + tag);
switch (tag) {
case TAG_ADMIN_POLICY_ENTRY:
PolicyValue<V> value = null;
EnforcingAdmin admin = null;
int adminPolicyDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, adminPolicyDepth)) {
String adminPolicyTag = parser.getName();
switch (adminPolicyTag) {
case TAG_ENFORCING_ADMIN_ENTRY:
admin = EnforcingAdmin.readFromXml(parser);
break;
case TAG_POLICY_VALUE_ENTRY:
value = policyDefinition.readPolicyValueFromXml(parser);
break;
}
}
if (admin != null && value != null) {
policiesSetByAdmins.put(admin, value);
} else {
Log.e(TAG, "Error Parsing TAG_ADMIN_POLICY_ENTRY");
}
break;
case TAG_POLICY_DEFINITION_ENTRY:
policyDefinition = PolicyDefinition.readFromXml(parser);
break;
case TAG_RESOLVED_VALUE_ENTRY:
currentResolvedPolicy = policyDefinition.readPolicyValueFromXml(parser);
break;
default:
Log.e(TAG, "Unknown tag: " + tag);
}
}
return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
if (policyDefinition != null) {
return new PolicyState<V>(policyDefinition, policiesSetByAdmins, currentResolvedPolicy);
} else {
Log.e("PolicyState", "Error parsing policyState");
return null;
}
}
PolicyDefinition<V> getPolicyDefinition() {
return mPolicyDefinition;
}

View File

@@ -36,21 +36,17 @@ final class StringSetPolicySerializer extends PolicySerializer<Set<String>> {
private static final String ATTR_VALUES_SEPARATOR = ";";
@Override
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer, String attributeNamePrefix,
void saveToXml(PolicyKey policyKey, TypedXmlSerializer serializer,
@NonNull Set<String> value) throws IOException {
Objects.requireNonNull(value);
serializer.attribute(
/* namespace= */ null,
attributeNamePrefix + ATTR_VALUES,
String.join(ATTR_VALUES_SEPARATOR, value));
/* namespace= */ null, ATTR_VALUES, String.join(ATTR_VALUES_SEPARATOR, value));
}
@Nullable
@Override
PolicyValue<Set<String>> readFromXml(TypedXmlPullParser parser, String attributeNamePrefix) {
String valuesStr = parser.getAttributeValue(
/* namespace= */ null,
attributeNamePrefix + ATTR_VALUES);
PolicyValue<Set<String>> readFromXml(TypedXmlPullParser parser) {
String valuesStr = parser.getAttributeValue(/* namespace= */ null, ATTR_VALUES);
if (valuesStr == null) {
Log.e(DevicePolicyEngine.TAG, "Error parsing StringSet policy value.");
return null;