package com.gnod.geekr.ui.activity;
import java.util.ArrayList;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.gnod.geekr.R;
import com.gnod.geekr.app.AppConfig;
import com.gnod.geekr.app.adapter.StatusDetailAdapter;
import com.gnod.geekr.holder.StatusViewHolder;
import com.gnod.geekr.model.AccountModel;
import com.gnod.geekr.model.CommentModel;
import com.gnod.geekr.model.StatusModel;
import com.gnod.geekr.tool.LaunchHelper;
import com.gnod.geekr.tool.StringUtils;
import com.gnod.geekr.tool.converter.GeekrViewConverter;
import com.gnod.geekr.tool.converter.GeekrViewConverter.IMAGE_MODEL;
import com.gnod.geekr.tool.fetcher.BaseFetcher.FetchCompleteListener;
import com.gnod.geekr.tool.fetcher.CommentFetcher;
import com.gnod.geekr.tool.fetcher.NoticeFetcher;
import com.gnod.geekr.tool.manager.AccountManager;
import com.gnod.geekr.tool.manager.StatusManager;
import com.gnod.geekr.tool.manager.Utils;
import com.gnod.geekr.widget.AvatarView;
import com.gnod.geekr.widget.ColorToast;
import com.gnod.geekr.widget.ColorToast.ToastColor;
import com.gnod.geekr.widget.ListViewFooter;
import com.gnod.geekr.widget.URLImageView;
public class StatusDetailActivity extends BaseActivity {
private static final int FETCH_COUNT = 20;
private ListView mListView;
private ArrayList<CommentModel> mList = new ArrayList<CommentModel>();
private StatusModel itemModel;
private StatusDetailAdapter mAdapter;
private CommentFetcher mFetcher;
private int position = -1;
private MenuItem refreshMenu;
private ListViewFooter footer;
private ColorToast toastTop;
private String mStatusTag;
private StatusViewHolder statusView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
mFetcher = new CommentFetcher();
Intent intent = this.getIntent();
itemModel = (StatusModel) intent.getSerializableExtra("itemModel");
position = intent.getIntExtra("Position", -1);
// Using for cache query
mStatusTag = intent.getStringExtra("StatusTag");
if (itemModel == null || itemModel.userInfo == null)
finish();
initView();
bindListener();
bindView();
}
@Override
protected void onResume() {
super.onResume();
AppConfig.sImageFetcher.setExitTasksEarly(false);
}
@Override
protected void onPause() {
super.onPause();
AppConfig.sImageFetcher.setPauseWork(false);
AppConfig.sImageFetcher.setExitTasksEarly(true);
AppConfig.sImageFetcher.flushCache();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.menu_status_detail, menu);
refreshMenu = menu.findItem(R.id.menu_detail_refresh);
setRefreshing(true);
fetchDatas(itemModel.ID);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.menu_detail_cmt:
LaunchHelper.startCommentActivity(this, itemModel);
return true;
case R.id.menu_detail_ret:
LaunchHelper.startRetweetActivity(this, itemModel);
return true;
case R.id.menu_detail_refresh:
setRefreshing(true);
footer.startLoading();
fetchDatas(itemModel.ID);
return true;
}
return super.onOptionsItemSelected(item);
}
private void initView() {
mListView = (ListView) findViewById(R.id.view_detail_list);
View header = LayoutInflater.from(this).inflate(
R.layout.listitem_detail_header, null);
footer = new ListViewFooter(this);
toastTop = (ColorToast) findViewById(R.id.view_detail_toast_top);
statusView = new StatusViewHolder();
statusView.layoutAvatar = (RelativeLayout) header
.findViewById(R.id.layout_timeline_avatar);
statusView.imageAvatar = (AvatarView) header
.findViewById(R.id.image_avatar_small);
statusView.verifiedImage = (ImageView) header
.findViewById(R.id.image_avatar_verified);
statusView.textName = (TextView) header
.findViewById(R.id.text_detailhead_name);
statusView.textContent = (TextView) header
.findViewById(R.id.text_detailhead_content);
statusView.imageThumb = (URLImageView) header
.findViewById(R.id.image_detailhead_thumb);
statusView.layoutRetweet = (LinearLayout) header
.findViewById(R.id.layout_detailhead_retweet);
statusView.textRetweetContent = (TextView) header
.findViewById(R.id.text_detailhead_retweet_content);
statusView.imageRetweetThumb = (URLImageView) header
.findViewById(R.id.image_detailhead_retweet_thumb);
statusView.textTime = (TextView) header
.findViewById(R.id.text_detailhead_time);
statusView.textSource = (TextView) header
.findViewById(R.id.text_detailhead_source);
statusView.textRetweetCount = (TextView) header
.findViewById(R.id.text_detailhead_ret_count);
statusView.textCommentCount = (TextView) header
.findViewById(R.id.text_detailhead_cmt_count);
mListView.addHeaderView(header);
mListView.addFooterView(footer);
mAdapter = new StatusDetailAdapter(this, itemModel, mList);
mListView.setAdapter(mAdapter);
}
private void bindListener() {
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
private boolean lastViewVisible = false;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
if (!Utils.hasHoneycomb()) {
AppConfig.sImageFetcher.setPauseWork(true);
}
} else {
AppConfig.sImageFetcher.setPauseWork(false);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (mList.size() == 0 || footer.isLoading())
return;
if (firstVisibleItem + visibleItemCount >= totalItemCount
&& !lastViewVisible) {
lastViewVisible = true;
if (mList.size() < Integer.parseInt(itemModel.commentCount)) {
setRefreshing(true);
footer.startLoading();
long maxId = Long.parseLong(mList.get(mList.size() - 1).ID);
mFetcher.fetchComment(itemModel.ID, 0, maxId,
FETCH_COUNT, 1, onCommentFetchListener);
}
} else if (firstVisibleItem + visibleItemCount < totalItemCount) {
lastViewVisible = false;
}
}
});
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// comment header 占据了位置 0
if (position == 0)
return;
int index = position - 1;
// 排除footer
if (index >= mList.size())
return;
CommentModel model = mList.get(index);
LaunchHelper.startReplyActivity(StatusDetailActivity.this,
model);
}
});
}
private void setRefreshing(boolean checked) {
if (refreshMenu != null) {
if (checked)
refreshMenu.setActionView(R.layout.layout_loading);
else
refreshMenu.setActionView(null);
}
}
private void bindView() {
setTitle("正文");
GeekrViewConverter.attachViewDatas(statusView, itemModel, position,
IMAGE_MODEL.BIG);
if (itemModel.retweetItem != null) {
statusView.layoutRetweet
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(
StatusDetailActivity.this,
StatusDetailActivity.class);
intent.putExtra("itemModel", itemModel.retweetItem);
startActivity(intent);
}
});
}
}
private void fetchDatas(String id) {
mFetcher.fetchStatus(id, onStatusFetchListener);
mFetcher.fetchComment(id, 0, 0, FETCH_COUNT, 1, onCommentFetchListener);
}
private FetchCompleteListener onStatusFetchListener = new FetchCompleteListener() {
@Override
public void fetchComplete(int state, int code, Object obj) {
switch (state) {
case NoticeFetcher.FETCH_AUTH_FAILED:
case NoticeFetcher.FETCH_NOT_NETWORK:
toastTop.show((String) obj, ToastColor.RED);
break;
case NoticeFetcher.FETCH_SUCCEED_NEWS:
itemModel = (StatusModel) obj;
if (position != -1 && !StringUtils.isNullOrEmpty(mStatusTag)) {
AccountModel account = AccountManager.getActivityAccount();
StatusManager.setSingleStatus(mStatusTag, account,
position, itemModel);
}
GeekrViewConverter.attachViewDatas(statusView, itemModel,
position, IMAGE_MODEL.BIG);
break;
}
}
};
private FetchCompleteListener onCommentFetchListener = new FetchCompleteListener() {
@Override
public void fetchComplete(int state, int code, Object obj) {
setRefreshing(false);
switch (state) {
case NoticeFetcher.FETCH_NOT_NETWORK:
case NoticeFetcher.FETCH_AUTH_FAILED:
toastTop.show((String) obj, ToastColor.RED);
footer.stopLoading("-FAILED-");
break;
case NoticeFetcher.FETCH_EMPTY:
footer.stopLoading("-NO COMMENTS-");
break;
case NoticeFetcher.FETCH_SUCCEED_NEWS:
ArrayList<CommentModel> result = (ArrayList<CommentModel>) obj;
if (result.size() != 0) {
mList.clear();
mList.addAll(result);
mAdapter.notifyDataSetChanged();
mListView.setSelection(0);
if (result.size() < 5) {
footer.stopLoading("-END-");
} else {
footer.stopLoading("-MORE-");
}
}
break;
case NoticeFetcher.FETCH_SUCCEED_MORE:
ArrayList<CommentModel> resultList = (ArrayList<CommentModel>) obj;
if (resultList.size() != 0) {
int lastIndex = mList.size() - 1;
mList.remove(lastIndex);
mList.addAll(resultList);
mAdapter.notifyDataSetChanged();
if (resultList.size() < 5) {
footer.stopLoading("-END-");
} else {
footer.stopLoading("-MORE-");
}
}
break;
default:
footer.stopLoading("");
break;
}
}
};
public class StatusDetailHeadView {
public AvatarView imageAvatar;
public TextView textName;
public ImageView verifiedImage;
}
public class StatusDetailContentView {
public TextView textContent;
public URLImageView imageThumb;
public LinearLayout layoutRetweet;
public TextView textRetweetContent;
public URLImageView imageRetweetThumb;
public TextView textTime;
public TextView textSource;
public TextView textRetweetCount;
public TextView textCommentCount;
}
}