package com.athena.asm.util.task;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import com.athena.asm.data.Board;
import com.athena.asm.data.BoardNameComparator;
import com.athena.asm.viewmodel.HomeViewModel;
public class LoadCategoryTask extends AsyncTask<String, Integer, String> {
private Context m_context;
private HomeViewModel m_viewModel;
public LoadCategoryTask(Context context, HomeViewModel viewModel) {
this.m_context = context;
m_viewModel = viewModel;
}
private ProgressDialog pdialog;
@Override
protected void onPreExecute() {
pdialog = new ProgressDialog(m_context);
pdialog.setMessage("加载分类讨论区中...");
pdialog.show();
}
@SuppressWarnings("unchecked")
@Override
protected String doInBackground(String... params) {
// refactor logics to load categories:
// 1. check saved categories file
// 1.1 if it exists, load categories from it
// 1.2 if it does not exist, load categories from web, and save it to file
// 1.1 read categories from file
try {
FileInputStream is = m_context.openFileInput("CategoryList");
ObjectInputStream ois = new ObjectInputStream(is);
m_viewModel.setCategoryList((ArrayList<Board>) ois.readObject());
is.close();
Log.d("LoadCategoryTask", "succeed to load categories from file");
} catch (Exception e) {
Log.d("LoadCategoryTask", "failed to load categories from file");
// e.printStackTrace();
}
if (m_viewModel.getCategoryList() == null) {
Log.d("LoadCategoryTask", "load categories from web");
// 1.2.1 read categories from web
m_viewModel.updateCategoryList();
ArrayList<Board> categoryList = m_viewModel.getCategoryList();
// 1.2.2 sort categoryList by board's English name
Collections.sort(categoryList, new BoardNameComparator());
// 1.2.3 remove duplicated board name in a sorted list
// Log.d("Number of categories before dedup", Integer.toString(categoryList.size()));
Iterator<Board> itr = categoryList.iterator();
String previousID = null;
while (itr.hasNext()) {
Board current = (Board) itr.next();
if(previousID == null)
{
// no previous board, for the first record
previousID = current.getBoardID();
continue;
}
if(current.getBoardID().equals(previousID))
{
// duplicated board, remove current board
// Log.d("updateCategoryList", "remove duplicated board" + current.getEngName());
itr.remove();
}
else
{
// valid board, save current board id
previousID = current.getBoardID();
}
}
// Log.d("Number of categories after dedup", Integer.toString(categoryList.size()));
// 1.2.4 save categories to file
try {
FileOutputStream fos = m_context.openFileOutput("CategoryList",
Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(categoryList);
fos.close();
Log.d("LoadCategoryTask", "save categories to file for future usage");
} catch (Exception e) {
e.printStackTrace();
}
}
m_viewModel.updateBoardInfo();
pdialog.cancel();
return null;
}
@Override
protected void onPostExecute(String result) {
m_viewModel.notifyCategoryChanged();
}
}