/**
* Copyright 2016 JustWayward Team
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.justwayward.reader.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.justwayward.reader.R;
import com.justwayward.reader.base.BaseActivity;
import com.justwayward.reader.base.Constant;
import com.justwayward.reader.bean.BookDetail;
import com.justwayward.reader.bean.BookLists;
import com.justwayward.reader.bean.HotReview;
import com.justwayward.reader.bean.Recommend;
import com.justwayward.reader.bean.RecommendBookList;
import com.justwayward.reader.bean.support.RefreshCollectionIconEvent;
import com.justwayward.reader.common.OnRvItemClickListener;
import com.justwayward.reader.component.AppComponent;
import com.justwayward.reader.component.DaggerBookComponent;
import com.justwayward.reader.manager.CollectionsManager;
import com.justwayward.reader.ui.adapter.HotReviewAdapter;
import com.justwayward.reader.ui.adapter.RecommendBookListAdapter;
import com.justwayward.reader.ui.contract.BookDetailContract;
import com.justwayward.reader.ui.presenter.BookDetailPresenter;
import com.justwayward.reader.utils.FormatUtils;
import com.justwayward.reader.utils.ToastUtils;
import com.justwayward.reader.view.DrawableCenterButton;
import com.justwayward.reader.view.TagColor;
import com.justwayward.reader.view.TagGroup;
import com.yuyh.easyadapter.glide.GlideRoundTransform;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.OnClick;
/**
* Created by lfh on 2016/8/6.
*/
public class BookDetailActivity extends BaseActivity implements BookDetailContract.View, OnRvItemClickListener<Object> {
public static String INTENT_BOOK_ID = "bookId";
public static void startActivity(Context context, String bookId) {
context.startActivity(new Intent(context, BookDetailActivity.class)
.putExtra(INTENT_BOOK_ID, bookId));
}
@Bind(R.id.ivBookCover)
ImageView mIvBookCover;
@Bind(R.id.tvBookListTitle)
TextView mTvBookTitle;
@Bind(R.id.tvBookListAuthor)
TextView mTvAuthor;
@Bind(R.id.tvCatgory)
TextView mTvCatgory;
@Bind(R.id.tvWordCount)
TextView mTvWordCount;
@Bind(R.id.tvLatelyUpdate)
TextView mTvLatelyUpdate;
@Bind(R.id.btnRead)
DrawableCenterButton mBtnRead;
@Bind(R.id.btnJoinCollection)
DrawableCenterButton mBtnJoinCollection;
@Bind(R.id.tvLatelyFollower)
TextView mTvLatelyFollower;
@Bind(R.id.tvRetentionRatio)
TextView mTvRetentionRatio;
@Bind(R.id.tvSerializeWordCount)
TextView mTvSerializeWordCount;
@Bind(R.id.tag_group)
TagGroup mTagGroup;
@Bind(R.id.tvlongIntro)
TextView mTvlongIntro;
@Bind(R.id.tvMoreReview)
TextView mTvMoreReview;
@Bind(R.id.rvHotReview)
RecyclerView mRvHotReview;
@Bind(R.id.rlCommunity)
RelativeLayout mRlCommunity;
@Bind(R.id.tvCommunity)
TextView mTvCommunity;
@Bind(R.id.tvHelpfulYes)
TextView mTvPostCount;
@Bind(R.id.tvRecommendBookList)
TextView mTvRecommendBookList;
@Bind(R.id.rvRecommendBoookList)
RecyclerView mRvRecommendBoookList;
@Inject
BookDetailPresenter mPresenter;
private List<String> tagList = new ArrayList<>();
private int times = 0;
private HotReviewAdapter mHotReviewAdapter;
private List<HotReview.Reviews> mHotReviewList = new ArrayList<>();
private RecommendBookListAdapter mRecommendBookListAdapter;
private List<RecommendBookList.RecommendBook> mRecommendBookList = new ArrayList<>();
private String bookId;
private boolean collapseLongIntro = true;
private Recommend.RecommendBooks recommendBooks;
private boolean isJoinedCollections = false;
@Override
public int getLayoutId() {
return R.layout.activity_book_detail;
}
@Override
protected void setupActivityComponent(AppComponent appComponent) {
DaggerBookComponent.builder()
.appComponent(appComponent)
.build()
.inject(this);
}
@Override
public void initToolBar() {
mCommonToolbar.setNavigationIcon(R.drawable.ab_back);
mCommonToolbar.setTitle(R.string.book_detail);
}
@Override
public void initDatas() {
bookId = getIntent().getStringExtra(INTENT_BOOK_ID);
EventBus.getDefault().register(this);
}
@Override
public void configViews() {
mRvHotReview.setHasFixedSize(true);
mRvHotReview.setLayoutManager(new LinearLayoutManager(this));
mHotReviewAdapter = new HotReviewAdapter(mContext, mHotReviewList, this);
mRvHotReview.setAdapter(mHotReviewAdapter);
mRvRecommendBoookList.setHasFixedSize(true);
mRvRecommendBoookList.setLayoutManager(new LinearLayoutManager(this));
mRecommendBookListAdapter = new RecommendBookListAdapter(mContext, mRecommendBookList, this);
mRvRecommendBoookList.setAdapter(mRecommendBookListAdapter);
mTagGroup.setOnTagClickListener(new TagGroup.OnTagClickListener() {
@Override
public void onTagClick(String tag) {
startActivity(new Intent(BookDetailActivity.this, BooksByTagActivity.class)
.putExtra("tag", tag));
}
});
mPresenter.attachView(this);
mPresenter.getBookDetail(bookId);
mPresenter.getHotReview(bookId);
mPresenter.getRecommendBookList(bookId, "3");
}
@Override
public void showBookDetail(BookDetail data) {
Glide.with(mContext)
.load(Constant.IMG_BASE_URL + data.cover)
.placeholder(R.drawable.cover_default)
.transform(new GlideRoundTransform(mContext))
.into(mIvBookCover);
mTvBookTitle.setText(data.title);
mTvAuthor.setText(String.format(getString(R.string.book_detail_author), data.author));
mTvCatgory.setText(String.format(getString(R.string.book_detail_category), data.cat));
mTvWordCount.setText(FormatUtils.formatWordCount(data.wordCount));
mTvLatelyUpdate.setText(FormatUtils.getDescriptionTimeFromDateString(data.updated));
mTvLatelyFollower.setText(String.valueOf(data.latelyFollower));
mTvRetentionRatio.setText(TextUtils.isEmpty(data.retentionRatio) ?
"-" : String.format(getString(R.string.book_detail_retention_ratio),
data.retentionRatio));
mTvSerializeWordCount.setText(data.serializeWordCount < 0 ? "-" :
String.valueOf(data.serializeWordCount));
tagList.clear();
tagList.addAll(data.tags);
times = 0;
showHotWord();
mTvlongIntro.setText(data.longIntro);
mTvCommunity.setText(String.format(getString(R.string.book_detail_community), data.title));
mTvPostCount.setText(String.format(getString(R.string.book_detail_post_count), data.postCount));
recommendBooks = new Recommend.RecommendBooks();
recommendBooks.title = data.title;
recommendBooks._id = data._id;
recommendBooks.cover = data.cover;
recommendBooks.lastChapter = data.lastChapter;
recommendBooks.updated = data.updated;
refreshCollectionIcon();
}
/**
* 刷新收藏图标
*/
private void refreshCollectionIcon() {
if (CollectionsManager.getInstance().isCollected(recommendBooks._id)) {
initCollection(false);
} else {
initCollection(true);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void RefreshCollectionIcon(RefreshCollectionIconEvent event) {
refreshCollectionIcon();
}
/**
* 每次显示8个
*/
private void showHotWord() {
int start, end;
if (times < tagList.size() && times + 8 <= tagList.size()) {
start = times;
end = times + 8;
} else if (times < tagList.size() - 1 && times + 8 > tagList.size()) {
start = times;
end = tagList.size() - 1;
} else {
start = 0;
end = tagList.size() > 8 ? 8 : tagList.size();
}
times = end;
if (end - start > 0) {
List<String> batch = tagList.subList(start, end);
List<TagColor> colors = TagColor.getRandomColors(batch.size());
mTagGroup.setTags(colors, (String[]) batch.toArray(new String[batch.size()]));
}
}
@Override
public void showHotReview(List<HotReview.Reviews> list) {
mHotReviewList.clear();
mHotReviewList.addAll(list);
mHotReviewAdapter.notifyDataSetChanged();
}
@Override
public void showRecommendBookList(List<RecommendBookList.RecommendBook> list) {
if (!list.isEmpty()) {
mTvRecommendBookList.setVisibility(View.VISIBLE);
mRecommendBookList.clear();
mRecommendBookList.addAll(list);
mRecommendBookListAdapter.notifyDataSetChanged();
}
}
@Override
public void onItemClick(View view, int position, Object data) {
if (data instanceof HotReview.Reviews) {
BookDiscussionDetailActivity.startActivity(this, ((HotReview.Reviews) data)._id);
} else if (data instanceof RecommendBookList.RecommendBook) {
RecommendBookList.RecommendBook recommendBook = (RecommendBookList.RecommendBook) data;
BookLists bookLists = new BookLists();
BookLists.BookListsBean bookListsBean = bookLists.new BookListsBean();
bookListsBean._id = recommendBook.id;
bookListsBean.author = recommendBook.author;
bookListsBean.bookCount = recommendBook.bookCount;
bookListsBean.collectorCount = recommendBook.collectorCount;
bookListsBean.cover = recommendBook.cover;
bookListsBean.desc = recommendBook.desc;
bookListsBean.title = recommendBook.title;
SubjectBookListDetailActivity.startActivity(this, bookListsBean);
}
}
@OnClick(R.id.btnJoinCollection)
public void onClickJoinCollection() {
if (!isJoinedCollections) {
if (recommendBooks != null) {
CollectionsManager.getInstance().add(recommendBooks);
ToastUtils.showToast(String.format(getString(
R.string.book_detail_has_joined_the_book_shelf), recommendBooks.title));
initCollection(false);
}
} else {
CollectionsManager.getInstance().remove(recommendBooks._id);
ToastUtils.showToast(String.format(getString(
R.string.book_detail_has_remove_the_book_shelf), recommendBooks.title));
initCollection(true);
}
}
private void initCollection(boolean coll) {
if (coll) {
mBtnJoinCollection.setText(R.string.book_detail_join_collection);
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.book_detail_info_add_img);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
mBtnJoinCollection.setBackgroundDrawable(ContextCompat.getDrawable(this, R.drawable.shape_common_btn_solid_normal));
mBtnJoinCollection.setCompoundDrawables(drawable, null, null, null);
mBtnJoinCollection.postInvalidate();
isJoinedCollections = false;
} else {
mBtnJoinCollection.setText(R.string.book_detail_remove_collection);
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.book_detail_info_del_img);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
mBtnJoinCollection.setBackgroundDrawable(ContextCompat.getDrawable(this, R.drawable.btn_join_collection_pressed));
mBtnJoinCollection.setCompoundDrawables(drawable, null, null, null);
mBtnJoinCollection.postInvalidate();
isJoinedCollections = true;
}
}
@OnClick(R.id.btnRead)
public void onClickRead() {
if (recommendBooks == null) return;
ReadActivity.startActivity(this, recommendBooks);
}
@OnClick(R.id.tvBookListAuthor)
public void searchByAuthor() {
String author = mTvAuthor.getText().toString().replaceAll(" ", "");
SearchByAuthorActivity.startActivity(this, author);
}
@OnClick(R.id.tvlongIntro)
public void collapseLongIntro() {
if (collapseLongIntro) {
mTvlongIntro.setMaxLines(20);
collapseLongIntro = false;
} else {
mTvlongIntro.setMaxLines(4);
collapseLongIntro = true;
}
}
@OnClick(R.id.tvMoreReview)
public void onClickMoreReview() {
BookDetailCommunityActivity.startActivity(this, bookId, mTvBookTitle.getText().toString(), 1);
}
@OnClick(R.id.rlCommunity)
public void onClickCommunity() {
BookDetailCommunityActivity.startActivity(this, bookId, mTvBookTitle.getText().toString(), 0);
}
@Override
public void showError() {
}
@Override
public void complete() {
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
if (mPresenter != null) {
mPresenter.detachView();
}
}
}