From ad66cb0460d61882545fb48904c67c268e4fb3c0 Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Tue, 17 Mar 2026 12:32:30 +0100 Subject: [PATCH 1/8] Add 'Increase app text size' option to settings and implement 1.25x scaling --- .../java/be/scri/activities/MainActivity.kt | 14 ++++++++++++++ app/src/main/java/be/scri/App.kt | 6 ++++++ .../main/java/be/scri/helpers/PreferencesHelper.kt | 14 ++++++++++++++ .../scri/ui/common/components/ClickableItemComp.kt | 3 --- .../ui/common/components/SwitchableItemComp.kt | 1 - .../be/scri/ui/screens/settings/SettingsScreen.kt | 11 +++++++++++ .../scri/ui/screens/settings/SettingsViewModel.kt | 8 ++++++++ app/src/main/java/be/scri/ui/theme/ScribeTheme.kt | 5 ++++- 8 files changed, 57 insertions(+), 5 deletions(-) diff --git a/app/src/keyboards/java/be/scri/activities/MainActivity.kt b/app/src/keyboards/java/be/scri/activities/MainActivity.kt index 053fa08da..fc88a7066 100644 --- a/app/src/keyboards/java/be/scri/activities/MainActivity.kt +++ b/app/src/keyboards/java/be/scri/activities/MainActivity.kt @@ -55,6 +55,14 @@ class MainActivity : ComponentActivity() { .getUserDarkModePreference(context) == AppCompatDelegate.MODE_NIGHT_YES, ) } + + val isIncreaseTextSize = + remember { + mutableStateOf( + PreferencesHelper.getIncreaseTextSizePreference(context), + ) + } + val pagerState = rememberPagerState { bottomBarScreens.size @@ -82,13 +90,19 @@ class MainActivity : ComponentActivity() { ScribeTheme( useDarkTheme = isDarkMode.value, + isIncreaseTextSize = isIncreaseTextSize.value, ) { ScribeApp( pagerState = pagerState, isDarkTheme = isDarkMode.value, + isIncreaseTextSize = isIncreaseTextSize.value, onDarkModeChange = { darkMode -> updateTheme(darkMode) }, + onIncreaseTextSizeChange = { increaseTextSize -> + PreferencesHelper.setIncreaseTextSizePreference(context, increaseTextSize) + isIncreaseTextSize.value = increaseTextSize + }, resetHints = { isHintChangedMap[0] = true isHintChangedMap[1] = true diff --git a/app/src/main/java/be/scri/App.kt b/app/src/main/java/be/scri/App.kt index 982cce74c..90ad5b3d3 100644 --- a/app/src/main/java/be/scri/App.kt +++ b/app/src/main/java/be/scri/App.kt @@ -69,11 +69,13 @@ fun ScribeApp( pagerState: PagerState, navController: NavHostController, onDarkModeChange: (Boolean) -> Unit, + onIncreaseTextSizeChange: (Boolean) -> Unit, resetHints: () -> Unit, @SuppressLint("ComposeUnstableCollections") isHintChanged: Map, onDismiss: (Int) -> Unit, context: Context, isDarkTheme: Boolean, + isIncreaseTextSize: Boolean, modifier: Modifier = Modifier, downloadViewModel: DataDownloadViewModel = viewModel(), ) { @@ -87,6 +89,7 @@ fun ScribeApp( ScribeTheme( useDarkTheme = isDarkTheme, + isIncreaseTextSize = isIncreaseTextSize, ) { Scaffold( bottomBar = { @@ -151,6 +154,9 @@ fun ScribeApp( onDarkModeChange = { isDarkMode -> onDarkModeChange(isDarkMode) }, + onIncreaseTextSizeChange = { increaseTextSize -> + onIncreaseTextSizeChange(increaseTextSize) + }, onLanguageSettingsClick = { language -> navController.navigate( "${Screen.LanguageSettings.route}/$language", diff --git a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt index f5da00b11..da921eca8 100644 --- a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt +++ b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt @@ -28,6 +28,7 @@ object PreferencesHelper { private const val WORD_BY_WORD_DELETION = "word_by_word_deletion" private const val DEFAULT_CURRENCY = "default_currency" private const val HOLD_FOR_ALT_KEYS = "hold_for_alt_keys" + private const val INCREASE_TEXT_SIZE = "increase_text_size" /** * Sets the translation source language for a given language. @@ -592,4 +593,17 @@ object PreferencesHelper { val sharedPref = context.getSharedPreferences(SCRIBE_PREFS, Context.MODE_PRIVATE) return sharedPref.getBoolean(getLanguageSpecificPreferenceKey(HOLD_FOR_ALT_KEYS, language), true) } + + fun setIncreaseTextSizePreference( + context: Context, + increaseTextSize: Boolean, + ) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + sharedPref.edit { putBoolean(INCREASE_TEXT_SIZE, increaseTextSize) } + } + + fun getIncreaseTextSizePreference(context: Context): Boolean { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + return sharedPref.getBoolean(INCREASE_TEXT_SIZE, false) + } } diff --git a/app/src/main/java/be/scri/ui/common/components/ClickableItemComp.kt b/app/src/main/java/be/scri/ui/common/components/ClickableItemComp.kt index c57f658ae..918818716 100644 --- a/app/src/main/java/be/scri/ui/common/components/ClickableItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/ClickableItemComp.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.R /** @@ -55,7 +54,6 @@ fun ClickableItemComp( Text( text = title, modifier = Modifier.weight(1f), - fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, ) @@ -73,7 +71,6 @@ fun ClickableItemComp( if (!desc.isNullOrEmpty()) { Text( text = desc, - fontSize = 12.sp, color = Color.Gray, style = MaterialTheme.typography.bodySmall, modifier = Modifier.padding(top = 4.dp), diff --git a/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt b/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt index 2f0ee42b0..adf3179c3 100644 --- a/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt @@ -49,7 +49,6 @@ fun SwitchableItemComp( Text( text = title, modifier = Modifier.weight(1f), - fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, ) diff --git a/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt index ff53ca5d0..e542e209a 100644 --- a/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt @@ -34,6 +34,7 @@ import be.scri.ui.screens.settings.SettingsUtil.getLocalizedLanguageName @Composable fun SettingsScreen( onDarkModeChange: (Boolean) -> Unit, + onIncreaseTextSizeChange: (Boolean) -> Unit, onLanguageSettingsClick: (String) -> Unit, context: Context, modifier: Modifier = Modifier, @@ -47,6 +48,7 @@ fun SettingsScreen( val vibrateOnKeypress by viewModel.vibrateOnKeypress.collectAsState() val popupOnKeypress by viewModel.popupOnKeypress.collectAsState() val isUserDarkMode by viewModel.isUserDarkMode.collectAsState() + val isIncreaseTextSize by viewModel.isIncreaseTextSize.collectAsState() val lifecycleOwner = LocalLifecycleOwner.current @@ -85,6 +87,15 @@ fun SettingsScreen( onDarkModeChange(newDarkMode) }, ), + ScribeItem.SwitchItem( + title = R.string.app_settings_menu_increase_text_size, + desc = R.string.app_settings_menu_increase_text_size_description, + state = isIncreaseTextSize, + onToggle = { newIncreaseTextSize -> + viewModel.setIncreaseTextSize(newIncreaseTextSize) + onIncreaseTextSizeChange(newIncreaseTextSize) + }, + ), ), ) diff --git a/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt index e631e55a9..a51d6d6e2 100644 --- a/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt @@ -33,6 +33,8 @@ class SettingsViewModel( private val _holdForAltKeys = MutableStateFlow(sharedPrefs.getBoolean("hold_for_alt_keys", false)) val holdForAltKeys: StateFlow = _holdForAltKeys + private val _isIncreaseTextSize = MutableStateFlow(sharedPrefs.getBoolean("increase_text_size", false)) + val isIncreaseTextSize: StateFlow = _isIncreaseTextSize init { viewModelScope.launch { refreshSettings(context) } @@ -56,5 +58,11 @@ class SettingsViewModel( */ fun setLightDarkMode(value: Boolean) { _isUserDarkMode.value = value + sharedPrefs.edit().putBoolean("dark_mode", value).apply() + } + + fun setIncreaseTextSize(value: Boolean) { + _isIncreaseTextSize.value = value + sharedPrefs.edit().putBoolean("increase_text_size", value).apply() } } diff --git a/app/src/main/java/be/scri/ui/theme/ScribeTheme.kt b/app/src/main/java/be/scri/ui/theme/ScribeTheme.kt index a3a17e3ec..1e6a76af5 100644 --- a/app/src/main/java/be/scri/ui/theme/ScribeTheme.kt +++ b/app/src/main/java/be/scri/ui/theme/ScribeTheme.kt @@ -47,6 +47,7 @@ private val DarkColors = @Composable fun ScribeTheme( useDarkTheme: Boolean, + isIncreaseTextSize: Boolean = false, @Suppress("ktlint:standard:annotation") content: @Composable() () -> Unit, ) { @@ -57,9 +58,11 @@ fun ScribeTheme( DarkColors } + val typography = if (isIncreaseTextSize) createTypography(1.25f) else ScribeTypography + MaterialTheme( colorScheme = colors, content = content, - typography = ScribeTypography, + typography = typography, ) } From bec6f7888a237d592a394e91188c3cb5ce1b4149 Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Tue, 17 Mar 2026 14:50:56 +0100 Subject: [PATCH 2/8] Add 'Increase app text size' option to settings and implement 1.25x scaling --- .../java/be/scri/helpers/PreferencesHelper.kt | 12 ++++++++++++ .../scri/ui/screens/settings/SettingsScreen.kt | 4 ++-- .../ui/screens/settings/SettingsViewModel.kt | 8 +++++++- .../main/java/be/scri/ui/theme/Typography.kt | 17 ++++++++++------- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt index da921eca8..7a43b973b 100644 --- a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt +++ b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt @@ -594,6 +594,12 @@ object PreferencesHelper { return sharedPref.getBoolean(getLanguageSpecificPreferenceKey(HOLD_FOR_ALT_KEYS, language), true) } + /** + * Saves the user's "Increase Text Size" preference. + * + * @param context The application context used to access SharedPreferences. + * @param increaseTextSize `true` to enable larger text size, `false` to use default size. + */ fun setIncreaseTextSizePreference( context: Context, increaseTextSize: Boolean, @@ -602,6 +608,12 @@ object PreferencesHelper { sharedPref.edit { putBoolean(INCREASE_TEXT_SIZE, increaseTextSize) } } + /** + * Retrieves the user's "Increase Text Size" preference. + * + * @param context The application context used to access SharedPreferences. + * @return `true` if larger text size is enabled, `false` otherwise. + */ fun getIncreaseTextSizePreference(context: Context): Boolean { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) return sharedPref.getBoolean(INCREASE_TEXT_SIZE, false) diff --git a/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt index e542e209a..d87a0c3c3 100644 --- a/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/settings/SettingsScreen.kt @@ -88,8 +88,8 @@ fun SettingsScreen( }, ), ScribeItem.SwitchItem( - title = R.string.app_settings_menu_increase_text_size, - desc = R.string.app_settings_menu_increase_text_size_description, + title = R.string.i18n_app_settings_menu_increase_text_size, + desc = R.string.i18n_app_settings_menu_increase_text_size_description, state = isIncreaseTextSize, onToggle = { newIncreaseTextSize -> viewModel.setIncreaseTextSize(newIncreaseTextSize) diff --git a/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt index a51d6d6e2..13c40b73d 100644 --- a/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch +import androidx.core.content.edit /** This files handles the state and business logic for the settings screen. */ class SettingsViewModel( @@ -61,8 +62,13 @@ class SettingsViewModel( sharedPrefs.edit().putBoolean("dark_mode", value).apply() } + /** + * Updates the text size preference setting. + * + * @param value `true` if text size should be increased, `false` otherwise. + */ fun setIncreaseTextSize(value: Boolean) { _isIncreaseTextSize.value = value - sharedPrefs.edit().putBoolean("increase_text_size", value).apply() + sharedPrefs.edit { putBoolean("increase_text_size", value) } } } diff --git a/app/src/main/java/be/scri/ui/theme/Typography.kt b/app/src/main/java/be/scri/ui/theme/Typography.kt index c3d110a3f..2cf5510f4 100644 --- a/app/src/main/java/be/scri/ui/theme/Typography.kt +++ b/app/src/main/java/be/scri/ui/theme/Typography.kt @@ -6,23 +6,26 @@ import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.sp -/** - * Text styles for the application. - */ -val ScribeTypography = - Typography( +private fun TextUnit.scaled(scale: Float): TextUnit = if (isSp) (value * scale).sp else this + +fun createTypography(scale: Float): Typography { + return Typography( bodyMedium = TextStyle( fontFamily = FontFamily.SansSerif, fontWeight = FontWeight.Normal, - fontSize = 16.sp, + fontSize = 16.sp.scaled(scale), ), headlineMedium = TextStyle( fontFamily = FontFamily.SansSerif, fontWeight = FontWeight.Bold, - fontSize = 20.sp, + fontSize = 20.sp.scaled(scale), ), ) +} + +val ScribeTypography = createTypography(1f) From b49c1d9c3371f53f0a5ef714c6fc32e0432adcfc Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Tue, 17 Mar 2026 14:52:58 +0100 Subject: [PATCH 3/8] Add 'Increase app text size' option to settings and implement 1.25x scaling --- app/src/main/java/be/scri/ui/theme/Typography.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/be/scri/ui/theme/Typography.kt b/app/src/main/java/be/scri/ui/theme/Typography.kt index 2cf5510f4..0c28ddcd2 100644 --- a/app/src/main/java/be/scri/ui/theme/Typography.kt +++ b/app/src/main/java/be/scri/ui/theme/Typography.kt @@ -1,5 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later +/** + * Text styles for the application. + */ + package be.scri.ui.theme import androidx.compose.material3.Typography From 2e10124be159c49fb480930b1df1460fc14a6446 Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Tue, 17 Mar 2026 15:05:54 +0100 Subject: [PATCH 4/8] fix 'dangling toplevel KDoc' --- app/src/main/java/be/scri/ui/theme/Typography.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/scri/ui/theme/Typography.kt b/app/src/main/java/be/scri/ui/theme/Typography.kt index 0c28ddcd2..524754975 100644 --- a/app/src/main/java/be/scri/ui/theme/Typography.kt +++ b/app/src/main/java/be/scri/ui/theme/Typography.kt @@ -1,8 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later -/** - * Text styles for the application. - */ package be.scri.ui.theme @@ -32,4 +29,7 @@ fun createTypography(scale: Float): Typography { ) } +/** + * Text styles for the application. + */ val ScribeTypography = createTypography(1f) From b924a0a44885485b5bf3fb1bc5a038d391494e0f Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Tue, 17 Mar 2026 16:15:41 +0100 Subject: [PATCH 5/8] Refactor Typography.kt to use expression body for createTypography function --- ...SettingsScreenInstallKeyboardButtonTest.kt | 8 ++ .../SettingsScreenInstrumentedTest.kt | 85 ++++++++++++++++++- .../ui/screens/settings/SettingsViewModel.kt | 2 +- .../main/java/be/scri/ui/theme/Typography.kt | 41 ++++++--- 4 files changed, 124 insertions(+), 12 deletions(-) diff --git a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt index 5497704bc..f29f859d7 100644 --- a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt +++ b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt @@ -43,6 +43,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -68,6 +69,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -90,6 +92,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -113,6 +116,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -137,6 +141,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -160,6 +165,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -186,6 +192,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) @@ -210,6 +217,7 @@ class SettingsScreenInstallKeyboardButtonTest { SettingsScreen( onDarkModeChange = {}, onLanguageSettingsClick = {}, + onIncreaseTextSizeChange = {}, context = context, viewModel = mockViewModel, ) diff --git a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt index 8589b1254..1069a8bd9 100644 --- a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt +++ b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt @@ -39,6 +39,7 @@ class SettingsScreenInstrumentedTest { private lateinit var context: Context private lateinit var mockViewModel: SettingsViewModel private lateinit var onDarkModeChangeMock: (Boolean) -> Unit + private lateinit var onIncreaseTextSizeChangeMock: (Boolean) -> Unit private lateinit var onLanguageSettingsClickMock: (String) -> Unit @Before @@ -46,6 +47,7 @@ class SettingsScreenInstrumentedTest { context = InstrumentationRegistry.getInstrumentation().targetContext mockViewModel = mockk(relaxed = true) onDarkModeChangeMock = mockk(relaxed = true) + onIncreaseTextSizeChangeMock = mockk(relaxed = true) onLanguageSettingsClickMock = mockk(relaxed = true) // Setup comprehensive mock returns for all StateFlow properties @@ -54,9 +56,11 @@ class SettingsScreenInstrumentedTest { every { mockViewModel.vibrateOnKeypress } returns MutableStateFlow(false) every { mockViewModel.popupOnKeypress } returns MutableStateFlow(false) every { mockViewModel.isUserDarkMode } returns MutableStateFlow(false) + every { mockViewModel.isIncreaseTextSize } returns MutableStateFlow(false) every { mockViewModel.refreshSettings(any()) } returns Unit every { mockViewModel.setLightDarkMode(any()) } returns Unit + every { mockViewModel.setIncreaseTextSize(any()) } returns Unit } private fun setTestContent(content: @Composable () -> Unit) { @@ -73,6 +77,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -88,6 +93,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -103,6 +109,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -118,6 +125,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -128,6 +136,26 @@ class SettingsScreenInstrumentedTest { .assertIsDisplayed() } + @Test + fun settingsScreen_displaysIncreaseTextSizeSwitch() { + setTestContent { + SettingsScreen( + onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, + onLanguageSettingsClick = onLanguageSettingsClickMock, + context = context, + ) + } + + composeTestRule + .onNodeWithText(context.getString(R.string.i18n_app_settings_menu_increase_text_size)) + .assertIsDisplayed() + + composeTestRule + .onNodeWithText(context.getString(R.string.i18n_app_settings_menu_increase_text_size_description)) + .assertIsDisplayed() + } + @Test fun settingsScreen_whenKeyboardNotInstalled_showsInstallButton() { every { mockViewModel.isKeyboardInstalled } returns MutableStateFlow(false) @@ -135,6 +163,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModel, @@ -156,6 +185,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModel, @@ -183,6 +213,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModel, @@ -206,12 +237,14 @@ class SettingsScreenInstrumentedTest { every { mockViewModelSpy.vibrateOnKeypress } returns MutableStateFlow(false) every { mockViewModelSpy.popupOnKeypress } returns MutableStateFlow(false) every { mockViewModelSpy.isUserDarkMode } returns MutableStateFlow(false) + every { mockViewModelSpy.isIncreaseTextSize } returns MutableStateFlow(false) every { mockViewModelSpy.refreshSettings(any()) } returns Unit every { mockViewModelSpy.setLightDarkMode(any()) } returns Unit setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModelSpy, @@ -227,7 +260,7 @@ class SettingsScreenInstrumentedTest { composeTestRule .onAllNodes(hasClickAction() and !hasText(darkModeText)) .filterToOne( - !hasText("App language") and !hasText("Install keyboards"), + !hasText("App language") and !hasText("Install keyboards") and !hasText("Increase app text size"), ).performClick() composeTestRule.waitForIdle() @@ -236,6 +269,48 @@ class SettingsScreenInstrumentedTest { verify(timeout = 3000) { onDarkModeChangeMock(true) } } + @Test + fun settingsScreen_increaseTextSizeToggle_triggersCallbacks() { + every { mockViewModel.isIncreaseTextSize } returns MutableStateFlow(false) + val mockViewModelSpy = spyk(mockViewModel) + + every { mockViewModelSpy.languages } returns MutableStateFlow(emptyList()) + every { mockViewModelSpy.isKeyboardInstalled } returns MutableStateFlow(false) + every { mockViewModelSpy.vibrateOnKeypress } returns MutableStateFlow(false) + every { mockViewModelSpy.popupOnKeypress } returns MutableStateFlow(false) + every { mockViewModelSpy.isUserDarkMode } returns MutableStateFlow(false) + every { mockViewModelSpy.isIncreaseTextSize } returns MutableStateFlow(false) + every { mockViewModelSpy.refreshSettings(any()) } returns Unit + every { mockViewModelSpy.setIncreaseTextSize(any()) } returns Unit + + setTestContent { + SettingsScreen( + onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, + onLanguageSettingsClick = onLanguageSettingsClickMock, + context = context, + viewModel = mockViewModelSpy, + ) + } + + val increaseTextSizeText = "Increase app text size" + + composeTestRule + .onNodeWithText(increaseTextSizeText) + .assertIsDisplayed() + + composeTestRule + .onAllNodes(hasClickAction() and !hasText(increaseTextSizeText)) + .filterToOne( + !hasText("App language") and !hasText("Install keyboards") and !hasText("Dark mode"), + ).performClick() + + composeTestRule.waitForIdle() + + verify(timeout = 3000) { mockViewModelSpy.setIncreaseTextSize(true) } + verify(timeout = 3000) { onIncreaseTextSizeChangeMock(true) } + } + @Test fun settingsScreen_refreshSettings_whenLifecycleResumes() { val mockViewModelSpy = spyk(mockViewModel) @@ -245,12 +320,14 @@ class SettingsScreenInstrumentedTest { every { mockViewModelSpy.vibrateOnKeypress } returns MutableStateFlow(false) every { mockViewModelSpy.popupOnKeypress } returns MutableStateFlow(false) every { mockViewModelSpy.isUserDarkMode } returns MutableStateFlow(false) + every { mockViewModelSpy.isIncreaseTextSize } returns MutableStateFlow(false) every { mockViewModelSpy.refreshSettings(any()) } returns Unit every { mockViewModelSpy.setLightDarkMode(any()) } returns Unit setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModelSpy, @@ -265,6 +342,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -280,6 +358,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -298,6 +377,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) @@ -317,6 +397,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModel, @@ -338,6 +419,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, viewModel = mockViewModel, @@ -354,6 +436,7 @@ class SettingsScreenInstrumentedTest { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, + onIncreaseTextSizeChange = onIncreaseTextSizeChangeMock, onLanguageSettingsClick = onLanguageSettingsClickMock, context = context, ) diff --git a/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt index 13c40b73d..6656c6939 100644 --- a/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/be/scri/ui/screens/settings/SettingsViewModel.kt @@ -3,12 +3,12 @@ package be.scri.ui.screens.settings import android.content.Context +import androidx.core.content.edit import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch -import androidx.core.content.edit /** This files handles the state and business logic for the settings screen. */ class SettingsViewModel( diff --git a/app/src/main/java/be/scri/ui/theme/Typography.kt b/app/src/main/java/be/scri/ui/theme/Typography.kt index 524754975..558e8a480 100644 --- a/app/src/main/java/be/scri/ui/theme/Typography.kt +++ b/app/src/main/java/be/scri/ui/theme/Typography.kt @@ -1,6 +1,5 @@ // SPDX-License-Identifier: GPL-3.0-or-later - package be.scri.ui.theme import androidx.compose.material3.Typography @@ -10,26 +9,48 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.sp -private fun TextUnit.scaled(scale: Float): TextUnit = if (isSp) (value * scale).sp else this +/** + * Text styles for the application. + */ +private fun TextUnit.scaled(scale: Float): TextUnit = + if (isSp) { + (value * scale).sp + } else { + this + } -fun createTypography(scale: Float): Typography { - return Typography( +fun createTypography(scale: Float): Typography = + Typography( + headlineMedium = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Bold, + fontSize = 20.sp.scaled(scale), + ), + titleMedium = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Bold, + fontSize = 18.sp.scaled(scale), + ), bodyMedium = TextStyle( fontFamily = FontFamily.SansSerif, fontWeight = FontWeight.Normal, fontSize = 16.sp.scaled(scale), ), - headlineMedium = + bodySmall = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Normal, + fontSize = 12.sp.scaled(scale), + ), + labelLarge = TextStyle( fontFamily = FontFamily.SansSerif, fontWeight = FontWeight.Bold, - fontSize = 20.sp.scaled(scale), + fontSize = 24.sp.scaled(scale), ), ) -} -/** - * Text styles for the application. - */ val ScribeTypography = createTypography(1f) From 43441175e5568c62e3176cd30098eaa24fabe6af Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Thu, 19 Mar 2026 08:38:55 +0100 Subject: [PATCH 6/8] test: fix ambiguous node selection in SettingsScreenInstrumentedTest --- .../SettingsScreenInstrumentedTest.kt | 21 +++---------------- .../common/components/SwitchableItemComp.kt | 11 +++++++--- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt index 1069a8bd9..c984cadbe 100644 --- a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt +++ b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstrumentedTest.kt @@ -7,9 +7,6 @@ import androidx.activity.ComponentActivity import androidx.compose.runtime.Composable import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.filterToOne -import androidx.compose.ui.test.hasClickAction -import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -137,7 +134,7 @@ class SettingsScreenInstrumentedTest { } @Test - fun settingsScreen_displaysIncreaseTextSizeSwitch() { + fun settingsScreen_increaseTextSizeSwitch_isDisplayed() { setTestContent { SettingsScreen( onDarkModeChange = onDarkModeChangeMock, @@ -255,13 +252,7 @@ class SettingsScreenInstrumentedTest { composeTestRule .onNodeWithText(darkModeText) - .assertIsDisplayed() - - composeTestRule - .onAllNodes(hasClickAction() and !hasText(darkModeText)) - .filterToOne( - !hasText("App language") and !hasText("Install keyboards") and !hasText("Increase app text size"), - ).performClick() + .performClick() composeTestRule.waitForIdle() @@ -297,13 +288,7 @@ class SettingsScreenInstrumentedTest { composeTestRule .onNodeWithText(increaseTextSizeText) - .assertIsDisplayed() - - composeTestRule - .onAllNodes(hasClickAction() and !hasText(increaseTextSizeText)) - .filterToOne( - !hasText("App language") and !hasText("Install keyboards") and !hasText("Dark mode"), - ).performClick() + .performClick() composeTestRule.waitForIdle() diff --git a/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt b/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt index adf3179c3..e01f77856 100644 --- a/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch @@ -19,6 +20,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.semantics.Role import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -41,7 +43,11 @@ fun SwitchableItemComp( Column( modifier = modifier - .padding(horizontal = 12.dp, vertical = 10.dp), + .toggleable( + value = isChecked, + onValueChange = onCheckedChange, + role = Role.Switch, + ).padding(horizontal = 12.dp, vertical = 10.dp), ) { Row( verticalAlignment = Alignment.CenterVertically, @@ -53,9 +59,8 @@ fun SwitchableItemComp( style = MaterialTheme.typography.bodyMedium, ) Switch( - interactionSource = null, checked = isChecked, - onCheckedChange = onCheckedChange, + onCheckedChange = null, modifier = Modifier .width(51.dp) From 239e498d7ed24f3217dd6f1e6c9b99496f7c49ab Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Thu, 19 Mar 2026 09:50:58 +0100 Subject: [PATCH 7/8] fix(test): resolve ClassCastException in SettingsScreen tests --- .../screens/settings/SettingsScreenInstallKeyboardButtonTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt index f29f859d7..d377f0c61 100644 --- a/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt +++ b/app/src/androidTestKeyboards/kotlin/be/scri/ui/screens/settings/SettingsScreenInstallKeyboardButtonTest.kt @@ -29,6 +29,7 @@ class SettingsScreenInstallKeyboardButtonTest { every { mockViewModel.vibrateOnKeypress } returns MutableStateFlow(false) every { mockViewModel.popupOnKeypress } returns MutableStateFlow(false) every { mockViewModel.isUserDarkMode } returns MutableStateFlow(false) + every { mockViewModel.isIncreaseTextSize } returns MutableStateFlow(false) return mockViewModel } From 036d0265b97f89fd02bfa0c01650e303dcede240 Mon Sep 17 00:00:00 2001 From: Femi Ogundipe Date: Mon, 23 Mar 2026 13:27:12 +0100 Subject: [PATCH 8/8] feat(ui): increase app text size across components and screens --- .../scri/ui/common/appcomponents/ActionBar.kt | 2 -- .../appcomponents/ConfirmationDialog.kt | 7 ++--- .../ui/common/appcomponents/HintDialog.kt | 5 +--- .../ui/common/bottombar/ScribeBottomBar.kt | 6 +--- .../ui/common/components/AboutPageItemComp.kt | 2 -- .../components/CircleClickableItemComp.kt | 2 -- .../components/DownloadDataOptionComp.kt | 3 +- .../components/ItemCardContainerWithTitle.kt | 3 +- .../ui/common/components/LanguageItemComp.kt | 3 -- .../common/components/SwitchableItemComp.kt | 5 ++-- .../be/scri/ui/screens/InstallationScreen.kt | 24 +++++++-------- .../be/scri/ui/screens/PrivacyPolicyScreen.kt | 18 ++--------- .../scri/ui/screens/SelectLanguageScreen.kt | 4 +-- .../be/scri/ui/screens/ThirdPartyScreen.kt | 24 +++------------ .../be/scri/ui/screens/WikimediaScreen.kt | 30 ++++--------------- .../ui/screens/download/DataDownloadScreen.kt | 7 ++--- .../main/java/be/scri/ui/theme/Typography.kt | 24 +++++++++++++++ 17 files changed, 61 insertions(+), 108 deletions(-) diff --git a/app/src/main/java/be/scri/ui/common/appcomponents/ActionBar.kt b/app/src/main/java/be/scri/ui/common/appcomponents/ActionBar.kt index a803d509e..e590f2d3f 100644 --- a/app/src/main/java/be/scri/ui/common/appcomponents/ActionBar.kt +++ b/app/src/main/java/be/scri/ui/common/appcomponents/ActionBar.kt @@ -15,7 +15,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.R /** @@ -50,7 +49,6 @@ fun ActionBar( } Text( text = title, - fontSize = 16.sp, color = MaterialTheme.colorScheme.onBackground, style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold, diff --git a/app/src/main/java/be/scri/ui/common/appcomponents/ConfirmationDialog.kt b/app/src/main/java/be/scri/ui/common/appcomponents/ConfirmationDialog.kt index 110599adb..f7e104915 100644 --- a/app/src/main/java/be/scri/ui/common/appcomponents/ConfirmationDialog.kt +++ b/app/src/main/java/be/scri/ui/common/appcomponents/ConfirmationDialog.kt @@ -34,7 +34,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em -import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import be.scri.R @@ -102,7 +101,6 @@ fun ConfirmationDialogContent( val buttonConfirmColor: Color val buttonChangeColor: Color val buttonTextColor: Color - val textFontSize = 16.sp val buttonPadding = 8.dp if (isUserDarkMode) { buttonConfirmColor = colorResource(R.color.dark_scribe_blue) @@ -168,7 +166,6 @@ fun ConfirmationDialogContent( Text( text = text, color = MaterialTheme.colorScheme.onSurface, - fontSize = textFontSize, style = MaterialTheme.typography.bodyMedium.merge( TextStyle(lineHeight = 1.5.em), @@ -208,7 +205,7 @@ fun ConfirmationDialogContent( ) { Text( text = textChange, - fontSize = textFontSize, + style = MaterialTheme.typography.bodyMedium, modifier = Modifier, ) } @@ -243,7 +240,7 @@ fun ConfirmationDialogContent( ) { Text( text = textConfirm, - fontSize = textFontSize, + style = MaterialTheme.typography.bodyMedium, modifier = Modifier, ) } diff --git a/app/src/main/java/be/scri/ui/common/appcomponents/HintDialog.kt b/app/src/main/java/be/scri/ui/common/appcomponents/HintDialog.kt index 61e50967f..8996d791a 100644 --- a/app/src/main/java/be/scri/ui/common/appcomponents/HintDialog.kt +++ b/app/src/main/java/be/scri/ui/common/appcomponents/HintDialog.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.pager.PagerState @@ -38,7 +37,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.R import be.scri.helpers.PreferencesHelper.getIsDarkModeOrNot @@ -165,7 +163,6 @@ fun HintDialogContent( Text( text = text, color = MaterialTheme.colorScheme.onSurface, - fontSize = 14.sp, style = MaterialTheme.typography.labelMedium.copy( fontWeight = FontWeight.Normal, @@ -201,7 +198,7 @@ fun HintDialogContent( ) { Text( text = "OK", - fontSize = 20.sp, + style = MaterialTheme.typography.headlineMedium, modifier = Modifier, ) } diff --git a/app/src/main/java/be/scri/ui/common/bottombar/ScribeBottomBar.kt b/app/src/main/java/be/scri/ui/common/bottombar/ScribeBottomBar.kt index 9b51a27dc..40e41f21b 100644 --- a/app/src/main/java/be/scri/ui/common/bottombar/ScribeBottomBar.kt +++ b/app/src/main/java/be/scri/ui/common/bottombar/ScribeBottomBar.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.R import kotlinx.coroutines.flow.MutableSharedFlow @@ -42,7 +41,6 @@ fun ScribeBottomBar( val isSelected = pagerState.currentPage == index val iconSize = if (isSelected) 26.dp else 24.dp - val textSize = if (isSelected) 13.sp else 12.sp val greyColor = colorResource(id = R.color.nav_item_grey) val color = if (isSelected) { @@ -71,10 +69,8 @@ fun ScribeBottomBar( Text( text = item.label, style = - MaterialTheme.typography.labelMedium.copy( - fontSize = textSize, + MaterialTheme.typography.labelSmall.copy( fontWeight = if (isSelected) FontWeight.ExtraBold else FontWeight.W600, - letterSpacing = (0).sp, color = color, ), ) diff --git a/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt b/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt index 815820c23..754379f5c 100644 --- a/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/AboutPageItemComp.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.R /** @@ -67,7 +66,6 @@ fun AboutPageItemComp( Text( text = title, modifier = Modifier.weight(1f).padding(start = 4.dp), - fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, ) diff --git a/app/src/main/java/be/scri/ui/common/components/CircleClickableItemComp.kt b/app/src/main/java/be/scri/ui/common/components/CircleClickableItemComp.kt index c5933ba35..178e8e178 100644 --- a/app/src/main/java/be/scri/ui/common/components/CircleClickableItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/CircleClickableItemComp.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp /** * A composable component that displays a clickable item with a title and a circular clickable icon on the right. @@ -51,7 +50,6 @@ fun CircleClickableItemComp( Text( text = title, modifier = Modifier.weight(1f), - fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, ) diff --git a/app/src/main/java/be/scri/ui/common/components/DownloadDataOptionComp.kt b/app/src/main/java/be/scri/ui/common/components/DownloadDataOptionComp.kt index b1bd51c8c..9dcdbd9a5 100644 --- a/app/src/main/java/be/scri/ui/common/components/DownloadDataOptionComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/DownloadDataOptionComp.kt @@ -23,7 +23,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.R import be.scri.ui.screens.download.DownloadState @@ -87,7 +86,7 @@ private fun DownloadButtonContent( DownloadState.Completed -> stringResource(R.string.i18n_app_download_menu_ui_download_data_up_to_date) DownloadState.Update -> stringResource(R.string.i18n_app_download_menu_ui_download_data_update) }, - fontSize = 13.sp, + style = MaterialTheme.typography.labelSmall, fontWeight = FontWeight.Medium, modifier = Modifier.weight(1f), maxLines = 1, diff --git a/app/src/main/java/be/scri/ui/common/components/ItemCardContainerWithTitle.kt b/app/src/main/java/be/scri/ui/common/components/ItemCardContainerWithTitle.kt index 0bb19117d..dd45e3a28 100644 --- a/app/src/main/java/be/scri/ui/common/components/ItemCardContainerWithTitle.kt +++ b/app/src/main/java/be/scri/ui/common/components/ItemCardContainerWithTitle.kt @@ -11,7 +11,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.ui.models.ScribeItemList /** @@ -31,7 +30,7 @@ fun ItemCardContainerWithTitle( text = title, color = MaterialTheme.colorScheme.onBackground, fontWeight = FontWeight.Bold, - fontSize = 22.sp, + style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding( start = 16.dp, diff --git a/app/src/main/java/be/scri/ui/common/components/LanguageItemComp.kt b/app/src/main/java/be/scri/ui/common/components/LanguageItemComp.kt index 168d3faf7..7073eeae0 100644 --- a/app/src/main/java/be/scri/ui/common/components/LanguageItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/LanguageItemComp.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import be.scri.ui.screens.download.DownloadState /** @@ -31,7 +30,6 @@ fun LanguageItemComp( onButtonClick: () -> Unit, modifier: Modifier = Modifier, titleFontWeight: FontWeight = FontWeight.Normal, - titleFontSize: androidx.compose.ui.unit.TextUnit = 16.sp, isDarkTheme: Boolean = false, buttonState: DownloadState? = null, ) { @@ -47,7 +45,6 @@ fun LanguageItemComp( ) { Text( text = title, - fontSize = titleFontSize, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, fontWeight = titleFontWeight, diff --git a/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt b/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt index e01f77856..df2b02394 100644 --- a/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt +++ b/app/src/main/java/be/scri/ui/common/components/SwitchableItemComp.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.Role import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp +import be.scri.ui.screens.Alpha /** * A composable component that displays a switch alongside a title and description. @@ -95,8 +95,7 @@ fun SwitchableItemComp( desc?.let { description -> Text( text = description, - fontSize = 12.sp, - color = Color.Gray, + color = Color.Gray.copy(alpha = Alpha.MEDIUM), style = MaterialTheme.typography.bodySmall, modifier = Modifier.padding(top = 4.dp), ) diff --git a/app/src/main/java/be/scri/ui/screens/InstallationScreen.kt b/app/src/main/java/be/scri/ui/screens/InstallationScreen.kt index d9be0c22a..93511c073 100644 --- a/app/src/main/java/be/scri/ui/screens/InstallationScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/InstallationScreen.kt @@ -102,7 +102,7 @@ fun InstallationScreen( text = stringResource(R.string.i18n_app_installation_keyboard_title), color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold, - fontSize = Dimensions.TextSizeLarge_I, + style = MaterialTheme.typography.headlineMedium, modifier = Modifier .padding( @@ -137,27 +137,27 @@ fun InstallationScreen( Row(modifier = Modifier.padding(top = Dimensions.PaddingSmall)) { Text( text = "1. ", - fontSize = Dimensions.TextSizeMedium, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) Text( text = stringResource(R.string.i18n_app_installation_keyboard_keyboard_settings), color = colorResource(R.color.dark_scribe_blue), - fontSize = Dimensions.TextSizeMedium, fontWeight = FontWeight.Bold, + style = MaterialTheme.typography.labelMedium, ) } Row(modifier = Modifier.padding(top = Dimensions.PaddingSmall)) { Text( text = "2. ", - fontSize = Dimensions.TextSizeMedium, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) Text( text = stringResource(R.string.i18n_app_installation_keyboard_text_2), - fontSize = Dimensions.TextSizeMedium, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) } Row( @@ -166,13 +166,13 @@ fun InstallationScreen( ) { Text( text = "3. ", - fontSize = Dimensions.TextSizeMedium, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) Text( text = stringResource(R.string.i18n_app_installation_keyboard_text_3), - fontSize = Dimensions.TextSizeMedium, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) Image( painter = painterResource(resource), @@ -186,8 +186,8 @@ fun InstallationScreen( ) Text( text = stringResource(R.string.i18n_app_installation_keyboard_text_4), - fontSize = Dimensions.TextSizeMedium, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) } } @@ -232,7 +232,7 @@ fun InstallationScreen( text = stringResource(R.string.i18n_app_download_menu_option_scribe_title), color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold, - fontSize = Dimensions.TextSizeLarge_I, + style = MaterialTheme.typography.headlineMedium, modifier = Modifier .padding( @@ -268,9 +268,9 @@ fun InstallationScreen( ) { Text( text = stringResource(R.string.i18n_app_download_menu_option_scribe_download_data), - fontSize = Dimensions.TextSizeMedium, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.labelMedium, ) Image( painter = painterResource(R.drawable.right_arrow), @@ -283,8 +283,8 @@ fun InstallationScreen( } Text( text = stringResource(R.string.i18n_app_download_menu_option_scribe_description), - fontSize = Dimensions.TextSizeSmall, color = MaterialTheme.colorScheme.onSurface.copy(alpha = Alpha.MEDIUM), + style = MaterialTheme.typography.bodySmall, ) } } @@ -305,10 +305,10 @@ fun InstallationScreen( ) { Text( text = stringResource(R.string.i18n_app_installation_button_quick_tutorial), - fontSize = Dimensions.TextSizeExtraLarge, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.padding(vertical = Dimensions.PaddingLarge), + style = MaterialTheme.typography.labelLarge, ) } } diff --git a/app/src/main/java/be/scri/ui/screens/PrivacyPolicyScreen.kt b/app/src/main/java/be/scri/ui/screens/PrivacyPolicyScreen.kt index 9ba76608f..3785bafc4 100644 --- a/app/src/main/java/be/scri/ui/screens/PrivacyPolicyScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/PrivacyPolicyScreen.kt @@ -18,12 +18,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import be.scri.R import be.scri.ui.common.ScribeBaseScreen -import be.scri.ui.theme.ScribeTypography /** * The about screen that displays the privacy policy for the application. @@ -48,11 +45,7 @@ fun PrivacyPolicyScreen( ) { Text( text = stringResource(id = R.string.i18n_app_about_legal_privacy_policy_text), - fontSize = ScribeTypography.bodyMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.bodyMedium.fontStyle, - ), + style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(16.dp), ) } @@ -82,13 +75,8 @@ fun PrivacyPolicyScreenContent( Text( text = title, modifier = Modifier.padding(top = 16.dp, bottom = 4.dp), - fontSize = ScribeTypography.headlineMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.headlineMedium.fontStyle, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurface, - ), + style = MaterialTheme.typography.headlineMedium, + color = MaterialTheme.colorScheme.onSurface, ) Card( shape = RoundedCornerShape(dimensionResource(id = R.dimen.rounded_corner_radius_standard)), diff --git a/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt b/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt index 14e6df433..9578e2d4b 100644 --- a/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt @@ -15,7 +15,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults -import androidx.compose.material3.Divider +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text @@ -120,7 +120,7 @@ fun SelectTranslationSourceLanguageScreen( } if (index < options.lastIndex) { - Divider(color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f)) + HorizontalDivider(color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f)) } } } diff --git a/app/src/main/java/be/scri/ui/screens/ThirdPartyScreen.kt b/app/src/main/java/be/scri/ui/screens/ThirdPartyScreen.kt index 16a996be5..b7d2017d0 100644 --- a/app/src/main/java/be/scri/ui/screens/ThirdPartyScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/ThirdPartyScreen.kt @@ -19,12 +19,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import be.scri.R import be.scri.ui.common.ScribeBaseScreen -import be.scri.ui.theme.ScribeTypography /** * The about screen to display third-party legal information for software used in the application. @@ -51,19 +48,11 @@ fun ThirdPartyScreen( Column(modifier = Modifier.padding(16.dp)) { Text( text = stringResource(id = R.string.i18n_app_about_legal_third_party_text), - fontSize = ScribeTypography.bodyMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.bodyMedium.fontStyle, - ), + style = MaterialTheme.typography.bodyMedium, ) Text( text = stringResource(id = R.string.i18n_app_about_legal_third_party_entry_simple_keyboard), - fontSize = ScribeTypography.bodyMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.bodyMedium.fontStyle, - ), + style = MaterialTheme.typography.bodyMedium, ) } } @@ -92,13 +81,8 @@ fun ThirdPartyScreenContent( Text( text = title, modifier = Modifier.padding(top = 16.dp, bottom = 4.dp), - fontSize = ScribeTypography.headlineMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.headlineMedium.fontStyle, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurface, - ), + style = MaterialTheme.typography.headlineMedium, + color = MaterialTheme.colorScheme.onSurface, ) Card( shape = RoundedCornerShape(dimensionResource(id = R.dimen.rounded_corner_radius_standard)), diff --git a/app/src/main/java/be/scri/ui/screens/WikimediaScreen.kt b/app/src/main/java/be/scri/ui/screens/WikimediaScreen.kt index a84a04726..aed46683e 100644 --- a/app/src/main/java/be/scri/ui/screens/WikimediaScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/WikimediaScreen.kt @@ -25,12 +25,9 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import be.scri.R import be.scri.ui.common.ScribeBaseScreen -import be.scri.ui.theme.ScribeTypography /** * The about screen for describing the relationship between Scribe and the Wikimedia movement. @@ -56,11 +53,7 @@ fun WikimediaScreen( Column(modifier = Modifier.padding(16.dp)) { Text( text = stringResource(id = R.string.scribe_key), - fontSize = ScribeTypography.bodyMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.bodyMedium.fontStyle, - ), + style = MaterialTheme.typography.bodyMedium, ) Image( imageVector = ImageVector.vectorResource(R.drawable.wikidata_logo), @@ -75,11 +68,7 @@ fun WikimediaScreen( ) Text( text = stringResource(id = R.string.i18n_app_about_community_wikimedia_text_2), - fontSize = ScribeTypography.bodyMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.bodyMedium.fontStyle, - ), + style = MaterialTheme.typography.bodyMedium, ) Image( imageVector = ImageVector.vectorResource(id = R.drawable.wikipedia_logo), @@ -94,11 +83,7 @@ fun WikimediaScreen( ) Text( text = stringResource(id = R.string.i18n_app_about_community_wikimedia_text_3), - fontSize = ScribeTypography.bodyMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.bodyMedium.fontStyle, - ), + style = MaterialTheme.typography.bodyMedium, ) } } @@ -127,13 +112,8 @@ fun WikimediaScreenContent( Text( text = title, modifier = Modifier.padding(top = 16.dp, bottom = 4.dp), - fontSize = ScribeTypography.headlineMedium.fontSize, - style = - TextStyle.Default.copy( - fontStyle = ScribeTypography.headlineMedium.fontStyle, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurface, - ), + style = MaterialTheme.typography.headlineMedium, + color = MaterialTheme.colorScheme.onSurface, ) Card( shape = RoundedCornerShape(dimensionResource(id = R.dimen.rounded_corner_radius_standard)), diff --git a/app/src/main/java/be/scri/ui/screens/download/DataDownloadScreen.kt b/app/src/main/java/be/scri/ui/screens/download/DataDownloadScreen.kt index 386625f39..9c43716c7 100644 --- a/app/src/main/java/be/scri/ui/screens/download/DataDownloadScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/download/DataDownloadScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner @@ -155,7 +154,7 @@ fun DownloadDataScreen( text = stringResource(R.string.i18n_app_download_menu_ui_update_data), color = MaterialTheme.colorScheme.onBackground, fontWeight = FontWeight.Bold, - fontSize = 22.sp, + style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(start = 16.dp, top = 16.dp, bottom = 10.dp), ) Surface( @@ -197,7 +196,7 @@ fun DownloadDataScreen( text = stringResource(R.string.i18n_app_download_menu_ui_download_data_title), color = MaterialTheme.colorScheme.onBackground, fontWeight = FontWeight.Bold, - fontSize = 22.sp, + style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(start = 16.dp, top = 16.dp, bottom = 10.dp), ) @@ -273,7 +272,7 @@ private fun EmptyStateSection(context: Context) { Text( text = stringResource(R.string.i18n_app_download_menu_ui_no_keyboards_installed), color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.7f), - fontSize = 16.sp, + style = MaterialTheme.typography.bodyMedium, ) } } diff --git a/app/src/main/java/be/scri/ui/theme/Typography.kt b/app/src/main/java/be/scri/ui/theme/Typography.kt index 558e8a480..53b24a53d 100644 --- a/app/src/main/java/be/scri/ui/theme/Typography.kt +++ b/app/src/main/java/be/scri/ui/theme/Typography.kt @@ -27,12 +27,24 @@ fun createTypography(scale: Float): Typography = fontWeight = FontWeight.Bold, fontSize = 20.sp.scaled(scale), ), + titleLarge = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Bold, + fontSize = 22.sp.scaled(scale), + ), titleMedium = TextStyle( fontFamily = FontFamily.SansSerif, fontWeight = FontWeight.Bold, fontSize = 18.sp.scaled(scale), ), + bodyLarge = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Normal, + fontSize = 16.sp.scaled(scale), + ), bodyMedium = TextStyle( fontFamily = FontFamily.SansSerif, @@ -51,6 +63,18 @@ fun createTypography(scale: Float): Typography = fontWeight = FontWeight.Bold, fontSize = 24.sp.scaled(scale), ), + labelMedium = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Normal, + fontSize = 14.sp.scaled(scale), + ), + labelSmall = + TextStyle( + fontFamily = FontFamily.SansSerif, + fontWeight = FontWeight.Normal, + fontSize = 12.sp.scaled(scale), + ), ) val ScribeTypography = createTypography(1f)