Twidere-App-Android-Twitter.../twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMessage.java

231 lines
8.1 KiB
Java

/*
* Twidere - Twitter client for Android
*
* Copyright 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mariotaku.twidere.model;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.StringDef;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.bluelinelabs.logansquare.annotation.OnJsonParseComplete;
import com.bluelinelabs.logansquare.annotation.OnPreJsonSerialize;
import com.hannesdorfmann.parcelableplease.annotation.ParcelableNoThanks;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.commons.objectcursor.LoganSquareCursorFieldConverter;
import org.mariotaku.library.objectcursor.annotation.CursorField;
import org.mariotaku.library.objectcursor.annotation.CursorObject;
import org.mariotaku.twidere.model.message.ConversationInfoUpdatedExtras;
import org.mariotaku.twidere.model.message.MessageExtras;
import org.mariotaku.twidere.model.message.StickerExtras;
import org.mariotaku.twidere.model.message.UserArrayExtras;
import org.mariotaku.twidere.model.util.MessageExtrasConverter;
import org.mariotaku.twidere.model.util.UserKeyCursorFieldConverter;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.Messages;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
/**
* Created by mariotaku on 16/6/6.
*/
@ParcelablePlease
@JsonObject
@CursorObject(tableInfo = true, valuesCreator = true)
public class ParcelableMessage implements Parcelable {
@CursorField(value = Messages._ID, type = TwidereDataStore.TYPE_PRIMARY_KEY, excludeWrite = true)
public long _id;
@JsonField(name = "account_key")
@CursorField(value = Messages.ACCOUNT_KEY, converter = UserKeyCursorFieldConverter.class)
public UserKey account_key;
@JsonField(name = "id")
@CursorField(Messages.MESSAGE_ID)
public String id;
@JsonField(name = "conversation_id")
@CursorField(Messages.CONVERSATION_ID)
public String conversation_id;
@JsonField(name = "type")
@CursorField(Messages.MESSAGE_TYPE)
@MessageType
public String message_type;
@JsonField(name = "timestamp")
@CursorField(Messages.MESSAGE_TIMESTAMP)
public long message_timestamp;
@JsonField(name = "local_timestamp")
@CursorField(Messages.LOCAL_TIMESTAMP)
public long local_timestamp;
@JsonField(name = "sort_id")
@CursorField(value = Messages.SORT_ID)
public long sort_id;
@JsonField(name = "text_unescaped")
@CursorField(Messages.TEXT_UNESCAPED)
public String text_unescaped;
@JsonField(name = "media")
@CursorField(value = Messages.MEDIA, converter = LoganSquareCursorFieldConverter.class)
public ParcelableMedia[] media;
@JsonField(name = "spans")
@CursorField(value = Messages.SPANS, converter = LoganSquareCursorFieldConverter.class)
public SpanItem[] spans;
@CursorField(value = Messages.EXTRAS, converter = MessageExtrasConverter.class)
public MessageExtras extras;
@JsonField(name = "extras")
@ParcelableNoThanks
InternalExtras internalExtras;
@JsonField(name = "sender_key")
@CursorField(value = Messages.SENDER_KEY, converter = UserKeyCursorFieldConverter.class)
public UserKey sender_key;
@JsonField(name = "recipient_key")
@CursorField(value = Messages.RECIPIENT_KEY, converter = UserKeyCursorFieldConverter.class)
public UserKey recipient_key;
@JsonField(name = "is_outgoing")
@CursorField(Messages.IS_OUTGOING)
public boolean is_outgoing;
@JsonField(name = "request_cursor")
@CursorField(value = Messages.REQUEST_CURSOR)
public String request_cursor;
@Override
public String toString() {
return "ParcelableMessage{" +
"_id=" + _id +
", account_key=" + account_key +
", id='" + id + '\'' +
", conversation_id='" + conversation_id + '\'' +
", message_type='" + message_type + '\'' +
", message_timestamp=" + message_timestamp +
", local_timestamp=" + local_timestamp +
", sort_id=" + sort_id +
", text_unescaped='" + text_unescaped + '\'' +
", media=" + Arrays.toString(media) +
", spans=" + Arrays.toString(spans) +
", extras=" + extras +
", internalExtras=" + internalExtras +
", sender_key=" + sender_key +
", recipient_key=" + recipient_key +
", is_outgoing=" + is_outgoing +
", request_cursor='" + request_cursor + '\'' +
'}';
}
@OnPreJsonSerialize
void beforeJsonSerialize() {
internalExtras = InternalExtras.from(extras);
}
@OnJsonParseComplete
void onJsonParseComplete() {
if (internalExtras != null) {
extras = internalExtras.getExtras();
}
}
@StringDef({MessageType.TEXT, MessageType.STICKER, MessageType.CONVERSATION_CREATE,
MessageType.JOIN_CONVERSATION, MessageType.PARTICIPANTS_LEAVE})
@Retention(RetentionPolicy.SOURCE)
public @interface MessageType {
String CONVERSATION_CREATE = "conversation_create";
String JOIN_CONVERSATION = "join_conversation";
String PARTICIPANTS_LEAVE = "participants_leave";
String PARTICIPANTS_JOIN = "participants_join";
String CONVERSATION_NAME_UPDATE = "conversation_name_update";
String CONVERSATION_AVATAR_UPDATE = "conversation_avatar_update";
String TEXT = "text";
String STICKER = "sticker";
}
@JsonObject
static class InternalExtras {
@JsonField(name = "sticker")
StickerExtras sticker;
@JsonField(name = "info_updated")
ConversationInfoUpdatedExtras infoUpdated;
@JsonField(name = "user_array")
UserArrayExtras userArray;
public static InternalExtras from(final MessageExtras extras) {
if (extras == null) return null;
InternalExtras result = new InternalExtras();
if (extras instanceof StickerExtras) {
result.sticker = (StickerExtras) extras;
} else if (extras instanceof ConversationInfoUpdatedExtras) {
result.infoUpdated = (ConversationInfoUpdatedExtras) extras;
} else if (extras instanceof UserArrayExtras) {
result.userArray = (UserArrayExtras) extras;
} else {
return null;
}
return result;
}
public MessageExtras getExtras() {
if (sticker != null) {
return sticker;
} else if (infoUpdated != null) {
return infoUpdated;
} else if (userArray != null) {
return userArray;
}
return null;
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableMessageParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<ParcelableMessage> CREATOR = new Creator<ParcelableMessage>() {
public ParcelableMessage createFromParcel(Parcel source) {
ParcelableMessage target = new ParcelableMessage();
ParcelableMessageParcelablePlease.readFromParcel(target, source);
return target;
}
public ParcelableMessage[] newArray(int size) {
return new ParcelableMessage[size];
}
};
}