|  | // Copyright (c) 2017, 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.utils; | 
|  |  | 
|  | import com.android.tools.r8.errors.Unreachable; | 
|  | import com.android.tools.r8.utils.structural.Ordered; | 
|  | import java.util.Arrays; | 
|  | import java.util.List; | 
|  |  | 
|  | /** Android API level description */ | 
|  | public enum AndroidApiLevel implements Ordered<AndroidApiLevel> { | 
|  | B(1), | 
|  | B_1_1(2), | 
|  | C(3), | 
|  | D(4), | 
|  | E(5), | 
|  | E_0_1(6), | 
|  | E_MR1(7), | 
|  | F(8), | 
|  | G(9), | 
|  | G_MR1(10), | 
|  | H(11), | 
|  | H_MR1(12), | 
|  | H_MR2(13), | 
|  | I(14), | 
|  | I_MR1(15), | 
|  | J(16), | 
|  | J_MR1(17), | 
|  | J_MR2(18), | 
|  | K(19), | 
|  | K_WATCH(20), | 
|  | L(21), | 
|  | L_MR1(22), | 
|  | M(23), | 
|  | N(24), | 
|  | N_MR1(25), | 
|  | O(26), | 
|  | O_MR1(27), | 
|  | P(28), | 
|  | Q(29), | 
|  | R(30), | 
|  | S(31), | 
|  | Sv2(32), | 
|  | T(33), | 
|  | U(34), | 
|  | V(35), | 
|  | BAKLAVA(36), | 
|  | MAIN(37), // API level for main is tentative. | 
|  | EXTENSION(Integer.MAX_VALUE); // Used for API modeling of Android extension APIs. | 
|  |  | 
|  | // When updating LATEST and a new version goes public, add a new api-versions.xml to third_party | 
|  | // and update the version and generated jar in AndroidApiDatabaseBuilderGeneratorTest. Together | 
|  | // with that update third_party/android_jar/libcore_latest/core-oj.jar and run | 
|  | // GenerateCovariantReturnTypeMethodsTest. | 
|  | public static final AndroidApiLevel LATEST = BAKLAVA; | 
|  |  | 
|  | public static final AndroidApiLevel API_DATABASE_LEVEL = LATEST; | 
|  |  | 
|  | public static final AndroidApiLevel UNKNOWN = MAIN; | 
|  |  | 
|  | /** Constant used to signify some unknown min api when compiling platform. */ | 
|  | public static final int ANDROID_PLATFORM_CONSTANT = 10000; | 
|  |  | 
|  | private final int level; | 
|  |  | 
|  | AndroidApiLevel(int level) { | 
|  | this.level = level; | 
|  | } | 
|  |  | 
|  | public int getLevel() { | 
|  | return level; | 
|  | } | 
|  |  | 
|  | public String getName() { | 
|  | return "Android " + name(); | 
|  | } | 
|  |  | 
|  | public static AndroidApiLevel getDefault() { | 
|  | return AndroidApiLevel.B; | 
|  | } | 
|  |  | 
|  | public AndroidApiLevel max(AndroidApiLevel other) { | 
|  | return Ordered.max(this, other); | 
|  | } | 
|  |  | 
|  | public DexVersion getDexVersion() { | 
|  | return DexVersion.getDexVersion(this); | 
|  | } | 
|  |  | 
|  | public AndroidApiLevel next() { | 
|  | return getAndroidApiLevel(getLevel() + 1); | 
|  | } | 
|  |  | 
|  | public static List<AndroidApiLevel> getAndroidApiLevelsSorted() { | 
|  | return Arrays.asList(AndroidApiLevel.values()); | 
|  | } | 
|  |  | 
|  | 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; | 
|  | case V40: | 
|  | return AndroidApiLevel.R; | 
|  | case V41: | 
|  | return AndroidApiLevel.MAIN; | 
|  | default: | 
|  | throw new Unreachable(); | 
|  | } | 
|  | } | 
|  |  | 
|  | public static AndroidApiLevel getAndroidApiLevel(int apiLevel) { | 
|  | assert apiLevel > 0; | 
|  | assert BAKLAVA == LATEST; // This has to be updated when we add new api levels. | 
|  | assert UNKNOWN.isGreaterThan(LATEST); | 
|  | 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 O_MR1; | 
|  | case 28: | 
|  | return P; | 
|  | case 29: | 
|  | return Q; | 
|  | case 30: | 
|  | return R; | 
|  | case 31: | 
|  | return S; | 
|  | case 32: | 
|  | return Sv2; | 
|  | case 33: | 
|  | return T; | 
|  | case 34: | 
|  | return U; | 
|  | case 35: | 
|  | return V; | 
|  | case 36: | 
|  | return BAKLAVA; | 
|  | default: | 
|  | return MAIN; | 
|  | } | 
|  | } | 
|  | } |