Add option to use system font (#182)
This commit is contained in:
parent
fc569ea5f9
commit
d1f4aa4577
6 changed files with 136 additions and 58 deletions
|
@ -57,6 +57,10 @@ import androidx.media3.common.MediaItem
|
||||||
import androidx.media3.common.Player
|
import androidx.media3.common.Player
|
||||||
import com.valentinilk.shimmer.LocalShimmerTheme
|
import com.valentinilk.shimmer.LocalShimmerTheme
|
||||||
import com.valentinilk.shimmer.defaultShimmerTheme
|
import com.valentinilk.shimmer.defaultShimmerTheme
|
||||||
|
import it.vfsfitvnm.innertube.Innertube
|
||||||
|
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
|
||||||
|
import it.vfsfitvnm.innertube.requests.playlistPage
|
||||||
|
import it.vfsfitvnm.innertube.requests.song
|
||||||
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
|
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
|
||||||
import it.vfsfitvnm.vimusic.enums.ColorPaletteName
|
import it.vfsfitvnm.vimusic.enums.ColorPaletteName
|
||||||
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
|
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
|
||||||
|
@ -75,6 +79,7 @@ import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.colorPaletteOf
|
import it.vfsfitvnm.vimusic.ui.styling.colorPaletteOf
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.dynamicColorPaletteOf
|
import it.vfsfitvnm.vimusic.ui.styling.dynamicColorPaletteOf
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.typographyOf
|
import it.vfsfitvnm.vimusic.ui.styling.typographyOf
|
||||||
|
import it.vfsfitvnm.vimusic.utils.applyFontPaddingKey
|
||||||
import it.vfsfitvnm.vimusic.utils.asMediaItem
|
import it.vfsfitvnm.vimusic.utils.asMediaItem
|
||||||
import it.vfsfitvnm.vimusic.utils.colorPaletteModeKey
|
import it.vfsfitvnm.vimusic.utils.colorPaletteModeKey
|
||||||
import it.vfsfitvnm.vimusic.utils.colorPaletteNameKey
|
import it.vfsfitvnm.vimusic.utils.colorPaletteNameKey
|
||||||
|
@ -83,10 +88,7 @@ import it.vfsfitvnm.vimusic.utils.getEnum
|
||||||
import it.vfsfitvnm.vimusic.utils.intent
|
import it.vfsfitvnm.vimusic.utils.intent
|
||||||
import it.vfsfitvnm.vimusic.utils.preferences
|
import it.vfsfitvnm.vimusic.utils.preferences
|
||||||
import it.vfsfitvnm.vimusic.utils.thumbnailRoundnessKey
|
import it.vfsfitvnm.vimusic.utils.thumbnailRoundnessKey
|
||||||
import it.vfsfitvnm.innertube.Innertube
|
import it.vfsfitvnm.vimusic.utils.useSystemFontKey
|
||||||
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
|
|
||||||
import it.vfsfitvnm.innertube.requests.playlistPage
|
|
||||||
import it.vfsfitvnm.innertube.requests.song
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.flow.filterNotNull
|
import kotlinx.coroutines.flow.filterNotNull
|
||||||
|
@ -141,6 +143,9 @@ class MainActivity : ComponentActivity() {
|
||||||
val thumbnailRoundness =
|
val thumbnailRoundness =
|
||||||
getEnum(thumbnailRoundnessKey, ThumbnailRoundness.Light)
|
getEnum(thumbnailRoundnessKey, ThumbnailRoundness.Light)
|
||||||
|
|
||||||
|
val useSystemFont = getBoolean(useSystemFontKey, false)
|
||||||
|
val applyFontPadding = getBoolean(applyFontPaddingKey, false)
|
||||||
|
|
||||||
val colorPalette =
|
val colorPalette =
|
||||||
colorPaletteOf(colorPaletteName, colorPaletteMode, isSystemInDarkTheme)
|
colorPaletteOf(colorPaletteName, colorPaletteMode, isSystemInDarkTheme)
|
||||||
|
|
||||||
|
@ -149,7 +154,7 @@ class MainActivity : ComponentActivity() {
|
||||||
mutableStateOf(
|
mutableStateOf(
|
||||||
Appearance(
|
Appearance(
|
||||||
colorPalette = colorPalette,
|
colorPalette = colorPalette,
|
||||||
typography = typographyOf(colorPalette.text),
|
typography = typographyOf(colorPalette.text, useSystemFont, applyFontPadding),
|
||||||
thumbnailShape = thumbnailRoundness.shape()
|
thumbnailShape = thumbnailRoundness.shape()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -176,7 +181,7 @@ class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
appearance = appearance.copy(
|
appearance = appearance.copy(
|
||||||
colorPalette = colorPalette,
|
colorPalette = colorPalette,
|
||||||
typography = typographyOf(colorPalette.text)
|
typography = appearance.typography.copy(colorPalette.text)
|
||||||
)
|
)
|
||||||
|
|
||||||
return@setBitmapListener
|
return@setBitmapListener
|
||||||
|
@ -189,7 +194,7 @@ class MainActivity : ComponentActivity() {
|
||||||
}
|
}
|
||||||
appearance = appearance.copy(
|
appearance = appearance.copy(
|
||||||
colorPalette = it,
|
colorPalette = it,
|
||||||
typography = typographyOf(it.text)
|
typography = appearance.typography.copy(it.text)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,7 +233,7 @@ class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
appearance = appearance.copy(
|
appearance = appearance.copy(
|
||||||
colorPalette = colorPalette,
|
colorPalette = colorPalette,
|
||||||
typography = typographyOf(colorPalette.text),
|
typography = appearance.typography.copy(colorPalette.text),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,6 +246,15 @@ class MainActivity : ComponentActivity() {
|
||||||
thumbnailShape = thumbnailRoundness.shape()
|
thumbnailShape = thumbnailRoundness.shape()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useSystemFontKey, applyFontPaddingKey -> {
|
||||||
|
val useSystemFont = sharedPreferences.getBoolean(useSystemFontKey, false)
|
||||||
|
val applyFontPadding = sharedPreferences.getBoolean(applyFontPaddingKey, false)
|
||||||
|
|
||||||
|
appearance = appearance.copy(
|
||||||
|
typography = typographyOf(appearance.colorPalette.text, useSystemFont, applyFontPadding),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,11 +24,13 @@ import it.vfsfitvnm.vimusic.enums.ColorPaletteName
|
||||||
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
|
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.Header
|
import it.vfsfitvnm.vimusic.ui.components.themed.Header
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
|
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
|
||||||
|
import it.vfsfitvnm.vimusic.utils.applyFontPaddingKey
|
||||||
import it.vfsfitvnm.vimusic.utils.colorPaletteModeKey
|
import it.vfsfitvnm.vimusic.utils.colorPaletteModeKey
|
||||||
import it.vfsfitvnm.vimusic.utils.colorPaletteNameKey
|
import it.vfsfitvnm.vimusic.utils.colorPaletteNameKey
|
||||||
import it.vfsfitvnm.vimusic.utils.isShowingThumbnailInLockscreenKey
|
import it.vfsfitvnm.vimusic.utils.isShowingThumbnailInLockscreenKey
|
||||||
import it.vfsfitvnm.vimusic.utils.rememberPreference
|
import it.vfsfitvnm.vimusic.utils.rememberPreference
|
||||||
import it.vfsfitvnm.vimusic.utils.thumbnailRoundnessKey
|
import it.vfsfitvnm.vimusic.utils.thumbnailRoundnessKey
|
||||||
|
import it.vfsfitvnm.vimusic.utils.useSystemFontKey
|
||||||
|
|
||||||
@ExperimentalAnimationApi
|
@ExperimentalAnimationApi
|
||||||
@Composable
|
@Composable
|
||||||
|
@ -41,6 +43,8 @@ fun AppearanceSettings() {
|
||||||
thumbnailRoundnessKey,
|
thumbnailRoundnessKey,
|
||||||
ThumbnailRoundness.Light
|
ThumbnailRoundness.Light
|
||||||
)
|
)
|
||||||
|
var useSystemFont by rememberPreference(useSystemFontKey, false)
|
||||||
|
var applyFontPadding by rememberPreference(applyFontPaddingKey, false)
|
||||||
var isShowingThumbnailInLockscreen by rememberPreference(
|
var isShowingThumbnailInLockscreen by rememberPreference(
|
||||||
isShowingThumbnailInLockscreenKey,
|
isShowingThumbnailInLockscreenKey,
|
||||||
false
|
false
|
||||||
|
@ -94,6 +98,24 @@ fun AppearanceSettings() {
|
||||||
|
|
||||||
SettingsGroupSpacer()
|
SettingsGroupSpacer()
|
||||||
|
|
||||||
|
SettingsEntryGroupText(title = "TEXT")
|
||||||
|
|
||||||
|
SwitchSettingEntry(
|
||||||
|
title = "Use system font",
|
||||||
|
text = "Use the font applied by the system",
|
||||||
|
isChecked = useSystemFont,
|
||||||
|
onCheckedChange = { useSystemFont = it }
|
||||||
|
)
|
||||||
|
|
||||||
|
SwitchSettingEntry(
|
||||||
|
title = "Apply font padding",
|
||||||
|
text = "Add spacing around texts",
|
||||||
|
isChecked = applyFontPadding,
|
||||||
|
onCheckedChange = { applyFontPadding = it }
|
||||||
|
)
|
||||||
|
|
||||||
|
SettingsGroupSpacer()
|
||||||
|
|
||||||
SettingsEntryGroupText(title = "LOCKSCREEN")
|
SettingsEntryGroupText(title = "LOCKSCREEN")
|
||||||
|
|
||||||
SwitchSettingEntry(
|
SwitchSettingEntry(
|
||||||
|
|
|
@ -5,43 +5,27 @@ import androidx.compose.runtime.saveable.Saver
|
||||||
import androidx.compose.runtime.saveable.SaverScope
|
import androidx.compose.runtime.saveable.SaverScope
|
||||||
import androidx.compose.runtime.staticCompositionLocalOf
|
import androidx.compose.runtime.staticCompositionLocalOf
|
||||||
import androidx.compose.ui.graphics.Shape
|
import androidx.compose.ui.graphics.Shape
|
||||||
import androidx.compose.ui.graphics.toArgb
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.core.graphics.ColorUtils
|
|
||||||
|
|
||||||
data class Appearance(
|
data class Appearance(
|
||||||
val colorPalette: ColorPalette,
|
val colorPalette: ColorPalette,
|
||||||
val typography: Typography,
|
val typography: Typography,
|
||||||
val thumbnailShape: Shape
|
val thumbnailShape: Shape,
|
||||||
) {
|
) {
|
||||||
companion object : Saver<Appearance, List<Any>> {
|
companion object : Saver<Appearance, List<Any>> {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun restore(value: List<Any>): Appearance {
|
override fun restore(value: List<Any>): Appearance {
|
||||||
val colorPalette = when (val accent = value[0] as Int) {
|
|
||||||
0 -> DefaultDarkColorPalette
|
|
||||||
1 -> DefaultLightColorPalette
|
|
||||||
2 -> PureBlackColorPalette
|
|
||||||
else -> dynamicColorPaletteOf(
|
|
||||||
FloatArray(3).apply { ColorUtils.colorToHSL(accent, this) },
|
|
||||||
value[1] as Boolean
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return Appearance(
|
return Appearance(
|
||||||
colorPalette = colorPalette,
|
colorPalette = ColorPalette.restore(value[0] as List<Any>),
|
||||||
typography = typographyOf(colorPalette.text),
|
typography = Typography.restore(value[1] as List<Any>),
|
||||||
thumbnailShape = RoundedCornerShape((value[2] as Int).dp)
|
thumbnailShape = RoundedCornerShape((value[2] as Int).dp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun SaverScope.save(value: Appearance) =
|
override fun SaverScope.save(value: Appearance) =
|
||||||
listOf(
|
listOf(
|
||||||
when {
|
with (ColorPalette.Companion) { save(value.colorPalette) },
|
||||||
value.colorPalette === DefaultDarkColorPalette -> 0
|
with (Typography.Companion) { save(value.typography) },
|
||||||
value.colorPalette === DefaultLightColorPalette -> 1
|
|
||||||
value.colorPalette === PureBlackColorPalette -> 2
|
|
||||||
else -> value.colorPalette.accent.toArgb()
|
|
||||||
},
|
|
||||||
value.colorPalette.isDark,
|
|
||||||
when (value.thumbnailShape) {
|
when (value.thumbnailShape) {
|
||||||
RoundedCornerShape(2.dp) -> 2
|
RoundedCornerShape(2.dp) -> 2
|
||||||
RoundedCornerShape(4.dp) -> 4
|
RoundedCornerShape(4.dp) -> 4
|
||||||
|
|
|
@ -2,7 +2,11 @@ package it.vfsfitvnm.vimusic.ui.styling
|
||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
|
import androidx.compose.runtime.saveable.Saver
|
||||||
|
import androidx.compose.runtime.saveable.SaverScope
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.graphics.toArgb
|
||||||
|
import androidx.core.graphics.ColorUtils
|
||||||
import androidx.palette.graphics.Palette
|
import androidx.palette.graphics.Palette
|
||||||
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
|
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
|
||||||
import it.vfsfitvnm.vimusic.enums.ColorPaletteName
|
import it.vfsfitvnm.vimusic.enums.ColorPaletteName
|
||||||
|
@ -20,7 +24,30 @@ data class ColorPalette(
|
||||||
val textSecondary: Color,
|
val textSecondary: Color,
|
||||||
val textDisabled: Color,
|
val textDisabled: Color,
|
||||||
val isDark: Boolean
|
val isDark: Boolean
|
||||||
)
|
) {
|
||||||
|
companion object : Saver<ColorPalette, List<Any>> {
|
||||||
|
override fun restore(value: List<Any>) = when (val accent = value[0] as Int) {
|
||||||
|
0 -> DefaultDarkColorPalette
|
||||||
|
1 -> DefaultLightColorPalette
|
||||||
|
2 -> PureBlackColorPalette
|
||||||
|
else -> dynamicColorPaletteOf(
|
||||||
|
FloatArray(3).apply { ColorUtils.colorToHSL(accent, this) },
|
||||||
|
value[1] as Boolean
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun SaverScope.save(value: ColorPalette) =
|
||||||
|
listOf(
|
||||||
|
when {
|
||||||
|
value === DefaultDarkColorPalette -> 0
|
||||||
|
value === DefaultLightColorPalette -> 1
|
||||||
|
value === PureBlackColorPalette -> 2
|
||||||
|
else -> value.accent.toArgb()
|
||||||
|
},
|
||||||
|
value.isDark
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val DefaultDarkColorPalette = ColorPalette(
|
val DefaultDarkColorPalette = ColorPalette(
|
||||||
background0 = Color(0xff16171d),
|
background0 = Color(0xff16171d),
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package it.vfsfitvnm.vimusic.ui.styling
|
package it.vfsfitvnm.vimusic.ui.styling
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
|
import androidx.compose.runtime.saveable.Saver
|
||||||
|
import androidx.compose.runtime.saveable.SaverScope
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.text.PlatformTextStyle
|
import androidx.compose.ui.text.PlatformTextStyle
|
||||||
import androidx.compose.ui.text.TextStyle
|
import androidx.compose.ui.text.TextStyle
|
||||||
|
@ -18,11 +20,38 @@ data class Typography(
|
||||||
val m: TextStyle,
|
val m: TextStyle,
|
||||||
val l: TextStyle,
|
val l: TextStyle,
|
||||||
val xxl: TextStyle,
|
val xxl: TextStyle,
|
||||||
)
|
) {
|
||||||
|
fun copy(color: Color) = Typography(
|
||||||
|
xxs = xxs.copy(color = color),
|
||||||
|
xs = xs.copy(color = color),
|
||||||
|
s = s.copy(color = color),
|
||||||
|
m = m.copy(color = color),
|
||||||
|
l = l.copy(color = color),
|
||||||
|
xxl = xxl.copy(color = color)
|
||||||
|
)
|
||||||
|
|
||||||
fun typographyOf(color: Color): Typography {
|
companion object : Saver<Typography, List<Any>> {
|
||||||
|
override fun restore(value: List<Any>) = typographyOf(
|
||||||
|
Color((value[0] as Long).toULong()),
|
||||||
|
value[1] as Boolean,
|
||||||
|
value[2] as Boolean
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun SaverScope.save(value: Typography) =
|
||||||
|
listOf(
|
||||||
|
value.xxs.color.value.toLong(),
|
||||||
|
value.xxs.fontFamily == FontFamily.Default,
|
||||||
|
value.xxs.platformStyle?.paragraphStyle?.includeFontPadding ?: false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun typographyOf(color: Color, useSystemFont: Boolean, applyFontPadding: Boolean): Typography {
|
||||||
val textStyle = TextStyle(
|
val textStyle = TextStyle(
|
||||||
fontFamily = FontFamily(
|
fontFamily = if (useSystemFont) {
|
||||||
|
FontFamily.Default
|
||||||
|
} else {
|
||||||
|
FontFamily(
|
||||||
Font(
|
Font(
|
||||||
resId = R.font.poppins_w300,
|
resId = R.font.poppins_w300,
|
||||||
weight = FontWeight.Light
|
weight = FontWeight.Light
|
||||||
|
@ -43,10 +72,11 @@ fun typographyOf(color: Color): Typography {
|
||||||
resId = R.font.poppins_w700,
|
resId = R.font.poppins_w700,
|
||||||
weight = FontWeight.Bold
|
weight = FontWeight.Bold
|
||||||
),
|
),
|
||||||
),
|
)
|
||||||
|
},
|
||||||
fontWeight = FontWeight.Normal,
|
fontWeight = FontWeight.Normal,
|
||||||
color = color,
|
color = color,
|
||||||
platformStyle = @Suppress("DEPRECATION") (PlatformTextStyle(includeFontPadding = false))
|
platformStyle = @Suppress("DEPRECATION") (PlatformTextStyle(includeFontPadding = applyFontPadding))
|
||||||
)
|
)
|
||||||
|
|
||||||
return Typography(
|
return Typography(
|
||||||
|
@ -55,6 +85,6 @@ fun typographyOf(color: Color): Typography {
|
||||||
s = textStyle.copy(fontSize = 16.sp),
|
s = textStyle.copy(fontSize = 16.sp),
|
||||||
m = textStyle.copy(fontSize = 18.sp),
|
m = textStyle.copy(fontSize = 18.sp),
|
||||||
l = textStyle.copy(fontSize = 20.sp),
|
l = textStyle.copy(fontSize = 20.sp),
|
||||||
xxl = textStyle.copy(fontSize = 32.sp),
|
xxl = textStyle.copy(fontSize = 32.sp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,8 @@ const val thumbnailRoundnessKey = "thumbnailRoundness"
|
||||||
const val coilDiskCacheMaxSizeKey = "coilDiskCacheMaxSize"
|
const val coilDiskCacheMaxSizeKey = "coilDiskCacheMaxSize"
|
||||||
const val exoPlayerDiskCacheMaxSizeKey = "exoPlayerDiskCacheMaxSize"
|
const val exoPlayerDiskCacheMaxSizeKey = "exoPlayerDiskCacheMaxSize"
|
||||||
const val isInvincibilityEnabledKey = "isInvincibilityEnabled"
|
const val isInvincibilityEnabledKey = "isInvincibilityEnabled"
|
||||||
const val isFirstLaunchKey = "isFirstLaunch"
|
const val useSystemFontKey = "useSystemFont"
|
||||||
|
const val applyFontPaddingKey = "applyFontPadding"
|
||||||
const val songSortOrderKey = "songSortOrder"
|
const val songSortOrderKey = "songSortOrder"
|
||||||
const val songSortByKey = "songSortBy"
|
const val songSortByKey = "songSortBy"
|
||||||
const val playlistSortOrderKey = "playlistSortOrder"
|
const val playlistSortOrderKey = "playlistSortOrder"
|
||||||
|
|
Loading…
Reference in a new issue