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);