package com.jeez.guanpj.jreadhub.module.topic.detail; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v4.widget.NestedScrollView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.util.TypedValue; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.TextView; import com.jeez.guanpj.jreadhub.R; import com.jeez.guanpj.jreadhub.bean.EntityEventTopicBean; import com.jeez.guanpj.jreadhub.bean.TopicDetailBean; import com.jeez.guanpj.jreadhub.bean.TopicNewsBean; import com.jeez.guanpj.jreadhub.event.OpenWebSiteEvent; import com.jeez.guanpj.jreadhub.module.adpter.TopicTimelineAdapter; import com.jeez.guanpj.jreadhub.module.topic.detail.relate.RelevantTopicWindow; import com.jeez.guanpj.jreadhub.mvpframe.rx.RxBus; import com.jeez.guanpj.jreadhub.mvpframe.view.lce.fragment.AbsBaseMvpLceSwipeBackFragment; import com.jeez.guanpj.jreadhub.util.Constants; import com.jeez.guanpj.jreadhub.util.NavigationUtil; import com.jeez.guanpj.jreadhub.widget.RelativePopupWindow; import com.zhy.view.flowlayout.FlowLayout; import com.zhy.view.flowlayout.TagAdapter; import com.zhy.view.flowlayout.TagFlowLayout; import com.zhy.view.flowlayout.TagView; import java.util.ArrayList; import butterknife.BindView; public class TopicDetailFragment extends AbsBaseMvpLceSwipeBackFragment<TopicDetailBean, TopicDetailPresenter> implements TopicDetailContract.View, Toolbar.OnMenuItemClickListener { @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.txt_topic_detail_title) TextView mTxtTopicTitle; @BindView(R.id.txt_topic_time) TextView mTxtTopicTime; @BindView(R.id.txt_topic_description) TextView mTxtTopicDescription; @BindView(R.id.ll_web_title_container) LinearLayout mTitleContainer; @BindView(R.id.ll_topic_trace_container) LinearLayout mTimelineContainer; @BindView(R.id.recycler_topic_trace) RecyclerView mRecyclerTimeline; @BindView(R.id.ll_relative_topic_container) LinearLayout mRelativeTopicContainer; @BindView(R.id.tfl_relative_topic) TagFlowLayout mRelativeTopic; @BindView(R.id.content_view) NestedScrollView mScrollView; @BindView(R.id.txt_toolbar_header) TextView mToolbarHeader; private String mTopicTitle; private String mTopicId; private TopicDetailBean mTopicBean; private TopicTimelineAdapter mTimelineAdapter; private boolean mIsStar; private boolean mShowTips = false; public static TopicDetailFragment newInstance(String topicId, String title) { TopicDetailFragment fragment = new TopicDetailFragment(); Bundle bundle = new Bundle(); bundle.putString(Constants.BUNDLE_TOPIC_ID, topicId); bundle.putString(Constants.BUNDLE_TOPIC_TITLE, title); fragment.setArguments(bundle); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTopicId = getArguments().getString(Constants.BUNDLE_TOPIC_ID); mTopicTitle = getArguments().getString(Constants.BUNDLE_TOPIC_TITLE); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); loadData(false); } @Override public void loadData(boolean isPullToRefresh) { mPresenter.getTopicDetail(mTopicId, isPullToRefresh); mPresenter.checkStar(mTopicId); } @Override public int getLayoutId() { return R.layout.fragment_topic_detail; } @Override public void initView() { mToolbar.setNavigationIcon(R.drawable.ic_nav_back); mToolbar.inflateMenu(R.menu.menu_topic_detail); mToolbar.setTitle(getText(R.string.menu_topic_detail)); mToolbarHeader.setText(mTopicTitle); mToolbarHeader.setVisibility(View.GONE); } @Override public void initDataAndEvent() { mToolbar.setNavigationOnClickListener(v -> pop()); mToolbar.setOnMenuItemClickListener(this); mTimelineAdapter = new TopicTimelineAdapter(getContext()); mRecyclerTimeline.setAdapter(mTimelineAdapter); mRecyclerTimeline.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerTimeline.setNestedScrollingEnabled(false); mScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { if (scrollY > mTxtTopicTime.getBottom()) { mToolbarHeader.setVisibility(View.VISIBLE); mToolbar.setTitle(""); } else { mToolbarHeader.setVisibility(View.GONE); mToolbar.setTitle(getText(R.string.menu_topic_detail)); } }); } @Override public void bindData(TopicDetailBean topicBean, boolean isPullToRefresh) { this.mTopicBean = topicBean; mTxtTopicTitle.setText(mTopicBean.getTitle().trim()); if (null != mTopicBean.getFormattedPublishDate()) { mTxtTopicTime.setText(mTopicBean.getFormattedPublishDate().toLocalDate().toString() + " " + mTopicBean.getFormattedPublishDate().toLocalTime().toString().substring(0, 8)); } else { mTxtTopicTime.setVisibility(View.GONE); } if (TextUtils.isEmpty(mTopicBean.getSummary().trim())) { mTxtTopicDescription.setVisibility(View.GONE); } else { mTxtTopicDescription.setText(mTopicBean.getSummary().trim()); mTxtTopicDescription.setVisibility(View.VISIBLE); } mTitleContainer.removeAllViews(); if (mTopicBean.getNewsArray() == null || mTopicBean.getNewsArray().isEmpty()) { mTitleContainer.setVisibility(View.GONE); } else { mTitleContainer.setVisibility(View.VISIBLE); for (final TopicNewsBean topic : mTopicBean.getNewsArray()) { TextView textView = new TextView(getContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); textView.setLayoutParams(params); textView.setPadding(10, 16, 10, 16); textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_topic_detail_ring, 0, 0, 0); textView.setCompoundDrawablePadding(15); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); /*textView.setTextColor(ContextCompat.getColor(getContext(), ResourceUtil.getResource(getActivity(), R.attr.readhubTextColorPrimary)));*/ textView.setTextColor(ContextCompat.getColor(getContext(), R.color.text_topic_detail_news_title)); //textView.setBackgroundResource(R.drawable.selector_btn_background); if (TextUtils.isEmpty(topic.getSiteName())) { textView.setText(topic.getTitle()); } else { SpannableString spannableTitle = SpannableString.valueOf(getContext().getString(R.string.title___site_name, topic.getTitle(), topic.getSiteName())); spannableTitle.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.text_topic_detail_news_author)), topic.getTitle().length(), topic.getTitle().length() + topic.getSiteName().length() + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(spannableTitle); } textView.setOnClickListener(v -> { String url = null; if (!TextUtils.isEmpty(topic.getMobileUrl())) { url = topic.getMobileUrl(); } else { url = topic.getUrl(); } if (!TextUtils.isEmpty(url)) { RxBus.getInstance().post(new OpenWebSiteEvent(url, topic.getTitle())); } }); mTitleContainer.addView(textView); } } if (null != mTopicBean.getTimeline() && null != mTopicBean.getTimeline().getTopics() && 0 < mTopicBean.getTimeline().getTopics().size()) { mTimelineAdapter.addItems(mTopicBean.getTimeline().getTopics()); mTimelineContainer.setVisibility(View.VISIBLE); } else { mTimelineContainer.setVisibility(View.GONE); } if (!mTopicBean.getEntityEventTopics().isEmpty()) { mRelativeTopicContainer.setVisibility(View.VISIBLE); ArrayList<EntityEventTopicBean> entityEventTopics = mTopicBean.getEntityEventTopics(); mRelativeTopic.setAdapter(new TagAdapter<EntityEventTopicBean>(entityEventTopics) { @Override public View getView(FlowLayout parent, int position, EntityEventTopicBean entityEventTopicBean) { TextView item = (TextView) getLayoutInflater().inflate(R.layout.item_relevant_topic, mRelativeTopic, false); item.setText(entityEventTopicBean.getEntityName() + entityEventTopicBean.getEventTypeLabel()); return item; } }); mRelativeTopic.setOnTagClickListener((view, position, parent) -> { String topicId = String.valueOf(entityEventTopics.get(position).getEntityId()); long order = mTopicBean.getOrder(); RelevantTopicWindow window = new RelevantTopicWindow(getActivity(), topicId, order); window.showOnAnchor(view, RelativePopupWindow.VerticalPosition.ABOVE, RelativePopupWindow.HorizontalPosition.CENTER, true); setBackgroundAlpha(0.7f); window.setOnDismissListener(() -> { setBackgroundAlpha(1f); if (((TagView) view).isChecked()) { ((TagView) view).setChecked(false); } }); return true; }); } else { mRelativeTopicContainer.setVisibility(View.GONE); } } @Override public void onCheckStarResult(boolean isTopicExist) { if (isTopicExist) { mToolbar.getMenu().findItem(R.id.action_collect).setIcon(R.drawable.ic_tool_bar_star_fill); if (mShowTips) { if (mIsStar) { showShortToast(getString(R.string.tips_unstar_faild)); } else { showShortToast(getString(R.string.tips_star_success)); } } mIsStar = true; } else { mToolbar.getMenu().findItem(R.id.action_collect).setIcon(R.drawable.ic_tool_bar_star_border); if (mShowTips) { if (mIsStar) { showShortToast(getString(R.string.tips_unstar_success)); } else { showShortToast(getString(R.string.tips_star_faild)); } } mIsStar = false; } mShowTips = true; } private void setBackgroundAlpha(float v) { WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes(); lp.alpha = v; getActivity().getWindow().setAttributes(lp); } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_collect: if (mIsStar) { mPresenter.removeStar(mTopicBean); } else { mPresenter.addStar(mTopicBean); } break; case R.id.action_share: NavigationUtil.shareToApp(getActivity(), "https://readhub.cn\n互联网聚合阅读平台"); break; default: break; } return true; } }