Added links to artist and album on Now Playing view. Partially covers #30.

This commit is contained in:
Antoine POPINEAU 2020-05-29 21:40:01 +02:00
parent fa82f13a9c
commit b554678500
No known key found for this signature in database
GPG Key ID: A78AC64694F84063
12 changed files with 121 additions and 49 deletions

View File

@ -13,14 +13,13 @@ import android.view.*
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.SeekBar import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.drawable.toDrawable
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import com.github.apognu.otter.R import com.github.apognu.otter.R
import com.github.apognu.otter.fragments.BrowseFragment import com.github.apognu.otter.fragments.*
import com.github.apognu.otter.fragments.LandscapeQueueFragment
import com.github.apognu.otter.fragments.QueueFragment
import com.github.apognu.otter.playback.MediaControlsManager import com.github.apognu.otter.playback.MediaControlsManager
import com.github.apognu.otter.playback.PlayerService import com.github.apognu.otter.playback.PlayerService
import com.github.apognu.otter.repositories.FavoritedRepository import com.github.apognu.otter.repositories.FavoritedRepository
@ -301,6 +300,27 @@ class MainActivity : AppCompatActivity() {
} }
} }
now_playing_details_info?.let { now_playing_details_info ->
now_playing_details_info.setOnClickListener {
PopupMenu(this@MainActivity, now_playing_details_info, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply {
inflate(R.menu.track_info)
setOnMenuItemClickListener {
when (it.itemId) {
R.id.go_to_artist -> ArtistsFragment.openAlbums(this@MainActivity, track.artist, art = track.album.cover.original)
R.id.go_to_album -> AlbumsFragment.openTracks(this@MainActivity, track.album)
}
now_playing.close()
true
}
show()
}
}
}
now_playing_details_favorite?.let { now_playing_details_favorite -> now_playing_details_favorite?.let { now_playing_details_favorite ->
favoriteCheckRepository.fetch().untilNetwork(IO) { favorites, _, _ -> favoriteCheckRepository.fetch().untilNetwork(IO) { favorites, _, _ ->
GlobalScope.launch(Main) { GlobalScope.launch(Main) {

View File

@ -36,7 +36,7 @@ class AlbumsAdapter(val context: Context?, val listener: OnAlbumClickListener) :
Picasso.get() Picasso.get()
.maybeLoad(maybeNormalizeUrl(album.cover.original)) .maybeLoad(maybeNormalizeUrl(album.cover.original))
.fit() .fit()
.transform(RoundedCornersTransformation(16, 0)) .transform(RoundedCornersTransformation(8, 0))
.into(holder.art) .into(holder.art)
holder.title.text = album.title holder.title.text = album.title

View File

@ -36,7 +36,7 @@ class AlbumsGridAdapter(val context: Context?, private val listener: OnAlbumClic
.maybeLoad(maybeNormalizeUrl(album.cover.original)) .maybeLoad(maybeNormalizeUrl(album.cover.original))
.fit() .fit()
.placeholder(R.drawable.cover) .placeholder(R.drawable.cover)
.transform(RoundedCornersTransformation(24, 0)) .transform(RoundedCornersTransformation(16, 0))
.into(holder.cover) .into(holder.cover)
holder.title.text = album.title holder.title.text = album.title

View File

@ -39,7 +39,7 @@ class ArtistsAdapter(val context: Context?, private val listener: OnArtistClickL
Picasso.get() Picasso.get()
.maybeLoad(maybeNormalizeUrl(albums[0].cover.original)) .maybeLoad(maybeNormalizeUrl(albums[0].cover.original))
.fit() .fit()
.transform(RoundedCornersTransformation(16, 0)) .transform(RoundedCornersTransformation(8, 0))
.into(holder.art) .into(holder.art)
} }
} }

View File

@ -58,7 +58,7 @@ class TracksAdapter(private val context: Context?, private val favoriteListener:
Picasso.get() Picasso.get()
.maybeLoad(maybeNormalizeUrl(track.album.cover.original)) .maybeLoad(maybeNormalizeUrl(track.album.cover.original))
.fit() .fit()
.transform(RoundedCornersTransformation(16, 0)) .transform(RoundedCornersTransformation(8, 0))
.into(holder.cover) .into(holder.cover)
holder.title.text = track.title holder.title.text = track.title

View File

@ -1,5 +1,6 @@
package com.github.apognu.otter.fragments package com.github.apognu.otter.fragments
import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.os.Bundle import android.os.Bundle
import android.util.DisplayMetrics import android.util.DisplayMetrics
@ -8,6 +9,7 @@ import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.drawable.toDrawable
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.transition.Fade import androidx.transition.Fade
import androidx.transition.Slide import androidx.transition.Slide
@ -32,15 +34,47 @@ class AlbumsFragment : FunkwhaleFragment<Album, AlbumsAdapter>() {
var artistArt = "" var artistArt = ""
companion object { companion object {
fun new(artist: Artist): AlbumsFragment { fun new(artist: Artist, art: String? = null): AlbumsFragment {
val art = art ?: if (artist.albums?.isNotEmpty() == true) artist.albums[0].cover.original else ""
return AlbumsFragment().apply { return AlbumsFragment().apply {
arguments = bundleOf( arguments = bundleOf(
"artistId" to artist.id, "artistId" to artist.id,
"artistName" to artist.name, "artistName" to artist.name,
"artistArt" to if (artist.albums?.isNotEmpty() == true) artist.albums[0].cover.original else "" "artistArt" to art
) )
} }
} }
fun openTracks(context: Context?, album: Album, fragment: Fragment? = null) {
(context as? MainActivity)?.let { activity ->
fragment?.let { fragment ->
fragment.onViewPager {
exitTransition = Fade().apply {
duration = AppContext.TRANSITION_DURATION
interpolator = AccelerateDecelerateInterpolator()
view?.let {
addTarget(it)
}
}
}
}
val fragment = TracksFragment.new(album).apply {
enterTransition = Slide().apply {
duration = AppContext.TRANSITION_DURATION
interpolator = AccelerateDecelerateInterpolator()
}
}
activity.supportFragmentManager
.beginTransaction()
.replace(R.id.container, fragment)
.addToBackStack(null)
.commit()
}
}
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -97,29 +131,7 @@ class AlbumsFragment : FunkwhaleFragment<Album, AlbumsAdapter>() {
inner class OnAlbumClickListener : AlbumsAdapter.OnAlbumClickListener { inner class OnAlbumClickListener : AlbumsAdapter.OnAlbumClickListener {
override fun onClick(view: View?, album: Album) { override fun onClick(view: View?, album: Album) {
(context as? MainActivity)?.let { activity -> openTracks(context, album, fragment = this@AlbumsFragment)
exitTransition = Fade().apply {
duration = AppContext.TRANSITION_DURATION
interpolator = AccelerateDecelerateInterpolator()
view?.let {
addTarget(it)
}
}
val fragment = TracksFragment.new(album).apply {
enterTransition = Slide().apply {
duration = AppContext.TRANSITION_DURATION
interpolator = AccelerateDecelerateInterpolator()
}
}
activity.supportFragmentManager
.beginTransaction()
.replace(R.id.container, fragment)
.addToBackStack(null)
.commit()
}
} }
} }
} }

View File

@ -1,8 +1,10 @@
package com.github.apognu.otter.fragments package com.github.apognu.otter.fragments
import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.transition.Fade import androidx.transition.Fade
import androidx.transition.Slide import androidx.transition.Slide
@ -19,17 +21,11 @@ class ArtistsFragment : FunkwhaleFragment<Artist, ArtistsAdapter>() {
override val viewRes = R.layout.fragment_artists override val viewRes = R.layout.fragment_artists
override val recycler: RecyclerView get() = artists override val recycler: RecyclerView get() = artists
override fun onCreate(savedInstanceState: Bundle?) { companion object {
super.onCreate(savedInstanceState) fun openAlbums(context: Context?, artist: Artist, fragment: Fragment? = null, art: String? = null) {
adapter = ArtistsAdapter(context, OnArtistClickListener())
repository = ArtistsRepository(context)
}
inner class OnArtistClickListener : ArtistsAdapter.OnArtistClickListener {
override fun onClick(holder: View?, artist: Artist) {
(context as? MainActivity)?.let { activity -> (context as? MainActivity)?.let { activity ->
onViewPager { fragment?.let { fragment ->
fragment.onViewPager {
exitTransition = Fade().apply { exitTransition = Fade().apply {
duration = AppContext.TRANSITION_DURATION duration = AppContext.TRANSITION_DURATION
interpolator = AccelerateDecelerateInterpolator() interpolator = AccelerateDecelerateInterpolator()
@ -39,8 +35,9 @@ class ArtistsFragment : FunkwhaleFragment<Artist, ArtistsAdapter>() {
} }
} }
} }
}
val fragment = AlbumsFragment.new(artist).apply { val fragment = AlbumsFragment.new(artist, art).apply {
enterTransition = Slide().apply { enterTransition = Slide().apply {
duration = AppContext.TRANSITION_DURATION duration = AppContext.TRANSITION_DURATION
interpolator = AccelerateDecelerateInterpolator() interpolator = AccelerateDecelerateInterpolator()
@ -55,4 +52,17 @@ class ArtistsFragment : FunkwhaleFragment<Artist, ArtistsAdapter>() {
} }
} }
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = ArtistsAdapter(context, OnArtistClickListener())
repository = ArtistsRepository(context)
}
inner class OnArtistClickListener : ArtistsAdapter.OnArtistClickListener {
override fun onClick(holder: View?, artist: Artist) {
openAlbums(context, artist, fragment = this@ArtistsFragment)
}
}
} }

View File

@ -115,6 +115,16 @@
android:src="@drawable/ottershape" android:src="@drawable/ottershape"
tools:src="@tools:sample/avatars" /> tools:src="@tools:sample/avatars" />
<ImageButton
android:id="@+id/now_playing_details_info"
style="@style/IconButton"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="top|end"
android:layout_margin="8dp"
android:contentDescription="@string/alt_track_info"
android:src="@drawable/more" />
<ImageButton <ImageButton
android:id="@+id/now_playing_details_favorite" android:id="@+id/now_playing_details_favorite"
style="@style/IconButton" style="@style/IconButton"

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/go_to_artist"
android:title="@string/go_to_artist" />
<item
android:id="@+id/go_to_album"
android:title="@string/go_to_album" />
</menu>

View File

@ -84,6 +84,10 @@
<string name="alt_artist_art">Image de l\'artiste</string> <string name="alt_artist_art">Image de l\'artiste</string>
<string name="alt_album_cover">Couverture de l\'album</string> <string name="alt_album_cover">Couverture de l\'album</string>
<string name="alt_more_options">Plus d\'options</string> <string name="alt_more_options">Plus d\'options</string>
<string name="alt_track_info">Informations sur cette piste</string>
<string name="go_to_artist">Voir l\'artist</string>
<string name="go_to_album">Voir l\'album</string>
<string name="logout_title">Déconnexion</string> <string name="logout_title">Déconnexion</string>
<string name="logout_content">Etes-vous certains de vouloir vous déconnecter de votre instance Funkwhale ?</string> <string name="logout_content">Etes-vous certains de vouloir vous déconnecter de votre instance Funkwhale ?</string>

View File

@ -84,6 +84,10 @@
<string name="alt_artist_art">Artist art</string> <string name="alt_artist_art">Artist art</string>
<string name="alt_album_cover">Album cover</string> <string name="alt_album_cover">Album cover</string>
<string name="alt_more_options">More options</string> <string name="alt_more_options">More options</string>
<string name="alt_track_info">Information about track</string>
<string name="go_to_artist">Go to artist</string>
<string name="go_to_album">Go to album</string>
<string name="logout_title">Sign out</string> <string name="logout_title">Sign out</string>
<string name="logout_content">Are you sure you want to sign out of your Funkwhale instance?</string> <string name="logout_content">Are you sure you want to sign out of your Funkwhale instance?</string>

View File

@ -29,7 +29,7 @@
<style name="AppTheme.Title"> <style name="AppTheme.Title">
<item name="android:fontFamily">sans-serif-light</item> <item name="android:fontFamily">sans-serif-light</item>
<item name="android:textSize">24sp</item> <item name="android:textSize">32sp</item>
<item name="android:textColor">@color/itemTitle</item> <item name="android:textColor">@color/itemTitle</item>
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
</style> </style>