diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 6d1f0b7a..64cb5961 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -158,9 +158,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements private void setUpObservableListViewParams() { toolbarColor = DialogUtils.resolveColor(this, R.attr.defaultFooterColor); headerViewHeight = getResources().getDimensionPixelSize(R.dimen.detail_header_height); - if (headerViewHeight == 0) { - albumArtImageView.setVisibility(View.GONE); - } } private void setUpViews() { @@ -230,12 +227,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements setUpRecyclerViewPadding(); recyclerView.setScrollViewCallbacks(observableScrollViewCallbacks); final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); - contentView.post(() -> { - observableScrollViewCallbacks.onScrollChanged(-(headerViewHeight), false, false); - // necessary to fix a bug - recyclerView.scrollBy(0, 1); - recyclerView.scrollBy(0, -1); - }); + contentView.post(() -> observableScrollViewCallbacks.onScrollChanged(-headerViewHeight, false, false)); } private void setUpRecyclerViewPadding() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 3791917f..09f7d89b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -2,7 +2,7 @@ package com.kabouzeid.gramophone.ui.activities; import android.content.Context; import android.content.Intent; -import android.os.Build; +import android.graphics.PorterDuff; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -48,6 +48,7 @@ import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.CustomArtistImageUtil; +import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PhonographColorUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; @@ -73,27 +74,36 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement public static final String EXTRA_ARTIST_ID = "extra_artist_id"; - @BindView(R.id.image) - ImageView artistImage; - @BindView(R.id.list_background) - View songListBackground; @BindView(R.id.list) ObservableListView songListView; - @BindView(R.id.title) - TextView artistName; + @BindView(R.id.image) + ImageView artistImage; @BindView(R.id.toolbar) Toolbar toolbar; + @BindView(R.id.header) + View headerView; + @BindView(R.id.header_overlay) + View headerOverlay; + + @BindView(R.id.duration_icon) + ImageView durationIconImageView; + @BindView(R.id.song_count_icon) + ImageView songCountIconImageView; + @BindView(R.id.album_count_icon) + ImageView albumCountIconImageView; + @BindView(R.id.duration_text) + TextView durationTextView; + @BindView(R.id.song_count_text) + TextView songCountTextView; + @BindView(R.id.album_count_text) + TextView albumCountTextView; View songListHeader; RecyclerView albumRecyclerView; private MaterialCab cab; - private int headerOffset; - private int titleViewHeight; - private int artistImageViewHeight; + private int headerViewHeight; private int toolbarColor; - private float toolbarAlpha; - private boolean usePalette; private Artist artist; @Nullable @@ -105,6 +115,21 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private LastFMRestClient lastFMRestClient; private boolean forceDownload; + private final SimpleObservableScrollViewCallbacks observableScrollViewCallbacks = new SimpleObservableScrollViewCallbacks() { + @Override + public void onScrollChanged(int scrollY, boolean b, boolean b2) { + scrollY += headerViewHeight; + + // Change alpha of overlay + float headerAlpha = Math.max(0, Math.min(1, (float) 2 * scrollY / headerViewHeight)); + headerOverlay.setBackgroundColor(ColorUtil.withAlpha(toolbarColor, headerAlpha)); + + // Translate name text + headerView.setTranslationY(Math.max(-scrollY, -headerViewHeight)); + headerOverlay.setTranslationY(Math.max(-scrollY, -headerViewHeight)); + artistImage.setTranslationY(Math.max(-scrollY, -headerViewHeight)); + } + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -130,41 +155,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement return wrapSlidingMusicPanel(R.layout.activity_artist_detail); } - private final SimpleObservableScrollViewCallbacks observableScrollViewCallbacks = new SimpleObservableScrollViewCallbacks() { - @Override - public void onScrollChanged(int scrollY, boolean b, boolean b2) { - scrollY += artistImageViewHeight + titleViewHeight; - float flexibleRange = artistImageViewHeight - headerOffset; - - // Translate album cover - artistImage.setTranslationY(Math.max(-artistImageViewHeight, -scrollY / 2)); - - // Translate list background - songListBackground.setTranslationY(Math.max(0, -scrollY + artistImageViewHeight)); - - // Change alpha of overlay - toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); - toolbar.setBackgroundColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha)); - setStatusbarColor(ColorUtil.withAlpha(toolbarColor, cab != null && cab.isActive() ? 1 : toolbarAlpha)); - - // Translate name text - int maxTitleTranslationY = artistImageViewHeight; - int titleTranslationY = maxTitleTranslationY - scrollY; - titleTranslationY = Math.max(headerOffset, titleTranslationY); - - artistName.setTranslationY(titleTranslationY); - } - }; + private boolean usePalette; private void setUpObservableListViewParams() { - artistImageViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height); toolbarColor = DialogUtils.resolveColor(this, R.attr.defaultFooterColor); - int toolbarHeight = Util.getActionBarSize(this); - titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height); - headerOffset = toolbarHeight; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - headerOffset += getResources().getDimensionPixelSize(R.dimen.status_bar_padding); - } + headerViewHeight = getResources().getDimensionPixelSize(R.dimen.detail_header_height); } private void initViews() { @@ -186,14 +181,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement songListView.setAdapter(songAdapter); final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); - contentView.post(() -> { - songListBackground.getLayoutParams().height = contentView.getHeight(); - observableScrollViewCallbacks.onScrollChanged(-(artistImageViewHeight + titleViewHeight), false, false); - }); + contentView.post(() -> observableScrollViewCallbacks.onScrollChanged(-headerViewHeight, false, false)); } private void setUpSongListPadding() { - songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, 0); + songListView.setPadding(0, headerViewHeight, 0, 0); } private void setUpAlbumRecyclerView() { @@ -301,10 +293,22 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private void setColors(int color) { toolbarColor = color; - artistName.setBackgroundColor(color); - artistName.setTextColor(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(color))); + headerView.setBackgroundColor(color); + setNavigationbarColor(color); setTaskDescriptionColor(color); + + toolbar.setBackgroundColor(color); + setSupportActionBar(toolbar); // needed to auto readjust the toolbar content color + setStatusbarColor(color); + + int secondaryTextColor = MaterialValueHelper.getSecondaryTextColor(this, ColorUtil.isColorLight(color)); + durationIconImageView.setColorFilter(secondaryTextColor, PorterDuff.Mode.SRC_IN); + songCountIconImageView.setColorFilter(secondaryTextColor, PorterDuff.Mode.SRC_IN); + albumCountIconImageView.setColorFilter(secondaryTextColor, PorterDuff.Mode.SRC_IN); + durationTextView.setTextColor(secondaryTextColor); + songCountTextView.setTextColor(secondaryTextColor); + albumCountTextView.setTextColor(secondaryTextColor); } private void setUpToolbar() { @@ -318,7 +322,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_artist_detail, menu); menu.findItem(R.id.action_colored_footers).setChecked(usePalette); - return true; + return super.onCreateOptionsMenu(menu); } @Override @@ -395,7 +399,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement .start(new MaterialCab.Callback() { @Override public boolean onCabCreated(MaterialCab materialCab, Menu menu) { - setStatusbarColor(ColorUtil.stripAlpha(toolbarColor)); return callback.onCabCreated(materialCab, menu); } @@ -406,7 +409,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement @Override public boolean onCabFinished(MaterialCab materialCab) { - setStatusbarColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha)); return callback.onCabFinished(materialCab); } }); @@ -442,7 +444,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement loadBiography(); } - artistName.setText(artist.getName()); + getSupportActionBar().setTitle(artist.getName()); + songCountTextView.setText(MusicUtil.getSongCountString(this, artist.getSongCount())); + albumCountTextView.setText(MusicUtil.getAlbumCountString(this, artist.getAlbumCount())); + durationTextView.setText(MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.getSongs()))); + songAdapter.swapDataSet(artist.getSongs()); albumAdapter.swapDataSet(artist.albums); } 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 4ec9ed83..03fc90e1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -133,6 +133,12 @@ public class MusicUtil { return songCount + " " + songString; } + @NonNull + public static String getAlbumCountString(@NonNull final Context context, int albumCount) { + final String albumString = albumCount == 1 ? context.getResources().getString(R.string.album) : context.getResources().getString(R.string.albums); + return albumCount + " " + albumString; + } + public static long getTotalDuration(@NonNull final Context context, @NonNull List songs) { long duration = 0; for (int i = 0; i < songs.size(); i++) { diff --git a/app/src/main/res/drawable/ic_album_white_24dp.xml b/app/src/main/res/drawable/ic_album_white_24dp.xml new file mode 100644 index 00000000..6aa0cec6 --- /dev/null +++ b/app/src/main/res/drawable/ic_album_white_24dp.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/layout/activity_artist_detail.xml b/app/src/main/res/layout/activity_artist_detail.xml index 4d1828c0..22787fc5 100644 --- a/app/src/main/res/layout/activity_artist_detail.xml +++ b/app/src/main/res/layout/activity_artist_detail.xml @@ -1,86 +1,188 @@ - + + android:layout_height="match_parent" + android:orientation="vertical"> - + - + android:elevation="@dimen/toolbar_elevation" + tools:ignore="UnusedAttribute"> - - - - - - - - + - + - + android:layout_height="match_parent"> - + + android:orientation="vertical"> - - - + android:layout_height="@dimen/detail_header_height" + android:background="?attr/defaultFooterColor" + android:elevation="@dimen/toolbar_elevation" + android:orientation="horizontal" + tools:ignore="UnusedAttribute"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml index 4da3d3d8..c460f0bd 100644 --- a/app/src/main/res/values-land/dimens.xml +++ b/app/src/main/res/values-land/dimens.xml @@ -3,8 +3,6 @@ 112dp 56dp - 180dp - 72dp diff --git a/app/src/main/res/values-sw600dp-land/dimens.xml b/app/src/main/res/values-sw600dp-land/dimens.xml index a0a6d8b4..a6b3daec 100644 --- a/app/src/main/res/values-sw600dp-land/dimens.xml +++ b/app/src/main/res/values-sw600dp-land/dimens.xml @@ -1,4 +1,2 @@ - - 420dp - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml index 80ad83e9..355d33ff 100644 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ b/app/src/main/res/values-sw600dp/dimens.xml @@ -1,5 +1,4 @@ - 600dp 176dp 144dp diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e525347d..4e4c5da8 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -11,7 +11,6 @@ 168dp - 360dp 20dp 120dp 104dp