package com.photoshare.utils.async;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import android.graphics.Bitmap;
import android.os.Bundle;
import com.photoshare.common.AbstractRequestListener;
import com.photoshare.common.XMLParser;
import com.photoshare.exception.NetworkError;
import com.photoshare.exception.NetworkException;
import com.photoshare.service.CommentHelper;
import com.photoshare.service.FindFriendHelper;
import com.photoshare.service.FollowHelper;
import com.photoshare.service.LikeHelper;
import com.photoshare.service.NewsHelper;
import com.photoshare.service.PhotoHelper;
import com.photoshare.service.SignInHelper;
import com.photoshare.service.SignUpHelper;
import com.photoshare.service.UserInfoHelper;
import com.photoshare.service.comments.CommentsGetInfoRequestParam;
import com.photoshare.service.comments.CommentsGetInfoResponseBean;
import com.photoshare.service.comments.PutCommentRequestParam;
import com.photoshare.service.findfriends.FindFriendsRequestParam;
import com.photoshare.service.findfriends.FindFriendsResponseBean;
import com.photoshare.service.follow.UserFollowRequestParam;
import com.photoshare.service.follow.UserGetFollowInfoRequestParam;
import com.photoshare.service.follow.UserGetFollowInfoResponseBean;
import com.photoshare.service.likes.LikeGetInfoRequestParam;
import com.photoshare.service.likes.LikeGetInfoResponseBean;
import com.photoshare.service.likes.PhotoLikeRequestParam;
import com.photoshare.service.news.FollowGetNewsRequestParam;
import com.photoshare.service.news.FollowGetNewsResponseBean;
import com.photoshare.service.news.UserGetNewsRequestParam;
import com.photoshare.service.news.UserGetNewsResponseBean;
import com.photoshare.service.photos.EditPhotoType;
import com.photoshare.service.photos.PhotoGetInfoRequestParam;
import com.photoshare.service.photos.PhotoGetInfoResponseBean;
import com.photoshare.service.photos.PhotoUploadRequestParam;
import com.photoshare.service.photos.PhotoUploadResponseBean;
import com.photoshare.service.photos.PhotosGetInfoRequestParam;
import com.photoshare.service.photos.PhotosGetInfoResponseBean;
import com.photoshare.service.signin.UserSignInRequestParam;
import com.photoshare.service.signin.UserSignInResponseBean;
import com.photoshare.service.signup.UserSignUpRequestParam;
import com.photoshare.service.signup.UserSignUpResponseBean;
import com.photoshare.service.users.UserEditInfoRequestParam;
import com.photoshare.service.users.UserGetInfoRequestParam;
import com.photoshare.service.users.UserGetInfoResponseBean;
import com.photoshare.service.users.UserGetOtherInfoRequestParam;
import com.photoshare.service.users.UserInfo;
import com.photoshare.service.users.UserInfoReader;
import com.photoshare.service.users.UserPrivacyRequestParam;
import com.photoshare.service.users.UserPrivacyResponseBean;
import com.photoshare.utils.RequestListener;
import com.photoshare.utils.User;
import com.photoshare.utils.UserReader;
import com.photoshare.utils.Utils;
import com.photoshare.utils.async.AsyncImageLoader.ImageCallback;
public class AsyncUtils {
/** 线程池 */
private Executor pool;
private User user = User.getInstance();
private AsyncImageLoader imageLoader = new AsyncImageLoader();
private static AsyncUtils async = new AsyncUtils();
public static AsyncUtils getInstance() {
return async;
}
private AsyncUtils() {
this.pool = Executors.newFixedThreadPool(2);
}
public void setUser(User user) {
this.user = user;
}
/**
* 异步上传照片
* */
public void publishPhoto(final String method, final byte[] photo,
final String fileName, final String description,
final String format, final RequestListener listener) {
pool.execute(new Runnable() {
public void run() {
try {
String resp = user.publishPhoto(method, photo, fileName,
description, format);
NetworkError Error = Utils.parseNetworkError(resp);
if (Error != null) {
listener.onNetworkError(Error);
} else {
listener.onComplete(resp);
}
} catch (Throwable e) {
listener.onFault(e);
}
}
});
}
/**
* 异步获取用户信息接口<br>
*
* @param param
*/
public void getUsersInfo(UserGetInfoRequestParam param,
AbstractRequestListener<UserGetInfoResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new UserInfoHelper(user).asyncGetUsersInfo(pool, param, listener);
}
public void getOthersInfo(UserGetOtherInfoRequestParam param,
AbstractRequestListener<UserGetInfoResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new UserInfoHelper(user).asyncGetOthersInfo(pool, param, listener);
}
public void getFollowsInfo(UserGetFollowInfoRequestParam param,
AbstractRequestListener<UserGetFollowInfoResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new FollowHelper(user).asyncGetFollowInfo(pool, param, listener);
}
public void getEditUserInfo(UserEditInfoRequestParam param,
AbstractRequestListener<UserGetInfoResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new UserInfoHelper(user).asyncEditUsersInfo(pool, param, listener);
}
/**
* 异步获取图片集接口
*
* @param param
* @throws NetworkException
* */
public void getPhotoInfo(PhotoGetInfoRequestParam param,
AbstractRequestListener<PhotoGetInfoResponseBean> listener)
throws NetworkException {
// checkLoggingStatus();
new PhotoHelper(user).asyncGetPhotoInfo(pool, param, listener);
}
/**
* 异步获取图片集接口
*
* @param param
* @throws NetworkException
* */
public void getPhotosInfo(PhotosGetInfoRequestParam param,
AbstractRequestListener<PhotosGetInfoResponseBean> listener)
throws NetworkException {
// checkLoggingStatus();
new PhotoHelper(user).asyncGetPhotosInfo(pool, param, listener);
}
public void getFollowNews(FollowGetNewsRequestParam param,
AbstractRequestListener<FollowGetNewsResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new NewsHelper(user).asyncGetFollowNews(pool, param, listener);
}
public void getUserNews(UserGetNewsRequestParam param,
AbstractRequestListener<UserGetNewsResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new NewsHelper(user).asyncGetUserNews(pool, param, listener);
}
/**
* 异步获取评论集接口
*
* @param param
* @throws NetworkException
* */
public void getCommentsInfo(CommentsGetInfoRequestParam param,
AbstractRequestListener<CommentsGetInfoResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new CommentHelper(user).asyncGetCommentsInfo(pool, param, listener);
}
public void getLikesInfo(LikeGetInfoRequestParam param,
AbstractRequestListener<LikeGetInfoResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new LikeHelper(user).asyncGetLikesInfo(pool, param, listener);
}
public void getFriendsInfo(FindFriendsRequestParam param,
AbstractRequestListener<FindFriendsResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new FindFriendHelper(user).asyncGetFriendsInfo(pool, param, listener);
}
public void setPrivacy(UserPrivacyRequestParam param,
AbstractRequestListener<UserPrivacyResponseBean> listener)
throws NetworkException {
checkLoggingStatus();
new UserInfoHelper(user).asyncSetPrivacy(pool, param, listener);
}
/**
* 异步上传照片
*
* @throws NetworkException
* */
public void publishPhoto(PhotoUploadRequestParam photo,
AbstractRequestListener<PhotoUploadResponseBean> listener)
throws NetworkException {
// checkLoggingStatus();
new PhotoHelper(user).asyncUploadPhoto(pool, photo, listener);
}
public void publishLikePhoto(PhotoLikeRequestParam like,
LikeHelper.ICallback mCallback) throws NetworkException {
// checkLoggingStatus();
new LikeHelper(user).publishLikePhoto(like, mCallback);
}
public void publishFollow(UserFollowRequestParam follow,
FollowHelper.ICallback mCallback) throws NetworkException {
// checkLoggingStatus();
new FollowHelper(user).publishFollow(follow, mCallback);
}
public void publishComments(PutCommentRequestParam param,
CommentHelper.ICallback mCallback) throws NetworkException {
// checkLoggingStatus();
new CommentHelper(user).publishComment(param, mCallback);
}
public void SignIn(UserSignInRequestParam param,
AbstractRequestListener<UserSignInResponseBean> listener) {
new SignInHelper(user).asyncSignIn(pool, param, listener);
}
public void SignUp(UserSignUpRequestParam param,
AbstractRequestListener<UserSignUpResponseBean> listener) {
new SignUpHelper(user).asyncSignUp(pool, param, listener);
}
public void loadDrawableFromFile(final String imageUrl,
final AsyncImageLoader.ImageCallback mCallback) {
imageLoader.loadImageFromFileUrl(pool, imageUrl, mCallback);
}
public void loadDrawableFromWeb(final String imageUrl,
final AsyncImageLoader.ImageCallback mCallback) {
imageLoader.loadImageFromWebUrl(pool, imageUrl, mCallback);
}
public void decorateImage(final EditPhotoType type, final Bitmap raw,
ImageCallback mCallback) {
imageLoader.docorateImage(pool, type, raw, mCallback);
}
public void request(final String action, final Bundle parameters,
final AbstractRequestListener<String> listener) {
AsyncRequest request = new AsyncRequest(parameters, action, listener);
pool.execute(request);
}
public void readUserInfo(final UserReader reader,
final UserInfoReader infoReader,
final AbstractRequestListener<UserInfo> listener) {
pool.execute(new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
user = reader.loadFromXML(UserReader.USER_PATH,
UserReader.USER_FILE_NAME);
UserInfo info = infoReader.loadFromXML(UserInfoReader.PATH,
UserInfoReader.FILE_NAME);
user.setUserInfo(info);
if (listener != null) {
listener.onComplete(info);
}
} catch (Exception e) {
if (listener != null) {
listener.onFault(e);
}
}
}
});
}
public void writeUserInfo(final UserReader writer,
final UserInfoReader infoWriter,
final AbstractRequestListener<UserInfo> listener) {
pool.execute(new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
writer.WriteXML(UserReader.USER_PATH,
UserReader.USER_FILE_NAME, user);
infoWriter.WriteXML(UserInfoReader.PATH,
UserInfoReader.FILE_NAME, user.getUserInfo());
if (listener != null) {
listener.onComplete(null);
}
} catch (Exception e) {
if (listener != null) {
listener.onFault(e);
}
}
}
});
}
public <Type> void readXML(final XMLParser<Type> reader, final String path,
final String file, final AbstractRequestListener<Type> listener) {
pool.execute(new Runnable() {
Type type;
public void run() {
try {
type = reader.loadFromXML(path, file);
if (listener != null) {
listener.onComplete(type);
}
} catch (Exception e) {
if (listener != null) {
listener.onFault(e);
}
}
}
});
}
public <Type> void readXMLList(final XMLParser<Type> reader,
final String path, final String file,
final AbstractRequestListener<List<Type>> listener) {
pool.execute(new Runnable() {
List<Type> list;
public void run() {
try {
list = reader.loadListFromXML(path, file);
if (listener != null) {
listener.onComplete(list);
}
} catch (Exception e) {
if (listener != null) {
listener.onFault(e);
}
}
}
});
}
public <Type> void writeXML(final XMLParser<Type> writer,
final String path, final String file, final Type obj,
final AbstractRequestListener<Type> listener) {
pool.execute(new Runnable() {
public void run() {
try {
writer.WriteXML(path, file, obj);
if (listener != null) {
listener.onComplete(obj);
}
} catch (Exception e) {
if (listener != null) {
listener.onFault(e);
}
}
}
});
}
public <Type> void writeXMLList(final XMLParser<Type> writer,
final String path, final String file, final List<Type> obj,
final AbstractRequestListener<List<Type>> listener) {
pool.execute(new Runnable() {
public void run() {
try {
writer.WriteXML(path, file, obj);
if (listener != null) {
listener.onComplete(obj);
}
} catch (Exception e) {
if (listener != null) {
listener.onFault(e);
}
}
}
});
}
private void checkLoggingStatus() throws NetworkException {
if (!user.isLogging()) {
throw new NetworkException(NetworkException.LOGGING_EXCEPTION);
}
}
private final class AsyncRequest implements Runnable {
private String resp;
private Bundle parameters;
private String action;
private AbstractRequestListener<String> listener;
public AsyncRequest(Bundle parameters, String action,
AbstractRequestListener<String> listener) {
super();
this.parameters = parameters;
this.action = action;
this.listener = listener;
}
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run() {
try {
resp = user.request(action, parameters);
if (resp != null) {
Utils.checkResponse(resp);
} else {
Utils.logger("null response");
if (listener != null) {
listener.onFault(new NetworkException(
NetworkError.ERROR_CODE_UNKNOWN_ERROR,
"null response", "null response"));
}
}
if (listener != null) {
listener.onComplete(resp);
}
} catch (RuntimeException e) {
if (listener != null) {
listener.onFault(e);
}
} catch (NetworkException e) {
listener.onNetworkError(new NetworkError(e.getMessage()));
}
}
}
}