Merge "Add --delete-empty-removed-signatures"
diff --git a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
index 8206879..c7dc7f0 100644
--- a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
+++ b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
@@ -1132,17 +1132,19 @@
         }
         // blow open super class and interfaces
         // TODO: Consider using val superClass = cl.filteredSuperclass(filter)
-        val superClass = cl.superClass()
-        if (superClass != null) {
-            if (superClass.isHiddenOrRemoved()) {
+        val superItems = cl.allInterfaces().toMutableSet()
+        cl.superClass()?.let { superClass -> superItems.add(superClass) }
+
+        for (superItem in superItems) {
+            if (superItem.isHiddenOrRemoved()) {
                 // cl is a public class declared as extending a hidden superclass.
                 // this is not a desired practice but it's happened, so we deal
                 // with it by finding the first super class which passes checkLevel for purposes of
                 // generating the doc & stub information, and proceeding normally.
-                if (!superClass.isFromClassPath()) {
+                if (!superItem.isFromClassPath()) {
                     reporter.report(
                         Issues.HIDDEN_SUPERCLASS, cl, "Public class " + cl.qualifiedName() +
-                            " stripped of unavailable superclass " + superClass.qualifiedName()
+                            " stripped of unavailable superclass " + superItem.qualifiedName()
                     )
                 }
             } else {
@@ -1150,10 +1152,10 @@
                 // right (this was just done for its stub handling)
                 //   cantStripThis(superClass, filter, notStrippable, stubImportPackages, cl, "as super class")
 
-                if (superClass.isPrivate && !superClass.isFromClassPath()) {
+                if (superItem.isPrivate && !superItem.isFromClassPath()) {
                     reporter.report(
                         Issues.PRIVATE_SUPERCLASS, cl, "Public class " +
-                            cl.qualifiedName() + " extends private class " + superClass.qualifiedName()
+                            cl.qualifiedName() + " extends private class " + superItem.qualifiedName()
                     )
                 }
             }
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index c8de58a..15b532a 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -587,7 +587,8 @@
                 ARG_HIDE_PACKAGE, "test.pkg2",
                 ARG_HIDE, "ReferencesHidden",
                 ARG_HIDE, "UnavailableSymbol",
-                ARG_HIDE, "HiddenTypeParameter"
+                ARG_HIDE, "HiddenTypeParameter",
+                ARG_HIDE, "HiddenSuperclass"
             )
         )
     }
@@ -2892,6 +2893,9 @@
                     """
                 )
             ),
+            expectedIssues = """
+                src/android/net/http/HttpResponseCache.java:6: warning: Public class android.net.http.HttpResponseCache stripped of unavailable superclass com.squareup.okhttp.OkCacheContainer [HiddenSuperclass]
+            """,
             api = """
                 package android.net.http {
                   public final class HttpResponseCache implements java.io.Closeable {
diff --git a/src/test/java/com/android/tools/metalava/ApiLintTest.kt b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
index 7eb6a78..9d01e47 100644
--- a/src/test/java/com/android/tools/metalava/ApiLintTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
@@ -1500,6 +1500,7 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
+                src/android/pkg/MySubClass.java:5: warning: Public class android.pkg.MySubClass stripped of unavailable superclass android.pkg.MyHiddenInterface [HiddenSuperclass]
                 src/android/pkg/MyCallback.java:4: warning: Type of parameter list in android.pkg.MyCallback.onFoo(java.util.List<java.lang.String> list) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
                 src/android/pkg/MyClass.java:8: warning: Return type of method android.pkg.MyClass.getList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
                 src/android/pkg/MyClass.java:12: warning: Type of field android.pkg.MyClass.STRINGS is a nullable collection (`java.lang.String[]`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
index fbfec3a..6432ab3 100644
--- a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
@@ -2585,7 +2585,8 @@
                     /**
                      * @hide
                      */
-                    @android.annotation.SystemApi
+                    @SystemApi
+                    @SuppressWarnings("HiddenSuperclass")
                     public class MediaPlayer implements SubtitleController.Listener {
                     }
                     """
diff --git a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
index dbe50b8..dd0be8b 100644
--- a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
@@ -78,4 +78,69 @@
                 """
         )
     }
+
+    @Test
+    fun `Using hide annotation interface order`() {
+        check(
+            expectedIssues = """
+                src/test/pkg/InterfaceWithHiddenInterfaceFirst.java:2: warning: Public class test.pkg.InterfaceWithHiddenInterfaceFirst stripped of unavailable superclass test.pkg.HiddenInterface [HiddenSuperclass]
+                src/test/pkg/InterfaceWithVisibleInterfaceFirst.java:2: warning: Public class test.pkg.InterfaceWithVisibleInterfaceFirst stripped of unavailable superclass test.pkg.HiddenInterface [HiddenSuperclass]
+            """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    @Hide
+                    public @interface Hide {}
+                """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    @Hide
+                    public interface HiddenInterface {
+                      void hiddenInterfaceMethod();
+                    }
+                """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    public interface VisibleInterface {
+                      void visibleInterfaceMethod();
+                    }
+                """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    public interface InterfaceWithVisibleInterfaceFirst
+                        extends VisibleInterface, HiddenInterface {}
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    public interface InterfaceWithHiddenInterfaceFirst
+                        extends HiddenInterface, VisibleInterface {}
+                    """
+                )
+            ),
+            hideAnnotations = arrayOf(
+                "test.pkg.Hide"
+            ),
+            includeStrippedSuperclassWarnings = true,
+            api = """
+                package test.pkg {
+                  public interface InterfaceWithHiddenInterfaceFirst extends test.pkg.VisibleInterface {
+                  }
+                  public interface InterfaceWithVisibleInterfaceFirst extends test.pkg.VisibleInterface {
+                  }
+                  public interface VisibleInterface {
+                    method public void visibleInterfaceMethod();
+                  }
+                }
+                """
+        )
+    }
 }
\ No newline at end of file