package org.qii.weiciyuan.ui.browser;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.bean.CommentListBean;
import org.qii.weiciyuan.bean.GeoBean;
import org.qii.weiciyuan.bean.MessageBean;
import org.qii.weiciyuan.bean.RepostListBean;
import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult;
import org.qii.weiciyuan.dao.destroy.DestroyCommentDao;
import org.qii.weiciyuan.support.asyncdrawable.IWeiciyuanDrawable;
import org.qii.weiciyuan.support.asyncdrawable.MsgDetailReadWorker;
import org.qii.weiciyuan.support.asyncdrawable.TimeLineBitmapDownloader;
import org.qii.weiciyuan.support.error.WeiboException;
import org.qii.weiciyuan.support.file.FileLocationMethod;
import org.qii.weiciyuan.support.gallery.GalleryAnimationActivity;
import org.qii.weiciyuan.support.lib.AnimationRect;
import org.qii.weiciyuan.support.lib.ClickableTextViewMentionLinkOnTouchListener;
import org.qii.weiciyuan.support.lib.MyAsyncTask;
import org.qii.weiciyuan.support.lib.ProfileTopAvatarImageView;
import org.qii.weiciyuan.support.lib.SwipeFrameLayout;
import org.qii.weiciyuan.support.lib.WeiboDetailImageView;
import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshBase;
import org.qii.weiciyuan.support.lib.pulltorefresh.PullToRefreshListView;
import org.qii.weiciyuan.support.settinghelper.SettingUtility;
import org.qii.weiciyuan.support.utils.AppEventAction;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.ThemeUtility;
import org.qii.weiciyuan.support.utils.Utility;
import org.qii.weiciyuan.ui.actionmenu.CommentSingleChoiceModeListener;
import org.qii.weiciyuan.ui.actionmenu.StatusSingleChoiceModeListener;
import org.qii.weiciyuan.ui.adapter.BrowserWeiboMsgCommentAndRepostAdapter;
import org.qii.weiciyuan.ui.interfaces.AbstractAppFragment;
import org.qii.weiciyuan.ui.interfaces.IRemoveItem;
import org.qii.weiciyuan.ui.loader.CommentsByIdMsgLoader;
import org.qii.weiciyuan.ui.loader.RepostByIdMsgLoader;
import org.qii.weiciyuan.ui.userinfo.UserInfoActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.content.LocalBroadcastManager;
import android.text.Html;
import android.text.TextUtils;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
/**
* User: qii
* Date: 12-9-1
*/
public class BrowserWeiboMsgFragment extends AbstractAppFragment implements IRemoveItem {
private MessageBean msg;
private View mRootview;
private BrowserWeiboMsgLayout layout;
private UpdateMessageTask updateMsgTask;
private GetWeiboLocationInfoTask geoTask;
private MsgDetailReadWorker picTask;
private RemoveTask removeTask;
private Handler handler = new Handler();
private ListView listView;
private BrowserWeiboMsgCommentAndRepostAdapter adapter;
private CommentListBean commentList = new CommentListBean();
private RepostListBean repostList = new RepostListBean();
private TextView repostTab;
private TextView commentTab;
private static final int NEW_COMMENT_LOADER_ID = 1;
private static final int OLD_COMMENT_LOADER_ID = 2;
private static final int NEW_REPOST_LOADER_ID = 3;
private static final int OLD_REPOST_LOADER_ID = 4;
private boolean isCommentList = true;
private View progressHeader;
private TextView emptyHeader;
private View footerView;
private ActionMode actionMode;
private BroadcastReceiver sendCommentCompletedReceiver;
private BroadcastReceiver sendRepostCompletedReceiver;
private boolean canLoadOldCommentData = true;
private boolean canLoadOldRepostData = true;
private static class BrowserWeiboMsgLayout {
TextView username;
TextView content;
TextView recontent;
TextView time;
TextView location;
TextView source;
ImageView mapView;
ProfileTopAvatarImageView avatar;
WeiboDetailImageView content_pic;
GridLayout content_pic_multi;
WeiboDetailImageView repost_pic;
GridLayout repost_pic_multi;
LinearLayout repost_layout;
TextView comment_count;
TextView repost_count;
View count_layout;
}
public static BrowserWeiboMsgFragment newInstance(MessageBean msg) {
BrowserWeiboMsgFragment fragment = new BrowserWeiboMsgFragment(msg);
return fragment;
}
public BrowserWeiboMsgFragment() {
}
public BrowserWeiboMsgFragment(MessageBean msg) {
this.msg = msg;
}
private boolean hasGpsInfo() {
return (this.msg != null) && (this.msg.getGeo() != null);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// if (hasGpsInfo())
// layout.mapView.onSaveInstanceState(outState);
outState.putParcelable("msg", msg);
outState.putParcelable("commentList", commentList);
outState.putParcelable("repostList", repostList);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
switch (getCurrentState(savedInstanceState)) {
case FIRST_TIME_START:
if (Utility.isTaskStopped(updateMsgTask)) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
updateMsgTask = new UpdateMessageTask(BrowserWeiboMsgFragment.this,
layout.content, layout.recontent, msg, false);
updateMsgTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
}, 2000);
}
buildViewData(true);
loadNewCommentData();
break;
case SCREEN_ROTATE:
//nothing
buildViewData(true);
break;
case ACTIVITY_DESTROY_AND_CREATE:
msg = savedInstanceState.getParcelable("msg");
commentList.replaceAll(
(CommentListBean) savedInstanceState.getParcelable("commentList"));
repostList.replaceAll(
(RepostListBean) savedInstanceState.getParcelable("repostList"));
buildViewData(true);
adapter.notifyDataSetChanged();
if (commentList.getSize() > 0) {
emptyHeader.setVisibility(View.GONE);
}
break;
}
Loader loader = getLoaderManager().getLoader(NEW_COMMENT_LOADER_ID);
if (loader != null) {
getLoaderManager().initLoader(NEW_COMMENT_LOADER_ID, null, commentMsgCallback);
}
loader = getLoaderManager().getLoader(OLD_COMMENT_LOADER_ID);
if (loader != null) {
getLoaderManager().initLoader(OLD_COMMENT_LOADER_ID, null, commentMsgCallback);
}
}
//android has a bug,I am tired. I use another color and disable underline for link,but when I open "dont save activity" in
//developer option,click the link to open another activity, then press back,this fragment is restored,
//but the link color is restored to android own blue color,not my custom color,the underline appears
//the workaround is set textview value in onresume() method
@Override
public void onResume() {
super.onResume();
// buildViewData(false);
// if (hasGpsInfo())
// layout.mapView.onResume();
getListView().setFastScrollEnabled(SettingUtility.allowFastScroll());
sendCommentCompletedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (isCommentList) {
loadNewCommentData();
}
}
};
LocalBroadcastManager.getInstance(getActivity())
.registerReceiver(sendCommentCompletedReceiver,
new IntentFilter(
AppEventAction.buildSendCommentOrReplySuccessfullyAction(msg)));
sendRepostCompletedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!isCommentList) {
loadNewRepostData();
}
}
};
LocalBroadcastManager.getInstance(getActivity())
.registerReceiver(sendRepostCompletedReceiver,
new IntentFilter(AppEventAction.buildSendRepostSuccessfullyAction(msg)));
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getActivity())
.unregisterReceiver(sendCommentCompletedReceiver);
LocalBroadcastManager.getInstance(getActivity())
.unregisterReceiver(sendRepostCompletedReceiver);
}
@Override
public void onDestroy() {
super.onDestroy();
Utility.cancelTasks(updateMsgTask, geoTask, picTask);
layout.avatar.setImageDrawable(null);
layout.content_pic.setImageDrawable(null);
layout.repost_pic.setImageDrawable(null);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
SwipeFrameLayout swipeFrameLayout = new SwipeFrameLayout(getActivity());
PullToRefreshListView pullToRefreshListView = new PullToRefreshListView(getActivity());
pullToRefreshListView.setMode(PullToRefreshBase.Mode.DISABLED);
pullToRefreshListView.setOnLastItemVisibleListener(
onLastItemVisibleListener);
pullToRefreshListView.setOnScrollListener(listViewOnScrollListener);
listView = pullToRefreshListView.getRefreshableView();
View header = inflater.inflate(R.layout.browserweibomsgfragment_layout, listView, false);
listView.addHeaderView(header);
View switchView = inflater
.inflate(R.layout.browserweibomsgfragment_switch_list_type_header, listView, false);
listView.addHeaderView(switchView);
switchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//empty
}
});
View progressHeaderLayout = inflater
.inflate(R.layout.browserweibomsgfragment_progress_header, listView, false);
progressHeader = progressHeaderLayout.findViewById(R.id.progressbar);
progressHeader.setVisibility(View.GONE);
listView.addHeaderView(progressHeaderLayout);
View emptyLayout = inflater
.inflate(R.layout.browserweibomsgfragment_empty_header, listView, false);
emptyHeader = (TextView) emptyLayout.findViewById(R.id.empty_text);
emptyHeader.setOnClickListener(new EmptyHeaderOnClickListener());
listView.addHeaderView(emptyLayout);
footerView = inflater.inflate(R.layout.listview_footer_layout, null);
listView.addFooterView(footerView);
dismissFooterView();
repostTab = (TextView) switchView.findViewById(R.id.repost);
commentTab = (TextView) switchView.findViewById(R.id.comment);
repostTab.setOnClickListener(new RepostTabOnClickListener());
commentTab.setOnClickListener(new CommentTabOnClickListener());
commentTab.setTextColor(getResources().getColor(R.color.orange));
listView.setFooterDividersEnabled(false);
listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listView.setOnItemClickListener(commentOnItemClickListener);
listView.setOnItemLongClickListener(commentOnItemLongClickListener);
initView(header, savedInstanceState);
adapter = new BrowserWeiboMsgCommentAndRepostAdapter(this, listView,
commentList.getItemList(), repostList.getItemList());
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
listView.setHeaderDividersEnabled(false);
swipeFrameLayout.addView(pullToRefreshListView,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
return swipeFrameLayout;
}
private void initView(View view, Bundle savedInstanceState) {
layout = new BrowserWeiboMsgLayout();
layout.username = (TextView) view.findViewById(R.id.username);
layout.content = (TextView) view.findViewById(R.id.content);
layout.recontent = (TextView) view.findViewById(R.id.repost_content);
layout.time = (TextView) view.findViewById(R.id.time);
layout.location = (TextView) view.findViewById(R.id.location);
layout.source = (TextView) view.findViewById(R.id.source);
layout.mapView = (ImageView) view.findViewById(R.id.map);
layout.comment_count = (TextView) view.findViewById(R.id.comment_count);
layout.repost_count = (TextView) view.findViewById(R.id.repost_count);
layout.count_layout = view.findViewById(R.id.count_layout);
layout.avatar = (ProfileTopAvatarImageView) view.findViewById(R.id.avatar);
layout.content_pic = (WeiboDetailImageView) view.findViewById(R.id.content_pic);
layout.content_pic_multi = (GridLayout) view.findViewById(R.id.content_pic_multi);
layout.repost_pic = (WeiboDetailImageView) view.findViewById(R.id.repost_content_pic);
layout.repost_pic_multi = (GridLayout) view.findViewById(R.id.repost_content_pic_multi);
layout.repost_layout = (LinearLayout) view.findViewById(R.id.repost_layout);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
layout.location.setOnClickListener(locationInfoOnClickListener);
view.findViewById(R.id.first).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), UserInfoActivity.class);
intent.putExtra("token", GlobalContext.getInstance().getSpecialToken());
intent.putExtra("user", msg.getUser());
startActivity(intent);
}
});
layout.recontent.setOnClickListener(repostContentOnClickListener);
}
public void buildViewData(final boolean refreshPic) {
layout.avatar.checkVerified(msg.getUser());
if (msg.getUser() != null) {
if (TextUtils.isEmpty(msg.getUser().getRemark())) {
layout.username.setText(msg.getUser().getScreen_name());
} else {
layout.username.setText(
msg.getUser().getScreen_name() + "(" + msg.getUser().getRemark() + ")");
}
TimeLineBitmapDownloader.getInstance()
.downloadAvatar(layout.avatar.getImageView(), msg.getUser());
}
layout.content.setText(msg.getListViewSpannableString());
layout.content.setOnTouchListener(new ClickableTextViewMentionLinkOnTouchListener());
layout.time.setText(msg.getTimeInFormat());
if (msg.getGeo() != null) {
layout.mapView.setVisibility(View.VISIBLE);
if (Utility.isTaskStopped(geoTask)) {
geoTask = new GetWeiboLocationInfoTask(getActivity(), msg.getGeo(), layout.mapView,
layout.location);
geoTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
} else {
layout.mapView.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(msg.getSource())) {
layout.source.setText(Html.fromHtml(msg.getSource()).toString());
}
layout.content_pic.setVisibility(View.GONE);
layout.content_pic_multi.setVisibility(View.GONE);
//sina weibo official account can send repost message with picture, fuck sina weibo
if (msg.havePicture() && msg.getRetweeted_status() == null) {
displayPictures(msg, layout.content_pic_multi, layout.content_pic, refreshPic);
}
final MessageBean repostMsg = msg.getRetweeted_status();
layout.repost_layout.setVisibility(repostMsg != null ? View.VISIBLE : View.GONE);
if (repostMsg != null) {
//sina weibo official account can send repost message with picture, fuck sina weibo
layout.content_pic.setVisibility(View.GONE);
layout.repost_layout.setVisibility(View.VISIBLE);
layout.recontent.setVisibility(View.VISIBLE);
layout.recontent.setOnTouchListener(new ClickableTextViewMentionLinkOnTouchListener());
if (repostMsg.getUser() != null) {
layout.recontent.setText(repostMsg.getListViewSpannableString());
buildRepostCount();
} else {
layout.recontent.setText(repostMsg.getListViewSpannableString());
}
layout.repost_pic.setVisibility(View.GONE);
layout.repost_pic_multi.setVisibility(View.GONE);
if (repostMsg.havePicture()) {
displayPictures(repostMsg, layout.repost_pic_multi, layout.repost_pic, refreshPic);
}
}
Utility.buildTabCount(commentTab, getString(R.string.comments), msg.getComments_count());
Utility.buildTabCount(repostTab, getString(R.string.repost), msg.getReposts_count());
((BrowserWeiboMsgActivity) getActivity()).updateCommentCount(msg.getComments_count());
((BrowserWeiboMsgActivity) getActivity()).updateRepostCount(msg.getReposts_count());
}
private void displayPictures(final MessageBean msg, final GridLayout layout,
WeiboDetailImageView view, boolean refreshPic) {
if (!msg.isMultiPics()) {
view.setVisibility(View.VISIBLE);
if (Utility.isTaskStopped(picTask) && refreshPic) {
picTask = new MsgDetailReadWorker(view, msg);
picTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
} else {
picTask.setView(view);
}
} else {
layout.setVisibility(View.VISIBLE);
final int count = msg.getPicCount();
for (int i = 0; i < count; i++) {
final IWeiciyuanDrawable pic = (IWeiciyuanDrawable) layout.getChildAt(i);
pic.setVisibility(View.VISIBLE);
if (SettingUtility.getEnableBigPic()) {
TimeLineBitmapDownloader.getInstance()
.displayMultiPicture(pic, msg.getHighPicUrls().get(i),
FileLocationMethod.picture_large);
} else {
TimeLineBitmapDownloader.getInstance()
.displayMultiPicture(pic, msg.getMiddlePicUrls().get(i),
FileLocationMethod.picture_bmiddle);
}
final int finalI = i;
pic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<AnimationRect> animationRectArrayList
= new ArrayList<AnimationRect>();
for (int i = 0; i < count; i++) {
final IWeiciyuanDrawable pic = (IWeiciyuanDrawable) layout
.getChildAt(i);
ImageView imageView = (ImageView) pic;
if (imageView.getVisibility() == View.VISIBLE) {
AnimationRect rect = AnimationRect.buildFromImageView(imageView);
animationRectArrayList.add(rect);
}
}
Intent intent = GalleryAnimationActivity
.newIntent(msg, animationRectArrayList, finalI);
getActivity().startActivity(intent);
}
});
}
if (count < 9) {
for (int i = count; i < 9; i++) {
ImageView pic = (ImageView) layout.getChildAt(i);
pic.setVisibility(View.GONE);
}
}
}
}
private void buildRepostCount() {
MessageBean repostBean = msg.getRetweeted_status();
if (repostBean.getComments_count() == 0 && repostBean.getReposts_count() == 0) {
layout.count_layout.setVisibility(View.GONE);
return;
} else {
layout.count_layout.setVisibility(View.VISIBLE);
}
if (repostBean.getComments_count() > 0) {
layout.comment_count.setVisibility(View.VISIBLE);
layout.comment_count.setText(String.valueOf(repostBean.getComments_count()));
} else {
layout.comment_count.setVisibility(View.GONE);
}
if (repostBean.getReposts_count() > 0) {
layout.repost_count.setVisibility(View.VISIBLE);
layout.repost_count.setText(String.valueOf(repostBean.getReposts_count()));
} else {
layout.repost_count.setVisibility(View.GONE);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
if (Utility.isTaskStopped(updateMsgTask)) {
updateMsgTask = new UpdateMessageTask(BrowserWeiboMsgFragment.this,
layout.content, layout.recontent, msg, true);
updateMsgTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
if (isCommentList) {
loadNewCommentData();
} else {
loadNewRepostData();
}
break;
}
return true;
}
protected void showFooterView() {
View view = footerView.findViewById(R.id.loading_progressbar);
view.setVisibility(View.VISIBLE);
view.setScaleX(1.0f);
view.setScaleY(1.0f);
view.setAlpha(1.0f);
footerView.findViewById(R.id.laod_failed).setVisibility(View.GONE);
}
protected void dismissFooterView() {
final View progressbar = footerView.findViewById(R.id.loading_progressbar);
progressbar.animate().scaleX(0).scaleY(0).alpha(0.5f).setDuration(300)
.withEndAction(new Runnable() {
@Override
public void run() {
progressbar.setVisibility(View.GONE);
}
});
footerView.findViewById(R.id.laod_failed).setVisibility(View.GONE);
}
protected void showErrorFooterView() {
View view = footerView.findViewById(R.id.loading_progressbar);
view.setVisibility(View.GONE);
TextView tv = ((TextView) footerView.findViewById(R.id.laod_failed));
tv.setVisibility(View.VISIBLE);
}
public void clearActionMode() {
if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
if (getListView() != null && getListView().getCheckedItemCount() > 0) {
getListView().clearChoices();
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}
//only can remove comment
@Override
public void removeItem(int position) {
clearActionMode();
if (!isCommentList) {
return;
}
if (removeTask == null || removeTask.getStatus() == MyAsyncTask.Status.FINISHED) {
removeTask = new RemoveTask(GlobalContext.getInstance().getSpecialToken(),
commentList.getItemList().get(position).getId(), position);
removeTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
}
@Override
public void removeCancel() {
clearActionMode();
}
private ListView getListView() {
return listView;
}
public void setActionMode(ActionMode mActionMode) {
this.actionMode = mActionMode;
}
public boolean hasActionMode() {
return actionMode != null;
}
private boolean resetActionMode() {
if (actionMode != null) {
getListView().clearChoices();
actionMode.finish();
actionMode = null;
return true;
} else {
return false;
}
}
private View.OnClickListener repostContentOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
//This condition will satisfy only when it is not an autolinked text
//onClick action
boolean isNotLink = layout.recontent.getSelectionStart() == -1
&& layout.recontent.getSelectionEnd() == -1;
boolean isDeleted = msg.getRetweeted_status() == null
|| msg.getRetweeted_status().getUser() == null;
if (isNotLink && !isDeleted) {
startActivity(BrowserWeiboMsgActivity
.newIntent(msg.getRetweeted_status(),
GlobalContext.getInstance().getSpecialToken()));
} else if (isNotLink && isDeleted) {
Toast.makeText(getActivity(), getString(R.string.cant_open_deleted_weibo),
Toast.LENGTH_SHORT).show();
}
}
};
private View.OnClickListener locationInfoOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
GeoBean bean = msg.getGeo();
String geoUriString = "geo:" + bean.getLat() + "," + bean.getLon() + "?q="
+ layout.location.getText();
Uri geoUri = Uri.parse(geoUriString);
Intent mapCall = new Intent(Intent.ACTION_VIEW, geoUri);
if (Utility.isIntentSafe(getActivity(), mapCall)) {
startActivity(mapCall);
} else {
Toast.makeText(getActivity(),
R.string.your_device_dont_have_any_map_app_to_open_gps_info,
Toast.LENGTH_SHORT).show();
}
}
};
private AdapterView.OnItemLongClickListener repostOnItemLongClickListener
= new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (position - getListView().getHeaderViewsCount() < repostList.getSize()
&& position - getListView().getHeaderViewsCount() >= 0
&& adapter.getItem(position - getListView().getHeaderViewsCount()) != null) {
MessageBean msg = repostList.getItemList()
.get(position - getListView().getHeaderViewsCount());
StatusSingleChoiceModeListener choiceModeListener
= new StatusSingleChoiceModeListener(getListView(), adapter,
BrowserWeiboMsgFragment.this, msg);
if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
getListView().setItemChecked(position, true);
adapter.notifyDataSetChanged();
actionMode = getActivity().startActionMode(choiceModeListener);
return true;
}
return false;
}
};
private AdapterView.OnItemLongClickListener commentOnItemLongClickListener
= new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (position - listView.getHeaderViewsCount() < commentList.getSize()
&& position - listView.getHeaderViewsCount() >= 0) {
if (actionMode != null) {
actionMode.finish();
actionMode = null;
getListView().setItemChecked(position, true);
adapter.notifyDataSetChanged();
actionMode = getActivity().startActionMode(
new CommentSingleChoiceModeListener(getListView(), adapter,
BrowserWeiboMsgFragment.this, commentList.getItemList()
.get(position - listView.getHeaderViewsCount())));
return true;
} else {
getListView().setItemChecked(position, true);
adapter.notifyDataSetChanged();
actionMode = getActivity().startActionMode(
new CommentSingleChoiceModeListener(getListView(), adapter,
BrowserWeiboMsgFragment.this, commentList.getItemList()
.get(position - listView.getHeaderViewsCount())));
return true;
}
}
return false;
}
};
private AdapterView.OnItemClickListener repostOnItemClickListener
= new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (resetActionMode()) {
return;
}
getListView().clearChoices();
if (position - listView.getHeaderViewsCount() < repostList.getSize()
&& position >= listView.getHeaderViewsCount()) {
startActivity(BrowserWeiboMsgActivity.newIntent(
repostList.getItemList().get(position - listView.getHeaderViewsCount()),
GlobalContext.getInstance().getSpecialToken()));
} else {
loadOldRepostData();
}
}
};
private AdapterView.OnItemClickListener commentOnItemClickListener
= new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (resetActionMode()) {
return;
}
getListView().clearChoices();
if (position - listView.getHeaderViewsCount() < commentList.getSize()) {
// Intent intent = new Intent(getActivity(), BrowserWeiboMsgActivity.class);
// intent.putExtra("msg", repostList.getItemList().get(position - listView.getHeaderViewsCount()));
// intent.putExtra("token", GlobalContext.getInstance().getSpecialToken());
// startActivity(intent);
} else {
loadOldCommentData();
}
}
};
private PullToRefreshBase.OnLastItemVisibleListener onLastItemVisibleListener
= new PullToRefreshBase.OnLastItemVisibleListener() {
@Override
public void onLastItemVisible() {
if (isCommentList) {
if (msg.getComments_count() > 0 && commentList.getSize() > 0) {
loadOldCommentData();
}
} else {
if (msg.getReposts_count() > 0 && repostList.getSize() > 0) {
loadOldRepostData();
}
}
}
};
private AbsListView.OnScrollListener listViewOnScrollListener
= new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (hasActionMode()) {
int position = getListView().getCheckedItemPosition();
if (getListView().getFirstVisiblePosition() > position
|| getListView().getLastVisiblePosition() < position) {
clearActionMode();
}
}
if (getListView().getLastVisiblePosition() > 7
&& getListView().getFirstVisiblePosition() != getListView()
.getHeaderViewsCount()) {
if (isCommentList) {
if (getListView().getLastVisiblePosition() > commentList.getSize() - 3) {
loadOldCommentData();
}
} else {
if (getListView().getLastVisiblePosition() > repostList.getSize() - 3) {
loadOldRepostData();
}
}
}
}
};
private class EmptyHeaderOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
if (isCommentList) {
loadNewCommentData();
} else {
loadNewRepostData();
}
}
}
private class RepostTabOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
listView.setOnItemClickListener(repostOnItemClickListener);
listView.setOnItemLongClickListener(repostOnItemLongClickListener);
emptyHeader.setText(R.string.repost_is_empty);
resetActionMode();
dismissFooterView();
if (isCommentList) {
isCommentList = false;
adapter.switchToRepostType();
repostTab.setTextColor(ThemeUtility.getColor(
R.attr.browser_weibo_detail_comments_reposts_category_color_selected));
commentTab.setTextColor(ThemeUtility.getColor(
R.attr.browser_weibo_detail_comments_reposts_category_color_unselected));
if (repostList.getSize() == 0) {
loadNewRepostData();
} else {
Loader loader = getLoaderManager().getLoader(NEW_REPOST_LOADER_ID);
if (loader != null) {
progressHeader.setVisibility(View.VISIBLE);
} else {
progressHeader.setVisibility(View.GONE);
}
}
} else {
loadNewRepostData();
}
if (repostList.getSize() > 0) {
emptyHeader.setVisibility(View.GONE);
} else {
emptyHeader.setVisibility(View.VISIBLE);
}
}
}
private class CommentTabOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
listView.setOnItemClickListener(commentOnItemClickListener);
listView.setOnItemLongClickListener(commentOnItemLongClickListener);
emptyHeader.setText(R.string.comment_is_empty);
resetActionMode();
dismissFooterView();
if (!isCommentList) {
isCommentList = true;
adapter.switchToCommentType();
commentTab.setTextColor(ThemeUtility.getColor(
R.attr.browser_weibo_detail_comments_reposts_category_color_selected));
repostTab.setTextColor(ThemeUtility.getColor(
R.attr.browser_weibo_detail_comments_reposts_category_color_unselected));
if (commentList.getSize() == 0) {
loadNewCommentData();
} else {
Loader loader = getLoaderManager().getLoader(NEW_COMMENT_LOADER_ID);
if (loader != null) {
progressHeader.setVisibility(View.VISIBLE);
} else {
progressHeader.setVisibility(View.GONE);
}
}
} else {
loadNewCommentData();
}
if (commentList.getSize() > 0) {
emptyHeader.setVisibility(View.GONE);
} else {
emptyHeader.setVisibility(View.VISIBLE);
}
}
}
public void loadNewCommentData() {
canLoadOldCommentData = true;
if (getLoaderManager().getLoader(NEW_COMMENT_LOADER_ID) != null) {
return;
}
progressHeader.setVisibility(View.VISIBLE);
getLoaderManager().destroyLoader(OLD_COMMENT_LOADER_ID);
getLoaderManager().restartLoader(NEW_COMMENT_LOADER_ID, null, commentMsgCallback);
}
public void loadNewRepostData() {
canLoadOldRepostData = true;
if (getLoaderManager().getLoader(NEW_REPOST_LOADER_ID) != null) {
return;
}
progressHeader.setVisibility(View.VISIBLE);
getLoaderManager().destroyLoader(OLD_REPOST_LOADER_ID);
getLoaderManager().restartLoader(NEW_REPOST_LOADER_ID, null, repostMsgCallback);
}
public void loadOldCommentData() {
if (getLoaderManager().getLoader(OLD_COMMENT_LOADER_ID) != null || !canLoadOldCommentData) {
return;
}
showFooterView();
getLoaderManager().destroyLoader(NEW_COMMENT_LOADER_ID);
getLoaderManager().restartLoader(OLD_COMMENT_LOADER_ID, null, commentMsgCallback);
}
public void loadOldRepostData() {
if (getLoaderManager().getLoader(OLD_REPOST_LOADER_ID) != null
|| !canLoadOldRepostData) {
return;
}
showFooterView();
getLoaderManager().destroyLoader(NEW_REPOST_LOADER_ID);
getLoaderManager().restartLoader(OLD_REPOST_LOADER_ID, null, repostMsgCallback);
}
protected LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<CommentListBean>>
commentMsgCallback
= new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<CommentListBean>>() {
@Override
public Loader<AsyncTaskLoaderResult<CommentListBean>> onCreateLoader(int id, Bundle args) {
String token = GlobalContext.getInstance().getSpecialToken();
switch (id) {
case NEW_COMMENT_LOADER_ID:
String sinceId = null;
return new CommentsByIdMsgLoader(getActivity(), msg.getId(), token, sinceId,
null);
case OLD_COMMENT_LOADER_ID:
String maxId = null;
if (commentList.getItemList().size() > 0) {
maxId = commentList.getItemList().get(commentList.getItemList().size() - 1)
.getId();
}
return new CommentsByIdMsgLoader(getActivity(), msg.getId(), token, null,
maxId);
}
return null;
}
@Override
public void onLoadFinished(Loader<AsyncTaskLoaderResult<CommentListBean>> loader,
AsyncTaskLoaderResult<CommentListBean> result) {
CommentListBean data = result != null ? result.data : null;
WeiboException exception = result != null ? result.exception : null;
Bundle args = result != null ? result.args : null;
if (data != null) {
Utility.buildTabCount(commentTab, getString(R.string.comments),
data.getTotal_number());
((BrowserWeiboMsgActivity) getActivity())
.updateCommentCount(data.getTotal_number());
}
switch (loader.getId()) {
case NEW_COMMENT_LOADER_ID:
if (isCommentList) {
progressHeader.setVisibility(View.GONE);
}
if (Utility.isAllNotNull(exception)) {
Toast.makeText(getActivity(), exception.getError(), Toast.LENGTH_SHORT)
.show();
} else {
if (data != null && data.getSize() > 0) {
commentList.replaceAll(data);
adapter.notifyDataSetChanged();
}
if (commentList.getSize() > 0 && isCommentList) {
emptyHeader.setVisibility(View.GONE);
} else if (isCommentList) {
emptyHeader.setVisibility(View.VISIBLE);
}
}
break;
case OLD_COMMENT_LOADER_ID:
if (Utility.isAllNotNull(exception)) {
Toast.makeText(getActivity(), exception.getError(), Toast.LENGTH_SHORT)
.show();
showErrorFooterView();
} else {
if (data != null && data.getSize() <= 1) {
canLoadOldCommentData = false;
} else {
canLoadOldCommentData = true;
}
dismissFooterView();
commentList.addOldData(data);
adapter.notifyDataSetChanged();
}
break;
}
getLoaderManager().destroyLoader(loader.getId());
}
@Override
public void onLoaderReset(Loader<AsyncTaskLoaderResult<CommentListBean>> loader) {
}
};
protected LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<RepostListBean>> repostMsgCallback
= new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<RepostListBean>>() {
@Override
public Loader<AsyncTaskLoaderResult<RepostListBean>> onCreateLoader(int id, Bundle args) {
String token = GlobalContext.getInstance().getSpecialToken();
switch (id) {
case NEW_REPOST_LOADER_ID:
String sinceId = null;
return new RepostByIdMsgLoader(getActivity(), msg.getId(), token, sinceId,
null);
case OLD_REPOST_LOADER_ID:
String maxId = null;
if (repostList.getSize() > 0) {
maxId = repostList.getItemList().get(repostList.getSize() - 1).getId();
}
return new RepostByIdMsgLoader(getActivity(), msg.getId(), token, null, maxId);
}
return null;
}
@Override
public void onLoadFinished(Loader<AsyncTaskLoaderResult<RepostListBean>> loader,
AsyncTaskLoaderResult<RepostListBean> result) {
RepostListBean data = result != null ? result.data : null;
WeiboException exception = result != null ? result.exception : null;
Bundle args = result != null ? result.args : null;
if (data != null) {
Utility.buildTabCount(repostTab, getString(R.string.repost),
data.getTotal_number());
((BrowserWeiboMsgActivity) getActivity()).updateRepostCount(data.getTotal_number());
}
switch (loader.getId()) {
case NEW_REPOST_LOADER_ID:
if (!isCommentList) {
progressHeader.setVisibility(View.GONE);
}
if (Utility.isAllNotNull(exception)) {
Toast.makeText(getActivity(), exception.getError(), Toast.LENGTH_SHORT)
.show();
} else {
if (data != null && data.getSize() > 0) {
repostList.replaceAll(data);
adapter.notifyDataSetChanged();
}
if (repostList.getSize() > 0 && !isCommentList) {
emptyHeader.setVisibility(View.GONE);
} else if (!isCommentList) {
emptyHeader.setVisibility(View.VISIBLE);
}
}
break;
case OLD_REPOST_LOADER_ID:
if (Utility.isAllNotNull(exception)) {
Toast.makeText(getActivity(), exception.getError(), Toast.LENGTH_SHORT)
.show();
showErrorFooterView();
} else {
if (data != null && data.getSize() <= 1) {
canLoadOldRepostData = false;
} else {
canLoadOldRepostData = true;
}
dismissFooterView();
repostList.addOldData(data);
adapter.notifyDataSetChanged();
}
break;
}
getLoaderManager().destroyLoader(loader.getId());
}
@Override
public void onLoaderReset(Loader<AsyncTaskLoaderResult<RepostListBean>> loader) {
}
};
class RemoveTask extends MyAsyncTask<Void, Void, Boolean> {
String token;
String id;
int positon;
WeiboException e;
public RemoveTask(String token, String id, int positon) {
this.token = token;
this.id = id;
this.positon = positon;
}
@Override
protected Boolean doInBackground(Void... params) {
DestroyCommentDao dao = new DestroyCommentDao(token, id);
try {
return dao.destroy();
} catch (WeiboException e) {
this.e = e;
cancel(true);
return false;
}
}
@Override
protected void onCancelled(Boolean aBoolean) {
super.onCancelled(aBoolean);
if (Utility.isAllNotNull(getActivity(), this.e)) {
Toast.makeText(getActivity(), e.getError(), Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (aBoolean) {
adapter.removeCommentItem(positon);
}
}
}
}