/* * 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.support.annotation.NonNull; import org.getlantern.jsonserializer.JSONParcel; import org.getlantern.jsonserializer.JSONParcelable; import java.util.Arrays; import twitter4j.Activity; import twitter4j.Status; import twitter4j.User; import twitter4j.UserList; public class ParcelableActivity implements Comparable<ParcelableActivity>, JSONParcelable { public static final JSONParcelable.Creator<ParcelableActivity> JSON_CREATOR = new JSONParcelable.Creator<ParcelableActivity>() { @Override public ParcelableActivity createFromParcel(final JSONParcel in) { return new ParcelableActivity(in); } @Override public ParcelableActivity[] newArray(final int size) { return new ParcelableActivity[size]; } }; public final static int ACTION_FAVORITE = Activity.Action.ACTION_FAVORITE; public final static int ACTION_FOLLOW = Activity.Action.ACTION_FOLLOW; public final static int ACTION_MENTION = Activity.Action.ACTION_MENTION; public final static int ACTION_REPLY = Activity.Action.ACTION_REPLY; public final static int ACTION_RETWEET = Activity.Action.ACTION_RETWEET; public final static int ACTION_LIST_MEMBER_ADDED = Activity.Action.ACTION_LIST_MEMBER_ADDED; public final static int ACTION_LIST_CREATED = Activity.Action.ACTION_LIST_CREATED; public final static int ACTION_FAVORITED_RETWEET = Activity.Action.ACTION_FAVORITED_RETWEET; public final static int ACTION_RETWEETED_RETWEET = Activity.Action.ACTION_RETWEETED_RETWEET; public final long account_id, timestamp, max_position, min_position; public final int action; public final ParcelableUser[] sources; public final ParcelableUser[] target_users; public final ParcelableStatus[] target_statuses; public final ParcelableUserList[] target_user_lists; public final ParcelableUserList[] target_object_user_lists; public final ParcelableStatus[] target_object_statuses; public final boolean is_gap; public ParcelableActivity(final Activity activity, final long account_id, boolean is_gap) { this.account_id = account_id; timestamp = activity.getCreatedAt().getTime(); action = activity.getAction().getActionId(); max_position = activity.getMaxPosition(); min_position = activity.getMinPosition(); final int sources_size = activity.getSourcesSize(); sources = new ParcelableUser[sources_size]; for (int i = 0; i < sources_size; i++) { sources[i] = new ParcelableUser(activity.getSources()[i], account_id); } final int targets_size = activity.getTargetsSize(); final User[] targetUsers = activity.getTargetUsers(); if (targetUsers != null) { target_users = new ParcelableUser[targets_size]; for (int i = 0; i < targets_size; i++) { target_users[i] = new ParcelableUser(targetUsers[i], account_id); } } else { target_users = null; } final UserList[] targetUserLists = activity.getTargetUserLists(); if (targetUserLists != null) { target_user_lists = new ParcelableUserList[targets_size]; for (int i = 0; i < targets_size; i++) { target_user_lists[i] = new ParcelableUserList(targetUserLists[i], account_id); } } else { target_user_lists = null; } final Status[] targetStatuses = activity.getTargetStatuses(); if (targetStatuses != null) { target_statuses = new ParcelableStatus[targets_size]; for (int i = 0; i < targets_size; i++) { target_statuses[i] = new ParcelableStatus(targetStatuses[i], account_id, false); } } else { target_statuses = null; } final int target_objects_size = activity.getTargetObjectsSize(); final Status[] targetObjectStatuses = activity.getTargetObjectStatuses(); if (targetObjectStatuses != null) { target_object_statuses = new ParcelableStatus[target_objects_size]; for (int i = 0; i < target_objects_size; i++) { target_object_statuses[i] = new ParcelableStatus(targetObjectStatuses[i], account_id, false); } } else { target_object_statuses = null; } final UserList[] targetObjectUserLists = activity.getTargetObjectUserLists(); if (targetObjectUserLists != null) { target_object_user_lists = new ParcelableUserList[target_objects_size]; for (int i = 0; i < target_objects_size; i++) { target_object_user_lists[i] = new ParcelableUserList(targetObjectUserLists[i], account_id); } } else { target_object_user_lists = null; } this.is_gap = is_gap; } public ParcelableActivity(final JSONParcel in) { account_id = in.readLong("account_id"); timestamp = in.readLong("timestamp"); max_position = in.readLong("max_position"); min_position = in.readLong("min_position"); action = in.readInt("action"); sources = in.readParcelableArray("sources", ParcelableUser.JSON_CREATOR); target_users = in.readParcelableArray("target_users", ParcelableUser.JSON_CREATOR); target_statuses = in.readParcelableArray("target_statuses", ParcelableStatus.JSON_CREATOR); target_user_lists = in.readParcelableArray("target_user_lists", ParcelableUserList.JSON_CREATOR); target_object_user_lists = in.readParcelableArray("target_object_user_lists", ParcelableUserList.JSON_CREATOR); target_object_statuses = in.readParcelableArray("target_object_statuses", ParcelableStatus.JSON_CREATOR); is_gap = in.readBoolean("is_gap", false); } @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 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) + "}"; } @Override public void writeToParcel(final JSONParcel out) { out.writeLong("account_id", account_id); out.writeLong("timestamp", timestamp); out.writeLong("max_position", max_position); out.writeLong("min_position", min_position); out.writeInt("action", action); out.writeParcelableArray("sources", sources); out.writeParcelableArray("target_users", target_users); out.writeParcelableArray("target_statuses", target_statuses); out.writeParcelableArray("target_user_lists", target_user_lists); out.writeParcelableArray("target_object_user_lists", target_object_user_lists); out.writeParcelableArray("target_object_statuses", target_object_statuses); out.writeBoolean("is_gap", is_gap); } }