Add a new dex version and api level

- Refactor around dex version to have an enumeration similar
to AndroidApiLevel

Change-Id: I9c2d09dd7cf0d51055959041e10c9cdb627e93e7
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
index 04ab202..b1bdfde 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -3,10 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
+import com.android.tools.r8.errors.Unreachable;
+
 /**
  * Android API level description
  */
 public enum AndroidApiLevel {
+  P(27),
   O(26),
   N_MR1(25),
   N(24),
@@ -51,4 +54,84 @@
   public static AndroidApiLevel getDefault() {
     return AndroidApiLevel.B;
   }
+
+  public DexVersion getDexVersion() {
+    return DexVersion.getDexVersion(this);
+  }
+
+  public static AndroidApiLevel getMinAndroidApiLevel(DexVersion dexVersion) {
+    switch (dexVersion) {
+      case V35:
+        return AndroidApiLevel.B;
+      case V37:
+        return AndroidApiLevel.N;
+      case V38:
+        return AndroidApiLevel.O;
+      case V39:
+        return AndroidApiLevel.P;
+      default:
+        throw new Unreachable();
+    }
+  }
+
+  public static AndroidApiLevel getAndroidApiLevel(int apiLevel) {
+    switch (apiLevel) {
+      case 1:
+        return B;
+      case 2:
+        return B_1_1;
+      case 3:
+        return C;
+      case 4:
+        return D;
+      case 5:
+        return E;
+      case 6:
+        return E_0_1;
+      case 7:
+        return E_MR1;
+      case 8:
+        return F;
+      case 9:
+        return G;
+      case 10:
+        return G_MR1;
+      case 11:
+        return H;
+      case 12:
+        return H_MR1;
+      case 13:
+        return H_MR2;
+      case 14:
+        return I;
+      case 15:
+        return I_MR1;
+      case 16:
+        return J;
+      case 17:
+        return J_MR1;
+      case 18:
+        return J_MR2;
+      case 19:
+        return K;
+      case 20:
+        return K_WATCH;
+      case 21:
+        return L;
+      case 22:
+        return L_MR1;
+      case 23:
+        return M;
+      case 24:
+        return N;
+      case 25:
+        return N_MR1;
+      case 26:
+        return O;
+      case 27:
+        return P;
+      default:
+        throw new Unreachable();
+    }
+  }
 }