/*
* Copyright (C) 2014 Michell Bak
*
* 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 com.miz.mizuu.fragments;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import com.miz.apis.tmdb.TMDbMovieService;
import com.miz.base.MizActivity;
import com.miz.functions.BlurTransformation;
import com.miz.functions.CompleteActor;
import com.miz.functions.MizLib;
import com.miz.functions.PaletteLoader;
import com.miz.mizuu.MizuuApplication;
import com.miz.mizuu.R;
import com.miz.utils.IntentUtils;
import com.miz.utils.TypefaceUtils;
import com.miz.utils.ViewUtils;
import com.miz.views.HorizontalCardLayout;
import com.miz.views.ObservableScrollView;
import com.miz.views.ObservableScrollView.OnScrollChangedListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
public class ActorDetailsFragment extends Fragment {
private String mActorId;
private CompleteActor mActor;
private Activity mContext;
private TextView mName, mPlaceOfBirth, mBirthday, mKnownCredits, mBiography;
private ImageView mPhoto, mBackdrop;
private ObservableScrollView mScrollView;
private HorizontalCardLayout mMovieCards, mTvCards, mPhotoCards, mTaggedPhotoCards;
private int mImageThumbSize, mImageThumbBackdropSize, mImageThumbSpacing, mToolbarColor = 0;
private Typeface mMedium, mBold, mCondensedRegular;
private View mProgressLayout, mDetailsLayout;
private Picasso mPicasso;
private Toolbar mToolbar;
private PaletteLoader mPaletteLoader;
public ActorDetailsFragment() {}
public static ActorDetailsFragment newInstance(String actorId) {
ActorDetailsFragment frag = new ActorDetailsFragment();
Bundle args = new Bundle();
args.putString("actorId", actorId);
frag.setArguments(args);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mContext = getActivity();
mActorId = getArguments().getString("actorId");
mPicasso = MizuuApplication.getPicasso(mContext);
mMedium = TypefaceUtils.getRobotoMedium(mContext);
mBold = TypefaceUtils.getRobotoBold(mContext);
mCondensedRegular = TypefaceUtils.getRobotoCondensedRegular(mContext);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.actor_details, container, false);
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
mToolbar.setBackgroundResource(android.R.color.transparent);
ViewUtils.setProperToolbarSize(mContext, mToolbar);
((MizActivity) getActivity()).setSupportActionBar(mToolbar);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// This needs to be re-initialized here and not in onCreate()
mImageThumbSize = getResources().getDimensionPixelSize(R.dimen.horizontal_grid_item_width);
mImageThumbBackdropSize = getResources().getDimensionPixelSize(R.dimen.horizontal_grid_item_backdrop_width);
mImageThumbSpacing = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_spacing);
// Progress layout
mProgressLayout = view.findViewById(R.id.progress_layout);
// Details layout
mDetailsLayout = view.findViewById(R.id.details_area);
mName = (TextView) view.findViewById(R.id.actor_name);
mName.setTypeface(mCondensedRegular);
mPlaceOfBirth = (TextView) view.findViewById(R.id.place_of_birth);
mPlaceOfBirth.setTypeface(mBold);
mBirthday = (TextView) view.findViewById(R.id.actor_birthday);
mBirthday.setTypeface(mMedium);
mKnownCredits = (TextView) view.findViewById(R.id.actor_known_credits);
mKnownCredits.setTypeface(mMedium);
mBiography = (TextView) view.findViewById(R.id.actor_biography);
mBiography.setBackgroundResource(R.drawable.selectable_background);
mBiography.setMaxLines(mContext.getResources().getInteger(R.integer.show_details_max_lines));
mBiography.setTag(true); // true = collapsed
mBiography.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((Boolean) mBiography.getTag())) {
// Animate
ViewUtils.animateTextViewMaxLines(mBiography, 50); // It seems highly unlikely that there would every be more than 50 lines
// Reverse the tag
mBiography.setTag(false);
} else {
// Animate
ViewUtils.animateTextViewMaxLines(mBiography,
getResources().getInteger(R.integer.show_details_max_lines));
// Reverse the tag
mBiography.setTag(true);
}
}
});
mBiography.setEllipsize(TextUtils.TruncateAt.END);
mBiography.setFocusable(true);
mBiography.setTypeface(mCondensedRegular);
mPhoto = (ImageView) view.findViewById(R.id.actor_image);
mBackdrop = (ImageView) view.findViewById(R.id.imageBackground);
mMovieCards = (HorizontalCardLayout) view.findViewById(R.id.actor_movie_cards);
mTvCards = (HorizontalCardLayout) view.findViewById(R.id.actor_tv_cards);
mPhotoCards = (HorizontalCardLayout) view.findViewById(R.id.actor_photo_cards);
mTaggedPhotoCards = (HorizontalCardLayout) view.findViewById(R.id.actor_tagged_photo_cards);
mScrollView = (ObservableScrollView) view.findViewById(R.id.observableScrollView);
final int height = MizLib.getActionBarAndStatusBarHeight(mContext);
mScrollView.setOnScrollChangedListener(new OnScrollChangedListener() {
@Override
public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
ViewUtils.handleOnScrollChangedEvent(
getActivity(), view, mPhoto, mActor.getName(),
height, t, mToolbar, mToolbarColor);
}
});
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewUtils.setLayoutParamsForDetailsEmptyView(mContext, view,
mBackdrop, mScrollView, this);
}
});
ViewUtils.updateToolbarBackground(getActivity(), mToolbar, 0, "", mToolbarColor);
if (mActor == null)
new ActorLoader(mActorId).execute();
else
fillViews();
}
private void fillViews() {
mName.setText(mActor.getName());
if (!TextUtils.isEmpty(mActor.getPlaceOfBirth()))
mPlaceOfBirth.setText(mActor.getPlaceOfBirth());
else
mPlaceOfBirth.setVisibility(View.GONE);
if (!TextUtils.isEmpty(mActor.getBiography()))
mBiography.setText(mActor.getBiography());
else
mBiography.setText(R.string.no_biography);
mBirthday.setText(MizLib.getPrettyDatePrecise(mContext, mActor.getBirthday()));
mKnownCredits.setText(String.valueOf(mActor.getKnownCreditCount()));
loadImages();
mMovieCards.setTitle(R.string.chooserMovies);
mMovieCards.setSeeMoreVisibility(true);
mMovieCards.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mMovieCards.getWidth() > 0) {
final int numColumns = (int) Math.floor(mMovieCards.getWidth() / (mImageThumbSize + mImageThumbSpacing));
mImageThumbSize = (mMovieCards.getWidth() - (numColumns * mImageThumbSpacing)) / numColumns;
mMovieCards.loadItems(mContext, mPicasso, numColumns, mImageThumbSize, mActor.getMovies(), HorizontalCardLayout.MOVIES, mToolbarColor);
MizLib.removeViewTreeObserver(mMovieCards.getViewTreeObserver(), this);
}
}
});
mMovieCards.setSeeMoreOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(IntentUtils.getActorMoviesIntent(mContext, mActor.getName(), mActor.getId(), mToolbarColor));
}
});
mTvCards.setTitle(R.string.chooserTVShows);
mTvCards.setSeeMoreVisibility(true);
mTvCards.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mTvCards.getWidth() > 0) {
final int numColumns = (int) Math.floor(mTvCards.getWidth() / (mImageThumbSize + mImageThumbSpacing));
mImageThumbSize = (mTvCards.getWidth() - (numColumns * mImageThumbSpacing)) / numColumns;
mTvCards.loadItems(mContext, mPicasso, numColumns, mImageThumbSize, mActor.getTvShows(), HorizontalCardLayout.TV_SHOWS, mToolbarColor);
MizLib.removeViewTreeObserver(mTvCards.getViewTreeObserver(), this);
}
}
});
mTvCards.setSeeMoreOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(IntentUtils.getActorTvShowsIntent(mContext, mActor.getName(), mActor.getId(), mToolbarColor));
}
});
mPhotoCards.setTitle(R.string.actorsShowAllPhotos);
mPhotoCards.setSeeMoreVisibility(true);
mPhotoCards.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mPhotoCards.getWidth() > 0) {
final int numColumns = (int) Math.floor(mPhotoCards.getWidth() / (mImageThumbSize + mImageThumbSpacing));
mImageThumbSize = (mPhotoCards.getWidth() - (numColumns * mImageThumbSpacing)) / numColumns;
mPhotoCards.loadItems(mContext, mPicasso, numColumns, mImageThumbSize, mActor.getPhotos(), HorizontalCardLayout.PHOTOS, mToolbarColor);
MizLib.removeViewTreeObserver(mPhotoCards.getViewTreeObserver(), this);
}
}
});
mPhotoCards.setSeeMoreOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(IntentUtils.getActorPhotosIntent(mContext, mActor.getName(), mActor.getId(), mToolbarColor));
}
});
mTaggedPhotoCards.setTitle(R.string.actorsTaggedPhotos);
mTaggedPhotoCards.setSeeMoreVisibility(true);
mTaggedPhotoCards.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mTaggedPhotoCards.getWidth() > 0) {
final int numColumns = (int) Math.floor(mTaggedPhotoCards.getWidth() / (mImageThumbBackdropSize + mImageThumbSpacing));
mImageThumbBackdropSize = (mTaggedPhotoCards.getWidth() - (numColumns * mImageThumbSpacing)) / numColumns;
mTaggedPhotoCards.loadItems(mContext, mPicasso, numColumns, mImageThumbBackdropSize, mActor.getTaggedPhotos(), HorizontalCardLayout.TAGGED_PHOTOS, mToolbarColor);
MizLib.removeViewTreeObserver(mTaggedPhotoCards.getViewTreeObserver(), this);
}
}
});
mTaggedPhotoCards.setSeeMoreOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(IntentUtils.getActorTaggedPhotosIntent(mContext, mActor.getName(), mActor.getId(), mToolbarColor));
}
});
}
private void loadImages() {
mPicasso.load(mActor.getProfilePhoto()).placeholder(R.drawable.noactor).error(R.drawable.noactor).into(mPhoto, new Callback() {
@Override
public void onSuccess() {
if (mPaletteLoader == null) {
mPaletteLoader = new PaletteLoader(mPicasso, Uri.parse(mActor.getProfilePhotoThumb()), new PaletteLoader.OnPaletteLoadedCallback() {
@Override
public void onPaletteLoaded(int swatchColor) {
mToolbarColor = swatchColor;
}
});
mPaletteLoader.addView(mDetailsLayout);
mPaletteLoader.addView(mMovieCards.getSeeMoreView());
mPaletteLoader.addView(mTvCards.getSeeMoreView());
mPaletteLoader.addView(mPhotoCards.getSeeMoreView());
mPaletteLoader.addView(mTaggedPhotoCards.getSeeMoreView());
mPaletteLoader.execute();
} else {
// Clear old views after configuration change
mPaletteLoader.clearViews();
// Add views after configuration change
mPaletteLoader.addView(mDetailsLayout);
mPaletteLoader.addView(mMovieCards.getSeeMoreView());
mPaletteLoader.addView(mTvCards.getSeeMoreView());
mPaletteLoader.addView(mPhotoCards.getSeeMoreView());
mPaletteLoader.addView(mTaggedPhotoCards.getSeeMoreView());
// Re-color the views
mPaletteLoader.colorViews();
}
}
@Override
public void onError() {
}
});
if (!MizLib.isPortrait(mContext)) {
String backdropImage = mActor.getBackdropImage();
mPicasso.load(backdropImage).placeholder(R.drawable.bg).error(R.drawable.bg).transform(new BlurTransformation(mContext, backdropImage, 2)).into(mBackdrop);
mBackdrop.setColorFilter(Color.parseColor("#88181818"), android.graphics.PorterDuff.Mode.SRC_OVER);
}
}
private class ActorLoader extends AsyncTask<Void, Void, Void> {
private final String mActorId;
public ActorLoader(String actorId) {
mActorId = actorId;
}
@Override
protected void onPreExecute() {
// Show that we're loading
mProgressLayout.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
// Load the actor details
TMDbMovieService service = TMDbMovieService.getInstance(mContext);
mActor = service.getCompleteActorDetails(mActorId);
for (int i = 0; i < mActor.getMovies().size(); i++) {
String id = mActor.getMovies().get(i).getId();
mActor.getMovies().get(i).setInLibrary(MizuuApplication.getMovieAdapter().movieExists(id));
}
for (int i = 0; i < mActor.getTvShows().size(); i++) {
String id = mActor.getTvShows().get(i).getId();
String title = mActor.getTvShows().get(i).getTitle();
mActor.getTvShows().get(i).setInLibrary(MizuuApplication.getTvDbAdapter().showExists(id, title));
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// No longer loading, so hide the layout
mProgressLayout.setVisibility(View.GONE);
// Fill in all the details
fillViews();
}
}
}