Make PhoneAccountRegistrar state persistence null tolerant
Bug: 16676577
Change-Id: I1e5c14cc4d39f1e6951581732efe894df2d15cf5
diff --git a/src/com/android/telecomm/PhoneAccountRegistrar.java b/src/com/android/telecomm/PhoneAccountRegistrar.java
index f6e522d..56fe975 100644
--- a/src/com/android/telecomm/PhoneAccountRegistrar.java
+++ b/src/com/android/telecomm/PhoneAccountRegistrar.java
@@ -68,7 +68,7 @@
private final AtomicFile mAtomicFile;
private State mState;
- PhoneAccountRegistrar(Context context) {
+ public PhoneAccountRegistrar(Context context) {
this(context, FILE_NAME);
}
@@ -392,11 +392,12 @@
//
@VisibleForTesting
- public interface XmlSerialization<T> {
+ public abstract static class XmlSerialization<T> {
/**
* Write the supplied object to XML
*/
- void writeToXml(T o, XmlSerializer serializer) throws IOException;
+ public abstract void writeToXml(T o, XmlSerializer serializer)
+ throws IOException;
/**
* Read from the supplied XML into a new object, returning null in case of an
@@ -405,7 +406,17 @@
* object's writeToXml(). This object tries to fail early without modifying
* 'parser' if it does not recognize the data it sees.
*/
- T readFromXml(XmlPullParser parser) throws IOException, XmlPullParserException;
+ public abstract T readFromXml(XmlPullParser parser)
+ throws IOException, XmlPullParserException;
+
+ protected void writeTextSafely(String tagName, Object value, XmlSerializer serializer)
+ throws IOException {
+ if (value != null) {
+ serializer.startTag(null, tagName);
+ serializer.text(Objects.toString(value));
+ serializer.endTag(null, tagName);
+ }
+ }
}
@VisibleForTesting
@@ -419,27 +430,29 @@
@Override
public void writeToXml(State o, XmlSerializer serializer)
throws IOException {
- serializer.startTag(null, CLASS_STATE);
+ if (o != null) {
+ serializer.startTag(null, CLASS_STATE);
- if (o.defaultOutgoing != null) {
- serializer.startTag(null, DEFAULT_OUTGOING);
- sPhoneAccountHandleXml.writeToXml(o.defaultOutgoing, serializer);
- serializer.endTag(null, DEFAULT_OUTGOING);
+ if (o.defaultOutgoing != null) {
+ serializer.startTag(null, DEFAULT_OUTGOING);
+ sPhoneAccountHandleXml.writeToXml(o.defaultOutgoing, serializer);
+ serializer.endTag(null, DEFAULT_OUTGOING);
+ }
+
+ if (o.simCallManager != null) {
+ serializer.startTag(null, SIM_CALL_MANAGER);
+ sPhoneAccountHandleXml.writeToXml(o.simCallManager, serializer);
+ serializer.endTag(null, SIM_CALL_MANAGER);
+ }
+
+ serializer.startTag(null, ACCOUNTS);
+ for (PhoneAccount m : o.accounts) {
+ sPhoneAccountXml.writeToXml(m, serializer);
+ }
+ serializer.endTag(null, ACCOUNTS);
+
+ serializer.endTag(null, CLASS_STATE);
}
-
- if (o.simCallManager != null) {
- serializer.startTag(null, SIM_CALL_MANAGER);
- sPhoneAccountHandleXml.writeToXml(o.simCallManager, serializer);
- serializer.endTag(null, SIM_CALL_MANAGER);
- }
-
- serializer.startTag(null, ACCOUNTS);
- for (PhoneAccount m : o.accounts) {
- sPhoneAccountXml.writeToXml(m, serializer);
- }
- serializer.endTag(null, ACCOUNTS);
-
- serializer.endTag(null, CLASS_STATE);
}
@Override
@@ -486,37 +499,24 @@
@Override
public void writeToXml(PhoneAccount o, XmlSerializer serializer)
throws IOException {
- serializer.startTag(null, CLASS_PHONE_ACCOUNT);
+ if (o != null) {
+ serializer.startTag(null, CLASS_PHONE_ACCOUNT);
- serializer.startTag(null, ACCOUNT_HANDLE);
- sPhoneAccountHandleXml.writeToXml(o.getAccountHandle(), serializer);
- serializer.endTag(null, ACCOUNT_HANDLE);
+ if (o.getAccountHandle() != null) {
+ serializer.startTag(null, ACCOUNT_HANDLE);
+ sPhoneAccountHandleXml.writeToXml(o.getAccountHandle(), serializer);
+ serializer.endTag(null, ACCOUNT_HANDLE);
+ }
- serializer.startTag(null, HANDLE);
- serializer.text(o.getHandle().toString());
- serializer.endTag(null, HANDLE);
+ writeTextSafely(HANDLE, o.getHandle(), serializer);
+ writeTextSafely(SUBSCRIPTION_NUMBER, o.getSubscriptionNumber(), serializer);
+ writeTextSafely(CAPABILITIES, Integer.toString(o.getCapabilities()), serializer);
+ writeTextSafely(ICON_RES_ID, Integer.toString(o.getIconResId()), serializer);
+ writeTextSafely(LABEL, o.getLabel(), serializer);
+ writeTextSafely(SHORT_DESCRIPTION, o.getShortDescription(), serializer);
- serializer.startTag(null, SUBSCRIPTION_NUMBER);
- serializer.text(o.getSubscriptionNumber());
- serializer.endTag(null, SUBSCRIPTION_NUMBER);
-
- serializer.startTag(null, CAPABILITIES);
- serializer.text(Integer.toString(o.getCapabilities()));
- serializer.endTag(null, CAPABILITIES);
-
- serializer.startTag(null, ICON_RES_ID);
- serializer.text(Integer.toString(o.getIconResId()));
- serializer.endTag(null, ICON_RES_ID);
-
- serializer.startTag(null, LABEL);
- serializer.text(Objects.toString(o.getLabel()));
- serializer.endTag(null, LABEL);
-
- serializer.startTag(null, SHORT_DESCRIPTION);
- serializer.text(Objects.toString(o.getShortDescription()));
- serializer.endTag(null, SHORT_DESCRIPTION);
-
- serializer.endTag(null, CLASS_PHONE_ACCOUNT);
+ serializer.endTag(null, CLASS_PHONE_ACCOUNT);
+ }
}
@Override
@@ -556,16 +556,14 @@
shortDescription = parser.getText();
}
}
- if (accountHandle != null) {
- return new PhoneAccount(
- accountHandle,
- handle,
- subscriptionNumber,
- capabilities,
- iconResId,
- label,
- shortDescription);
- }
+ return new PhoneAccount(
+ accountHandle,
+ handle,
+ subscriptionNumber,
+ capabilities,
+ iconResId,
+ label,
+ shortDescription);
}
return null;
}
@@ -581,17 +579,18 @@
@Override
public void writeToXml(PhoneAccountHandle o, XmlSerializer serializer)
throws IOException {
- serializer.startTag(null, CLASS_PHONE_ACCOUNT_HANDLE);
+ if (o != null) {
+ serializer.startTag(null, CLASS_PHONE_ACCOUNT_HANDLE);
- serializer.startTag(null, COMPONENT_NAME);
- serializer.text(o.getComponentName().flattenToString());
- serializer.endTag(null, COMPONENT_NAME);
+ if (o.getComponentName() != null) {
+ writeTextSafely(
+ COMPONENT_NAME, o.getComponentName().flattenToString(), serializer);
+ }
- serializer.startTag(null, ID);
- serializer.text(o.getId());
- serializer.endTag(null, ID);
+ writeTextSafely(ID, o.getId(), serializer);
- serializer.endTag(null, CLASS_PHONE_ACCOUNT_HANDLE);
+ serializer.endTag(null, CLASS_PHONE_ACCOUNT_HANDLE);
+ }
}
@Override
@@ -610,7 +609,7 @@
idString = parser.getText();
}
}
- if (componentNameString != null && idString != null) {
+ if (componentNameString != null) {
return new PhoneAccountHandle(
ComponentName.unflattenFromString(componentNameString),
idString);
diff --git a/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java b/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java
index c1493f1..b74f282 100644
--- a/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java
+++ b/tests/src/com/android/telecomm/tests/unit/PhoneAccountRegistrarTest.java
@@ -117,31 +117,51 @@
}
private void assertPhoneAccountHandleEquals(PhoneAccountHandle a, PhoneAccountHandle b) {
- assertEquals(a.getComponentName().getPackageName(), b.getComponentName().getPackageName());
- assertEquals(a.getComponentName().getClassName(), b.getComponentName().getClassName());
- assertEquals(a.getId(), b.getId());
+ if (a != b) {
+ assertEquals(
+ a.getComponentName().getPackageName(),
+ b.getComponentName().getPackageName());
+ assertEquals(
+ a.getComponentName().getClassName(),
+ b.getComponentName().getClassName());
+ assertEquals(a.getId(), b.getId());
+ }
}
public void testPhoneAccountHandle() throws Exception {
PhoneAccountHandle input = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0");
PhoneAccountHandle result = roundTrip(this, input, PhoneAccountRegistrar.sPhoneAccountHandleXml);
assertPhoneAccountHandleEquals(input, result);
+ PhoneAccountHandle inputN =
+ new PhoneAccountHandle(
+ new ComponentName(
+ "pkg0", // ctor does not allow null
+ "cls0"), // ctor does not allow null
+ null);
+ PhoneAccountHandle resultN = roundTrip(this, inputN, PhoneAccountRegistrar.sPhoneAccountHandleXml);
+ Log.i(this, "inputN = %s, resultN = %s", inputN, resultN);
+ assertPhoneAccountHandleEquals(inputN, resultN);
}
private void assertPhoneAccountEquals(PhoneAccount a, PhoneAccount b) {
- assertPhoneAccountHandleEquals(a.getAccountHandle(), b.getAccountHandle());
- assertEquals(a.getHandle(), b.getHandle());
- assertEquals(a.getSubscriptionNumber(), b.getSubscriptionNumber());
- assertEquals(a.getCapabilities(), b.getCapabilities());
- assertEquals(a.getIconResId(), b.getIconResId());
- assertEquals(a.getLabel(), b.getLabel());
- assertEquals(a.getShortDescription(), b.getShortDescription());
+ if (a != b) {
+ assertPhoneAccountHandleEquals(a.getAccountHandle(), b.getAccountHandle());
+ assertEquals(a.getHandle(), b.getHandle());
+ assertEquals(a.getSubscriptionNumber(), b.getSubscriptionNumber());
+ assertEquals(a.getCapabilities(), b.getCapabilities());
+ assertEquals(a.getIconResId(), b.getIconResId());
+ assertEquals(a.getLabel(), b.getLabel());
+ assertEquals(a.getShortDescription(), b.getShortDescription());
+ }
}
public void testPhoneAccount() throws Exception {
PhoneAccount input = makeQuickAccount("pkg0", "cls0", "id0", 0);
PhoneAccount result = roundTrip(this, input, PhoneAccountRegistrar.sPhoneAccountXml);
assertPhoneAccountEquals(input, result);
+ PhoneAccount inputN = new PhoneAccount(null, null, null, 0, 0, null, null);
+ PhoneAccount resultN = roundTrip(this, inputN, PhoneAccountRegistrar.sPhoneAccountXml);
+ assertPhoneAccountEquals(inputN, resultN);
}
private void assertStateEquals(PhoneAccountRegistrar.State a, PhoneAccountRegistrar.State b) {