package com.esoxjem.movieguide.details;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.esoxjem.movieguide.BaseApplication;
import com.esoxjem.movieguide.Constants;
import com.esoxjem.movieguide.Movie;
import com.esoxjem.movieguide.R;
import com.esoxjem.movieguide.Review;
import com.esoxjem.movieguide.Video;
import com.squareup.picasso.Picasso;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MovieDetailsFragment extends Fragment implements MovieDetailsView, View.OnClickListener
{
@Inject
MovieDetailsPresenter movieDetailsPresenter;
@Bind(R.id.movie_poster)
ImageView poster;
@Bind(R.id.collapsing_toolbar)
CollapsingToolbarLayout collapsingToolbar;
@Bind(R.id.movie_name)
TextView title;
@Bind(R.id.movie_year)
TextView releaseDate;
@Bind(R.id.movie_rating)
TextView rating;
@Bind(R.id.movie_description)
TextView overview;
@Bind(R.id.trailers_label)
TextView label;
@Bind(R.id.trailers)
LinearLayout trailers;
@Bind(R.id.trailers_container)
HorizontalScrollView horizontalScrollView;
@Bind(R.id.reviews_label)
TextView reviews;
@Bind(R.id.reviews)
LinearLayout reviewsContainer;
@Bind(R.id.favorite)
FloatingActionButton favorite;
@Bind(R.id.toolbar)
Toolbar toolbar;
private Movie movie;
public MovieDetailsFragment()
{
// Required empty public constructor
}
public static MovieDetailsFragment getInstance(@NonNull Movie movie)
{
Bundle args = new Bundle();
args.putParcelable(Constants.MOVIE, movie);
MovieDetailsFragment movieDetailsFragment = new MovieDetailsFragment();
movieDetailsFragment.setArguments(args);
return movieDetailsFragment;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true);
((BaseApplication) getActivity().getApplication()).createDetailsComponent().inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_movie_details, container, false);
ButterKnife.bind(this, rootView);
setToolbar();
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
if (getArguments() != null)
{
Movie movie = (Movie) getArguments().get(Constants.MOVIE);
if (movie != null)
{
this.movie = movie;
movieDetailsPresenter.setView(this);
movieDetailsPresenter.showDetails((movie));
movieDetailsPresenter.showFavoriteButton(movie);
}
}
}
private void setToolbar()
{
collapsingToolbar.setContentScrimColor(ContextCompat.getColor(getContext(), R.color.colorPrimary));
collapsingToolbar.setTitle(getString(R.string.movie_details));
collapsingToolbar.setCollapsedTitleTextAppearance(R.style.CollapsedToolbar);
collapsingToolbar.setExpandedTitleTextAppearance(R.style.ExpandedToolbar);
collapsingToolbar.setTitleEnabled(true);
if (toolbar != null)
{
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
}
} else
{
// Don't inflate. Tablet is in landscape mode.
}
}
@Override
public void showDetails(Movie movie)
{
Glide.with(getContext()).load(movie.getBackdropPath()).into(poster);
title.setText(movie.getTitle());
releaseDate.setText(String.format(getString(R.string.release_date), movie.getReleaseDate()));
rating.setText(String.format(getString(R.string.rating), String.valueOf(movie.getVoteAverage())));
overview.setText(movie.getOverview());
movieDetailsPresenter.showTrailers(movie);
movieDetailsPresenter.showReviews(movie);
}
@Override
public void showTrailers(List<Video> trailers)
{
if (trailers.isEmpty())
{
label.setVisibility(View.GONE);
this.trailers.setVisibility(View.GONE);
horizontalScrollView.setVisibility(View.GONE);
} else
{
label.setVisibility(View.VISIBLE);
this.trailers.setVisibility(View.VISIBLE);
horizontalScrollView.setVisibility(View.VISIBLE);
this.trailers.removeAllViews();
LayoutInflater inflater = getActivity().getLayoutInflater();
Picasso picasso = Picasso.with(getContext());
for (Video trailer : trailers)
{
View thumbContainer = inflater.inflate(R.layout.video, this.trailers, false);
ImageView thumbView = ButterKnife.findById(thumbContainer, R.id.video_thumb);
thumbView.setTag(Video.getUrl(trailer));
thumbView.requestLayout();
thumbView.setOnClickListener(this);
picasso
.load(Video.getThumbnailUrl(trailer))
.resizeDimen(R.dimen.video_width, R.dimen.video_height)
.centerCrop()
.placeholder(R.color.colorPrimary)
.into(thumbView);
this.trailers.addView(thumbContainer);
}
}
}
@Override
public void showReviews(List<Review> reviews)
{
if (reviews.isEmpty())
{
this.reviews.setVisibility(View.GONE);
reviewsContainer.setVisibility(View.GONE);
} else
{
this.reviews.setVisibility(View.VISIBLE);
reviewsContainer.setVisibility(View.VISIBLE);
reviewsContainer.removeAllViews();
LayoutInflater inflater = getActivity().getLayoutInflater();
for (Review review : reviews)
{
ViewGroup reviewContainer = (ViewGroup) inflater.inflate(R.layout.review, reviewsContainer, false);
TextView reviewAuthor = ButterKnife.findById(reviewContainer, R.id.review_author);
TextView reviewContent = ButterKnife.findById(reviewContainer, R.id.review_content);
reviewAuthor.setText(review.getAuthor());
reviewContent.setText(review.getContent());
reviewContent.setOnClickListener(this);
reviewsContainer.addView(reviewContainer);
}
}
}
@Override
public void showFavorited()
{
favorite.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_favorite_white_24dp));
}
@Override
public void showUnFavorited()
{
favorite.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_favorite_border_white_24dp));
}
@OnClick(R.id.favorite)
public void onClick(View view)
{
switch (view.getId())
{
case R.id.video_thumb:
onThumbnailClick(view);
break;
case R.id.review_content:
onReviewClick((TextView) view);
break;
case R.id.favorite:
onFavoriteClick();
break;
default:
break;
}
}
private void onReviewClick(TextView view)
{
if (view.getMaxLines() == 5)
{
view.setMaxLines(500);
} else
{
view.setMaxLines(5);
}
}
private void onThumbnailClick(View view)
{
String videoUrl = (String) view.getTag();
Intent playVideoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(videoUrl));
startActivity(playVideoIntent);
}
private void onFavoriteClick()
{
movieDetailsPresenter.onFavoriteClick(movie);
}
@Override
public void onDestroyView()
{
super.onDestroyView();
movieDetailsPresenter.destroy();
ButterKnife.unbind(this);
}
@Override
public void onDestroy()
{
super.onDestroy();
((BaseApplication) getActivity().getApplication()).releaseDetailsComponent();
}
}