2022-06-08 07:22:09 -07:00
|
|
|
package co.electriccoin.zcash.ui.design.component
|
|
|
|
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.os.LocaleList
|
|
|
|
import android.view.ContextThemeWrapper
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
import androidx.compose.runtime.CompositionLocalProvider
|
|
|
|
import androidx.compose.runtime.collectAsState
|
|
|
|
import androidx.compose.ui.platform.LocalConfiguration
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
import kotlinx.coroutines.flow.StateFlow
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Wrap a Composable with a way to override the Android Configuration. This is primarily useful
|
|
|
|
* for automated tests.
|
|
|
|
*/
|
|
|
|
@Composable
|
2023-12-11 01:20:32 -08:00
|
|
|
fun Override(
|
|
|
|
configurationOverrideFlow: StateFlow<ConfigurationOverride?>,
|
|
|
|
content: @Composable () -> Unit
|
|
|
|
) {
|
2022-06-08 07:22:09 -07:00
|
|
|
val configurationOverride = configurationOverrideFlow.collectAsState().value
|
|
|
|
|
|
|
|
if (null == configurationOverride) {
|
|
|
|
content()
|
|
|
|
} else {
|
|
|
|
val configuration = configurationOverride.newConfiguration(LocalConfiguration.current)
|
|
|
|
|
2023-12-11 01:20:32 -08:00
|
|
|
val contextWrapper =
|
|
|
|
run {
|
|
|
|
val context = LocalContext.current
|
|
|
|
object : ContextThemeWrapper() {
|
|
|
|
init {
|
|
|
|
attachBaseContext(context)
|
|
|
|
applyOverrideConfiguration(configuration)
|
|
|
|
}
|
2022-06-08 07:22:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CompositionLocalProvider(
|
|
|
|
LocalConfiguration provides configuration,
|
|
|
|
LocalContext provides contextWrapper
|
|
|
|
) {
|
|
|
|
content()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
data class ConfigurationOverride(val uiMode: UiMode?, val locale: LocaleList?) {
|
2023-12-11 01:20:32 -08:00
|
|
|
fun newConfiguration(fromConfiguration: Configuration) =
|
|
|
|
Configuration(fromConfiguration).apply {
|
|
|
|
this@ConfigurationOverride.uiMode?.let {
|
|
|
|
uiMode = (uiMode and Configuration.UI_MODE_NIGHT_MASK.inv()) or it.flag()
|
|
|
|
}
|
2022-06-08 07:22:09 -07:00
|
|
|
|
2023-12-11 01:20:32 -08:00
|
|
|
this@ConfigurationOverride.locale?.let {
|
|
|
|
setLocales(it)
|
|
|
|
}
|
2022-06-08 07:22:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
enum class UiMode {
|
2023-02-01 04:50:24 -08:00
|
|
|
Light,
|
|
|
|
Dark
|
2022-06-08 07:22:09 -07:00
|
|
|
}
|
|
|
|
|
2023-12-11 01:20:32 -08:00
|
|
|
private fun UiMode.flag() =
|
|
|
|
when (this) {
|
|
|
|
UiMode.Light -> Configuration.UI_MODE_NIGHT_NO
|
|
|
|
UiMode.Dark -> Configuration.UI_MODE_NIGHT_YES
|
|
|
|
}
|