/* * Firetweet - Twitter client for Android * * Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com> * * 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 <http://www.gnu.org/licenses/>. */ package org.getlantern.firetweet.model; import android.content.ContentValues; import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import org.getlantern.firetweet.provider.FiretweetDataStore.DirectMessages; import org.getlantern.firetweet.util.SimpleValueSerializer; import org.getlantern.firetweet.util.TwitterContentUtils; import java.util.Comparator; import java.util.Date; import twitter4j.DirectMessage; import twitter4j.User; import static org.getlantern.firetweet.util.HtmlEscapeHelper.toPlainText; import static org.getlantern.firetweet.util.content.ContentValuesUtils.getAsBoolean; import static org.getlantern.firetweet.util.content.ContentValuesUtils.getAsLong; public class ParcelableDirectMessage implements Parcelable, Comparable<ParcelableDirectMessage> { public static final Parcelable.Creator<ParcelableDirectMessage> CREATOR = new Parcelable.Creator<ParcelableDirectMessage>() { @Override public ParcelableDirectMessage createFromParcel(final Parcel in) { return new ParcelableDirectMessage(in); } @Override public ParcelableDirectMessage[] newArray(final int size) { return new ParcelableDirectMessage[size]; } }; public static final Comparator<ParcelableDirectMessage> MESSAGE_ID_COMPARATOR = new Comparator<ParcelableDirectMessage>() { @Override public int compare(final ParcelableDirectMessage object1, final ParcelableDirectMessage object2) { final long diff = object2.id - object1.id; if (diff > Integer.MAX_VALUE) return Integer.MAX_VALUE; if (diff < Integer.MIN_VALUE) return Integer.MIN_VALUE; return (int) diff; } }; public final long account_id, id, timestamp; public final long sender_id, recipient_id; public final boolean is_outgoing; public final String text_html, text_plain, text_unescaped; public final String sender_name, recipient_name, sender_screen_name, recipient_screen_name; public final String sender_profile_image_url, recipient_profile_image_url; public final ParcelableMedia[] media; public ParcelableDirectMessage(final ContentValues values) { text_plain = values.getAsString(DirectMessages.TEXT_PLAIN); text_html = values.getAsString(DirectMessages.TEXT_HTML); text_unescaped = toPlainText(text_html); sender_screen_name = values.getAsString(DirectMessages.SENDER_SCREEN_NAME); sender_profile_image_url = values.getAsString(DirectMessages.SENDER_PROFILE_IMAGE_URL); sender_name = values.getAsString(DirectMessages.SENDER_NAME); sender_id = getAsLong(values, DirectMessages.SENDER_ID, -1); recipient_screen_name = values.getAsString(DirectMessages.RECIPIENT_SCREEN_NAME); recipient_profile_image_url = values.getAsString(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL); recipient_name = values.getAsString(DirectMessages.RECIPIENT_NAME); recipient_id = getAsLong(values, DirectMessages.RECIPIENT_ID, -1); timestamp = getAsLong(values, DirectMessages.MESSAGE_TIMESTAMP, -1); id = getAsLong(values, DirectMessages.MESSAGE_ID, -1); is_outgoing = getAsBoolean(values, DirectMessages.IS_OUTGOING, false); account_id = getAsLong(values, DirectMessages.ACCOUNT_ID, -1); media = SimpleValueSerializer.fromSerializedString(values.getAsString(DirectMessages.MEDIA_LIST), ParcelableMedia.SIMPLE_CREATOR); } public ParcelableDirectMessage(final Cursor c, final CursorIndices idx) { account_id = idx.account_id != -1 ? c.getLong(idx.account_id) : -1; is_outgoing = idx.is_outgoing != -1 ? c.getShort(idx.is_outgoing) == 1 : null; id = idx.message_id != -1 ? c.getLong(idx.message_id) : -1; timestamp = idx.message_timestamp != -1 ? c.getLong(idx.message_timestamp) : -1; sender_id = idx.sender_id != -1 ? c.getLong(idx.sender_id) : -1; recipient_id = idx.recipient_id != -1 ? c.getLong(idx.recipient_id) : -1; text_html = idx.text != -1 ? c.getString(idx.text) : null; text_plain = idx.text_plain != -1 ? c.getString(idx.text_plain) : null; text_unescaped = toPlainText(text_html); sender_name = idx.sender_name != -1 ? c.getString(idx.sender_name) : null; recipient_name = idx.recipient_name != -1 ? c.getString(idx.recipient_name) : null; sender_screen_name = idx.sender_screen_name != -1 ? c.getString(idx.sender_screen_name) : null; recipient_screen_name = idx.recipient_screen_name != -1 ? c.getString(idx.recipient_screen_name) : null; sender_profile_image_url = idx.sender_profile_image_url != -1 ? c.getString(idx.sender_profile_image_url) : null; recipient_profile_image_url = idx.recipient_profile_image_url != -1 ? c .getString(idx.recipient_profile_image_url) : null; media = SimpleValueSerializer.fromSerializedString(idx.media != -1 ? c.getString(idx.media) : null, ParcelableMedia.SIMPLE_CREATOR); } public ParcelableDirectMessage(final DirectMessage message, final long account_id, final boolean is_outgoing) { this.account_id = account_id; this.is_outgoing = is_outgoing; final User sender = message.getSender(), recipient = message.getRecipient(); final String sender_profile_image_url = sender != null ? sender.getProfileImageUrlHttps() : null; final String recipient_profile_image_url = recipient != null ? recipient.getProfileImageUrlHttps() : null; id = message.getId(); timestamp = getTime(message.getCreatedAt()); sender_id = sender != null ? sender.getId() : -1; recipient_id = recipient != null ? recipient.getId() : -1; text_html = TwitterContentUtils.formatDirectMessageText(message); text_plain = message.getText(); sender_name = sender != null ? sender.getName() : null; recipient_name = recipient != null ? recipient.getName() : null; sender_screen_name = sender != null ? sender.getScreenName() : null; recipient_screen_name = recipient != null ? recipient.getScreenName() : null; this.sender_profile_image_url = sender_profile_image_url; this.recipient_profile_image_url = recipient_profile_image_url; text_unescaped = toPlainText(text_html); media = ParcelableMedia.fromEntities(message); } public ParcelableDirectMessage(final Parcel in) { account_id = in.readLong(); id = in.readLong(); timestamp = in.readLong(); sender_id = in.readLong(); recipient_id = in.readLong(); is_outgoing = in.readInt() == 1; text_html = in.readString(); text_plain = in.readString(); sender_name = in.readString(); recipient_name = in.readString(); sender_screen_name = in.readString(); recipient_screen_name = in.readString(); sender_profile_image_url = in.readString(); recipient_profile_image_url = in.readString(); text_unescaped = in.readString(); media = in.createTypedArray(ParcelableMedia.CREATOR); } @Override public int compareTo(@NonNull final ParcelableDirectMessage another) { final long diff = another.id - id; if (diff > Integer.MAX_VALUE) return Integer.MAX_VALUE; if (diff < Integer.MIN_VALUE) return Integer.MIN_VALUE; return (int) diff; } @Override public int describeContents() { return hashCode(); } @Override public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof ParcelableDirectMessage)) return false; final ParcelableDirectMessage other = (ParcelableDirectMessage) obj; if (account_id != other.account_id) return false; if (id != other.id) return false; return true; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (account_id ^ account_id >>> 32); result = prime * result + (int) (id ^ id >>> 32); return result; } @Override public String toString() { return "ParcelableDirectMessage{account_id=" + account_id + ", id=" + id + ", timestamp=" + timestamp + ", sender_id=" + sender_id + ", recipient_id=" + recipient_id + ", is_outgoing=" + is_outgoing + ", text_html=" + text_html + ", text_plain=" + text_plain + ", text_unescaped=" + text_unescaped + ", sender_name=" + sender_name + ", recipient_name=" + recipient_name + ", sender_screen_name=" + sender_screen_name + ", recipient_screen_name=" + recipient_screen_name + ", sender_profile_image_url=" + sender_profile_image_url + ", recipient_profile_image_url=" + recipient_profile_image_url + "}"; } @Override public void writeToParcel(final Parcel out, final int flags) { out.writeLong(account_id); out.writeLong(id); out.writeLong(timestamp); out.writeLong(sender_id); out.writeLong(recipient_id); out.writeInt(is_outgoing ? 1 : 0); out.writeString(text_html); out.writeString(text_plain); out.writeString(sender_name); out.writeString(recipient_name); out.writeString(sender_screen_name); out.writeString(recipient_screen_name); out.writeString(sender_profile_image_url); out.writeString(recipient_profile_image_url); out.writeString(text_unescaped); out.writeTypedArray(media, flags); } private static long getTime(final Date date) { return date != null ? date.getTime() : 0; } public static class CursorIndices { public final int account_id, message_id, message_timestamp, sender_name, sender_screen_name, text, text_plain, recipient_name, recipient_screen_name, sender_profile_image_url, is_outgoing, recipient_profile_image_url, sender_id, recipient_id, media; public CursorIndices(final Cursor cursor) { account_id = cursor.getColumnIndex(DirectMessages.ACCOUNT_ID); message_id = cursor.getColumnIndex(DirectMessages.MESSAGE_ID); message_timestamp = cursor.getColumnIndex(DirectMessages.MESSAGE_TIMESTAMP); sender_id = cursor.getColumnIndex(DirectMessages.SENDER_ID); recipient_id = cursor.getColumnIndex(DirectMessages.RECIPIENT_ID); is_outgoing = cursor.getColumnIndex(DirectMessages.IS_OUTGOING); text = cursor.getColumnIndex(DirectMessages.TEXT_HTML); text_plain = cursor.getColumnIndex(DirectMessages.TEXT_PLAIN); sender_name = cursor.getColumnIndex(DirectMessages.SENDER_NAME); recipient_name = cursor.getColumnIndex(DirectMessages.RECIPIENT_NAME); sender_screen_name = cursor.getColumnIndex(DirectMessages.SENDER_SCREEN_NAME); recipient_screen_name = cursor.getColumnIndex(DirectMessages.RECIPIENT_SCREEN_NAME); sender_profile_image_url = cursor.getColumnIndex(DirectMessages.SENDER_PROFILE_IMAGE_URL); recipient_profile_image_url = cursor.getColumnIndex(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL); media = cursor.getColumnIndex(DirectMessages.MEDIA_LIST); } } }