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:
parent
eadf4cc86d
commit
50170f202e
14 changed files with 54 additions and 154 deletions
|
|
@ -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 ->
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
Binary file not shown.
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
Loading…
Reference in a new issue