From 80f392621061e6e355c41d9857ae80077ca1211b Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 7 Jan 2022 23:56:14 +0530 Subject: [PATCH] Separated Suggestions from Home sections --- .../monkey/retromusic/adapter/HomeAdapter.kt | 68 +------------------ .../retromusic/fragments/LibraryViewModel.kt | 12 ++++ .../fragments/home/HomeBindingAdapter.kt | 1 + .../retromusic/fragments/home/HomeFragment.kt | 50 ++++++++++++++ .../retromusic/repository/Repository.kt | 14 ++-- app/src/main/res/drawable/ic_refresh.xml | 10 +++ app/src/main/res/layout/home_content.xml | 62 +++++------------ app/src/main/res/layout/item_suggestions.xml | 16 ++++- app/src/main/res/values/strings.xml | 3 +- 9 files changed, 114 insertions(+), 122 deletions(-) create mode 100644 app/src/main/res/drawable/ic_refresh.xml diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt index 9ad15e075..522370d59 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt @@ -15,12 +15,10 @@ package code.name.monkey.retromusic.adapter import android.annotation.SuppressLint -import android.os.SystemClock import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView -import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.AppCompatTextView import androidx.core.os.bundleOf @@ -30,30 +28,22 @@ import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.retromusic.* import code.name.monkey.retromusic.adapter.album.AlbumAdapter import code.name.monkey.retromusic.adapter.artist.ArtistAdapter import code.name.monkey.retromusic.adapter.song.SongAdapter import code.name.monkey.retromusic.fragments.home.HomeFragment -import code.name.monkey.retromusic.glide.GlideApp -import code.name.monkey.retromusic.glide.RetroGlideExtension -import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.IAlbumClickListener import code.name.monkey.retromusic.interfaces.IArtistClickListener import code.name.monkey.retromusic.interfaces.IGenreClickListener import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.util.PreferenceUtil -import com.google.android.material.card.MaterialCardView class HomeAdapter( private val activity: AppCompatActivity ) : RecyclerView.Adapter(), IArtistClickListener, IAlbumClickListener, IGenreClickListener { - private var mLastClickTime: Long = 0 - private var list = listOf() override fun getItemViewType(position: Int): Int { @@ -68,13 +58,7 @@ class HomeAdapter( FAVOURITES -> PlaylistViewHolder(layout) TOP_ALBUMS, RECENT_ALBUMS -> AlbumViewHolder(layout) else -> { - SuggestionsViewHolder( - LayoutInflater.from(activity).inflate( - R.layout.item_suggestions, - parent, - false - ) - ) + ArtistViewHolder(layout) } } } @@ -126,10 +110,6 @@ class HomeAdapter( ) } } - SUGGESTIONS -> { - val viewHolder = holder as SuggestionsViewHolder - viewHolder.bindView(home) - } FAVOURITES -> { val viewHolder = holder as PlaylistViewHolder viewHolder.bindView(home) @@ -174,52 +154,6 @@ class HomeAdapter( } } - private inner class SuggestionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val images = listOf( - R.id.image1, - R.id.image2, - R.id.image3, - R.id.image4, - R.id.image5, - R.id.image6, - R.id.image7, - R.id.image8 - ) - - fun bindView(home: Home) { - val color = ThemeStore.accentColor(activity) - itemView.findViewById(R.id.message).apply { - setTextColor(color) - setOnClickListener { - if (SystemClock.elapsedRealtime() - mLastClickTime < 1000){ - return@setOnClickListener - } - mLastClickTime = SystemClock.elapsedRealtime() - MusicPlayerRemote.playNext((home.arrayList as List).subList(0, 8)) - if (!MusicPlayerRemote.isPlaying) { - MusicPlayerRemote.playNextSong() - } - } - } - itemView.findViewById(R.id.card6).apply { - setCardBackgroundColor(ColorUtil.withAlpha(color, 0.12f)) - } - images.forEachIndexed { index, id -> - itemView.findViewById(id).setOnClickListener { - MusicPlayerRemote.playNext(home.arrayList[index] as Song) - if (!MusicPlayerRemote.isPlaying) { - MusicPlayerRemote.playNextSong() - } - } - GlideApp.with(activity) - .asBitmap() - .songCoverOptions(home.arrayList[index] as Song) - .load(RetroGlideExtension.getSongModel(home.arrayList[index] as Song)) - .into(itemView.findViewById(id)) - } - } - } - private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) { fun bindView(home: Home) { title.setText(home.titleRes) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index 0d2a71719..be3904175 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -40,6 +40,7 @@ class LibraryViewModel( private val _paletteColor = MutableLiveData() private val home = MutableLiveData>() + private val suggestions = MutableLiveData>() private val albums = MutableLiveData>() private val songs = MutableLiveData>() private val artists = MutableLiveData>() @@ -56,6 +57,7 @@ class LibraryViewModel( private fun loadLibraryContent() = viewModelScope.launch(IO) { fetchHomeSections() + fetchSuggestions() fetchSongs() fetchAlbums() fetchArtists() @@ -93,6 +95,10 @@ class LibraryViewModel( return home } + fun getSuggestions(): LiveData> { + return suggestions + } + fun getFabMargin(): LiveData { return fabMargin } @@ -132,6 +138,10 @@ class LibraryViewModel( home.postValue(repository.homeSections()) } + private suspend fun fetchSuggestions() { + suggestions.postValue(repository.suggestions()) + } + fun search(query: String?, filter: Filter) { viewModelScope.launch(IO) { val result = repository.search(query, filter) @@ -147,6 +157,7 @@ class LibraryViewModel( HomeSections -> fetchHomeSections() Playlists -> fetchPlaylists() Genres -> fetchGenres() + Suggestions -> fetchSuggestions() } } @@ -391,4 +402,5 @@ enum class ReloadType { HomeSections, Playlists, Genres, + Suggestions } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBindingAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBindingAdapter.kt index 2cb2e79d8..ed18d9c80 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBindingAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBindingAdapter.kt @@ -28,4 +28,5 @@ class HomeBindingAdapter( ?: bannerHomeBinding?.homeContent?.recyclerView!! val titleWelcome = homeBinding?.titleWelcome ?: bannerHomeBinding?.titleWelcome!! val appNameText = homeBinding?.appNameText ?: bannerHomeBinding?.appNameText!! + val suggestions = homeBinding?.homeContent?.suggestions ?: bannerHomeBinding?.homeContent?.suggestions!! } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt index 523cde83b..71763e713 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt @@ -28,7 +28,9 @@ import androidx.core.view.doOnPreDraw import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager +import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.common.ATHToolbarActivity +import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.retromusic.* import code.name.monkey.retromusic.adapter.HomeAdapter @@ -43,7 +45,9 @@ import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension +import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.IScrollHelper +import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.gms.cast.framework.CastButtonFactory import com.google.android.material.shape.MaterialShapeDrawable @@ -76,6 +80,9 @@ class HomeFragment : libraryViewModel.getHome().observe(viewLifecycleOwner, { homeAdapter.swapData(it) }) + libraryViewModel.getSuggestions().observe(viewLifecycleOwner, { + loadSuggestions(it) + }) loadProfile() setupTitle() @@ -151,6 +158,8 @@ class HomeFragment : ) ) } + // Reload suggestions + binding.suggestions.refreshButton.setOnClickListener { libraryViewModel.forceReload(ReloadType.Suggestions) } } private fun getBinding(homeBanner: Boolean, view: View): HomeBindingAdapter { @@ -235,6 +244,47 @@ class HomeFragment : reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Y, false) } + private fun loadSuggestions(songs: List) { + val images = listOf( + binding.suggestions.image1, + binding.suggestions.image2, + binding.suggestions.image3, + binding.suggestions.image4, + binding.suggestions.image5, + binding.suggestions.image6, + binding.suggestions.image7, + binding.suggestions.image8 + ) + val color = ThemeStore.accentColor(requireContext()) + binding.suggestions.message.apply { + setTextColor(color) + setOnClickListener { + it.isClickable = false + it.postDelayed({ it.isClickable = true }, 500) + MusicPlayerRemote.playNext(songs.subList(0, 8)) + if (!MusicPlayerRemote.isPlaying) { + MusicPlayerRemote.playNextSong() + } + } + } + binding.suggestions.card6.setCardBackgroundColor(ColorUtil.withAlpha(color, 0.12f)) + images.forEachIndexed { index, imageView -> + imageView.setOnClickListener { + it.isClickable = false + it.postDelayed({ it.isClickable = true }, 500) + MusicPlayerRemote.playNext(songs) + if (!MusicPlayerRemote.isPlaying) { + MusicPlayerRemote.playNextSong() + } + } + GlideApp.with(this) + .asBitmap() + .songCoverOptions(songs[index]) + .load(RetroGlideExtension.getSongModel(songs[index])) + .into(imageView) + } + } + companion object { const val TAG: String = "BannerHomeFragment" diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt index 0c7a3d9b0..71d79ef6a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt @@ -69,6 +69,7 @@ interface Repository { suspend fun recentAlbumsHome(): Home suspend fun favoritePlaylistHome(): Home suspend fun suggestionsHome(): Home + suspend fun suggestions(): List suspend fun genresHome(): Home suspend fun playlists(): Home suspend fun homeSections(): List @@ -240,19 +241,15 @@ class RealRepository( override suspend fun homeSections(): List { val homeSections = mutableListOf() val sections: List = listOf( - suggestionsHome(), topArtistsHome(), topAlbumsHome(), recentArtistsHome(), recentAlbumsHome(), favoritePlaylistHome() - // genresHome() ) for (section in sections) { if (section.arrayList.isNotEmpty()) { - if (section.homeSection != SUGGESTIONS || PreferenceUtil.homeSuggestions) { - homeSections.add(section) - } + homeSections.add(section) } } return homeSections @@ -374,6 +371,13 @@ class RealRepository( return suggestions } + override suspend fun suggestions(): List { + if (!PreferenceUtil.homeSuggestions) return listOf() + return NotPlayedPlaylist().songs().shuffled().takeIf { + it.size > 9 + } ?: emptyList() + } + override suspend fun genresHome(): Home { val genres = genreRepository.genres().shuffled() return Home(genres, GENRES, R.string.genres) diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 000000000..5cdbeb077 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/home_content.xml b/app/src/main/res/layout/home_content.xml index 133954bcf..603bd5e25 100644 --- a/app/src/main/res/layout/home_content.xml +++ b/app/src/main/res/layout/home_content.xml @@ -12,7 +12,6 @@ ~ See the GNU General Public License for more details. --> - + android:layout_height="wrap_content" + android:orientation="vertical"> - + - - - - - - + android:nestedScrollingEnabled="false" + android:overScrollMode="@integer/overScrollMode" + tools:itemCount="10" + tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + tools:listitem="@layout/item_album_card" + tools:spanCount="3" /> - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_suggestions.xml b/app/src/main/res/layout/item_suggestions.xml index 49e554853..c4580c025 100644 --- a/app/src/main/res/layout/item_suggestions.xml +++ b/app/src/main/res/layout/item_suggestions.xml @@ -8,17 +8,27 @@ + Adaptive color Colored notification Crossfade (Beta) - Use Custom font + Use Manrope font Desaturated color Show now playing screen Extra controls @@ -531,4 +531,5 @@ You have to select at least one category. You will be forwarded to the issue tracker website. Your account data is only used for authentication. + New Music Mix