session-android/app/src/main/java/org/thoughtcrime/securesms/ui/Themes.kt

79 lines
2.3 KiB
Kotlin
Raw Normal View History

2023-06-29 09:41:11 +02:00
package org.thoughtcrime.securesms.ui
import android.content.Context
import androidx.annotation.AttrRes
2023-07-09 16:42:42 +02:00
import androidx.appcompat.view.ContextThemeWrapper
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.material.MaterialTheme
2023-06-29 09:41:11 +02:00
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.staticCompositionLocalOf
2023-07-09 16:42:42 +02:00
import androidx.compose.ui.Modifier
2023-06-29 09:41:11 +02:00
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
2023-07-09 16:42:42 +02:00
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
2023-06-29 09:41:11 +02:00
import com.google.accompanist.themeadapter.appcompat.AppCompatTheme
import com.google.android.material.color.MaterialColors
import network.loki.messenger.R
val LocalExtraColors = staticCompositionLocalOf<ExtraColors> { error("No Custom Attribute value provided") }
val LocalPreviewMode = staticCompositionLocalOf { false }
2023-06-29 09:41:11 +02:00
2023-07-09 17:35:09 +02:00
2023-06-29 09:41:11 +02:00
data class ExtraColors(
val settingsBackground: Color,
)
2023-07-09 17:35:09 +02:00
/**
* Converts current Theme to Compose Theme.
*/
2023-06-29 09:41:11 +02:00
@Composable
fun AppTheme(
content: @Composable () -> Unit
) {
val extraColors = LocalContext.current.run {
ExtraColors(
2023-07-09 16:42:42 +02:00
settingsBackground = getColorFromTheme(R.attr.colorSettingsBackground),
2023-06-29 09:41:11 +02:00
)
}
CompositionLocalProvider(LocalExtraColors provides extraColors) {
AppCompatTheme {
content()
}
}
}
2023-07-09 16:42:42 +02:00
2023-07-09 17:35:09 +02:00
fun Context.getColorFromTheme(@AttrRes attr: Int, defaultValue: Int = 0x0): Color =
MaterialColors.getColor(this, attr, defaultValue).let(::Color)
2023-07-09 16:42:42 +02:00
2023-07-09 17:35:09 +02:00
/**
* Set the theme and a background for Compose Previews.
*/
2023-07-09 16:42:42 +02:00
@Composable
2023-07-09 17:35:09 +02:00
fun PreviewTheme(
themeResId: Int,
content: @Composable () -> Unit
) {
2023-07-09 16:42:42 +02:00
CompositionLocalProvider(
LocalContext provides ContextThemeWrapper(LocalContext.current, themeResId),
LocalPreviewMode provides true
2023-07-09 16:42:42 +02:00
) {
AppTheme {
2023-07-09 17:35:09 +02:00
Box(modifier = Modifier.background(color = MaterialTheme.colors.background)) {
content()
}
2023-07-09 16:42:42 +02:00
}
}
}
class ThemeResPreviewParameterProvider : PreviewParameterProvider<Int> {
override val values = sequenceOf(
R.style.Classic_Dark,
R.style.Classic_Light,
R.style.Ocean_Dark,
R.style.Ocean_Light,
)
}