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

212 lines
8.6 KiB
Java

/*
* Twidere - 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.mariotaku.twidere.model;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
import org.mariotaku.library.objectcursor.annotation.CursorField;
import org.mariotaku.library.objectcursor.annotation.CursorObject;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.model.util.LoganSquareCursorFieldConverter;
import org.mariotaku.twidere.model.util.LongArrayConverter;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import java.util.Arrays;
@ParcelablePlease(allFields = false)
@JsonObject
@CursorObject(valuesCreator = true)
public class ParcelableActivity implements Comparable<ParcelableActivity>, Parcelable {
@ParcelableThisPlease
@CursorField(value = Activities._ID, excludeWrite = true)
public long _id;
@ParcelableThisPlease
@JsonField(name = "account_id")
@CursorField(value = Activities.ACCOUNT_ID)
public long account_id;
@ParcelableThisPlease
@JsonField(name = "timestamp")
@CursorField(value = Activities.TIMESTAMP)
public long timestamp;
@ParcelableThisPlease
@JsonField(name = "max_position")
@CursorField(value = Activities.MAX_POSITION)
public long max_position;
@ParcelableThisPlease
@JsonField(name = "min_position")
@CursorField(value = Activities.MIN_POSITION)
public long min_position;
@ParcelableThisPlease
@JsonField(name = "action")
@CursorField(value = Activities.ACTION)
public String action;
@ParcelableThisPlease
@JsonField(name = "source_ids")
@CursorField(value = Activities.SOURCE_IDS, converter = LongArrayConverter.class)
public long[] source_ids;
@ParcelableThisPlease
@JsonField(name = "sources")
@CursorField(value = Activities.SOURCES, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUser[] sources;
@ParcelableThisPlease
@JsonField(name = "target_users")
@CursorField(value = Activities.TARGET_USERS, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUser[] target_users;
@ParcelableThisPlease
@JsonField(name = "target_statuses")
@CursorField(value = Activities.TARGET_STATUSES, converter = LoganSquareCursorFieldConverter.class)
public ParcelableStatus[] target_statuses;
@ParcelableThisPlease
@JsonField(name = "target_user_lists")
@CursorField(value = Activities.TARGET_USER_LISTS, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUserList[] target_user_lists;
@ParcelableThisPlease
@JsonField(name = "target_object_user_lists")
@CursorField(value = Activities.TARGET_OBJECT_USER_LISTS, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUserList[] target_object_user_lists;
@ParcelableThisPlease
@JsonField(name = "target_object_statuses")
@CursorField(value = Activities.TARGET_OBJECT_STATUSES, converter = LoganSquareCursorFieldConverter.class)
public ParcelableStatus[] target_object_statuses;
@ParcelableThisPlease
@JsonField(name = "target_object_users")
@CursorField(value = Activities.TARGET_OBJECT_USERS, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUser[] target_object_users;
@ParcelableThisPlease
@JsonField(name = "is_gap")
@CursorField(value = Activities.IS_GAP)
public boolean is_gap;
@ParcelableThisPlease
@JsonField(name = "status_user_following")
@CursorField(value = Activities.STATUS_USER_FOLLOWING, excludeWrite = true)
public boolean status_user_following;
public transient long[] after_filtered_source_ids;
public transient ParcelableUser[] after_filtered_sources;
public ParcelableActivity() {
}
public ParcelableActivity(final Activity activity, final long accountId, boolean isGap) {
this.account_id = accountId;
timestamp = activity.getCreatedAt().getTime();
action = activity.getAction();
max_position = activity.getMaxPosition();
min_position = activity.getMinPosition();
sources = ParcelableUser.fromUsers(activity.getSources(), accountId);
target_users = ParcelableUser.fromUsers(activity.getTargetUsers(), accountId);
target_user_lists = ParcelableUserList.fromUserLists(activity.getTargetUserLists(), accountId);
target_statuses = ParcelableStatus.fromStatuses(activity.getTargetStatuses(), accountId);
target_object_statuses = ParcelableStatus.fromStatuses(activity.getTargetObjectStatuses(), accountId);
target_object_user_lists = ParcelableUserList.fromUserLists(activity.getTargetObjectUserLists(), accountId);
target_object_users = ParcelableUser.fromUsers(activity.getTargetObjectUsers(), accountId);
if (sources != null) {
source_ids = new long[sources.length];
for (int i = 0; i < sources.length; i++) {
source_ids[i] = sources[i].id;
}
}
this.is_gap = isGap;
}
@Nullable
public static ParcelableStatus getActivityStatus(ParcelableActivity activity) {
if (Activity.Action.MENTION.equals(activity.action)) {
return activity.target_object_statuses[0];
} else if (Activity.Action.REPLY.equals(activity.action)) {
return activity.target_statuses[0];
} else if (Activity.Action.QUOTE.equals(activity.action)) {
return activity.target_statuses[0];
}
return null;
}
@Override
public String toString() {
return "ParcelableActivity{" +
"account_id=" + account_id +
", timestamp=" + timestamp +
", max_position=" + max_position +
", min_position=" + min_position +
", action=" + action +
", sources=" + Arrays.toString(sources) +
", target_users=" + Arrays.toString(target_users) +
", target_statuses=" + Arrays.toString(target_statuses) +
", target_user_lists=" + Arrays.toString(target_user_lists) +
", target_object_user_lists=" + Arrays.toString(target_object_user_lists) +
", target_object_statuses=" + Arrays.toString(target_object_statuses) +
", target_object_users=" + Arrays.toString(target_object_users) +
", is_gap=" + is_gap +
'}';
}
@Override
public int compareTo(@NonNull final ParcelableActivity another) {
final long delta = another.timestamp - timestamp;
if (delta < Integer.MIN_VALUE) return Integer.MIN_VALUE;
if (delta > Integer.MAX_VALUE) return Integer.MAX_VALUE;
return (int) delta;
}
@Override
public boolean equals(final Object that) {
if (!(that instanceof ParcelableActivity)) return false;
final ParcelableActivity activity = (ParcelableActivity) that;
return max_position == activity.max_position && min_position == activity.min_position;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableActivityParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<ParcelableActivity> CREATOR = new Creator<ParcelableActivity>() {
public ParcelableActivity createFromParcel(Parcel source) {
ParcelableActivity target = new ParcelableActivity();
ParcelableActivityParcelablePlease.readFromParcel(target, source);
return target;
}
public ParcelableActivity[] newArray(int size) {
return new ParcelableActivity[size];
}
};
}