Change the interface of XmlWriter so it can be used in other places.

Test: atest compat-changeid-annotation-processor-test,
      m FrameworksServicesTests after I've introduced a dependency on
      the XmlWriter.
Change-Id: I6613029643e4f8b4933283c8bafba59d127aa421
diff --git a/annotation/processors/changeid/Android.bp b/annotation/processors/changeid/Android.bp
index 717738a..a29e564 100644
--- a/annotation/processors/changeid/Android.bp
+++ b/annotation/processors/changeid/Android.bp
@@ -10,6 +10,19 @@
     ],
 }
 
+java_library {
+    name: "xml-writer-device-lib",
+
+    srcs: [
+        "src/java/com/android/compat/annotation/XmlWriter.java",
+        "src/java/com/android/compat/annotation/Change.java",
+    ],
+
+    static_libs: [
+        "guava",
+    ],
+}
+
 java_plugin {
     name: "compat-changeid-annotation-processor",
     processor_class: "com.android.compat.annotation.ChangeIdProcessor",
diff --git a/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java b/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java
index c65e7b0..428fa8e 100644
--- a/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java
+++ b/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java
@@ -16,15 +16,19 @@
 
 package com.android.compat.annotation;
 
+import com.google.common.annotations.VisibleForTesting;
+
 /**
  * Simple data class that represents a change, built from the code annotations.
  */
+@VisibleForTesting
 public class Change {
     final Long id;
     final String name;
     final boolean disabled;
     final Integer enabledAfter;
 
+    @VisibleForTesting
     public Change(Long id, String name, boolean disabled, Integer enabledAfter) {
         this.id = id;
         this.name = name;
diff --git a/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java b/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java
index 4ba284a..52e48e8 100644
--- a/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java
+++ b/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java
@@ -17,9 +17,13 @@
 package com.android.compat.annotation;
 
 import static javax.tools.Diagnostic.Kind.ERROR;
+import static javax.tools.StandardLocation.CLASS_OUTPUT;
+
 
 import com.google.common.collect.ImmutableSet;
 
+import java.io.IOException;
+import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import java.util.Map;
@@ -91,7 +95,16 @@
             writer.addChange(change);
         }
 
-        writer.write(PACKAGE, CONFIG_XML, processingEnv.getFiler());
+        try (OutputStream output = processingEnv.getFiler().createResource(
+                CLASS_OUTPUT,
+                PACKAGE,
+                CONFIG_XML)
+                .openOutputStream()) {
+            writer.write(output);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to write output", e);
+        }
+
 
         return true;
     }
diff --git a/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java b/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java
index eb8856c..71a4d0f 100644
--- a/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java
+++ b/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java
@@ -16,12 +16,11 @@
 
 package com.android.compat.annotation;
 
-import static javax.tools.StandardLocation.CLASS_OUTPUT;
+import com.google.common.annotations.VisibleForTesting;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import java.io.IOException;
 import java.io.OutputStream;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -32,7 +31,6 @@
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-import javax.annotation.processing.Filer;
 
 /**
  * <p>Writes an XML config file containing provided changes.</p>
@@ -49,7 +47,8 @@
  * </pre>
  *
  */
-final class XmlWriter {
+@VisibleForTesting
+public final class XmlWriter {
     //XML tags
     private static final String XML_ROOT = "config";
     private static final String XML_CHANGE_ELEMENT = "compat-change";
@@ -58,17 +57,19 @@
     private static final String XML_DISABLED_ATTR = "disabled";
     private static final String XML_ENABLED_AFTER_ATTR = "enableAfterTargetSdk";
 
-    private Document document;
-    private Element root;
+    private Document mDocument;
+    private Element mRoot;
 
-    XmlWriter() {
-        document = createDocument();
-        root = document.createElement(XML_ROOT);
-        document.appendChild(root);
+    @VisibleForTesting
+    public XmlWriter() {
+        mDocument = createDocument();
+        mRoot = mDocument.createElement(XML_ROOT);
+        mDocument.appendChild(mRoot);
     }
 
-    void addChange(Change change) {
-        Element newElement = document.createElement(XML_CHANGE_ELEMENT);
+    @VisibleForTesting
+    public void addChange(Change change) {
+        Element newElement = mDocument.createElement(XML_CHANGE_ELEMENT);
         newElement.setAttribute(XML_NAME_ATTR, change.name);
         newElement.setAttribute(XML_ID_ATTR, change.id.toString());
         if (change.disabled) {
@@ -77,23 +78,20 @@
         if (change.enabledAfter != null) {
             newElement.setAttribute(XML_ENABLED_AFTER_ATTR, change.enabledAfter.toString());
         }
-        root.appendChild(newElement);
+        mRoot.appendChild(newElement);
     }
 
-    void write(String packageName, String fileName, Filer filer) {
-        try (OutputStream output = filer.createResource(
-                CLASS_OUTPUT,
-                packageName,
-                fileName)
-                .openOutputStream()) {
+    @VisibleForTesting
+    public void write(OutputStream output) {
+        try {
             TransformerFactory transformerFactory = TransformerFactory.newInstance();
             Transformer transformer = transformerFactory.newTransformer();
-            DOMSource domSource = new DOMSource(document);
+            DOMSource domSource = new DOMSource(mDocument);
 
             StreamResult result = new StreamResult(output);
 
             transformer.transform(domSource, result);
-        } catch (IOException | TransformerException e) {
+        } catch (TransformerException e) {
             throw new RuntimeException("Failed to write output", e);
         }
     }
@@ -102,8 +100,7 @@
         try {
             DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
             DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
-            Document document = documentBuilder.newDocument();
-            return document;
+            return documentBuilder.newDocument();
         } catch (ParserConfigurationException e) {
             throw new RuntimeException("Failed to create a new document", e);
         }
diff --git a/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java b/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java
index 3bc8e2b..eefac25 100644
--- a/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java
+++ b/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java
@@ -16,70 +16,49 @@
 
 package com.android.compat.annotation;
 
-import static org.mockito.Mockito.when;
-import static org.junit.Assert.assertThat;
 import static org.hamcrest.core.StringStartsWith.startsWith;
+import static org.junit.Assert.assertThat;
 
 import org.junit.Test;
-import org.mockito.Mock;
-
-import javax.annotation.processing.Filer;
-import javax.tools.FileObject;
-import javax.tools.StandardLocation;
 
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 
-import org.junit.Before;
-import org.junit.Rule;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
 
 public class XmlWriterTest {
 
     private static final String HEADER =
             "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
 
-    @Mock private Filer filer;
-    @Mock private FileObject fileObject;
-    private OutputStream outputStream = new ByteArrayOutputStream();
-
-    @Rule public MockitoRule rule = MockitoJUnit.rule();
-
-    @Before
-    public void setUp() throws Exception {
-        when(filer.createResource(StandardLocation.CLASS_OUTPUT, "package", "name")).thenReturn(
-                fileObject);
-        when(fileObject.openOutputStream()).thenReturn(outputStream);
-    }
+    private OutputStream mOutputStream = new ByteArrayOutputStream();
 
     @Test
-    public void testNoChanges() throws Exception {
+    public void testNoChanges() {
         XmlWriter writer = new XmlWriter();
-        writer.write("package", "name", filer);
+        writer.write(mOutputStream);
 
         String expected = HEADER + "<config/>";
 
-        assertThat(outputStream.toString(), startsWith(expected));
+        assertThat(mOutputStream.toString(), startsWith(expected));
     }
 
     @Test
-    public void testOneChange() throws Exception {
+    public void testOneChange() {
         XmlWriter writer = new XmlWriter();
         Change c = new Change(123456789L, "change-name", false, null);
 
         writer.addChange(c);
-        writer.write("package", "name", filer);
+        writer.write(mOutputStream);
 
         String expected = HEADER + "<config>"
                 + "<compat-change id=\"123456789\" name=\"change-name\"/>"
                 + "</config>";
 
-        assertThat(outputStream.toString(), startsWith(expected));
+        assertThat(mOutputStream.toString(), startsWith(expected));
     }
 
     @Test
-    public void testSomeChanges() throws Exception {
+    public void testSomeChanges() {
         XmlWriter writer = new XmlWriter();
         Change c = new Change(111L, "change-name1", false, null);
         Change disabled = new Change(222L, "change-name2", true, null);
@@ -90,7 +69,7 @@
         writer.addChange(disabled);
         writer.addChange(sdkRestricted);
         writer.addChange(both);
-        writer.write("package", "name", filer);
+        writer.write(mOutputStream);
 
         String expected = HEADER + "<config>"
                 + "<compat-change id=\"111\" name=\"change-name1\"/>"
@@ -100,6 +79,6 @@
                 + "name=\"change-name4\"/>"
                 + "</config>";
 
-        assertThat(outputStream.toString(), startsWith(expected));
+        assertThat(mOutputStream.toString(), startsWith(expected));
     }
 }