package com.wenming.weiswift.mvp.model.imp; import android.content.Context; import android.text.TextUtils; import com.google.gson.Gson; import com.sina.weibo.sdk.exception.WeiboException; import com.sina.weibo.sdk.net.RequestListener; import com.wenming.weiswift.api.FriendshipsAPI; import com.wenming.weiswift.api.StatusesAPI; import com.wenming.weiswift.api.UsersAPI; import com.wenming.weiswift.entity.Status; import com.wenming.weiswift.entity.Token; import com.wenming.weiswift.entity.User; import com.wenming.weiswift.entity.list.StatusList; import com.wenming.weiswift.entity.list.TokenList; import com.wenming.weiswift.entity.list.UserList; import com.wenming.weiswift.mvp.model.UserModel; import com.wenming.weiswift.ui.common.NewFeature; import com.wenming.weiswift.ui.common.login.AccessTokenKeeper; import com.wenming.weiswift.ui.common.login.Constants; import com.wenming.weiswift.utils.NetUtil; import com.wenming.weiswift.utils.SDCardUtil; import com.wenming.weiswift.utils.ToastUtil; import java.util.ArrayList; /** * Created by wenmingvs on 16/5/14. */ public class UserModelImp implements UserModel { private ArrayList<Status> mStatusList = new ArrayList<>(); private ArrayList<User> mUsersList = new ArrayList<>(); private ArrayList<User> mUserArrayList; private OnStatusListFinishedListener mOnStatusListFinishedListener; private OnUserListRequestFinish mOnUserListRequestFinish; private OnUserDetailRequestFinish mOnUserDetailRequestFinish; private Context mContext; private int mCurrentGroup = Constants.GROUP_MYWEIBO_TYPE_ALL; private boolean mRefrshAll; private int mFollowersCursor; private int mFriendsCursor; private int mUserListType; private static final int FOLLOWERS_LISTS = 0x1; private static final int FRIENDS_LISTS = 0x2; /** * 根据用户ID获取用户信息。异步方法 * * @param uid * @param context */ @Override public void show(long uid, final Context context, final OnUserDetailRequestFinish onUserDetailRequestFinish) { UsersAPI mUsersAPI = new UsersAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnUserDetailRequestFinish = onUserDetailRequestFinish; mUsersAPI.show(uid, user_PullToRefresh); } @Override public void show(String screenName, Context context, OnUserDetailRequestFinish onUserDetailRequestFinish) { UsersAPI mUsersAPI = new UsersAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnUserDetailRequestFinish = onUserDetailRequestFinish; mUsersAPI.show(screenName, user_PullToRefresh); } /** * 根据用户ID获取用户信息。同步方法 * * @param uid * @param context * @return */ @Override public User showUserDetailSync(long uid, Context context) { UsersAPI mUsersAPI = new UsersAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; return User.parse(mUsersAPI.showSync(uid)); } /** * 获取某个用户最新发表的微博列表。 * * @param uid * @param groupId * @param context * @param onStatusFinishedListener */ @Override public void userTimeline(long uid, int groupId, Context context, OnStatusListFinishedListener onStatusFinishedListener) { StatusesAPI mStatusesAPI = new StatusesAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnStatusListFinishedListener = onStatusFinishedListener; //long sinceId = checkout(groupId); mStatusesAPI.userTimeline(uid, 0, 0, NewFeature.GET_WEIBO_NUMS, 1, false, groupId, false, statuslist_PullToRefresh); } @Override public void userTimeline(String screenName, int groupId, Context context, OnStatusListFinishedListener onStatusFinishedListener) { StatusesAPI mStatusesAPI = new StatusesAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnStatusListFinishedListener = onStatusFinishedListener; //long sinceId = checkout(groupId); mStatusesAPI.userTimeline(screenName, 0, 0, NewFeature.GET_WEIBO_NUMS, 1, false, groupId, false, statuslist_PullToRefresh); } @Override public void userPhoto(String screenName, int groupId, Context context, OnStatusListFinishedListener onStatusFinishedListener) { StatusesAPI mStatusesAPI = new StatusesAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnStatusListFinishedListener = onStatusFinishedListener; //long sinceId = checkout(groupId); mStatusesAPI.userTimeline(screenName, 0, 0, 50, 1, false, StatusesAPI.FEATURE_PICTURE, false, statuslist_PullToRefresh); } /** * 获取用户的粉丝列表(最多返回5000条数据)。 * * @param uid * @param context * @param onUserListRequestFinish */ @Override public void followers(long uid, Context context, OnUserListRequestFinish onUserListRequestFinish) { FriendshipsAPI mFriendshipsAPI = new FriendshipsAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mUserListType = FOLLOWERS_LISTS; mContext = context; mOnUserListRequestFinish = onUserListRequestFinish; mFriendshipsAPI.followers(uid, NewFeature.GET_FOLLOWER_NUM, 0, false, userlist_PullToRefresh); } /** * 获取用户的关注列表。 * * @param uid * @param context * @param onUserListRequestFinish */ @Override public void friends(long uid, Context context, OnUserListRequestFinish onUserListRequestFinish) { FriendshipsAPI mFriendshipsAPI = new FriendshipsAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mUserListType = FRIENDS_LISTS; mContext = context; mOnUserListRequestFinish = onUserListRequestFinish; mFriendshipsAPI.friends(uid, NewFeature.GET_FRIENDS_NUM, 0, false, userlist_PullToRefresh); } @Override public void userTimelineNextPage(long uid, int groupId, Context context, OnStatusListFinishedListener onStatusFinishedListener) { StatusesAPI mStatusesAPI = new StatusesAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnStatusListFinishedListener = onStatusFinishedListener; mStatusesAPI.userTimeline(uid, 0, Long.valueOf(mStatusList.get(mStatusList.size() - 1).id), NewFeature.LOADMORE_WEIBO_ITEM, 1, false, groupId, false, statuslist_NextPage); } @Override public void userTimelineNextPage(String screenName, int groupId, Context context, OnStatusListFinishedListener onStatusFinishedListener) { StatusesAPI mStatusesAPI = new StatusesAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnStatusListFinishedListener = onStatusFinishedListener; mStatusesAPI.userTimeline(screenName, 0, Long.valueOf(mStatusList.get(mStatusList.size() - 1).id), NewFeature.LOADMORE_WEIBO_ITEM, 1, false, groupId, false, statuslist_NextPage); } @Override public void userPhotoNextPage(String screenName, int groupId, Context context, OnStatusListFinishedListener onStatusFinishedListener) { StatusesAPI mStatusesAPI = new StatusesAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnStatusListFinishedListener = onStatusFinishedListener; mStatusesAPI.userTimeline(screenName, 0, Long.valueOf(mStatusList.get(mStatusList.size() - 1).id), 50, 1, false, StatusesAPI.FEATURE_PICTURE, false, statuslist_NextPage); } @Override public void followersNextPage(long uid, Context context, OnUserListRequestFinish onUserListRequestFinish) { FriendshipsAPI mFriendshipsAPI = new FriendshipsAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnUserListRequestFinish = onUserListRequestFinish; mFriendshipsAPI.followers(uid, NewFeature.LOADMORE_FOLLOWER_NUM, mFollowersCursor, false, userlist_NextPage); } @Override public void friendsNextPage(long uid, Context context, OnUserListRequestFinish onUserListRequestFinish) { FriendshipsAPI mFriendshipsAPI = new FriendshipsAPI(context, Constants.APP_KEY, AccessTokenKeeper.readAccessToken(context)); mContext = context; mOnUserListRequestFinish = onUserListRequestFinish; mFriendshipsAPI.friends(uid, NewFeature.LOADMORE_FRIENDS_NUM, mFriendsCursor, false, userlist_NextPage); } /** * 获取登录用户的详细信息 * * @param context * @param onUserListRequestFinish */ @Override public void getUserDetailList(final Context context, final OnUserListRequestFinish onUserListRequestFinish) { String jsonstring = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift", "登录列表缓存.txt"); if (jsonstring == null && AccessTokenKeeper.readAccessToken(context).isSessionValid()) { cacheCurrentOuthToken(context); } TokenList tokenList = TokenList.parse(SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift", "登录列表缓存.txt")); if (tokenList == null) { //如果本地没有缓存的话,就添加自己一个用户就好了,然后再保存到本地 return; } final ArrayList<Token> tokenArrayList = tokenList.tokenList; if (tokenArrayList == null || tokenArrayList.size() == 0) { return; } if (!NetUtil.isConnected(context)) { onUserListRequestFinish.onError("无法连接网络"); return; } new Thread(new Runnable() { @Override public void run() { mUserArrayList = new ArrayList<User>(); for (Token token : tokenArrayList) { mUserArrayList.add(showUserDetailSync(Long.valueOf(token.uid), context)); } onUserListRequestFinish.onDataFinish(mUserArrayList); } }).start(); } @Override public void deleteUserByUid(long uid, Context context, OnUserDeleteListener onUserDeleteListener) { int i = 0; for (i = 0; i < mUserArrayList.size(); i++) { if (mUserArrayList.get(i).id.equals(String.valueOf(uid))) { mUserArrayList.remove(i); i--; break; } } if (mUserArrayList.size() == 0) { onUserDeleteListener.onEmpty(); return; } if (i >= mUserArrayList.size()) { onUserDeleteListener.onError("没有找到对应的账户"); } else { onUserDeleteListener.onSuccess(mUserArrayList); } } @Override public void cacheSave_statuslist(int groupType, Context context, String response) { mCurrentGroup = groupType; switch (groupType) { case Constants.GROUP_MYWEIBO_TYPE_ALL: SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的全部微博" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt", response); break; case Constants.GROUP_MYWEIBO_TYPE_ORIGIN: SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的原创微博" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt", response); break; case Constants.GROUP_MYWEIBO_TYPE_PICWEIBO: SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的图片微博" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt", response); break; } } @Override public void cacheLoad_statuslist(int groupType, Context context, OnStatusListFinishedListener onStatusListFinishedListener) { String response = null; mCurrentGroup = groupType; switch (groupType) { case Constants.GROUP_MYWEIBO_TYPE_ALL: response = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的全部微博" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt"); break; case Constants.GROUP_MYWEIBO_TYPE_ORIGIN: response = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的原创微博" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt"); break; case Constants.GROUP_MYWEIBO_TYPE_PICWEIBO: response = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的图片微博" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt"); break; } if (response != null) { mStatusList = StatusList.parse(response).statuses; onStatusListFinishedListener.onDataFinish(mStatusList); } } @Override public void cacheSave_user(Context context, String response) { SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的基本信息" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt", response); } @Override public void cacheLoad_user(Context context, OnUserDetailRequestFinish onUserDetailRequestFinish) { String response = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的基本信息" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt"); if (response != null) { onUserDetailRequestFinish.onComplete(User.parse(response)); } } @Override public void cacheSave_userlist(int groupType, Context context, String response) { switch (groupType) { case FOLLOWERS_LISTS: SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的粉丝列表" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt", response); break; case FRIENDS_LISTS: SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的关注列表" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt", response); break; } } @Override public void cacheLoad_userlist(int groupType, Context context, OnUserListRequestFinish onUserListRequestFinish) { String response = null; mUserListType = groupType; switch (groupType) { case FOLLOWERS_LISTS: response = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的粉丝列表" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt"); break; case FRIENDS_LISTS: response = SDCardUtil.get(context, SDCardUtil.getSDCardPath() + "/weiSwift/profile", "我的关注列表" + AccessTokenKeeper.readAccessToken(context).getUid() + ".txt"); break; } if (response != null) { mUsersList = UserList.parse(response).users; mFollowersCursor = Integer.valueOf(UserList.parse(response).next_cursor); mFriendsCursor = Integer.valueOf(UserList.parse(response).next_cursor); onUserListRequestFinish.onDataFinish(mUsersList); } } public void cacheCurrentOuthToken(Context context) { String tokenString = AccessTokenKeeper.readAccessToken(context).getToken(); String expiresIn = String.valueOf(AccessTokenKeeper.readAccessToken(context).getExpiresTime()); String refresh_token = AccessTokenKeeper.readAccessToken(context).getRefreshToken(); String uid = AccessTokenKeeper.readAccessToken(context).getUid(); Token token = new Token(tokenString, expiresIn, refresh_token, uid); TokenList tokenList = new TokenList(); tokenList.tokenList.add(token); tokenList.current_uid = uid; tokenList.total_number = tokenList.tokenList.size(); Gson gson = new Gson(); SDCardUtil.put(context, SDCardUtil.getSDCardPath() + "/weiSwift/", "登录列表缓存.txt", gson.toJson(tokenList)); } /** * 用于更新sinceId和maxId的值 * * @param newGroupId * @return */ private long checkout(int newGroupId) { long sinceId = 0; if (mCurrentGroup != newGroupId) { mRefrshAll = true; } if (mStatusList.size() > 0 && mCurrentGroup == newGroupId && mRefrshAll == false) { sinceId = Long.valueOf(mStatusList.get(0).id); } if (mRefrshAll) { sinceId = 0; } mCurrentGroup = newGroupId; return sinceId; } public RequestListener statuslist_NextPage = new RequestListener() { @Override public void onComplete(String response) { if (!TextUtils.isEmpty(response)) { ArrayList<Status> temp = StatusList.parse(response).statuses; if (temp.size() == 0 || (temp != null && temp.size() == 1 && temp.get(0).id.equals(mStatusList.get(mStatusList.size() - 1).id))) { mOnStatusListFinishedListener.noMoreDate(); } else if (temp.size() > 1) { temp.remove(0); mStatusList.addAll(temp); mOnStatusListFinishedListener.onDataFinish(mStatusList); } } else { mOnStatusListFinishedListener.noMoreDate(); } } @Override public void onWeiboException(WeiboException e) { ToastUtil.showShort(mContext, e.getMessage()); mOnStatusListFinishedListener.onError(e.getMessage()); } }; public RequestListener userlist_PullToRefresh = new RequestListener() { @Override public void onComplete(String response) { ArrayList<User> temp = UserList.parse(response).users; if (temp != null && temp.size() > 0) { if (mUsersList != null) { mUsersList.clear(); } mUsersList = temp; cacheSave_userlist(mUserListType, mContext, response); mFollowersCursor = Integer.valueOf(UserList.parse(response).next_cursor); mFriendsCursor = Integer.valueOf(UserList.parse(response).next_cursor); mOnUserListRequestFinish.onDataFinish(mUsersList); } else { ToastUtil.showShort(mContext, "没有更新的内容了"); mOnUserListRequestFinish.noMoreDate(); } } @Override public void onWeiboException(WeiboException e) { ToastUtil.showShort(mContext, e.getMessage()); mOnUserListRequestFinish.onError(e.getMessage()); cacheLoad_userlist(mUserListType, mContext, mOnUserListRequestFinish); } }; public RequestListener userlist_NextPage = new RequestListener() { @Override public void onComplete(String response) { if (!TextUtils.isEmpty(response)) { ArrayList<User> temp = UserList.parse(response).users; if (temp.size() == 0 || (temp != null && temp.size() == 1 && temp.get(0).id.equals(mUsersList.get(mUsersList.size() - 1).id))) { mOnUserListRequestFinish.noMoreDate(); } else if (temp.size() > 1) { mUsersList.addAll(temp); mFollowersCursor = Integer.valueOf(UserList.parse(response).next_cursor); mFriendsCursor = Integer.valueOf(StatusList.parse(response).next_cursor); mOnUserListRequestFinish.onDataFinish(mUsersList); } } else { ToastUtil.showShort(mContext, "内容已经加载完了"); mOnUserListRequestFinish.noMoreDate(); } } @Override public void onWeiboException(WeiboException e) { ToastUtil.showShort(mContext, e.getMessage()); mOnUserListRequestFinish.onError(e.getMessage()); } }; public RequestListener statuslist_PullToRefresh = new RequestListener() { @Override public void onComplete(String response) { ArrayList<Status> temp = StatusList.parse(response).statuses; if (temp != null && temp.size() > 0) { if (mStatusList != null) { mStatusList.clear(); } mStatusList = temp; cacheSave_statuslist(mCurrentGroup, mContext, response); mOnStatusListFinishedListener.onDataFinish(mStatusList); } else { mOnStatusListFinishedListener.noMoreDate(); } } @Override public void onWeiboException(WeiboException e) { ToastUtil.showShort(mContext, e.getMessage()); mOnStatusListFinishedListener.onError(e.getMessage()); cacheLoad_statuslist(mCurrentGroup, mContext, mOnStatusListFinishedListener); } }; public RequestListener user_PullToRefresh = new RequestListener() { @Override public void onComplete(String response) { User user = User.parse(response); if (user != null) { cacheSave_user(mContext, response); mOnUserDetailRequestFinish.onComplete(user); } } @Override public void onWeiboException(WeiboException e) { ToastUtil.showShort(mContext, e.getMessage()); mOnUserDetailRequestFinish.onError(e.getMessage()); cacheLoad_user(mContext, mOnUserDetailRequestFinish); } }; }