/*******************************************************************************
* Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang
*
* 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 com.fanfou.app.opensource.api.bean;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Parcel;
import android.os.Parcelable;
import com.fanfou.app.opensource.AppContext;
import com.fanfou.app.opensource.api.ApiException;
import com.fanfou.app.opensource.api.ApiParser;
import com.fanfou.app.opensource.db.Contents.BasicColumns;
import com.fanfou.app.opensource.db.Contents.UserInfo;
import com.fanfou.app.opensource.http.ResponseCode;
import com.fanfou.app.opensource.http.SimpleResponse;
import com.fanfou.app.opensource.service.Constants;
import com.fanfou.app.opensource.util.StringHelper;
/**
* @author mcxiaoke
* @version 1.0 2011.04.30
* @version 1.1 2011.05.01
* @version 1.2 2011.05.02
* @version 1.3 2011.07.21
* @version 1.4 2011.10.21
* @version 1.5 2011.11.04
* @version 2.0 2011.11.10
* @version 2.1 2011.11.11
* @version 2.5 2011.11.15
* @version 2.6 2011.12.16
* @version 2.7 2011.12.19
* @version 3.0 2011.12.21
*
*/
public class User implements Storable<User> {
public static final String TAG = User.class.getSimpleName();
public Date createdAt;
public String id;
public String ownerId;
public String screenName;
public String location;
public String gender;
public String birthday;
public String description;
public String profileImageUrl;
public String url;
public boolean protect;
public int followersCount;
public int friendsCount;
public int favouritesCount;
public int statusesCount;
public boolean following;
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
@Override
public User createFromParcel(final Parcel source) {
return new User(source);
}
@Override
public User[] newArray(final int size) {
return new User[size];
}
};
public static User parse(final Cursor c) {
if (c == null) {
return null;
}
final User user = new User();
user.createdAt = ApiParser.parseDate(c, BasicColumns.CREATED_AT);
user.id = ApiParser.parseString(c, BasicColumns.ID);
user.ownerId = ApiParser.parseString(c, BasicColumns.OWNER_ID);
user.screenName = ApiParser.parseString(c, UserInfo.SCREEN_NAME);
user.location = ApiParser.parseString(c, UserInfo.LOCATION);
user.gender = ApiParser.parseString(c, UserInfo.GENDER);
user.birthday = ApiParser.parseString(c, UserInfo.BIRTHDAY);
user.description = ApiParser.parseString(c, UserInfo.DESCRIPTION);
user.profileImageUrl = ApiParser.parseString(c,
UserInfo.PROFILE_IMAGE_URL);
user.url = ApiParser.parseString(c, UserInfo.URL);
user.protect = ApiParser.parseBoolean(c, UserInfo.PROTECTED);
user.followersCount = ApiParser.parseInt(c, UserInfo.FOLLOWERS_COUNT);
user.friendsCount = ApiParser.parseInt(c, UserInfo.FRIENDS_COUNT);
user.favouritesCount = ApiParser.parseInt(c, UserInfo.FAVORITES_COUNT);
user.statusesCount = ApiParser.parseInt(c, UserInfo.STATUSES_COUNT);
user.following = ApiParser.parseBoolean(c, UserInfo.FOLLOWING);
user.type = ApiParser.parseInt(c, BasicColumns.TYPE);
return user;
}
public static User parse(final JSONObject o) throws ApiException {
if (null == o) {
return null;
}
try {
final User user = new User();
user.id = o.getString(BasicColumns.ID);
user.screenName = o.getString(UserInfo.SCREEN_NAME);
user.location = o.getString(UserInfo.LOCATION);
user.gender = o.getString(UserInfo.GENDER);
user.birthday = o.getString(UserInfo.BIRTHDAY);
user.description = o.getString(UserInfo.DESCRIPTION);
user.profileImageUrl = o.getString(UserInfo.PROFILE_IMAGE_URL);
user.url = o.getString(UserInfo.URL);
user.protect = o.getBoolean(UserInfo.PROTECTED);
user.followersCount = o.getInt(UserInfo.FOLLOWERS_COUNT);
user.friendsCount = o.getInt(UserInfo.FRIENDS_COUNT);
user.favouritesCount = o.getInt(UserInfo.FAVORITES_COUNT);
user.statusesCount = o.getInt(UserInfo.STATUSES_COUNT);
user.following = o.getBoolean(UserInfo.FOLLOWING);
user.createdAt = ApiParser.date(o
.getString(BasicColumns.CREATED_AT));
user.type = Constants.TYPE_NONE;
user.ownerId = AppContext.getUserId();
return user;
} catch (final JSONException e) {
throw new ApiException(ResponseCode.ERROR_JSON_EXCEPTION,
e.getMessage(), e);
}
}
public static User parse(final SimpleResponse r) throws ApiException {
try {
return User.parse(r.getJSONObject());
} catch (final IOException e) {
e.printStackTrace();
}
return null;
}
public static ArrayList<User> parseUsers(final JSONArray a)
throws ApiException {
if (a == null) {
return null;
}
final ArrayList<User> users = new ArrayList<User>();
try {
for (int i = 0; i < a.length(); i++) {
final JSONObject o = a.getJSONObject(i);
final User u = User.parse(o);
users.add(u);
}
} catch (final JSONException e) {
throw new ApiException(ResponseCode.ERROR_JSON_EXCEPTION, e);
}
return users;
}
public static ArrayList<User> parseUsers(final SimpleResponse r)
throws ApiException {
try {
return User.parseUsers(r.getJSONArray());
} catch (final IOException e) {
e.printStackTrace();
}
return null;
}
public int type;
public User() {
}
public User(final Parcel in) {
this.id = in.readString();
this.ownerId = in.readString();
this.createdAt = new Date(in.readLong());
this.type = in.readInt();
this.screenName = in.readString();
this.location = in.readString();
this.gender = in.readString();
this.birthday = in.readString();
this.description = in.readString();
this.profileImageUrl = in.readString();
this.url = in.readString();
this.protect = in.readInt() == 0 ? false : true;
this.followersCount = in.readInt();
this.friendsCount = in.readInt();
this.favouritesCount = in.readInt();
this.statusesCount = in.readInt();
this.following = in.readInt() == 0 ? false : true;
}
@Override
public int compareTo(final User another) {
return this.createdAt.compareTo(another.createdAt);
}
@Override
public int describeContents() {
return 0;
}
@Override
public boolean equals(final Object o) {
if (o instanceof User) {
final User u = (User) o;
if (this.id.equals(u.id)) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return this.id.hashCode();
}
public boolean isNull() {
return StringHelper.isEmpty(this.id);
}
@Override
public ContentValues toContentValues() {
final User u = this;
final ContentValues cv = new ContentValues();
cv.put(BasicColumns.ID, u.id);
cv.put(BasicColumns.OWNER_ID, u.ownerId);
cv.put(UserInfo.SCREEN_NAME, u.screenName);
cv.put(UserInfo.LOCATION, u.location);
cv.put(UserInfo.GENDER, u.gender);
cv.put(UserInfo.BIRTHDAY, u.birthday);
cv.put(UserInfo.DESCRIPTION, u.description);
cv.put(UserInfo.PROFILE_IMAGE_URL, u.profileImageUrl);
cv.put(UserInfo.URL, u.url);
cv.put(UserInfo.PROTECTED, u.protect);
cv.put(UserInfo.FOLLOWERS_COUNT, u.followersCount);
cv.put(UserInfo.FRIENDS_COUNT, u.friendsCount);
cv.put(UserInfo.FAVORITES_COUNT, u.favouritesCount);
cv.put(UserInfo.STATUSES_COUNT, u.statusesCount);
cv.put(UserInfo.FOLLOWING, u.following);
cv.put(BasicColumns.CREATED_AT, u.createdAt.getTime());
cv.put(BasicColumns.TYPE, u.type);
return cv;
}
public ContentValues toSimpleContentValues() {
final User u = this;
final ContentValues cv = new ContentValues();
cv.put(UserInfo.SCREEN_NAME, u.screenName);
cv.put(UserInfo.LOCATION, u.location);
cv.put(UserInfo.GENDER, u.gender);
cv.put(UserInfo.BIRTHDAY, u.birthday);
cv.put(UserInfo.DESCRIPTION, u.description);
cv.put(UserInfo.PROFILE_IMAGE_URL, u.profileImageUrl);
cv.put(UserInfo.URL, u.url);
cv.put(UserInfo.PROTECTED, u.protect);
cv.put(UserInfo.FOLLOWERS_COUNT, u.followersCount);
cv.put(UserInfo.FRIENDS_COUNT, u.friendsCount);
cv.put(UserInfo.FAVORITES_COUNT, u.favouritesCount);
cv.put(UserInfo.STATUSES_COUNT, u.statusesCount);
cv.put(UserInfo.FOLLOWING, u.following);
return cv;
}
@Override
public String toString() {
return "[User] " + BasicColumns.ID + "=" + this.id + " "
+ UserInfo.SCREEN_NAME + "=" + this.screenName + " "
+ UserInfo.LOCATION + "=" + this.location + " "
+ UserInfo.GENDER + "=" + this.gender + " " + UserInfo.BIRTHDAY
+ "=" + this.birthday + " " + UserInfo.DESCRIPTION + "="
+ this.description + " " + UserInfo.PROFILE_IMAGE_URL + "="
+ this.profileImageUrl + " " + UserInfo.URL + "=" + this.url
+ " " + UserInfo.PROTECTED + "=" + this.protect + " "
+ UserInfo.FOLLOWERS_COUNT + "=" + this.followersCount + " "
+ UserInfo.FRIENDS_COUNT + "=" + this.friendsCount + " "
+ UserInfo.FAVORITES_COUNT + "=" + this.favouritesCount + " "
+ UserInfo.STATUSES_COUNT + "=" + this.statusesCount + " "
+ UserInfo.FOLLOWING + "=" + this.following + " "
+ BasicColumns.CREATED_AT + "=" + this.createdAt + " "
+ BasicColumns.TYPE + "=" + this.type + " ";
}
@Override
public void writeToParcel(final Parcel dest, final int flags) {
dest.writeString(this.id);
dest.writeString(this.ownerId);
dest.writeLong(this.createdAt.getTime());
dest.writeInt(this.type);
dest.writeString(this.screenName);
dest.writeString(this.location);
dest.writeString(this.gender);
dest.writeString(this.birthday);
dest.writeString(this.description);
dest.writeString(this.profileImageUrl);
dest.writeString(this.url);
dest.writeInt(this.protect ? 1 : 0);
dest.writeInt(this.followersCount);
dest.writeInt(this.friendsCount);
dest.writeInt(this.favouritesCount);
dest.writeInt(this.statusesCount);
dest.writeInt(this.following ? 1 : 0);
}
}