package org.techbooster.app.abc.tools; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; /** * original is here https://github.com/square/flow/blob/master/flow-sample/src/main/java/com/example/flow/GsonParcer.java */ public class GsonParcer { private static final Gson gson = new Gson(); private GsonParcer() { } public static <T> Parcelable wrap(T instance) { try { String json = encode(instance); return new Wrapper(json); } catch (IOException e) { throw new RuntimeException(e); } } public static <T> T unwrap(Parcelable parcelable) { Wrapper wrapper = (Wrapper) parcelable; try { return decode(wrapper.json); } catch (IOException e) { throw new RuntimeException(e); } } public static <T, U> T unwrap(Parcelable parcelable, TypeToken<U> token) { Wrapper wrapper = (Wrapper) parcelable; try { return decode(wrapper.json, token); } catch (IOException e) { throw new RuntimeException(e); } } private static <T> String encode(T instance) throws IOException { StringWriter stringWriter = new StringWriter(); JsonWriter writer = new JsonWriter(stringWriter); try { Class<?> type = instance.getClass(); writer.beginObject(); writer.name(type.getName()); gson.toJson(instance, type, writer); writer.endObject(); return stringWriter.toString(); } finally { writer.close(); } } private static <T> T decode(String json) throws IOException { JsonReader reader = new JsonReader(new StringReader(json)); try { reader.beginObject(); Class<?> type = Class.forName(reader.nextName()); return gson.fromJson(reader, type); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } finally { reader.close(); } } private static <T, U> T decode(String json, TypeToken<U> token) throws IOException { JsonReader reader = new JsonReader(new StringReader(json)); try { reader.beginObject(); reader.nextName(); return gson.fromJson(reader, token.getType()); } finally { reader.close(); } } private static class Wrapper implements Parcelable { final String json; Wrapper(String json) { this.json = json; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeString(json); } public static final Creator<Wrapper> CREATOR = new Creator<Wrapper>() { @Override public Wrapper createFromParcel(Parcel in) { String json = in.readString(); return new Wrapper(json); } @Override public Wrapper[] newArray(int size) { return new Wrapper[size]; } }; } }