diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ed823bd4..cafdc5b3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -194,7 +194,7 @@ dependencies { implementation("androidx.recyclerview:recyclerview:1.3.2") implementation("androidx.cardview:cardview:1.0.0") implementation("androidx.viewpager2:viewpager2:1.1.0") - implementation("com.google.android.play:core:1.10.0") + implementation("com.google.android.play:core:1.10.3") implementation("androidx.navigation:navigation-compose:2.6.0") // Jetpack Compose BOM diff --git a/app/src/main/java/be/scri/App.kt b/app/src/main/java/be/scri/App.kt index 68cba724..867ddc4c 100644 --- a/app/src/main/java/be/scri/App.kt +++ b/app/src/main/java/be/scri/App.kt @@ -31,6 +31,7 @@ import be.scri.ui.common.bottombar.ScribeBottomBar import be.scri.ui.screens.InstallationScreen import be.scri.ui.screens.LanguageSettingsScreen import be.scri.ui.screens.PrivacyPolicyScreen +import be.scri.ui.screens.SelectTranslationSourceLanguageScreen import be.scri.ui.screens.ThirdPartyScreen import be.scri.ui.screens.WikimediaScreen import be.scri.ui.screens.about.AboutScreen @@ -170,9 +171,7 @@ fun ScribeApp( } } - composable( - route = "${Screen.LanguageSettings.route}/{languageName}", - ) { + composable("${Screen.LanguageSettings.route}/{languageName}") { val language = it.arguments?.getString("languageName") if (language != null) { LanguageSettingsScreen( @@ -181,10 +180,24 @@ fun ScribeApp( navController.popBackStack() }, modifier = Modifier.padding(innerPadding), + onTranslationLanguageSelect = { + navController.navigate("translation_language_detail/$language") + }, ) } } + composable("translation_language_detail" + "/{languageName}") { backStackEntry -> + val language = backStackEntry.arguments?.getString("languageName") ?: "" + SelectTranslationSourceLanguageScreen( + onBackNavigation = { + navController.popBackStack() + }, + modifier = Modifier.padding(innerPadding), + currentLanguage = language, + ) + } + composable(Screen.WikimediaScribe.route) { WikimediaScreen( onBackNavigation = { diff --git a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt index bb088e18..d922fcda 100644 --- a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt +++ b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt @@ -13,10 +13,28 @@ import android.content.res.Configuration import android.widget.Toast import androidx.appcompat.app.AppCompatActivity.UI_MODE_SERVICE import androidx.appcompat.app.AppCompatDelegate +import androidx.core.content.edit import be.scri.extensions.config @Suppress("TooManyFunctions") object PreferencesHelper { + fun setTranslationSourceLanguage( + context: Context, + language: String, + translationSource: String, + ) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + sharedPref.edit { putString("translation_source_$language", translationSource) } + } + + fun getTranslationSourceLanguage( + context: Context, + language: String, + ): String { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + return sharedPref.getString("translation_source_$language", "English") ?: "English" + } + fun setPeriodOnSpaceBarDoubleTapPreference( context: Context, language: String, diff --git a/app/src/main/java/be/scri/navigation/Screen.kt b/app/src/main/java/be/scri/navigation/Screen.kt index a07e8c35..0cf81348 100644 --- a/app/src/main/java/be/scri/navigation/Screen.kt +++ b/app/src/main/java/be/scri/navigation/Screen.kt @@ -18,4 +18,6 @@ sealed class Screen( data object WikimediaScribe : Screen("wikimedia_scribe_screen") data object ThirdParty : Screen("third_party_screen") + + data object TranslationSource : Screen("select_language_screen") } diff --git a/app/src/main/java/be/scri/ui/screens/LanguageSettingsScreen.kt b/app/src/main/java/be/scri/ui/screens/LanguageSettingsScreen.kt index a3367a50..0ed5a865 100644 --- a/app/src/main/java/be/scri/ui/screens/LanguageSettingsScreen.kt +++ b/app/src/main/java/be/scri/ui/screens/LanguageSettingsScreen.kt @@ -8,6 +8,7 @@ package be.scri.ui.screens import android.annotation.SuppressLint import android.content.Context +import android.util.Log import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height @@ -33,6 +34,7 @@ import be.scri.ui.models.ScribeItemList fun LanguageSettingsScreen( language: String, onBackNavigation: () -> Unit, + onTranslationLanguageSelect: () -> Unit, modifier: Modifier = Modifier, ) { val context = LocalContext.current @@ -103,6 +105,14 @@ fun LanguageSettingsScreen( ) } + val translationSourceLanguageList = + ScribeItemList( + items = + getTranslationSourceLanguageListData { + onTranslationLanguageSelect() + }, + ) + val layoutList = ScribeItemList( items = @@ -182,6 +192,10 @@ fun LanguageSettingsScreen( Modifier .verticalScroll(scrollState), ) { + ItemCardContainerWithTitle( + title = stringResource(R.string.app_settings_keyboard_translation_select_source), + cardItemsList = translationSourceLanguageList, + ) ItemCardContainerWithTitle( title = stringResource(R.string.app_settings_keyboard_layout_title), cardItemsList = layoutList, @@ -289,3 +303,20 @@ fun getLanguageStringFromi18n(language: String): Int { ) return languageMap[language] ?: R.string.app__global_english } + +@Composable +private fun getTranslationSourceLanguageListData(onTranslationLanguageSelect: () -> Unit): List { + val list: MutableList = mutableListOf() + list.add( + ScribeItem.ClickableItem( + title = R.string.app_settings_keyboard_translation_select_source, + desc = R.string.app_settings_keyboard_translation_select_source_description, + action = { + Log.d("Navigation", "onTranslationLanguageSelect clicked") + onTranslationLanguageSelect() + }, + ), + ) + + return list +} diff --git a/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt b/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt new file mode 100644 index 00000000..ec2de792 --- /dev/null +++ b/app/src/main/java/be/scri/ui/screens/SelectLanguageScreen.kt @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +/** + * The Select Languages subpage is for selecting the translation source language. + */ +package be.scri.ui.screens + +import android.content.Context +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +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.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.core.content.edit +import be.scri.R +import be.scri.ui.common.ScribeBaseScreen + +@Composable +fun SelectTranslationSourceLanguageScreen( + currentLanguage: String, + onBackNavigation: () -> Unit, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + var selectedLanguage = + remember { + mutableStateOf(sharedPref.getString("translation_source_$currentLanguage", "English") ?: "English") + } + + val scrollState = rememberScrollState() + val options = + listOf("English", "German", "French", "Spanish", "Italian", "Russian", "Portuguese", "Swedish") + .filterNot { it == getDisplayLanguageName(currentLanguage) } + ScribeBaseScreen( + pageTitle = stringResource(R.string.app_settings_keyboard_translation_select_source_title), + lastPage = stringResource(id = getLanguageStringFromi18n(currentLanguage)), + onBackNavigation = onBackNavigation, + modifier = modifier, + ) { + Column( + modifier = + Modifier + .padding(16.dp) + .verticalScroll(scrollState) + .background(MaterialTheme.colorScheme.background), + ) { + Text( + text = stringResource(R.string.app_settings_keyboard_translation_select_source_caption), + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(bottom = 12.dp), + ) + + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), + elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), + ) { + Column(modifier = Modifier.padding(8.dp)) { + options.forEachIndexed { index, option -> + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .clickable { + selectedLanguage.value = option + sharedPref.edit { putString("translation_source_$currentLanguage", option) } + }.padding(vertical = 5.dp, horizontal = 8.dp), + ) { + Text( + text = getDisplayLanguageName(option), + style = MaterialTheme.typography.bodyLarge, + ) + Spacer(modifier = Modifier.weight(1f)) + RadioButton( + selected = (option == selectedLanguage.value), + onClick = { + selectedLanguage.value = option + sharedPref.edit { putString("translation_source_$currentLanguage", option) } + }, + ) + } + + if (index < options.lastIndex) { + Divider(color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f)) + } + } + } + } + } + } +} + +@Composable +private fun getDisplayLanguageName(language: String): String = + when (language) { + "English" -> stringResource(R.string.app__global_english) + "German" -> stringResource(R.string.app__global_german) + "French" -> stringResource(R.string.app__global_french) + "Spanish" -> stringResource(R.string.app__global_spanish) + "Italian" -> stringResource(R.string.app__global_italian) + "Russian" -> stringResource(R.string.app__global_russian) + "Portuguese" -> stringResource(R.string.app__global_portuguese) + "Swedish" -> stringResource(R.string.app__global_swedish) + else -> language + } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 460dfd10..ddb9df32 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1527,7 +1527,7 @@ How we work together Wikimedia Logo Suggestion - + @string/january @string/february