Added links to artist and album on Now Playing view. Partially covers #30.
This commit is contained in:
parent
fa82f13a9c
commit
b554678500
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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,28 +21,23 @@ 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 ->
|
||||||
exitTransition = Fade().apply {
|
fragment.onViewPager {
|
||||||
duration = AppContext.TRANSITION_DURATION
|
exitTransition = Fade().apply {
|
||||||
interpolator = AccelerateDecelerateInterpolator()
|
duration = AppContext.TRANSITION_DURATION
|
||||||
|
interpolator = AccelerateDecelerateInterpolator()
|
||||||
|
|
||||||
view?.let {
|
view?.let {
|
||||||
addTarget(it)
|
addTarget(it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue