Add artist image to DetailFragment

Add the artist image to the DetailFragment. Still considering what I want to do design-wise with this.
This commit is contained in:
OxygenCobalt 2020-09-13 19:32:33 -06:00
parent 860033ac14
commit 26b53bd502
21 changed files with 94 additions and 103 deletions

View file

@ -76,7 +76,7 @@ dependencies {
// Lint
ktlint "com.pinterest:ktlint:0.37.2"
// Memory Leak checkin
// Memory Leak checking
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
}

View file

@ -5,15 +5,12 @@ import android.os.Bundle
import android.util.AttributeSet
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.app.ActivityCompat
import org.oxycblt.auxio.theme.accent
class MainActivity : AppCompatActivity() {
override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
// Debug placeholder, ignore
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
// Apply the theme
setTheme(accent.second)
@ -22,9 +19,10 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ActivityCompat.postponeEnterTransition(this)
setContentView(R.layout.activity_main)
}
}
// I wish I knew somewhere else to put this
class ClickListener<T>(val onClick: (T) -> Unit)
class ClickListener<T>(val onClick: (T) -> Unit)

View file

@ -19,6 +19,7 @@ import org.oxycblt.auxio.theme.applyDivider
class LibraryFragment : Fragment() {
private val musicModel: MusicViewModel by activityViewModels()
private val libraryModel: LibraryViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
@ -29,8 +30,11 @@ class LibraryFragment : Fragment() {
binding.libraryRecycler.adapter = ArtistAdapter(
musicModel.artists.value!!,
ClickListener { navToArtist(it) }
ClickListener {
navToArtist(it)
}
)
binding.libraryRecycler.applyDivider()
binding.libraryRecycler.setHasFixedSize(true)
@ -39,11 +43,21 @@ class LibraryFragment : Fragment() {
return binding.root
}
private fun navToArtist(artist: Artist) {
// Don't navigate to a fragment multiple times if multiple items are accepted.
override fun onResume() {
super.onResume()
findNavController().navigate(
MainFragmentDirections.actionShowArtist(artist.id)
)
libraryModel.isAlreadyNavigating = false
}
private fun navToArtist(artist: Artist) {
if (!libraryModel.isAlreadyNavigating) {
libraryModel.isAlreadyNavigating = true
// When navigation, pass the artistImage of the item as a shared element to create
// the image popup.
findNavController().navigate(
MainFragmentDirections.actionShowArtist(artist.id)
)
}
}
}

View file

@ -4,9 +4,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import org.oxycblt.auxio.ClickListener
import org.oxycblt.auxio.databinding.ItemAlbumBinding
import org.oxycblt.auxio.databinding.ItemArtistBinding
import org.oxycblt.auxio.music.models.Album
import org.oxycblt.auxio.music.models.Artist
class ArtistAdapter(
@ -47,9 +45,7 @@ class ArtistAdapter(
fun bind(artist: Artist) {
binding.artist = artist
binding.root.setOnClickListener {
listener.onClick(artist)
}
binding.root.setOnClickListener { listener.onClick(artist) }
// Force-update the layout so ellipsizing works.
binding.artistName.requestLayout()

View file

@ -103,9 +103,8 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) {
binding.loadingBar.visibility = View.GONE
if (response == MusicLoaderResponse.DONE) {
exitTransition = TransitionInflater.from(requireContext()).inflateTransition(
R.transition.transition_to_main
)
exitTransition = TransitionInflater.from(requireContext())
.inflateTransition(R.transition.transition_to_main)
findNavController().navigate(
LoadingFragmentDirections.actionToMain()

View file

@ -1,4 +1,4 @@
package org.oxycblt.auxio.coil
package org.oxycblt.auxio.music.coil
import android.content.Context
import android.graphics.Bitmap

View file

@ -1,4 +1,4 @@
package org.oxycblt.auxio.coil
package org.oxycblt.auxio.music.coil
import android.content.Context
import android.net.Uri

View file

@ -4,9 +4,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import org.oxycblt.auxio.ClickListener
import org.oxycblt.auxio.databinding.ItemAlbumBinding
import org.oxycblt.auxio.databinding.ItemSongBinding
import org.oxycblt.auxio.music.models.Album
import org.oxycblt.auxio.music.models.Song
class SongAdapter(

View file

@ -5,11 +5,9 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import org.oxycblt.auxio.ClickListener
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentSongsBinding
import org.oxycblt.auxio.music.MusicViewModel
import org.oxycblt.auxio.theme.applyDivider
@ -25,9 +23,7 @@ class SongsFragment : Fragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = DataBindingUtil.inflate<FragmentSongsBinding>(
inflater, R.layout.fragment_songs, container, false
)
val binding = FragmentSongsBinding.inflate(inflater)
binding.songRecycler.adapter = SongAdapter(
musicModel.songs.value!!,

View file

@ -33,10 +33,7 @@ private val ACCENTS = listOf(
val accent = ACCENTS[5]
fun getInactiveAlpha(color: Int): Int {
return if (color == R.color.yellow) 100 else 150
}
// Get the transparent variant of a color int
fun getTransparentAccent(context: Context, color: Int, alpha: Int): Int {
return ColorUtils.setAlphaComponent(
ContextCompat.getColor(context, color),
@ -44,6 +41,12 @@ fun getTransparentAccent(context: Context, color: Int, alpha: Int): Int {
)
}
// Get the inactive transparency of an accent
fun getInactiveAlpha(color: Int): Int {
return if (color == R.color.yellow) 100 else 150
}
// Convert an integer to a color
fun Int.toColor(context: Context): Int {
return try {
ContextCompat.getColor(context, this)

View file

@ -10,7 +10,7 @@
type="org.oxycblt.auxio.music.models.Artist" />
</data>
<LinearLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
@ -22,14 +22,22 @@
android:layout_height="?android:attr/actionBarSize"
android:background="?android:attr/windowBackground"
android:elevation="@dimen/elevation_normal"
app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold"
app:layout_constraintTop_toTopOf="parent"
app:title="@string/title_library_fragment"
app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold"
tools:titleTextColor="@color/blue" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{artist.name}" />
<ImageView
android:id="@+id/artist_image"
android:layout_width="@dimen/cover_size_huge"
android:layout_height="@dimen/cover_size_huge"
android:layout_margin="@dimen/margin_medium"
app:artistImage="@{artist}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_artist"
tools:tint="@color/blue" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -25,6 +25,6 @@
android:layout_height="0dp"
android:layout_weight="1"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_album" />
tools:listitem="@layout/item_artist" />
</LinearLayout>
</layout>

View file

@ -26,8 +26,9 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/backgrounds/scenic"
tools:ignore="ContentDescription" />
tools:ignore="ContentDescription"
tools:src="@drawable/ic_album"
tools:tint="@color/blue" />
<TextView
android:id="@+id/album_name"

View file

@ -22,12 +22,14 @@
android:id="@+id/artist_image"
android:layout_width="@dimen/cover_size_normal"
android:layout_height="@dimen/cover_size_normal"
app:artistImage="@{artist}"
android:src="@drawable/ic_exit"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/backgrounds/scenic"
tools:ignore="ContentDescription" />
app:artistImage="@{artist}"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_artist"
tools:tint="@color/blue" />
<TextView
android:id="@+id/artist_name"

View file

@ -26,8 +26,9 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/backgrounds/scenic"
tools:ignore="ContentDescription" />
tools:ignore="ContentDescription"
tools:src="@drawable/ic_song"
tools:tint="@color/blue" />
<TextView
android:id="@+id/song_name"

View file

@ -22,7 +22,11 @@
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_show_artist"
app:destination="@id/artist_detail_fragment" />
app:destination="@id/artist_detail_fragment"
app:enterAnim="@anim/fragment_fade_enter"
app:exitAnim="@anim/fragment_fade_exit"
app:popEnterAnim="@anim/fragment_fade_enter"
app:popExitAnim="@anim/fragment_fade_exit" />
</fragment>
<fragment
android:id="@+id/artist_detail_fragment"

View file

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"/>
android:duration="@android:integer/config_mediumAnimTime" />

View file

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="background">#151515</color>
<color name="divider_color">#323232</color>
<color name="selection_color">#484848</color>
<!--
Base color set derived from Music Player GO.
https://github.com/enricocid/Music-Player-GO
-->
<color name="red">#ef9a9a</color>
<color name="pink">#f48fb1</color>
<color name="purple">#ce93d8</color>
<color name="deep_purple">#b39ddb</color>
<color name="indigo">#9fa8da</color>
<color name="blue">#90caf9</color>
<color name="light_blue">#81d4fa</color>
<color name="cyan">#80deea</color>
<color name="teal">#80cbc4</color>
<color name="green">#a5d6a7</color>
<color name="light_green">#c5e1a5</color>
<color name="lime">#e6ee9c</color>
<color name="yellow">#fff59d</color>
<color name="amber">#ffe082</color>
<color name="orange">#ffcc80</color>
<color name="deep_orange">#ffab91</color>
<color name="brown">#bcaaa4</color>
<color name="grey">#eeeeee</color>
<color name="blue_grey">#b0bec5</color>
</resources>

View file

@ -1,30 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="background">#fafafa</color>
<color name="divider_color">#cbcbcb</color>
<color name="selection_color">#cbcbcb</color>
<color name="background">#151515</color>
<color name="divider_color">#323232</color>
<color name="selection_color">#484848</color>
<!--
Base color set derived from Music Player GO.
https://github.com/enricocid/Music-Player-GO
-->
<color name="red">#f44336</color>
<color name="pink">#e91e63</color>
<color name="purple">#9c27b0</color>
<color name="deep_purple">#673ab7</color>
<color name="indigo">#3f51b5</color>
<color name="blue">#2196f3</color>
<color name="light_blue">#03a9f4</color>
<color name="cyan">#00bcd4</color>
<color name="teal">#009688</color>
<color name="green">#4caf50</color>
<color name="light_green">#8bc34a</color>
<color name="lime">#cddc39</color>
<color name="yellow">#ffeb3b</color>
<color name="amber">#ffc107</color>
<color name="orange">#ff9800</color>
<color name="deep_orange">#ff5722</color>
<color name="brown">#795548</color>
<color name="grey">#9e9e9e</color>
<color name="blue_grey">#607d8b</color>
<color name="red">#ef9a9a</color>
<color name="pink">#f48fb1</color>
<color name="purple">#ce93d8</color>
<color name="deep_purple">#b39ddb</color>
<color name="indigo">#9fa8da</color>
<color name="blue">#90caf9</color>
<color name="light_blue">#81d4fa</color>
<color name="cyan">#80deea</color>
<color name="teal">#80cbc4</color>
<color name="green">#a5d6a7</color>
<color name="light_green">#c5e1a5</color>
<color name="lime">#e6ee9c</color>
<color name="yellow">#fff59d</color>
<color name="amber">#ffe082</color>
<color name="orange">#ffcc80</color>
<color name="deep_orange">#ffab91</color>
<color name="brown">#bcaaa4</color>
<color name="grey">#eeeeee</color>
<color name="blue_grey">#b0bec5</color>
</resources>

View file

@ -13,6 +13,7 @@
<dimen name="cover_size_compact">44dp</dimen>
<dimen name="cover_size_normal">56dp</dimen>
<dimen name="cover_size_huge">168dp</dimen>
<dimen name="elevation_normal">4dp</dimen>
</resources>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Base theme -->
<style name="Theme.Base" parent="Theme.AppCompat.DayNight.NoActionBar">
<style name="Theme.Base" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@color/background</item>
<item name="android:statusBarColor">@android:color/black</item>
<item name="android:fontFamily">@font/inter</item>