diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableDirectMessage.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableDirectMessage.java index 8223d794f..a60554ec8 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableDirectMessage.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableDirectMessage.java @@ -26,7 +26,6 @@ import android.os.Parcelable; import android.support.annotation.NonNull; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages; -import org.mariotaku.twidere.util.SimpleValueSerializer; import org.mariotaku.twidere.util.TwitterContentUtils; import java.util.Comparator; @@ -93,7 +92,7 @@ public class ParcelableDirectMessage implements Parcelable, Comparable SIMPLE_CREATOR = new SimpleValueSerializer.Creator() { - @Override - public ParcelableMedia create(final SimpleValueSerializer.Reader reader) throws SerializationException { - return new ParcelableMedia(reader); - } - - @Override - public ParcelableMedia[] newArray(final int size) { - return new ParcelableMedia[size]; - } - }; @NonNull public String media_url; @@ -107,6 +170,7 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS } + public ParcelableMedia(final JSONParcel in) { media_url = in.readString("media_url"); page_url = in.readString("page_url"); @@ -188,50 +252,6 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS this.height = 0; } - public ParcelableMedia(Reader reader) throws SerializationException { - while (reader.hasKeyValue()) { - switch (reader.nextKey()) { - case "media_url": { - media_url = reader.nextString(); - break; - } - case "page_url": { - page_url = reader.nextString(); - break; - } - case "preview_url": { - preview_url = reader.nextString(); - break; - } - case "start": { - start = reader.nextInt(); - break; - } - case "end": { - end = reader.nextInt(); - break; - } - case "type": { - //noinspection ResourceType - type = reader.nextInt(); - break; - } - case "width": { - width = reader.nextInt(); - break; - } - case "height": { - height = reader.nextInt(); - break; - } - default: { - reader.skipValue(); - break; - } - } - } - } - @Override public int describeContents() { return 0; @@ -276,15 +296,21 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS } @Override - public void write(Writer writer) { - writer.write("media_url", media_url); - writer.write("page_url", page_url); - writer.write("preview_url", preview_url); - writer.write("start", String.valueOf(start)); - writer.write("end", String.valueOf(end)); - writer.write("type", String.valueOf(type)); - writer.write("width", String.valueOf(width)); - writer.write("height", String.valueOf(height)); + public void write(JsonWriter writer) throws IOException { + writer.beginObject(); + writer.name("media_url").value(media_url); + writer.name("page_url").value(page_url); + writer.name("preview_url").value(preview_url); + writer.name("start").value(start); + writer.name("end").value(end); + writer.name("type").value(type); + writer.name("width").value(width); + writer.name("height").value(height); + if (video_info != null) { + writer.name("video_info"); + video_info.write(writer); + } + writer.endObject(); } @Override @@ -405,15 +431,11 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS } - public static class VideoInfo implements Parcelable { + public static class VideoInfo implements Parcelable, JsonReadable, JsonWritable { public Variant[] variants; - public long[] aspect_ratio; public long duration; - public VideoInfo(Reader source) { - - } public VideoInfo() { @@ -421,7 +443,6 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS public VideoInfo(MediaEntity.VideoInfo videoInfo) { variants = Variant.fromMediaEntityVariants(videoInfo.getVariants()); - aspect_ratio = videoInfo.getAspectRatio(); duration = videoInfo.getDuration(); } @@ -430,22 +451,76 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS return new VideoInfo(videoInfo); } + @Override + public void read(JsonReader reader) throws IOException { + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.nextName()) { + case "variants": { + reader.beginArray(); + variants = JsonSerializationUtils.array(reader, Variant.class); + reader.endArray(); + break; + } + case "duration": { + duration = reader.nextLong(); + break; + } + default: { + reader.skipValue(); + break; + } + } + } + reader.endObject(); + } + @Override public String toString() { return "VideoInfo{" + "variants=" + Arrays.toString(variants) + - ", aspect_ratio=" + Arrays.toString(aspect_ratio) + ", duration=" + duration + '}'; } - public static class Variant implements Parcelable { + @Override + public void write(JsonWriter writer) { + + } + + public static class Variant implements Parcelable, JsonReadable { public Variant(MediaEntity.VideoInfo.Variant entityVariant) { content_type = entityVariant.getContentType(); url = entityVariant.getUrl(); bitrate = entityVariant.getBitrate(); } + @Override + public void read(JsonReader reader) throws IOException { + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.nextName()) { + case "content_type": { + content_type = reader.nextString(); + break; + } + case "url": { + url = reader.nextString(); + break; + } + case "bitrate": { + bitrate = reader.nextLong(); + break; + } + default: { + reader.skipValue(); + break; + } + } + } + reader.endObject(); + } + @Override public String toString() { return "Variant{" + @@ -455,9 +530,9 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS '}'; } - public final String content_type; - public final String url; - public final long bitrate; + public String content_type; + public String url; + public long bitrate; public Variant(JSONParcel source) { content_type = source.readString("content_type"); @@ -516,14 +591,12 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS @Override public void writeToParcel(Parcel dest, int flags) { dest.writeTypedArray(variants, flags); - dest.writeLongArray(aspect_ratio); dest.writeLong(duration); } private VideoInfo(Parcel in) { variants = in.createTypedArray(Variant.CREATOR); - aspect_ratio = in.createLongArray(); duration = in.readLong(); } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java index 93361a94d..b25bba313 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java @@ -33,7 +33,6 @@ import org.mariotaku.jsonserializer.JSONParcelable; import org.mariotaku.jsonserializer.JSONSerializer; import org.mariotaku.twidere.provider.TwidereDataStore.Statuses; import org.mariotaku.twidere.util.HtmlEscapeHelper; -import org.mariotaku.twidere.util.SimpleValueSerializer; import org.mariotaku.twidere.util.TwitterContentUtils; import java.util.Arrays; @@ -117,7 +116,7 @@ public class ParcelableStatus implements TwidereParcelable, Comparable>> 32); + return result; + } + + @Override + public void read(JsonReader reader) throws IOException { + reader.beginObject(); + while (reader.hasNext()) { + switch (reader.nextName()) { case "id": { id = reader.nextLong(); break; @@ -115,29 +139,7 @@ public class ParcelableUserMention implements Parcelable, JSONParcelable, Simple } } } - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (!(obj instanceof ParcelableUserMention)) return false; - final ParcelableUserMention other = (ParcelableUserMention) obj; - if (id != other.id) return false; - return true; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (id ^ id >>> 32); - return result; + reader.endObject(); } @Override @@ -146,10 +148,10 @@ public class ParcelableUserMention implements Parcelable, JSONParcelable, Simple } @Override - public void write(Writer writer) { - writer.write("id", id); - writer.write("name", name); - writer.write("screen_name", screen_name); + public void write(JsonWriter writer) throws IOException { + writer.name("id").value(id); + writer.name("name").value(name); + writer.name("screen_name").value(screen_name); } @Override diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/iface/JsonReadable.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/iface/JsonReadable.java new file mode 100644 index 000000000..eab8e96b0 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/iface/JsonReadable.java @@ -0,0 +1,33 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.model.iface; + +import android.util.JsonReader; + +import java.io.IOException; + +/** + * Created by mariotaku on 15/4/23. + */ +public interface JsonReadable { + + void read(JsonReader reader) throws IOException; + +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/iface/JsonWritable.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/iface/JsonWritable.java new file mode 100644 index 000000000..f8cc4956a --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/iface/JsonWritable.java @@ -0,0 +1,35 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.model.iface; + +import android.util.JsonReader; +import android.util.JsonWriter; + +import java.io.IOException; + +/** + * Created by mariotaku on 15/4/23. + */ +public interface JsonWritable { + + void write(JsonWriter writer) throws IOException; + + +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java index 42a48ce54..6552c7fec 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java @@ -336,12 +336,12 @@ public interface TwidereDataStore { String SENDER_PROFILE_IMAGE_URL = "sender_profile_image_url"; String RECIPIENT_PROFILE_IMAGE_URL = "recipient_profile_image_url"; - String MEDIA_LIST = "media_list"; + String MEDIA_JSON = "media_json"; String[] COLUMNS = {_ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP, SENDER_ID, RECIPIENT_ID, CONVERSATION_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, SENDER_NAME, RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL, - RECIPIENT_PROFILE_IMAGE_URL, MEDIA_LIST}; + RECIPIENT_PROFILE_IMAGE_URL, MEDIA_JSON}; String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; @@ -783,9 +783,9 @@ public interface TwidereDataStore { String MY_RETWEET_ID = "my_retweet_id"; - String MEDIA_LIST = "media_list"; + String MEDIA_JSON = "media_json"; - String MENTIONS_LIST = "mentions_list"; + String MENTIONS_JSON = "mentions_json"; String CARD = "card"; @@ -821,7 +821,8 @@ public interface TwidereDataStore { QUOTE_SOURCE, QUOTED_BY_USER_ID, QUOTED_BY_USER_NAME, QUOTED_BY_USER_SCREEN_NAME, QUOTED_BY_USER_PROFILE_IMAGE, QUOTED_BY_USER_IS_VERIFIED, QUOTED_BY_USER_IS_PROTECTED, MY_RETWEET_ID, IS_RETWEET, IS_QUOTE, IS_FAVORITE, IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, - IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIA_LIST, MENTIONS_LIST, CARD_NAME, CARD, PLACE_FULL_NAME}; + IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIA_JSON, MENTIONS_JSON, QUOTE_MEDIA_JSON, CARD_NAME, + CARD, PLACE_FULL_NAME}; String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, @@ -830,7 +831,7 @@ public interface TwidereDataStore { TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_INT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, - TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; + TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java index 14c8b8c50..cb9a15152 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java @@ -209,7 +209,7 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url); final ParcelableMedia[] mediaArray = ParcelableMedia.fromEntities(message); if (mediaArray != null) { - values.put(DirectMessages.MEDIA_LIST, SimpleValueSerializer.toSerializedString(mediaArray)); + values.put(DirectMessages.MEDIA_JSON, JSONSerializer.toJSONArrayString(mediaArray)); } return values; } @@ -232,7 +232,7 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, message.sender_profile_image_url); values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url); if (message.media != null) { - values.put(DirectMessages.MEDIA_LIST, SimpleValueSerializer.toSerializedString(message.media)); + values.put(DirectMessages.MEDIA_JSON, JSONSerializer.toJSONArrayString(message.media)); } return values; } @@ -339,7 +339,10 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(Statuses.QUOTE_TEXT_UNESCAPED, toPlainText(textHtml)); values.put(Statuses.QUOTE_TIMESTAMP, orig.getCreatedAt().getTime()); values.put(Statuses.QUOTE_SOURCE, orig.getSource()); - + final ParcelableMedia[] quoteMedia = ParcelableMedia.fromStatus(orig); + if (quoteMedia != null) { + values.put(Statuses.QUOTE_MEDIA_JSON, JSONSerializer.toJSONArrayString(quoteMedia)); + } values.put(Statuses.QUOTED_BY_USER_ID, quotedById); values.put(Statuses.QUOTED_BY_USER_NAME, quoteUser.getName()); values.put(Statuses.QUOTED_BY_USER_SCREEN_NAME, quoteUser.getScreenName()); @@ -395,11 +398,11 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(Statuses.IS_FAVORITE, status.isFavorited()); final ParcelableMedia[] media = ParcelableMedia.fromStatus(status); if (media != null) { - values.put(Statuses.MEDIA_LIST, SimpleValueSerializer.toSerializedString(media)); + values.put(Statuses.MEDIA_JSON, JSONSerializer.toJSONArrayString(media)); } final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status); if (mentions != null) { - values.put(Statuses.MENTIONS_LIST, SimpleValueSerializer.toSerializedString(mentions)); + values.put(Statuses.MENTIONS_JSON, JSONSerializer.toJSONArrayString(mentions)); } final ParcelableCardEntity card = ParcelableCardEntity.fromCardEntity(status.getCard(), accountId); if (card != null) { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/JsonSerializationUtils.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/JsonSerializationUtils.java new file mode 100644 index 000000000..1b10d9335 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/JsonSerializationUtils.java @@ -0,0 +1,66 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.util; + +import android.util.JsonReader; + +import org.mariotaku.twidere.model.iface.JsonReadable; + +import java.io.IOException; +import java.lang.reflect.Array; +import java.util.ArrayList; + +/** + * Created by mariotaku on 15/4/23. + */ +public class JsonSerializationUtils { + + public static T[] array(JsonReader reader, Class cls) { + try { + final ArrayList list = new ArrayList<>(); + while (reader.hasNext()) { + final T object = cls.newInstance(); + object.read(reader); + list.add(object); + } + @SuppressWarnings("unchecked") + final T[] array = (T[]) Array.newInstance(cls, list.size()); + return list.toArray(array); + } catch (IOException | IllegalStateException e) { + return null; + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static T object(JsonReader reader, Class cls) { + try { + final T object = cls.newInstance(); + object.read(reader); + return object; + } catch (IOException | IllegalStateException e) { + return null; + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/SimpleValueSerializer.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/SimpleValueSerializer.java deleted file mode 100644 index a81d5802c..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/SimpleValueSerializer.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.util; - -import android.util.Log; - -import org.mariotaku.twidere.TwidereConstants; - -import java.io.IOException; - -/** - * Created by mariotaku on 15/2/13. - */ -public class SimpleValueSerializer { - - private static final char ESCAPE = '\\'; - private static final char DIVIDER_ARRAY_ELEMENT = ';'; - private static final char DIVIDER_OBJECT_FIELD = ','; - private static final char DIVIDER_KEY_VALUE = '='; - - public static Reader newReader(String str) { - return new Reader(str); - } - - - private static T[] append(T[] old, int position, T item, Creator creator) { - T[] appended; - if (position < old.length) { - appended = old; - } else { - appended = creator.newArray(old.length * 2); - System.arraycopy(old, 0, appended, 0, old.length); - } - appended[position] = item; - return appended; - } - - - public static String escape(String str) { - final StringBuilder sb = new StringBuilder(); - for (int i = 0, j = str.length(); i < j; i++) { - final char ch = str.charAt(i); - if (DIVIDER_ARRAY_ELEMENT == ch || ESCAPE == ch) { - sb.append(ESCAPE); - } - sb.append(ch); - } - return sb.toString(); - } - - @SafeVarargs - public static String toSerializedString(T... array) { - final Writer writer = newWriter(); - for (T item : array) { - writer.beginArrayElement(); - item.write(writer); - } - return writer.toString(); - } - - - public static T[] fromSerializedString(final String json, Creator creator) { - long start = System.nanoTime(); - T[] temp = creator.newArray(4); - try { - if (json == null) return null; - final SimpleValueSerializer.Reader reader = SimpleValueSerializer.newReader(json); - int count = 0; - while (reader.hasArrayElement()) { - final T item = creator.create(reader); - reader.endArrayElement(); - temp = append(temp, count++, item, creator); - } - final T[] result = creator.newArray(count); - System.arraycopy(temp, 0, result, 0, count); - return result; - } catch (final IOException e) { - e.printStackTrace(); - return null; - } - } - - public interface Creator { - T create(Reader reader) throws SerializationException; - - T[] newArray(int size); - } - - public static class SerializationException extends IOException { - - } - - public static Writer newWriter() { - return new Writer(); - } - - public static interface SimpleValueSerializable { - - void write(Writer writer); - } - - public static class Writer { - - private int keyValuesCount; - private final StringBuilder stringBuilder; - - public Writer() { - stringBuilder = new StringBuilder(); - keyValuesCount = 0; - } - - public void beginArrayElement() { - keyValuesCount = 0; - if (stringBuilder.length() > 0) { - stringBuilder.append(DIVIDER_ARRAY_ELEMENT); - } - } - - public void write(String key, String value) { - if (keyValuesCount++ > 0) { - stringBuilder.append(DIVIDER_OBJECT_FIELD); - } - stringBuilder.append(escape(key)); - stringBuilder.append(DIVIDER_KEY_VALUE); - stringBuilder.append(escape(value)); - } - - public String toString() { - return stringBuilder.toString(); - } - - public void write(String key, long value) { - write(key, String.valueOf(value)); - } - - public void write(String key, boolean value) { - write(key, String.valueOf(value)); - } - } - - public static class Reader { - private final String s; - private final int len; - private char lastToken; - private int cur; - - public Reader(String s) { - this.s = s; - this.len = s.length(); - cur = 0; - lastToken = '\0'; - } - - public boolean hasKeyValue() { - return (cur == 0 || (lastToken == '\0' || lastToken == DIVIDER_OBJECT_FIELD)) && cur < len; - } - - - public boolean hasArrayElement() { - return (cur == 0 || (lastToken == '\0' || lastToken == DIVIDER_ARRAY_ELEMENT)) && cur < len; - } - - public String nextKey() throws SerializationException { - if (lastToken != '\0' && lastToken != DIVIDER_OBJECT_FIELD) { - throw new SerializationException(); - } - return peek(); - } - - private String peek() { - StringBuilder sb = new StringBuilder(); - boolean isEscaped = false; - while (cur < len) { - char ch = s.charAt(cur++); - if (isEscaped) { - sb.append(ch); - isEscaped = false; - } else if (ch == ESCAPE) { - isEscaped = true; - } else if (ch == DIVIDER_KEY_VALUE || ch == DIVIDER_OBJECT_FIELD || ch == DIVIDER_ARRAY_ELEMENT) { - lastToken = ch; - break; - } else { - sb.append(ch); - } - } - return sb.toString(); - } - - public void skipValue() throws SerializationException { - nextString(); - } - - public String nextString() throws SerializationException { - if (lastToken != DIVIDER_KEY_VALUE) { - throw new SerializationException(); - } - return peek(); - } - - public int nextInt() throws SerializationException { - return Integer.parseInt(nextString()); - } - - public long nextLong() throws SerializationException { - return Long.parseLong(nextString()); - } - - public void endArrayElement() { - lastToken = '\0'; - } - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/Constants.java b/twidere/src/main/java/org/mariotaku/twidere/Constants.java index 94a53b532..dd8989af5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/Constants.java +++ b/twidere/src/main/java/org/mariotaku/twidere/Constants.java @@ -33,7 +33,7 @@ import static org.mariotaku.twidere.annotation.Preference.Type.STRING; public interface Constants extends TwidereConstants { String DATABASES_NAME = "twidere.sqlite"; - int DATABASES_VERSION = 97; + int DATABASES_VERSION = 98; int MENU_GROUP_STATUS_EXTENSION = 10; int MENU_GROUP_COMPOSE_EXTENSION = 11; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java index f1126fc54..c2e402614 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java @@ -34,13 +34,12 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.MessageConversationAdapter; import org.mariotaku.twidere.model.ParcelableDirectMessage.CursorIndices; import org.mariotaku.twidere.model.ParcelableMedia; -import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.MediaLoaderWrapper; -import org.mariotaku.twidere.util.SimpleValueSerializer; +import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener; import org.mariotaku.twidere.view.CardMediaContainer; +import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener; public class MessageConversationViewHolder extends ViewHolder implements OnMediaClickListener { @@ -79,7 +78,7 @@ public class MessageConversationViewHolder extends ViewHolder implements OnMedia final long accountId = cursor.getLong(indices.account_id); final long timestamp = cursor.getLong(indices.message_timestamp); - final ParcelableMedia[] media = SimpleValueSerializer.fromSerializedString(cursor.getString(indices.media), ParcelableMedia.SIMPLE_CREATOR); + final ParcelableMedia[] media = ParcelableMedia.fromSerializedJson(cursor.getString(indices.media)); text.setText(Html.fromHtml(cursor.getString(indices.text))); linkify.applyAllLinks(text, accountId, false); text.setMovementMethod(null); diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java index 3f5c3c2cd..0ad1d1cce 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java @@ -28,7 +28,6 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MediaLoadingHandler; import org.mariotaku.twidere.util.SharedPreferencesWrapper; -import org.mariotaku.twidere.util.SimpleValueSerializer; import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.util.TwitterCardUtils; import org.mariotaku.twidere.util.UserColorNameUtils; @@ -345,10 +344,8 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi final boolean sensitive = cursor.getShort(indices.is_possibly_sensitive) == 1; - final ParcelableMedia[] media = SimpleValueSerializer.fromSerializedString( - cursor.getString(indices.media), ParcelableMedia.SIMPLE_CREATOR); - final ParcelableLocation location = ParcelableLocation.fromString( - cursor.getString(indices.location)); + final ParcelableMedia[] media = ParcelableMedia.fromSerializedJson(cursor.getString(indices.media)); + final ParcelableLocation location = ParcelableLocation.fromString(cursor.getString(indices.location)); if (retweet_id > 0) { final long retweeted_by_id = cursor.getLong(indices.retweeted_by_user_id);