diff --git a/Parse/src/main/java/com/parse/ParseFile.java b/Parse/src/main/java/com/parse/ParseFile.java index c7399cbec..97c948fcd 100644 --- a/Parse/src/main/java/com/parse/ParseFile.java +++ b/Parse/src/main/java/com/parse/ParseFile.java @@ -8,6 +8,9 @@ */ package com.parse; +import android.os.Parcel; +import android.os.Parcelable; + import org.json.JSONException; import org.json.JSONObject; @@ -40,7 +43,7 @@ * object.save(); * */ -public class ParseFile { +public class ParseFile implements Parcelable { /* package for tests */ static ParseFileController getFileController() { return ParseCorePlugins.getInstance().getFileController(); @@ -66,7 +69,8 @@ public Void call() throws Exception { }; } - /* package */ static class State { + // For test + protected final static class State implements Parcelable { /* package */ static class Builder { @@ -125,6 +129,36 @@ public String mimeType() { public String url() { return url; } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + dest.writeString(this.contentType); + dest.writeString(this.url); + } + + protected State(Parcel in) { + this.name = in.readString(); + this.contentType = in.readString(); + this.url = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public State createFromParcel(Parcel source) { + return new State(source); + } + + @Override + public State[] newArray(int size) { + return new State[size]; + } + }; } private State state; @@ -705,4 +739,35 @@ public void cancel() { return json; } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(this.state, flags); + dest.writeByteArray(this.data); + dest.writeSerializable(this.file); + } + + protected ParseFile(Parcel in) { + this.state = in.readParcelable(ParseFile.State.class.getClassLoader()); + this.data = in.createByteArray(); + this.file = (File) in.readSerializable(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public ParseFile createFromParcel(Parcel source) { + return new ParseFile(source); + } + + @Override + public ParseFile[] newArray(int size) { + return new ParseFile[size]; + } + }; } diff --git a/Parse/src/test/java/com/parse/ParseFileTest.java b/Parse/src/test/java/com/parse/ParseFileTest.java index 6afa4829b..19a3826f5 100644 --- a/Parse/src/test/java/com/parse/ParseFileTest.java +++ b/Parse/src/test/java/com/parse/ParseFileTest.java @@ -8,13 +8,18 @@ */ package com.parse; +import android.os.Parcel; + import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; +import org.robolectric.RobolectricGradleTestRunner; +import org.robolectric.annotation.Config; import java.io.File; import java.io.InputStream; @@ -36,6 +41,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +// For android.os.Parcel +@RunWith(RobolectricGradleTestRunner.class) +@Config(constants = BuildConfig.class, sdk = 21) public class ParseFileTest { @Rule @@ -91,6 +99,42 @@ public void testConstructor() throws Exception { assertEquals("content_type", parseFile.getState().mimeType()); } + @Test + public void testParcelable() throws Exception { + String name = "name"; + byte[] data = "hello".getBytes(); + String contentType = "content_type"; + + ParseFile parseFile = new ParseFile(name, data, contentType); + Parcel parcel = Parcel.obtain(); + parseFile.writeToParcel(parcel, parseFile.describeContents()); + parcel.setDataPosition(0); + + ParseFile createdFromParcel = ParseFile.CREATOR.createFromParcel(parcel); + assertEquals(name, createdFromParcel.getName()); + assertEquals(contentType, createdFromParcel.getState().mimeType()); + assertTrue(createdFromParcel.isDirty()); + + parseFile = new ParseFile(data); + parcel = Parcel.obtain(); + parseFile.writeToParcel(parcel, parseFile.describeContents()); + parcel.setDataPosition(0); + + createdFromParcel = ParseFile.CREATOR.createFromParcel(parcel); + assertEquals("file", createdFromParcel.getName()); // Default + assertEquals(null, createdFromParcel.getState().mimeType()); + assertTrue(createdFromParcel.isDirty()); + + parseFile = new ParseFile(new ParseFile.State.Builder().url("http://example.com").build()); + parcel = Parcel.obtain(); + parseFile.writeToParcel(parcel, parseFile.describeContents()); + parcel.setDataPosition(0); + + createdFromParcel = ParseFile.CREATOR.createFromParcel(parcel); + assertEquals("http://example.com", createdFromParcel.getUrl()); + assertFalse(createdFromParcel.isDirty()); + } + @Test public void testGetters() { ParseFile file = new ParseFile(new ParseFile.State.Builder().url("http://example.com").build());