package com.athena.asm.fragment;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import com.actionbarsherlock.app.SherlockFragment;
import com.athena.asm.ActivityFragmentTargets;
import com.athena.asm.OnOpenActivityFragmentListener;
import com.athena.asm.R;
import com.athena.asm.aSMApplication;
import com.athena.asm.Adapter.FavoriteListAdapter;
import com.athena.asm.data.Board;
import com.athena.asm.listener.OnKeyDownListener;
import com.athena.asm.util.ListViewUtil;
import com.athena.asm.util.StringUtility;
import com.athena.asm.util.task.EditFavoriteTask;
import com.athena.asm.util.task.LoadFavoriteTask;
import com.athena.asm.viewmodel.BaseViewModel;
import com.athena.asm.viewmodel.HomeViewModel;
public class FavoriteListFragment extends SherlockFragment implements
BaseViewModel.OnViewModelChangObserver, OnKeyDownListener {
private HomeViewModel m_viewModel;
private LayoutInflater m_inflater;
private ExpandableListView m_listView;
FavoriteListAdapter m_favoriteListAdapter;
private boolean m_isLoaded;
private OnOpenActivityFragmentListener m_onOpenActivityFragmentListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
m_inflater = inflater;
View layout = m_inflater.inflate(R.layout.favorite, null);
m_listView = (ExpandableListView) layout.findViewById(R.id.favorite_list);
aSMApplication application = (aSMApplication) getActivity()
.getApplication();
m_viewModel = application.getHomeViewModel();
m_viewModel.registerViewModelChangeObserver(this);
m_isLoaded = false;
return m_listView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Activity parentActivity = getSherlockActivity();
if (parentActivity instanceof OnOpenActivityFragmentListener) {
m_onOpenActivityFragmentListener = (OnOpenActivityFragmentListener) parentActivity;
}
if (m_viewModel.getCurrentTab() != null
&& m_viewModel.getCurrentTab().equals(
StringUtility.TAB_FAVORITE)) {
reloadFavorite();
}
}
@Override
public void onDestroy() {
m_viewModel.unregisterViewModelChangeObserver(this);
super.onDestroy();
}
private void extractSubDirectory(Board board, List<Board> currentBoardList) {
for (Iterator<Board> iterator = board.getChildBoards().iterator(); iterator
.hasNext();) {
Board childBoard = iterator.next();
if (childBoard.isDirectory()) {
extractSubDirectory(childBoard, currentBoardList);
} else {
currentBoardList.add(childBoard);
}
}
}
public void reloadFavorite() {
if (m_viewModel.getFavList() == null) {
if(m_viewModel.m_isLoadingInProgress) return;
LoadFavoriteTask loadFavoriteTask = new LoadFavoriteTask(
getActivity(), m_viewModel);
loadFavoriteTask.execute();
} else {
m_isLoaded = true;
// list of directories
List<String> directoryList = new ArrayList<String>();
// list of boardlist, each boardlist is for a directory in directoryList
List<List<Board>> listOfBoardList = new ArrayList<List<Board>>();
// list of boards without parent directory, put it in special 'root' directory
List<Board> rootBoardList = new ArrayList<Board>();
// get local copy of favlist
ArrayList<Board> favList = new ArrayList<Board>();
favList.addAll(m_viewModel.getFavList());
// add faked directory for recently viewed boards
Board fakeBoard = new Board();
fakeBoard.setDirectory(true);
fakeBoard.setDirectoryName("最近访问版面");
fakeBoard.setCategoryName("目录");
favList.add(fakeBoard);
for (Iterator<Board> iterator = favList.iterator(); iterator.hasNext();) {
Board board = iterator.next();
if (board.isDirectory()) {
// directory
directoryList.add(board.getDirectoryName());
if (board.getDirectoryName().equals("最近访问版面")) {
// special directory for recently viewed boards
listOfBoardList.add(new ArrayList<Board>(
aSMApplication.getCurrentApplication().getRecentBoards()));
} else {
// normal directory, find child boards
List<Board> childBoardList = new ArrayList<Board>();
extractSubDirectory(board, childBoardList);
listOfBoardList.add(childBoardList);
}
} else {
// board without parent, add it to rootBoardList
rootBoardList.add(board);
}
}
if (listOfBoardList.size() > 0) {
// add special 'root' directory
directoryList.add(0, "我的收藏夹");
listOfBoardList.add(0, rootBoardList);
}
m_favoriteListAdapter = new FavoriteListAdapter(
m_inflater, directoryList, listOfBoardList);
m_listView.setAdapter(m_favoriteListAdapter);
// expand special 'root' directory by default
m_listView.expandGroup(0);
m_listView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent,
View view, int groupPosition, int childPosition, long id) {
Bundle bundle = new Bundle();
bundle.putSerializable(StringUtility.BOARD, (Board) view.getTag(R.id.tag_second));
aSMApplication.getCurrentApplication().addRecentBoard((Board) view
.getTag(R.id.tag_second));
if (m_onOpenActivityFragmentListener != null) {
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(ActivityFragmentTargets.SUBJECT_LIST, bundle);
}
return false;
}
});
m_listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) {
if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
// get selected board
final int groupPosition = ExpandableListView.getPackedPositionGroup(id);
final int childPosition = ExpandableListView.getPackedPositionChild(id);
List<List<Board>> m_boards = m_favoriteListAdapter.getFavoriteBoards();
final Board board = m_boards.get(groupPosition).get(childPosition);
// confirm dialog
Builder builder = new AlertDialog.Builder(getActivity());
String title = String.format("将版面\"%s\"从收藏夹中删除么?", board.getChsName());
builder.setTitle("收藏夹操作").setMessage(title);
builder.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String groupid = Integer.toString(groupPosition);
EditFavoriteTask task = new EditFavoriteTask(getActivity(), m_viewModel, groupid, board
.getEngName(), board.getBoardID(), EditFavoriteTask.FAVORITE_DELETE);
task.execute();
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog noticeDialog = builder.create();
noticeDialog.show();
return true;
}
return false;
}
});
}
}
@Override
public void onViewModelChange(BaseViewModel viewModel,
String changedPropertyName, Object... params) {
if (changedPropertyName.equals(HomeViewModel.FAVLIST_PROPERTY_NAME)) {
reloadFavorite();
} else if (changedPropertyName.equals(HomeViewModel.CURRENTTAB_PROPERTY_NAME)) {
if (!m_isLoaded && m_viewModel.getCurrentTab() != null
&& m_viewModel.getCurrentTab().equals(
StringUtility.TAB_FAVORITE)) {
reloadFavorite();
}
}
}
@Override
public boolean onKeyDown(int keyCode) {
return ListViewUtil.ScrollListViewByKey(m_listView, keyCode);
}
}