diff --git a/app/build.gradle b/app/build.gradle index 5ada34d4..bc6112db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ dependencies { implementation 'com.github.jellyfin.jellyfin-apiclient-java:android:0.6.3' implementation 'com.google.android.exoplayer:exoplayer:2.11.4' - implementation 'androidx.core:core:1.3.0' + implementation 'androidx.core:core:1.3.1' implementation 'androidx.media:media:1.1.0' implementation 'androidx.fragment:fragment:1.2.5' implementation 'androidx.legacy:legacy-support-v13:1.0.0' @@ -66,7 +66,6 @@ dependencies { implementation 'com.afollestad.material-dialogs:commons:0.9.6.0' implementation 'com.afollestad:material-cab:0.1.12' - implementation 'com.github.ksoichiro:android-observablescrollview:1.6.0' implementation 'com.heinrichreimersoftware:material-intro:1.6' implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.11.0' diff --git a/app/src/main/java/com/dkanada/gramophone/adapter/song/AlbumSongAdapter.java b/app/src/main/java/com/dkanada/gramophone/adapter/song/AlbumSongAdapter.java index b32b8618..d22109aa 100644 --- a/app/src/main/java/com/dkanada/gramophone/adapter/song/AlbumSongAdapter.java +++ b/app/src/main/java/com/dkanada/gramophone/adapter/song/AlbumSongAdapter.java @@ -56,6 +56,7 @@ public class AlbumSongAdapter extends SongAdapter { if (imageText != null) { imageText.setVisibility(View.VISIBLE); } + if (image != null) { image.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/dkanada/gramophone/misc/SimpleObservableScrollViewCallbacks.java b/app/src/main/java/com/dkanada/gramophone/misc/SimpleObservableScrollViewCallbacks.java deleted file mode 100644 index 2ddb0295..00000000 --- a/app/src/main/java/com/dkanada/gramophone/misc/SimpleObservableScrollViewCallbacks.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dkanada.gramophone.misc; - -import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; -import com.github.ksoichiro.android.observablescrollview.ScrollState; - -public abstract class SimpleObservableScrollViewCallbacks implements ObservableScrollViewCallbacks { - @Override - public void onScrollChanged(int i, boolean b, boolean b2) { - } - - @Override - public void onDownMotionEvent() { - } - - @Override - public void onUpOrCancelMotionEvent(ScrollState scrollState) { - } -} diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java index bb4d2ddc..696c197a 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/AlbumDetailActivity.java @@ -20,7 +20,7 @@ import com.afollestad.materialdialogs.util.DialogUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; -import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; +import com.google.android.material.appbar.AppBarLayout; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.dkanada.gramophone.R; @@ -34,7 +34,6 @@ import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.interfaces.CabHolder; import com.dkanada.gramophone.interfaces.MediaCallback; import com.dkanada.gramophone.interfaces.PaletteColorHolder; -import com.dkanada.gramophone.misc.SimpleObservableScrollViewCallbacks; import com.dkanada.gramophone.model.Album; import com.dkanada.gramophone.model.Artist; import com.dkanada.gramophone.model.Song; @@ -51,21 +50,21 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder { +public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder, AppBarLayout.OnOffsetChangedListener { public static final String EXTRA_ALBUM = "extra_album"; private Album album; + @BindView(R.id.app_bar_layout) + AppBarLayout appBarLayout; @BindView(R.id.list) - ObservableRecyclerView recyclerView; + RecyclerView recyclerView; @BindView(R.id.image) ImageView albumArtImageView; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.header) View headerView; - @BindView(R.id.header_overlay) - View headerOverlay; @BindView(R.id.artist_icon) ImageView artistIconImageView; @@ -118,27 +117,17 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements }); } + @Override + public void onOffsetChanged (AppBarLayout appBarLayout, int verticalOffset) { + float headerAlpha = Math.max(0, Math.min(1, 1 + (2 * (float) verticalOffset / headerViewHeight))); + headerView.setAlpha(headerAlpha); + } + @Override protected View createContentView() { return wrapSlidingMusicPanel(R.layout.activity_album_detail); } - 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)); - albumArtImageView.setTranslationY(Math.max(-scrollY, -headerViewHeight)); - } - }; - private void setUpObservableListViewParams() { headerViewHeight = getResources().getDimensionPixelSize(R.dimen.detail_header_height); } @@ -183,7 +172,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements private void setColors(int color) { toolbarColor = color; - headerView.setBackgroundColor(color); + appBarLayout.setBackgroundColor(color); setNavigationbarColor(color); setTaskDescriptionColor(color); @@ -210,14 +199,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements } private void setUpRecyclerView() { - setUpRecyclerViewPadding(); - recyclerView.setScrollViewCallbacks(observableScrollViewCallbacks); - final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); - contentView.post(() -> observableScrollViewCallbacks.onScrollChanged(-headerViewHeight, false, false)); - } - - private void setUpRecyclerViewPadding() { - recyclerView.setPadding(0, headerViewHeight, 0, 0); + appBarLayout.addOnOffsetChangedListener(this); } private void setUpToolBar() { diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java index 9b6469b3..68479018 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/ArtistDetailActivity.java @@ -3,7 +3,6 @@ package com.dkanada.gramophone.ui.activities; import android.graphics.PorterDuff; import android.os.Build; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -12,6 +11,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; @@ -24,12 +24,12 @@ import com.afollestad.materialdialogs.util.DialogUtils; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; -import com.github.ksoichiro.android.observablescrollview.ObservableListView; +import com.dkanada.gramophone.adapter.song.SongAdapter; +import com.google.android.material.appbar.AppBarLayout; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.dkanada.gramophone.R; import com.dkanada.gramophone.adapter.album.HorizontalAlbumAdapter; -import com.dkanada.gramophone.adapter.song.ArtistSongAdapter; import com.dkanada.gramophone.dialogs.AddToPlaylistDialog; import com.dkanada.gramophone.dialogs.SleepTimerDialog; import com.dkanada.gramophone.glide.CustomGlideRequest; @@ -39,7 +39,6 @@ import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.interfaces.CabHolder; import com.dkanada.gramophone.interfaces.MediaCallback; import com.dkanada.gramophone.interfaces.PaletteColorHolder; -import com.dkanada.gramophone.misc.SimpleObservableScrollViewCallbacks; import com.dkanada.gramophone.model.Album; import com.dkanada.gramophone.model.Artist; import com.dkanada.gramophone.model.Song; @@ -51,19 +50,21 @@ import com.dkanada.gramophone.util.QueryUtil; import org.jellyfin.apiclient.model.querying.ItemQuery; -public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder { +public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder, AppBarLayout.OnOffsetChangedListener { public static final String EXTRA_ARTIST = "extra_artist"; - @BindView(R.id.list) - ObservableListView songListView; + @BindView(R.id.app_bar_layout) + AppBarLayout appBarLayout; + @BindView(R.id.albums) + RecyclerView albumRecyclerView; + @BindView(R.id.songs) + RecyclerView songRecyclerView; @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; @@ -78,32 +79,13 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement @BindView(R.id.album_count_text) TextView albumCountTextView; - View songListHeader; - RecyclerView albumRecyclerView; - private MaterialCab cab; private int headerViewHeight; private int toolbarColor; private Artist artist; private HorizontalAlbumAdapter albumAdapter; - private ArtistSongAdapter songAdapter; - - 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)); - } - }; + private SongAdapter songAdapter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -113,7 +95,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement usePalette = PreferenceUtil.getInstance(this).getAlbumArtistColoredFooters(); - initViews(); setUpObservableListViewParams(); setUpToolbar(); setUpViews(); @@ -144,6 +125,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement }); } + @Override + public void onOffsetChanged (AppBarLayout appBarLayout, int verticalOffset) { + float headerAlpha = Math.max(0, Math.min(1, 1 + (2 * (float) verticalOffset / headerViewHeight))); + headerView.setAlpha(headerAlpha); + } + @Override protected View createContentView() { return wrapSlidingMusicPanel(R.layout.activity_artist_detail); @@ -155,11 +142,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement headerViewHeight = getResources().getDimensionPixelSize(R.dimen.detail_header_height); } - private void initViews() { - songListHeader = LayoutInflater.from(this).inflate(R.layout.artist_detail_header, songListView, false); - albumRecyclerView = songListHeader.findViewById(R.id.recycler_view); - } - private void setUpViews() { setUpSongListView(); setUpAlbumRecyclerView(); @@ -167,19 +149,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement } private void setUpSongListView() { - setUpSongListPadding(); - songListView.setScrollViewCallbacks(observableScrollViewCallbacks); - songListView.addHeaderView(songListHeader); + appBarLayout.addOnOffsetChangedListener(this); - songAdapter = new ArtistSongAdapter(this, getArtist().songs, this); - songListView.setAdapter(songAdapter); + songAdapter = new SongAdapter(this, getArtist().songs, R.layout.item_list, false, this); - final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); - contentView.post(() -> observableScrollViewCallbacks.onScrollChanged(-headerViewHeight, false, false)); - } - - private void setUpSongListPadding() { - songListView.setPadding(0, headerViewHeight, 0, 0); + songRecyclerView.setLayoutManager(new GridLayoutManager(this, 1)); + songRecyclerView.setAdapter(songAdapter); } private void setUpAlbumRecyclerView() { @@ -234,7 +209,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private void setColors(int color) { toolbarColor = color; - headerView.setBackgroundColor(color); + appBarLayout.setBackgroundColor(color); setNavigationbarColor(color); setTaskDescriptionColor(color); @@ -350,9 +325,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement albumCountTextView.setText(MusicUtil.getAlbumCountString(this, artist.albums.size())); durationTextView.setText(MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs))); - // TODO this activity will crash when an artist is passed with an empty album array - // something in the album adapter is causing the issue - if (artist.albums.size() != 0) songAdapter.swapDataSet(artist.songs); + if (artist.songs.size() != 0) songAdapter.swapDataSet(artist.songs); if (artist.albums.size() != 0) albumAdapter.swapDataSet(artist.albums); } diff --git a/app/src/main/res/layout/activity_album_detail.xml b/app/src/main/res/layout/activity_album_detail.xml index eec4af21..7c432f58 100644 --- a/app/src/main/res/layout/activity_album_detail.xml +++ b/app/src/main/res/layout/activity_album_detail.xml @@ -26,38 +26,33 @@ - - - - + android:layout_height="wrap_content"> - - + android:layout_margin="16dp" + android:scaleType="centerCrop" + android:src="@drawable/default_album_art" + android:transitionName="@string/transition_album_art" + tools:ignore="ContentDescription,UnusedAttribute" /> - + + + + + android:clipToPadding="false" + android:divider="@null" + android:dividerHeight="0dp" + android:scrollbars="none" /> - + - - - - - + diff --git a/app/src/main/res/layout/activity_artist_detail.xml b/app/src/main/res/layout/activity_artist_detail.xml index 872f16a1..2560d649 100644 --- a/app/src/main/res/layout/activity_artist_detail.xml +++ b/app/src/main/res/layout/activity_artist_detail.xml @@ -26,38 +26,33 @@ - - - - + android:layout_height="wrap_content"> - - + android:layout_margin="16dp" + android:scaleType="centerCrop" + android:src="@drawable/default_artist_image" + android:transitionName="@string/transition_artist_image" + tools:ignore="ContentDescription,UnusedAttribute" /> - + + + + + android:orientation="vertical"> - + - + - + - + + + + + diff --git a/app/src/main/res/layout/artist_detail_header.xml b/app/src/main/res/layout/artist_detail_header.xml deleted file mode 100644 index 2b8fd5f7..00000000 --- a/app/src/main/res/layout/artist_detail_header.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index bdfedd59..dfc35d43 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { } dependencies { - classpath 'com.android.tools:r8:1.6.84' - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools:r8:2.0.88' + classpath 'com.android.tools.build:gradle:4.0.1' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } }