Home Screen: implemented popup menu when clicking on a track.

This commit is contained in:
Antoine POPINEAU 2020-06-26 13:11:05 +02:00 committed by Antoine POPINEAU
parent 73ab61e64b
commit 2e76d30e0f
No known key found for this signature in database
GPG Key ID: A78AC64694F84063
4 changed files with 47 additions and 19 deletions

View File

@ -122,4 +122,4 @@ class DownloadsActivity : AppCompatActivity() {
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }
} }
} }

View File

@ -8,6 +8,8 @@ import androidx.recyclerview.widget.RecyclerView
import com.github.apognu.otter.R import com.github.apognu.otter.R
import com.github.apognu.otter.fragments.HomeFragment import com.github.apognu.otter.fragments.HomeFragment
import com.github.apognu.otter.utils.Artist import com.github.apognu.otter.utils.Artist
import com.github.apognu.otter.utils.Track
import com.github.apognu.otter.utils.log
import com.github.apognu.otter.utils.mustNormalizeUrl import com.github.apognu.otter.utils.mustNormalizeUrl
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import jp.wasabeef.picasso.transformations.RoundedCornersTransformation import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
@ -27,7 +29,8 @@ class HomeMediaAdapter(
data class HomeMediaItem( data class HomeMediaItem(
val label: String, val label: String,
val cover: String?, val cover: String?,
val artist: Artist? = null val artist: Artist? = null,
val track: Track? = null
) )
var data: List<HomeMediaItem> = listOf() var data: List<HomeMediaItem> = listOf()
@ -64,7 +67,8 @@ class HomeMediaAdapter(
override fun onClick(view: View?) { override fun onClick(view: View?) {
when { when {
kind == ItemType.Artist -> listener?.onClick(artist = data[layoutPosition].artist) kind == ItemType.Artist -> listener?.onClick(view, artist = data[layoutPosition].artist)
kind == ItemType.Track -> listener?.onClick(view, track = data[layoutPosition].track)
} }
} }
} }

View File

