Cleanup code

Clean up the formatting/structure of the codebase.
This commit is contained in:
OxygenCobalt 2021-05-02 18:49:16 -06:00
parent 35591c42c7
commit a849d00248
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
30 changed files with 104 additions and 119 deletions

View file

@ -9,10 +9,10 @@ import androidx.navigation.fragment.navArgs
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.detail.adapters.ArtistDetailAdapter import org.oxycblt.auxio.detail.adapters.ArtistDetailAdapter
import org.oxycblt.auxio.logD import org.oxycblt.auxio.logD
import org.oxycblt.auxio.music.ActionHeader
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.state.PlaybackMode import org.oxycblt.auxio.playback.state.PlaybackMode
@ -63,16 +63,6 @@ class ArtistDetailFragment : DetailFragment() {
} }
) )
// We build the action header here since it's both more efficent to keep one action header
// and it also prevents the header from being constantly refreshed when the sort is updated.
val songsHeader = ActionHeader(
id = -2,
name = getString(R.string.label_songs),
icon = detailModel.artistSortMode.value!!.iconRes,
action = detailModel::incrementArtistSortMode
)
// --- UI SETUP --- // --- UI SETUP ---
binding.lifecycleOwner = this binding.lifecycleOwner = this
@ -80,7 +70,7 @@ class ArtistDetailFragment : DetailFragment() {
setupToolbar() setupToolbar()
setupRecycler(detailAdapter) { pos -> setupRecycler(detailAdapter) { pos ->
// If the item is an ActionHeader we need to also make the item full-width // If the item is an ActionHeader we need to also make the item full-width
pos == 0 || detailAdapter.currentList.getOrNull(pos) is ActionHeader pos == 0 || detailAdapter.currentList.getOrNull(pos) is Header
} }
// --- VIEWMODEL SETUP --- // --- VIEWMODEL SETUP ---
@ -91,8 +81,17 @@ class ArtistDetailFragment : DetailFragment() {
val artist = detailModel.currentArtist.value!! val artist = detailModel.currentArtist.value!!
val data = mutableListOf<BaseModel>(artist) val data = mutableListOf<BaseModel>(artist)
data.addAll(SortMode.NUMERIC_DOWN.getSortedAlbumList(artist.albums)) data.addAll(SortMode.NUMERIC_DOWN.getSortedAlbumList(artist.albums))
data.add(songsHeader)
data.add(
Header(
id = -2,
name = getString(R.string.label_songs),
isAction = true
)
)
data.addAll(mode.getSortedArtistSongList(artist.songs)) data.addAll(mode.getSortedArtistSongList(artist.songs))
detailAdapter.submitList(data) detailAdapter.submitList(data)

View file

@ -10,10 +10,10 @@ import org.oxycblt.auxio.databinding.ItemArtistHeaderBinding
import org.oxycblt.auxio.databinding.ItemArtistSongBinding import org.oxycblt.auxio.databinding.ItemArtistSongBinding
import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.detail.DetailViewModel
import org.oxycblt.auxio.logD import org.oxycblt.auxio.logD
import org.oxycblt.auxio.music.ActionHeader
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.DiffCallback
@ -46,7 +46,7 @@ class ArtistDetailAdapter(
return when (getItem(position)) { return when (getItem(position)) {
is Artist -> ARTIST_HEADER_ITEM_TYPE is Artist -> ARTIST_HEADER_ITEM_TYPE
is Album -> ARTIST_ALBUM_ITEM_TYPE is Album -> ARTIST_ALBUM_ITEM_TYPE
is ActionHeader -> ARTIST_SONG_HEADER_ITEM_TYPE is Header -> ARTIST_SONG_HEADER_ITEM_TYPE
is Song -> ARTIST_SONG_ITEM_TYPE is Song -> ARTIST_SONG_ITEM_TYPE
else -> -1 else -> -1
@ -81,7 +81,7 @@ class ArtistDetailAdapter(
when (item) { when (item) {
is Artist -> (holder as ArtistHeaderViewHolder).bind(item) is Artist -> (holder as ArtistHeaderViewHolder).bind(item)
is Album -> (holder as ArtistAlbumViewHolder).bind(item) is Album -> (holder as ArtistAlbumViewHolder).bind(item)
is ActionHeader -> (holder as ArtistSongHeaderViewHolder).bind(item) is Header -> (holder as ArtistSongHeaderViewHolder).bind(item)
is Song -> (holder as ArtistSongViewHolder).bind(item) is Song -> (holder as ArtistSongViewHolder).bind(item)
else -> {} else -> {}
@ -199,9 +199,9 @@ class ArtistDetailAdapter(
inner class ArtistSongHeaderViewHolder( inner class ArtistSongHeaderViewHolder(
private val binding: ItemActionHeaderBinding private val binding: ItemActionHeaderBinding
) : BaseViewHolder<ActionHeader>(binding) { ) : BaseViewHolder<Header>(binding) {
override fun onBind(data: ActionHeader) { override fun onBind(data: Header) {
binding.header = data binding.header = data
binding.headerButton.apply { binding.headerButton.apply {
@ -211,7 +211,7 @@ class ArtistDetailAdapter(
setImageResource(sortMode.value!!.iconRes) setImageResource(sortMode.value!!.iconRes)
setOnClickListener { setOnClickListener {
data.action() // Should call DetailViewModel.incrementArtistSortMode detailModel.incrementArtistSortMode()
setImageResource(sortMode.value!!.iconRes) setImageResource(sortMode.value!!.iconRes)
} }

View file

@ -1,7 +1,6 @@
package org.oxycblt.auxio.music package org.oxycblt.auxio.music
import android.net.Uri import android.net.Uri
import androidx.annotation.DrawableRes
// --- MUSIC MODELS --- // --- MUSIC MODELS ---
@ -189,20 +188,10 @@ data class Genre(
/** /**
* A data object used solely for the "Header" UI element. Inherits [BaseModel]. * A data object used solely for the "Header" UI element. Inherits [BaseModel].
* @param isAction Whether this header corresponds to an action or not
*/ */
data class Header( data class Header(
override val id: Long, override val id: Long,
override val name: String, override val name: String,
) : BaseModel() val isAction: Boolean = false
/**
* A data object for a header with an action button. Inherits [BaseModel].
* @property icon The icon ot apply for this header.
* @property action The callback that will be called when the action button is clicked.
*/
data class ActionHeader(
override val id: Long,
override val name: String,
@DrawableRes val icon: Int,
val action: () -> Unit,
) : BaseModel() ) : BaseModel()

View file

@ -3,17 +3,19 @@ package org.oxycblt.auxio.playback.queue
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.MotionEvent import android.view.MotionEvent
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.TooltipCompat
import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.ItemActionHeaderBinding
import org.oxycblt.auxio.databinding.ItemQueueSongBinding import org.oxycblt.auxio.databinding.ItemQueueSongBinding
import org.oxycblt.auxio.logE import org.oxycblt.auxio.logE
import org.oxycblt.auxio.music.ActionHeader
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.DiffCallback
import org.oxycblt.auxio.recycler.viewholders.ActionHeaderViewHolder
import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder
import org.oxycblt.auxio.recycler.viewholders.HeaderViewHolder import org.oxycblt.auxio.recycler.viewholders.HeaderViewHolder
import org.oxycblt.auxio.ui.inflater import org.oxycblt.auxio.ui.inflater
@ -21,10 +23,12 @@ import org.oxycblt.auxio.ui.inflater
/** /**
* The single adapter for both the Next Queue and the User Queue. * The single adapter for both the Next Queue and the User Queue.
* @param touchHelper The [ItemTouchHelper] ***containing*** [QueueDragCallback] to be used * @param touchHelper The [ItemTouchHelper] ***containing*** [QueueDragCallback] to be used
* @param playbackModel The [PlaybackViewModel] for updates to be dispatched to
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class QueueAdapter( class QueueAdapter(
private val touchHelper: ItemTouchHelper private val touchHelper: ItemTouchHelper,
private val playbackModel: PlaybackViewModel
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var data = mutableListOf<BaseModel>() private var data = mutableListOf<BaseModel>()
private var listDiffer = AsyncListDiffer(this, DiffCallback()) private var listDiffer = AsyncListDiffer(this, DiffCallback())
@ -32,12 +36,15 @@ class QueueAdapter(
override fun getItemCount(): Int = data.size override fun getItemCount(): Int = data.size
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
val item = data[position] return when (val item = data[position]) {
is Header -> if (item.isAction) {
USER_QUEUE_HEADER_ITEM_TYPE
} else {
HeaderViewHolder.ITEM_TYPE
}
return when (item) {
is Header -> HeaderViewHolder.ITEM_TYPE
is ActionHeader -> ActionHeaderViewHolder.ITEM_TYPE
is Song -> QUEUE_SONG_ITEM_TYPE is Song -> QUEUE_SONG_ITEM_TYPE
else -> -1 else -> -1
} }
} }
@ -46,7 +53,9 @@ class QueueAdapter(
return when (viewType) { return when (viewType) {
HeaderViewHolder.ITEM_TYPE -> HeaderViewHolder.from(parent.context) HeaderViewHolder.ITEM_TYPE -> HeaderViewHolder.from(parent.context)
ActionHeaderViewHolder.ITEM_TYPE -> ActionHeaderViewHolder.from(parent.context) USER_QUEUE_HEADER_ITEM_TYPE -> UserQueueHeaderViewHolder(
ItemActionHeaderBinding.inflate(parent.context.inflater)
)
QUEUE_SONG_ITEM_TYPE -> QueueSongViewHolder( QUEUE_SONG_ITEM_TYPE -> QueueSongViewHolder(
ItemQueueSongBinding.inflate(parent.context.inflater) ItemQueueSongBinding.inflate(parent.context.inflater)
@ -58,9 +67,13 @@ class QueueAdapter(
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (val item = data[position]) { when (val item = data[position]) {
is Header -> if (item.isAction) {
(holder as UserQueueHeaderViewHolder).bind(item)
} else {
(holder as HeaderViewHolder).bind(item)
}
is Song -> (holder as QueueSongViewHolder).bind(item) is Song -> (holder as QueueSongViewHolder).bind(item)
is Header -> (holder as HeaderViewHolder).bind(item)
is ActionHeader -> (holder as ActionHeaderViewHolder).bind(item)
else -> logE("Bad data given to QueueAdapter.") else -> logE("Bad data given to QueueAdapter.")
} }
@ -145,7 +158,31 @@ class QueueAdapter(
} }
} }
/*
* The viewholder for
*/
inner class UserQueueHeaderViewHolder(
private val binding: ItemActionHeaderBinding
) : BaseViewHolder<Header>(binding) {
override fun onBind(data: Header) {
binding.header = data
binding.headerButton.apply {
setImageResource(R.drawable.ic_clear)
contentDescription = context.getString(R.string.description_clear_user_queue)
TooltipCompat.setTooltipText(this, contentDescription)
setOnClickListener {
playbackModel.clearUserQueue()
}
}
}
}
companion object { companion object {
const val QUEUE_SONG_ITEM_TYPE = 0xA005 const val QUEUE_SONG_ITEM_TYPE = 0xA005
const val USER_QUEUE_HEADER_ITEM_TYPE = 0xA006
} }
} }

View file

@ -13,7 +13,6 @@ import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentQueueBinding import org.oxycblt.auxio.databinding.FragmentQueueBinding
import org.oxycblt.auxio.music.ActionHeader
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.playback.PlaybackViewModel
@ -37,7 +36,7 @@ class QueueFragment : Fragment() {
val callback = QueueDragCallback(playbackModel) val callback = QueueDragCallback(playbackModel)
val helper = ItemTouchHelper(callback) val helper = ItemTouchHelper(callback)
val queueAdapter = QueueAdapter(helper) val queueAdapter = QueueAdapter(helper, playbackModel)
var lastShuffle = playbackModel.isShuffling.value var lastShuffle = playbackModel.isShuffling.value
callback.addQueueAdapter(queueAdapter) callback.addQueueAdapter(queueAdapter)
@ -137,13 +136,10 @@ class QueueFragment : Fragment() {
val nextQueue = playbackModel.nextItemsInQueue.value!! val nextQueue = playbackModel.nextItemsInQueue.value!!
if (userQueue.isNotEmpty()) { if (userQueue.isNotEmpty()) {
queue += ActionHeader( queue += Header(
id = -2, id = -2,
name = getString(R.string.label_next_user_queue), name = getString(R.string.label_next_user_queue),
icon = R.drawable.ic_clear, isAction = true
action = {
playbackModel.clearUserQueue()
}
) )
queue += userQueue queue += userQueue
@ -151,7 +147,9 @@ class QueueFragment : Fragment() {
if (nextQueue.isNotEmpty()) { if (nextQueue.isNotEmpty()) {
queue += Header( queue += Header(
id = -3, name = getString(R.string.format_next_from, getParentName()), id = -3,
name = getString(R.string.format_next_from, getParentName()),
isAction = false
) )
queue += nextQueue queue += nextQueue

View file

@ -2,13 +2,11 @@ package org.oxycblt.auxio.recycler.viewholders
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import org.oxycblt.auxio.databinding.ItemActionHeaderBinding
import org.oxycblt.auxio.databinding.ItemAlbumBinding import org.oxycblt.auxio.databinding.ItemAlbumBinding
import org.oxycblt.auxio.databinding.ItemArtistBinding import org.oxycblt.auxio.databinding.ItemArtistBinding
import org.oxycblt.auxio.databinding.ItemGenreBinding import org.oxycblt.auxio.databinding.ItemGenreBinding
import org.oxycblt.auxio.databinding.ItemHeaderBinding import org.oxycblt.auxio.databinding.ItemHeaderBinding
import org.oxycblt.auxio.databinding.ItemSongBinding import org.oxycblt.auxio.databinding.ItemSongBinding
import org.oxycblt.auxio.music.ActionHeader
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Genre
@ -153,7 +151,9 @@ class GenreViewHolder private constructor(
/** /**
* The Shared ViewHolder for a [Header]. Instantiation should be done with [from] * The Shared ViewHolder for a [Header]. Instantiation should be done with [from]
*/ */
class HeaderViewHolder(private val binding: ItemHeaderBinding) : BaseViewHolder<Header>(binding) { class HeaderViewHolder private constructor(
private val binding: ItemHeaderBinding
) : BaseViewHolder<Header>(binding) {
override fun onBind(data: Header) { override fun onBind(data: Header) {
binding.header = data binding.header = data
@ -172,35 +172,3 @@ class HeaderViewHolder(private val binding: ItemHeaderBinding) : BaseViewHolder<
} }
} }
} }
/**
* The Shared ViewHolder for a [ActionHeader]. Instantiation should be done with [from]
*/
class ActionHeaderViewHolder(
private val binding: ItemActionHeaderBinding
) : BaseViewHolder<ActionHeader>(binding) {
override fun onBind(data: ActionHeader) {
binding.header = data
binding.headerButton.apply {
setImageResource(data.icon)
setOnClickListener {
data.action()
}
}
}
companion object {
const val ITEM_TYPE = 0xA006
/**
* Create an instance of [ActionHeaderViewHolder]
*/
fun from(context: Context): ActionHeaderViewHolder {
return ActionHeaderViewHolder(
ItemActionHeaderBinding.inflate(context.inflater)
)
}
}
}

View file

@ -62,7 +62,7 @@ class BlacklistViewModel(context: Context) : ViewModel() {
/** /**
* Load the paths stored in the database to this ViewModel, will erase any pending changes. * Load the paths stored in the database to this ViewModel, will erase any pending changes.
*/ */
fun loadDatabasePaths() { private fun loadDatabasePaths() {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
dbPaths = blacklistDatabase.readPaths() dbPaths = blacklistDatabase.readPaths()

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!-- Animator from IndicatorFastScroll (https://github.com/reddit/IndicatorFastScroll) -->
<!-- Animator from IndicatorFastScroll (https://github.com/reddit/IndicatorFastScroll) -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"> <item android:state_activated="true">
<set> <set>

View file

@ -95,9 +95,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/album_shuffle_button" android:id="@+id/album_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playAlbum(album, true)}" android:onClick="@{() -> playbackModel.playAlbum(album, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/album_play_button" app:layout_constraintBottom_toBottomOf="@+id/album_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_play_button" app:layout_constraintStart_toEndOf="@+id/album_play_button"

View file

@ -87,9 +87,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/artist_shuffle_button" android:id="@+id/artist_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playArtist(artist, true)}" android:onClick="@{() -> playbackModel.playArtist(artist, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/artist_play_button" app:layout_constraintBottom_toBottomOf="@+id/artist_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/artist_play_button" app:layout_constraintStart_toEndOf="@+id/artist_play_button"

View file

@ -78,9 +78,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/genre_shuffle_button" android:id="@+id/genre_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playGenre(genre, true)}" android:onClick="@{() -> playbackModel.playGenre(genre, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/genre_play_button" app:layout_constraintBottom_toBottomOf="@+id/genre_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/genre_play_button" app:layout_constraintStart_toEndOf="@+id/genre_play_button"

View file

@ -95,9 +95,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/album_shuffle_button" android:id="@+id/album_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playAlbum(album, true)}" android:onClick="@{() -> playbackModel.playAlbum(album, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/album_play_button" app:layout_constraintBottom_toBottomOf="@+id/album_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_play_button" app:layout_constraintStart_toEndOf="@+id/album_play_button"

View file

@ -87,9 +87,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/artist_shuffle_button" android:id="@+id/artist_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playArtist(artist, true)}" android:onClick="@{() -> playbackModel.playArtist(artist, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/artist_play_button" app:layout_constraintBottom_toBottomOf="@+id/artist_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/artist_play_button" app:layout_constraintStart_toEndOf="@+id/artist_play_button"

View file

@ -78,9 +78,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/genre_shuffle_button" android:id="@+id/genre_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playGenre(genre, true)}" android:onClick="@{() -> playbackModel.playGenre(genre, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/genre_play_button" app:layout_constraintBottom_toBottomOf="@+id/genre_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/genre_play_button" app:layout_constraintStart_toEndOf="@+id/genre_play_button"

View file

@ -7,9 +7,9 @@
android:id="@+id/accent_recycler" android:id="@+id/accent_recycler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingTop="@dimen/spacing_medium"
android:foregroundGravity="center" android:foregroundGravity="center"
android:overScrollMode="never" android:overScrollMode="never"
android:paddingTop="@dimen/spacing_medium"
app:layoutManager="org.oxycblt.auxio.settings.accent.AutoGridLayoutManager" app:layoutManager="org.oxycblt.auxio.settings.accent.AutoGridLayoutManager"
app:layout_constraintBottom_toTopOf="@+id/accent_cancel" app:layout_constraintBottom_toTopOf="@+id/accent_cancel"
app:layout_constraintTop_toBottomOf="@+id/accent_header" app:layout_constraintTop_toBottomOf="@+id/accent_header"

View file

@ -26,10 +26,10 @@
android:id="@+id/search_text_layout" android:id="@+id/search_text_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:boxStrokeWidthFocused="2dp"
app:boxStrokeColor="?attr/colorPrimary"
app:boxBackgroundMode="filled" app:boxBackgroundMode="filled"
app:boxStrokeColor="?attr/colorPrimary"
app:boxStrokeWidth="0dp" app:boxStrokeWidth="0dp"
app:boxStrokeWidthFocused="2dp"
app:endIconContentDescription="@string/description_clear_search" app:endIconContentDescription="@string/description_clear_search"
app:endIconDrawable="@drawable/ic_close" app:endIconDrawable="@drawable/ic_close"
app:endIconMode="clear_text" app:endIconMode="clear_text"

View file

@ -8,7 +8,7 @@
<variable <variable
name="header" name="header"
type="org.oxycblt.auxio.music.ActionHeader" /> type="org.oxycblt.auxio.music.Header" />
</data> </data>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout

View file

@ -89,9 +89,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/album_shuffle_button" android:id="@+id/album_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playAlbum(album, true)}" android:onClick="@{() -> playbackModel.playAlbum(album, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/album_play_button" app:layout_constraintBottom_toBottomOf="@+id/album_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_play_button" app:layout_constraintStart_toEndOf="@+id/album_play_button"

View file

@ -84,9 +84,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/artist_shuffle_button" android:id="@+id/artist_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playArtist(artist, true)}" android:onClick="@{() -> playbackModel.playArtist(artist, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/artist_play_button" app:layout_constraintBottom_toBottomOf="@+id/artist_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/artist_play_button" app:layout_constraintStart_toEndOf="@+id/artist_play_button"

View file

@ -28,8 +28,8 @@
<TextView <TextView
android:id="@+id/song_name" android:id="@+id/song_name"
style="@style/ItemText.Primary" style="@style/ItemText.Primary"
android:text="@{song.name}"
android:layout_marginEnd="@dimen/spacing_medium" android:layout_marginEnd="@dimen/spacing_medium"
android:text="@{song.name}"
app:layout_constraintBottom_toTopOf="@+id/song_info" app:layout_constraintBottom_toTopOf="@+id/song_info"
app:layout_constraintEnd_toStartOf="@+id/song_duration" app:layout_constraintEnd_toStartOf="@+id/song_duration"
app:layout_constraintStart_toEndOf="@+id/album_cover" app:layout_constraintStart_toEndOf="@+id/album_cover"
@ -40,8 +40,8 @@
<TextView <TextView
android:id="@+id/song_info" android:id="@+id/song_info"
style="@style/ItemText.Secondary" style="@style/ItemText.Secondary"
android:text="@{song.album.name}"
android:layout_marginEnd="@dimen/spacing_medium" android:layout_marginEnd="@dimen/spacing_medium"
android:text="@{song.album.name}"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/song_duration" app:layout_constraintEnd_toStartOf="@+id/song_duration"
app:layout_constraintStart_toEndOf="@+id/album_cover" app:layout_constraintStart_toEndOf="@+id/album_cover"

View file

@ -89,9 +89,9 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/genre_shuffle_button" android:id="@+id/genre_shuffle_button"
style="@style/Widget.MaterialComponents.Button.Highlighted" style="@style/Widget.MaterialComponents.Button.Highlighted"
android:backgroundTint="?attr/colorPrimary"
android:onClick="@{() -> playbackModel.playGenre(genre, true)}" android:onClick="@{() -> playbackModel.playGenre(genre, true)}"
android:text="@string/label_shuffle" android:text="@string/label_shuffle"
android:backgroundTint="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="@+id/genre_play_button" app:layout_constraintBottom_toBottomOf="@+id/genre_play_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/genre_play_button" app:layout_constraintStart_toEndOf="@+id/genre_play_button"

View file

@ -13,8 +13,8 @@
android:layout_width="@dimen/size_scroll_thumb" android:layout_width="@dimen/size_scroll_thumb"
android:layout_height="@dimen/size_scroll_thumb" android:layout_height="@dimen/size_scroll_thumb"
android:background="@drawable/ui_circle" android:background="@drawable/ui_circle"
android:elevation="@dimen/elevation_small"
android:backgroundTint="?attr/colorPrimary" android:backgroundTint="?attr/colorPrimary"
android:elevation="@dimen/elevation_small"
android:stateListAnimator="@animator/animator_thumb" android:stateListAnimator="@animator/animator_thumb"
app:layout_constraintEnd_toStartOf="@+id/scroll_indicator_text"> app:layout_constraintEnd_toStartOf="@+id/scroll_indicator_text">
@ -22,10 +22,10 @@
android:id="@+id/scroll_thumb_text" android:id="@+id/scroll_thumb_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center"
android:textSize="@dimen/text_size_thumb"
android:textColor="?android:attr/windowBackground"
android:fontFamily="@font/inter_semibold" android:fontFamily="@font/inter_semibold"
android:gravity="center"
android:textColor="?android:attr/windowBackground"
android:textSize="@dimen/text_size_thumb"
tools:text="A" /> tools:text="A" />
</FrameLayout> </FrameLayout>
@ -38,9 +38,9 @@
android:gravity="center" android:gravity="center"
android:includeFontPadding="false" android:includeFontPadding="false"
android:lineSpacingExtra="@dimen/spacing_tiny" android:lineSpacingExtra="@dimen/spacing_tiny"
android:minWidth="@dimen/width_fast_scroll"
android:paddingTop="@dimen/spacing_tiny" android:paddingTop="@dimen/spacing_tiny"
android:paddingBottom="@dimen/spacing_tiny" android:paddingBottom="@dimen/spacing_tiny"
android:minWidth="@dimen/width_fast_scroll"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/> <background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon> </adaptive-icon>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/> <background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon> </adaptive-icon>

View file

@ -2,7 +2,6 @@
<resources> <resources>
<!-- Info namespace | App labels --> <!-- Info namespace | App labels -->
<string name="info_channel_name">Musikwiedergabe</string> <string name="info_channel_name">Musikwiedergabe</string>
<string name="info_service_desc">der Musikwiedergabedienst von Auxio.</string>
<!-- Label Namespace | Static Labels --> <!-- Label Namespace | Static Labels -->
<string name="label_retry">Wieder Versuchen</string> <string name="label_retry">Wieder Versuchen</string>

View file

@ -3,7 +3,6 @@
<!-- Info namespace | App labels --> <!-- Info namespace | App labels -->
<string name="info_app_desc">Een eenvoudige, rationele muziekspeler voor Android.</string> <string name="info_app_desc">Een eenvoudige, rationele muziekspeler voor Android.</string>
<string name="info_channel_name">Muziek Afspelen</string> <string name="info_channel_name">Muziek Afspelen</string>
<string name="info_service_desc">De muziekweergaveservice voor Auxio.</string>
<!-- Label Namespace | Static Labels --> <!-- Label Namespace | Static Labels -->
<string name="label_retry">Opnieuw proberen</string> <string name="label_retry">Opnieuw proberen</string>

View file

@ -12,13 +12,11 @@
<!-- Height Namespace | Height for UI elements --> <!-- Height Namespace | Height for UI elements -->
<dimen name="height_compact_progress">2dp</dimen> <dimen name="height_compact_progress">2dp</dimen>
<dimen name="height_dialog_button">40dp</dimen>
<!-- Width Namespace | Width for UI elements --> <!-- Width Namespace | Width for UI elements -->
<dimen name="width_track_number">32dp</dimen> <dimen name="width_track_number">32dp</dimen>
<dimen name="width_play_stroke">1dp</dimen> <dimen name="width_play_stroke">1dp</dimen>
<dimen name="width_fast_scroll">20dp</dimen> <dimen name="width_fast_scroll">20dp</dimen>
<dimen name="width_dialog_button_min">64dp</dimen>
<!-- Size Namespace | Width & Heights for UI elements --> <!-- Size Namespace | Width & Heights for UI elements -->
<dimen name="size_error_icon">48dp</dimen> <dimen name="size_error_icon">48dp</dimen>

View file

@ -3,7 +3,6 @@
<!-- Info namespace | App labels --> <!-- Info namespace | App labels -->
<string name="info_app_desc">A simple, rational music player for android.</string> <string name="info_app_desc">A simple, rational music player for android.</string>
<string name="info_channel_name">Music Playback</string> <string name="info_channel_name">Music Playback</string>
<string name="info_service_desc">The music playback service for Auxio.</string>
<!-- Label Namespace | Static Labels --> <!-- Label Namespace | Static Labels -->
<string name="label_retry">Retry</string> <string name="label_retry">Retry</string>

View file

@ -8,9 +8,9 @@
app:defaultValue="@integer/theme_auto" app:defaultValue="@integer/theme_auto"
app:entries="@array/entires_theme" app:entries="@array/entires_theme"
app:entryValues="@array/values_theme" app:entryValues="@array/values_theme"
app:icon="@drawable/ic_day"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="KEY_THEME2" app:key="KEY_THEME2"
app:icon="@drawable/ic_day"
app:title="@string/setting_theme" /> app:title="@string/setting_theme" />
<Preference <Preference

View file

@ -44,7 +44,7 @@ To prevent any strange bugs, all integer representations must be unique. A table
0xA004 | HeaderViewHolder 0xA004 | HeaderViewHolder
0xA005 | QueueSongViewHolder 0xA005 | QueueSongViewHolder
0xA006 | ActionHeaderViewHolder 0xA006 | UserQueueHeaderViewHolder
0xA007 | AlbumHeaderViewHolder 0xA007 | AlbumHeaderViewHolder
0xA008 | AlbumSongViewHolder 0xA008 | AlbumSongViewHolder