From cc8101c21724b1774f02381e8be14a7b9d259423 Mon Sep 17 00:00:00 2001 From: miav Date: Mon, 3 Apr 2017 13:46:15 +0200 Subject: [PATCH 1/3] Implementing Parcelable in ParseGeoPoint --- .../main/java/com/parse/ParseGeoPoint.java | 27 ++++++++++++++++++- .../java/com/parse/ParseGeoPointTest.java | 18 +++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Parse/src/main/java/com/parse/ParseGeoPoint.java b/Parse/src/main/java/com/parse/ParseGeoPoint.java index 71e5ef5fc..71a15a056 100644 --- a/Parse/src/main/java/com/parse/ParseGeoPoint.java +++ b/Parse/src/main/java/com/parse/ParseGeoPoint.java @@ -10,6 +10,8 @@ import android.location.Criteria; import android.location.Location; +import android.os.Parcel; +import android.os.Parcelable; import java.util.Locale; @@ -32,7 +34,7 @@ * */ -public class ParseGeoPoint { +public class ParseGeoPoint implements Parcelable { static double EARTH_MEAN_RADIUS_KM = 6371.0; static double EARTH_MEAN_RADIUS_MILE = 3958.8; @@ -268,4 +270,27 @@ public static void getCurrentLocationInBackground(long timeout, Criteria criteri public String toString() { return String.format(Locale.US, "ParseGeoPoint[%.6f,%.6f]", latitude, longitude); } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeDouble(latitude); + dest.writeDouble(longitude); + } + + public final static Creator CREATOR = new Creator() { + @Override + public ParseGeoPoint createFromParcel(Parcel source) { + return new ParseGeoPoint(source.readDouble(), source.readDouble()); + } + + @Override + public ParseGeoPoint[] newArray(int size) { + return new ParseGeoPoint[size]; + } + }; } diff --git a/Parse/src/test/java/com/parse/ParseGeoPointTest.java b/Parse/src/test/java/com/parse/ParseGeoPointTest.java index ab5646ca9..212302327 100644 --- a/Parse/src/test/java/com/parse/ParseGeoPointTest.java +++ b/Parse/src/test/java/com/parse/ParseGeoPointTest.java @@ -8,10 +8,17 @@ */ package com.parse; +import android.os.Parcel; + import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; import static org.junit.Assert.*; +@RunWith(RobolectricTestRunner.class) +@Config(constants = BuildConfig.class, sdk = 23) public class ParseGeoPointTest { @Test @@ -30,4 +37,15 @@ public void testConstructors() { assertEquals(lat, copy.getLatitude(), 0); assertEquals(lng, copy.getLongitude(), 0); } + + @Test + public void testParcelable() { + ParseGeoPoint point = new ParseGeoPoint(30d, 50d); + Parcel parcel = Parcel.obtain(); + point.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + point = ParseGeoPoint.CREATOR.createFromParcel(parcel); + assertEquals(point.getLatitude(), 30d, 0); + assertEquals(point.getLongitude(), 50d, 0); + } } From 0dd526e54233e868ca244d9810be6d2640f9c527 Mon Sep 17 00:00:00 2001 From: miav Date: Mon, 3 Apr 2017 16:26:58 +0200 Subject: [PATCH 2/3] Support for inheritance --- Parse/src/main/java/com/parse/ParseGeoPoint.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Parse/src/main/java/com/parse/ParseGeoPoint.java b/Parse/src/main/java/com/parse/ParseGeoPoint.java index 71a15a056..e2503f1ad 100644 --- a/Parse/src/main/java/com/parse/ParseGeoPoint.java +++ b/Parse/src/main/java/com/parse/ParseGeoPoint.java @@ -70,6 +70,20 @@ public ParseGeoPoint(ParseGeoPoint point) { this(point.getLatitude(), point.getLongitude()); } + + /** + * Creates a new point instance from a Parcel {@code source}. This is used when unparceling a + * ParseGeoPoint. Subclasses that need Parcelable behavior should provide their own + * {@link android.os.Parcelable.Creator} and override this constructor. + * + * @param source + * The recovered parcel. + */ + protected ParseGeoPoint(Parcel source) { + setLatitude(source.readDouble()); + setLongitude(source.readDouble()); + } + /** * Set latitude. Valid range is (-90.0, 90.0). Extremes should not be used. * @@ -285,7 +299,7 @@ public void writeToParcel(Parcel dest, int flags) { public final static Creator CREATOR = new Creator() { @Override public ParseGeoPoint createFromParcel(Parcel source) { - return new ParseGeoPoint(source.readDouble(), source.readDouble()); + return new ParseGeoPoint(source); } @Override From 9ac85893227af6ed560e5e9041052d35083bc63e Mon Sep 17 00:00:00 2001 From: miav Date: Thu, 20 Apr 2017 01:42:32 +0200 Subject: [PATCH 3/3] Update encoder/decoder --- Parse/src/main/java/com/parse/ParseFile.java | 1 + .../main/java/com/parse/ParseGeoPoint.java | 24 +++++++++++++++---- .../java/com/parse/ParseParcelDecoder.java | 3 +++ .../java/com/parse/ParseParcelEncoder.java | 8 ++++--- .../java/com/parse/ParseGeoPointTest.java | 2 +- .../test/java/com/parse/ParseObjectTest.java | 6 ++++- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Parse/src/main/java/com/parse/ParseFile.java b/Parse/src/main/java/com/parse/ParseFile.java index b580fc571..f2dac8a7e 100644 --- a/Parse/src/main/java/com/parse/ParseFile.java +++ b/Parse/src/main/java/com/parse/ParseFile.java @@ -240,6 +240,7 @@ protected ParseFile(Parcel source) { * Creates a new file instance from a {@link Parcel} using the given {@link ParseParcelDecoder}. * The decoder is currently unused, but it might be in the future, plus this is the pattern we * are using in parcelable classes. + * * @param source the parcel * @param decoder the decoder */ diff --git a/Parse/src/main/java/com/parse/ParseGeoPoint.java b/Parse/src/main/java/com/parse/ParseGeoPoint.java index e2503f1ad..4a785fd50 100644 --- a/Parse/src/main/java/com/parse/ParseGeoPoint.java +++ b/Parse/src/main/java/com/parse/ParseGeoPoint.java @@ -70,16 +70,26 @@ public ParseGeoPoint(ParseGeoPoint point) { this(point.getLatitude(), point.getLongitude()); } - /** - * Creates a new point instance from a Parcel {@code source}. This is used when unparceling a + * Creates a new point instance from a {@link Parcel} source. This is used when unparceling a * ParseGeoPoint. Subclasses that need Parcelable behavior should provide their own * {@link android.os.Parcelable.Creator} and override this constructor. * - * @param source - * The recovered parcel. + * @param source The recovered parcel. */ protected ParseGeoPoint(Parcel source) { + this(source, ParseParcelDecoder.get()); + } + + /** + * Creates a new point instance from a {@link Parcel} using the given {@link ParseParcelDecoder}. + * The decoder is currently unused, but it might be in the future, plus this is the pattern we + * are using in parcelable classes. + * + * @param source the parcel + * @param decoder the decoder + */ + ParseGeoPoint(Parcel source, ParseParcelDecoder decoder) { setLatitude(source.readDouble()); setLongitude(source.readDouble()); } @@ -292,6 +302,10 @@ public int describeContents() { @Override public void writeToParcel(Parcel dest, int flags) { + writeToParcel(dest, ParseParcelEncoder.get()); + } + + void writeToParcel(Parcel dest, ParseParcelEncoder encoder) { dest.writeDouble(latitude); dest.writeDouble(longitude); } @@ -299,7 +313,7 @@ public void writeToParcel(Parcel dest, int flags) { public final static Creator CREATOR = new Creator() { @Override public ParseGeoPoint createFromParcel(Parcel source) { - return new ParseGeoPoint(source); + return new ParseGeoPoint(source, ParseParcelDecoder.get()); } @Override diff --git a/Parse/src/main/java/com/parse/ParseParcelDecoder.java b/Parse/src/main/java/com/parse/ParseParcelDecoder.java index ea22923fa..eab948eb2 100644 --- a/Parse/src/main/java/com/parse/ParseParcelDecoder.java +++ b/Parse/src/main/java/com/parse/ParseParcelDecoder.java @@ -62,6 +62,9 @@ public Object decode(Parcel source) { case ParseParcelEncoder.TYPE_FILE: return new ParseFile(source, this); + case ParseParcelEncoder.TYPE_GEOPOINT: + return new ParseGeoPoint(source, this); + case ParseParcelEncoder.TYPE_ACL: return new ParseACL(source, this); diff --git a/Parse/src/main/java/com/parse/ParseParcelEncoder.java b/Parse/src/main/java/com/parse/ParseParcelEncoder.java index c4d1be572..e82262dd2 100644 --- a/Parse/src/main/java/com/parse/ParseParcelEncoder.java +++ b/Parse/src/main/java/com/parse/ParseParcelEncoder.java @@ -41,7 +41,7 @@ private static boolean isValidType(Object value) { return ParseEncoder.isValidType(value); } - /* package */ final static String TYPE_OBJECT = "ParseObject"; + /* package */ final static String TYPE_OBJECT = "Object"; /* package */ final static String TYPE_POINTER = "Pointer"; /* package */ final static String TYPE_DATE = "Date"; /* package */ final static String TYPE_BYTES = "Bytes"; @@ -53,7 +53,8 @@ private static boolean isValidType(Object value) { /* package */ final static String TYPE_NULL = "Null"; /* package */ final static String TYPE_NATIVE = "Native"; /* package */ final static String TYPE_OP = "Operation"; - /* package */ final static String TYPE_FILE = "ParseFile"; + /* package */ final static String TYPE_FILE = "File"; + /* package */ final static String TYPE_GEOPOINT = "GeoPoint"; public void encode(Object object, Parcel dest) { try { @@ -80,7 +81,8 @@ public void encode(Object object, Parcel dest) { ((ParseFile) object).writeToParcel(dest, this); } else if (object instanceof ParseGeoPoint) { - throw new IllegalArgumentException("Not supported yet"); + dest.writeString(TYPE_GEOPOINT); + ((ParseGeoPoint) object).writeToParcel(dest, this); } else if (object instanceof ParseACL) { dest.writeString(TYPE_ACL); diff --git a/Parse/src/test/java/com/parse/ParseGeoPointTest.java b/Parse/src/test/java/com/parse/ParseGeoPointTest.java index 212302327..435c1843e 100644 --- a/Parse/src/test/java/com/parse/ParseGeoPointTest.java +++ b/Parse/src/test/java/com/parse/ParseGeoPointTest.java @@ -18,7 +18,7 @@ import static org.junit.Assert.*; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 23) +@Config(constants = BuildConfig.class, sdk = TestHelper.ROBOLECTRIC_SDK_VERSION) public class ParseGeoPointTest { @Test diff --git a/Parse/src/test/java/com/parse/ParseObjectTest.java b/Parse/src/test/java/com/parse/ParseObjectTest.java index 4c1ac11bf..d404b3f1d 100644 --- a/Parse/src/test/java/com/parse/ParseObjectTest.java +++ b/Parse/src/test/java/com/parse/ParseObjectTest.java @@ -497,7 +497,6 @@ public void testGetLongWithWrongValue() throws Exception { @Test public void testParcelable() throws Exception { - // TODO test ParseGeoPoint after merge ParseObject object = ParseObject.createWithoutData("Test", "objectId"); object.isDeleted = true; object.put("long", 200L); @@ -531,6 +530,9 @@ public void testParcelable() throws Exception { // File ParseFile file = new ParseFile(new ParseFile.State.Builder().url("fileUrl").build()); object.put("file", file); + // GeoPoint + ParseGeoPoint point = new ParseGeoPoint(30d, 50d); + object.put("point", point); Parcel parcel = Parcel.obtain(); object.writeToParcel(parcel, 0); @@ -557,6 +559,8 @@ public void testParcelable() throws Exception { assertEquals(newRel.getKnownObjects().size(), rel.getKnownObjects().size()); newRel.hasKnownObject(related); assertEquals(newObject.getParseFile("file").getUrl(), object.getParseFile("file").getUrl()); + assertEquals(newObject.getParseGeoPoint("point").getLatitude(), + object.getParseGeoPoint("point").getLatitude(), 0); } @Test