From 456fc40cd7ea065d8258e4cec282065f956a1d02 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sun, 28 Jun 2015 15:14:20 +0200 Subject: [PATCH] Added an animation when adding a song to favorites from the now playing screen. --- .../dialogs/AddToPlaylistDialog.java | 2 +- .../dialogs/CreatePlaylistDialog.java | 2 +- .../activities/MusicControllerActivity.java | 56 ++++++++++++++++++ .../kabouzeid/gramophone/util/MusicUtil.java | 2 +- .../gramophone/util/PlaylistsUtil.java | 12 ++-- .../ic_favorite_red_a400_96dp.png | Bin 0 -> 7942 bytes .../res/layout/activity_music_controller.xml | 8 +++ 7 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_favorite_red_a400_96dp.png diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java index 2bfdfae6..2791719a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java @@ -57,7 +57,7 @@ public class AddToPlaylistDialog extends DialogFragment { CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST"); } else { materialDialog.dismiss(); - PlaylistsUtil.addToPlaylist(getActivity(), songs, playlists.get(i - 1).id); + PlaylistsUtil.addToPlaylist(getActivity(), songs, playlists.get(i - 1).id, true); } } }) diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java index 9a413090..2faf8b32 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java @@ -57,7 +57,7 @@ public class CreatePlaylistDialog extends DialogFragment { if (playlistId != -1 && getActivity() != null) { //noinspection unchecked ArrayList songs = (ArrayList) getArguments().getSerializable("songs"); - PlaylistsUtil.addToPlaylist(getActivity(), songs, playlistId); + PlaylistsUtil.addToPlaylist(getActivity(), songs, playlistId, true); } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index 54bba598..e5eaafdf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -25,6 +25,7 @@ import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; +import android.view.animation.OvershootInterpolator; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; @@ -97,6 +98,8 @@ public class MusicControllerActivity extends AbsFabActivity { SquareIfPlaceImageView albumArt; @InjectView(R.id.toolbar) Toolbar toolbar; + @InjectView(R.id.favorite_icon) + ImageView favoriteIcon; TextView songCurrentProgress; TextView songTotalTime; @@ -542,6 +545,56 @@ public class MusicControllerActivity extends AbsFabActivity { updateShuffleState(); } + private void animateSetFavorite() { + favoriteIcon.clearAnimation(); + + favoriteIcon.setAlpha(0f); + favoriteIcon.setScaleX(0f); + favoriteIcon.setScaleY(0f); + favoriteIcon.setVisibility(View.VISIBLE); + favoriteIcon.setPivotX(favoriteIcon.getWidth() / 2); + favoriteIcon.setPivotY(favoriteIcon.getHeight() / 2); + + favoriteIcon.animate() + .setDuration(600) + .setInterpolator(new OvershootInterpolator()) + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + + } + + @Override + public void onAnimationCancel(Animator animation) { + favoriteIcon.setVisibility(View.INVISIBLE); + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }) + .withEndAction(new Runnable() { + @Override + public void run() { + favoriteIcon.animate() + .setDuration(300) + .setInterpolator(new DecelerateInterpolator()) + .alpha(0f) + .start(); + } + }) + .start(); + } + @Override public void onPlayingMetaChanged() { super.onPlayingMetaChanged(); @@ -576,6 +629,9 @@ public class MusicControllerActivity extends AbsFabActivity { switch (id) { case R.id.action_toggle_favorite: MusicUtil.toggleFavorite(this, song); + if (MusicUtil.isFavorite(this, song)) { + animateSetFavorite(); + } invalidateOptionsMenu(); return true; case R.id.action_share: diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java index ca8da482..86f340f9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -209,7 +209,7 @@ public class MusicUtil { if (isFavorite(context, song)) { PlaylistsUtil.removeFromPlaylist(context, song, getFavoritesPlaylist(context).id); } else { - PlaylistsUtil.addToPlaylist(context, song, getOrCreateFavoritesPlaylist(context).id); + PlaylistsUtil.addToPlaylist(context, song, getOrCreateFavoritesPlaylist(context).id, false); } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java index c3831de4..49f07bab 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java @@ -85,13 +85,13 @@ public class PlaylistsUtil { App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); } - public static void addToPlaylist(final Context context, final Song song, final int playlistId) { + public static void addToPlaylist(final Context context, final Song song, final int playlistId, final boolean showToastOnFinish) { List helperList = new ArrayList<>(); helperList.add(song); - addToPlaylist(context, helperList, playlistId); + addToPlaylist(context, helperList, playlistId, showToastOnFinish); } - public static void addToPlaylist(final Context context, final List songs, final int playlistId) { + public static void addToPlaylist(final Context context, final List songs, final int playlistId, final boolean showToastOnFinish) { final int size = songs.size(); final ContentResolver resolver = context.getContentResolver(); final String[] projection = new String[]{ @@ -117,8 +117,10 @@ public class PlaylistsUtil { for (int offSet = 0; offSet < size; offSet += 1000) numinserted += resolver.bulkInsert(uri, makeInsertItems(songs, offSet, 1000, base)); - Toast.makeText(context, context.getResources().getString( - R.string.inserted_x_songs_into_playlist, numinserted), Toast.LENGTH_SHORT).show(); + if (showToastOnFinish) { + Toast.makeText(context, context.getResources().getString( + R.string.inserted_x_songs_into_playlist, numinserted), Toast.LENGTH_SHORT).show(); + } App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_favorite_red_a400_96dp.png b/app/src/main/res/drawable-xxxhdpi/ic_favorite_red_a400_96dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3771d507ef8c34379bbc1f370fc68b6d5a8505 GIT binary patch literal 7942 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_music_controller.xml b/app/src/main/res/layout/activity_music_controller.xml index a5c670ff..bf74e10b 100644 --- a/app/src/main/res/layout/activity_music_controller.xml +++ b/app/src/main/res/layout/activity_music_controller.xml @@ -208,6 +208,14 @@ android:transitionName="@string/transition_album_cover" tools:ignore="ContentDescription,UnusedAttribute" /> + +