Java tutorial
/* * Copyright (c) 2015 Zelory. * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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 id.zelory.codepolitan.ui.fragment; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v4.widget.SwipeRefreshLayout; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import java.util.List; import butterknife.Bind; import id.zelory.benih.fragment.BenihFragment; import id.zelory.benih.util.BenihUtils; import id.zelory.codepolitan.R; import id.zelory.codepolitan.controller.ArticleController; import id.zelory.codepolitan.controller.RandomContentController; import id.zelory.codepolitan.controller.event.ErrorEvent; import id.zelory.codepolitan.data.model.Article; import id.zelory.codepolitan.data.model.Category; import id.zelory.codepolitan.data.LocalDataManager; import id.zelory.codepolitan.data.model.Tag; import id.zelory.codepolitan.ui.ListArticleActivity; import id.zelory.codepolitan.ui.ReadActivity; import id.zelory.codepolitan.ui.view.BenihWebView; import id.zelory.codepolitan.ui.view.CodePolitanImageView; import id.zelory.codepolitan.ui.view.OtherArticleItemView; /** * Created on : July 28, 2015 * Author : zetbaitsu * Name : Zetra * Email : zetra@mail.ugm.ac.id * GitHub : https://github.com/zetbaitsu * LinkedIn : https://id.linkedin.com/in/zetbaitsu */ public class ReadFragment extends BenihFragment<Article> implements ArticleController.Presenter, RandomContentController.Presenter, SwipeRefreshLayout.OnRefreshListener { private ArticleController articleController; private RandomContentController randomContentController; private Animation animation; @Bind(R.id.image) CodePolitanImageView image; @Bind(R.id.iv_error) ImageView ivError; @Bind(R.id.title) TextView title; @Bind(R.id.date) TextView date; @Bind(R.id.category) TextView category; @Bind(R.id.content) BenihWebView content; @Bind(R.id.ll_tags) LinearLayout llTags; @Bind(R.id.ll_other_articles) LinearLayout llOtherArticles; @Bind(R.id.ll_root) LinearLayout llRoot; @Bind(R.id.swipe_layout) SwipeRefreshLayout swipeRefreshLayout; @Override protected int getFragmentView() { return R.layout.fragment_read; } @Override protected void onViewReady(Bundle bundle) { animation = AnimationUtils.loadAnimation(getActivity(), R.anim.simple_grow); image.setBackgroundColor(BenihUtils.getRandomColor()); setupWebView(); setupController(bundle); setUpSwipeLayout(); } protected void setUpSwipeLayout() { swipeRefreshLayout.setColorSchemeResources(R.color.primary, R.color.accent); swipeRefreshLayout.setOnRefreshListener(this); } private void setupController(Bundle bundle) { if (articleController == null) { articleController = new ArticleController(this); } if (bundle != null) { articleController.loadState(bundle); } else if (data.getContent() != null) { showArticle(data); articleController.setArticle(data); } else { new Handler().postDelayed(() -> { if (data != null) { articleController.loadArticle(data.getId()); } }, 800); } if (randomContentController == null) { randomContentController = new RandomContentController(this); } if (bundle != null) { randomContentController.loadState(bundle); } else { new Handler().postDelayed(randomContentController::loadRandomArticles, 800); } } @Override public void onSaveInstanceState(Bundle outState) { articleController.saveState(outState); randomContentController.saveState(outState); super.onSaveInstanceState(outState); } @Override public void showArticle(Article article) { image.setImageUrl(article.getThumbnailMedium(), ivError); title.setText(Html.fromHtml(article.getTitle())); date.setText(article.getDateClear()); if (article.getCategory() != null && !article.getCategory().isEmpty()) { category.setText(Html.fromHtml(article.getCategory().get(0).getName())); category.setOnClickListener(v -> onCategoryClick(article.getCategory().get(0))); } content.loadData(article.getContent()); llTags.removeAllViews(); int size = article.getTags().size(); for (int i = 0; i < size; i++) { TextView tag = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.item_tag_read, llTags, false); tag.setText(Html.fromHtml(String.format("# %s", article.getTags().get(i).getName()))); final int position = i; tag.setOnClickListener(v -> onTagClick(article.getTags().get(position))); llTags.addView(tag); } llRoot.setVisibility(View.VISIBLE); llRoot.startAnimation(animation); new Handler().postDelayed(() -> content.loadData(article.getContent()), 800); } private void onTagClick(Tag tag) { Intent intent = new Intent(getActivity(), ListArticleActivity.class); intent.putExtra(ListArticleActivity.KEY_TYPE, ListArticleActivity.TYPE_TAG); intent.putExtra(ListArticleActivity.KEY_DATA, tag); startActivity(intent); } private void onCategoryClick(Category category) { Intent intent = new Intent(getActivity(), ListArticleActivity.class); intent.putExtra(ListArticleActivity.KEY_TYPE, ListArticleActivity.TYPE_CATEGORY); intent.putExtra(ListArticleActivity.KEY_DATA, category); startActivity(intent); } @Override public void showArticles(List<Article> articles) { } @Override public void showRandomArticles(List<Article> articles) { llOtherArticles.removeAllViews(); int size = articles.size(); for (int i = 5; i < size; i++) { Article article = articles.get(i); View itemView = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_news_mini, llOtherArticles, false); OtherArticleItemView otherArticleItemView = new OtherArticleItemView(itemView); otherArticleItemView.bind(article); final int position = i; otherArticleItemView.getView().setOnClickListener(v -> onOtherArticleClick(articles, position)); llOtherArticles.addView(otherArticleItemView.getView()); } } private void onOtherArticleClick(List<Article> articles, int position) { LocalDataManager.saveArticles(articles); LocalDataManager.savePosition(position); startActivity(new Intent(getActivity(), ReadActivity.class)); } @Override public void showRandomCategory(Category category) { } @Override public void showRandomTag(Tag tag) { } @Override public void showFilteredArticles(List<Article> articles) { } @Override public void showLoading() { swipeRefreshLayout.setRefreshing(true); } @Override public void dismissLoading() { swipeRefreshLayout.setRefreshing(false); } @Override public void showError(Throwable throwable) { switch (throwable.getMessage()) { case ErrorEvent.LOAD_STATE_ARTICLE: articleController.loadArticle(data.getId()); break; case ErrorEvent.LOAD_ARTICLE: Toast.makeText(getActivity(), getString(R.string.error_message), Toast.LENGTH_LONG).show(); break; } } @SuppressLint("SetJavaScriptEnabled") private void setupWebView() { content.setWebChromeClient(new WebChromeClient()); content.getSettings().setJavaScriptEnabled(true); content.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); } @Override public void onRefresh() { articleController.loadArticle(data.getId()); randomContentController.loadRandomArticles(); } @Override public void onDestroy() { super.onDestroy(); content.clearCache(true); } }