package org.aisen.weibo.sina.support.cache;
import android.os.Environment;
import org.aisen.android.common.context.GlobalContext;
import org.aisen.android.common.setting.Setting;
import org.aisen.android.common.utils.FileUtils;
import org.aisen.android.common.utils.Logger;
import org.aisen.android.network.biz.ABizLogic;
import org.aisen.android.network.biz.IResult;
import org.aisen.android.network.cache.ICacheUtility;
import org.aisen.android.network.http.Params;
import org.aisen.android.network.task.TaskException;
import org.aisen.android.network.task.WorkTask;
import org.aisen.weibo.sina.base.AppContext;
import org.aisen.weibo.sina.base.AppSettings;
import org.aisen.weibo.sina.sinasdk.bean.Favorities;
import org.aisen.weibo.sina.sinasdk.bean.Favority;
import org.aisen.weibo.sina.support.utils.CacheTimeUtils;
import java.io.File;
import java.io.Serializable;
import java.util.List;
public class FavoritesCacheUtility implements ICacheUtility {
static final String TAG = ABizLogic.TAG;
private Favorities getCache() throws Exception {
File favoritesFile = getCacheFile();
return FileUtils.readObject(favoritesFile, Favorities.class);
}
private File getCacheFile() {
File extenrnalDir = new File(GlobalContext.getInstance().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath());
Logger.v(TAG, String.format("缓存目录 = %s", extenrnalDir.getAbsolutePath()));
File favoritesFile = new File(String.format("%s%s%s-favorites.o",
extenrnalDir.getAbsolutePath(),
File.separator,
AppContext.getAccount().getUser().getIdstr()));
return favoritesFile;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public IResult findCacheData(Setting action, Params params) {
if (AppSettings.isDisableCache())
return null;
if (!AppContext.isLoggedIn())
return null;
try {
long time = System.currentTimeMillis();
Favorities favorities = getCache();
if (favorities != null) {
Logger.w(TAG, String.format("读取收藏数据,共耗时%sms", String.valueOf(System.currentTimeMillis() - time)));
favorities.setEndPaging(CacheTimeUtils.isOutofdate("Favorites", AppContext.getAccount().getUser()));
return favorities;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void addCacheData(Setting action, Params params, IResult responseObj) {
if (!AppContext.isLoggedIn())
return;
try {
int page = Integer.parseInt(params.getParameter("page"));
Favorities favorities = (Favorities) responseObj;
// 如果是第一页,就重置数据,否则,将数据添加到集合末尾
if (page > 1) {
Favorities cache = (Favorities) findCacheData(action, params);
if (cache != null) {
Favorities cacheFavorities = cache;
List<Favority> statusList = cacheFavorities.getFavorites();
statusList.addAll(favorities.getFavorites());
favorities.setFavorites(statusList);
}
}
// 加载第一页的时候,保存缓存的时间
else {
CacheTimeUtils.saveTime("Favorites", AppContext.getAccount().getUser());
}
favorities.setEndPaging(false);
favorities.setFromCache(true);
Logger.d(TAG, String.format("加载了%d条数据,总共%d条", favorities.getFavorites().size(), favorities.getTotal_number()));
long time = System.currentTimeMillis();
FileUtils.writeObject(getCacheFile(), (Serializable) responseObj);
Logger.w(TAG, String.format("保存收藏数据,共耗时%sms", String.valueOf(System.currentTimeMillis() - time)));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除一条收藏
*
* @param statudId
*/
public static void destory(String statudId) {
new WorkTask<String, Void, Void>() {
@Override
public Void workInBackground(String... params) throws TaskException {
try {
FavoritesCacheUtility cacheUtility = new FavoritesCacheUtility();
Favorities favorities = cacheUtility.getCache();
if (favorities != null) {
for (Favority favority : favorities.getFavorites()) {
if (String.valueOf(favority.getStatus().getId()).equals(params[0])) {
favorities.getFavorites().remove(favority);
int total = favorities.getTotal_number() - 1;
favorities.setTotal_number(total <= 0 ? 0 : total);
Logger.d(TAG, "删除一条收藏");
break;
}
}
}
long time = System.currentTimeMillis();
FileUtils.writeObject(cacheUtility.getCacheFile(), favorities);
Logger.w(TAG, String.format("保存收藏数据,共耗时%sms", String.valueOf(System.currentTimeMillis() - time)));
} catch (Exception e) {
}
return null;
}
}.executeOnSerialExecutor(statudId);
}
}