Removed all blurred images. New FAB animation when opening now playing. Decreased image loader memory cache size.

This commit is contained in:
Karim Abou Zeid 2015-10-11 22:56:27 +02:00
commit 1be2260b60
9 changed files with 144 additions and 709 deletions

View file

@ -1,7 +1,5 @@
package com.kabouzeid.gramophone.ui.activities;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
@ -11,12 +9,9 @@ import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.transition.Transition;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
@ -27,13 +22,11 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.misc.SimpleTransitionListener;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
@ -70,8 +63,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
ObservableRecyclerView recyclerView;
@Bind(R.id.image)
ImageView albumArtImageView;
@Bind(R.id.album_art_background)
ImageView albumArtBackground;
@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.title)
@ -105,7 +96,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
setUpObservableListViewParams();
setUpToolBar();
setUpViews();
animateAlbumArtBackgroundOnEnterTransitionEnd();
}
@Override
@ -113,32 +103,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
return wrapSlidingMusicPanelAndFab(R.layout.activity_album_detail);
}
private void animateAlbumArtBackgroundOnEnterTransitionEnd() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getEnterTransition().addListener(new SimpleTransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
albumArtBackground.setVisibility(View.INVISIBLE);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onTransitionEnd(Transition transition) {
int cx = (albumArtBackground.getLeft() + albumArtBackground.getRight()) / 2;
int cy = (albumArtBackground.getTop() + albumArtBackground.getBottom()) / 2;
int finalRadius = Math.max(albumArtBackground.getWidth(), albumArtBackground.getHeight());
Animator animator = ViewAnimationUtils.createCircularReveal(albumArtBackground, cx, cy, albumArtImageView.getWidth() / 2, finalRadius);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(1000);
animator.start();
albumArtBackground.setVisibility(View.VISIBLE);
}
});
}
}
private final SimpleObservableScrollViewCallbacks observableScrollViewCallbacks = new SimpleObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
@ -147,7 +111,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
// Translate album cover
albumArtImageView.setTranslationY(Math.max(-albumArtViewHeight, -scrollY / 2));
albumArtBackground.setTranslationY(Math.max(-albumArtViewHeight, -scrollY / 2));
// Translate list background
songsBackgroundView.setTranslationY(Math.max(0, -scrollY + albumArtViewHeight));
@ -218,7 +181,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
setUpBackground("drawable://" + R.drawable.default_album_art);
setColors(ColorUtil.resolveColor(AlbumDetailActivity.this, R.attr.default_bar_color));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
@ -231,7 +193,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
onLoadingFailed(imageUri, view, null);
return;
}
setUpBackground(imageUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
startPostponedEnterTransition();
@ -240,14 +201,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
);
}
private void setUpBackground(String imageUri) {
ImageLoader.getInstance().displayImage(
imageUri,
albumArtBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor.Builder(this).build()).build()
);
}
private void setColors(int vibrantColor) {
toolbarColor = vibrantColor;
albumTitleView.setBackgroundColor(vibrantColor);

View file

@ -1,7 +1,5 @@
package com.kabouzeid.gramophone.ui.activities;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
@ -13,14 +11,10 @@ import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.text.Spanned;
import android.transition.Transition;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@ -33,7 +27,6 @@ import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter;
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
@ -42,7 +35,6 @@ import com.kabouzeid.gramophone.loader.ArtistAlbumLoader;
import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.misc.SimpleTransitionListener;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song;
@ -75,8 +67,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
public static final String EXTRA_ARTIST_ID = "extra_artist_id";
@Bind(R.id.artist_image_background)
ImageView artistImageBackground;
@Bind(R.id.image)
SquareIfPlaceImageView artistImage;
@Bind(R.id.list_background)
@ -122,7 +112,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
setUpObservableListViewParams();
setUpViews();
setUpToolbar();
animateAlbumArtBackgroundOnEnterTransitionEnd();
}
@Override
@ -130,32 +119,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return wrapSlidingMusicPanelAndFab(R.layout.activity_artist_detail);
}
private void animateAlbumArtBackgroundOnEnterTransitionEnd() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getEnterTransition().addListener(new SimpleTransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
artistImageBackground.setVisibility(View.INVISIBLE);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onTransitionEnd(Transition transition) {
int cx = (artistImageBackground.getLeft() + artistImageBackground.getRight()) / 2;
int cy = (artistImageBackground.getTop() + artistImageBackground.getBottom()) / 2;
int finalRadius = Math.max(artistImageBackground.getWidth(), artistImageBackground.getHeight());
Animator animator = ViewAnimationUtils.createCircularReveal(artistImageBackground, cx, cy, artistImage.getWidth() / 2, finalRadius);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(1000);
animator.start();
artistImageBackground.setVisibility(View.VISIBLE);
}
});
}
}
private final SimpleObservableScrollViewCallbacks observableScrollViewCallbacks = new SimpleObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
@ -164,7 +127,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
// Translate album cover
artistImage.setTranslationY(Math.max(-artistImageViewHeight, -scrollY / 2));
artistImageBackground.setTranslationY(Math.max(-artistImageViewHeight, -scrollY / 2));
// Translate list background
songListBackground.setTranslationY(Math.max(0, -scrollY + artistImageViewHeight));
@ -311,7 +273,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
setUpBackground("drawable://" + R.drawable.default_artist_image);
setColors(ColorUtil.resolveColor(ArtistDetailActivity.this, R.attr.default_bar_color));
toastUpdatedArtistImageIfDownloadWasForced();
@ -324,8 +285,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return;
}
setUpBackground(imageUri);
toastUpdatedArtistImageIfDownloadWasForced();
}
@ -356,14 +315,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return toolbarColor;
}
private void setUpBackground(String imageUri) {
ImageLoader.getInstance().displayImage(
imageUri,
artistImageBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor.Builder(this).build()).build()
);
}
private void setColors(int vibrantColor) {
toolbarColor = vibrantColor;
artistName.setBackgroundColor(vibrantColor);

View file

@ -23,7 +23,6 @@ import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.CardView;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
@ -50,7 +49,6 @@ import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.FloatingActionButtonProperties;
import com.kabouzeid.gramophone.misc.SimpleAnimatorListener;
@ -130,8 +128,6 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
RelativeLayout mediaControllerContainer;
@Bind(R.id.player_media_controller_container_background)
View mediaControllerContainerBackground;
@Bind(R.id.player_album_art_background)
ImageView albumArtBackground;
@Bind(R.id.player_image)
SquareIfPlaceImageView albumArt;
@Bind(R.id.player_status_bar)
@ -167,7 +163,8 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
private Song song;
private PlayPauseDrawable playPauseDrawable;
private PlayPauseDrawable miniPlayerPlayPauseDrawable;
private PlayPauseDrawable playerFabPlayPauseDrawable;
private AnimatorSet colorTransitionAnimator;
@ -310,12 +307,13 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
};
private void setUpPlayPauseButtons() {
updatePlayPauseDrawableState(false);
updatePlayPauseDrawablesStates(false);
miniPlayerPlayPauseButton.setImageDrawable(miniPlayerPlayPauseDrawable);
playerPlayPauseFab.setImageDrawable(playerFabPlayPauseDrawable);
miniPlayerPlayPauseButton.setImageDrawable(playPauseDrawable);
playerPlayPauseFab.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_keyboard_arrow_up_white_24dp));
setUpPlayerPlayPauseFabTint();
miniPlayerPlayPauseButton.getDrawable().mutate().setColorFilter(ColorUtil.resolveColor(this, android.R.attr.textColorSecondary), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setColorFilter(ColorUtil.resolveColor(this, android.R.attr.textColorSecondary), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setOnClickListener(playPauseButtonOnClickListener);
playerPlayPauseFab.setOnClickListener(playPauseButtonOnClickListener);
@ -381,6 +379,16 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mediaControllerContainer.setVisibility(View.INVISIBLE);
}
playerPlayPauseFab.post(new Runnable() {
@Override
public void run() {
playerPlayPauseFab.setPivotX(playerPlayPauseFab.getWidth() / 2);
playerPlayPauseFab.setPivotY(playerPlayPauseFab.getHeight() / 2);
}
});
playerPlayPauseFab.setScaleX(0f);
playerPlayPauseFab.setScaleY(0f);
playerPlayPauseFab.setRotation(0f);
slidingUpPanelLayout.setPanelSlideListener(this);
}
@ -398,6 +406,9 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mediaControllerContainer.setVisibility(View.INVISIBLE);
}
playerPlayPauseFab.setScaleX(0f);
playerPlayPauseFab.setScaleY(0f);
playerPlayPauseFab.setRotation(0f);
}
@Override
@ -406,17 +417,24 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
if (shouldColorNavigationBar()) {
super.setNavigationBarColor(lastFooterColor);
}
playerPlayPauseFab.animate()
.scaleX(1)
.scaleY(1)
.rotation(360f)
.setInterpolator(new DecelerateInterpolator())
.start();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (mediaControllerContainer.getVisibility() == View.INVISIBLE) {
int cx = (playerPlayPauseFab.getLeft() + playerPlayPauseFab.getRight()) / 2;
int cy = (playerPlayPauseFab.getTop() + playerPlayPauseFab.getBottom()) / 2;
int finalRadius = Math.max(mediaControllerContainer.getWidth(), mediaControllerContainer.getHeight());
final Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, playerPlayPauseFab.getWidth() / 2, finalRadius);
final Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, 0, finalRadius);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(FAB_CIRCULAR_REVEAL_ANIMATION_TIME);
animator.start();
mediaControllerContainer.setVisibility(View.VISIBLE);
}
}
@ -469,21 +487,26 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
}
}
protected void updatePlayPauseDrawableState(boolean animate) {
if (playPauseDrawable == null) {
playPauseDrawable = new PlayPauseDrawable(this);
protected void updatePlayPauseDrawablesStates(boolean animate) {
if (miniPlayerPlayPauseDrawable == null) {
miniPlayerPlayPauseDrawable = new PlayPauseDrawable(this);
}
if (playerFabPlayPauseDrawable == null) {
playerFabPlayPauseDrawable = new PlayPauseDrawable(this);
}
if (MusicPlayerRemote.isPlaying()) {
playPauseDrawable.setPause(animate);
miniPlayerPlayPauseDrawable.setPause(animate);
playerFabPlayPauseDrawable.setPause(animate);
} else {
playPauseDrawable.setPlay(animate);
miniPlayerPlayPauseDrawable.setPlay(animate);
playerFabPlayPauseDrawable.setPlay(animate);
}
}
@Override
public void onPlayStateChanged() {
super.onPlayStateChanged();
updatePlayPauseDrawableState(true);
updatePlayPauseDrawablesStates(true);
}
protected View wrapSlidingMusicPanelAndFab(@LayoutRes int resId) {
@ -722,7 +745,6 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
}
private void setUpAlbumArtViews() {
albumArtBackground.setAlpha(0.7f);
albumArt.forceSquare(forceSquareAlbumArt);
if (opaqueStatusBar) {
if (opaqueToolBar) {
@ -838,26 +860,13 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
FadeInBitmapDisplayer.animate(view, ViewUtil.DEFAULT_COLOR_ANIMATION_DURATION);
setColors(ColorUtil.resolveColor(AbsSlidingMusicPanelActivity.this, R.attr.default_bar_color));
ImageLoader.getInstance().displayImage(
"drawable://" + R.drawable.default_album_art,
albumArtBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor.Builder(AbsSlidingMusicPanelActivity.this).build()).build()
);
}
@Override
public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) {
if (loadedImage == null) {
onLoadingFailed(imageUri, view, null);
return;
}
ImageLoader.getInstance().displayImage(
imageUri,
albumArtBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor.Builder(AbsSlidingMusicPanelActivity.this).build()).build()
);
}
}
);