package com.kenny.openimgur.classes;
import android.database.Cursor;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.text.format.DateUtils;
import com.google.gson.annotations.SerializedName;
import com.kenny.openimgur.R;
import com.kenny.openimgur.util.DBContracts;
import com.kenny.openimgur.util.DBContracts.UserContract;
/**
* Created by kcampagna on 7/25/14.
*/
public class ImgurUser implements Parcelable {
@SerializedName("id")
private int mId;
@SerializedName("url")
private String mUsername;
@SerializedName("bio")
private String mBio;
@SerializedName("created")
private long mCreated;
@SerializedName("reputation")
private long mReputation;
private long mLastSeen;
private String mAccessToken;
private String mRefreshToken;
private long mAccessTokenExpiration;
private Notoriety mNotoriety;
public enum Notoriety {
FOREVER_ALONE,
NEUTRAL,
ACCEPTED,
LIKED,
TRUSTED,
IDOLIZED,
RENOWNED,
GLORIOUS;
/**
* Gets the notoriety based on the user's reputation
*
* @param rep
* @return
*/
public static Notoriety getNotoriety(long rep) {
if (rep < 0) {
return FOREVER_ALONE;
} else if (rep < 400) {
return NEUTRAL;
} else if (rep < 1000) {
return ACCEPTED;
} else if (rep < 2000) {
return LIKED;
} else if (rep < 4000) {
return TRUSTED;
} else if (rep < 8000) {
return IDOLIZED;
} else if (rep < 20000) {
return RENOWNED;
}
return GLORIOUS;
}
/**
* Returns the string that represents the Notoriety level
*
* @return
*/
public int getStringId() {
switch (this) {
case NEUTRAL:
return R.string.notoriety_neutral;
case ACCEPTED:
return R.string.notoriety_accepted;
case LIKED:
return R.string.notoriety_liked;
case TRUSTED:
return R.string.notoriety_trusted;
case IDOLIZED:
return R.string.notoriety_idolized;
case RENOWNED:
return R.string.notoriety_renowned;
case GLORIOUS:
return R.string.notoriety_glorious;
default:
case FOREVER_ALONE:
return R.string.notoriety_forever_alone;
}
}
/**
* Returns the color associated with the notoriety level
*
* @return
*/
public int getNotorietyColor() {
if (this == FOREVER_ALONE) {
return R.color.notoriety_negative;
}
return R.color.notoriety_positive;
}
}
public ImgurUser(String username, String accessToken, String refreshToken, long accessTokenExpiration) {
mUsername = username;
mAccessToken = accessToken;
mRefreshToken = refreshToken;
mAccessTokenExpiration = accessTokenExpiration;
}
public ImgurUser(Cursor cursor, boolean isLoggedInUser) {
if (isLoggedInUser) {
mId = cursor.getInt(UserContract.COLUMN_INDEX_ID);
mUsername = cursor.getString(UserContract.COLUMN_INDEX_NAME);
mCreated = cursor.getLong(UserContract.COLUMN_INDEX_CREATED);
mAccessToken = cursor.getString(UserContract.COLUMN_INDEX_ACCESS_TOKEN);
mRefreshToken = cursor.getString(UserContract.COLUMN_INDEX_REFRESH_TOKEN);
mAccessTokenExpiration = cursor.getLong(UserContract.COLUMN_INDEX_ACCESS_TOKEN_EXPIRATION);
mReputation = cursor.getLong(UserContract.COLUMN_INDEX_REPUTATION);
mNotoriety = Notoriety.getNotoriety(mReputation);
} else {
mId = cursor.getInt(DBContracts.ProfileContract.COLUMN_INDEX_ID);
mUsername = cursor.getString(DBContracts.ProfileContract.COLUMN_INDEX_USERNAME);
mBio = cursor.getString(DBContracts.ProfileContract.COLUMN_INDEX_BIO);
mReputation = cursor.getLong(DBContracts.ProfileContract.COLUMN_INDEX_REP);
mLastSeen = cursor.getLong(DBContracts.ProfileContract.COLUMN_INDEX_LAST_SEEN);
mNotoriety = Notoriety.getNotoriety(mReputation);
mCreated = cursor.getLong(DBContracts.ProfileContract.COLUMN_INDEX_CREATED);
}
}
ImgurUser(Parcel in) {
mUsername = in.readString();
mBio = in.readString();
mAccessToken = in.readString();
mRefreshToken = in.readString();
mId = in.readInt();
mAccessTokenExpiration = in.readLong();
mCreated = in.readLong();
mReputation = in.readLong();
mLastSeen = in.readLong();
mNotoriety = Notoriety.getNotoriety(mReputation);
}
public void copy(ImgurUser user) {
if (user == null) return;
mId = user.getId();
mUsername = user.getUsername();
mBio = user.getBio();
mCreated = user.mCreated;
mReputation = user.getReputation();
}
public long getAccessTokenExpiration() {
return mAccessTokenExpiration;
}
public String getRefreshToken() {
return mRefreshToken;
}
public String getAccessToken() {
return mAccessToken;
}
public long getReputation() {
return mReputation;
}
public String getBio() {
return mBio;
}
public long getCreated() {
return mCreated * DateUtils.SECOND_IN_MILLIS;
}
public String getUsername() {
return mUsername;
}
public int getId() {
return mId;
}
@NonNull
public Notoriety getNotoriety() {
if (mNotoriety == null) mNotoriety = Notoriety.getNotoriety(mReputation);
return mNotoriety;
}
public long getLastSeen() {
return mLastSeen;
}
public void setLastSeen(long lastSeen) {
mLastSeen = lastSeen;
}
/**
* Sets the user's tokens
*
* @param accessToken
* @param refreshToken
* @param expiresIn
*/
public void setTokens(String accessToken, String refreshToken, long expiresIn) {
mAccessToken = accessToken;
mRefreshToken = refreshToken;
mAccessTokenExpiration = expiresIn;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mUsername);
parcel.writeString(mBio);
parcel.writeString(mAccessToken);
parcel.writeString(mRefreshToken);
parcel.writeInt(mId);
parcel.writeLong(mAccessTokenExpiration);
parcel.writeLong(mCreated);
parcel.writeLong(mReputation);
parcel.writeLong(mLastSeen);
}
public static final Creator<ImgurUser> CREATOR = new Creator<ImgurUser>() {
public ImgurUser createFromParcel(Parcel in) {
return new ImgurUser(in);
}
public ImgurUser[] newArray(int size) {
return new ImgurUser[size];
}
};
@Override
public String toString() {
return "Username: " + mUsername + " Id: " + mId;
}
@Override
public boolean equals(Object object) {
if (object == null) {
return false;
}
if (!(object instanceof ImgurUser)) {
return false;
}
if (object == this) {
return true;
}
ImgurUser user = (ImgurUser) object;
return user.mId == this.getId() || user.getUsername().equals(this.getUsername());
}
public boolean isSelf() {
ImgurUser user = OpengurApp.getInstance().getUser();
return user != null && user.equals(this);
}
public boolean isSelf(OpengurApp app) {
if (app.getUser() != null) {
return app.getUser().equals(this);
}
return false;
}
}