mirror of
https://github.com/Myzel394/NumberHub.git
synced 2025-06-19 00:35:26 +02:00
parent
6fef198541
commit
50f0ddbe91
@ -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.open
|
||||||
import com.sadellie.unitto.core.ui.common.rememberUnittoDrawerState
|
import com.sadellie.unitto.core.ui.common.rememberUnittoDrawerState
|
||||||
import com.sadellie.unitto.core.ui.model.DrawerItems
|
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.DarkThemeColors
|
||||||
import com.sadellie.unitto.core.ui.theme.LightThemeColors
|
import com.sadellie.unitto.core.ui.theme.LightThemeColors
|
||||||
import com.sadellie.unitto.data.userprefs.UIPreferences
|
import com.sadellie.unitto.data.userprefs.UIPreferences
|
||||||
@ -105,7 +106,7 @@ internal fun UnittoApp(uiPrefs: UIPreferences) {
|
|||||||
|
|
||||||
Themmo(
|
Themmo(
|
||||||
themmoController = themmoController,
|
themmoController = themmoController,
|
||||||
typography = AppTypography,
|
typography = if (uiPrefs.systemFont) AppTypographySystem else AppTypographyUnitto,
|
||||||
animationSpec = tween(250)
|
animationSpec = tween(250)
|
||||||
) {
|
) {
|
||||||
val backgroundColor = MaterialTheme.colorScheme.background
|
val backgroundColor = MaterialTheme.colorScheme.background
|
||||||
|
@ -1391,4 +1391,6 @@ Used in this dialog window. Should be short -->
|
|||||||
<string name="locale_ru" translatable="false">Русский</string>
|
<string name="locale_ru" translatable="false">Русский</string>
|
||||||
<string name="language_setting">Language</string>
|
<string name="language_setting">Language</string>
|
||||||
<string name="language_setting_support">Change the app language</string>
|
<string name="language_setting_support">Change the app language</string>
|
||||||
|
<string name="system_font_setting">System font</string>
|
||||||
|
<string name="system_font_setting_support">Use system font for texts in app</string>
|
||||||
</resources>
|
</resources>
|
@ -56,7 +56,7 @@ val NumbersTextStyleDisplayMedium = TextStyle(
|
|||||||
letterSpacing = (-0.25).sp,
|
letterSpacing = (-0.25).sp,
|
||||||
)
|
)
|
||||||
|
|
||||||
val AppTypography = Typography(
|
val AppTypographyUnitto = Typography(
|
||||||
displayLarge = TextStyle(
|
displayLarge = TextStyle(
|
||||||
fontFamily = Montserrat,
|
fontFamily = Montserrat,
|
||||||
fontWeight = FontWeight.Normal,
|
fontWeight = FontWeight.Normal,
|
||||||
@ -163,3 +163,96 @@ val AppTypography = Typography(
|
|||||||
letterSpacing = 0.sp,
|
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,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
@ -84,6 +84,7 @@ data class UserPreferences(
|
|||||||
val unitConverterFormatTime: Boolean = false,
|
val unitConverterFormatTime: Boolean = false,
|
||||||
val unitConverterSorting: UnitsListSorting = UnitsListSorting.USAGE,
|
val unitConverterSorting: UnitsListSorting = UnitsListSorting.USAGE,
|
||||||
val middleZero: Boolean = false,
|
val middleZero: Boolean = false,
|
||||||
|
val systemFont: Boolean = false,
|
||||||
)
|
)
|
||||||
|
|
||||||
data class UIPreferences(
|
data class UIPreferences(
|
||||||
@ -94,6 +95,7 @@ data class UIPreferences(
|
|||||||
val monetMode: MonetMode = MonetMode.TONAL_SPOT,
|
val monetMode: MonetMode = MonetMode.TONAL_SPOT,
|
||||||
val startingScreen: String = TopLevelDestinations.Calculator.graph,
|
val startingScreen: String = TopLevelDestinations.Calculator.graph,
|
||||||
val enableToolsExperiment: Boolean = false,
|
val enableToolsExperiment: Boolean = false,
|
||||||
|
val systemFont: Boolean = false,
|
||||||
)
|
)
|
||||||
|
|
||||||
data class MainPreferences(
|
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_FORMAT_TIME = booleanPreferencesKey("UNIT_CONVERTER_FORMAT_TIME_PREF_KEY")
|
||||||
val UNIT_CONVERTER_SORTING = stringPreferencesKey("UNIT_CONVERTER_SORTING_PREF_KEY")
|
val UNIT_CONVERTER_SORTING = stringPreferencesKey("UNIT_CONVERTER_SORTING_PREF_KEY")
|
||||||
val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY")
|
val MIDDLE_ZERO = booleanPreferencesKey("MIDDLE_ZERO_PREF_KEY")
|
||||||
|
val SYSTEM_FONT = booleanPreferencesKey("SYSTEM_FONT_PREF_KEY")
|
||||||
}
|
}
|
||||||
|
|
||||||
val uiPreferencesFlow: Flow<UIPreferences> = dataStore.data
|
val uiPreferencesFlow: Flow<UIPreferences> = dataStore.data
|
||||||
@ -158,6 +161,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
|
|||||||
?: MonetMode.TONAL_SPOT
|
?: MonetMode.TONAL_SPOT
|
||||||
val startingScreen: String = preferences[PrefsKeys.STARTING_SCREEN] ?: TopLevelDestinations.Calculator.graph
|
val startingScreen: String = preferences[PrefsKeys.STARTING_SCREEN] ?: TopLevelDestinations.Calculator.graph
|
||||||
val enableToolsExperiment: Boolean = preferences[PrefsKeys.ENABLE_TOOLS_EXPERIMENT] ?: false
|
val enableToolsExperiment: Boolean = preferences[PrefsKeys.ENABLE_TOOLS_EXPERIMENT] ?: false
|
||||||
|
val systemFont: Boolean = preferences[PrefsKeys.SYSTEM_FONT] ?: false
|
||||||
|
|
||||||
UIPreferences(
|
UIPreferences(
|
||||||
themingMode = themingMode,
|
themingMode = themingMode,
|
||||||
@ -166,7 +170,8 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
|
|||||||
customColor = customColor,
|
customColor = customColor,
|
||||||
monetMode = monetMode,
|
monetMode = monetMode,
|
||||||
startingScreen = startingScreen,
|
startingScreen = startingScreen,
|
||||||
enableToolsExperiment = enableToolsExperiment
|
enableToolsExperiment = enableToolsExperiment,
|
||||||
|
systemFont = systemFont
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,6 +248,7 @@ class UserPreferencesRepository @Inject constructor(private val dataStore: DataS
|
|||||||
unitConverterFormatTime = main.unitConverterFormatTime,
|
unitConverterFormatTime = main.unitConverterFormatTime,
|
||||||
unitConverterSorting = main.unitConverterSorting,
|
unitConverterSorting = main.unitConverterSorting,
|
||||||
middleZero = main.middleZero,
|
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
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ import androidx.compose.foundation.rememberScrollState
|
|||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Colorize
|
import androidx.compose.material.icons.filled.Colorize
|
||||||
import androidx.compose.material.icons.filled.DarkMode
|
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.filled.Palette
|
||||||
import androidx.compose.material.icons.outlined.DarkMode
|
import androidx.compose.material.icons.outlined.DarkMode
|
||||||
import androidx.compose.material.icons.outlined.HdrAuto
|
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.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.sadellie.unitto.core.base.R
|
import com.sadellie.unitto.core.base.R
|
||||||
import com.sadellie.unitto.core.ui.common.Header
|
import com.sadellie.unitto.core.ui.common.Header
|
||||||
import com.sadellie.unitto.core.ui.common.NavigateUpButton
|
import com.sadellie.unitto.core.ui.common.NavigateUpButton
|
||||||
@ -83,6 +85,8 @@ internal fun ThemesRoute(
|
|||||||
themmoController: ThemmoController,
|
themmoController: ThemmoController,
|
||||||
viewModel: ThemesViewModel = hiltViewModel()
|
viewModel: ThemesViewModel = hiltViewModel()
|
||||||
) {
|
) {
|
||||||
|
val systemFont = viewModel.systemFont.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
ThemesScreen(
|
ThemesScreen(
|
||||||
navigateUpAction = navigateUpAction,
|
navigateUpAction = navigateUpAction,
|
||||||
currentThemingMode = themmoController.currentThemingMode,
|
currentThemingMode = themmoController.currentThemingMode,
|
||||||
@ -114,7 +118,9 @@ internal fun ThemesRoute(
|
|||||||
onMonetModeChange = {
|
onMonetModeChange = {
|
||||||
themmoController.setMonetMode(it)
|
themmoController.setMonetMode(it)
|
||||||
viewModel.updateMonetMode(it)
|
viewModel.updateMonetMode(it)
|
||||||
}
|
},
|
||||||
|
systemFont = systemFont.value,
|
||||||
|
onSystemFontChange = viewModel::updateSystemFont
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +136,9 @@ private fun ThemesScreen(
|
|||||||
selectedColor: Color,
|
selectedColor: Color,
|
||||||
onColorChange: (Color) -> Unit,
|
onColorChange: (Color) -> Unit,
|
||||||
monetMode: MonetMode,
|
monetMode: MonetMode,
|
||||||
onMonetModeChange: (MonetMode) -> Unit
|
onMonetModeChange: (MonetMode) -> Unit,
|
||||||
|
systemFont: Boolean,
|
||||||
|
onSystemFontChange: (Boolean) -> Unit,
|
||||||
) {
|
) {
|
||||||
UnittoScreenWithLargeTopBar(
|
UnittoScreenWithLargeTopBar(
|
||||||
title = stringResource(R.string.theme_setting),
|
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) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
|
||||||
item {
|
item {
|
||||||
@ -283,7 +304,9 @@ private fun Preview() {
|
|||||||
selectedColor = themmoController.currentCustomColor,
|
selectedColor = themmoController.currentCustomColor,
|
||||||
onColorChange = themmoController::setCustomColor,
|
onColorChange = themmoController::setCustomColor,
|
||||||
monetMode = themmoController.currentMonetMode,
|
monetMode = themmoController.currentMonetMode,
|
||||||
onMonetModeChange = themmoController::setMonetMode
|
onMonetModeChange = themmoController::setMonetMode,
|
||||||
|
systemFont = false,
|
||||||
|
onSystemFontChange = {}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,9 @@ import com.sadellie.unitto.data.userprefs.UserPreferencesRepository
|
|||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import io.github.sadellie.themmo.MonetMode
|
import io.github.sadellie.themmo.MonetMode
|
||||||
import io.github.sadellie.themmo.ThemingMode
|
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 kotlinx.coroutines.launch
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -33,6 +36,14 @@ class ThemesViewModel @Inject constructor(
|
|||||||
private val userPrefsRepository: UserPreferencesRepository
|
private val userPrefsRepository: UserPreferencesRepository
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
|
val systemFont = userPrefsRepository.uiPreferencesFlow
|
||||||
|
.map { it.systemFont }
|
||||||
|
.stateIn(
|
||||||
|
viewModelScope,
|
||||||
|
SharingStarted.WhileSubscribed(5000L),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see UserPreferencesRepository.updateThemingMode
|
* @see UserPreferencesRepository.updateThemingMode
|
||||||
*/
|
*/
|
||||||
@ -77,4 +88,13 @@ class ThemesViewModel @Inject constructor(
|
|||||||
userPrefsRepository.updateMonetMode(monetMode)
|
userPrefsRepository.updateMonetMode(monetMode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see UserPreferencesRepository.updateSystemFont
|
||||||
|
*/
|
||||||
|
fun updateSystemFont(enabled: Boolean) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
userPrefsRepository.updateSystemFont(enabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.common.squashable
|
||||||
import com.sadellie.unitto.core.ui.datetime.UnittoDateTimeFormatter
|
import com.sadellie.unitto.core.ui.datetime.UnittoDateTimeFormatter
|
||||||
import com.sadellie.unitto.core.ui.datetime.formatLocal
|
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.DarkThemeColors
|
||||||
import com.sadellie.unitto.core.ui.theme.LightThemeColors
|
import com.sadellie.unitto.core.ui.theme.LightThemeColors
|
||||||
import com.sadellie.unitto.data.model.UnittoTimeZone
|
import com.sadellie.unitto.data.model.UnittoTimeZone
|
||||||
@ -355,7 +355,7 @@ fun PreviewTimeZoneScreen() {
|
|||||||
lightColorScheme = LightThemeColors,
|
lightColorScheme = LightThemeColors,
|
||||||
darkColorScheme = DarkThemeColors,
|
darkColorScheme = DarkThemeColors,
|
||||||
),
|
),
|
||||||
typography = AppTypography,
|
typography = AppTypographyUnitto,
|
||||||
) {
|
) {
|
||||||
TimeZoneScreen(
|
TimeZoneScreen(
|
||||||
uiState = TimeZoneUIState(
|
uiState = TimeZoneUIState(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user