|
|
|
@ -30,6 +30,8 @@ import androidx.compose.ui.unit.sp
|
|
|
|
|
import com.google.accompanist.themeadapter.appcompat.createAppCompatTheme
|
|
|
|
|
import com.google.android.material.color.MaterialColors
|
|
|
|
|
import network.loki.messenger.R
|
|
|
|
|
import org.session.libsession.utilities.AppTextSecurePreferences
|
|
|
|
|
import org.thoughtcrime.securesms.util.themeState
|
|
|
|
|
|
|
|
|
|
val LocalCellColor = staticCompositionLocalOf { Color.Black }
|
|
|
|
|
val LocalButtonColor = staticCompositionLocalOf { Color.Black }
|
|
|
|
@ -52,6 +54,81 @@ data class Dimensions(
|
|
|
|
|
val dividerIndent: Dp = 80.dp,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val LocalColors = staticCompositionLocalOf { SessionColors() }
|
|
|
|
|
|
|
|
|
|
data class SessionColors(
|
|
|
|
|
val primary: Color = Color.Unspecified,
|
|
|
|
|
val danger: Color = Color.Unspecified,
|
|
|
|
|
val disabled: Color = Color.Unspecified,
|
|
|
|
|
val background: Color = Color.Unspecified,
|
|
|
|
|
val backgroundSecondary: Color = Color.Unspecified,
|
|
|
|
|
val text: Color = Color.Unspecified,
|
|
|
|
|
val textSecondary: Color = Color.Unspecified,
|
|
|
|
|
val borders: Color = Color.Unspecified,
|
|
|
|
|
val textBubbleSent: Color = Color.Unspecified,
|
|
|
|
|
val backgroundBubbleReceived: Color = Color.Unspecified,
|
|
|
|
|
val textBubbleReceived: Color = Color.Unspecified,
|
|
|
|
|
) {
|
|
|
|
|
val backgroundBubbleSent get() = primary
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val primaryGreen = Color(0xFF31F196)
|
|
|
|
|
val primaryBlue = Color(0xFF57C9FA)
|
|
|
|
|
val primaryPurple = Color(0xFFC993FF)
|
|
|
|
|
val primaryPink = Color(0xFFFF95EF)
|
|
|
|
|
val primaryRed = Color(0xFFFF9C8E)
|
|
|
|
|
val primaryOrange = Color(0xFFFCB159)
|
|
|
|
|
val primaryYellow = Color(0xFFFAD657)
|
|
|
|
|
|
|
|
|
|
val dangerDark = Color(0xFFFF3A3A)
|
|
|
|
|
val dangerLight = Color(0xFFE12D19)
|
|
|
|
|
val disabledDark = Color(0xFFA1A2A1)
|
|
|
|
|
val disabledLioht = Color(0xFF6D6D6D)
|
|
|
|
|
|
|
|
|
|
val primaryColors = listOf(
|
|
|
|
|
primaryGreen,
|
|
|
|
|
primaryBlue,
|
|
|
|
|
primaryPurple,
|
|
|
|
|
primaryPink,
|
|
|
|
|
primaryRed,
|
|
|
|
|
primaryOrange,
|
|
|
|
|
primaryYellow,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private class UnresolvedColor(val function: (Boolean, Boolean) -> Color) {
|
|
|
|
|
operator fun invoke(isLight: Boolean, isClassic: Boolean) = function(isLight, isClassic)
|
|
|
|
|
|
|
|
|
|
constructor(light: Color, dark: Color): this(function = { isLight, _ -> if (isLight) light else dark })
|
|
|
|
|
constructor(classicDark: Color, classicLight: Color, oceanDark: Color, oceanLight: Color): this(function = { isLight, isClassic -> if (isLight) if (isClassic) classicLight else oceanLight else if (isClassic) classicDark else oceanDark })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class UnresolvedSessionColors(
|
|
|
|
|
val danger: UnresolvedColor = UnresolvedColor(dark = dangerDark, light = dangerLight),
|
|
|
|
|
val disabled: UnresolvedColor = UnresolvedColor(dark = disabledDark, light = disabledLioht),
|
|
|
|
|
val background: UnresolvedColor = UnresolvedColor(Color.Black, Color.White, oceanDarkColors[2], oceanLightColors[7]),
|
|
|
|
|
val backgroundSecondary: UnresolvedColor = UnresolvedColor(classicDarkColors[1], classicLightColors[5], oceanDarkColors[1], oceanLightColors[6]),
|
|
|
|
|
val text: UnresolvedColor = UnresolvedColor(Color.White, Color.Black, oceanDarkColors[1], oceanLightColors[1]),
|
|
|
|
|
val textSecondary: UnresolvedColor = UnresolvedColor(classicDarkColors[5], classicLightColors[1], oceanDarkColors[5], oceanLightColors[2]),
|
|
|
|
|
val borders: UnresolvedColor = UnresolvedColor(classicDarkColors[3], classicLightColors[3], oceanDarkColors[4], oceanLightColors[3]),
|
|
|
|
|
val textBubbleSent: UnresolvedColor = UnresolvedColor(Color.Black, Color.Black, Color.Black, oceanLightColors[1]),
|
|
|
|
|
val backgroundBubbleReceived: UnresolvedColor = UnresolvedColor(classicDarkColors[2], classicLightColors[4], oceanDarkColors[4], oceanLightColors[4]),
|
|
|
|
|
val textBubbleReceived: UnresolvedColor = UnresolvedColor(Color.White, classicLightColors[4], oceanDarkColors[4], oceanLightColors[4]),
|
|
|
|
|
) {
|
|
|
|
|
operator fun invoke(primary: Color, isLight: Boolean, isClassic: Boolean) = SessionColors(
|
|
|
|
|
primary = primary,
|
|
|
|
|
danger = danger(isLight, isClassic),
|
|
|
|
|
disabled = disabled(isLight, isClassic),
|
|
|
|
|
background = background(isLight, isClassic),
|
|
|
|
|
backgroundSecondary = backgroundSecondary(isLight, isClassic),
|
|
|
|
|
text = text(isLight, isClassic),
|
|
|
|
|
textSecondary = textSecondary(isLight, isClassic),
|
|
|
|
|
borders = borders(isLight, isClassic),
|
|
|
|
|
textBubbleSent = textBubbleSent(isLight, isClassic),
|
|
|
|
|
backgroundBubbleReceived = backgroundBubbleReceived(isLight, isClassic),
|
|
|
|
|
textBubbleReceived = textBubbleReceived(isLight, isClassic),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Converts current Theme to Compose Theme.
|
|
|
|
|
*/
|
|
|
|
@ -63,6 +140,15 @@ fun AppTheme(
|
|
|
|
|
|
|
|
|
|
val surface = context.getColorFromTheme(R.attr.colorSettingsBackground)
|
|
|
|
|
|
|
|
|
|
val themeState = AppTextSecurePreferences(context).themeState()
|
|
|
|
|
|
|
|
|
|
val sessionColors = UnresolvedSessionColors()(themeState.accent, themeState.isLight, themeState.isClassic)
|
|
|
|
|
|
|
|
|
|
val textSelectionColors = TextSelectionColors(
|
|
|
|
|
handleColor = MaterialTheme.colors.secondary,
|
|
|
|
|
backgroundColor = MaterialTheme.colors.secondary.copy(alpha = 0.5f)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
CompositionLocalProvider(
|
|
|
|
|
*listOf(
|
|
|
|
|
LocalCellColor to R.attr.colorSettingsBackground,
|
|
|
|
@ -72,10 +158,10 @@ fun AppTheme(
|
|
|
|
|
).map { (local, attr) -> local provides context.getColorFromTheme(attr) }.toTypedArray()
|
|
|
|
|
) {
|
|
|
|
|
AppCompatTheme(surface = surface) {
|
|
|
|
|
CompositionLocalProvider(LocalTextSelectionColors provides TextSelectionColors(
|
|
|
|
|
handleColor = MaterialTheme.colors.secondary,
|
|
|
|
|
backgroundColor = MaterialTheme.colors.secondary.copy(alpha = 0.5f)
|
|
|
|
|
)) {
|
|
|
|
|
CompositionLocalProvider(
|
|
|
|
|
LocalColors provides sessionColors,
|
|
|
|
|
LocalTextSelectionColors provides textSelectionColors
|
|
|
|
|
) {
|
|
|
|
|
content()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|