package eu.se_bastiaan.popcorntimeremote.fragments; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.graphics.Palette; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.google.android.youtube.player.YouTubeStandalonePlayer; import com.google.gson.internal.LinkedTreeMap; import com.nineoldandroids.animation.ArgbEvaluator; import com.nineoldandroids.animation.ObjectAnimator; import com.nirhart.parallaxscroll.views.ParallaxScrollView; import com.squareup.picasso.Picasso; import butterknife.ButterKnife; import butterknife.Bind; import eu.se_bastiaan.popcorntimeremote.Constants; import eu.se_bastiaan.popcorntimeremote.R; import eu.se_bastiaan.popcorntimeremote.rpc.PopcornTimeRpcClient; import eu.se_bastiaan.popcorntimeremote.utils.ActionBarBackground; import eu.se_bastiaan.popcorntimeremote.utils.PixelUtils; import eu.se_bastiaan.popcorntimeremote.utils.Version; public class MovieControllerFragment extends BaseControlFragment { private static final String OVERLAY_FRAGMENT = "overlay_fragment"; private Drawable mPlayButtonDrawable; private LinkedTreeMap<String, Object> mCurrentMap; private Integer mLastScrollLocation = 0, mPaletteColor = R.color.primary, mOpenBarPos, mHeaderHeight, mToolbarHeight, mParallaxHeight; private Boolean mTransparentBar = true, mOpenBar = true, mIsFavourited = false; View toolbar; @Bind(R.id.scrollView) ParallaxScrollView scrollView; @Bind(R.id.coverImage) ImageView coverImage; @Bind(R.id.mainInfoBlock) RelativeLayout mainInfoBlock; @Bind(R.id.playButton) ImageButton playButton; @Bind(R.id.titleText) TextView titleText; @Bind(R.id.yearText) TextView yearText; @Bind(R.id.runtimeText) TextView runtimeText; @Bind(R.id.ratingText) TextView ratingText; @Bind(R.id.synopsisText) TextView synopsisText; @Bind(R.id.favouriteText) TextView favouriteText; @Bind(R.id.synopsisBlock) LinearLayout synopsisBlock; @Bind(R.id.qualityBlock) LinearLayout qualityBlock; @Bind(R.id.favouriteBlock) LinearLayout favouriteBlock; @Bind(R.id.trailerBlock) LinearLayout trailerBlock; @Bind(R.id.subtitlesBlock) LinearLayout subtitlesBlock; @Bind(R.id.playerBlock) LinearLayout playerBlock; @Bind(R.id.topDivider) View topDivider; private final View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { switch(v.getId()) { case R.id.playButton: getClient().enter(mBlankResponseCallback); break; case R.id.qualityBlock: getClient().toggleQuality(mBlankResponseCallback); break; case R.id.synopsisBlock: SynopsisDialogFragment synopsisDialogFragment = new SynopsisDialogFragment(); Bundle b = new Bundle(); b.putString("text", (String) mCurrentMap.get("synopsis")); synopsisDialogFragment.setArguments(b); synopsisDialogFragment.show(getActivity().getSupportFragmentManager(), OVERLAY_FRAGMENT); break; case R.id.subtitlesBlock: SubtitleSelectorDialogFragment subtitleFragment = new SubtitleSelectorDialogFragment(); subtitleFragment.setArguments(getArguments()); subtitleFragment.show(getActivity().getSupportFragmentManager(), OVERLAY_FRAGMENT); break; case R.id.playerBlock: PlayerSelectorDialogFragment playerFragment = new PlayerSelectorDialogFragment(); playerFragment.setArguments(getArguments()); playerFragment.show(getActivity().getSupportFragmentManager(), OVERLAY_FRAGMENT); break; case R.id.favouriteBlock: getClient().toggleFavourite(mBlankResponseCallback); mIsFavourited = !mIsFavourited; if(mIsFavourited) { favouriteText.setText(R.string.remove_favourite); } else { favouriteText.setText(R.string.add_favourite); } break; case R.id.trailerBlock: getClient().playTrailer(new PopcornTimeRpcClient.Callback() { @Override public void onCompleted(Exception e, PopcornTimeRpcClient.RpcResponse result) { if(e != null) { String videoId = mCurrentMap.get("trailer").toString().replace("http://youtube.com/watch?v=", ""); if(videoId != null && getActivity() != null) { Intent intent = YouTubeStandalonePlayer.createVideoIntent(getActivity(), Constants.YOUTUBE_KEY, videoId, 0, true, true); startActivity(intent); } } } }); break; default: break; } } }; private final ViewTreeObserver.OnScrollChangedListener mOnScrollListener = new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) toolbar.getLayoutParams(); if(scrollView.getScrollY() > mHeaderHeight) { if (mLastScrollLocation > scrollView.getScrollY()) { // scroll up if ((mOpenBarPos == null || !mOpenBar) && layoutParams.topMargin <= -mToolbarHeight) mOpenBarPos = scrollView.getScrollY() - mToolbarHeight; mOpenBar = true; } else if (mLastScrollLocation < scrollView.getScrollY()) { // scroll down if (mOpenBarPos == null || mOpenBar) mOpenBarPos = scrollView.getScrollY(); mOpenBar = false; } if (layoutParams.topMargin <= 0) layoutParams.topMargin = mOpenBarPos - scrollView.getScrollY(); if (layoutParams.topMargin > 0) { layoutParams.topMargin = 0; } } /* Fade out when over header */ if(mParallaxHeight - scrollView.getScrollY() < 0) { if(mTransparentBar) { mTransparentBar = false; ActionBarBackground.changeColor((AppCompatActivity) getActivity(), mPaletteColor, false); } } else { if(!mTransparentBar) { mTransparentBar = true; ActionBarBackground.fadeOut((AppCompatActivity) getActivity()); } } toolbar.setLayoutParams(layoutParams); mLastScrollLocation = scrollView.getScrollY(); } }; private final PopcornTimeRpcClient.Callback mSelectionCallback = new PopcornTimeRpcClient.Callback() { @Override public void onCompleted(Exception e, PopcornTimeRpcClient.RpcResponse result) { try { if (result != null && e == null) { mCurrentMap = result.getMapResult(); // movie info final String title = (String) mCurrentMap.get("title"); final String synopsis = (String) mCurrentMap.get("synopsis"); final String year; if(mCurrentMap.get("year") instanceof Double) { year = Integer.toString(((Double) mCurrentMap.get("year")).intValue()); } else { year = (String) mCurrentMap.get("year"); } final String runtime = Integer.toString(((Double) mCurrentMap.get("runtime")).intValue()); String tempRating; try { tempRating = (String) mCurrentMap.get("rating"); } catch (ClassCastException ex) { tempRating = Double.toString( (Double) mCurrentMap.get("rating") ); } final String rating = tempRating; mIsFavourited = (Boolean) mCurrentMap.get("bookmarked"); mHandler.post(new Runnable() { @Override public void run() { titleText.setText(title); synopsisText.setText(synopsis); yearText.setText(year); runtimeText.setText(runtime + " " + getString(R.string.minutes)); ratingText.setText(rating + "/10"); if(mIsFavourited) { favouriteText.setText(R.string.remove_favourite); } else { favouriteText.setText(R.string.add_favourite); } if(!mCurrentMap.containsKey("trailer")) { trailerBlock.setVisibility(View.GONE); topDivider.setVisibility(View.GONE); } } }); // poster/color final String posterUrl; if(mCurrentMap.containsKey("image")) { posterUrl = ((String) mCurrentMap.get("image")).replace("-300.jpg", ".jpg"); } else { LinkedTreeMap<String, String> images = (LinkedTreeMap<String, String>) mCurrentMap.get("images"); posterUrl = images.get("poster").replace("-300.jpg", ".jpg"); } final String backdropUrl; if(mCurrentMap.containsKey("backdrop")) { backdropUrl = (String) mCurrentMap.get("backdrop"); } else { LinkedTreeMap<String, String> images = (LinkedTreeMap<String, String>) mCurrentMap.get("images"); backdropUrl = images.get("fanart"); } Bitmap poster = Picasso.with(getActivity()).load(posterUrl).get(); Palette palette = Palette.generate(poster); try { int vibrantColor = palette.getVibrantColor(R.color.primary); if (vibrantColor == R.color.primary) { mPaletteColor = palette.getMutedColor(R.color.primary); } else { mPaletteColor = vibrantColor; } final ObjectAnimator mainInfoBlockColorFade = ObjectAnimator.ofObject(mainInfoBlock, "backgroundColor", new ArgbEvaluator(), getResources().getColor(R.color.primary), mPaletteColor); mainInfoBlockColorFade.setDuration(500); Drawable oldDrawable = PixelUtils.changeDrawableColor(getActivity(), R.drawable.ic_av_play_button, getResources().getColor(R.color.primary)); mPlayButtonDrawable = PixelUtils.changeDrawableColor(getActivity(), R.drawable.ic_av_play_button, mPaletteColor); final TransitionDrawable td = new TransitionDrawable(new Drawable[]{oldDrawable, mPlayButtonDrawable}); mHandler.post(new Runnable() { @Override public void run() { playButton.setImageDrawable(td); } }); mHandler.post(new Runnable() { @Override public void run() { Picasso.with(getActivity()).load(backdropUrl).into(coverImage, new com.squareup.picasso.Callback() { @Override public void onSuccess() { if(getActivity() == null) return; Animation fadeInAnim = AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in); mainInfoBlockColorFade.start(); td.startTransition(500); coverImage.setVisibility(View.VISIBLE); coverImage.startAnimation(fadeInAnim); } @Override public void onError() { } }); } }); } catch (Exception ex) { ex.printStackTrace(); } } } catch(Exception exception) { exception.printStackTrace(); } } }; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_moviecontroller, container, false); ButterKnife.bind(this, v); Drawable playButtonDrawable = PixelUtils.changeDrawableColor(getActivity(), R.drawable.ic_av_play_button, getResources().getColor(R.color.primary)); if(mPlayButtonDrawable == null) playButton.setImageDrawable(playButtonDrawable); playButton.setOnClickListener(mOnClickListener); synopsisBlock.setOnClickListener(mOnClickListener); trailerBlock.setOnClickListener(mOnClickListener); subtitlesBlock.setOnClickListener(mOnClickListener); favouriteBlock.setOnClickListener(mOnClickListener); qualityBlock.setOnClickListener(mOnClickListener); playerBlock.setOnClickListener(mOnClickListener); mParallaxHeight = PixelUtils.getPixelsFromDp(getActivity(), 228); toolbar = getActionBarView(); mToolbarHeight = toolbar.getHeight(); mHeaderHeight = mParallaxHeight - mToolbarHeight; scrollView.setOverScrollMode(View.OVER_SCROLL_NEVER); scrollView.getViewTreeObserver().addOnScrollChangedListener(mOnScrollListener); if(!Version.compare(getClient().getVersion(), "0.0.0")) { playerBlock.setVisibility(View.GONE); trailerBlock.setVisibility(View.GONE); synopsisBlock.setVisibility(View.GONE); } getClient().getSelection(mSelectionCallback); return v; } @Override public void onDestroyView() { super.onDestroyView(); scrollView.getViewTreeObserver().removeOnScrollChangedListener(mOnScrollListener); new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... voids) { final RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) toolbar.getLayoutParams(); try { if (layoutParams.topMargin < 0) { int height; if (layoutParams.topMargin < -mToolbarHeight) { height = -mToolbarHeight; } else { height = layoutParams.topMargin; } for (int i = height; i != 1; i++) { layoutParams.topMargin = i; mHandler.post(new Runnable() { @Override public void run() { toolbar.setLayoutParams(layoutParams); } }); } } } catch(Exception e) { layoutParams.topMargin = 0; mHandler.post(new Runnable() { @Override public void run() { toolbar.setLayoutParams(layoutParams); } }); } return null; } }.execute(); } }