diff --git a/app/src/main/java/com/github/apognu/otter/activities/DownloadsActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/DownloadsActivity.kt index dd1cec4..d6fd232 100644 --- a/app/src/main/java/com/github/apognu/otter/activities/DownloadsActivity.kt +++ b/app/src/main/java/com/github/apognu/otter/activities/DownloadsActivity.kt @@ -122,4 +122,4 @@ class DownloadsActivity : AppCompatActivity() { adapter.notifyDataSetChanged() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/github/apognu/otter/adapters/home/HomeMediaAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/home/HomeMediaAdapter.kt index 091cb1f..515784b 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/home/HomeMediaAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/home/HomeMediaAdapter.kt @@ -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 = 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) } } } diff --git a/app/src/main/java/com/github/apognu/otter/fragments/HomeFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/HomeFragment.kt index 1f0caa6..4e6f9fe 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/HomeFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/HomeFragment.kt @@ -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 cache(repository: Repository, data: List) { + private fun cache(repository: Repository, data: List) { 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() + } + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/utils/AppContext.kt b/app/src/main/java/com/github/apognu/otter/utils/AppContext.kt index 99459db..2fc2b66 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/AppContext.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/AppContext.kt @@ -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)