ui: revert list item changes
Revert the removal of the song/artist values from list items for now. The current plan of removing extraneous values from songs and albums only works if I add multi-select and a dedicated menu button, but that is still in the air, and in general I want feedback before I go ahead. Aside from reverting the previous changes, this actually standardizes all item descriptions under a single bullet point formatting system, instead of the mix of commas and bullet points that existed beforehand.
This commit is contained in:
parent
a408cc629d
commit
dbe0bd1bb3
11 changed files with 37 additions and 36 deletions
|
|
@ -2,6 +2,9 @@
|
||||||
|
|
||||||
## dev [v2.2.2 or 2.3.0]
|
## dev [v2.2.2 or 2.3.0]
|
||||||
|
|
||||||
|
#### What's New
|
||||||
|
- New spanish translations and metadata [courtesy of n-berenice]
|
||||||
|
|
||||||
#### What's Improved
|
#### What's Improved
|
||||||
- Rounded images are more nuanced
|
- Rounded images are more nuanced
|
||||||
- Shuffle and Repeat mode buttons now have more contrast when they are turned on
|
- Shuffle and Repeat mode buttons now have more contrast when they are turned on
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||||
* The single [AppCompatActivity] for Auxio.
|
* The single [AppCompatActivity] for Auxio.
|
||||||
* TODO: Add a new view for crashes with a stack trace
|
* TODO: Add a new view for crashes with a stack trace
|
||||||
* TODO: Custom language support
|
* TODO: Custom language support
|
||||||
|
* TODO: Rework menus [perhaps add multi-select]
|
||||||
*/
|
*/
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
private val playbackModel: PlaybackViewModel by viewModels()
|
private val playbackModel: PlaybackViewModel by viewModels()
|
||||||
|
|
@ -81,7 +82,6 @@ class MainActivity : AppCompatActivity() {
|
||||||
if (action == Intent.ACTION_VIEW && !isConsumed) {
|
if (action == Intent.ACTION_VIEW && !isConsumed) {
|
||||||
// Mark the intent as used so this does not fire again
|
// Mark the intent as used so this does not fire again
|
||||||
intent.putExtra(KEY_INTENT_USED, true)
|
intent.putExtra(KEY_INTENT_USED, true)
|
||||||
|
|
||||||
intent.data?.let { fileUri ->
|
intent.data?.let { fileUri ->
|
||||||
playbackModel.playWithUri(fileUri, this)
|
playbackModel.playWithUri(fileUri, this)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,9 @@ class RoundableImageView @JvmOverloads constructor(
|
||||||
// dimensions of the image, which will result in inconsistent corners across different
|
// dimensions of the image, which will result in inconsistent corners across different
|
||||||
// album covers unless we resize all covers to be the same size. clipToOutline is both
|
// album covers unless we resize all covers to be the same size. clipToOutline is both
|
||||||
// cheaper and more elegant.
|
// cheaper and more elegant.
|
||||||
val settingsManager = SettingsManager.getInstance()
|
if (!isInEditMode) {
|
||||||
clipToOutline = settingsManager.roundCovers
|
val settingsManager = SettingsManager.getInstance()
|
||||||
|
clipToOutline = settingsManager.roundCovers
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,6 @@ class DetailAppBarLayout @JvmOverloads constructor(
|
||||||
|
|
||||||
override fun onAttachedToWindow() {
|
override fun onAttachedToWindow() {
|
||||||
super.onAttachedToWindow()
|
super.onAttachedToWindow()
|
||||||
|
|
||||||
(layoutParams as CoordinatorLayout.LayoutParams).behavior = Behavior(context)
|
(layoutParams as CoordinatorLayout.LayoutParams).behavior = Behavior(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ sealed class MusicParent : Music() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The data object for a song. Inherits [Item].
|
* The data object for a song.
|
||||||
*/
|
*/
|
||||||
data class Song(
|
data class Song(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
|
@ -147,7 +147,7 @@ data class Song(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The data object for an album. Inherits [MusicParent].
|
* The data object for an album.
|
||||||
*/
|
*/
|
||||||
data class Album(
|
data class Album(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
|
@ -220,7 +220,7 @@ data class Artist(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The data object for a genre. Inherits [MusicParent]
|
* The data object for a genre.
|
||||||
*/
|
*/
|
||||||
data class Genre(
|
data class Genre(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import androidx.core.database.getStringOrNull
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.excluded.ExcludedDatabase
|
import org.oxycblt.auxio.excluded.ExcludedDatabase
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.logE
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class acts as the base for most the black magic required to get a remotely sensible music
|
* This class acts as the base for most the black magic required to get a remotely sensible music
|
||||||
|
|
@ -94,8 +93,12 @@ class MusicLoader {
|
||||||
song.internalIsMissingArtist ||
|
song.internalIsMissingArtist ||
|
||||||
song.internalIsMissingGenre
|
song.internalIsMissingGenre
|
||||||
) {
|
) {
|
||||||
logE("Found malformed song: ${song.name}")
|
throw IllegalStateException(
|
||||||
throw IllegalStateException()
|
"Found malformed song: ${song.name} [" +
|
||||||
|
"album: ${!song.internalIsMissingAlbum} " +
|
||||||
|
"artist: ${!song.internalIsMissingArtist} " +
|
||||||
|
"genre: ${!song.internalIsMissingGenre}]"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -126,6 +129,7 @@ class MusicLoader {
|
||||||
args += "$path%" // Append % so that the selector properly detects children
|
args += "$path%" // Append % so that the selector properly detects children
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Figure out the semantics of the track field to prevent odd 4-digit numbers
|
||||||
context.applicationContext.contentResolver.query(
|
context.applicationContext.contentResolver.query(
|
||||||
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
|
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
|
||||||
arrayOf(
|
arrayOf(
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,11 @@ fun TextView.bindSongInfo(song: Song?) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
text = song.resolvedArtistName
|
text = context.getString(
|
||||||
|
R.string.fmt_two,
|
||||||
|
song.resolvedArtistName,
|
||||||
|
song.resolvedAlbumName
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("albumInfo")
|
@BindingAdapter("albumInfo")
|
||||||
|
|
@ -141,7 +145,11 @@ fun TextView.bindAlbumInfo(album: Album?) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
text = album.resolvedArtistName
|
text = context.getString(
|
||||||
|
R.string.fmt_two,
|
||||||
|
album.resolvedArtistName,
|
||||||
|
context.getPluralSafe(R.plurals.fmt_song_count, album.songs.size)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@BindingAdapter("artistInfo")
|
@BindingAdapter("artistInfo")
|
||||||
|
|
@ -152,7 +160,7 @@ fun TextView.bindArtistInfo(artist: Artist?) {
|
||||||
}
|
}
|
||||||
|
|
||||||
text = context.getString(
|
text = context.getString(
|
||||||
R.string.fmt_counts,
|
R.string.fmt_two,
|
||||||
context.getPluralSafe(R.plurals.fmt_album_count, artist.albums.size),
|
context.getPluralSafe(R.plurals.fmt_album_count, artist.albums.size),
|
||||||
context.getPluralSafe(R.plurals.fmt_song_count, artist.songs.size)
|
context.getPluralSafe(R.plurals.fmt_song_count, artist.songs.size)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ import kotlin.math.min
|
||||||
* or extendable. You have been warned.
|
* or extendable. You have been warned.
|
||||||
*
|
*
|
||||||
* @author OxygenCobalt (With help from Umano and Hai Zhang)
|
* @author OxygenCobalt (With help from Umano and Hai Zhang)
|
||||||
|
* TODO: Find a better way to handle PlaybackFragment in general (navigation, creation)
|
||||||
*/
|
*/
|
||||||
class PlaybackLayout @JvmOverloads constructor(
|
class PlaybackLayout @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
|
@ -109,6 +110,8 @@ class PlaybackLayout @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
setWillNotDraw(false)
|
||||||
|
|
||||||
// Set up our playback views. Doing this allows us to abstract away the implementation
|
// Set up our playback views. Doing this allows us to abstract away the implementation
|
||||||
// of these views from the user of this layout [MainFragment].
|
// of these views from the user of this layout [MainFragment].
|
||||||
playbackContainerView = FrameLayout(context).apply {
|
playbackContainerView = FrameLayout(context).apply {
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,8 @@ class AudioReactor(
|
||||||
/**
|
/**
|
||||||
* Updates the rough volume adjustment for [Metadata] with ReplayGain tags.
|
* Updates the rough volume adjustment for [Metadata] with ReplayGain tags.
|
||||||
* This is based off Vanilla Music's implementation.
|
* This is based off Vanilla Music's implementation.
|
||||||
|
* TODO: Add ReplayGain pre-amp
|
||||||
|
* TODO: Add positive ReplayGain values
|
||||||
*/
|
*/
|
||||||
fun applyReplayGain(metadata: Metadata?) {
|
fun applyReplayGain(metadata: Metadata?) {
|
||||||
if (metadata == null) {
|
if (metadata == null) {
|
||||||
|
|
@ -130,6 +132,7 @@ class AudioReactor(
|
||||||
playbackManager.song?.album == playbackManager.parent
|
playbackManager.song?.album == playbackManager.parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val gain = parseReplayGain(metadata)
|
val gain = parseReplayGain(metadata)
|
||||||
|
|
||||||
val adjust = if (gain != null) {
|
val adjust = if (gain != null) {
|
||||||
|
|
@ -147,8 +150,6 @@ class AudioReactor(
|
||||||
|
|
||||||
// Final adjustment along the volume curve.
|
// Final adjustment along the volume curve.
|
||||||
// Ensure this is clamped to 0 or 1 so that it can be used as a volume.
|
// Ensure this is clamped to 0 or 1 so that it can be used as a volume.
|
||||||
// While positive ReplayGain values *could* be theoretically added, it's such
|
|
||||||
// a niche use-case that to be worth the effort required. Maybe if someone requests it.
|
|
||||||
volume = MathUtils.clamp((10f.pow((adjust / 20f))), 0f, 1f)
|
volume = MathUtils.clamp((10f.pow((adjust / 20f))), 0f, 1f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -180,7 +181,7 @@ class AudioReactor(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key in REPLAY_GAIN_TAGS) {
|
if (key in REPLAY_GAIN_TAGS) {
|
||||||
tags.add(GainTag(key!!, parseReplayGainFloat(value)))
|
tags.add(GainTag(requireNotNull(key), parseReplayGainFloat(value)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,7 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@{song.name}"
|
android:text="@{song.name}"
|
||||||
android:layout_marginEnd="@dimen/spacing_small"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/song_info"
|
app:layout_constraintBottom_toTopOf="@+id/song_info"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/song_duration"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/album_cover"
|
app:layout_constraintStart_toEndOf="@+id/album_cover"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_chainStyle="packed"
|
app:layout_constraintVertical_chainStyle="packed"
|
||||||
|
|
@ -44,26 +42,9 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:songInfo="@{song}"
|
app:songInfo="@{song}"
|
||||||
android:layout_marginEnd="@dimen/spacing_small"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/song_duration"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/album_cover"
|
app:layout_constraintStart_toEndOf="@+id/album_cover"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/song_name"
|
app:layout_constraintTop_toBottomOf="@+id/song_name"
|
||||||
tools:text="Artist / Album" />
|
tools:text="Artist / Album" />
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/song_duration"
|
|
||||||
style="@style/Widget.Auxio.TextView.Item.Tertiary"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:ellipsize="none"
|
|
||||||
android:gravity="end"
|
|
||||||
android:text="@{song.formattedDuration}"
|
|
||||||
android:textAlignment="viewEnd"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
tools:text="16:16" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
<string name="info_app_name" translatable="false">Auxio</string>
|
<string name="info_app_name" translatable="false">Auxio</string>
|
||||||
|
|
||||||
<!-- Format Namespace | Value formatting/plurals -->
|
<!-- Format Namespace | Value formatting/plurals -->
|
||||||
|
<string name="fmt_two" translatable="false">%1$s • %2$s</string>
|
||||||
<string name="fmt_three" translatable="false">%1$s • %2$s • %3$s</string>
|
<string name="fmt_three" translatable="false">%1$s • %2$s • %3$s</string>
|
||||||
<string name="fmt_counts" translatable="false">%1$s, %2$s</string>
|
|
||||||
<string name="fmt_track" translatable="false">%d</string>
|
<string name="fmt_track" translatable="false">%d</string>
|
||||||
</resources>
|
</resources>
|
||||||
Loading…
Reference in a new issue