Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / news / single / NewsFragment.java
1 package com.moiseum.wolnelektury.view.news.single;
2
3 import android.os.Bundle;
4 import android.support.design.widget.AppBarLayout;
5 import android.support.design.widget.CollapsingToolbarLayout;
6 import android.support.v4.view.ViewPager;
7 import android.support.v7.widget.Toolbar;
8 import android.view.View;
9 import android.view.ViewTreeObserver;
10 import android.widget.LinearLayout;
11 import android.widget.TextView;
12
13 import com.moiseum.wolnelektury.R;
14 import com.moiseum.wolnelektury.base.mvp.PresenterFragment;
15 import com.moiseum.wolnelektury.connection.models.NewsModel;
16 import com.moiseum.wolnelektury.view.news.zoom.ZoomActivity;
17
18 import org.parceler.Parcels;
19 import org.sufficientlysecure.htmltextview.HtmlTextView;
20
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import butterknife.BindView;
25 import butterknife.OnClick;
26 import me.relex.circleindicator.CircleIndicator;
27
28 /**
29  * Created by Piotr Ostrowski on 06.08.2018.
30  */
31 public class NewsFragment extends PresenterFragment<NewsPresenter> implements NewsView {
32
33         private static final String NEWS_ARGUMENT_KEY = "NewsArgumentKey";
34         private static final int FIVE_PAGES = 5;
35
36         public static NewsFragment newInstance(NewsModel news) {
37                 NewsFragment fragment = new NewsFragment();
38                 Bundle args = new Bundle(1);
39                 args.putParcelable(NEWS_ARGUMENT_KEY, Parcels.wrap(news));
40                 fragment.setArguments(args);
41                 return fragment;
42         }
43
44         @BindView(R.id.vpGallery)
45         ViewPager vpGallery;
46         @BindView(R.id.indicator)
47         CircleIndicator indicator;
48         @BindView(R.id.tvNewsTitle)
49         TextView tvNewsTitle;
50         @BindView(R.id.tvNewsTime)
51         TextView tvNewsTime;
52         @BindView(R.id.tvNewsPlace)
53         TextView tvNewsPlace;
54         @BindView(R.id.tvNewsBody)
55         HtmlTextView tvNewsBody;
56         @BindView(R.id.clMainView)
57         View clMainView;
58         @BindView(R.id.ctlCollapse)
59         CollapsingToolbarLayout ctlCollapse;
60         @BindView(R.id.llContentContainer)
61         LinearLayout llContentContainer;
62
63         @Override
64         public int getLayoutResourceId() {
65                 return R.layout.fragment_single_news;
66         }
67
68         @Override
69         public void prepareView(View view, Bundle savedInstanceState) {
70                 Toolbar toolbar = view.findViewById(R.id.bookToolbar);
71                 setupToolbar(toolbar);
72         }
73
74         @Override
75         protected NewsPresenter createPresenter() {
76                 if (getArguments() == null || getArguments().getParcelable(NEWS_ARGUMENT_KEY) == null) {
77                         throw new IllegalStateException("Fragment is missing arguments");
78                 }
79                 NewsModel news = Parcels.unwrap(getArguments().getParcelable(NEWS_ARGUMENT_KEY));
80                 return new NewsPresenter(news, this);
81         }
82
83         @OnClick(R.id.fabShare)
84         public void onShareClick() {
85                 getPresenter().onShareNewsClicked();
86         }
87
88         @Override
89         public void initializeNewsView(NewsModel news) {
90                 ctlCollapse.setTitle(news.getTitle());
91                 ctlCollapse.setExpandedTitleColor(getResources().getColor(android.R.color.transparent));
92                 tvNewsTitle.setText(news.getTitle());
93                 tvNewsTime.setText(news.getTime());
94                 tvNewsPlace.setText(news.getPlace());
95                 tvNewsBody.setHtml(news.getBody());
96
97                 NewsGalleryAdapter galleryAdapter = new NewsGalleryAdapter(news.getGalleryUrl(), getContext());
98                 vpGallery.setAdapter(galleryAdapter);
99                 vpGallery.setOffscreenPageLimit(FIVE_PAGES);
100                 indicator.setViewPager(vpGallery);
101                 addDisposable(galleryAdapter.getPageClickObservable().subscribe(position -> {
102                         ArrayList<String> urls = new ArrayList<>(news.getGalleryUrl());
103                         startActivity(new ZoomActivity.ZoomIntent(urls, position, getContext()));
104                 }));
105                 enableToolbarCollapse();
106         }
107
108         @Override
109         public void startShareActivity(String shareUrl) {
110                 showShareActivity(shareUrl);
111         }
112
113         private void enableToolbarCollapse() {
114                 ViewTreeObserver viewTreeObserver = llContentContainer.getViewTreeObserver();
115                 if (viewTreeObserver.isAlive()) {
116                         viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
117                                 @Override
118                                 public void onGlobalLayout() {
119                                         llContentContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this);
120                                         if (ctlCollapse.getHeight() + llContentContainer.getHeight() > clMainView.getHeight()) {
121                                                 AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) ctlCollapse.getLayoutParams();
122                                                 params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
123                                                 ctlCollapse.setLayoutParams(params);
124                                         }
125                                 }
126                         });
127                 }
128         }
129 }