diff --git a/app/src/main/java/audio/funkwhale/ffa/activities/SearchActivity.kt b/app/src/main/java/audio/funkwhale/ffa/activities/SearchActivity.kt index b5b574cf69541dd2e7e9682c74951ea17c6e9eb8..7f1a9e803ab7476b405e0060da925ad4be829dea 100644 --- a/app/src/main/java/audio/funkwhale/ffa/activities/SearchActivity.kt +++ b/app/src/main/java/audio/funkwhale/ffa/activities/SearchActivity.kt @@ -3,9 +3,11 @@ package audio.funkwhale.ffa.activities import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SearchView import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import audio.funkwhale.ffa.adapters.FavoriteListener import audio.funkwhale.ffa.adapters.SearchAdapter import audio.funkwhale.ffa.databinding.ActivitySearchBinding import audio.funkwhale.ffa.fragments.AddToPlaylistDialog @@ -51,7 +53,12 @@ class SearchActivity : AppCompatActivity() { setContentView(binding.root) adapter = - SearchAdapter(layoutInflater, this, SearchResultClickListener(), FavoriteListener()).also { + SearchAdapter( + layoutInflater, + this, + SearchResultClickListener(), + FavoriteListener(favoritesRepository) + ).also { binding.results.layoutManager = LinearLayoutManager(this) binding.results.adapter = it } @@ -90,59 +97,59 @@ class SearchActivity : AppCompatActivity() { tracksRepository = TracksSearchRepository(this@SearchActivity, "") favoritesRepository = FavoritesRepository(this@SearchActivity) - binding.search.setOnQueryTextListener(object : - androidx.appcompat.widget.SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(rawQuery: String?): Boolean { - binding.search.clearFocus() + binding.search.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - rawQuery?.let { - done = 0 + override fun onQueryTextSubmit(rawQuery: String?): Boolean { + binding.search.clearFocus() - val query = URLEncoder.encode(it, "UTF-8") + rawQuery?.let { + done = 0 - artistsRepository.query = query.lowercase(Locale.ROOT) - albumsRepository.query = query.lowercase(Locale.ROOT) - tracksRepository.query = query.lowercase(Locale.ROOT) + val query = URLEncoder.encode(it, "UTF-8") - binding.searchSpinner.visibility = View.VISIBLE - binding.searchEmpty.visibility = View.GONE - binding.searchNoResults.visibility = View.GONE + artistsRepository.query = query.lowercase(Locale.ROOT) + albumsRepository.query = query.lowercase(Locale.ROOT) + tracksRepository.query = query.lowercase(Locale.ROOT) - adapter.artists.clear() - adapter.albums.clear() - adapter.tracks.clear() - adapter.notifyDataSetChanged() + binding.searchSpinner.visibility = View.VISIBLE + binding.searchEmpty.visibility = View.GONE + binding.searchNoResults.visibility = View.GONE - artistsRepository.fetch(Repository.Origin.Network.origin) - .untilNetwork(lifecycleScope) { artists, _, _, _ -> - done++ + adapter.artists.clear() + adapter.albums.clear() + adapter.tracks.clear() + adapter.notifyDataSetChanged() - adapter.artists.addAll(artists) - refresh() - } + artistsRepository.fetch(Repository.Origin.Network.origin) + .untilNetwork(lifecycleScope) { artists, _, _, _ -> + done++ - albumsRepository.fetch(Repository.Origin.Network.origin) - .untilNetwork(lifecycleScope) { albums, _, _, _ -> - done++ + adapter.artists.addAll(artists) + refresh() + } - adapter.albums.addAll(albums) - refresh() - } + albumsRepository.fetch(Repository.Origin.Network.origin) + .untilNetwork(lifecycleScope) { albums, _, _, _ -> + done++ - tracksRepository.fetch(Repository.Origin.Network.origin) - .untilNetwork(lifecycleScope) { tracks, _, _, _ -> - done++ + adapter.albums.addAll(albums) + refresh() + } - adapter.tracks.addAll(tracks) - refresh() - } - } + tracksRepository.fetch(Repository.Origin.Network.origin) + .untilNetwork(lifecycleScope) { tracks, _, _, _ -> + done++ - return true + adapter.tracks.addAll(tracks) + refresh() + } } - override fun onQueryTextChange(newText: String?) = true - }) + return true + } + + override fun onQueryTextChange(newText: String?) = true + }) } private fun refresh() { @@ -187,13 +194,4 @@ class SearchActivity : AppCompatActivity() { AlbumsFragment.openTracks(this@SearchActivity, album) } } - - inner class FavoriteListener : SearchAdapter.OnFavoriteListener { - override fun onToggleFavorite(id: Int, state: Boolean) { - when (state) { - true -> favoritesRepository.addFavorite(id) - false -> favoritesRepository.deleteFavorite(id) - } - } - } } diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/FavoriteListener.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/FavoriteListener.kt new file mode 100644 index 0000000000000000000000000000000000000000..465accef44cb500128c545583a960aba9f5c24e1 --- /dev/null +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/FavoriteListener.kt @@ -0,0 +1,13 @@ +package audio.funkwhale.ffa.adapters + +import audio.funkwhale.ffa.repositories.FavoritesRepository + +class FavoriteListener(private val repository: FavoritesRepository) { + + fun onToggleFavorite(id: Int, state: Boolean) { + when (state) { + true -> repository.addFavorite(id) + false -> repository.deleteFavorite(id) + } + } +} diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt index 95fe68abd02c565c154f76dc69e9dd26c786ed18..afe16e54393bbe50c8a2ae155dd585077233fc7b 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/FavoritesAdapter.kt @@ -26,18 +26,14 @@ import java.util.Collections class FavoritesAdapter( private val layoutInflater: LayoutInflater, private val context: Context?, - private val favoriteListener: OnFavoriteListener, - val fromQueue: Boolean = false + private val favoriteListener: FavoriteListener, + val fromQueue: Boolean = false, ) : FFAAdapter<Track, FavoritesAdapter.ViewHolder>() { init { this.stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } - interface OnFavoriteListener { - fun onToggleFavorite(id: Int, state: Boolean) - } - private lateinit var binding: RowTrackBinding var currentTrack: Track? = null diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt index 70693df12d32ee40bef5b0246735cbd1ba9c551f..0227dbe0478fe4b8e9a82f0432820274bee95119 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/PlaylistTracksAdapter.kt @@ -30,14 +30,10 @@ import java.util.Collections class PlaylistTracksAdapter( private val layoutInflater: LayoutInflater, private val context: Context?, - private val favoriteListener: OnFavoriteListener? = null, - private val playlistListener: OnPlaylistListener? = null + private val favoriteListener: FavoriteListener, + private val playlistListener: OnPlaylistListener ) : FFAAdapter<PlaylistTrack, PlaylistTracksAdapter.ViewHolder>() { - interface OnFavoriteListener { - fun onToggleFavorite(id: Int, state: Boolean) - } - private lateinit var binding: RowTrackBinding interface OnPlaylistListener { @@ -103,7 +99,7 @@ class PlaylistTracksAdapter( } holder.favorite.setOnClickListener { - favoriteListener?.let { + favoriteListener.let { favoriteListener.onToggleFavorite(track.track.id, !track.track.favorite) track.track.favorite = !track.track.favorite @@ -124,7 +120,7 @@ class PlaylistTracksAdapter( R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track.track))) R.id.track_play_next -> CommandBus.send(Command.PlayNext(track.track)) R.id.queue_remove -> CommandBus.send(Command.RemoveFromQueue(track.track)) - R.id.track_remove_from_playlist -> playlistListener?.onRemoveTrackFromPlaylist( + R.id.track_remove_from_playlist -> playlistListener.onRemoveTrackFromPlaylist( track.track, position ) @@ -223,7 +219,7 @@ class PlaylistTracksAdapter( viewHolder.itemView.background = ColorDrawable(Color.TRANSPARENT) if (from != -1 && to != -1 && from != to) { - playlistListener?.onMoveTrack(from, to) + playlistListener.onMoveTrack(from, to) from = -1 to = -1 diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/SearchAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/SearchAdapter.kt index f5b2b97b663656841fdae1ea6ef76598757d7e90..46ccf3d29184b46eda5e14307326640374cf81a6 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/SearchAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/SearchAdapter.kt @@ -30,8 +30,8 @@ import jp.wasabeef.picasso.transformations.RoundedCornersTransformation class SearchAdapter( private val layoutInflater: LayoutInflater, private val context: Context?, - private val listener: OnSearchResultClickListener? = null, - private val favoriteListener: OnFavoriteListener? = null + private val listener: OnSearchResultClickListener, + private val favoriteListener: FavoriteListener ) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() { interface OnSearchResultClickListener { @@ -39,10 +39,6 @@ class SearchAdapter( fun onAlbumClick(holder: View?, album: Album) } - interface OnFavoriteListener { - fun onToggleFavorite(id: Int, state: Boolean) - } - enum class ResultType { Header, Artist, @@ -244,7 +240,7 @@ class SearchAdapter( } rowTrackViewHolder?.favorite?.setOnClickListener { - favoriteListener?.let { + favoriteListener.let { favoriteListener.onToggleFavorite(track.id, !track.favorite) tracks[position - artists.size - albums.size - sectionCount].favorite = @@ -341,13 +337,13 @@ class SearchAdapter( ResultType.Artist.ordinal -> { val position = layoutPosition - 1 - listener?.onArtistClick(view, artists[position]) + listener.onArtistClick(view, artists[position]) } ResultType.Album.ordinal -> { val position = layoutPosition - artists.size - 2 - listener?.onAlbumClick(view, albums[position]) + listener.onAlbumClick(view, albums[position]) } ResultType.Track.ordinal -> { diff --git a/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt b/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt index 499e7996a7495a343889340a8e1e10b446e33645..a2213ea56f9e50397333ab74a40606858010fcae 100644 --- a/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt +++ b/app/src/main/java/audio/funkwhale/ffa/adapters/TracksAdapter.kt @@ -31,7 +31,7 @@ import java.util.Collections class TracksAdapter( private val layoutInflater: LayoutInflater, private val context: Context?, - private val favoriteListener: OnFavoriteListener? = null, + private val favoriteListener: FavoriteListener, val fromQueue: Boolean = false ) : FFAAdapter<Track, TracksAdapter.ViewHolder>() { @@ -39,10 +39,6 @@ class TracksAdapter( this.stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } - interface OnFavoriteListener { - fun onToggleFavorite(id: Int, state: Boolean) - } - private lateinit var binding: RowTrackBinding private lateinit var touchHelper: ItemTouchHelper @@ -101,7 +97,7 @@ class TracksAdapter( } holder.favorite.setOnClickListener { - favoriteListener?.let { + favoriteListener.let { favoriteListener.onToggleFavorite(track.id, !track.favorite) data[position].favorite = !track.favorite diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/FFAFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/FFAFragment.kt index c2c1840e0707e340149155f4d4c888d94abb7396..60cc0660fa9e1602c8df785c7579a2f424c4a0cf 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/FFAFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/FFAFragment.kt @@ -48,6 +48,8 @@ abstract class FFAFragment<D : Any, A : FFAAdapter<D, *>>() : Fragment() { private var moreLoading = false private var listener: Job? = null + fun <T> repository() = repository as T + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/FavoritesFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/FavoritesFragment.kt index 38d65fcc446e6b882c34c8540354cbcad8cbdef6..3daf5362f676498f9f325acd74ceb82add67ee53 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/FavoritesFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/FavoritesFragment.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView +import audio.funkwhale.ffa.adapters.FavoriteListener import audio.funkwhale.ffa.adapters.FavoritesAdapter import audio.funkwhale.ffa.databinding.FragmentFavoritesBinding import audio.funkwhale.ffa.model.Track @@ -41,8 +42,8 @@ class FavoritesFragment : FFAFragment<Track, FavoritesAdapter>() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - adapter = FavoritesAdapter(layoutInflater, context, FavoriteListener()) repository = FavoritesRepository(context) + adapter = FavoritesAdapter(layoutInflater, context, FavoriteListener(repository())) watchEventBus() } @@ -72,6 +73,7 @@ class FavoritesFragment : FFAFragment<Track, FavoritesAdapter>() { } } + refreshFavoritedTracks() refreshDownloadedTracks() } @@ -98,6 +100,12 @@ class FavoritesFragment : FFAFragment<Track, FavoritesAdapter>() { } } + private fun refreshFavoritedTracks() { + lifecycleScope.launch(Main) { + update() + } + } + private suspend fun refreshDownloadedTracks() { val downloaded = TracksRepository.getDownloadedIds(exoDownloadManager) ?: listOf() @@ -134,15 +142,4 @@ class FavoritesFragment : FFAFragment<Track, FavoritesAdapter>() { adapter.notifyDataSetChanged() } } - - inner class FavoriteListener : FavoritesAdapter.OnFavoriteListener { - override fun onToggleFavorite(id: Int, state: Boolean) { - (repository as? FavoritesRepository)?.let { repository -> - when (state) { - true -> repository.addFavorite(id) - false -> repository.deleteFavorite(id) - } - } - } - } } diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/LandscapeQueueFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/LandscapeQueueFragment.kt index 07dfe7d33540f0e15facb92477be27b9ec70b239..749b846e1061a5118a8dbe7091f4e3c253e1cfb6 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/LandscapeQueueFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/LandscapeQueueFragment.kt @@ -7,8 +7,10 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import audio.funkwhale.ffa.adapters.FavoriteListener import audio.funkwhale.ffa.adapters.TracksAdapter import audio.funkwhale.ffa.databinding.PartialQueueBinding +import audio.funkwhale.ffa.repositories.FavoritesRepository import audio.funkwhale.ffa.utils.Command import audio.funkwhale.ffa.utils.CommandBus import audio.funkwhale.ffa.utils.Event @@ -26,6 +28,8 @@ class LandscapeQueueFragment : Fragment() { private var _binding: PartialQueueBinding? = null private val binding get() = _binding!! + lateinit var favoritesRepository: FavoritesRepository + private var adapter: TracksAdapter? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -41,7 +45,12 @@ class LandscapeQueueFragment : Fragment() { ): View { _binding = PartialQueueBinding.inflate(inflater) return binding.root.apply { - adapter = TracksAdapter(layoutInflater, context, fromQueue = true).also { + adapter = TracksAdapter( + layoutInflater, + context, + fromQueue = true, + favoriteListener = FavoriteListener(favoritesRepository) + ).also { binding.queue.layoutManager = LinearLayoutManager(context) binding.queue.adapter = it } diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt index 1b3ac646dd309a4bce12feb16b3af47f4f89258c..2a0a2b9f051939cdd7f39fa59cb2327b9e465eda 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/PlaylistTracksFragment.kt @@ -10,6 +10,7 @@ import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import audio.funkwhale.ffa.R +import audio.funkwhale.ffa.adapters.FavoriteListener import audio.funkwhale.ffa.adapters.PlaylistTracksAdapter import audio.funkwhale.ffa.databinding.FragmentTracksBinding import audio.funkwhale.ffa.model.Playlist @@ -71,7 +72,7 @@ class PlaylistTracksFragment : FFAFragment<PlaylistTrack, PlaylistTracksAdapter> albumCover = getString("albumCover") ?: "" } - adapter = PlaylistTracksAdapter(layoutInflater, context, FavoriteListener(), PlaylistListener()) + adapter = PlaylistTracksAdapter(layoutInflater, context, FavoriteListener(favoritesRepository), PlaylistListener()) repository = PlaylistTracksRepository(context, albumId) favoritesRepository = FavoritesRepository(context) playlistsRepository = ManagementPlaylistsRepository(context) @@ -211,15 +212,6 @@ class PlaylistTracksFragment : FFAFragment<PlaylistTrack, PlaylistTracksAdapter> } } - inner class FavoriteListener : PlaylistTracksAdapter.OnFavoriteListener { - override fun onToggleFavorite(id: Int, state: Boolean) { - when (state) { - true -> favoritesRepository.addFavorite(id) - false -> favoritesRepository.deleteFavorite(id) - } - } - } - inner class PlaylistListener : PlaylistTracksAdapter.OnPlaylistListener { override fun onMoveTrack(from: Int, to: Int) { playlistsRepository.move(albumId, from, to) diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/QueueFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/QueueFragment.kt index 02e1b2554fb2acc099f0db3dc11bd823f9fc90f5..99c5c4709c928ec0c6739e8a0413b59dcdd1b406 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/QueueFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/QueueFragment.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import audio.funkwhale.ffa.R +import audio.funkwhale.ffa.adapters.FavoriteListener import audio.funkwhale.ffa.adapters.TracksAdapter import audio.funkwhale.ffa.databinding.FragmentQueueBinding import audio.funkwhale.ffa.repositories.FavoritesRepository @@ -62,7 +63,12 @@ class QueueFragment : BottomSheetDialogFragment() { ): View { _binding = FragmentQueueBinding.inflate(inflater) return binding.root.apply { - adapter = TracksAdapter(layoutInflater, context, FavoriteListener(), fromQueue = true).also { + adapter = TracksAdapter( + layoutInflater, + context, + FavoriteListener(favoritesRepository), + fromQueue = true + ).also { binding.included.queue.layoutManager = LinearLayoutManager(context) binding.included.queue.adapter = it } @@ -135,13 +141,4 @@ class QueueFragment : BottomSheetDialogFragment() { } } } - - inner class FavoriteListener : TracksAdapter.OnFavoriteListener { - override fun onToggleFavorite(id: Int, state: Boolean) { - when (state) { - true -> favoritesRepository.addFavorite(id) - false -> favoritesRepository.deleteFavorite(id) - } - } - } } diff --git a/app/src/main/java/audio/funkwhale/ffa/fragments/TracksFragment.kt b/app/src/main/java/audio/funkwhale/ffa/fragments/TracksFragment.kt index c8be2af636027d6ad9fecd719ba7e18c11e859ca..231ce44df29f718b1eb39b9eea032e1daa6bbcc7 100644 --- a/app/src/main/java/audio/funkwhale/ffa/fragments/TracksFragment.kt +++ b/app/src/main/java/audio/funkwhale/ffa/fragments/TracksFragment.kt @@ -12,6 +12,7 @@ import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import audio.funkwhale.ffa.R +import audio.funkwhale.ffa.adapters.FavoriteListener import audio.funkwhale.ffa.adapters.TracksAdapter import audio.funkwhale.ffa.databinding.FragmentTracksBinding import audio.funkwhale.ffa.model.Album @@ -83,10 +84,11 @@ class TracksFragment : FFAFragment<Track, TracksAdapter>() { albumCover = getString("albumCover") ?: "" } - adapter = TracksAdapter(layoutInflater, context, FavoriteListener()) - repository = TracksRepository(context, albumId) favoritesRepository = FavoritesRepository(context) favoritedRepository = FavoritedRepository(context) + repository = TracksRepository(context, albumId) + + adapter = TracksAdapter(layoutInflater, context, FavoriteListener(favoritesRepository)) watchEventBus() } @@ -294,13 +296,4 @@ class TracksFragment : FFAFragment<Track, TracksAdapter>() { adapter.notifyDataSetChanged() } } - - inner class FavoriteListener : TracksAdapter.OnFavoriteListener { - override fun onToggleFavorite(id: Int, state: Boolean) { - when (state) { - true -> favoritesRepository.addFavorite(id) - false -> favoritesRepository.deleteFavorite(id) - } - } - } } diff --git a/changes/changelog.d/28.misc b/changes/changelog.d/28.misc new file mode 100644 index 0000000000000000000000000000000000000000..880934148c9cfd97892dade7346cb4c0f7082ec8 --- /dev/null +++ b/changes/changelog.d/28.misc @@ -0,0 +1 @@ +Automatically update the favorites list view (#28) \ No newline at end of file