@ -1,10 +1,13 @@
package com.github.apognu.otter.fragments package com.github.apognu.otter.fragments
import android.os.Bundle import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.github.apognu.otter.R import com.github.apognu.otter.R
import com.github.apognu.otter.adapters.home.HomeMediaAdapter import com.github.apognu.otter.adapters.home.HomeMediaAdapter
@ -29,11 +32,9 @@ import java.util.*
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
interface OnHomeClickListener { interface OnHomeClickListener {
fun onClick(artist: Artist? = null, album: Album? = null, track: Track? = null) fun onClick(view: View?, artist: Artist? = null, album: Album? = null, track: Track? = null)
} }
val CACHE_DURATION = 15 * 60 * 1000
private var bus: Job? = null private var bus: Job? = null
private lateinit var tagsRepository: TagsRepository private lateinit var tagsRepository: TagsRepository
@ -55,9 +56,9 @@ class HomeFragment : Fragment() {
recentlyListenedRepository = RecentlyListenedRepository(context) recentlyListenedRepository = RecentlyListenedRepository(context)
tagsAdapter = HomeMediaAdapter(context, ItemType.Tag, R.layout.row_tag) tagsAdapter = HomeMediaAdapter(context, ItemType.Tag, R.layout.row_tag)
randomAdapter = HomeMediaAdapter(context, ItemType.Artist, listener = ArtistClickListener()) randomAdapter = HomeMediaAdapter(context, ItemType.Artist, listener = HomeMediaClickListener())
recentlyAddedAdapter = HomeMediaAdapter(context, ItemType.Track) recentlyAddedAdapter = HomeMediaAdapter(context, ItemType.Track, listener = HomeMediaClickListener())
recentlyListenedAdapter = HomeMediaAdapter(context, ItemType.Track) recentlyListenedAdapter = HomeMediaAdapter(context, ItemType.Track, listener = HomeMediaClickListener())
} }
override fun onResume() { override fun onResume() {
@ -119,7 +120,7 @@ class HomeFragment : Fragment() {
repository.cacheId?.let { cacheId -> repository.cacheId?.let { cacheId ->
repository.cache(listOf())?.let { repository.cache(listOf())?.let {
Cache.get(context, "$cacheId-at")?.readLine()?.toLong()?.let { date -> Cache.get(context, "$cacheId-at")?.readLine()?.toLong()?.let { date ->
return if ((Date().time - date) < CACHE_DURATION) Repository.Origin.Cache return if ((Date().time - date) < AppContext.HOME_CACHE_DURATION) Repository.Origin.Cache
else Repository.Origin.Network else Repository.Origin.Network
} }
} }
@ -128,7 +129,7 @@ class HomeFragment : Fragment() {
return Repository.Origin.Network return Repository.Origin.Network
} }
private fun <T: Any> cache(repository: Repository<T, *>, data: List<T>) { private fun <T : Any> cache(repository: Repository<T, *>, data: List<T>) {
repository.cacheId?.let { cacheId -> repository.cacheId?.let { cacheId ->
repository.cache(data)?.let { cache -> repository.cache(data)?.let { cache ->
Cache.set( Cache.set(
@ -143,7 +144,7 @@ class HomeFragment : Fragment() {
} }
private fun refresh(force: Boolean = false) { private fun refresh(force: Boolean = false) {
tagsRepository.fetch(originFor(tagsRepository, force).origin).untilNetwork(IO) { data, isCache, _ -> tagsRepository.fetch(originFor(tagsRepository, force).origin).untilNetwork(lifecycleScope, IO) { data, isCache, _ ->
GlobalScope.launch(Main) { GlobalScope.launch(Main) {
tagsAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.name, null) } tagsAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.name, null) }
tagsAdapter.notifyDataSetChanged() tagsAdapter.notifyDataSetChanged()
@ -155,7 +156,7 @@ class HomeFragment : Fragment() {
} }
} }
randomArtistsRepository.fetch(originFor(randomArtistsRepository, force).origin).untilNetwork(IO) { data, isCache, _ -> randomArtistsRepository.fetch(originFor(randomArtistsRepository, force).origin).untilNetwork(lifecycleScope, IO) { data, isCache, _ ->
GlobalScope.launch(Main) { GlobalScope.launch(Main) {
randomAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.name, it.albums?.getOrNull(0)?.cover?.original, artist = it) } randomAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.name, it.albums?.getOrNull(0)?.cover?.original, artist = it) }
randomAdapter.notifyDataSetChanged() randomAdapter.notifyDataSetChanged()
@ -167,9 +168,9 @@ class HomeFragment : Fragment() {
} }
} }
recentlyListenedRepository.fetch(originFor(recentlyListenedRepository, force).origin).untilNetwork(IO) { data, isCache, _ -> recentlyListenedRepository.fetch(originFor(recentlyListenedRepository, force).origin).untilNetwork(lifecycleScope, IO) { data, isCache, _ ->
GlobalScope.launch(Main) { GlobalScope.launch(Main) {
recentlyListenedAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.track.title, it.track.album.cover.original) } recentlyListenedAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.track.title, it.track.album.cover.original, track = it.track) }
recentlyListenedAdapter.notifyDataSetChanged() recentlyListenedAdapter.notifyDataSetChanged()
recently_listened_loader?.visibility = View.GONE recently_listened_loader?.visibility = View.GONE
@ -179,9 +180,9 @@ class HomeFragment : Fragment() {
} }
} }
recentlyAddedRepository.fetch(originFor(recentlyAddedRepository, force).origin).untilNetwork(IO) { data, isCache, _ -> recentlyAddedRepository.fetch(originFor(recentlyAddedRepository, force).origin).untilNetwork(lifecycleScope, IO) { data, isCache, _ ->
GlobalScope.launch(Main) { GlobalScope.launch(Main) {
recentlyAddedAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.title, it.album.cover.original) } recentlyAddedAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.title, it.album.cover.original, track = it) }
recentlyAddedAdapter.notifyDataSetChanged() recentlyAddedAdapter.notifyDataSetChanged()
recently_added_loader?.visibility = View.GONE recently_added_loader?.visibility = View.GONE
@ -192,11 +193,32 @@ class HomeFragment : Fragment() {
} }
} }
inner class ArtistClickListener : OnHomeClickListener { inner class HomeMediaClickListener : OnHomeClickListener {
override fun onClick(artist: Artist?, album: Album?, track: Track?) { override fun onClick(view: View?, artist: Artist?, album: Album?, track: Track?) {
artist?.let { artist?.let {
ArtistsFragment.openAlbums(context, artist) ArtistsFragment.openAlbums(context, artist)
} }
track?.let {
context?.let {
PopupMenu(context, view, Gravity.TOP, R.attr.actionOverflowMenuStyle, 0).apply {
inflate(R.menu.row_track)
menu.findItem(R.id.track_pin).isVisible = false
setOnMenuItemClickListener {
when (it.itemId) {
R.id.track_add_to_queue -> CommandBus.send(Command.AddToQueue(listOf(track)))
R.id.track_play_next -> CommandBus.send(Command.PlayNext(track))
}
true
}
show()
}
}
}
} }
} }
} }

View File

@ -23,6 +23,8 @@ object AppContext {
const val PAGE_SIZE = 50 const val PAGE_SIZE = 50
const val TRANSITION_DURATION = 300L const val TRANSITION_DURATION = 300L
const val HOME_CACHE_DURATION = 15 * 60 * 1000
fun init(context: Activity) { fun init(context: Activity) {
setupNotificationChannels(context) setupNotificationChannels(context)