Merge "Fix policy engine serialisation" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
599082490c
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11391,7 +11391,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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user