Fix final overrides and API conversion

Bug: 187977749
Change-Id: I4b8b2d70d3c4484938456d8f0c46a07b8b35cda5
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
index 4f05b2e..6394d39 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
@@ -190,10 +190,10 @@
         && appView.options().isDesugaredLibraryCompilation()) {
       return false;
     }
-    return overridesLibraryMethod(method);
+    return overridesNonFinalLibraryMethod(method);
   }
 
-  private boolean overridesLibraryMethod(ProgramMethod method) {
+  private boolean overridesNonFinalLibraryMethod(ProgramMethod method) {
     // We look up everywhere to see if there is a supertype/interface implementing the method...
     DexProgramClass holder = method.getHolder();
     WorkList<DexType> workList = WorkList.newIdentityWorkList();
@@ -225,6 +225,11 @@
         if (appView.rewritePrefix.hasRewrittenType(dexClass.type, appView)) {
           return false;
         }
+        if (dexEncodedMethod.isFinal()) {
+          // We do not introduce overrides of final methods, in this case, the runtime always
+          // execute the default behavior in the final method.
+          return false;
+        }
         foundOverrideToRewrite = true;
       }
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
new file mode 100644
index 0000000..2c29f58
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
@@ -0,0 +1,86 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
+import java.util.List;
+import java.util.PriorityQueue;
+import java.util.stream.Stream;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class PriorityQueueSubclassTest extends DesugaredLibraryTestBase {
+
+  private final TestParameters parameters;
+  private final boolean shrinkDesugaredLibrary;
+
+  @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build());
+  }
+
+  public PriorityQueueSubclassTest(boolean shrinkDesugaredLibrary, TestParameters parameters) {
+    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testPriorityQueueD8() throws Exception {
+    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+    testForD8()
+        .addInnerClasses(PriorityQueueSubclassTest.class)
+        .setMinApi(parameters.getApiLevel())
+        .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
+        .compile()
+        .addDesugaredCoreLibraryRunClassPath(
+            this::buildDesugaredLibrary,
+            parameters.getApiLevel(),
+            keepRuleConsumer.get(),
+            shrinkDesugaredLibrary)
+        .run(parameters.getRuntime(), Executor.class)
+        .assertSuccessWithOutputLines("1");
+  }
+
+  @Test
+  public void testPriorityQueueR8() throws Exception {
+    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+    testForR8(Backend.DEX)
+        .addInnerClasses(PriorityQueueSubclassTest.class)
+        .setMinApi(parameters.getApiLevel())
+        .addKeepClassAndMembersRules(Executor.class)
+        .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
+        .compile()
+        .addDesugaredCoreLibraryRunClassPath(
+            this::buildDesugaredLibrary,
+            parameters.getApiLevel(),
+            keepRuleConsumer.get(),
+            shrinkDesugaredLibrary)
+        .run(parameters.getRuntime(), Executor.class)
+        .assertSuccessWithOutputLines("1");
+  }
+
+  static class Executor {
+
+    public static void main(String[] args) {
+      MyPriorityQueue strings = new MyPriorityQueue();
+      strings.add("1");
+      strings.add("2");
+      System.out.println(strings.iterator().next());
+    }
+  }
+
+  static class MyPriorityQueue extends PriorityQueue<String> {
+
+    @Override
+    public Stream<String> stream() {
+      return Stream.empty();
+    }
+  }
+}