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

View file

@ -18,7 +18,6 @@
package org.oxycblt.auxio.music
import android.content.Context
import android.view.View
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
@ -202,11 +201,10 @@ data class Genre(
/**
* A data object used solely for the "Header" UI element.
* @see HeaderString
*/
data class Header(
override val id: Long,
val string: HeaderString
@StringRes val string: Int
) : BaseModel()
/**
@ -215,7 +213,7 @@ data class Header(
*/
data class ActionHeader(
override val id: Long,
val string: HeaderString,
@StringRes val string: Int,
@DrawableRes val icon: Int,
@StringRes val desc: Int,
val onClick: (View) -> Unit,
@ -243,77 +241,3 @@ data class ActionHeader(
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) {
val adjusted = adapterIndex + (playbackManager.queue.size - mNextUp.value!!.size)
logD("$adjusted")
if (adjusted in playbackManager.queue.indices) {
apply()

View file

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

View file

@ -27,7 +27,6 @@ import kotlinx.coroutines.launch
import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.HeaderString
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.MusicStore
@ -85,28 +84,28 @@ class SearchViewModel : ViewModel() {
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_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))
}
}
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_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))
}
}
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_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))
}
}
if (mFilterMode == null || mFilterMode == DisplayMode.SHOW_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))
}
}

Binary file not shown.

View file

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

View file

@ -20,7 +20,7 @@
style="@style/Widget.Auxio.TextView.Header"
android:layout_width="match_parent"
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_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"

View file

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

View file

@ -20,7 +20,7 @@
style="@style/Widget.Auxio.TextView.Header"
android:layout_width="match_parent"
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_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"

View file

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

View file

@ -16,7 +16,7 @@
<!-- Custom dialog title theme -->
<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>
<!-- The style for the checked text view in the custom dialog -->
@ -39,7 +39,7 @@
<!-- Widget TextView that mimics the main Auxio Primary TextView -->
<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>
</style>

View file

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