package org.qii.weiciyuan.ui.dm;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.bean.DMBean;
import org.qii.weiciyuan.bean.DMListBean;
import org.qii.weiciyuan.bean.UserBean;
import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult;
import org.qii.weiciyuan.dao.dm.SendDMDao;
import org.qii.weiciyuan.support.error.WeiboException;
import org.qii.weiciyuan.support.lib.MyAsyncTask;
import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshBase;
import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshListView;
import org.qii.weiciyuan.support.smileypicker.SmileyPicker;
import org.qii.weiciyuan.support.utils.AppConfig;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.SmileyPickerUtility;
import org.qii.weiciyuan.ui.adapter.DMConversationAdapter;
import org.qii.weiciyuan.ui.basefragment.AbstractTimeLineFragment;
import org.qii.weiciyuan.ui.common.QuickSendProgressFragment;
import org.qii.weiciyuan.ui.loader.DMConversationLoader;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Collections;
import java.util.Comparator;
/**
* User: qii
* Date: 12-11-15
*/
public class DMConversationListFragment extends AbstractTimeLineFragment<DMListBean> {
private UserBean userBean;
private int page = 1;
private DMListBean bean = new DMListBean();
private EditText et;
private SmileyPicker smiley;
private LinearLayout mContainer;
private ProgressBar dmProgressBar;
private Comparator<DMBean> comparator = new Comparator<DMBean>() {
@Override
public int compare(DMBean a, DMBean b) {
long aL = a.getIdLong();
long bL = b.getIdLong();
int result = 0;
if (aL > bL) {
result = -1;
} else if (aL < bL) {
result = 1;
}
return result;
}
};
@Override
public DMListBean getList() {
return bean;
}
public static DMConversationListFragment newInstance(UserBean userBean) {
DMConversationListFragment fragment = new DMConversationListFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("userBean", userBean);
fragment.setArguments(bundle);
return fragment;
}
public DMConversationListFragment() {
//empty
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("bean", bean);
outState.putParcelable("userBean", userBean);
outState.putInt("page", page);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
this.userBean = getArguments().getParcelable("userBean");
switch (getCurrentState(savedInstanceState)) {
case FIRST_TIME_START:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (getActivity() != null) {
loadNewMsg();
}
}
}, AppConfig.REFRESH_DELAYED_MILL_SECOND_TIME);
break;
case SCREEN_ROTATE:
//nothing
refreshLayout(getList());
break;
case ACTIVITY_DESTROY_AND_CREATE:
getList().addNewData((DMListBean) savedInstanceState.getParcelable("bean"));
userBean = (UserBean) savedInstanceState.getParcelable("userBean");
page = savedInstanceState.getInt("page");
getAdapter().notifyDataSetChanged();
refreshLayout(bean);
break;
}
}
@Override
protected void listViewItemClick(AdapterView parent, View view, int position, long id) {
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dmconversationlistfragment_layout, container, false);
empty = (TextView) view.findViewById(R.id.empty);
//dirty hack.....in other list, progressbar is used to indicate loading local data; but in this list,
//use a progressbar to indicate loading new data first time, maybe be refactored at 0.50 version
progressBar = new ProgressBar(getActivity());
dmProgressBar = (ProgressBar) view.findViewById(R.id.progressbar);
pullToRefreshListView = (PullToRefreshListView) view.findViewById(R.id.listView);
pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
pullToRefreshListView
.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
loadOldMsg(null);
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
loadNewMsg();
}
});
getListView().setScrollingCacheEnabled(false);
getListView().setHeaderDividersEnabled(false);
getListView().setStackFromBottom(true);
footerView = inflater.inflate(R.layout.listview_footer_layout, null);
getListView().addFooterView(footerView);
dismissFooterView();
et = (EditText) view.findViewById(R.id.content);
view.findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
send();
}
});
ImageButton emoticon = (ImageButton) view.findViewById(R.id.emoticon);
emoticon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (smiley.isShown()) {
hideSmileyPicker(true);
} else {
showSmileyPicker(SmileyPickerUtility.isKeyBoardShow(getActivity()));
}
}
});
smiley = (SmileyPicker) view.findViewById(R.id.smiley_picker);
smiley.setEditText(getActivity(), (ViewGroup) view.findViewById(R.id.root_layout), et);
mContainer = (LinearLayout) view.findViewById(R.id.container);
et.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSmileyPicker(true);
}
});
buildListAdapter();
return view;
}
private void showSmileyPicker(boolean showAnimation) {
this.smiley.show(getActivity(), showAnimation);
lockContainerHeight(SmileyPickerUtility.getAppContentHeight(getActivity()));
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.actionbar_menu_dmconversationlistfragment, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_clear:
break;
}
return super.onOptionsItemSelected(item);
}
public void hideSmileyPicker(boolean showKeyBoard) {
if (this.smiley.isShown()) {
if (showKeyBoard) {
//this time softkeyboard is hidden
LinearLayout.LayoutParams localLayoutParams = (LinearLayout.LayoutParams) this
.mContainer.getLayoutParams();
localLayoutParams.height = smiley.getTop();
localLayoutParams.weight = 0.0F;
this.smiley.hide(getActivity());
SmileyPickerUtility.showKeyBoard(et);
et.postDelayed(new Runnable() {
@Override
public void run() {
unlockContainerHeightDelayed();
}
}, 200L);
} else {
this.smiley.hide(getActivity());
unlockContainerHeightDelayed();
}
}
}
private void lockContainerHeight(int paramInt) {
LinearLayout.LayoutParams localLayoutParams = (LinearLayout.LayoutParams) this.mContainer
.getLayoutParams();
localLayoutParams.height = paramInt;
localLayoutParams.weight = 0.0F;
}
public void unlockContainerHeightDelayed() {
((LinearLayout.LayoutParams) mContainer.getLayoutParams()).weight = 1.0F;
}
private void send() {
if (TextUtils.isEmpty(et.getText().toString())) {
et.setError(getString(R.string.content_cant_be_empty));
return;
}
new QuickCommentTask().executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
protected void buildListAdapter() {
timeLineAdapter = new DMConversationAdapter(this, getList().getItemList(), getListView());
getListView().setAdapter(timeLineAdapter);
}
@Override
protected void newMsgLoaderSuccessCallback(DMListBean newValue, Bundle loaderArgs) {
dmProgressBar.setVisibility(View.INVISIBLE);
if (newValue != null && newValue.getSize() > 0 && getActivity() != null) {
getList().addNewData(newValue);
Collections.sort(getList().getItemList(), comparator);
getAdapter().notifyDataSetChanged();
getListView().setSelection(bean.getSize() - 1);
}
}
@Override
protected void oldMsgLoaderSuccessCallback(DMListBean newValue) {
if (newValue != null && newValue.getSize() > 0) {
getList().addOldData(newValue);
Collections.sort(getList().getItemList(), comparator);
getAdapter().notifyDataSetChanged();
page++;
}
}
private class QuickCommentTask extends AsyncTask<Void, Void, Boolean> {
WeiboException e;
QuickSendProgressFragment progressFragment = new QuickSendProgressFragment();
@Override
protected void onPreExecute() {
progressFragment.onCancel(new DialogInterface() {
@Override
public void cancel() {
QuickCommentTask.this.cancel(true);
}
@Override
public void dismiss() {
QuickCommentTask.this.cancel(true);
}
});
progressFragment.show(getFragmentManager(), "");
}
@Override
protected Boolean doInBackground(Void... params) {
SendDMDao dao = new SendDMDao(GlobalContext.getInstance().getSpecialToken(),
userBean.getId(), et.getText().toString());
try {
return dao.send();
} catch (WeiboException e) {
this.e = e;
cancel(true);
return false;
}
}
@Override
protected void onCancelled(Boolean commentBean) {
super.onCancelled(commentBean);
progressFragment.dismissAllowingStateLoss();
if (this.e != null) {
Toast.makeText(getActivity(), e.getError(), Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPostExecute(Boolean s) {
progressFragment.dismissAllowingStateLoss();
if (s != null) {
et.setText("");
loadNewMsg();
} else {
Toast.makeText(getActivity(), getString(R.string.send_failed), Toast.LENGTH_SHORT)
.show();
}
super.onPostExecute(s);
}
}
public boolean isSmileyPanelClosed() {
return !smiley.isShown();
}
public void closeSmileyPanel() {
hideSmileyPicker(false);
}
@Override
public void loadNewMsg() {
if (bean.getSize() == 0) {
dmProgressBar.setVisibility(View.VISIBLE);
}
getLoaderManager().destroyLoader(MIDDLE_MSG_LOADER_ID);
getLoaderManager().destroyLoader(OLD_MSG_LOADER_ID);
dismissFooterView();
getLoaderManager().restartLoader(NEW_MSG_LOADER_ID, null, msgAsyncTaskLoaderCallback);
}
@Override
protected void loadOldMsg(View view) {
getLoaderManager().destroyLoader(NEW_MSG_LOADER_ID);
getPullToRefreshListView().onRefreshComplete();
getLoaderManager().destroyLoader(MIDDLE_MSG_LOADER_ID);
getLoaderManager().restartLoader(OLD_MSG_LOADER_ID, null, msgAsyncTaskLoaderCallback);
}
@Override
protected Loader<AsyncTaskLoaderResult<DMListBean>> onCreateNewMsgLoader(int id, Bundle args) {
String token = GlobalContext.getInstance().getSpecialToken();
page = 1;
return new DMConversationLoader(getActivity(), token, userBean.getId(),
String.valueOf(page));
}
@Override
protected Loader<AsyncTaskLoaderResult<DMListBean>> onCreateOldMsgLoader(int id, Bundle args) {
String token = GlobalContext.getInstance().getSpecialToken();
return new DMConversationLoader(getActivity(), token, userBean.getId(),
String.valueOf(page + 1));
}
}