Skip to content

Commit dc2e18b

Browse files
authored
Add languages settings (#52)
1 parent a225513 commit dc2e18b

File tree

13 files changed

+265
-30
lines changed

13 files changed

+265
-30
lines changed

app/src/main/java/me/ash/reader/App.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ class App : Application(), Configuration.Provider {
7777
}
7878
}
7979

80+
private fun dataStoreInit() {
81+
}
82+
8083
private suspend fun accountInit() {
8184
if (accountRepository.isNoAccount()) {
8285
val account = accountRepository.addDefaultAccount()
@@ -85,9 +88,6 @@ class App : Application(), Configuration.Provider {
8588
}
8689
}
8790

88-
private fun dataStoreInit() {
89-
}
90-
9191
private fun workerInit() {
9292
rssRepository.get().doSync()
9393
}

app/src/main/java/me/ash/reader/MainActivity.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ import coil.memory.MemoryCache
1818
import coil.request.*
1919
import dagger.hilt.android.AndroidEntryPoint
2020
import kotlinx.coroutines.CompletableDeferred
21+
import me.ash.reader.data.preference.LanguagesPreference
2122
import me.ash.reader.data.preference.SettingsProvider
23+
import me.ash.reader.ui.ext.languages
2224
import me.ash.reader.ui.page.common.HomeEntry
2325

2426
@AndroidEntryPoint
@@ -28,6 +30,13 @@ class MainActivity : ComponentActivity(), ImageLoader {
2830
super.onCreate(savedInstanceState)
2931
WindowCompat.setDecorFitsSystemWindows(window, false)
3032
Log.i("RLog", "onCreate: ${ProfileInstallerInitializer().create(this)}")
33+
34+
// Set the language
35+
LanguagesPreference.fromValue(languages).let {
36+
if (it == LanguagesPreference.UseDeviceLanguages) return@let
37+
it.setLocale(this)
38+
}
39+
3140
setContent {
3241
SettingsProvider {
3342
HomeEntry()
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package me.ash.reader.data.preference
2+
3+
import android.content.Context
4+
import android.os.LocaleList
5+
import android.util.Log
6+
import androidx.datastore.preferences.core.Preferences
7+
import kotlinx.coroutines.CoroutineScope
8+
import kotlinx.coroutines.launch
9+
import me.ash.reader.R
10+
import me.ash.reader.ui.ext.DataStoreKeys
11+
import me.ash.reader.ui.ext.dataStore
12+
import me.ash.reader.ui.ext.put
13+
import java.util.*
14+
15+
sealed class LanguagesPreference(val value: Int) : Preference() {
16+
object UseDeviceLanguages : LanguagesPreference(0)
17+
object English : LanguagesPreference(1)
18+
object ChineseSimplified : LanguagesPreference(2)
19+
20+
override fun put(context: Context, scope: CoroutineScope) {
21+
scope.launch {
22+
context.dataStore.put(
23+
DataStoreKeys.Languages,
24+
value
25+
)
26+
setLocale(context)
27+
}
28+
}
29+
30+
fun getDesc(context: Context): String =
31+
when (this) {
32+
UseDeviceLanguages -> context.getString(R.string.use_device_languages)
33+
English -> context.getString(R.string.english)
34+
ChineseSimplified -> context.getString(R.string.chinese_simplified)
35+
}
36+
37+
fun getLocale(): Locale =
38+
when (this) {
39+
UseDeviceLanguages -> LocaleList.getDefault().get(0)
40+
English -> Locale("en", "US")
41+
ChineseSimplified -> Locale("zh", "CN")
42+
}
43+
44+
fun setLocale(context: Context) {
45+
val locale = getLocale()
46+
47+
Log.i("Rlog", "setLocale: $locale, ${LocaleList.getDefault().get(0)}")
48+
49+
val resources = context.resources
50+
val metrics = resources.displayMetrics
51+
val configuration = resources.configuration
52+
configuration.setLocale(locale)
53+
configuration.setLocales(LocaleList(locale))
54+
context.createConfigurationContext(configuration)
55+
resources.updateConfiguration(configuration, metrics)
56+
57+
val appResources = context.applicationContext.resources
58+
val appMetrics = appResources.displayMetrics
59+
val appConfiguration = appResources.configuration
60+
appConfiguration.setLocale(locale)
61+
appConfiguration.setLocales(LocaleList(locale))
62+
context.applicationContext.createConfigurationContext(appConfiguration)
63+
appResources.updateConfiguration(appConfiguration, appMetrics)
64+
}
65+
66+
companion object {
67+
val default = UseDeviceLanguages
68+
val values = listOf(UseDeviceLanguages, English, ChineseSimplified)
69+
70+
fun fromPreferences(preferences: Preferences): LanguagesPreference =
71+
when (preferences[DataStoreKeys.Languages.key]) {
72+
0 -> UseDeviceLanguages
73+
1 -> English
74+
2 -> ChineseSimplified
75+
else -> default
76+
}
77+
78+
fun fromValue(value: Int): LanguagesPreference =
79+
when (value) {
80+
0 -> UseDeviceLanguages
81+
1 -> English
82+
2 -> ChineseSimplified
83+
else -> default
84+
}
85+
}
86+
}

app/src/main/java/me/ash/reader/data/preference/Settings.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ data class Settings(
3737
val flowArticleListTime: FlowArticleListTimePreference = FlowArticleListTimePreference.default,
3838
val flowArticleListDateStickyHeader: FlowArticleListDateStickyHeaderPreference = FlowArticleListDateStickyHeaderPreference.default,
3939
val flowArticleListTonalElevation: FlowArticleListTonalElevationPreference = FlowArticleListTonalElevationPreference.default,
40+
41+
val languages: LanguagesPreference = LanguagesPreference.default,
4042
)
4143

4244
fun Preferences.toSettings(): Settings {
@@ -68,6 +70,8 @@ fun Preferences.toSettings(): Settings {
6870
this
6971
),
7072
flowArticleListTonalElevation = FlowArticleListTonalElevationPreference.fromPreferences(this),
73+
74+
languages = LanguagesPreference.fromPreferences(this),
7175
)
7276
}
7377

@@ -109,6 +113,8 @@ fun SettingsProvider(
109113
LocalFlowFilterBarFilled provides settings.flowFilterBarFilled,
110114
LocalFlowFilterBarPadding provides settings.flowFilterBarPadding,
111115
LocalFlowFilterBarTonalElevation provides settings.flowFilterBarTonalElevation,
116+
117+
LocalLanguages provides settings.languages,
112118
) {
113119
content()
114120
}
@@ -162,3 +168,6 @@ val LocalFlowArticleListDateStickyHeader =
162168
compositionLocalOf<FlowArticleListDateStickyHeaderPreference> { FlowArticleListDateStickyHeaderPreference.default }
163169
val LocalFlowArticleListTonalElevation =
164170
compositionLocalOf<FlowArticleListTonalElevationPreference> { FlowArticleListTonalElevationPreference.default }
171+
172+
val LocalLanguages =
173+
compositionLocalOf<LanguagesPreference> { LanguagesPreference.default }

app/src/main/java/me/ash/reader/ui/component/Banner.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.compose.ui.graphics.Color
2424
import androidx.compose.ui.graphics.vector.ImageVector
2525
import androidx.compose.ui.platform.LocalView
2626
import androidx.compose.ui.text.style.TextOverflow
27+
import androidx.compose.ui.unit.Dp
2728
import androidx.compose.ui.unit.dp
2829
import androidx.compose.ui.unit.sp
2930
import me.ash.reader.ui.theme.palette.alwaysLight
@@ -43,7 +44,7 @@ fun Banner(
4344
Surface(
4445
modifier = modifier
4546
.fillMaxWidth()
46-
.height(88.dp),
47+
.height(if (!desc.isNullOrBlank()) 88.dp else Dp.Unspecified),
4748
color = Color.Unspecified,
4849
) {
4950
Row(

app/src/main/java/me/ash/reader/ui/ext/DataStoreExt.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ val Context.initialPage: Int
3939
val Context.initialFilter: Int
4040
get() = this.dataStore.get(DataStoreKeys.InitialFilter) ?: 2
4141

42+
val Context.languages: Int
43+
get() = this.dataStore.get(DataStoreKeys.Languages) ?: 0
44+
4245
suspend fun <T> DataStore<Preferences>.put(dataStoreKeys: DataStoreKeys<T>, value: T) {
4346
this.edit {
4447
withContext(Dispatchers.IO) {
@@ -244,4 +247,9 @@ sealed class DataStoreKeys<T> {
244247
override val key: Preferences.Key<Int>
245248
get() = intPreferencesKey("initialFilter")
246249
}
250+
251+
object Languages : DataStoreKeys<Int>() {
252+
override val key: Preferences.Key<Int>
253+
get() = intPreferencesKey("languages")
254+
}
247255
}

app/src/main/java/me/ash/reader/ui/page/common/HomeEntry.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import me.ash.reader.ui.page.settings.color.DarkTheme
2727
import me.ash.reader.ui.page.settings.color.feeds.FeedsPageStyle
2828
import me.ash.reader.ui.page.settings.color.flow.FlowPageStyle
2929
import me.ash.reader.ui.page.settings.interaction.Interaction
30+
import me.ash.reader.ui.page.settings.languages.Languages
3031
import me.ash.reader.ui.page.settings.tips.TipsAndSupport
3132
import me.ash.reader.ui.page.startup.StartupPage
3233
import me.ash.reader.ui.theme.AppTheme
@@ -146,6 +147,11 @@ fun HomeEntry(
146147
Interaction(navController)
147148
}
148149

150+
// Languages
151+
animatedComposable(route = RouteName.LANGUAGES) {
152+
Languages(navController = navController)
153+
}
154+
149155
// Tips & Support
150156
animatedComposable(route = RouteName.TIPS_AND_SUPPORT) {
151157
TipsAndSupport(navController)

app/src/main/java/me/ash/reader/ui/page/common/RouteName.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ object RouteName {
2121
// Interaction
2222
const val INTERACTION = "interaction"
2323

24+
// Languages
25+
const val LANGUAGES = "languages"
26+
2427
// Tips & Support
2528
const val TIPS_AND_SUPPORT = "tips_and_support"
2629
}

app/src/main/java/me/ash/reader/ui/page/settings/SettingsPage.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,11 @@ fun SettingsPage(
143143
title = stringResource(R.string.languages),
144144
desc = stringResource(R.string.languages_desc),
145145
icon = Icons.Outlined.Language,
146-
enable = false,
147-
) {}
146+
) {
147+
navController.navigate(RouteName.LANGUAGES) {
148+
launchSingleTop = true
149+
}
150+
}
148151
}
149152
item {
150153
SelectableSettingGroupItem(
@@ -156,6 +159,7 @@ fun SettingsPage(
156159
launchSingleTop = true
157160
}
158161
}
162+
Spacer(modifier = Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars))
159163
}
160164
}
161165
}

app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPageStyle.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ fun FlowPageStyle(
153153
text = stringResource(R.string.article_list)
154154
)
155155
SettingItem(
156-
title = stringResource(R.string.display_feed_favicon),
156+
title = stringResource(R.string.feed_favicons),
157157
onClick = {
158158
(!articleListFeedIcon).put(context, scope)
159159
},
@@ -163,7 +163,7 @@ fun FlowPageStyle(
163163
}
164164
}
165165
SettingItem(
166-
title = stringResource(R.string.display_feed_name),
166+
title = stringResource(R.string.feed_names),
167167
onClick = {
168168
(!articleListFeedName).put(context, scope)
169169
},
@@ -173,14 +173,14 @@ fun FlowPageStyle(
173173
}
174174
}
175175
SettingItem(
176-
title = stringResource(R.string.display_article_image),
176+
title = stringResource(R.string.article_images),
177177
enable = false,
178178
onClick = {},
179179
) {
180180
Switch(activated = false, enable = false)
181181
}
182182
SettingItem(
183-
title = stringResource(R.string.display_article_desc),
183+
title = stringResource(R.string.article_desc),
184184
onClick = {
185185
(!articleListDesc).put(context, scope)
186186
},
@@ -190,7 +190,7 @@ fun FlowPageStyle(
190190
}
191191
}
192192
SettingItem(
193-
title = stringResource(R.string.display_article_date),
193+
title = stringResource(R.string.article_date),
194194
onClick = {
195195
(!articleListTime).put(context, scope)
196196
},

0 commit comments

Comments
 (0)