/* * Copyright (C) 2014 Fastboot Mobile, LLC. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; * if not, see <http://www.gnu.org/licenses>. */ package com.fastbootmobile.encore.app.fragments; import android.os.Handler; import android.support.v4.app.Fragment; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.fastbootmobile.encore.app.ArtistActivity; import com.fastbootmobile.encore.service.PlaybackService; import com.getbase.floatingactionbutton.FloatingActionButton; import com.fastbootmobile.encore.app.R; import com.fastbootmobile.encore.app.ui.CircularPathAnimation; import com.fastbootmobile.encore.app.ui.PlayPauseDrawable; import com.fastbootmobile.encore.app.ui.ReverseAnimator; import com.fastbootmobile.encore.framework.PlaybackProxy; import com.fastbootmobile.encore.utils.Utils; public class MaterialReelBaseFragment extends Fragment { private Handler mHandler; private RelativeLayout mBarLayout; private ImageView mBarPlay; private ImageView mBarNext; private ImageView mBarPrevious; private ImageView mBarRepeat; private ImageView mBarShuffle; private TextView mBarTitle; private float mSourceDeltaX; protected boolean mMaterialBarVisible = false; protected PlayPauseDrawable mBarDrawable; private static final float DISABLED_OPACITY = 0.5f; public MaterialReelBaseFragment() { mHandler = new Handler(); } protected void setupMaterialReelBar(View rootView, View.OnClickListener fabClickListener) { // Material reel mBarLayout = (RelativeLayout) rootView.findViewById(R.id.layoutBar); mBarPlay = (ImageView) rootView.findViewById(R.id.btnBarPlay); mBarNext = (ImageView) rootView.findViewById(R.id.btnBarNext); mBarPrevious = (ImageView) rootView.findViewById(R.id.btnBarPrevious); mBarRepeat = (ImageView) rootView.findViewById(R.id.btnBarRepeat); mBarShuffle = (ImageView) rootView.findViewById(R.id.btnBarShuffle); mBarTitle = (TextView) rootView.findViewById(R.id.tvBarTitle); mBarDrawable = new PlayPauseDrawable(getResources(), 1); mBarDrawable.setShape(PlayPauseDrawable.SHAPE_PLAY); mBarDrawable.setYOffset(-3); mBarDrawable.setColor(0xFFFFFFFF); mBarPlay.setImageDrawable(mBarDrawable); mBarPlay.setOnClickListener(fabClickListener); mBarNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlaybackProxy.next(); } }); mBarPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlaybackProxy.previous(); } }); mBarRepeat.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isRepeat = !PlaybackProxy.isRepeatMode(); PlaybackProxy.setRepeatMode(isRepeat); v.setAlpha(isRepeat ? 1 : DISABLED_OPACITY); } }); mBarShuffle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isShuffle = !PlaybackProxy.isShuffleMode(); PlaybackProxy.setShuffleMode(isShuffle); v.setAlpha(isShuffle ? 1 : DISABLED_OPACITY); } }); } protected void showMaterialReelBar(final FloatingActionButton playFab) { if (mMaterialBarVisible) { return; } mMaterialBarVisible = true; mBarLayout.setVisibility(View.VISIBLE); mBarLayout.setAlpha(0); mHandler.post(new Runnable() { @Override public void run() { final int DP = getResources().getDimensionPixelSize(R.dimen.one_dp); mSourceDeltaX = ((mBarLayout.getMeasuredWidth() / 2) - playFab.getLeft()) - playFab.getMeasuredWidth() / 2; CircularPathAnimation anim = new CircularPathAnimation(0, mSourceDeltaX, 0, 125 * DP); anim.setDuration(400); anim.setInterpolator(new AccelerateDecelerateInterpolator()); anim.setFillAfter(true); mHandler.postDelayed(new Runnable() { @Override public void run() { if (isDetached() || getActivity() == null) { return; } try { mBarLayout.setAlpha(1.0f); mBarLayout.setBackgroundColor(playFab.getNormalColor()); Utils.animateHeadingReveal(mBarLayout, mBarLayout.getMeasuredWidth() / 2, (int) (mBarLayout.getMeasuredHeight() / 1.25f), ArtistActivity.BACK_DELAY); playFab.animate().setStartDelay(80) .alpha(0).scaleX(0.5f).scaleY(0.5f).setDuration(150).start(); mBarPlay.setAlpha(0f); mBarNext.setAlpha(0f); mBarNext.setTranslationX(-16 * DP); mBarNext.setScaleX(0); mBarNext.setScaleY(0); mBarPrevious.setAlpha(0f); mBarPrevious.setTranslationX(16 * DP); mBarPrevious.setScaleX(0); mBarPrevious.setScaleY(0); mBarRepeat.setAlpha(0f); mBarRepeat.setTranslationX(-16 * DP); mBarRepeat.setScaleX(0); mBarRepeat.setScaleY(0); mBarShuffle.setAlpha(0f); mBarShuffle.setTranslationX(16 * DP); mBarShuffle.setScaleX(0); mBarShuffle.setScaleY(0); mBarPlay.animate().alpha(1).setDuration(100).start(); mBarNext.animate().alpha(1).scaleX(1).scaleY(1) .translationX(0).setDuration(250).start(); mBarRepeat.animate().alpha(PlaybackProxy.isRepeatMode() ? 1 : DISABLED_OPACITY) .scaleX(1).scaleY(1) .translationX(0).setDuration(250).start(); mBarPrevious.animate().alpha(1).translationX(0).scaleX(1).scaleY(1) .setDuration(250).start(); mBarShuffle.animate().alpha(PlaybackProxy.isShuffleMode() ? 1 : DISABLED_OPACITY) .translationX(0).scaleX(1).scaleY(1) .setDuration(250).start(); } catch (IllegalStateException ignore) { } } }, 300); playFab.startAnimation(anim); } }); } protected void hideMaterialReelBar(final FloatingActionButton playFab) { if (!mMaterialBarVisible) { return; } mMaterialBarVisible = false; mHandler.post(new Runnable() { @Override public void run() { final int DP = getResources().getDimensionPixelSize(R.dimen.one_dp); Utils.animateHeadingHiding(mBarLayout, mBarLayout.getMeasuredWidth() / 2, (int) (mBarLayout.getMeasuredHeight() / 1.25f), ArtistActivity.BACK_DELAY); mBarLayout.setAlpha(1.0f); mBarPlay.setAlpha(1f); mBarNext.setAlpha(1f); mBarNext.setTranslationX(0); mBarNext.setScaleX(1); mBarNext.setScaleY(1); mBarShuffle.setTranslationX(0); mBarShuffle.setScaleX(1); mBarShuffle.setScaleY(1); mBarPrevious.setAlpha(1f); mBarPrevious.setTranslationX(0); mBarPrevious.setScaleX(1); mBarPrevious.setScaleY(1); mBarRepeat.setTranslationX(0); mBarRepeat.setScaleX(1); mBarRepeat.setScaleY(1); mBarPlay.animate().alpha(0).setDuration(100).start(); mBarNext.animate().alpha(0).scaleX(0).scaleY(0) .translationX(16 * DP).setDuration(250).start(); mBarRepeat.animate().alpha(0).scaleX(0).scaleY(0) .translationX(16 * DP).setDuration(250).start(); mBarPrevious.animate().alpha(0).translationX(-16 * DP).scaleX(0).scaleY(0) .setDuration(250).start(); mBarShuffle.animate().alpha(0).scaleX(0).scaleY(0) .translationX(16 * DP).setDuration(250).start(); playFab.animate().setStartDelay(150) .alpha(1).scaleX(1.0f).scaleY(1.0f).setDuration(150).start(); mHandler.postDelayed(new Runnable() { @Override public void run() { CircularPathAnimation anim = new CircularPathAnimation(0, mSourceDeltaX, 0, 125 * DP); anim.setDuration(400); anim.setInterpolator(new ReverseAnimator(new AccelerateDecelerateInterpolator())); anim.setFillAfter(true); playFab.startAnimation(anim); } }, 150); mHandler.postDelayed(new Runnable() { @Override public void run() { mBarLayout.setVisibility(View.GONE); } }, 500); } }); } protected void setReelBarTitle(String title) { mBarTitle.setText(title); } @Override public void onResume() { super.onResume(); // Update playback status, if needed if (mMaterialBarVisible) { if (PlaybackProxy.getState() == PlaybackService.STATE_PAUSED) { mBarDrawable.setShape(PlayPauseDrawable.SHAPE_PLAY); } } } }