Skip to content

Commit

Permalink
feat: use real material you themes for custom accent colors
Browse files Browse the repository at this point in the history
  • Loading branch information
Bnyro committed Dec 21, 2023
1 parent cee8825 commit d18aedf
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 27 deletions.
3 changes: 3 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,7 @@ dependencies {

// Tesseract OCR
implementation("cz.adaptech.tesseract4android:tesseract4android-openmp:4.3.0")

// Dynamic color scheme
implementation("com.google.android.material:material:1.9.0")
}
69 changes: 42 additions & 27 deletions app/src/main/java/com/bnyro/translate/ui/theme/Theme.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,37 @@

package com.bnyro.translate.ui.theme

import android.annotation.SuppressLint
import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.ColorScheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.contentColorFor
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.core.graphics.ColorUtils
import androidx.core.view.WindowCompat
import com.bnyro.translate.const.ThemeMode
import com.bnyro.translate.ext.hexToColor
import com.google.android.material.color.utilities.Scheme

const val defaultAccentColor = "0088aa"

@Composable
@SuppressLint("RestrictedApi")
fun TranslateYouTheme(
themeMode: ThemeMode = ThemeMode.AUTO,
accentColor: Color? = null,
content: @Composable () -> Unit
) {
val view = LocalView.current
val context = LocalContext.current

val darkTheme = when (themeMode) {
ThemeMode.AUTO -> isSystemInDarkTheme()
ThemeMode.LIGHT -> false
Expand All @@ -53,38 +56,17 @@ fun TranslateYouTheme(

var colorScheme = when {
accentColor == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
}

else -> {
val primary = accentColor ?: defaultAccentColor.hexToColor()
val onPrimary = MaterialTheme.colorScheme.contentColorFor(primary)
val blendColor =
if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
val secondary = Color(ColorUtils.blendARGB(primary.toArgb(), blendColor, 0.3f))
val onSecondary = MaterialTheme.colorScheme.contentColorFor(secondary)
if (darkTheme) {
darkColorScheme(
primary,
onPrimary,
secondary = secondary,
onSecondary = onSecondary
)
} else {
lightColorScheme(
primary,
onPrimary,
secondary = secondary,
onSecondary = onSecondary
)
}
val seed = (accentColor ?: defaultAccentColor.hexToColor()).toArgb()
if (darkTheme) Scheme.dark(seed).toColorScheme() else Scheme.light(seed).toColorScheme()
}
}
if (themeMode == ThemeMode.BLACK) colorScheme =
colorScheme.copy(background = Color.Black, surface = Color.Black)

val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val activity = view.context as Activity
Expand All @@ -109,3 +91,36 @@ fun TranslateYouTheme(
content = content
)
}

@SuppressLint("RestrictedApi")
fun Scheme.toColorScheme() = ColorScheme(
primary = Color(primary),
onPrimary = Color(onPrimary),
primaryContainer = Color(primaryContainer),
onPrimaryContainer = Color(onPrimaryContainer),
inversePrimary = Color(inversePrimary),
secondary = Color(secondary),
onSecondary = Color(onSecondary),
secondaryContainer = Color(secondaryContainer),
onSecondaryContainer = Color(onSecondaryContainer),
tertiary = Color(tertiary),
onTertiary = Color(onTertiary),
tertiaryContainer = Color(tertiaryContainer),
onTertiaryContainer = Color(onTertiaryContainer),
background = Color(background),
onBackground = Color(onBackground),
surface = Color(surface),
onSurface = Color(onSurface),
surfaceVariant = Color(surfaceVariant),
onSurfaceVariant = Color(onSurfaceVariant),
surfaceTint = Color(primary),
inverseSurface = Color(inverseSurface),
inverseOnSurface = Color(inverseOnSurface),
error = Color(error),
onError = Color(onError),
errorContainer = Color(errorContainer),
onErrorContainer = Color(onErrorContainer),
outline = Color(outline),
outlineVariant = Color(outlineVariant),
scrim = Color(scrim)
)

0 comments on commit d18aedf

Please sign in to comment.