Skip to content

Commit

Permalink
Merge pull request #726 from myoshita/fix/language-settings
Browse files Browse the repository at this point in the history
Fix language settings
  • Loading branch information
takahirom authored Oct 9, 2021
2 parents 115f6e3 + a29f7fa commit d8fa6a8
Show file tree
Hide file tree
Showing 16 changed files with 149 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.browser.customtabs.CustomTabsIntent
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.core.view.WindowCompat
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import io.github.droidkaigi.feeder.core.language.ProvideLangSetting
import io.github.droidkaigi.feeder.viewmodel.ProvideViewModels
import io.github.droidkaigi.feeder.viewmodel.RealAppViewModel
import kotlinx.coroutines.flow.launchIn
Expand Down Expand Up @@ -58,8 +61,11 @@ class MainActivity : AppCompatActivity() {

private fun setup() {
setContent {
val state by appViewModel.state.collectAsState()
ProvideViewModels {
DroidKaigiApp()
ProvideLangSetting(state.language) {
DroidKaigiApp()
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ allprojects {
targetExclude('bin/**/*.kt')
targetExclude("**/generated/**/*.kt")

ktlint("0.39.0")
ktlint("0.42.1")
.userData([android: "true", experimental: "true"])
}
}
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/java/Dep.kt
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ object Dep {
}

const val datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.1.1"
const val ktlint = "com.pinterest:ktlint:0.40.0"
const val ktlint = "com.pinterest:ktlint:0.42.1"
const val exhaustivePlugin = "app.cash.exhaustive:exhaustive-gradle:0.2.0"

object Dagger {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ data class MultiLangText(
enTitle
}
}

companion object
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.github.droidkaigi.feeder.core.language

import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.compositionLocalOf
import io.github.droidkaigi.feeder.Lang

val LocalLangSetting = LangSettingProvidableCompositionLocal()

@Composable
fun ProvideLangSetting(language: Lang?, content: @Composable () -> Unit) {
CompositionLocalProvider(LocalLangSetting provides language) {
content()
}
}

@JvmInline
value class LangSettingProvidableCompositionLocal internal constructor(
private val delegate: ProvidableCompositionLocal<Lang?> = compositionLocalOf { null },
) {
val current: Lang
@Composable get() = delegate.current ?: Lang.SYSTEM

infix fun provides(value: Lang?) = delegate provides value

infix fun providesDefault(value: Lang?) = delegate providesDefault value
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package io.github.droidkaigi.feeder.core.language

import android.content.Context
import androidx.compose.runtime.Composable
import io.github.droidkaigi.feeder.Lang
import io.github.droidkaigi.feeder.MultiLangText
import io.github.droidkaigi.feeder.core.R

fun Lang?.getTitle(context: Context): String = when (this) {
Lang.SYSTEM -> context.getString(R.string.system)
Lang.JA -> context.getString(R.string.ja)
Lang.EN -> context.getString(R.string.en)
else -> context.getString(R.string.system)
@Composable
fun Lang?.getTitle(): String {
val res = when (this) {
Lang.SYSTEM -> R.string.system
Lang.JA -> R.string.ja
Lang.EN -> R.string.en
else -> R.string.system
}
return MultiLangText.from(res).getTextWithSetting()
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
package io.github.droidkaigi.feeder.core.theme

import android.content.Context
import androidx.compose.runtime.Composable
import io.github.droidkaigi.feeder.MultiLangText
import io.github.droidkaigi.feeder.Theme
import io.github.droidkaigi.feeder.core.R
import io.github.droidkaigi.feeder.core.language.from
import io.github.droidkaigi.feeder.core.language.getTextWithSetting

fun Theme?.getTitle(context: Context): String = when (this) {
Theme.SYSTEM -> context.getString(R.string.system)
Theme.DARK -> context.getString(R.string.dark)
Theme.LIGHT -> context.getString(R.string.light)
else -> context.getString(R.string.system)
@Composable
fun Theme?.getTitle(): String {
val res = when (this) {
Theme.SYSTEM -> R.string.system
Theme.DARK -> R.string.dark
Theme.LIGHT -> R.string.light
else -> R.string.system
}
return MultiLangText.from(res).getTextWithSetting()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.github.droidkaigi.feeder.core.language

import android.content.res.Configuration
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import io.github.droidkaigi.feeder.Lang
import io.github.droidkaigi.feeder.MultiLangText
import java.util.Locale

@Composable
fun MultiLangText.getTextWithSetting(): String {
return when (val lang = LocalLangSetting.current) {
Lang.SYSTEM -> currentLangTitle
else -> getByLang(lang)
}
}

@Composable
fun MultiLangText.Companion.from(
@StringRes res: Int,
): MultiLangText {
val context = LocalContext.current
val jaConfiguration = Configuration(context.resources.configuration).apply {
setLocale(Locale.JAPAN)
}
val enConfiguration = Configuration(context.resources.configuration).apply {
setLocale(Locale.ENGLISH)
}
return MultiLangText(
jaTitle = context.createConfigurationContext(jaConfiguration).getString(res),
enTitle = context.createConfigurationContext(enConfiguration).getString(res),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import io.github.droidkaigi.feeder.core.NetworkImage
import io.github.droidkaigi.feeder.core.animation.FavoriteAnimation
import io.github.droidkaigi.feeder.core.animation.painterFavorite
import io.github.droidkaigi.feeder.core.animation.painterFavoriteBorder
import io.github.droidkaigi.feeder.core.language.getTextWithSetting
import io.github.droidkaigi.feeder.core.theme.ConferenceAppFeederTheme
import io.github.droidkaigi.feeder.core.theme.typography
import io.github.droidkaigi.feeder.fakeFeedContents
Expand Down Expand Up @@ -136,7 +137,7 @@ fun FeedItem(
end.linkTo(parent.end, 16.dp)
width = Dimension.fillToConstraints
},
text = feedItem.title.currentLangTitle,
text = feedItem.title.getTextWithSetting(),
style = TextStyle(fontWeight = FontWeight.Bold, fontSize = 16.sp),
maxLines = 2,
overflow = TextOverflow.Ellipsis
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import io.github.droidkaigi.feeder.core.NetworkImage
import io.github.droidkaigi.feeder.core.animation.FavoriteAnimation
import io.github.droidkaigi.feeder.core.animation.painterFavorite
import io.github.droidkaigi.feeder.core.animation.painterFavoriteBorder
import io.github.droidkaigi.feeder.core.language.getTextWithSetting
import io.github.droidkaigi.feeder.core.theme.ConferenceAppFeederTheme
import io.github.droidkaigi.feeder.core.theme.typography
import io.github.droidkaigi.feeder.fakeFeedContents
Expand Down Expand Up @@ -77,7 +78,7 @@ fun FirstFeedItem(
end.linkTo(favorite.start, 20.dp)
width = Dimension.fillToConstraints
},
text = feedItem.title.jaTitle,
text = feedItem.title.getTextWithSetting(),
style = typography.h5,
maxLines = 2,
overflow = TextOverflow.Ellipsis
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ interface AppViewModel :
AppViewModel.State> {
data class State(
val theme: Theme? = Theme.SYSTEM,
val language: Lang? = Lang.SYSTEM,
)

sealed class Effect {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,33 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.droidkaigi.feeder.AppViewModel
import io.github.droidkaigi.feeder.repository.LanguageRepository
import io.github.droidkaigi.feeder.repository.ThemeRepository
import javax.inject.Inject
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.stateIn
import javax.inject.Inject

@HiltViewModel
class RealAppViewModel @Inject constructor(
private val repository: ThemeRepository,
private val themeRepository: ThemeRepository,
private val languageRepository: LanguageRepository,
) : ViewModel(), AppViewModel {
private val effectChannel = Channel<AppViewModel.Effect>(Channel.UNLIMITED)
override val effect: Flow<AppViewModel.Effect> = effectChannel.receiveAsFlow()

override val state: StateFlow<AppViewModel.State> =
repository.theme().map { AppViewModel.State(theme = it) }
.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = AppViewModel.State()
)
combine(themeRepository.theme(), languageRepository.language()) { theme, language ->
AppViewModel.State(theme = theme, language = language)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = AppViewModel.State()
)

override fun event(event: AppViewModel.Event) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
Expand All @@ -26,12 +26,13 @@ class RealSettingViewModel @Inject constructor(
override val effect: Flow<SettingViewModel.Effect> = effectChannel.receiveAsFlow()

override val state: StateFlow<SettingViewModel.State> =
themeRepository.theme().map { SettingViewModel.State(theme = it) }
.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = SettingViewModel.State()
)
combine(themeRepository.theme(), languageRepository.language()) { theme, language ->
SettingViewModel.State(theme = theme, language = language)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = SettingViewModel.State()
)

override fun event(event: SettingViewModel.Event) {
viewModelScope.launch {
Expand Down
Loading

0 comments on commit d8fa6a8

Please sign in to comment.