style: migrate to roboto

Dumpster Inter in favor of Roboto. This is mostly for three reasons:
1. Reduces the insane typography setup that Auxio uses
2. Reduces total app size since .ttf files are pretty large and the
dynamic fonts feature was proprietary.
3. Creates a more cohesive look and feel given that nearly every
android app also uses Roboto.
This commit is contained in:
OxygenCobalt 2022-01-23 10:16:46 -07:00
parent eadf4cc86d
commit 50170f202e
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
14 changed files with 54 additions and 154 deletions

View file

@ -29,7 +29,6 @@ import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.HeaderString
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
import org.oxycblt.auxio.ui.DisplayMode import org.oxycblt.auxio.ui.DisplayMode
@ -160,7 +159,7 @@ class DetailViewModel : ViewModel() {
data.add( data.add(
ActionHeader( ActionHeader(
id = -2, id = -2,
string = HeaderString.Single(R.string.lbl_songs), string = R.string.lbl_songs,
icon = R.drawable.ic_sort, icon = R.drawable.ic_sort,
desc = R.string.lbl_sort, desc = R.string.lbl_sort,
onClick = { view -> onClick = { view ->
@ -182,7 +181,7 @@ class DetailViewModel : ViewModel() {
data.add( data.add(
Header( Header(
id = -2, id = -2,
string = HeaderString.Single(R.string.lbl_albums) string = R.string.lbl_albums
) )
) )
@ -191,7 +190,7 @@ class DetailViewModel : ViewModel() {
data.add( data.add(
ActionHeader( ActionHeader(
id = -3, id = -3,
string = HeaderString.Single(R.string.lbl_songs), string = R.string.lbl_songs,
icon = R.drawable.ic_sort, icon = R.drawable.ic_sort,
desc = R.string.lbl_sort, desc = R.string.lbl_sort,
onClick = { view -> onClick = { view ->
@ -212,7 +211,7 @@ class DetailViewModel : ViewModel() {
data.add( data.add(
ActionHeader( ActionHeader(
id = -2, id = -2,
string = HeaderString.Single(R.string.lbl_songs), string = R.string.lbl_songs,
icon = R.drawable.ic_sort, icon = R.drawable.ic_sort,
desc = R.string.lbl_sort, desc = R.string.lbl_sort,
onClick = { view -> onClick = { view ->

View file

@ -18,7 +18,6 @@
package org.oxycblt.auxio.music package org.oxycblt.auxio.music
import android.content.Context
import android.view.View import android.view.View
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
@ -202,11 +201,10 @@ data class Genre(
/** /**
* A data object used solely for the "Header" UI element. * A data object used solely for the "Header" UI element.
* @see HeaderString
*/ */
data class Header( data class Header(
override val id: Long, override val id: Long,
val string: HeaderString @StringRes val string: Int
) : BaseModel() ) : BaseModel()
/** /**
@ -215,7 +213,7 @@ data class Header(
*/ */
data class ActionHeader( data class ActionHeader(
override val id: Long, override val id: Long,
val string: HeaderString, @StringRes val string: Int,
@DrawableRes val icon: Int, @DrawableRes val icon: Int,
@StringRes val desc: Int, @StringRes val desc: Int,
val onClick: (View) -> Unit, val onClick: (View) -> Unit,
@ -243,77 +241,3 @@ data class ActionHeader(
return result return result
} }
} }
/**
* The string used for a header instance. This class is a bit complex, mostly because it revolves
* around passing string resources that are then resolved by the view. This is because ViewModel
* instance should preferably not have access to a Context but should still generate data,
* which at times can include [Header] instances that require string resources.
* @author OxygenCobalt
*/
sealed class HeaderString {
/** A single string resource. */
class Single(@StringRes val id: Int) : HeaderString()
/** A string resource with an argument. */
class WithArg(@StringRes val id: Int, val arg: Arg) : HeaderString()
/**
* Resolve this instance into a string.
*/
fun resolve(context: Context): String {
return when (this) {
is Single -> context.getString(id)
is WithArg -> context.getString(id, arg.resolve(context))
}
}
override fun equals(other: Any?): Boolean {
if (this === other) return false
return when (this) {
is Single -> other is Single && other.id == id
is WithArg -> other is WithArg && other.id == id && other.arg == arg
}
}
override fun hashCode(): Int {
return when (this) {
is Single -> id.hashCode()
is WithArg -> 31 * id.hashCode() * arg.hashCode()
}
}
/**
* An argument for the [WithArg] header string.
*/
sealed class Arg {
/** A string resource to be used as the argument */
class Resource(@StringRes val id: Int) : Arg()
/** A string value to be used as the argument */
class Value(val string: String) : Arg()
/** Resolve this argument instance into a string. */
fun resolve(context: Context): String {
return when (this) {
is Resource -> context.getString(id)
is Value -> string
}
}
override fun equals(other: Any?): Boolean {
if (this === other) return false
return when (this) {
is Resource -> other is Resource && other.id == id
is Value -> other is Value && other.string == this.string
}
}
override fun hashCode(): Int {
return when (this) {
is Resource -> id.hashCode()
is Value -> 31 * string.hashCode()
}
}
}
}

View file

@ -214,7 +214,6 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
*/ */
fun removeQueueDataItem(adapterIndex: Int, apply: () -> Unit) { fun removeQueueDataItem(adapterIndex: Int, apply: () -> Unit) {
val adjusted = adapterIndex + (playbackManager.queue.size - mNextUp.value!!.size) val adjusted = adapterIndex + (playbackManager.queue.size - mNextUp.value!!.size)
logD("$adjusted")
if (adjusted in playbackManager.queue.indices) { if (adjusted in playbackManager.queue.indices) {
apply() apply()

View file

@ -284,7 +284,6 @@ class PlaybackStateManager private constructor() {
if (index > mQueue.size || index < 0) { if (index > mQueue.size || index < 0) {
logE("Index is out of bounds, did not remove queue item.") logE("Index is out of bounds, did not remove queue item.")
return false return false
} }
@ -301,7 +300,6 @@ class PlaybackStateManager private constructor() {
fun moveQueueItems(from: Int, to: Int): Boolean { fun moveQueueItems(from: Int, to: Int): Boolean {
if (from > mQueue.size || from < 0 || to > mQueue.size || to < 0) { if (from > mQueue.size || from < 0 || to > mQueue.size || to < 0) {
logE("Indices were out of bounds, did not move queue item") logE("Indices were out of bounds, did not move queue item")
return false return false
} }

View file

@ -27,7 +27,6 @@ import kotlinx.coroutines.launch
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
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.HeaderString
import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
@ -85,28 +84,28 @@ class SearchViewModel : ViewModel() {
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_ARTISTS) { if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_ARTISTS) {
musicStore.artists.filterByOrNull(query)?.let { artists -> musicStore.artists.filterByOrNull(query)?.let { artists ->
results.add(Header(-1, HeaderString.Single(R.string.lbl_artists))) results.add(Header(-1, R.string.lbl_artists))
results.addAll(sort.sortParents(artists)) results.addAll(sort.sortParents(artists))
} }
} }
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_ALBUMS) { if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_ALBUMS) {
musicStore.albums.filterByOrNull(query)?.let { albums -> musicStore.albums.filterByOrNull(query)?.let { albums ->
results.add(Header(-2, HeaderString.Single(R.string.lbl_albums))) results.add(Header(-2, R.string.lbl_albums))
results.addAll(sort.sortAlbums(albums)) results.addAll(sort.sortAlbums(albums))
} }
} }
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_GENRES) { if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_GENRES) {
musicStore.genres.filterByOrNull(query)?.let { genres -> musicStore.genres.filterByOrNull(query)?.let { genres ->
results.add(Header(-3, HeaderString.Single(R.string.lbl_genres))) results.add(Header(-3, R.string.lbl_genres))
results.addAll(sort.sortParents(genres)) results.addAll(sort.sortParents(genres))
} }
} }
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_SONGS) { if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_SONGS) {
musicStore.songs.filterByOrNull(query)?.let { songs -> musicStore.songs.filterByOrNull(query)?.let { songs ->
results.add(Header(-4, HeaderString.Single(R.string.lbl_songs))) results.add(Header(-4, R.string.lbl_songs))
results.addAll(sort.sortSongs(songs)) results.addAll(sort.sortSongs(songs))
} }
} }

Binary file not shown.

View file

@ -24,7 +24,6 @@
style="@style/Widget.Auxio.TextView.Detail" style="@style/Widget.Auxio.TextView.Detail"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="@font/inter_semibold"
android:layout_marginStart="@dimen/spacing_medium" android:layout_marginStart="@dimen/spacing_medium"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"

View file

@ -20,7 +20,7 @@
style="@style/Widget.Auxio.TextView.Header" style="@style/Widget.Auxio.TextView.Header"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@{header.string.resolve(context)}" android:text="@{context.getString(header.string)}"
app:layout_constraintBottom_toTopOf="@id/header_divider" app:layout_constraintBottom_toTopOf="@id/header_divider"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

View file

@ -24,7 +24,7 @@
android:text="@{String.valueOf(song.track)}" android:text="@{String.valueOf(song.track)}"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@style/TextAppearance.Auxio.TitleMidLarge" android:textAppearance="@style/TextAppearance.Auxio.TitleMidLarge"
android:fontFamily="@font/inter" android:fontFamily="sans-serif"
android:textColor="@color/sel_accented_secondary" android:textColor="@color/sel_accented_secondary"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View file

@ -20,7 +20,7 @@
style="@style/Widget.Auxio.TextView.Header" style="@style/Widget.Auxio.TextView.Header"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@{header.string.resolve(context)}" android:text="@{context.getString(header.string)}"
app:layout_constraintBottom_toTopOf="@id/header_divider" app:layout_constraintBottom_toTopOf="@id/header_divider"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

View file

@ -25,7 +25,6 @@
android:padding="@dimen/spacing_medium" android:padding="@dimen/spacing_medium"
android:text="@string/def_playback" android:text="@string/def_playback"
android:textAppearance="@style/TextAppearance.Auxio.TitleMidLarge" android:textAppearance="@style/TextAppearance.Auxio.TitleMidLarge"
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary" />
android:textStyle="bold" />
</FrameLayout> </FrameLayout>

View file

@ -16,7 +16,7 @@
<!-- Custom dialog title theme --> <!-- Custom dialog title theme -->
<style name="Widget.Auxio.Dialog.TextView" parent="MaterialAlertDialog.Material3.Title.Text"> <style name="Widget.Auxio.Dialog.TextView" parent="MaterialAlertDialog.Material3.Title.Text">
<item name="android:textAppearance">@style/TextAppearance.Auxio.TitleMidLarge</item> <item name="android:textAppearance">@style/TextAppearance.Auxio.TitleLarge</item>
</style> </style>
<!-- The style for the checked text view in the custom dialog --> <!-- The style for the checked text view in the custom dialog -->
@ -39,7 +39,7 @@
<!-- Widget TextView that mimics the main Auxio Primary TextView --> <!-- Widget TextView that mimics the main Auxio Primary TextView -->
<style name="Widget.Auxio.TextView.Primary.AppWidget" parent="Widget.Auxio.TextView.AppWidget"> <style name="Widget.Auxio.TextView.Primary.AppWidget" parent="Widget.Auxio.TextView.AppWidget">
<item name="android:textStyle">bold</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textAppearance">@style/TextAppearance.Auxio.TitleMidLarge</item> <item name="android:textAppearance">@style/TextAppearance.Auxio.TitleMidLarge</item>
</style> </style>

View file

@ -2,98 +2,81 @@
<resources> <resources>
<!-- Basic Material3 typography --> <!-- Basic Material3 typography -->
<style name="TextAppearance.Auxio.DisplayLarge" parent="TextAppearance.Material3.DisplayLarge"> <style name="TextAppearance.Auxio.DisplayLarge" parent="TextAppearance.Material3.DisplayLarge">
<item name="fontFamily">@font/inter_semibold</item> <item name="fontFamily">sans-serif-medium</item>
<item name="android:fontFamily">@font/inter_semibold</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.DisplayMedium" parent="TextAppearance.Material3.DisplayMedium"> <style name="TextAppearance.Auxio.DisplayMedium" parent="TextAppearance.Material3.DisplayMedium">
<item name="fontFamily">@font/inter</item> <item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">@font/inter</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.DisplaySmall" parent="TextAppearance.Material3.DisplaySmall"> <style name="TextAppearance.Auxio.DisplaySmall" parent="TextAppearance.Material3.DisplaySmall">
<item name="fontFamily">@font/inter</item> <item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">@font/inter</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.HeadlineLarge" parent="TextAppearance.Material3.HeadlineLarge"> <style name="TextAppearance.Auxio.HeadlineLarge" parent="TextAppearance.Material3.HeadlineLarge">
<item name="fontFamily">@font/inter_semibold</item> <item name="fontFamily">sans-serif-medium</item>
<item name="android:fontFamily">@font/inter_semibold</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.HeadlineMedium" parent="TextAppearance.Material3.HeadlineMedium"> <style name="TextAppearance.Auxio.HeadlineMedium" parent="TextAppearance.Material3.HeadlineMedium">
<item name="fontFamily">@font/inter</item> <item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">@font/inter</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.HeadlineSmall" parent="TextAppearance.Material3.HeadlineSmall"> <style name="TextAppearance.Auxio.HeadlineSmall" parent="TextAppearance.Material3.HeadlineSmall">
<item name="fontFamily">@font/inter</item> <item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">@font/inter</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.TitleLarge" parent="TextAppearance.Material3.TitleLarge"> <style name="TextAppearance.Auxio.TitleLarge" parent="TextAppearance.Material3.TitleLarge">
<item name="fontFamily">@font/inter_semibold</item> <item name="fontFamily">sans-serif-medium</item>
<item name="android:fontFamily">@font/inter_semibold</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.TitleMedium" parent="TextAppearance.Material3.TitleMedium"> <style name="TextAppearance.Auxio.TitleMedium" parent="TextAppearance.Material3.TitleMedium">
<item name="fontFamily">@font/inter</item> <item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">@font/inter</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.TitleSmall" parent="TextAppearance.Material3.TitleSmall"> <style name="TextAppearance.Auxio.TitleSmall" parent="TextAppearance.Material3.TitleSmall">
<item name="fontFamily">@font/inter</item> <item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">@font/inter</item> <item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item>
</style> </style>
<style name="TextAppearance.Auxio.LabelLarge" parent="TextAppearance.Material3.LabelLarge"> <style name="TextAppearance.Auxio.LabelLarge" parent="TextAppearance.Material3.LabelLarge" />
<item name="fontFamily">@font/inter_semibold</item> <style name="TextAppearance.Auxio.LabelMedium" parent="TextAppearance.Material3.LabelMedium" />
<item name="android:fontFamily">@font/inter_semibold</item> <style name="TextAppearance.Auxio.LabelSmall" parent="TextAppearance.Material3.LabelSmall" />
</style> <style name="TextAppearance.Auxio.BodyLarge" parent="TextAppearance.Material3.BodyLarge" />
<style name="TextAppearance.Auxio.BodyMedium" parent="TextAppearance.Material3.BodyMedium" />
<style name="TextAppearance.Auxio.LabelMedium" parent="TextAppearance.Material3.LabelMedium"> <style name="TextAppearance.Auxio.BodySmall" parent="TextAppearance.Material3.BodySmall" />
<item name="fontFamily">@font/inter_semibold</item>
<item name="android:fontFamily">@font/inter_semibold</item>
</style>
<style name="TextAppearance.Auxio.LabelSmall" parent="TextAppearance.Material3.LabelSmall">
<item name="fontFamily">@font/inter_semibold</item>
<item name="android:fontFamily">@font/inter_semibold</item>
</style>
<style name="TextAppearance.Auxio.BodyLarge" parent="TextAppearance.Material3.BodyLarge">
<item name="fontFamily">@font/inter</item>
<item name="android:fontFamily">@font/inter</item>
</style>
<style name="TextAppearance.Auxio.BodyMedium" parent="TextAppearance.Material3.BodyMedium">
<item name="fontFamily">@font/inter</item>
<item name="android:fontFamily">@font/inter</item>
</style>
<style name="TextAppearance.Auxio.BodySmall" parent="TextAppearance.Material3.BodySmall">
<item name="fontFamily">@font/inter</item>
<item name="android:fontFamily">@font/inter</item>
</style>
<!-- <!--
Text extensions Text extensions
Material3 TextAppearances are really inflexible, so these add some extra categories that Material3 TextAppearances are really inflexible, so these add some extra categories that
allow for better UX. allow for better UX.
--> -->
<style name="TextAppearance.Auxio.TitleMidLarge" parent="TextAppearance.Auxio.TitleMedium"> <style name="TextAppearance.Auxio.TitleMidLarge" parent="TextAppearance.Material3.TitleMedium">
<item name="android:textSize">20sp</item> <item name="android:textSize">20sp</item>
<item name="fontFamily">@font/inter_semibold</item>
<item name="android:fontFamily">@font/inter_semibold</item>
</style> </style>
<style name="TextAppearance.Auxio.TitleSmallish" parent="TextAppearance.Auxio.TitleSmall"> <style name="TextAppearance.Auxio.TitleSmallish" parent="TextAppearance.Material3.TitleSmall">
<item name="android:textSize">18sp</item> <item name="android:textSize">16sp</item>
<item name="fontFamily">@font/inter_semibold</item>
<item name="android:fontFamily">@font/inter_semibold</item>
</style> </style>
<style name="TextAppearance.Auxio.LabelLarger" parent="TextAppearance.Auxio.LabelLarge"> <style name="TextAppearance.Auxio.LabelLarger" parent="TextAppearance.Auxio.LabelLarge">
<item name="android:textSize">16sp</item> <item name="android:textSize">16sp</item>
<item name="android:letterSpacing">0.03125</item>
</style> </style>
</resources> </resources>