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()
}
}
}
}

View File

@ -8,6 +8,8 @@ import androidx.recyclerview.widget.RecyclerView
import com.github.apognu.otter.R
import com.github.apognu.otter.fragments.HomeFragment
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.squareup.picasso.Picasso
import jp.wasabeef.picasso.transformations.RoundedCornersTransformation
@ -27,7 +29,8 @@ class HomeMediaAdapter(
data class HomeMediaItem(
val label: String,
val cover: String?,
val artist: Artist? = null
val artist: Artist? = null,
val track: Track? = null
)
var data: List<HomeMediaItem> = listOf()
@ -64,7 +67,8 @@ class HomeMediaAdapter(
override fun onClick(view: View?) {
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
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.apognu.otter.R
import com.github.apognu.otter.adapters.home.HomeMediaAdapter
@ -29,11 +32,9 @@ import java.util.*
class HomeFragment : Fragment() {
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 lateinit var tagsRepository: TagsRepository
@ -55,9 +56,9 @@ class HomeFragment : Fragment() {
recentlyListenedRepository = RecentlyListenedRepository(context)
tagsAdapter = HomeMediaAdapter(context, ItemType.Tag, R.layout.row_tag)
randomAdapter = HomeMediaAdapter(context, ItemType.Artist, listener = ArtistClickListener())
recentlyAddedAdapter = HomeMediaAdapter(context, ItemType.Track)
recentlyListenedAdapter = HomeMediaAdapter(context, ItemType.Track)
randomAdapter = HomeMediaAdapter(context, ItemType.Artist, listener = HomeMediaClickListener())
recentlyAddedAdapter = HomeMediaAdapter(context, ItemType.Track, listener = HomeMediaClickListener())
recentlyListenedAdapter = HomeMediaAdapter(context, ItemType.Track, listener = HomeMediaClickListener())
}
override fun onResume() {
@ -119,7 +120,7 @@ class HomeFragment : Fragment() {
repository.cacheId?.let { cacheId ->
repository.cache(listOf())?.let {
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
}
}
@ -128,7 +129,7 @@ class HomeFragment : Fragment() {
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.cache(data)?.let { cache ->
Cache.set(
@ -143,7 +144,7 @@ class HomeFragment : Fragment() {
}
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) {
tagsAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.name, null) }
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) {
randomAdapter.data = data.map { HomeMediaAdapter.HomeMediaItem(it.name, it.albums?.getOrNull(0)?.cover?.original, artist = it) }
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) {
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()
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) {
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()
recently_added_loader?.visibility = View.GONE
@ -192,11 +193,32 @@ class HomeFragment : Fragment() {
}
}
inner class ArtistClickListener : OnHomeClickListener {
override fun onClick(artist: Artist?, album: Album?, track: Track?) {
inner class HomeMediaClickListener : OnHomeClickListener {
override fun onClick(view: View?, artist: Artist?, album: Album?, track: Track?) {
artist?.let {
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 TRANSITION_DURATION = 300L
const val HOME_CACHE_DURATION = 15 * 60 * 1000
fun init(context: Activity) {
setupNotificationChannels(context)