Mark Deprecated Classes and Methods

Put a line through classes and methods that are deprecated
in the coverage report. This could help prioritize writing tests.

Change-Id: I8ee80f0af9ba0ea759d10e054a012e28a354d982
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
index de2e3eb..101be7f 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
@@ -26,22 +26,31 @@
 
     private final String mName;
 
+    private final boolean mDeprecated;
+
     private final List<ApiConstructor> mApiConstructors = new ArrayList<ApiConstructor>();
 
     private final List<ApiMethod> mApiMethods = new ArrayList<ApiMethod>();
 
-    ApiClass(String name) {
-        this.mName = name;
+    ApiClass(String name, boolean deprecated) {
+        mName = name;
+        mDeprecated = deprecated;
     }
 
+    @Override
     public int compareTo(ApiClass another) {
         return mName.compareTo(another.mName);
     }
 
+    @Override
     public String getName() {
         return mName;
     }
 
+    public boolean isDeprecated() {
+        return mDeprecated;
+    }
+
     public void addConstructor(ApiConstructor constructor) {
         mApiConstructors.add(constructor);
     }
@@ -97,6 +106,7 @@
         return mApiConstructors.size() + mApiMethods.size();
     }
 
+    @Override
     public float getCoveragePercentage() {
         return (float) getNumCoveredMethods() / getTotalMethods() * 100;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java
index b38bd34..8d721e6 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java
@@ -27,13 +27,17 @@
 
     private final List<String> mParameterTypes;
 
+    private final boolean mDeprecated;
+
     private boolean mIsCovered;
 
-    ApiConstructor(String name, List<String> parameterTypes) {
-        this.mName = name;
-        this.mParameterTypes = new ArrayList<String>(parameterTypes);
+    ApiConstructor(String name, List<String> parameterTypes, boolean deprecated) {
+        mName = name;
+        mParameterTypes = new ArrayList<String>(parameterTypes);
+        mDeprecated = deprecated;
     }
 
+    @Override
     public int compareTo(ApiConstructor another) {
         return mParameterTypes.size() - another.mParameterTypes.size();
     }
@@ -46,6 +50,10 @@
         return Collections.unmodifiableList(mParameterTypes);
     }
 
+    public boolean isDeprecated() {
+        return mDeprecated;
+    }
+
     public boolean isCovered() {
         return mIsCovered;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
index eb67b8e..053cd12 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
@@ -29,14 +29,18 @@
 
     private final String mReturnType;
 
+    private boolean mDeprecated;
+
     private boolean mIsCovered;
 
-    ApiMethod(String name, List<String> parameterTypes, String returnType) {
-        this.mName = name;
-        this.mParameterTypes = new ArrayList<String>(parameterTypes);
-        this.mReturnType = returnType;
+    ApiMethod(String name, List<String> parameterTypes, String returnType, boolean deprecated) {
+        mName = name;
+        mParameterTypes = new ArrayList<String>(parameterTypes);
+        mReturnType = returnType;
+        mDeprecated = deprecated;
     }
 
+    @Override
     public int compareTo(ApiMethod another) {
         return mName.compareTo(another.mName);
     }
@@ -53,6 +57,10 @@
         return mReturnType;
     }
 
+    public boolean isDeprecated() {
+        return mDeprecated;
+    }
+
     public boolean isCovered() {
         return mIsCovered;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
index f0ca889..ddc6fb4 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
@@ -29,9 +29,10 @@
     private final Map<String, ApiClass> mApiClassMap = new HashMap<String, ApiClass>();
 
     ApiPackage(String name) {
-        this.mName = name;
+        mName = name;
     }
 
+    @Override
     public String getName() {
         return mName;
     }
@@ -64,6 +65,7 @@
         return total;
     }
 
+    @Override
     public float getCoveragePercentage() {
         return (float) getNumCoveredMethods() / getTotalMethods() * 100;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
index 5768e6c..f3abd86 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
@@ -36,6 +36,8 @@
 
     private String mCurrentMethodReturnType;
 
+    private boolean mDeprecated;
+
     private List<String> mCurrentParameterTypes = new ArrayList<String>();
 
     private ApiCoverage mApiCoverage = new ApiCoverage();
@@ -49,27 +51,30 @@
             throws SAXException {
         super.startElement(uri, localName, name, attributes);
         if ("package".equalsIgnoreCase(localName)) {
-            mCurrentPackageName = CurrentXmlHandler.getValue(attributes, "name");
+            mCurrentPackageName = getValue(attributes, "name");
 
             ApiPackage apiPackage = new ApiPackage(mCurrentPackageName);
             mApiCoverage.addPackage(apiPackage);
 
         } else if ("class".equalsIgnoreCase(localName)
                 || "interface".equalsIgnoreCase(localName)) {
-            mCurrentClassName = CurrentXmlHandler.getValue(attributes, "name");
+            mCurrentClassName = getValue(attributes, "name");
+            mDeprecated = isDeprecated(attributes);
 
-            ApiClass apiClass = new ApiClass(mCurrentClassName);
+            ApiClass apiClass = new ApiClass(mCurrentClassName, mDeprecated);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             apiPackage.addClass(apiClass);
 
         } else if ("constructor".equalsIgnoreCase(localName)) {
+            mDeprecated = isDeprecated(attributes);
             mCurrentParameterTypes.clear();
         }  else if ("method".equalsIgnoreCase(localName)) {
-            mCurrentMethodName = CurrentXmlHandler.getValue(attributes, "name");
-            mCurrentMethodReturnType = CurrentXmlHandler.getValue(attributes, "return");
+            mDeprecated = isDeprecated(attributes);
+            mCurrentMethodName = getValue(attributes, "name");
+            mCurrentMethodReturnType = getValue(attributes, "return");
             mCurrentParameterTypes.clear();
         } else if ("parameter".equalsIgnoreCase(localName)) {
-            mCurrentParameterTypes.add(CurrentXmlHandler.getValue(attributes, "type"));
+            mCurrentParameterTypes.add(getValue(attributes, "type"));
         }
     }
 
@@ -82,13 +87,13 @@
                 return;
             }
             ApiConstructor apiConstructor = new ApiConstructor(mCurrentClassName,
-                    mCurrentParameterTypes);
+                    mCurrentParameterTypes, mDeprecated);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
             apiClass.addConstructor(apiConstructor);
         }  else if ("method".equalsIgnoreCase(localName)) {
             ApiMethod apiMethod = new ApiMethod(mCurrentMethodName, mCurrentParameterTypes,
-                    mCurrentMethodReturnType);
+                    mCurrentMethodReturnType, mDeprecated);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
             apiClass.addMethod(apiMethod);
