Properly implement the art <-> api version map
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
index a8368bc..c1e40ad 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
@@ -39,6 +39,10 @@
 import java.util.EnumMap;
 import java.util.HashMap;
 
+import static org.jf.dexlib2.VersionMap.NO_VERSION;
+import static org.jf.dexlib2.VersionMap.mapApiToArtVersion;
+import static org.jf.dexlib2.VersionMap.mapArtVersionToApi;
+
 public class Opcodes {
 
     /**
@@ -52,12 +56,12 @@
 
     @Nonnull
     public static Opcodes forApi(int api) {
-        return new Opcodes(api, VersionMap.mapApiToArtVersion(api));
+        return new Opcodes(api, NO_VERSION);
     }
 
     @Nonnull
     public static Opcodes forArtVersion(int artVersion) {
-        return new Opcodes(VersionMap.mapArtVersionToApi(artVersion), artVersion);
+        return new Opcodes(NO_VERSION, artVersion);
     }
 
     /**
@@ -70,8 +74,18 @@
     }
 
     private Opcodes(int api, int artVersion) {
-        this.api = api;
-        this.artVersion = artVersion;
+
+
+        if (api >= 21) {
+            this.api = api;
+            this.artVersion = mapApiToArtVersion(api);
+        } else if (artVersion >= 0 && artVersion < 39) {
+            this.api = mapArtVersionToApi(artVersion);
+            this.artVersion = artVersion;
+        } else {
+            this.api = api;
+            this.artVersion = artVersion;
+        }
 
         opcodeValues = new EnumMap<Opcode, Short>(Opcode.class);
         opcodesByName = Maps.newHashMap();
@@ -131,6 +145,6 @@
     }
 
     public boolean isArt() {
-        return artVersion != VersionMap.NO_VERSION;
+        return artVersion != NO_VERSION;
     }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java
index 42802bc..e0e1a6b 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java
@@ -35,16 +35,38 @@
     public static final int NO_VERSION = -1;
 
     public static int mapArtVersionToApi(int artVersion) {
-        // TODO: implement this
-        return 20;
+        if (artVersion >= 79) {
+            return 24;
+        }
+        if (artVersion >= 64) {
+            return 23;
+        }
+        if (artVersion >= 45) {
+            return 22;
+        }
+        if (artVersion >= 39) {
+            return 21;
+        }
+        return 19;
     }
 
     public static int mapApiToArtVersion(int api) {
-        // TODO: implement this
-        if (api < 20) {
-            return NO_VERSION;
-        } else {
-            return 56;
+        switch (api) {
+            case 19:
+            case 20:
+                return 7;
+            case 21:
+                return 39;
+            case 22:
+                return 45;
+            case 23:
+                return 64;
+            case 24:
+                return 79;
         }
+        if (api > 24) {
+            return 79;
+        }
+        return NO_VERSION;
     }
 }