diff --git a/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt b/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt index e3161d7b..3d39404d 100644 --- a/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt +++ b/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt @@ -69,7 +69,10 @@ class MainActivity : AppCompatActivity() { val systemBarStyle = when (currentNightMode) { Configuration.UI_MODE_NIGHT_NO -> SystemBarStyle.light( Color.Transparent.toArgb(), - Color.Transparent.toArgb() + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) + 0 +// MaterialTheme.colorScheme.background.toArgb() + else Color.Transparent.toArgb() ) Configuration.UI_MODE_NIGHT_YES -> SystemBarStyle.dark(Color.Transparent.toArgb()) @@ -197,6 +200,7 @@ class MainActivity : AppCompatActivity() { val amoledDark by userSettings.enableAmoledDark.collectAsStateWithLifecycle() val enableBlur by userSettings.useBlur.collectAsStateWithLifecycle() val enableMultiline by userSettings.enableMultiline.collectAsStateWithLifecycle() + val useSystemFont by userSettings.useSystemFont.collectAsStateWithLifecycle() val setDarkMode = isNeedToEnableDarkMode(darkMode = darkMode) @@ -206,7 +210,8 @@ class MainActivity : AppCompatActivity() { amoledDark, enableBlur, enableMultiline, - setDarkMode + setDarkMode, + useSystemFont ) { mutableStateOf( ThemeConfig( @@ -215,7 +220,8 @@ class MainActivity : AppCompatActivity() { selectedColorScheme = 0, amoledDark = amoledDark, enableBlur = enableBlur, - enableMultiline = enableMultiline + enableMultiline = enableMultiline, + useSystemFont = useSystemFont ) ) } @@ -229,6 +235,7 @@ class MainActivity : AppCompatActivity() { useDynamicColors = themeConfig.dynamicColors, selectedColorScheme = themeConfig.selectedColorScheme, useAmoledBackground = themeConfig.amoledDark, + useSystemFont = themeConfig.useSystemFont ) { RootScreen(viewModel = viewModel) } diff --git a/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/AppSettings.kt b/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/AppSettings.kt index e74d501f..e1f1f649 100644 --- a/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/AppSettings.kt +++ b/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/AppSettings.kt @@ -191,7 +191,7 @@ object AppSettings { var enableHaptic: Boolean get() = get( SettingsKeys.KEY_DEBUG_ENABLE_HAPTIC, - true + SettingsKeys.DEFAULT_DEBUG_ENABLE_HAPTIC ) set(value) = put(SettingsKeys.KEY_DEBUG_ENABLE_HAPTIC, value) @@ -202,6 +202,13 @@ object AppSettings { ).let(LogLevel::parse) set(level) = put(SettingsKeys.KEY_DEBUG_NETWORK_LOG_LEVEL, level.value) + var useSystemFont: Boolean + get() = get( + SettingsKeys.KEY_DEBUG_USE_SYSTEM_FONT, + SettingsKeys.DEFAULT_DEBUG_USE_SYSTEM_FONT + ) + set(value) = put(SettingsKeys.KEY_DEBUG_USE_SYSTEM_FONT, value) + var showDebugCategory: Boolean get() = get( SettingsKeys.KEY_SHOW_DEBUG_CATEGORY, diff --git a/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/SettingsKeys.kt b/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/SettingsKeys.kt index ac05441b..5681017b 100644 --- a/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/SettingsKeys.kt +++ b/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/SettingsKeys.kt @@ -46,8 +46,11 @@ object SettingsKeys { const val KEY_DEBUG_HIDE_DEBUG_LIST = "debug_hide_debug_list" const val KEY_ENABLE_ANIMATIONS_IN_MESSAGES = "debug_enable_animations_in_messages" const val KEY_DEBUG_ENABLE_HAPTIC = "debug_enable_haptic" + const val DEFAULT_DEBUG_ENABLE_HAPTIC = true const val KEY_DEBUG_NETWORK_LOG_LEVEL = "debug_network_log_level" const val DEFAULT_NETWORK_LOG_LEVEL = 0 + const val KEY_DEBUG_USE_SYSTEM_FONT = "debug_use_system_font" + const val DEFAULT_DEBUG_USE_SYSTEM_FONT = false const val KEY_SHOW_DEBUG_CATEGORY = "show_debug_category" diff --git a/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/UserSettings.kt b/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/UserSettings.kt index c103201b..22e57a24 100644 --- a/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/UserSettings.kt +++ b/core/datastore/src/main/kotlin/dev/meloda/fast/datastore/UserSettings.kt @@ -24,6 +24,7 @@ interface UserSettings { val useBlur: StateFlow val showEmojiButton: StateFlow val showTimeInActionMessages: StateFlow + val useSystemFont: StateFlow val showDebugCategory: StateFlow fun onUseContactNamesChanged(use: Boolean) @@ -44,6 +45,7 @@ interface UserSettings { fun onUseBlurChanged(use: Boolean) fun onShowEmojiButtonChanged(show: Boolean) fun onShowTimeInActionMessagesChanged(show: Boolean) + fun onUseSystemFontChanged(use: Boolean) fun onShowDebugCategoryChanged(show: Boolean) } @@ -68,6 +70,7 @@ class UserSettingsImpl : UserSettings { override val showEmojiButton = MutableStateFlow(AppSettings.Debug.showEmojiButton) override val showTimeInActionMessages = MutableStateFlow(AppSettings.Debug.showTimeInActionMessages) + override val useSystemFont = MutableStateFlow(AppSettings.Debug.useSystemFont) override val showDebugCategory = MutableStateFlow(AppSettings.Debug.showDebugCategory) override fun onUseContactNamesChanged(use: Boolean) { @@ -126,6 +129,10 @@ class UserSettingsImpl : UserSettings { showTimeInActionMessages.value = show } + override fun onUseSystemFontChanged(use: Boolean) { + useSystemFont.value = use + } + override fun onShowDebugCategoryChanged(show: Boolean) { showDebugCategory.value = show } diff --git a/core/ui/src/main/kotlin/dev/meloda/fast/ui/model/ThemeConfig.kt b/core/ui/src/main/kotlin/dev/meloda/fast/ui/model/ThemeConfig.kt index 3eb7b337..387e4087 100644 --- a/core/ui/src/main/kotlin/dev/meloda/fast/ui/model/ThemeConfig.kt +++ b/core/ui/src/main/kotlin/dev/meloda/fast/ui/model/ThemeConfig.kt @@ -6,5 +6,6 @@ data class ThemeConfig( val selectedColorScheme: Int, val amoledDark: Boolean, val enableBlur: Boolean, - val enableMultiline: Boolean + val enableMultiline: Boolean, + val useSystemFont: Boolean ) diff --git a/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt b/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt index 35982632..c7874466 100644 --- a/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt +++ b/core/ui/src/main/kotlin/dev/meloda/fast/ui/theme/AppTheme.kt @@ -112,7 +112,8 @@ val LocalThemeConfig = compositionLocalOf { selectedColorScheme = 0, amoledDark = false, enableBlur = false, - enableMultiline = false + enableMultiline = false, + useSystemFont = false ) } @@ -137,6 +138,7 @@ fun AppTheme( useDarkTheme: Boolean = false, useDynamicColors: Boolean = false, useAmoledBackground: Boolean = false, + useSystemFont: Boolean = false, selectedColorScheme: Int = 0, content: @Composable () -> Unit ) { @@ -165,17 +167,21 @@ fun AppTheme( } } - val typography = MaterialTheme.typography.copy( - displayLarge = MaterialTheme.typography.displayLarge.copy(fontFamily = googleSansFonts), - displayMedium = MaterialTheme.typography.displayMedium.copy(fontFamily = googleSansFonts), - displaySmall = MaterialTheme.typography.displaySmall.copy(fontFamily = googleSansFonts), - headlineLarge = MaterialTheme.typography.headlineLarge.copy(fontFamily = googleSansFonts), - headlineMedium = MaterialTheme.typography.headlineMedium.copy(fontFamily = googleSansFonts), - headlineSmall = MaterialTheme.typography.headlineSmall.copy(fontFamily = googleSansFonts), - bodyLarge = MaterialTheme.typography.bodyLarge.copy(fontFamily = robotoFonts), - bodyMedium = MaterialTheme.typography.bodyMedium.copy(fontFamily = robotoFonts), - bodySmall = MaterialTheme.typography.bodySmall.copy(fontFamily = robotoFonts) - ) + val typography = if (useSystemFont) { + MaterialTheme.typography + } else { + MaterialTheme.typography.copy( + displayLarge = MaterialTheme.typography.displayLarge.copy(fontFamily = googleSansFonts), + displayMedium = MaterialTheme.typography.displayMedium.copy(fontFamily = googleSansFonts), + displaySmall = MaterialTheme.typography.displaySmall.copy(fontFamily = googleSansFonts), + headlineLarge = MaterialTheme.typography.headlineLarge.copy(fontFamily = googleSansFonts), + headlineMedium = MaterialTheme.typography.headlineMedium.copy(fontFamily = googleSansFonts), + headlineSmall = MaterialTheme.typography.headlineSmall.copy(fontFamily = googleSansFonts), + bodyLarge = MaterialTheme.typography.bodyLarge.copy(fontFamily = robotoFonts), + bodyMedium = MaterialTheme.typography.bodyMedium.copy(fontFamily = robotoFonts), + bodySmall = MaterialTheme.typography.bodySmall.copy(fontFamily = robotoFonts), + ) + } val view = LocalView.current if (!view.isInEditMode) { diff --git a/core/ui/src/main/res/drawable/ic_round_push_pin_24.xml b/core/ui/src/main/res/drawable/ic_round_push_pin_24.xml index da0a81d6..0f69fced 100644 --- a/core/ui/src/main/res/drawable/ic_round_push_pin_24.xml +++ b/core/ui/src/main/res/drawable/ic_round_push_pin_24.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/presentation/ChatMaterialsScreen.kt b/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/presentation/ChatMaterialsScreen.kt index c04c3674..916655a9 100644 --- a/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/presentation/ChatMaterialsScreen.kt +++ b/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/presentation/ChatMaterialsScreen.kt @@ -311,10 +311,7 @@ fun ChatMaterialsScreen( modifier = Modifier .then( if (currentTheme.enableBlur) { - Modifier.haze( - state = hazeState, - style = hazeStyle - ) + Modifier.haze(state = hazeState) } else { Modifier } @@ -349,10 +346,7 @@ fun ChatMaterialsScreen( modifier = Modifier .then( if (currentTheme.enableBlur) { - Modifier.haze( - state = hazeState, - style = hazeStyle - ) + Modifier.haze(state = hazeState) } else { Modifier } diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationItem.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationItem.kt index 53b5c32f..4f3b430e 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationItem.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationItem.kt @@ -5,7 +5,6 @@ import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable @@ -39,7 +38,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalContext @@ -130,24 +128,25 @@ fun ConversationItem( .clip(CircleShape) .background(MaterialTheme.colorScheme.primary) ) { - Image( + Icon( modifier = Modifier .align(Alignment.Center) .size(32.dp), painter = painterResource(id = UiR.drawable.ic_round_bookmark_border_24), - contentDescription = "Favorites icon" + contentDescription = "Favorites icon", + tint = Color.White ) } } else { val avatarImage = conversation.avatar?.getImage() if (avatarImage is Painter) { - Image( + Icon( modifier = Modifier .fillMaxSize() .clip(CircleShape), painter = avatarImage, contentDescription = "Avatar", - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onBackground) + tint = MaterialTheme.colorScheme.onBackground ) } else { AsyncImage( @@ -173,12 +172,13 @@ fun ConversationItem( .defaultMinSize(minWidth = 20.dp, minHeight = 20.dp) .background(MaterialTheme.colorScheme.outline) ) { - Image( + Icon( modifier = Modifier .height(14.dp) .align(Alignment.Center), painter = painterResource(id = UiR.drawable.ic_round_push_pin_24), - contentDescription = "Pin icon" + contentDescription = "Pin icon", + tint = Color.White ) } } @@ -228,12 +228,13 @@ fun ConversationItem( .matchParentSize() .background(BirthdayColor) ) { - Image( + Icon( modifier = Modifier .align(Alignment.Center) .size(10.dp), painter = painterResource(id = UiR.drawable.round_cake_24), - contentDescription = "Birthday icon" + contentDescription = "Birthday icon", + tint = Color.White ) } } @@ -270,11 +271,11 @@ fun ConversationItem( conversation.attachmentImage?.getResourcePainter()?.let { painter -> Column { Spacer(modifier = Modifier.height(4.dp)) - Image( + Icon( modifier = Modifier.size(14.dp), painter = painter, contentDescription = "attachment image", - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onPrimaryContainer) + tint = MaterialTheme.colorScheme.onPrimaryContainer ) } diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt index 337cefce..1854f3e6 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsScreen.kt @@ -366,10 +366,7 @@ fun ConversationsScreen( state = listState, maxLines = maxLines, modifier = if (currentTheme.enableBlur) { - Modifier.haze( - state = hazeState, - style = HazeMaterials.thick() - ) + Modifier.haze(state = hazeState) } else { Modifier }.fillMaxSize(), diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt index b710b426..86f3b055 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt @@ -304,10 +304,7 @@ fun FriendsScreen( FriendsList( modifier = if (currentTheme.enableBlur) { - Modifier.haze( - state = hazeState, - style = HazeMaterials.thick() - ) + Modifier.haze(state = hazeState) } else { Modifier }.fillMaxSize(), diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/presentation/MessagesList.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/presentation/MessagesList.kt index d7f7c2d0..e2dd3426 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/presentation/MessagesList.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/presentation/MessagesList.kt @@ -17,15 +17,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import dev.chrisbanes.haze.HazeState +import dev.chrisbanes.haze.haze import dev.meloda.fast.messageshistory.model.UiItem import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.util.ImmutableList -import dev.chrisbanes.haze.HazeState -import dev.chrisbanes.haze.haze -import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi -import dev.chrisbanes.haze.materials.HazeMaterials -@OptIn(ExperimentalHazeMaterialsApi::class) @Composable fun MessagesList( modifier: Modifier = Modifier, @@ -45,10 +42,7 @@ fun MessagesList( .fillMaxWidth() .then( if (currentTheme.enableBlur) { - Modifier.haze( - state = hazeState, - style = HazeMaterials.regular() - ) + Modifier.haze(state = hazeState) } else Modifier ), state = listState, diff --git a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt index 6ef57d9e..b2f6fcde 100644 --- a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt @@ -238,6 +238,11 @@ class SettingsViewModelImpl( userSettings.onShowTimeInActionMessagesChanged(show) } + SettingsKeys.KEY_DEBUG_USE_SYSTEM_FONT -> { + val use = newValue as? Boolean ?: SettingsKeys.DEFAULT_DEBUG_USE_SYSTEM_FONT + userSettings.onUseSystemFontChanged(use) + } + SettingsKeys.KEY_SHOW_DEBUG_CATEGORY -> { val show = newValue as? Boolean ?: false userSettings.onShowDebugCategoryChanged(show) @@ -409,7 +414,7 @@ class SettingsViewModelImpl( ) val debugEnableHaptic = SettingsItem.Switch( key = SettingsKeys.KEY_DEBUG_ENABLE_HAPTIC, - defaultValue = true, + defaultValue = SettingsKeys.DEFAULT_DEBUG_ENABLE_HAPTIC, title = UiText.Simple("Enable haptic") ) @@ -435,6 +440,12 @@ class SettingsViewModelImpl( } } + val debugUseSystemFont = SettingsItem.Switch( + key = SettingsKeys.KEY_DEBUG_USE_SYSTEM_FONT, + defaultValue = SettingsKeys.DEFAULT_DEBUG_USE_SYSTEM_FONT, + title = UiText.Simple("Use system font") + ) + val debugHideDebugList = SettingsItem.TitleText( key = SettingsKeys.KEY_DEBUG_HIDE_DEBUG_LIST, title = UiText.Simple("Hide debug list") @@ -475,7 +486,8 @@ class SettingsViewModelImpl( debugShowEmojiButton, debugShowTimeInActionMessages, debugEnableHaptic, - debugNetworkLogLevel + debugNetworkLogLevel, + debugUseSystemFont ).forEach(debugList::add) debugList += debugHideDebugList diff --git a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt index cc6c17d3..0b039042 100644 --- a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt +++ b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt @@ -161,10 +161,7 @@ fun SettingsScreen( modifier = Modifier .then( if (themeConfig.enableBlur) { - Modifier.haze( - state = hazeState, - style = HazeMaterials.thick() - ) + Modifier.haze(state = hazeState) } else Modifier ) .fillMaxWidth() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc9476ac..416374c4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -minSdk = "24" +minSdk = "23" targetSdk = "35" compileSdk = "35" versionCode = "5" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9d9772a7..a118f5d6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Aug 09 05:41:19 MSK 2023 +#Mon Oct 28 18:41:43 MSK 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists