Loading mime/Android.bp +12 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ java_library { java_resources: [ ":debian.mime.types", ":android.mime.types", ":vendor.mime.types", ], sdk_version: "core_platform", Loading @@ -41,3 +42,14 @@ filegroup { "java-res/android.mime.types", ], } filegroup { name: "vendor.mime.types", visibility: [ "//visibility:private", ], path: "java-res/", srcs: [ "java-res/vendor.mime.types", ], } mime/java-res/android.mime.types +1 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ # # Android-specific MIME type <-> extension mappings # # Each line below defines an mapping from one MIME type to the first of the # Each line below defines a mapping from one MIME type to the first of the # listed extensions, and from listed extension back to the MIME type. # A mapping overrides any previous mapping _from_ that same MIME type or # extension (put() semantics), unless that MIME type / extension is prefixed with '?' Loading mime/java-res/vendor.mime.types 0 → 100644 +41 −0 Original line number Diff line number Diff line ############################################################################### # # Vendor-specific MIME type <-> extension mappings # # Each line below defines a mapping from one MIME type to the first of the # listed extensions, and from listed extension back to the MIME type. # # This file can _add_ additional mappings that are not in the default set, # but it it cannot _modify_ (replace or remove) any platform default mapping # (defined in files mime.types and android.mime.types). # ############################################################################### # # EXAMPLES # # A line of the form (without the leading '#''): # # mime ext1 ext2 ext3 # # affects the current mappings along the lines of the following pseudo code: # # mimeToExt.putIfAbsent("mime", "ext1"); # extToMime.putIfAbsent("ext1", "mime"); # extToMime.putIfAbsent("ext2", "mime"); # extToMime.putIfAbsent("ext3", "mime"); # # Optionally, MIME types or extensions may be prefixed by a single '?', which # will be ignored. I.e., the following example lines all have the same semantics: # # mime ext1 ext2 ext3 # ?mime ext1 ext2 ext3 # mime ?ext1 ext2 ?ext3 # ?mime ?ext1 ?ext2 ?ext3 # # By default, this file contains no mappings (which means that the platform # default mapping is used unmodified). # ############################################################################### # # Add your custom mappings below this line (with no "#" at the start of the line): mime/java/android/content/type/DefaultMimeMapFactory.java +25 −10 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import libcore.net.MimeMap; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; Loading @@ -44,20 +45,17 @@ public class DefaultMimeMapFactory { * Android's default mapping between MIME types and extensions. */ public static MimeMap create() { return parseFromResources("/mime.types", "/android.mime.types"); } private static final Pattern SPLIT_PATTERN = Pattern.compile("\\s+"); static MimeMap parseFromResources(String... resourceNames) { MimeMap.Builder builder = MimeMap.builder(); for (String resourceName : resourceNames) { parseTypes(builder, resourceName); } parseTypes(builder, true, "/mime.types"); parseTypes(builder, true, "/android.mime.types"); parseTypes(builder, false, "/vendor.mime.types"); return builder.build(); } private static void parseTypes(MimeMap.Builder builder, String resource) { private static final Pattern SPLIT_PATTERN = Pattern.compile("\\s+"); private static void parseTypes(MimeMap.Builder builder, boolean allowOverwrite, String resource) { try (BufferedReader r = new BufferedReader( new InputStreamReader(DefaultMimeMapFactory.class.getResourceAsStream(resource)))) { String line; Loading @@ -71,6 +69,12 @@ public class DefaultMimeMapFactory { continue; } List<String> specs = Arrays.asList(SPLIT_PATTERN.split(line)); if (!allowOverwrite) { // Pretend that the mimeType and each file extension listed in the line // carries a "?" prefix, which means that it can add new mappings but // not modify existing mappings (putIfAbsent() semantics). specs = ensurePrefix("?", specs); } builder.put(specs.get(0), specs.subList(1, specs.size())); } } catch (IOException | RuntimeException e) { Loading @@ -78,4 +82,15 @@ public class DefaultMimeMapFactory { } } private static List<String> ensurePrefix(String prefix, List<String> strings) { List<String> result = new ArrayList<>(strings.size()); for (String s : strings) { if (!s.startsWith(prefix)) { s = prefix + s; } result.add(s); } return result; } } Loading
mime/Android.bp +12 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ java_library { java_resources: [ ":debian.mime.types", ":android.mime.types", ":vendor.mime.types", ], sdk_version: "core_platform", Loading @@ -41,3 +42,14 @@ filegroup { "java-res/android.mime.types", ], } filegroup { name: "vendor.mime.types", visibility: [ "//visibility:private", ], path: "java-res/", srcs: [ "java-res/vendor.mime.types", ], }
mime/java-res/android.mime.types +1 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ # # Android-specific MIME type <-> extension mappings # # Each line below defines an mapping from one MIME type to the first of the # Each line below defines a mapping from one MIME type to the first of the # listed extensions, and from listed extension back to the MIME type. # A mapping overrides any previous mapping _from_ that same MIME type or # extension (put() semantics), unless that MIME type / extension is prefixed with '?' Loading
mime/java-res/vendor.mime.types 0 → 100644 +41 −0 Original line number Diff line number Diff line ############################################################################### # # Vendor-specific MIME type <-> extension mappings # # Each line below defines a mapping from one MIME type to the first of the # listed extensions, and from listed extension back to the MIME type. # # This file can _add_ additional mappings that are not in the default set, # but it it cannot _modify_ (replace or remove) any platform default mapping # (defined in files mime.types and android.mime.types). # ############################################################################### # # EXAMPLES # # A line of the form (without the leading '#''): # # mime ext1 ext2 ext3 # # affects the current mappings along the lines of the following pseudo code: # # mimeToExt.putIfAbsent("mime", "ext1"); # extToMime.putIfAbsent("ext1", "mime"); # extToMime.putIfAbsent("ext2", "mime"); # extToMime.putIfAbsent("ext3", "mime"); # # Optionally, MIME types or extensions may be prefixed by a single '?', which # will be ignored. I.e., the following example lines all have the same semantics: # # mime ext1 ext2 ext3 # ?mime ext1 ext2 ext3 # mime ?ext1 ext2 ?ext3 # ?mime ?ext1 ?ext2 ?ext3 # # By default, this file contains no mappings (which means that the platform # default mapping is used unmodified). # ############################################################################### # # Add your custom mappings below this line (with no "#" at the start of the line):
mime/java/android/content/type/DefaultMimeMapFactory.java +25 −10 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import libcore.net.MimeMap; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; Loading @@ -44,20 +45,17 @@ public class DefaultMimeMapFactory { * Android's default mapping between MIME types and extensions. */ public static MimeMap create() { return parseFromResources("/mime.types", "/android.mime.types"); } private static final Pattern SPLIT_PATTERN = Pattern.compile("\\s+"); static MimeMap parseFromResources(String... resourceNames) { MimeMap.Builder builder = MimeMap.builder(); for (String resourceName : resourceNames) { parseTypes(builder, resourceName); } parseTypes(builder, true, "/mime.types"); parseTypes(builder, true, "/android.mime.types"); parseTypes(builder, false, "/vendor.mime.types"); return builder.build(); } private static void parseTypes(MimeMap.Builder builder, String resource) { private static final Pattern SPLIT_PATTERN = Pattern.compile("\\s+"); private static void parseTypes(MimeMap.Builder builder, boolean allowOverwrite, String resource) { try (BufferedReader r = new BufferedReader( new InputStreamReader(DefaultMimeMapFactory.class.getResourceAsStream(resource)))) { String line; Loading @@ -71,6 +69,12 @@ public class DefaultMimeMapFactory { continue; } List<String> specs = Arrays.asList(SPLIT_PATTERN.split(line)); if (!allowOverwrite) { // Pretend that the mimeType and each file extension listed in the line // carries a "?" prefix, which means that it can add new mappings but // not modify existing mappings (putIfAbsent() semantics). specs = ensurePrefix("?", specs); } builder.put(specs.get(0), specs.subList(1, specs.size())); } } catch (IOException | RuntimeException e) { Loading @@ -78,4 +82,15 @@ public class DefaultMimeMapFactory { } } private static List<String> ensurePrefix(String prefix, List<String> strings) { List<String> result = new ArrayList<>(strings.size()); for (String s : strings) { if (!s.startsWith(prefix)) { s = prefix + s; } result.add(s); } return result; } }