/*
* 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.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import java.util.List;
import butterknife.Bind;
import butterknife.OnClick;
import id.zelory.benih.fragment.BenihFragment;
import id.zelory.codepolitan.R;
import id.zelory.codepolitan.controller.ArticleController;
import id.zelory.codepolitan.controller.event.ErrorEvent;
import id.zelory.codepolitan.controller.util.ArticleUtil;
import id.zelory.codepolitan.data.model.Article;
import id.zelory.codepolitan.data.model.Tag;
import id.zelory.codepolitan.ui.ListArticleActivity;
import id.zelory.codepolitan.ui.view.TouchImageView;
/**
* Created on : September 23, 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 ImageReadFragment extends BenihFragment<Article> implements
ArticleController.Presenter, Animation.AnimationListener
{
private ArticleController controller;
private Animation fadein, fadeout;
@Bind(R.id.image) TouchImageView image;
@Bind(R.id.title) TextView title;
@Bind(R.id.ll_tags) LinearLayout llTags;
@Bind(R.id.ll_footer) LinearLayout footer;
@Bind(R.id.progress_bar) ProgressBar progressBar;
@Override
protected int getFragmentView()
{
return R.layout.fragment_image_read;
}
@Override
protected void onViewReady(@Nullable Bundle savedInstanceState)
{
fadein = AnimationUtils.loadAnimation(getActivity(), R.anim.fadein);
fadein.setAnimationListener(this);
fadeout = AnimationUtils.loadAnimation(getActivity(), R.anim.fadeout);
fadeout.setAnimationListener(this);
hideTitle();
setUpController(savedInstanceState);
}
private void setUpController(Bundle savedInstanceState)
{
if (controller == null)
{
controller = new ArticleController(this);
}
if (savedInstanceState != null)
{
controller.loadState(savedInstanceState);
} else if (data.getContent() != null)
{
showArticle(data);
controller.setArticle(data);
} else
{
new Handler().postDelayed(() -> {
if (data != null)
{
controller.loadArticle(data.getId());
}
}, 800);
}
}
@Override
public void showArticle(Article article)
{
title.setText(article.getTitle());
Glide.with(this)
.load(ArticleUtil.getFullImage(article))
.listener(new RequestListener<String, GlideDrawable>()
{
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource)
{
image.setImageResource(R.drawable.could_not_load_image_big);
progressBar.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource)
{
progressBar.setVisibility(View.GONE);
return false;
}
})
.into(image);
image.setOnClickListener(v -> showTitle());
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(String.format("# %s", article.getTags().get(i).getName()));
final int position = i;
tag.setOnClickListener(v -> onTagClick(article.getTags().get(position)));
llTags.addView(tag);
}
}
private void showTitle()
{
footer.startAnimation(fadein);
hideTitle();
}
private void hideTitle()
{
new Handler().postDelayed(() -> footer.startAnimation(fadeout), 3000);
}
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);
}
@Override
public void showArticles(List<Article> articles)
{
}
@Override
public void showFilteredArticles(List<Article> articles)
{
}
@Override
public void showError(Throwable throwable)
{
switch (throwable.getMessage())
{
case ErrorEvent.LOAD_STATE_ARTICLE:
controller.loadArticle(data.getId());
break;
case ErrorEvent.LOAD_ARTICLE:
Toast.makeText(getActivity(), getString(R.string.error_message), Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void showLoading()
{
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void dismissLoading()
{
}
@Override
public void onSaveInstanceState(Bundle outState)
{
controller.saveState(outState);
super.onSaveInstanceState(outState);
}
@Override
public void onAnimationStart(Animation animation)
{
}
@Override
public void onAnimationEnd(Animation animation)
{
footer.setVisibility(animation == fadein ? View.VISIBLE : View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation)
{
}
@OnClick(R.id.iv_refresh)
public void onRefresh()
{
controller.loadArticle(data.getId());
}
}