package org.aisen.weibo.sina.support.action; import android.app.Activity; import android.view.View; import com.umeng.analytics.MobclickAgent; import org.aisen.android.common.utils.ViewUtils; import org.aisen.android.component.bitmaploader.core.LruMemoryCache; import org.aisen.android.component.orm.extra.Extra; import org.aisen.android.component.orm.utils.FieldUtils; import org.aisen.android.network.task.TaskException; import org.aisen.android.network.task.WorkTask; import org.aisen.android.support.action.IAction; import org.aisen.weibo.sina.base.AppContext; import org.aisen.weibo.sina.sinasdk.bean.StatusContent; import org.aisen.weibo.sina.support.bean.LikeBean; import org.aisen.weibo.sina.support.bean.LikeResultBean; import org.aisen.weibo.sina.support.sdk.SDK; import org.aisen.weibo.sina.support.sqlit.LikeDB; import org.aisen.weibo.sina.support.sqlit.SinaDB; import org.aisen.weibo.sina.ui.fragment.base.BizFragment; import java.util.List; /** * Created by wangdan on 15/5/1. */ public class DoLikeAction extends IAction { public static LruMemoryCache<String, LikeBean> likeCache = new LruMemoryCache<String, LikeBean>(30); BizFragment bizFragment; boolean like; StatusContent data; OnLikeCallback callback; View likeView; public DoLikeAction(Activity context, BizFragment bizFragment, View likeView, StatusContent data, boolean like, OnLikeCallback callback) { super(context, new WebLoginAction(context, bizFragment)); this.bizFragment = bizFragment; this.data = data; this.like = like; this.likeView = likeView; this.callback = callback; } @Override public void doAction() { final String key = String.valueOf(data.getId()); LikeBean likeBean = likeCache.get(key); // 如果还没有点赞过,首先添加一个点赞 if (likeBean == null) { likeBean = new LikeBean(); likeBean.setLiked(like); likeBean.setStatusId(key); LikeDB.insert(likeBean); likeCache.put(key, likeBean); } // 点赞过了,刷新内存,刷新DB else { likeBean.setLiked(like); LikeDB.insert(likeBean); } // 开始处理点赞 new LikeTask().execute(); MobclickAgent.onEvent(bizFragment.getActivity(), "do_like"); } public static void refreshLikeCache() { likeCache.evictAll(); new WorkTask<Void, Void, Void>() { @Override public Void workInBackground(Void... params) throws TaskException { String uid = AppContext.getAccount().getUser().getIdstr(); String selection = String.format(" %s = ? ", FieldUtils.OWNER); String[] args = new String[]{ uid }; List<LikeBean> likeBeans = SinaDB.getDB().select(LikeBean.class, selection, args); SinaDB.getDB().deleteAll(new Extra(uid, null), LikeBean.class); SinaDB.getDB().insert(new Extra(uid, null), likeBeans); for (LikeBean likeBean : likeBeans) likeCache.put(likeBean.getStatusId(), likeBean); return null; } }.execute(); } public interface OnLikeCallback { // 点赞失败或者成功后,有必要时会回调这个方法刷新UI void onLikeFaild(); void onLikeSuccess(StatusContent data, View likeView); } public boolean isRunning() { return mTask != null; } LikeTask mTask = null; class LikeTask extends WorkTask<Void, Void, LikeResultBean> { LikeTask() { mTask = this; } @Override public LikeResultBean workInBackground(Void... params) throws TaskException { return SDK.newInstance().doLike(data.getId() + "", like, AppContext.getAccount().getCookie()); } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); final String key = String.valueOf(data.getId()); LikeBean likeBean = likeCache.get(key); if (likeBean != null) { likeBean.setLiked(!like); LikeDB.insert(likeBean); } if (bizFragment.getActivity() == null) return; // 未登录,或者登录失效 if ("-100".equalsIgnoreCase(exception.getCode())) { AppContext.clearCookie(); run(); } else { ViewUtils.showMessage(getContext(), exception.getMessage()); } callback.onLikeFaild(); } @Override protected void onSuccess(LikeResultBean likeResultBean) { super.onSuccess(likeResultBean); final String key = String.valueOf(data.getId()); LikeBean likeBean = likeCache.get(key); likeBean.setLiked(like); LikeDB.insert(likeBean); if (bizFragment.getActivity() == null) { return; } callback.onLikeSuccess(data, likeView); } @Override protected void onFinished() { super.onFinished(); mTask = null; } } }