package org.qii.weiciyuan.ui.userinfo;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.bean.AccountBean;
import org.qii.weiciyuan.bean.FavListBean;
import org.qii.weiciyuan.bean.MessageBean;
import org.qii.weiciyuan.bean.MessageReCmtCountBean;
import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult;
import org.qii.weiciyuan.bean.android.FavouriteTimeLineData;
import org.qii.weiciyuan.bean.android.TimeLinePosition;
import org.qii.weiciyuan.dao.maintimeline.TimeLineReCmtCountDao;
import org.qii.weiciyuan.support.database.FavouriteDBTask;
import org.qii.weiciyuan.support.error.WeiboException;
import org.qii.weiciyuan.support.lib.MyAsyncTask;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.Utility;
import org.qii.weiciyuan.ui.basefragment.AbstractMessageTimeLineFragment;
import org.qii.weiciyuan.ui.browser.BrowserWeiboMsgActivity;
import org.qii.weiciyuan.ui.loader.MyFavMsgLoader;
import org.qii.weiciyuan.ui.main.LeftMenuFragment;
import org.qii.weiciyuan.ui.main.MainTimeLineActivity;
import android.app.ActionBar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.Loader;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import java.util.ArrayList;
import java.util.List;
/**
* User: qii
* Date: 12-8-18
* this class need to refactor
*/
public class MyFavListFragment extends AbstractMessageTimeLineFragment<FavListBean>
implements MainTimeLineActivity.ScrollableListFragment {
private int page = 1;
private FavListBean bean = new FavListBean();
private TimeLinePosition position;
private DBCacheTask dbTask;
private AccountBean account;
@Override
public FavListBean getList() {
return bean;
}
public static MyFavListFragment newInstance() {
MyFavListFragment fragment = new MyFavListFragment();
fragment.setArguments(new Bundle());
return fragment;
}
public MyFavListFragment() {
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// outState.putSerializable("bean", bean);
// outState.putInt("page", page);
}
// @Override
// public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// super.onCreateOptionsMenu(menu, inflater);
// inflater.inflate(R.menu.actionbar_menu_myfavlistfragment, menu);
// }
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
setHasOptionsMenu(true);
account = GlobalContext.getInstance().getAccountBean();
switch (getCurrentState(savedInstanceState)) {
case FIRST_TIME_START:
readDBCache();
break;
case SCREEN_ROTATE:
//nothing
refreshLayout(bean);
break;
case ACTIVITY_DESTROY_AND_CREATE:
readDBCache();
break;
}
if ((((MainTimeLineActivity) getActivity()).getMenuFragment()).getCurrentIndex()
== LeftMenuFragment.FAV_INDEX) {
buildActionBarAndViewPagerTitles();
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
buildActionBarAndViewPagerTitles();
}
}
public void buildActionBarAndViewPagerTitles() {
((MainTimeLineActivity) getActivity()).setCurrentFragment(this);
if (Utility.isDevicePort()) {
((MainTimeLineActivity) getActivity()).setTitle(getString(R.string.favourite));
getActivity().getActionBar().setIcon(R.drawable.ic_menu_fav);
} else {
((MainTimeLineActivity) getActivity()).setTitle(getString(R.string.favourite));
getActivity().getActionBar().setIcon(R.drawable.ic_launcher);
}
getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
getActivity().getActionBar().removeAllTabs();
}
protected void listViewItemClick(AdapterView parent, View view, int position, long id) {
startActivityForResult(
BrowserWeiboMsgActivity.newIntent(bean.getItem(position),
GlobalContext.getInstance().getSpecialToken()),
MainTimeLineActivity.REQUEST_CODE_UPDATE_MY_FAV_TIMELINE_COMMENT_REPOST_COUNT);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//use Up instead of Back to reach this fragment
if (data == null) {
return;
}
final MessageBean msg = (MessageBean) data.getParcelableExtra("msg");
if (msg != null) {
for (int i = 0; i < getList().getSize(); i++) {
if (msg.equals(getList().getItem(i))) {
MessageBean ori = getList().getItem(i);
if (ori.getComments_count() != msg.getComments_count()
|| ori.getReposts_count() != msg.getReposts_count()) {
ori.setReposts_count(msg.getReposts_count());
ori.setComments_count(msg.getComments_count());
FavouriteDBTask.asyncReplace(getList(), page, account.getUid());
getAdapter().notifyDataSetChanged();
}
break;
}
}
}
}
private void buildActionBarSubtitle() {
if (bean != null) {
int newSize = bean.getTotal_number();
String number = bean.getSize() + "/" + newSize;
// getActivity().getActionBar().setSubtitle(number);
}
}
private void readDBCache() {
if (Utility.isTaskStopped(dbTask) && getList().getSize() == 0) {
dbTask = new DBCacheTask();
dbTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
getPullToRefreshListView().setRefreshing();
loadNewMsg();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onPause() {
super.onPause();
if (!getActivity().isChangingConfigurations()) {
savePositionToDB();
}
}
@Override
protected void newMsgLoaderSuccessCallback(FavListBean newValue, Bundle loaderArgs) {
if (newValue != null && getActivity() != null && newValue.getSize() > 0) {
addNewDataWithoutRememberPosition(newValue);
buildActionBarSubtitle();
FavouriteDBTask.asyncReplace(getList(), page, account.getUid());
}
}
@Override
protected void oldMsgLoaderSuccessCallback(FavListBean newValue) {
if (newValue != null && newValue.getSize() > 0) {
getList().addOldData(newValue);
getAdapter().notifyDataSetChanged();
buildActionBarSubtitle();
page++;
FavouriteDBTask.asyncReplace(getList(), page, account.getUid());
}
}
private void addNewDataWithoutRememberPosition(FavListBean newValue) {
getList().replaceData(newValue);
getAdapter().notifyDataSetChanged();
getListView().setSelectionAfterHeaderView();
}
@Override
protected Loader<AsyncTaskLoaderResult<FavListBean>> onCreateNewMsgLoader(int id, Bundle args) {
String token = GlobalContext.getInstance().getSpecialToken();
page = 1;
return new MyFavMsgLoader(getActivity(), token, String.valueOf(page));
}
@Override
protected Loader<AsyncTaskLoaderResult<FavListBean>> onCreateOldMsgLoader(int id, Bundle args) {
String token = GlobalContext.getInstance().getSpecialToken();
return new MyFavMsgLoader(getActivity(), token, String.valueOf(page + 1));
}
@Override
public void scrollToTop() {
Utility.stopListViewScrollingAndScrollToTop(getListView());
}
@Override
protected void onListViewScrollStop() {
savePositionToPositionsCache();
}
private void savePositionToDB() {
if (position == null) {
savePositionToPositionsCache();
}
position.newMsgIds = newMsgTipBar.getValues();
FavouriteDBTask.asyncUpdatePosition(position, account.getUid());
}
private void savePositionToPositionsCache() {
position = Utility.getCurrentPositionFromListView(getListView());
}
private void setListViewPositionFromPositionsCache() {
TimeLinePosition p = position;
if (p != null) {
Utility.setListViewAdapterPosition(getListView(), p.getPosition(bean), p.top, null);
} else {
Utility.setListViewAdapterPosition(getListView(), 0, 0, null);
}
}
private class DBCacheTask
extends MyAsyncTask<Void, FavouriteTimeLineData, FavouriteTimeLineData> {
@Override
protected void onPreExecute() {
super.onPreExecute();
getPullToRefreshListView().setVisibility(View.INVISIBLE);
}
@Override
protected FavouriteTimeLineData doInBackground(Void... params) {
return FavouriteDBTask.getFavouriteMsgList(account.getUid());
}
@Override
protected void onPostExecute(FavouriteTimeLineData result) {
super.onPostExecute(result);
if (getActivity() == null) {
return;
}
getPullToRefreshListView().setVisibility(View.VISIBLE);
if (result != null) {
bean.replaceData(result.favList);
page = result.page;
position = result.position;
getAdapter().notifyDataSetChanged();
setListViewPositionFromPositionsCache();
}
refreshLayout(getList());
if (getList().getSize() == 0) {
getPullToRefreshListView().setRefreshing();
loadNewMsg();
} else {
new RefreshReCmtCountTask().executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
}
}
private class RefreshReCmtCountTask
extends MyAsyncTask<Void, List<MessageReCmtCountBean>, List<MessageReCmtCountBean>> {
List<String> msgIds;
@Override
protected void onPreExecute() {
super.onPreExecute();
msgIds = new ArrayList<String>();
List<MessageBean> msgList = getList().getItemList();
for (MessageBean msg : msgList) {
if (msg != null) {
msgIds.add(msg.getId());
}
}
}
@Override
protected List<MessageReCmtCountBean> doInBackground(Void... params) {
try {
return new TimeLineReCmtCountDao(GlobalContext.getInstance().getSpecialToken(),
msgIds).get();
} catch (WeiboException e) {
cancel(true);
}
return null;
}
@Override
protected void onPostExecute(List<MessageReCmtCountBean> value) {
super.onPostExecute(value);
if (getActivity() == null || value == null) {
return;
}
for (int i = 0; i < value.size(); i++) {
MessageBean msg = getList().getItem(i);
MessageReCmtCountBean count = value.get(i);
if (msg != null && msg.getId().equals(count.getId())) {
msg.setReposts_count(count.getReposts());
msg.setComments_count(count.getComments());
}
}
FavouriteDBTask.asyncReplace(getList(), page, account.getUid());
getAdapter().notifyDataSetChanged();
}
}
}