|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package com.google.ai.edge.gallery.ui.theme
|
|
|
|
|
|
import android.app.Activity
|
|
|
import androidx.compose.foundation.isSystemInDarkTheme
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
import androidx.compose.material3.darkColorScheme
|
|
|
import androidx.compose.material3.lightColorScheme
|
|
|
import androidx.compose.runtime.Composable
|
|
|
import androidx.compose.runtime.CompositionLocalProvider
|
|
|
import androidx.compose.runtime.Immutable
|
|
|
import androidx.compose.runtime.ReadOnlyComposable
|
|
|
import androidx.compose.runtime.SideEffect
|
|
|
import androidx.compose.runtime.staticCompositionLocalOf
|
|
|
import androidx.compose.ui.graphics.Color
|
|
|
import androidx.compose.ui.platform.LocalView
|
|
|
import androidx.core.view.WindowCompat
|
|
|
import com.google.ai.edge.gallery.proto.Theme
|
|
|
|
|
|
private val lightScheme =
|
|
|
lightColorScheme(
|
|
|
primary = primaryLight,
|
|
|
onPrimary = onPrimaryLight,
|
|
|
primaryContainer = primaryContainerLight,
|
|
|
onPrimaryContainer = onPrimaryContainerLight,
|
|
|
secondary = secondaryLight,
|
|
|
onSecondary = onSecondaryLight,
|
|
|
secondaryContainer = secondaryContainerLight,
|
|
|
onSecondaryContainer = onSecondaryContainerLight,
|
|
|
tertiary = tertiaryLight,
|
|
|
onTertiary = onTertiaryLight,
|
|
|
tertiaryContainer = tertiaryContainerLight,
|
|
|
onTertiaryContainer = onTertiaryContainerLight,
|
|
|
error = errorLight,
|
|
|
onError = onErrorLight,
|
|
|
errorContainer = errorContainerLight,
|
|
|
onErrorContainer = onErrorContainerLight,
|
|
|
background = backgroundLight,
|
|
|
onBackground = onBackgroundLight,
|
|
|
surface = surfaceLight,
|
|
|
onSurface = onSurfaceLight,
|
|
|
surfaceVariant = surfaceVariantLight,
|
|
|
onSurfaceVariant = onSurfaceVariantLight,
|
|
|
outline = outlineLight,
|
|
|
outlineVariant = outlineVariantLight,
|
|
|
scrim = scrimLight,
|
|
|
inverseSurface = inverseSurfaceLight,
|
|
|
inverseOnSurface = inverseOnSurfaceLight,
|
|
|
inversePrimary = inversePrimaryLight,
|
|
|
surfaceDim = surfaceDimLight,
|
|
|
surfaceBright = surfaceBrightLight,
|
|
|
surfaceContainerLowest = surfaceContainerLowestLight,
|
|
|
surfaceContainerLow = surfaceContainerLowLight,
|
|
|
surfaceContainer = surfaceContainerLight,
|
|
|
surfaceContainerHigh = surfaceContainerHighLight,
|
|
|
surfaceContainerHighest = surfaceContainerHighestLight,
|
|
|
)
|
|
|
|
|
|
private val darkScheme =
|
|
|
darkColorScheme(
|
|
|
primary = primaryDark,
|
|
|
onPrimary = onPrimaryDark,
|
|
|
primaryContainer = primaryContainerDark,
|
|
|
onPrimaryContainer = onPrimaryContainerDark,
|
|
|
secondary = secondaryDark,
|
|
|
onSecondary = onSecondaryDark,
|
|
|
secondaryContainer = secondaryContainerDark,
|
|
|
onSecondaryContainer = onSecondaryContainerDark,
|
|
|
tertiary = tertiaryDark,
|
|
|
onTertiary = onTertiaryDark,
|
|
|
tertiaryContainer = tertiaryContainerDark,
|
|
|
onTertiaryContainer = onTertiaryContainerDark,
|
|
|
error = errorDark,
|
|
|
onError = onErrorDark,
|
|
|
errorContainer = errorContainerDark,
|
|
|
onErrorContainer = onErrorContainerDark,
|
|
|
background = backgroundDark,
|
|
|
onBackground = onBackgroundDark,
|
|
|
surface = surfaceDark,
|
|
|
onSurface = onSurfaceDark,
|
|
|
surfaceVariant = surfaceVariantDark,
|
|
|
onSurfaceVariant = onSurfaceVariantDark,
|
|
|
outline = outlineDark,
|
|
|
outlineVariant = outlineVariantDark,
|
|
|
scrim = scrimDark,
|
|
|
inverseSurface = inverseSurfaceDark,
|
|
|
inverseOnSurface = inverseOnSurfaceDark,
|
|
|
inversePrimary = inversePrimaryDark,
|
|
|
surfaceDim = surfaceDimDark,
|
|
|
surfaceBright = surfaceBrightDark,
|
|
|
surfaceContainerLowest = surfaceContainerLowestDark,
|
|
|
surfaceContainerLow = surfaceContainerLowDark,
|
|
|
surfaceContainer = surfaceContainerDark,
|
|
|
surfaceContainerHigh = surfaceContainerHighDark,
|
|
|
surfaceContainerHighest = surfaceContainerHighestDark,
|
|
|
)
|
|
|
|
|
|
@Immutable
|
|
|
data class CustomColors(
|
|
|
val appTitleGradientColors: List<Color> = listOf(),
|
|
|
val tabHeaderBgColor: Color = Color.Transparent,
|
|
|
val taskCardBgColor: Color = Color.Transparent,
|
|
|
val taskBgColors: List<Color> = listOf(),
|
|
|
val taskBgGradientColors: List<List<Color>> = listOf(),
|
|
|
val taskIconColors: List<Color> = listOf(),
|
|
|
val taskIconShapeBgColor: Color = Color.Transparent,
|
|
|
val homeBottomGradient: List<Color> = listOf(),
|
|
|
val userBubbleBgColor: Color = Color.Transparent,
|
|
|
val agentBubbleBgColor: Color = Color.Transparent,
|
|
|
val linkColor: Color = Color.Transparent,
|
|
|
val successColor: Color = Color.Transparent,
|
|
|
val recordButtonBgColor: Color = Color.Transparent,
|
|
|
val waveFormBgColor: Color = Color.Transparent,
|
|
|
val modelInfoIconColor: Color = Color.Transparent,
|
|
|
)
|
|
|
|
|
|
val LocalCustomColors = staticCompositionLocalOf { CustomColors() }
|
|
|
|
|
|
val lightCustomColors =
|
|
|
CustomColors(
|
|
|
appTitleGradientColors = listOf(Color(0xFF85B1F8), Color(0xFF3174F1)),
|
|
|
tabHeaderBgColor = Color(0xFF3174F1),
|
|
|
taskCardBgColor = surfaceContainerLowestLight,
|
|
|
taskBgColors =
|
|
|
listOf(
|
|
|
|
|
|
Color(0xFFFFF5F5),
|
|
|
|
|
|
Color(0xFFF4FBF6),
|
|
|
|
|
|
Color(0xFFF1F6FE),
|
|
|
|
|
|
Color(0xFFFFFBF0),
|
|
|
),
|
|
|
taskBgGradientColors =
|
|
|
listOf(
|
|
|
|
|
|
listOf(Color(0xFFE25F57), Color(0xFFDB372D)),
|
|
|
|
|
|
listOf(Color(0xFF41A15F), Color(0xFF128937)),
|
|
|
|
|
|
listOf(Color(0xFF669DF6), Color(0xFF3174F1)),
|
|
|
|
|
|
listOf(Color(0xFFFDD45D), Color(0xFFCAA12A)),
|
|
|
),
|
|
|
taskIconColors =
|
|
|
listOf(
|
|
|
|
|
|
Color(0xFFDB372D),
|
|
|
|
|
|
Color(0xFF128937),
|
|
|
|
|
|
Color(0xFF3174F1),
|
|
|
|
|
|
Color(0xFFCAA12A),
|
|
|
),
|
|
|
taskIconShapeBgColor = Color.White,
|
|
|
homeBottomGradient = listOf(Color(0x00F8F9FF), Color(0xffFFEFC9)),
|
|
|
agentBubbleBgColor = Color(0xFFe9eef6),
|
|
|
userBubbleBgColor = Color(0xFF32628D),
|
|
|
linkColor = Color(0xFF32628D),
|
|
|
successColor = Color(0xff3d860b),
|
|
|
recordButtonBgColor = Color(0xFFEE675C),
|
|
|
waveFormBgColor = Color(0xFFaaaaaa),
|
|
|
modelInfoIconColor = Color(0xFFCCCCCC),
|
|
|
)
|
|
|
|
|
|
val darkCustomColors =
|
|
|
CustomColors(
|
|
|
appTitleGradientColors = listOf(Color(0xFF85B1F8), Color(0xFF3174F1)),
|
|
|
tabHeaderBgColor = Color(0xFF3174F1),
|
|
|
taskCardBgColor = surfaceContainerHighDark,
|
|
|
taskBgColors =
|
|
|
listOf(
|
|
|
|
|
|
Color(0xFF181210),
|
|
|
|
|
|
Color(0xFF131711),
|
|
|
|
|
|
Color(0xFF191924),
|
|
|
|
|
|
Color(0xFF1A1813),
|
|
|
),
|
|
|
taskBgGradientColors =
|
|
|
listOf(
|
|
|
|
|
|
listOf(Color(0xFFE25F57), Color(0xFFDB372D)),
|
|
|
|
|
|
listOf(Color(0xFF41A15F), Color(0xFF128937)),
|
|
|
|
|
|
listOf(Color(0xFF669DF6), Color(0xFF3174F1)),
|
|
|
|
|
|
listOf(Color(0xFFFDD45D), Color(0xFFCAA12A)),
|
|
|
),
|
|
|
taskIconColors =
|
|
|
listOf(
|
|
|
|
|
|
Color(0xFFE25F57),
|
|
|
|
|
|
Color(0xFF41A15F),
|
|
|
|
|
|
Color(0xFF669DF6),
|
|
|
|
|
|
Color(0xFFCAA12A),
|
|
|
),
|
|
|
taskIconShapeBgColor = Color(0xFF202124),
|
|
|
homeBottomGradient = listOf(Color(0x00F8F9FF), Color(0x1AF6AD01)),
|
|
|
agentBubbleBgColor = Color(0xFF1b1c1d),
|
|
|
userBubbleBgColor = Color(0xFF1f3760),
|
|
|
linkColor = Color(0xFF9DCAFC),
|
|
|
successColor = Color(0xFFA1CE83),
|
|
|
recordButtonBgColor = Color(0xFFEE675C),
|
|
|
waveFormBgColor = Color(0xFFaaaaaa),
|
|
|
modelInfoIconColor = Color(0xFFCCCCCC),
|
|
|
)
|
|
|
|
|
|
val MaterialTheme.customColors: CustomColors
|
|
|
@Composable @ReadOnlyComposable get() = LocalCustomColors.current
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
fun StatusBarColorController(useDarkTheme: Boolean) {
|
|
|
val view = LocalView.current
|
|
|
val currentWindow = (view.context as? Activity)?.window
|
|
|
|
|
|
if (currentWindow != null) {
|
|
|
SideEffect {
|
|
|
WindowCompat.setDecorFitsSystemWindows(currentWindow, false)
|
|
|
val controller = WindowCompat.getInsetsController(currentWindow, view)
|
|
|
controller.isAppearanceLightStatusBars = !useDarkTheme
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Composable
|
|
|
fun GalleryTheme(content: @Composable () -> Unit) {
|
|
|
val themeOverride = ThemeSettings.themeOverride
|
|
|
val darkTheme: Boolean =
|
|
|
(isSystemInDarkTheme() || themeOverride.value == Theme.THEME_DARK) &&
|
|
|
themeOverride.value != Theme.THEME_LIGHT
|
|
|
|
|
|
StatusBarColorController(useDarkTheme = darkTheme)
|
|
|
|
|
|
val colorScheme =
|
|
|
when {
|
|
|
darkTheme -> darkScheme
|
|
|
else -> lightScheme
|
|
|
}
|
|
|
|
|
|
val customColorsPalette = if (darkTheme) darkCustomColors else lightCustomColors
|
|
|
|
|
|
CompositionLocalProvider(LocalCustomColors provides customColorsPalette) {
|
|
|
MaterialTheme(colorScheme = colorScheme, typography = AppTypography, content = content)
|
|
|
}
|
|
|
}
|
|
|
|