Twidere-App-Android-Twitter.../twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/Activity.java

314 lines
11 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.microblog.library.twitter.model;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.StringDef;
import com.bluelinelabs.logansquare.JsonMapper;
import com.bluelinelabs.logansquare.LoganSquare;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.bluelinelabs.logansquare.annotation.OnJsonParseComplete;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.commons.logansquare.JsonStringConverter;
import org.mariotaku.microblog.library.twitter.util.TwitterDateConverter;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.Date;
/**
* Twitter Activity object
*/
@ParcelablePlease
@JsonObject
public class Activity extends TwitterResponseObject implements TwitterResponse, Comparable<Activity>,
Parcelable {
private static final JsonMapper<User> USER_JSON_MAPPER = LoganSquare.mapperFor(User.class);
private static final JsonMapper<Status> STATUS_JSON_MAPPER = LoganSquare.mapperFor(Status.class);
private static final JsonMapper<UserList> USER_LIST_JSON_MAPPER = LoganSquare.mapperFor(UserList.class);
@Action
@JsonField(name = "action")
String action;
@JsonField(name = "created_at", typeConverter = TwitterDateConverter.class)
Date createdAt;
@JsonField(name = "sources")
User[] sources;
@JsonField(name = "targets", typeConverter = JsonStringConverter.class)
String rawTargets;
@JsonField(name = "target_objects", typeConverter = JsonStringConverter.class)
String rawTargetObjects;
User[] targetUsers;
User[] targetObjectUsers;
Status[] targetObjectStatuses, targetStatuses;
UserList[] targetUserLists, targetObjectUserLists;
@JsonField(name = "max_position")
String maxPosition = null;
@JsonField(name = "min_position")
String minPosition = null;
long maxSortPosition = -1, minSortPosition = -1;
@JsonField(name = "target_objects_size")
int targetObjectsSize;
@JsonField(name = "targets_size")
int targetsSize;
@JsonField(name = "sources_size")
int sourcesSize;
Activity() {
}
public User[] getTargetObjectUsers() {
return targetObjectUsers;
}
@Action
public String getAction() {
return action;
}
public Date getCreatedAt() {
return createdAt;
}
public String getMaxPosition() {
return maxPosition;
}
public String getMinPosition() {
return minPosition;
}
public long getMaxSortPosition() {
return maxSortPosition;
}
public long getMinSortPosition() {
return minSortPosition;
}
public User[] getSources() {
return sources;
}
public int getSourcesSize() {
return sourcesSize;
}
public int getTargetObjectsSize() {
return targetObjectsSize;
}
public Status[] getTargetObjectStatuses() {
return targetObjectStatuses;
}
public UserList[] getTargetObjectUserLists() {
return targetObjectUserLists;
}
public int getTargetsSize() {
return targetsSize;
}
public Status[] getTargetStatuses() {
return targetStatuses;
}
public UserList[] getTargetUserLists() {
return targetUserLists;
}
public User[] getTargetUsers() {
return targetUsers;
}
@Override
public int compareTo(@NonNull final Activity another) {
final Date thisDate = getCreatedAt(), thatDate = another.getCreatedAt();
if (thisDate == null || thatDate == null) return 0;
return thisDate.compareTo(thatDate);
}
@Override
public String toString() {
return "Activity{" +
"action='" + action + '\'' +
", createdAt=" + createdAt +
", sources=" + Arrays.toString(sources) +
", targetUsers=" + Arrays.toString(targetUsers) +
", targetObjectUsers=" + Arrays.toString(targetObjectUsers) +
", targetObjectStatuses=" + Arrays.toString(targetObjectStatuses) +
", targetStatuses=" + Arrays.toString(targetStatuses) +
", targetUserLists=" + Arrays.toString(targetUserLists) +
", targetObjectUserLists=" + Arrays.toString(targetObjectUserLists) +
", maxPosition='" + maxPosition + '\'' +
", minPosition='" + minPosition + '\'' +
", maxSortPosition=" + maxSortPosition +
", minSortPosition=" + minSortPosition +
", targetObjectsSize=" + targetObjectsSize +
", targetsSize=" + targetsSize +
", sourcesSize=" + sourcesSize +
"} " + super.toString();
}
@OnJsonParseComplete
void onParseComplete() throws IOException {
if (action == null) throw new IOException("Malformed Activity object");
switch (action) {
case Activity.Action.FAVORITE:
case Activity.Action.REPLY:
case Activity.Action.RETWEET:
case Activity.Action.QUOTE:
case Activity.Action.FAVORITED_RETWEET:
case Activity.Action.RETWEETED_RETWEET:
case Activity.Action.RETWEETED_MENTION:
case Activity.Action.FAVORITED_MENTION:
case Activity.Action.MEDIA_TAGGED:
case Activity.Action.FAVORITED_MEDIA_TAGGED:
case Activity.Action.RETWEETED_MEDIA_TAGGED: {
targetStatuses = STATUS_JSON_MAPPER.parseList(rawTargets).toArray(new Status[targetsSize]);
break;
}
case Activity.Action.FOLLOW:
case Activity.Action.MENTION:
case Activity.Action.LIST_MEMBER_ADDED: {
targetUsers = USER_JSON_MAPPER.parseList(rawTargets).toArray(new User[targetsSize]);
break;
}
case Activity.Action.LIST_CREATED: {
targetUserLists = USER_LIST_JSON_MAPPER.parseList(rawTargets).toArray(new UserList[targetsSize]);
break;
}
}
switch (action) {
case Activity.Action.FAVORITE:
case Activity.Action.FOLLOW:
case Activity.Action.MENTION:
case Activity.Action.REPLY:
case Activity.Action.RETWEET:
case Activity.Action.LIST_CREATED:
case Activity.Action.QUOTE: {
targetObjectStatuses = STATUS_JSON_MAPPER.parseList(rawTargetObjects).toArray(new Status[targetObjectsSize]);
break;
}
case Activity.Action.LIST_MEMBER_ADDED: {
targetObjectUserLists = USER_LIST_JSON_MAPPER.parseList(rawTargetObjects).toArray(new UserList[targetObjectsSize]);
break;
}
case Activity.Action.FAVORITED_RETWEET:
case Activity.Action.RETWEETED_RETWEET:
case Activity.Action.RETWEETED_MENTION:
case Activity.Action.FAVORITED_MENTION:
case Activity.Action.MEDIA_TAGGED:
case Activity.Action.FAVORITED_MEDIA_TAGGED:
case Activity.Action.RETWEETED_MEDIA_TAGGED: {
targetObjectUsers = USER_JSON_MAPPER.parseList(rawTargetObjects).toArray(new User[targetObjectsSize]);
break;
}
}
try {
maxSortPosition = Long.parseLong(maxPosition);
minSortPosition = Long.parseLong(minPosition);
} catch (NumberFormatException e) {
final long time = createdAt != null ? createdAt.getTime() : -1;
maxSortPosition = time;
minSortPosition = time;
}
}
@StringDef({Action.FAVORITE, Action.FOLLOW, Action.MENTION, Action.REPLY, Action.RETWEET,
Action.LIST_MEMBER_ADDED, Action.LIST_CREATED, Action.FAVORITED_RETWEET,
Action.RETWEETED_RETWEET, Action.QUOTE, Action.RETWEETED_MENTION,
Action.FAVORITED_MENTION, Action.JOINED_TWITTER, Action.MEDIA_TAGGED,
Action.FAVORITED_MEDIA_TAGGED, Action.RETWEETED_MEDIA_TAGGED, Action.INVALID})
@Retention(RetentionPolicy.SOURCE)
public @interface Action {
String FAVORITE = "favorite";
/**
* Sources: followers to targets (User)
* Targets: following user (User)
*/
String FOLLOW = "follow";
/**
* Targets: mentioned users (User)
* Target objects: mention status (Status)
*/
String MENTION = "mention";
/**
* Targets: reply status (Status)
* Target objects: in reply to status (Status)
*/
String REPLY = "reply";
String RETWEET = "retweet";
String LIST_MEMBER_ADDED = "list_member_added";
String LIST_CREATED = "list_created";
String FAVORITED_RETWEET = "favorited_retweet";
String RETWEETED_RETWEET = "retweeted_retweet";
/**
* Targets: Quote result (Status)
* Target objects: Original status (Status)
*/
String QUOTE = "quote";
String RETWEETED_MENTION = "retweeted_mention";
String FAVORITED_MENTION = "favorited_mention";
String JOINED_TWITTER = "joined_twitter";
String MEDIA_TAGGED = "media_tagged";
String FAVORITED_MEDIA_TAGGED = "favorited_media_tagged";
String RETWEETED_MEDIA_TAGGED = "retweeted_media_tagged";
String INVALID = "invalid";
String[] MENTION_ACTIONS = {MENTION, REPLY, QUOTE};
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ActivityParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<Activity> CREATOR = new Creator<Activity>() {
@Override
public Activity createFromParcel(Parcel source) {
Activity target = new Activity();
ActivityParcelablePlease.readFromParcel(target, source);
return target;
}
@Override
public Activity[] newArray(int size) {
return new Activity[size];
}
};
}