package com.aiyou.bbs;
import java.util.ArrayList;
import java.util.List;
import com.aiyou.BaseActivity;
import com.aiyou.R;
import com.aiyou.bbs.adapter.TreeViewAdapter;
import com.aiyou.bbs.adapter.TreeViewAdapter.SelectFavoriteListener;
import com.aiyou.bbs.bean.Board;
import com.aiyou.bbs.bean.Favorite;
import com.aiyou.bbs.bean.Section;
import com.aiyou.bbs.utils.BBSManager;
import com.aiyou.bbs.utils.TreeElement;
import com.aiyou.utils.ActivityFunc;
import com.aiyou.utils.JsonHelper;
import com.aiyou.utils.NetWorkManager;
import com.aiyou.utils.SwitchManager;
import com.aiyou.utils.thread.ThreadUtils;
import external.PullToRefresh.PullToRefreshBase;
import external.PullToRefresh.PullToRefreshListView;
import external.PullToRefresh.PullToRefreshBase.Mode;
import external.PullToRefresh.PullToRefreshBase.OnRefreshListener2;
import external.shimmer.Shimmer;
import external.shimmer.ShimmerTextView;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
/**
* 分区列表
*
* @author sollian
*/
public class BBSSectionActivity extends BaseActivity implements
OnItemClickListener, OnRefreshListener2<ListView>, SelectFavoriteListener {
public static List<TreeElement> mTreeListElements = new ArrayList<>();
public static final String KEY_NAME = "name";
public static final String KEY_DESC = "desc";
private static final int MSG_GET_SECTION = 0;
private static final int MSG_FAVORITE = 1;
private static final int MSG_ERROR = -1;
private static final String KEY_DATA = "data";
protected static final String KEY_INFO = "info";
private TreeViewAdapter mAdapter;
private int mSectionPostion = 0;
/**
* 用户id扫光特效
*/
private Shimmer mShimmer;
/**
* 控件
*/
private PullToRefreshListView mPTRListView;
private ListView mListView;
private Handler mHandler = new Handler(new Handler.Callback() {
public boolean handleMessage(Message msg) {
if (MSG_GET_SECTION == msg.what) {
Bundle data = msg.getData();
Section section = (Section) data.getSerializable(KEY_DATA);
data.clear();
updateTreeElements(section);
} else if (msg.what == MSG_FAVORITE) {
Bundle data = msg.getData();
String strJson = data.getString(KEY_DATA);
String strInfo = data.getString(KEY_INFO);
data.clear();
Favorite.mFavorite = new Favorite(strJson);
mAdapter.notifyDataSetChanged();
if (!TextUtils.isEmpty(strInfo)) {
Toast.makeText(getBaseContext(), strInfo, Toast.LENGTH_SHORT)
.show();
}
} else if (MSG_ERROR == msg.what) {
mAdapter.notifyDataSetChanged();
Bundle data = msg.getData();
String strError = data.getString(KEY_DATA);
data.clear();
if (TextUtils.isEmpty(strError)) {
strError = NetWorkManager.MSG_NONET;
}
Toast.makeText(getBaseContext(), strError, Toast.LENGTH_SHORT)
.show();
if (Build.VERSION.SDK_INT > 11) {
/**
* 停止扫光
*/
if (null != mShimmer && mShimmer.isAnimating()) {
mShimmer.cancel();
}
}
mListView.setEnabled(true);
}
return true;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (SwitchManager.getInstance(getBaseContext()).isNightModeEnabled()) {
// 夜间模式
this.setTheme(R.style.ThemeNight);
} else {
// 日间模式
this.setTheme(R.style.ThemeDay);
}
setContentView(R.layout.activity_bbs_section);
init();
}
@SuppressWarnings("deprecation")
private void init() {
/**
* 设置背景
*/
LinearLayout ll = (LinearLayout) findViewById(R.id.activity_bbssection_ll_section);
Bitmap bmp = getIntent().getParcelableExtra(ActivityFunc.KEY_BACKGROUND);
if (null != bmp) {
Drawable drawable = new BitmapDrawable(bmp);
ll.setBackgroundDrawable(drawable);
} else {
if (SwitchManager.getInstance(getBaseContext()).isNightModeEnabled()) {
ll.setBackgroundColor(getResources().getColor(
R.color.bbs_background_night));
} else {
ll.setBackgroundColor(getResources().getColor(
R.color.bbs_background_day));
}
}
/**
* 列表
*/
mPTRListView = (PullToRefreshListView) findViewById(R.id.activity_bbssection_lv_section);
mPTRListView.setOnRefreshListener(this);
mPTRListView.setShowIndicator(false);
mListView = mPTRListView.getRefreshableView();
// 隐藏footer、header
hideHeaderFooter();
/**
* list适配器
*/
if (mTreeListElements.isEmpty()) {
BBSManager.initTreeViewData(getBaseContext(), mTreeListElements);
}
mAdapter = new TreeViewAdapter(this, mTreeListElements, this);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
if (!mTreeListElements.get(position - 1).mIsSection) {
/**
* 选择一个版面浏览后禁用lv,防止逻辑混乱
*/
mListView.setEnabled(false);
// 获取版面name,返回给BBSListActivity
TreeElement element = (TreeElement) parent
.getItemAtPosition(position);
/**
* 设置返回数据
*/
// 使用Intent返回数据
Intent intent = new Intent();
// 把返回数据存入Intent
intent.putExtra(KEY_NAME, element.mName);
intent.putExtra(KEY_DESC, element.mDesc);
// 设置返回数据
setResult(RESULT_OK, intent);
selfFinish(null);
return;
}
// 修正position
position = position - 1;
if (mTreeListElements.get(position).mIsExpanded) {
mTreeListElements.get(position).mIsExpanded = false;
TreeElement element = mTreeListElements.get(position);
ArrayList<TreeElement> temp = new ArrayList<>();
int len = mTreeListElements.size();
for (int i = position + 1; i < len; i++) {
if (element.mLevel >= mTreeListElements.get(i).mLevel) {
break;
}
temp.add(mTreeListElements.get(i));
}
mTreeListElements.removeAll(temp);
mAdapter.notifyDataSetChanged();
} else {
TreeElement tempElement = mTreeListElements.get(position);
tempElement.mIsExpanded = true;
mSectionPostion = position;
if (tempElement.mHasChild) {
updateTreeElements(null);
} else {
/**
* 禁用listview
*/
mListView.setEnabled(false);
if (Build.VERSION.SDK_INT > 11) {
ShimmerTextView shtv = (ShimmerTextView) view
.findViewById(R.id.list_item_treeview_shtv);
/**
* 开启扫光
*/
if (null != mShimmer && mShimmer.isAnimating()) {
mShimmer.cancel();
}
mShimmer = new Shimmer();
mShimmer.setDuration(800);
mShimmer.start(shtv);
}
/**
* 开启获取section线程
*/
threadSection(tempElement.mName);
}
}
}
private void threadSection(final String section) {
if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) {
if (null != mHandler) {
mHandler.sendEmptyMessage(MSG_ERROR);
}
return;
}
ThreadUtils.execute(new Runnable() {
@Override
public void run() {
String strJson = Section.getSection(BBSSectionActivity.this, section);
if (TextUtils.isEmpty(strJson)) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR);
}
return;
}
String strError = JsonHelper.checkError(strJson);
if (null != strError) {
// 是 错误信息
if (mHandler != null) {
Message msg = mHandler.obtainMessage(MSG_ERROR);
Bundle data = msg.getData();
data.putString(KEY_DATA, strError);
mHandler.sendMessage(msg);
}
return;
}
// 不是 错误信息
Section section = new Section(strJson);
if (null != mHandler) {
Message msg = mHandler.obtainMessage(MSG_GET_SECTION);
Bundle data = msg.getData();
data.putSerializable(KEY_DATA, section);
mHandler.sendMessage(msg);
}
}
});
}
/**
* 更新treeListElements,调用之前应该先更新nSectionPostion
*
*/
private void updateTreeElements(Section section) {
TreeElement tempElement = mTreeListElements.get(mSectionPostion);
// 添加新数据
if (null != section) {
// 更新description
if (null != section.description) {
tempElement.mDesc = section.description;
}
if (null != section.sub_sections) {
for (int i = 0; i < section.sub_sections.length; i++) {
TreeElement ele = new TreeElement(section.sub_sections[i],
section.sub_sections[i], true);
tempElement.addChild(ele);
}
}
if (null != section.boards) {
for (int i = 0; i < section.boards.length; i++) {
TreeElement ele = new TreeElement(section.boards[i].name,
section.boards[i].description, false);
tempElement.addChild(ele);
}
}
}
if (tempElement.mLevel == 0) {
// 折叠所有项
boolean flag = true;
ArrayList<TreeElement> tempList = new ArrayList<>();
for (TreeElement element : mTreeListElements) {
if (element.mName.equals(tempElement.mName)) {
flag = false;
continue;
}
if (element.mLevel == 0) {
element.mIsExpanded = false;
} else {
tempList.add(element);
if (flag) {
mSectionPostion--;
}
}
}
mTreeListElements.removeAll(tempList);
tempList.clear();
}
// 显示展开项
int position = mSectionPostion;
for (TreeElement element : tempElement.mChildList) {
element.mLevel = tempElement.mLevel + 1;
element.mIsExpanded = false;
mTreeListElements.add(++position, element);
}
mAdapter.notifyDataSetChanged();
mListView.setSelection(mSectionPostion);
/**
* 停止扫光
*/
if (null != mShimmer && mShimmer.isAnimating()) {
mShimmer.cancel();
}
/**
* 设置listview可用
*/
mListView.setEnabled(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
if (Build.VERSION.SDK_INT > 11) {
if (null != mShimmer && mShimmer.isAnimating()) {
mShimmer.cancel();
}
}
mShimmer = null;
System.gc();
}
public void selfFinish(View view) {
scrollToFinishActivity();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 按下键盘上返回按钮
if (keyCode == KeyEvent.KEYCODE_BACK) {
selfFinish(null);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
completeRefresh();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
completeRefresh();
}
private void completeRefresh() {
mHandler.post(new Runnable() {
@Override
public void run() {
mPTRListView.onRefreshComplete();
}
});
}
@SuppressWarnings("deprecation")
private void hideHeaderFooter() {
mPTRListView.setPullLabel("", Mode.BOTH);
mPTRListView.setRefreshingLabel("", Mode.BOTH);
mPTRListView.setReleaseLabel("", Mode.BOTH);
mPTRListView.setLoadingDrawable(null, Mode.BOTH);
}
@Override
public void onSelectFavorite(Board board) {
boolean flag = BBSManager.checkFavorite(board.name);
if (flag) {
// 删除收藏
threadDeleteFavorite(board);
} else {
// 添加收藏
threadAddFavorite(board);
}
}
private void threadDeleteFavorite(final Board board) {
if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) {
return;
}
ThreadUtils.execute(new Runnable() {
@Override
public void run() {
String strJson = Favorite.deleteFavorite(BBSSectionActivity.this, 0, board.name);
if (TextUtils.isEmpty(strJson)) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR);
}
return;
}
String strError = JsonHelper.checkError(strJson);
if (strError != null) {
if (mHandler != null) {
Message msg = mHandler.obtainMessage(MSG_ERROR);
Bundle data = msg.getData();
data.putString(KEY_DATA, strError);
mHandler.sendMessage(msg);
}
return;
}
if (mHandler != null) {
Message msg = mHandler.obtainMessage(MSG_FAVORITE);
Bundle data = msg.getData();
data.putString(KEY_DATA, strJson);
mHandler.sendMessage(msg);
}
}
});
}
private void threadAddFavorite(final Board board) {
if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) {
return;
}
ThreadUtils.execute(new Runnable() {
@Override
public void run() {
String strJson = Favorite.addFavorite(BBSSectionActivity.this, 0, board.name);
if (TextUtils.isEmpty(strJson)) {
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_ERROR);
}
return;
}
String strError = JsonHelper.checkError(strJson);
if (strError != null) {
if (mHandler != null) {
Message msg = mHandler.obtainMessage(MSG_ERROR);
Bundle data = msg.getData();
data.putString(KEY_DATA, strError);
mHandler.sendMessage(msg);
}
return;
}
if (mHandler != null) {
Message msg = mHandler.obtainMessage(MSG_FAVORITE);
Bundle data = msg.getData();
data.putString(KEY_DATA, strJson);
data.putString(KEY_INFO, "已收藏 " + board.description);
mHandler.sendMessage(msg);
}
}
});
}
}