@@ -101,4 +106,8 @@
                 .replaceAll("<.+>", "")
                 .replace("$", ".");
     }
+
+    private boolean isDeprecated(Attributes attributes) {
+        return "deprecated".equals(attributes.getValue("deprecated"));
+    }
 }
\ No newline at end of file
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
index de9b7a6..9243fe0 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
@@ -37,11 +37,12 @@
 class HtmlReport {
 
     public static void printHtmlReport(final List<File> testApks, final ApiCoverage apiCoverage,
-            final OutputStream out) throws IOException, TransformerException, InterruptedException {
+            final OutputStream out) throws IOException, TransformerException {
         final PipedOutputStream xmlOut = new PipedOutputStream();
         final PipedInputStream xmlIn = new PipedInputStream(xmlOut);
 
         Thread t = new Thread(new Runnable() {
+            @Override
             public void run() {
                 XmlReport.printXmlReport(testApks, apiCoverage, xmlOut);
 
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
index 68acf06..94ccbb4 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
@@ -72,12 +72,14 @@
                         out.println("<class name=\"" + apiClass.getName()
                                 + "\" numCovered=\"" + apiClass.getNumCoveredMethods()
                                 + "\" numTotal=\"" + apiClass.getTotalMethods()
+                                + "\" deprecated=\"" + apiClass.isDeprecated()
                                 + "\" coveragePercentage=\""
                                     + Math.round(apiClass.getCoveragePercentage())
                                 + "\">");
 
                         for (ApiConstructor constructor : apiClass.getConstructors()) {
                             out.println("<constructor name=\"" + constructor.getName()
+                                    + "\" deprecated=\"" + constructor.isDeprecated()
                                     + "\" covered=\"" + constructor.isCovered() + "\">");
 
                             for (String parameterType : constructor.getParameterTypes()) {
@@ -90,6 +92,7 @@
                         for (ApiMethod method : apiClass.getMethods()) {
                             out.println("<method name=\"" + method.getName()
                                     + "\" returnType=\"" + method.getReturnType()
+                                    + "\" deprecated=\"" + method.isDeprecated()
                                     + "\" covered=\"" + method.isCovered() + "\">");
 
                             for (String parameterType : method.getParameterTypes()) {
diff --git a/tools/cts-api-coverage/src/res/api-coverage.xsl b/tools/cts-api-coverage/src/res/api-coverage.xsl
index 3743580..95994e2 100644
--- a/tools/cts-api-coverage/src/res/api-coverage.xsl
+++ b/tools/cts-api-coverage/src/res/api-coverage.xsl
@@ -71,6 +71,10 @@
                     .green {
                         background-color: #66FF66;
                     }
+
+                    .deprecated {
+                        text-decoration: line-through;
+                    }
                 </style>
             </head>
             <body>
@@ -118,7 +122,7 @@
     
     <xsl:template name="packageOrClassListItem">
         <xsl:param name="bulletClass" />
-        
+
         <xsl:variable name="colorClass">
             <xsl:choose>
                 <xsl:when test="@coveragePercentage &lt;= 50">red</xsl:when>
@@ -127,8 +131,15 @@
             </xsl:choose>
         </xsl:variable>
         
+        <xsl:variable name="deprecatedClass">
+            <xsl:choose>
+                <xsl:when test="@deprecated = 'true'">deprecated</xsl:when>
+                <xsl:otherwise></xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+
         <li class="{$bulletClass}" onclick="toggleVisibility('{@name}')">
-            <span class="{$colorClass}">
+            <span class="{$colorClass} {$deprecatedClass}">
                 <b><xsl:value-of select="@name" /></b>
                 &nbsp;<xsl:value-of select="@coveragePercentage" />%
                 &nbsp;(<xsl:value-of select="@numCovered" />/<xsl:value-of select="@numTotal" />)
@@ -137,7 +148,15 @@
     </xsl:template>
   
   <xsl:template name="methodListItem">
-    <span class="method">
+
+    <xsl:variable name="deprecatedClass">
+        <xsl:choose>
+            <xsl:when test="@deprecated = 'true'">deprecated</xsl:when>
+            <xsl:otherwise></xsl:otherwise>
+        </xsl:choose>
+    </xsl:variable>
+
+    <span class="method {$deprecatedClass}">
       <xsl:choose>
         <xsl:when test="@covered = 'true'">[X]</xsl:when>
         <xsl:otherwise>[ ]</xsl:otherwise>
@@ -147,7 +166,7 @@
     </span>
     <br />
   </xsl:template>
-  
+
   <xsl:template name="formatParameters">(<xsl:for-each select="parameter">
       <xsl:value-of select="@type" />
       <xsl:if test="not(position() = last())">,&nbsp;</xsl:if>