Niedzielski has uploaded a new change for review. https://gerrit.wikimedia.org/r/316473
Change subject: Fix un/marshalling of Uris to extend to subclasses ...................................................................... Fix un/marshalling of Uris to extend to subclasses GsonBuilder.registerTypeAdapter() does not consider type hierarchies. Uri is an abstract type so all instances will always be a subclass. Use registerTypeHierarchyAdapter() instead. Also, move null handling to TypeAdapter.nullSafe() and add tests. Change-Id: I59ba6a9e32e898f28c9d1248fd39c20c71eebca1 --- M app/src/main/java/org/wikipedia/json/GsonUtil.java M app/src/main/java/org/wikipedia/json/UriTypeAdapter.java A app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java 3 files changed, 67 insertions(+), 7 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/73/316473/1 diff --git a/app/src/main/java/org/wikipedia/json/GsonUtil.java b/app/src/main/java/org/wikipedia/json/GsonUtil.java index 3761d15..81c4831 100644 --- a/app/src/main/java/org/wikipedia/json/GsonUtil.java +++ b/app/src/main/java/org/wikipedia/json/GsonUtil.java @@ -11,7 +11,7 @@ private static final String DATE_FORMAT = "MMM dd, yyyy HH:mm:ss"; private static final Gson DEFAULT_GSON = new GsonBuilder() .setDateFormat(DATE_FORMAT) - .registerTypeAdapter(Uri.class, new UriTypeAdapter()) + .registerTypeHierarchyAdapter(Uri.class, new UriTypeAdapter().nullSafe()) .registerTypeHierarchyAdapter(Namespace.class, new NamespaceTypeAdapter().nullSafe()) .create(); diff --git a/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java b/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java index 4f06b44..07ffa51 100644 --- a/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java +++ b/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java @@ -11,17 +11,12 @@ public class UriTypeAdapter extends TypeAdapter<Uri> { @Override public void write(JsonWriter out, Uri value) throws IOException { - out.value(value == null ? null : value.toString()); + out.value(value.toString()); } @Override public Uri read(JsonReader in) throws IOException { String url = in.nextString(); - - if (url == null) { - return null; - } - return Uri.parse(url); } } diff --git a/app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java b/app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java new file mode 100644 index 0000000..f2e08ee --- /dev/null +++ b/app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java @@ -0,0 +1,65 @@ +package org.wikipedia.json; + +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.ParameterizedRobolectricTestRunner; +import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; +import org.wikipedia.Constants; + +import java.util.Arrays; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.wikipedia.json.GsonMarshaller.marshal; +import static org.wikipedia.json.GsonUnmarshaller.unmarshal; + +@RunWith(ParameterizedRobolectricTestRunner.class) public class UriTypeAdapterTest { + @Parameters(name = "{0}") public static Iterable<Object[]> data() { + return Arrays.asList(new Object[][] {{DeferredParam.NULL}, + {DeferredParam.STRING}, + {DeferredParam.OPAQUE}, + {DeferredParam.HIERARCHICAL}}); + } + + @Nullable private final Uri uri; + + public UriTypeAdapterTest(@NonNull DeferredParam param) { + this.uri = param.val(); + } + + @Test public void testWriteRead() { + Uri result = unmarshal(Uri.class, marshal(uri)); + assertThat(result, is(uri)); + } + + // Namespace uses a roboelectric mocked class internally, SparseArray, which is unavailable at + // static time; defer evaluation until TestRunner is executed + private enum DeferredParam { + NULL() { + @Nullable @Override Uri val() { + return null; + } + }, + STRING() { + @Nullable @Override Uri val() { + return Uri.parse(Constants.WIKIPEDIA_URL); + } + }, + OPAQUE() { + @Nullable @Override Uri val() { + return Uri.fromParts("http", "mediawiki.org", null); + } + }, + HIERARCHICAL() { + @Nullable @Override Uri val() { + return Uri.EMPTY; + } + }; + + @Nullable abstract Uri val(); + } +} \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/316473 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I59ba6a9e32e898f28c9d1248fd39c20c71eebca1 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits