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

396 lines
14 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.NonNull;
import androidx.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelableNoThanks;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
import org.mariotaku.commons.objectcursor.LoganSquareCursorFieldConverter;
import org.mariotaku.library.objectcursor.annotation.AfterCursorObjectCreated;
import org.mariotaku.library.objectcursor.annotation.CursorField;
import org.mariotaku.library.objectcursor.annotation.CursorObject;
import org.mariotaku.twidere.model.util.ContentObjectColorConverter;
import org.mariotaku.twidere.model.util.UserKeyConverter;
import org.mariotaku.twidere.model.util.UserKeyCursorFieldConverter;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import java.util.Arrays;
@ParcelablePlease(allFields = false)
@JsonObject
@CursorObject(valuesCreator = true, tableInfo = true)
public class ParcelableUser implements Parcelable, Comparable<ParcelableUser> {
@ParcelableThisPlease
@JsonField(name = "account_id", typeConverter = UserKeyConverter.class)
@Nullable
public UserKey account_key;
@ParcelableThisPlease
public int account_color;
@ParcelableThisPlease
@CursorField(value = CachedUsers._ID, type = TwidereDataStore.TYPE_PRIMARY_KEY, excludeWrite = true)
public long _id;
@ParcelableThisPlease
@JsonField(name = "id", typeConverter = UserKeyConverter.class)
@CursorField(value = CachedUsers.USER_KEY, converter = UserKeyCursorFieldConverter.class)
public UserKey key;
@ParcelableThisPlease
@JsonField(name = "created_at")
@CursorField(CachedUsers.CREATED_AT)
public long created_at;
@ParcelableThisPlease
@JsonField(name = "position")
public long position;
@ParcelableThisPlease
@JsonField(name = "is_protected")
@CursorField(CachedUsers.IS_PROTECTED)
public boolean is_protected;
@ParcelableThisPlease
@JsonField(name = "is_verified")
@CursorField(CachedUsers.IS_VERIFIED)
public boolean is_verified;
@ParcelableThisPlease
@JsonField(name = "is_follow_request_sent")
public boolean is_follow_request_sent;
@ParcelableThisPlease
@JsonField(name = "is_following")
@CursorField(CachedUsers.IS_FOLLOWING)
public boolean is_following;
@ParcelableThisPlease
@JsonField(name = "description_plain")
@CursorField(CachedUsers.DESCRIPTION_PLAIN)
public String description_plain;
@ParcelableThisPlease
@JsonField(name = "name")
@CursorField(CachedUsers.NAME)
public String name;
@ParcelableThisPlease
@JsonField(name = "screen_name")
@CursorField(CachedUsers.SCREEN_NAME)
public String screen_name;
@ParcelableThisPlease
@JsonField(name = "location")
@CursorField(CachedUsers.LOCATION)
public String location;
@ParcelableThisPlease
@JsonField(name = "profile_image_url")
@CursorField(CachedUsers.PROFILE_IMAGE_URL)
public String profile_image_url;
@ParcelableThisPlease
@JsonField(name = "profile_banner_url")
@CursorField(CachedUsers.PROFILE_BANNER_URL)
public String profile_banner_url;
@ParcelableThisPlease
@JsonField(name = "profile_background_url")
@CursorField(CachedUsers.PROFILE_BACKGROUND_URL)
public String profile_background_url;
@ParcelableThisPlease
@JsonField(name = "url")
@CursorField(CachedUsers.URL)
public String url;
@ParcelableThisPlease
@JsonField(name = "url_expanded")
@CursorField(CachedUsers.URL_EXPANDED)
public String url_expanded;
@ParcelableThisPlease
@JsonField(name = "description_unescaped")
@CursorField(CachedUsers.DESCRIPTION_UNESCAPED)
public String description_unescaped;
@ParcelableThisPlease
@JsonField(name = "description_spans")
@CursorField(value = CachedUsers.DESCRIPTION_SPANS, converter = LoganSquareCursorFieldConverter.class)
public SpanItem[] description_spans;
@ParcelableThisPlease
@JsonField(name = "followers_count")
@CursorField(CachedUsers.FOLLOWERS_COUNT)
public long followers_count = -1;
@ParcelableThisPlease
@JsonField(name = "friends_count")
@CursorField(CachedUsers.FRIENDS_COUNT)
public long friends_count = -1;
@ParcelableThisPlease
@JsonField(name = "statuses_count")
@CursorField(CachedUsers.STATUSES_COUNT)
public long statuses_count = -1;
@ParcelableThisPlease
@JsonField(name = "favorites_count")
@CursorField(CachedUsers.FAVORITES_COUNT)
public long favorites_count = -1;
@ParcelableThisPlease
@JsonField(name = "listed_count")
@CursorField(CachedUsers.LISTED_COUNT)
public long listed_count = -1;
@ParcelableThisPlease
@JsonField(name = "media_count")
@CursorField(CachedUsers.MEDIA_COUNT)
public long media_count = -1;
@ParcelableThisPlease
@JsonField(name = "background_color", typeConverter = ContentObjectColorConverter.class)
@CursorField(CachedUsers.BACKGROUND_COLOR)
public int background_color;
@ParcelableThisPlease
@JsonField(name = "link_color", typeConverter = ContentObjectColorConverter.class)
@CursorField(CachedUsers.LINK_COLOR)
public int link_color;
@ParcelableThisPlease
@JsonField(name = "text_color", typeConverter = ContentObjectColorConverter.class)
@CursorField(CachedUsers.TEXT_COLOR)
public int text_color;
@ParcelableThisPlease
@JsonField(name = "is_cache")
public boolean is_cache;
@ParcelableThisPlease
@JsonField(name = "is_basic")
public boolean is_basic;
@ParcelableThisPlease
@JsonField(name = "extras")
@CursorField(value = CachedUsers.EXTRAS, converter = LoganSquareCursorFieldConverter.class)
@Nullable
public Extras extras;
@ParcelableNoThanks
@CursorField(CachedUsers.LAST_SEEN)
public long last_seen;
@ParcelableNoThanks
@CursorField(value = CachedUsers.SCORE, excludeWrite = true)
public int score;
@ParcelableThisPlease
@CursorField(value = CachedUsers.USER_TYPE)
public String user_type;
@ParcelableThisPlease
public int color;
@ParcelableThisPlease
public String nickname;
@ParcelableThisPlease
public boolean is_filtered;
public static final Creator<ParcelableUser> CREATOR = new Creator<ParcelableUser>() {
@Override
public ParcelableUser createFromParcel(Parcel source) {
ParcelableUser target = new ParcelableUser();
ParcelableUserParcelablePlease.readFromParcel(target, source);
return target;
}
@Override
public ParcelableUser[] newArray(int size) {
return new ParcelableUser[size];
}
};
public ParcelableUser() {
}
public ParcelableUser(final UserKey account_key, final UserKey key, final String name,
final String screenName, final String profileImageUrl) {
this.account_key = account_key;
this.key = key;
this.name = name;
this.screen_name = screenName;
this.profile_image_url = profileImageUrl;
is_cache = true;
is_basic = true;
}
@AfterCursorObjectCreated
void afterCursorObjectCreated() {
is_cache = true;
if (description_unescaped == null) {
description_unescaped = description_plain;
}
is_basic = description_plain == null || url == null || location == null;
}
@Override
public int compareTo(@NonNull final ParcelableUser that) {
final long diff = position - that.position;
if (diff > Integer.MAX_VALUE) return Integer.MAX_VALUE;
if (diff < Integer.MIN_VALUE) return Integer.MIN_VALUE;
return (int) diff;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ParcelableUser user = (ParcelableUser) o;
if (account_key != null ? !account_key.equals(user.account_key) : user.account_key != null)
return false;
return key.equals(user.key);
}
@Override
public int hashCode() {
return calculateHashCode(account_key, key);
}
public static int calculateHashCode(UserKey accountKey, UserKey key) {
int result = accountKey != null ? key.hashCode() : 0;
result = 31 * result + key.hashCode();
return result;
}
@Override
public String toString() {
return "ParcelableUser{" +
"account_key=" + account_key +
", account_color=" + account_color +
", key=" + key +
", created_at=" + created_at +
", position=" + position +
", is_protected=" + is_protected +
", is_verified=" + is_verified +
", is_follow_request_sent=" + is_follow_request_sent +
", is_following=" + is_following +
", description_plain='" + description_plain + '\'' +
", name='" + name + '\'' +
", screen_name='" + screen_name + '\'' +
", location='" + location + '\'' +
", profile_image_url='" + profile_image_url + '\'' +
", profile_banner_url='" + profile_banner_url + '\'' +
", profile_background_url='" + profile_background_url + '\'' +
", url='" + url + '\'' +
", url_expanded='" + url_expanded + '\'' +
", description_unescaped='" + description_unescaped + '\'' +
", description_spans=" + Arrays.toString(description_spans) +
", followers_count=" + followers_count +
", friends_count=" + friends_count +
", statuses_count=" + statuses_count +
", favorites_count=" + favorites_count +
", listed_count=" + listed_count +
", media_count=" + media_count +
", background_color=" + background_color +
", link_color=" + link_color +
", text_color=" + text_color +
", is_cache=" + is_cache +
", is_basic=" + is_basic +
", extras=" + extras +
", color=" + color +
", nickname='" + nickname + '\'' +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableUserParcelablePlease.writeToParcel(this, dest, flags);
}
@ParcelablePlease
@JsonObject
public static class Extras implements Parcelable {
@JsonField(name = "statusnet_profile_url")
@ParcelableThisPlease
public String statusnet_profile_url;
@JsonField(name = "ostatus_uri")
@ParcelableThisPlease
public String ostatus_uri;
@JsonField(name = "profile_image_url_original")
@ParcelableThisPlease
public String profile_image_url_original;
@JsonField(name = "profile_image_url_fallback")
@ParcelableThisPlease
@Nullable
public String profile_image_url_fallback;
@JsonField(name = "groups_count")
@ParcelableThisPlease
public long groups_count = -1;
@JsonField(name = "unique_id")
@ParcelableThisPlease
public String unique_id;
@JsonField(name = "blocking")
@ParcelableThisPlease
public boolean blocking;
@JsonField(name = "blocked_by")
@ParcelableThisPlease
public boolean blocked_by;
@JsonField(name = "followed_by")
@ParcelableThisPlease
public boolean followed_by;
@JsonField(name = "muting")
@ParcelableThisPlease
public boolean muting;
@JsonField(name = "notifications_enabled")
@ParcelableThisPlease
public boolean notifications_enabled;
@JsonField(name = "pinned_status_ids")
@ParcelableThisPlease
public String[] pinned_status_ids;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableUser$ExtrasParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<Extras> CREATOR = new Creator<Extras>() {
@Override
public Extras createFromParcel(Parcel source) {
Extras target = new Extras();
ParcelableUser$ExtrasParcelablePlease.readFromParcel(target, source);
return target;
}
@Override
public Extras[] newArray(int size) {
return new Extras[size];
}
};
}
}