diff --git a/app/src/main/java/com/sadellie/unitto/UnittoApp.kt b/app/src/main/java/com/sadellie/unitto/UnittoApp.kt
index 48797e95..998d38a5 100644
--- a/app/src/main/java/com/sadellie/unitto/UnittoApp.kt
+++ b/app/src/main/java/com/sadellie/unitto/UnittoApp.kt
@@ -46,7 +46,8 @@ import com.sadellie.unitto.core.ui.common.isOpen
import com.sadellie.unitto.core.ui.common.open
import com.sadellie.unitto.core.ui.common.rememberUnittoDrawerState
import com.sadellie.unitto.core.ui.model.DrawerItems
-import com.sadellie.unitto.core.ui.theme.AppTypography
+import com.sadellie.unitto.core.ui.theme.AppTypographyUnitto
+import com.sadellie.unitto.core.ui.theme.AppTypographySystem
import com.sadellie.unitto.core.ui.theme.DarkThemeColors
import com.sadellie.unitto.core.ui.theme.LightThemeColors
import com.sadellie.unitto.data.userprefs.UIPreferences
@@ -105,7 +106,7 @@ internal fun UnittoApp(uiPrefs: UIPreferences) {
Themmo(
themmoController = themmoController,
- typography = AppTypography,
+ typography = if (uiPrefs.systemFont) AppTypographySystem else AppTypographyUnitto,
animationSpec = tween(250)
) {
val backgroundColor = MaterialTheme.colorScheme.background
diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml
index a71afada..3b948012 100644
--- a/core/base/src/main/res/values/strings.xml
+++ b/core/base/src/main/res/values/strings.xml
@@ -1391,4 +1391,6 @@ Used in this dialog window. Should be short -->
Русский
Language
Change the app language
+ System font
+ Use system font for texts in app
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt
index 9f81b829..1ad0935e 100644
--- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt
+++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/theme/Type.kt
@@ -56,7 +56,7 @@ val NumbersTextStyleDisplayMedium = TextStyle(
letterSpacing = (-0.25).sp,
)
-val AppTypography = Typography(
+val AppTypographyUnitto = Typography(
displayLarge = TextStyle(
fontFamily = Montserrat,
fontWeight = FontWeight.Normal,
@@ -163,3 +163,96 @@ val AppTypography = Typography(
letterSpacing = 0.sp,
),
)
+
+val AppTypographySystem = Typography(
+ displayLarge = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 57.sp,
+ lineHeight = 64.sp,
+ letterSpacing = (-0.25).sp,
+ ),
+ displayMedium = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 45.sp,
+ lineHeight = 52.sp,
+ letterSpacing = 0.sp,
+ ),
+ displaySmall = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 36.sp,
+ lineHeight = 44.sp,
+ letterSpacing = 0.sp,
+ ),
+ headlineLarge = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 32.sp,
+ lineHeight = 40.sp,
+ letterSpacing = 0.sp,
+ ),
+ headlineMedium = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 28.sp,
+ lineHeight = 36.sp,
+ letterSpacing = 0.sp,
+ ),
+ headlineSmall = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 24.sp,
+ lineHeight = 32.sp,
+ letterSpacing = 0.sp,
+ ),
+ titleLarge = TextStyle(
+ fontWeight = FontWeight.Medium,
+ fontSize = 22.sp,
+ lineHeight = 28.sp,
+ letterSpacing = 0.sp,
+ ),
+ titleMedium = TextStyle(
+ fontWeight = FontWeight.Bold,
+ fontSize = 18.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.1.sp,
+ ),
+ titleSmall = TextStyle(
+ fontWeight = FontWeight.Medium,
+ fontSize = 14.sp,
+ lineHeight = 20.sp,
+ letterSpacing = 0.1.sp,
+ ),
+ bodyLarge = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.5.sp,
+ ),
+ bodyMedium = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 14.sp,
+ lineHeight = 20.sp,
+ letterSpacing = 0.25.sp,
+ ),
+ bodySmall = TextStyle(
+ fontWeight = FontWeight.Normal,
+ fontSize = 12.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.4.sp,
+ ),
+ labelLarge = TextStyle(
+ fontWeight = FontWeight.Medium,
+ fontSize = 14.sp,
+ lineHeight = 20.sp,
+ letterSpacing = 0.1.sp,
+ ),
+ labelMedium = TextStyle(
+ fontWeight = FontWeight.Medium,
+ fontSize = 12.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp,
+ ),
+ labelSmall = TextStyle(
+ fontWeight = FontWeight.Medium,
+ fontSize = 10.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.sp,
+ ),
+)
diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt
index 81d3d1c3..47b0da01 100644
--- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt
+++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt
@@ -84,6 +84,7 @@ data class UserPreferences(
val unitConverterFormatTime: Boolean = false,
val unitConverterSorting: UnitsListSorting = UnitsListSorting.USAGE,
val middleZero: Boolean = false,
+ val systemFont: Boolean = false,
)
data class UIPreferences(
@@ -94,6 +95,7 @@ data class UIPreferences(
val monetMode: MonetMode = MonetMode.TONAL_SPOT,
val startingScreen: String = TopLevelDestinations.Calculator.graph,
val enableToolsExperiment: Boolean = false,
+ val systemFont: Boolean = false,
)
data class MainPreferences(
@@ -138,6 +140,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
val UNIT_CONVERTER_FORMAT_TIME = booleanPreferencesKey("UNIT_CONVERTER_FORMAT_TIME_PREF_KEY")
val UNIT_CONVERTER_SORTING = stringPreferencesKey("UNIT_CONVERTER_SORTING_PREF_KEY")
val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY")
+ val SYSTEM_FONT = booleanPreferencesKey("SYSTEM_FONT_PREF_KEY")
}
val uiPreferencesFlow: Flow = dataStore.data
@@ -158,6 +161,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
?: MonetMode.TONAL_SPOT
val startingScreen: String = preferences[PrefsKeys.STARTING_SCREEN] ?: TopLevelDestinations.Calculator.graph
val enableToolsExperiment: Boolean = preferences[PrefsKeys.ENABLE_TOOLS_EXPERIMENT] ?: false
+ val systemFont: Boolean = preferences[PrefsKeys.SYSTEM_FONT] ?: false
UIPreferences(
themingMode = themingMode,
@@ -166,7 +170,8 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
customColor = customColor,
monetMode = monetMode,
startingScreen = startingScreen,
- enableToolsExperiment = enableToolsExperiment
+ enableToolsExperiment = enableToolsExperiment,
+ systemFont = systemFont
)
}
@@ -243,6 +248,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
unitConverterFormatTime = main.unitConverterFormatTime,
unitConverterSorting = main.unitConverterSorting,
middleZero = main.middleZero,
+ systemFont = ui.systemFont,
)
}
@@ -441,4 +447,15 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
preferences[PrefsKeys.UNIT_CONVERTER_SORTING] = sorting.name
}
}
+
+ /**
+ * Update system font preference.
+ *
+ * @param enabled When true will use system font.
+ */
+ suspend fun updateSystemFont(enabled: Boolean) {
+ dataStore.edit { preferences ->
+ preferences[PrefsKeys.SYSTEM_FONT] = enabled
+ }
+ }
}
diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesScreen.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesScreen.kt
index 22cb2c82..50b6636e 100644
--- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesScreen.kt
+++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesScreen.kt
@@ -33,6 +33,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Colorize
import androidx.compose.material.icons.filled.DarkMode
+import androidx.compose.material.icons.filled.FontDownload
import androidx.compose.material.icons.filled.Palette
import androidx.compose.material.icons.outlined.DarkMode
import androidx.compose.material.icons.outlined.HdrAuto
@@ -48,6 +49,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.core.ui.common.Header
import com.sadellie.unitto.core.ui.common.NavigateUpButton
@@ -83,6 +85,8 @@ internal fun ThemesRoute(
themmoController: ThemmoController,
viewModel: ThemesViewModel = hiltViewModel()
) {
+ val systemFont = viewModel.systemFont.collectAsStateWithLifecycle()
+
ThemesScreen(
navigateUpAction = navigateUpAction,
currentThemingMode = themmoController.currentThemingMode,
@@ -114,7 +118,9 @@ internal fun ThemesRoute(
onMonetModeChange = {
themmoController.setMonetMode(it)
viewModel.updateMonetMode(it)
- }
+ },
+ systemFont = systemFont.value,
+ onSystemFontChange = viewModel::updateSystemFont
)
}
@@ -130,7 +136,9 @@ private fun ThemesScreen(
selectedColor: Color,
onColorChange: (Color) -> Unit,
monetMode: MonetMode,
- onMonetModeChange: (MonetMode) -> Unit
+ onMonetModeChange: (MonetMode) -> Unit,
+ systemFont: Boolean,
+ onSystemFontChange: (Boolean) -> Unit,
) {
UnittoScreenWithLargeTopBar(
title = stringResource(R.string.theme_setting),
@@ -201,7 +209,20 @@ private fun ThemesScreen(
}
}
- item { Header(stringResource(R.string.color_scheme)) }
+ item {
+ UnittoListItem(
+ leadingContent = {
+ Icon(
+ Icons.Default.FontDownload,
+ stringResource(R.string.system_font_setting),
+ )
+ },
+ label = stringResource(R.string.system_font_setting),
+ supportContent = stringResource(R.string.system_font_setting_support),
+ switchState = systemFont,
+ onSwitchChange = onSystemFontChange
+ )
+ }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
item {
@@ -283,7 +304,9 @@ private fun Preview() {
selectedColor = themmoController.currentCustomColor,
onColorChange = themmoController::setCustomColor,
monetMode = themmoController.currentMonetMode,
- onMonetModeChange = themmoController::setMonetMode
+ onMonetModeChange = themmoController::setMonetMode,
+ systemFont = false,
+ onSystemFontChange = {}
)
}
}
diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesViewModel.kt
index d28bb490..c6f80946 100644
--- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesViewModel.kt
+++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/themes/ThemesViewModel.kt
@@ -25,6 +25,9 @@ import com.sadellie.unitto.data.userprefs.UserPreferencesRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.sadellie.themmo.MonetMode
import io.github.sadellie.themmo.ThemingMode
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -33,6 +36,14 @@ class ThemesViewModel @Inject constructor(
private val userPrefsRepository: UserPreferencesRepository
) : ViewModel() {
+ val systemFont = userPrefsRepository.uiPreferencesFlow
+ .map { it.systemFont }
+ .stateIn(
+ viewModelScope,
+ SharingStarted.WhileSubscribed(5000L),
+ false
+ )
+
/**
* @see UserPreferencesRepository.updateThemingMode
*/
@@ -77,4 +88,13 @@ class ThemesViewModel @Inject constructor(
userPrefsRepository.updateMonetMode(monetMode)
}
}
+
+ /**
+ * @see UserPreferencesRepository.updateSystemFont
+ */
+ fun updateSystemFont(enabled: Boolean) {
+ viewModelScope.launch {
+ userPrefsRepository.updateSystemFont(enabled)
+ }
+ }
}
diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/timezone/TimeZoneScreen.kt b/feature/timezone/src/main/java/com/sadellie/unitto/timezone/TimeZoneScreen.kt
index d28a465b..628d0100 100644
--- a/feature/timezone/src/main/java/com/sadellie/unitto/timezone/TimeZoneScreen.kt
+++ b/feature/timezone/src/main/java/com/sadellie/unitto/timezone/TimeZoneScreen.kt
@@ -85,7 +85,7 @@ import com.sadellie.unitto.core.ui.common.UnittoScreenWithTopBar
import com.sadellie.unitto.core.ui.common.squashable
import com.sadellie.unitto.core.ui.datetime.UnittoDateTimeFormatter
import com.sadellie.unitto.core.ui.datetime.formatLocal
-import com.sadellie.unitto.core.ui.theme.AppTypography
+import com.sadellie.unitto.core.ui.theme.AppTypographyUnitto
import com.sadellie.unitto.core.ui.theme.DarkThemeColors
import com.sadellie.unitto.core.ui.theme.LightThemeColors
import com.sadellie.unitto.data.model.UnittoTimeZone
@@ -355,7 +355,7 @@ fun PreviewTimeZoneScreen() {
lightColorScheme = LightThemeColors,
darkColorScheme = DarkThemeColors,
),
- typography = AppTypography,
+ typography = AppTypographyUnitto,
) {
TimeZoneScreen(
uiState = TimeZoneUIState(