/*******************************************************************************
* 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;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.protocol.HTTP;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import com.fanfou.app.opensource.AppContext;
import com.fanfou.app.opensource.api.bean.DirectMessage;
import com.fanfou.app.opensource.api.bean.Search;
import com.fanfou.app.opensource.api.bean.Status;
import com.fanfou.app.opensource.api.bean.User;
import com.fanfou.app.opensource.auth.OAuthConfig;
import com.fanfou.app.opensource.auth.OAuthService;
import com.fanfou.app.opensource.auth.OAuthToken;
import com.fanfou.app.opensource.cache.CacheManager;
import com.fanfou.app.opensource.http.ResponseCode;
import com.fanfou.app.opensource.http.SimpleClient;
import com.fanfou.app.opensource.http.SimpleRequest;
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.05.15
* @version 1.1 2011.05.17
* @version 1.2 2011.10.28
* @version 1.3 2011.11.04
* @version 1.4 2011.11.07
* @version 2.0 2011.11.07
* @version 2.1 2011.11.09
* @version 2.2 2011.11.11
* @version 3.0 2011.11.18
* @version 4.0 2011.11.21
* @version 4.1 2011.11.22
* @version 4.2 2011.11.23
* @version 4.3 2011.11.28
* @version 4.4 2011.11.29
* @version 4.5 2011.11.30
* @version 4.6 2011.12.01
* @version 4.7 2011.12.02
* @version 4.8 2011.12.05
* @version 4.9 2011.12.06
* @version 5.0 2011.12.12
* @version 5.1 2011.12.13
* @version 6.0 2011.12.16
* @version 6.1 2011.12.20
* @version 6.2 2011.12.23
* @version 6.3 2011.12.26
* @version 6.4 2013.03.04
*
*/
class ApiClientImpl implements ApiClient, ApiConfig, ResponseCode {
private static final String TAG = ApiClientImpl.class.getSimpleName();
private static final OAuthConfig OAUTH_CONFIG = new OAuthConfig();
private final Context mAppContext;
public ApiClientImpl(final Context context) {
this.mAppContext = context.getApplicationContext();
}
@Override
public ArrayList<User> blocksBlocking(final int count, final int page,
final String mode) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_BLOCKS_USERS);
builder.count(count).page(page);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("userBlockedList()---statusCode=" + statusCode);
}
return User.parseUsers(response);
}
@Override
public User blocksCreate(final String userId, final String mode)
throws ApiException {
// String url=String.format(URL_BLOCKS_CREATE, userId);
if (TextUtils.isEmpty(userId)) {
throw new NullPointerException(
"blocksCreate() userId must not be empty or null.");
}
String url;
try {
url = String.format(ApiConfig.URL_BLOCKS_CREATE,
URLEncoder.encode(userId, HTTP.UTF_8));
} catch (final UnsupportedEncodingException e) {
url = String.format(ApiConfig.URL_BLOCKS_CREATE, userId);
}
final SimpleResponse response = doPostIdAction(url, null, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("userBlock()---statusCode=" + statusCode + " url=" + url);
}
// handlerResponseError(response);
final User u = User.parse(response);
if (u != null) {
u.ownerId = AppContext.getUserId();
}
return u;
}
@Override
public User blocksDelete(final String userId, final String mode)
throws ApiException {
// String url=String.format(URL_BLOCKS_DESTROY, userId);
if (TextUtils.isEmpty(userId)) {
throw new NullPointerException(
"blocksDelete() userId must not be empty or null.");
}
String url;
try {
url = String.format(ApiConfig.URL_BLOCKS_DESTROY,
URLEncoder.encode(userId, HTTP.UTF_8));
} catch (final UnsupportedEncodingException e) {
url = String.format(ApiConfig.URL_BLOCKS_DESTROY, userId);
}
final SimpleResponse response = doPostIdAction(url, null, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("userUnblock()---statusCode=" + statusCode + " url=" + url);
}
// handlerResponseError(response);
final User u = User.parse(response);
if (u != null) {
u.ownerId = AppContext.getUserId();
}
return u;
}
@Override
public User blocksExists(final String userId, final String mode)
throws ApiException {
final SimpleResponse response = doPostIdAction(
ApiConfig.URL_BLOCKS_EXISTS, userId, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("userIsBlocked()---statusCode=" + statusCode);
}
return User.parse(response);
}
@Override
public ArrayList<String> blocksIDs() throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_BLOCKS_IDS);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("userBlockedIDs()---statusCode=" + statusCode);
}
try {
return ApiParser.ids(response);
} catch (final IOException e) {
e.printStackTrace();
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
@Override
public ArrayList<Status> contextTimeline(final String id,
final String format, final String mode) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_TIMELINE_CONTEXT).id(id).format("html")
.mode("lite");
final SimpleResponse response = fetch(builder.build());
final ArrayList<Status> ss = Status.parseStatuses(response,
Constants.TYPE_STATUSES_CONTEXT_TIMELINE);
return ss;
}
@Override
public ArrayList<DirectMessage> directMessagesConversation(
final String userId, final String maxId, final int count,
final String mode) throws ApiException {
if (TextUtils.isEmpty(userId)) {
throw new NullPointerException(
"directMessagesConversation() userId must not be empty or null.");
}
final SimpleRequest.Builder builder = SimpleRequest.newBuilder();
builder.url(ApiConfig.URL_DIRECT_MESSAGES_CONVERSATION).id(userId)
.count(count).maxId(maxId).mode(mode);
final SimpleResponse response = fetch(builder.build());
final List<DirectMessage> dms = DirectMessage
.parseConversationUser(response);
if ((dms != null) && (dms.size() > 0)) {
for (final DirectMessage dm : dms) {
dm.threadUserId = userId;
}
}
return null;
}
@Override
public ArrayList<DirectMessage> directMessagesConversationList(
final int count, final int page, final String mode)
throws ApiException {
final SimpleRequest.Builder builder = SimpleRequest.newBuilder();
builder.url(ApiConfig.URL_DIRECT_MESSAGES_CONVERSATION).count(count)
.page(page).mode(mode);
final SimpleResponse response = fetch(builder.build());
return DirectMessage.parseConversationList(response);
}
@Override
public DirectMessage directMessagesCreate(final String userId,
final String text, final String inReplyToId, final String mode)
throws ApiException {
if (StringHelper.isEmpty(userId) || StringHelper.isEmpty(text)) {
if (AppContext.DEBUG) {
throw new IllegalArgumentException("收信人ID和私信内容都不能为空");
}
return null;
}
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_DIRECT_MESSAGES_NEW);
builder.post();
builder.param("user", userId);
builder.param("text", text);
builder.param("in_reply_to_id", inReplyToId);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("DirectMessagesCreate()---statusCode=" + statusCode);
}
final DirectMessage dm = DirectMessage.parse(response,
Constants.TYPE_DIRECT_MESSAGES_OUTBOX);
if ((dm != null) && !dm.isNull()) {
dm.threadUserId = dm.recipientId;
dm.threadUserName = dm.recipientScreenName;
return dm;
} else {
return null;
}
}
@Override
public DirectMessage directMessagesDelete(final String directMessageId,
final String mode) throws ApiException {
if (TextUtils.isEmpty(directMessageId)) {
throw new NullPointerException(
"directMessagesDelete() directMessageId must not be empty or null.");
}
final String url = String.format(ApiConfig.URL_DIRECT_MESSAGES_DESTROY,
directMessageId);
final SimpleResponse response = doPostIdAction(url, null, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("DirectMessagesDelete()---statusCode=" + statusCode + " url="
+ url);
}
return DirectMessage.parse(response, Constants.TYPE_NONE);
}
@Override
public ArrayList<DirectMessage> directMessagesInbox(final int count,
final int page, final String sinceId, final String maxId,
final String mode) throws ApiException {
final ArrayList<DirectMessage> dms = messages(
ApiConfig.URL_DIRECT_MESSAGES_INBOX, count, page, sinceId,
maxId, mode, Constants.TYPE_DIRECT_MESSAGES_INBOX);
if ((dms != null) && (dms.size() > 0)) {
for (final DirectMessage dm : dms) {
dm.threadUserId = dm.senderId;
dm.threadUserName = dm.senderScreenName;
}
}
return dms;
}
@Override
public ArrayList<DirectMessage> directMessagesOutbox(final int count,
final int page, final String sinceId, final String maxId,
final String mode) throws ApiException {
final ArrayList<DirectMessage> dms = messages(
ApiConfig.URL_DIRECT_MESSAGES_OUTBOX, count, page, sinceId,
maxId, mode, Constants.TYPE_DIRECT_MESSAGES_OUTBOX);
if ((dms != null) && (dms.size() > 0)) {
for (final DirectMessage dm : dms) {
dm.threadUserId = dm.recipientId;
dm.threadUserName = dm.recipientScreenName;
}
}
return dms;
}
/**
* action for only id param --get
*
* @param url
* api url
* @param id
* userid or status id or dm id
* @return string for id
* @throws ApiException
*/
private SimpleResponse doGetIdAction(final String url, final String id,
final String format, final String mode) throws ApiException {
if (AppContext.DEBUG) {
log("doGetIdAction() ---url=" + url + " id=" + id);
}
return doSingleIdAction(url, id, format, mode, false);
}
/**
* action for only id param --post
*
* @param url
* @param id
* @return
* @throws ApiException
*/
private SimpleResponse doPostIdAction(final String url, final String id,
final String format, final String mode) throws ApiException {
if (AppContext.DEBUG) {
log("doPostIdAction() ---url=" + url + " id=" + id);
}
return doSingleIdAction(url, id, format, mode, true);
}
/**
* action for only id param --get/post
*
* @param url
* @param id
* @param isPost
* @return
* @throws ApiException
*/
private SimpleResponse doSingleIdAction(final String url, final String id,
final String format, final String mode, final boolean isPost)
throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(url).id(id).post(isPost).format(format).mode(mode);
return fetch(builder.build());
}
@Override
public ArrayList<Status> favorites(final int count, final int page,
final String userId, final String format, final String mode)
throws ApiException {
final ArrayList<Status> ss = fetchStatuses(
ApiConfig.URL_FAVORITES_LIST, count, page, userId, null, null,
format, mode, Constants.TYPE_FAVORITES_LIST);
if ((userId != null) && (ss != null)) {
for (final Status status : ss) {
status.ownerId = userId;
}
}
return ss;
}
@Override
public Status favoritesCreate(final String statusId, final String format,
final String mode) throws ApiException {
if (TextUtils.isEmpty(statusId)) {
throw new NullPointerException(
"favoritesCreate() statusId must not be empty or null.");
}
final String url = String.format(ApiConfig.URL_FAVORITES_CREATE,
statusId);
final SimpleResponse response = doPostIdAction(url, null, format, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("favoritesCreate()---statusCode=" + statusCode + " url=" + url);
}
final Status s = Status.parse(response);
return s;
}
@Override
public Status favoritesDelete(final String statusId, final String format,
final String mode) throws ApiException {
if (TextUtils.isEmpty(statusId)) {
throw new NullPointerException(
"favoritesDelete() statusId must not be empty or null.");
}
final String url = String.format(ApiConfig.URL_FAVORITES_DESTROY,
statusId);
final SimpleResponse response = doPostIdAction(url, null, format, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("favoritesDelete()---statusCode=" + statusCode + " url=" + url);
}
final Status s = Status.parse(response);
return s;
}
/**
* exec http request
*
* @param request
* @return response object
* @throws ApiException
*/
private SimpleResponse fetch(final SimpleRequest request)
throws ApiException {
final Context context = getAppContext();
if (context == null) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
"context is null");
}
final OAuthToken token = AppContext.getOAuthToken();
final OAuthService service = new OAuthService(
ApiClientImpl.OAUTH_CONFIG, token);
try {
service.addOAuthSignature(request);
final SimpleClient client = new SimpleClient(context);
final HttpResponse response = client.exec(request);
final SimpleResponse res = new SimpleResponse(response);
final int statusCode = response.getStatusLine().getStatusCode();
if (AppContext.DEBUG) {
log("fetch() url=" + request.url + " post=" + request.post
+ " statusCode=" + statusCode);
}
if (statusCode == ResponseCode.HTTP_OK) {
return res;
} else {
throw new ApiException(statusCode, ApiParser.error(res
.getContent()));
}
} catch (final IOException e) {
if (AppContext.DEBUG) {
Log.e(ApiClientImpl.TAG, e.toString());
}
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage(), e.getCause());
}
}
/**
* fetch statuses --get
*
* @param url
* api url
* @param count
* optional
* @param page
* optional
* @param userId
* optional
* @param sinceId
* optional
* @param maxId
* optional
* @param isHtml
* optional
* @return statuses list
* @throws ApiException
*/
ArrayList<Status> fetchStatuses(final String url, final int count,
final int page, final String userId, final String sinceId,
final String maxId, final String format, final String mode,
final int type) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(url).count(count).page(page).id(userId).sinceId(sinceId)
.maxId(maxId).format(format).mode(mode);
final SimpleRequest request = builder.build();
final SimpleResponse response = fetch(request);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("fetchStatuses()---statusCode=" + statusCode + " url="
+ request.url);
}
return Status.parseStatuses(response, type);
}
private ArrayList<User> fetchUsers(final String url, final String userId,
final int count, final int page) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(url).id(userId).count(count).page(page)
.param("mode", "noprofile");
final SimpleResponse response = fetch(builder.build());
return User.parseUsers(response);
}
@Override
public ArrayList<String> followersIDs(final String userId, final int count,
final int page) throws ApiException {
return ids(ApiConfig.URL_USERS_FOLLOWERS_IDS, userId, count, page);
}
@Override
public User friendshipsCreate(final String userId, final String mode)
throws ApiException {
if (TextUtils.isEmpty(userId)) {
throw new NullPointerException(
"friendshipsCreate() userId must not be empty or null.");
}
String url;
try {
// hack for oauth chinese charactar encode
url = String.format(ApiConfig.URL_FRIENDSHIPS_CREATE,
URLEncoder.encode(userId, HTTP.UTF_8));
} catch (final UnsupportedEncodingException e) {
url = String.format(ApiConfig.URL_FRIENDSHIPS_CREATE, userId);
}
final SimpleResponse response = doPostIdAction(url, null, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("friendshipsCreate()---statusCode=" + statusCode + " url="
+ url);
}
final User u = User.parse(response);
if (u != null) {
u.ownerId = AppContext.getUserId();
CacheManager.put(u);
}
return u;
}
@Override
public User friendshipsDelete(final String userId, final String mode)
throws ApiException {
if (TextUtils.isEmpty(userId)) {
throw new NullPointerException(
"friendshipsDelete() userId must not be empty or null.");
}
// String url=String.format(URL_FRIENDSHIPS_DESTROY, userId);
String url;
try {
url = String.format(ApiConfig.URL_FRIENDSHIPS_DESTROY,
URLEncoder.encode(userId, HTTP.UTF_8));
} catch (final UnsupportedEncodingException e) {
url = String.format(ApiConfig.URL_FRIENDSHIPS_DESTROY, userId);
}
final SimpleResponse response = doPostIdAction(url, null, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("friendshipsDelete()---statusCode=" + statusCode + " url="
+ url);
}
final User u = User.parse(response);
if (u != null) {
u.ownerId = AppContext.getUserId();
CacheManager.put(u);
}
return u;
}
@Override
public boolean friendshipsExists(final String userA, final String userB)
throws ApiException {
if (StringHelper.isEmpty(userA) || StringHelper.isEmpty(userB)) {
throw new IllegalArgumentException(
"friendshipsExists() usera and userb must not be empty or null.");
}
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_FRIENDSHIS_EXISTS);
builder.param("user_a", userA);
builder.param("user_b", userB);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("isFriends()---statusCode=" + statusCode);
}
try {
final String content = response.getContent();
if (AppContext.DEBUG) {
log("isFriends()---response=" + content);
}
return content.contains("true");
} catch (final IOException e) {
if (AppContext.DEBUG) {
e.printStackTrace();
}
return false;
}
}
@Override
public ArrayList<String> friendsIDs(final String userId, final int count,
final int page) throws ApiException {
return ids(ApiConfig.URL_USERS_FRIENDS_IDS, userId, count, page);
}
@Override
public Context getAppContext() {
return this.mAppContext;
}
@Override
public ArrayList<Status> homeTimeline(final int count, final int page,
final String sinceId, final String maxId, final String format,
final String mode) throws ApiException {
final ArrayList<Status> ss = fetchStatuses(ApiConfig.URL_TIMELINE_HOME,
count, page, null, sinceId, maxId, format, mode,
Constants.TYPE_STATUSES_HOME_TIMELINE);
return ss;
}
// 最大2000
private ArrayList<String> ids(final String url, final String userId,
final int count, final int page) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(url);
builder.id(userId);
builder.count(count);
builder.page(page);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("ids()---statusCode=" + statusCode);
}
try {
return ApiParser.ids(response);
} catch (final IOException e) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
private void log(final String message) {
Log.d(ApiClientImpl.TAG, message);
}
@Override
public ArrayList<Status> mentions(final int count, final int page,
final String sinceId, final String maxId, final String format,
final String mode) throws ApiException {
final ArrayList<Status> ss = fetchStatuses(
ApiConfig.URL_TIMELINE_MENTIONS, count, page, null, sinceId,
maxId, format, mode, Constants.TYPE_STATUSES_MENTIONS);
return ss;
}
private ArrayList<DirectMessage> messages(final String url,
final int count, final int page, final String sinceId,
final String maxId, final String mode, final int type)
throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(url).count(count).page(page).maxId(maxId).sinceId(sinceId)
.mode(mode);
// count<=0,count>60时返回60条
// count>=0&&count<=60时返回count条
// int c=count;
// if(c<1||c>ApiConfig.MAX_COUNT){
// c=ApiConfig.MAX_COUNT;
// }
// builder.count(c);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("messages()---statusCode=" + statusCode);
}
return DirectMessage.parseMessges(response, type);
}
@Override
public ArrayList<Status> photosTimeline(final int count, final int page,
final String userId, final String sinceId, final String maxId,
final String format, final String mode) throws ApiException {
final ArrayList<Status> ss = fetchStatuses(
ApiConfig.URL_PHOTO_USER_TIMELINE, count, page, userId,
sinceId, maxId, format, mode,
Constants.TYPE_STATUSES_USER_TIMELINE);
if (AppContext.DEBUG) {
log("photosTimeline()");
}
return ss;
}
@Override
public Status photosUpload(final File photo, final String status,
final String source, final String location, final String format,
final String mode) throws ApiException {
if (photo == null) {
throw new IllegalArgumentException("文件不能为空");
}
if (AppContext.DEBUG) {
log("upload()---photo=" + photo.getAbsolutePath() + " status="
+ status + " source=" + source + " location=" + location);
}
;
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_PHOTO_UPLOAD).post();
builder.status(status).location(location);
builder.param("photo", photo);
builder.param("source", source);
builder.format(format).mode(mode);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("photoUpload()---statusCode=" + statusCode);
}
return Status.parse(response, Constants.TYPE_STATUSES_HOME_TIMELINE);
}
@Override
public ArrayList<Status> pubicTimeline(final int count,
final String format, final String mode) throws ApiException {
final ArrayList<Status> ss = fetchStatuses(
ApiConfig.URL_TIMELINE_PUBLIC, count, 0, null, null, null,
format, mode, Constants.TYPE_STATUSES_PUBLIC_TIMELINE);
return ss;
}
@Override
public ArrayList<Status> replies(final int count, final int page,
final String userId, final String sinceId, final String maxId,
final String format, final String mode) throws ApiException {
final ArrayList<Status> ss = fetchStatuses(
ApiConfig.URL_TIMELINE_REPLIES, count, page, userId, sinceId,
maxId, format, mode, Constants.TYPE_STATUSES_MENTIONS);
return ss;
}
@Override
public Search savedSearchesCreate(final String query) throws ApiException {
if (StringHelper.isEmpty(query)) {
if (AppContext.DEBUG) {
throw new IllegalArgumentException("搜索词不能为空");
}
return null;
}
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_SAVED_SEARCHES_CREATE).post();
builder.param("query", query);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("savedSearchCreate()---statusCode=" + statusCode);
}
try {
return ApiParser.savedSearch(response);
} catch (final IOException e) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
@Override
public Search savedSearchesDelete(final int id) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_SAVED_SEARCHES_DESTROY).post()
.id(String.valueOf(id));
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("savedSearchDelete()---statusCode=" + statusCode);
}
try {
return ApiParser.savedSearch(response);
} catch (final IOException e) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
@Override
public ArrayList<Search> savedSearchesList() throws ApiException {
final SimpleResponse response = fetch(new SimpleRequest.Builder().url(
ApiConfig.URL_SAVED_SEARCHES_LIST).build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("savedSearchesList()---statusCode=" + statusCode);
}
try {
return ApiParser.savedSearches(response);
} catch (final IOException e) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
@Override
public Search savedSearchesShow(final int id) throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
final SimpleResponse response = fetch(builder
.url(ApiConfig.URL_SAVED_SEARCHES_SHOW).param("id", id).build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("savedSearchShow()---statusCode=" + statusCode);
}
try {
return ApiParser.savedSearch(response);
} catch (final IOException e) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
@Override
public ArrayList<Status> search(final String keyword, final String sinceId,
final String maxId, final int count, final String format,
final String mode) throws ApiException {
if (StringHelper.isEmpty(keyword)) {
throw new IllegalArgumentException("搜索词不能为空");
}
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_SEARCH);
builder.param("q", keyword);
builder.maxId(maxId).sinceId(sinceId);
builder.format("html").mode("lite");
builder.count(count);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("search()---statusCode=" + statusCode);
}
return Status.parseStatuses(response,
Constants.TYPE_SEARCH_PUBLIC_TIMELINE);
}
@Override
public ArrayList<User> searchUsers(final String keyword, final int count,
final int page, final String mode) throws ApiException {
if (StringHelper.isEmpty(keyword)) {
if (AppContext.DEBUG) {
throw new IllegalArgumentException("搜索词不能为空");
}
return null;
}
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_SEARCH_USERS);
builder.param("q", keyword);
builder.count(count).page(page);
builder.format("html").mode("lite");
builder.count(count);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("search()---statusCode=" + statusCode);
}
return User.parseUsers(response);
}
@Override
public Status statusesCreate(final String status,
final String inReplyToStatusId, final String source,
final String location, final String repostStatusId,
final String format, final String mode) throws ApiException {
if (StringHelper.isEmpty(status)) {
throw new IllegalArgumentException("消息内容不能为空");
}
if (AppContext.DEBUG) {
log("statusUpdate() ---[status=(" + status + ") replyToStatusId="
+ inReplyToStatusId + " source=" + source + " location="
+ location + " repostStatusId=" + repostStatusId + " ]");
}
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_STATUS_UPDATE).post();
builder.status(status).location(location);
builder.format(format).mode(mode);
builder.param("in_reply_to_status_id", inReplyToStatusId);
builder.param("repost_status_id", repostStatusId);
builder.param("source", source);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("statusUpdate()---statusCode=" + statusCode);
}
final Status s = Status.parse(response,
Constants.TYPE_STATUSES_HOME_TIMELINE);
if (AppContext.DEBUG) {
log("statusesCreate " + s);
}
return s;
}
@Override
public Status statusesDelete(final String statusId, final String format,
final String mode) throws ApiException {
final String url = String
.format(ApiConfig.URL_STATUS_DESTROY, statusId);
final SimpleResponse response = doPostIdAction(url, null, format, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("statusDelete()---statusCode=" + statusCode + " url=" + url);
}
return Status.parse(response);
}
@Override
public Status statusesShow(final String statusId, final String format,
final String mode) throws ApiException {
if (StringHelper.isEmpty(statusId)) {
throw new IllegalArgumentException("消息ID不能为空");
}
if (AppContext.DEBUG) {
log("statusShow()---statusId=" + statusId);
}
final String url = String.format(ApiConfig.URL_STATUS_SHOW, statusId);
final SimpleResponse response = doGetIdAction(url, statusId, format,
mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("statusShow()---statusCode=" + statusCode);
}
final Status s = Status.parse(response);
if (s != null) {
CacheManager.put(s);
}
return s;
}
@Override
public ArrayList<Search> trends() throws ApiException {
final SimpleResponse response = fetch(new SimpleRequest.Builder().url(
ApiConfig.URL_TRENDS_LIST).build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("trends()---statusCode=" + statusCode);
}
try {
return ApiParser.trends(response);
} catch (final IOException e) {
throw new ApiException(ResponseCode.ERROR_IO_EXCEPTION,
e.getMessage());
}
}
@Override
public User updateProfile(final String description, final String name,
final String location, final String url, final String mode)
throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_ACCOUNT_UPDATE_PROFILE).post();
builder.param("description", description);
builder.param("name", name);
builder.param("location", location);
builder.param("url", url);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("updateProfile()---statusCode=" + statusCode);
}
return User.parse(response);
}
@Override
public User updateProfileImage(final File image, final String mode)
throws ApiException {
final SimpleRequest.Builder builder = new SimpleRequest.Builder();
builder.url(ApiConfig.URL_ACCOUNT_UPDATE_PROFILE_IMAGE).post();
builder.param("image", image);
final SimpleResponse response = fetch(builder.build());
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("updateProfileImage()---statusCode=" + statusCode);
}
return User.parse(response);
}
@Override
public List<User> usersFollowers(final String userId, final int count,
final int page, final String mode) throws ApiException {
final List<User> users = fetchUsers(ApiConfig.URL_USERS_FOLLOWERS,
userId, count, page);
if ((users != null) && (users.size() > 0)) {
for (final User user : users) {
user.type = Constants.TYPE_USERS_FOLLOWERS;
user.ownerId = (userId == null ? AppContext.getUserId()
: userId);
}
}
return users;
}
@Override
public ArrayList<User> usersFriends(final String userId, final int count,
final int page, final String mode) throws ApiException {
final ArrayList<User> users = fetchUsers(ApiConfig.URL_USERS_FRIENDS,
userId, count, page);
if ((users != null) && (users.size() > 0)) {
for (final User user : users) {
user.type = Constants.TYPE_USERS_FRIENDS;
user.ownerId = (userId == null ? AppContext.getUserId()
: userId);
}
}
return users;
}
@Override
public User userShow(final String userId, final String mode)
throws ApiException {
final SimpleResponse response = doGetIdAction(ApiConfig.URL_USER_SHOW,
userId, null, mode);
final int statusCode = response.statusCode;
if (AppContext.DEBUG) {
log("userShow()---statusCode=" + statusCode);
}
// handlerResponseError(response);
final User u = User.parse(response);
if (u != null) {
u.ownerId = AppContext.getUserId();
CacheManager.put(u);
}
return u;
}
@Override
public ArrayList<Status> userTimeline(final int count, final int page,
final String userId, final String sinceId, final String maxId,
final String format, final String mode) throws ApiException {
if (TextUtils.isEmpty(userId)) {
throw new NullPointerException(
"userTimeline() userId must not be empty or null.");
}
final ArrayList<Status> ss = fetchStatuses(ApiConfig.URL_TIMELINE_USER,
count, page, userId, sinceId, maxId, format, mode,
Constants.TYPE_STATUSES_USER_TIMELINE);
return ss;
}
@Override
public User verifyAccount(final String mode) throws ApiException {
final SimpleResponse response = fetch(new SimpleRequest.Builder()
.url(ApiConfig.URL_VERIFY_CREDENTIALS).mode(mode).build());
return User.parse(response);
}
}