return new DataUri(contentType, base64, data);
@Nullable @Override public byte[] decode(@NonNull DataUri dataUri) { final String data = dataUri.data(); if (!TextUtils.isEmpty(data)) { try { if (dataUri.base64()) { return Base64.decode(data.getBytes("UTF-8"), Base64.DEFAULT); } else { return data.getBytes("UTF-8"); } } catch (Throwable t) { return null; } } else { return null; } } }
@Nullable @Override public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { if (!raw.startsWith(START)) { return null; } String part = raw.substring(START.length()); // this part is added to support `data://` with which this functionality was released if (part.startsWith("//")) { part = part.substring(2); } final DataUri dataUri = uriParser.parse(part); if (dataUri == null) { return null; } final byte[] bytes = uriDecoder.decode(dataUri); if (bytes == null) { return null; } return new ImageItem( dataUri.contentType(), new ByteArrayInputStream(bytes), null ); }
@Test public void test() { final Map<String, DataUri> data = new LinkedHashMap<String, DataUri>() {{ put(",", new DataUri(null, false, null)); put("image/svg+xml;base64,!@#$%^&*(", new DataUri("image/svg+xml", true, "!@#$%^&*(")); put("text/vnd-example+xyz;foo=bar;base64,R0lGODdh", new DataUri("text/vnd-example+xyz", true, "R0lGODdh")); put("text/plain;charset=UTF-8;page=21,the%20data:1234,5678", new DataUri("text/plain", false, "the%20data:1234,5678")); }}; for (Map.Entry<String, DataUri> entry : data.entrySet()) { assertEquals(entry.getKey(), entry.getValue(), impl.parse(entry.getKey())); } }
@Test public void data_new_lines_are_ignored() { final String input = "image/png;base64,iVBORw0KGgoAAA\n" + "ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4\n" + "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU\n" + "5ErkJggg=="; assertEquals( new DataUri("image/png", true, "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="), impl.parse(input) ); }
@Test public void base64_no_content_type() { final String input = ";base64,12345"; assertEquals( input, new DataUri(null, true, "12345"), impl.parse(input) ); }
@Test public void content_type_data_no_base64() { final String input = "image/png,aSdFg"; assertEquals( input, new DataUri("image/png", false, "aSdFg"), impl.parse(input) ); } }
@Test public void two_commas() { final String input = ",,"; // <- second one would be considered data... assertEquals( input, new DataUri(null, false, ","), impl.parse(input) ); }
@Test public void not_base64_no_content_type() { final String input = ",qweRTY"; assertEquals( input, new DataUri(null, false, "qweRTY"), impl.parse(input) ); }
@Test public void more_commas() { final String input = "first,second,third"; // <- first is just a value (will be ignored) assertEquals( input, new DataUri(null, false, "second,third"), impl.parse(input) ); }