package com.qiwenge.android.act;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.liuguangqiang.android.mvp.BaseUi;
import com.liuguangqiang.android.mvp.Presenter;
import com.liuguangqiang.framework.utils.DisplayUtils;
import com.liuguangqiang.framework.utils.Logs;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.qiwenge.android.R;
import com.qiwenge.android.adapters.AboutRmdAdapter;
import com.qiwenge.android.async.AsyncUtils;
import com.qiwenge.android.base.BaseActivity;
import com.qiwenge.android.entity.Book;
import com.qiwenge.android.mvp.presenter.BookDetailPresenter;
import com.qiwenge.android.mvp.ui.BookDetailUi;
import com.qiwenge.android.mvp.ui.BookDetailUiCallback;
import com.qiwenge.android.utils.ImageLoaderUtils;
import com.qiwenge.android.utils.ReaderUtils;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.OnItemClick;
/**
* Book detail.
* <p/>
* Created by Eric on 2014-5-5
*/
public class BookDetailActivity extends BaseActivity implements BookDetailUi {
public static final String EXTRA_BOOK = "book";
@InjectView(R.id.iv_cover)
ImageView ivCover;
@InjectView(R.id.tv_title)
TextView tvTitle;
@InjectView(R.id.tv_author)
TextView tvAuthor;
@InjectView(R.id.tv_category)
TextView tvCategory;
@InjectView(R.id.tv_status)
TextView tvStatus;
@InjectView(R.id.btn_add)
Button btnAdd;
@InjectView(R.id.tv_intro)
TextView tvIntro;
@InjectView(R.id.lv_recommend)
ListView lvRecommend;
@InjectView(R.id.layout_related)
LinearLayout layoutRelated;
private Book book;
private List<Book> dataRecommend = new ArrayList<Book>();
private AboutRmdAdapter adapter;
private boolean hasInited = false;
private BookDetailUiCallback mCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_intro);
ButterKnife.inject(this);
setTitle(R.string.book_intro_detail);
initViews();
getIntentData();
}
@Override
public Presenter setPresenter() {
return new BookDetailPresenter(getApplicationContext(), this);
}
@Override
public void setUiCallback(BookDetailUiCallback bookDetailUiCallback) {
mCallback = bookDetailUiCallback;
}
private void initViews() {
layoutRelated.setVisibility(View.GONE);
adapter = new AboutRmdAdapter(getApplicationContext(), dataRecommend);
lvRecommend.setAdapter(adapter);
}
@Override
public void onAttachedUi() {
super.onAttachedUi();
mCallback.checkAdded(book);
}
@OnItemClick(R.id.lv_recommend)
public void onItemClickRecommend(int position) {
if (position < dataRecommend.size()) {
Bundle extra = new Bundle();
extra.putParcelable(BookDetailActivity.EXTRA_BOOK, dataRecommend.get(position));
startActivity(BookDetailActivity.class, extra);
}
}
@Override
public void showBookStatus(boolean isAdded) {
if (isAdded) {
showRemoveBtn();
} else {
showAddBtn();
}
}
@OnClick(R.id.btn_chapter)
public void showChapters() {
Bundle extra = new Bundle();
extra.putParcelable(ChapterActivity.EXTRA_BOOK, book);
startActivity(ChapterActivity.class, extra);
}
@OnClick(R.id.btn_add)
public void addOrRemove() {
mCallback.addOrRemove(book);
}
private void getIntentData() {
Bundle extra = getIntent().getExtras();
if (extra.containsKey(EXTRA_BOOK)) {
book = extra.getParcelable(EXTRA_BOOK);
AsyncUtils.postViewTotal(book.getId());
showBookInfo();
}
}
@Override
public void setAddBtnEnable(boolean enable) {
btnAdd.setEnabled(enable);
}
private void showAddBtn() {
btnAdd.setText(R.string.book_intro_add);
btnAdd.setBackgroundResource(R.drawable.btn_hollow_yellow);
btnAdd.setTextColor(getResources().getColorStateList(R.color.btn_yellow_text_color));
}
private void showRemoveBtn() {
btnAdd.setText(R.string.book_intro_remove);
btnAdd.setBackgroundResource(R.drawable.btn_remove_book);
btnAdd.setTextColor(getResources().getColorStateList(R.color.btn_remove_text_color));
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && !hasInited) {
hasInited = true;
mCallback.getRelatedBooks(book.id);
}
}
private void showBookInfo() {
if (book != null) {
tvTitle.setText(book.title.trim());
tvIntro.setText(ReaderUtils.formatDesc(book.description));
tvAuthor.setText(String.format(getString(R.string.book_intro_author_format),
book.author.trim()));
if (book.categories != null)
tvCategory.setText(String.format(getString(R.string.book_intro_category_format),
book.categories.get(0).trim()));
else
tvCategory.setText(String.format(getString(R.string.book_intro_category_format),
getString(R.string.str_unknow)));
if (book.finish == 1) {
tvStatus.setText(String.format(getString(R.string.book_intro_status_format),
getString(R.string.str_book_finish)));
} else {
tvStatus.setText(String.format(getString(R.string.book_intro_status_format),
getString(R.string.str_book_publishing)));
}
if (ImageLoader.getInstance().isInited()) {
DisplayImageOptions options = ImageLoaderUtils.createOptions(R.drawable.icon_place_holder);
ImageLoaderUtils.display(book.cover, ivCover, options);
}
}
}
@Override
public void showRelatedBooks(List<Book> books) {
layoutRelated.setVisibility(View.VISIBLE);
adapter.add(books);
adapter.notifyDataSetChanged();
setRelatedHeight();
}
private ViewTreeObserver myTree;
/**
* 设置相关推荐的高度。
* <p>
* 计算第一行的高度,得出总给的高度。
* 这样的做法是因为动态计算ListView的高度的时候,如果用户修改了手机字体的大小,
* 那么Item的高度,可能就和以前设定的高度不一致了,
* 所以需要重新计算Item的高度
* </p>
*/
private void setRelatedHeight() {
if (dataRecommend == null) return;
if (dataRecommend.isEmpty()) return;
myTree = lvRecommend.getViewTreeObserver();
if (myTree.isAlive()) {
myTree.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int lineHeight = DisplayUtils.dip2px(getApplicationContext(), 1);
int itemHeight = lvRecommend.getMeasuredHeight() + lineHeight;
int height = itemHeight * dataRecommend.size() - lineHeight;
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height);
lvRecommend.setLayoutParams(params);
if (myTree.isAlive()) {
try {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
myTree.removeGlobalOnLayoutListener(this);
} else {
myTree.removeOnGlobalLayoutListener(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
}
}