refactor(compose): make theme decisions within APSTheme
This commit is contained in:
parent
0f9540a645
commit
3266a1b033
7 changed files with 43 additions and 47 deletions
|
@ -10,7 +10,6 @@ import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextField
|
import androidx.compose.material3.TextField
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
@ -20,7 +19,7 @@ import app.passwordstore.R
|
||||||
import app.passwordstore.data.passfile.PasswordEntry
|
import app.passwordstore.data.passfile.PasswordEntry
|
||||||
import app.passwordstore.ui.APSAppBar
|
import app.passwordstore.ui.APSAppBar
|
||||||
import app.passwordstore.ui.compose.PasswordField
|
import app.passwordstore.ui.compose.PasswordField
|
||||||
import app.passwordstore.ui.compose.theme.APSThemePreview
|
import app.passwordstore.ui.compose.theme.APSTheme
|
||||||
import app.passwordstore.util.time.UserClock
|
import app.passwordstore.util.time.UserClock
|
||||||
import app.passwordstore.util.totp.UriTotpFinder
|
import app.passwordstore.util.totp.UriTotpFinder
|
||||||
|
|
||||||
|
@ -75,7 +74,7 @@ private fun ExtraContent(
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun EditPasswordScreenPreview() {
|
private fun EditPasswordScreenPreview() {
|
||||||
APSThemePreview {
|
APSTheme {
|
||||||
EditPasswordScreen(
|
EditPasswordScreen(
|
||||||
entryName = "Test Entry",
|
entryName = "Test Entry",
|
||||||
entry = createTestEntry(),
|
entry = createTestEntry(),
|
||||||
|
|
|
@ -24,7 +24,7 @@ import app.passwordstore.data.passfile.PasswordEntry
|
||||||
import app.passwordstore.ui.APSAppBar
|
import app.passwordstore.ui.APSAppBar
|
||||||
import app.passwordstore.ui.compose.CopyButton
|
import app.passwordstore.ui.compose.CopyButton
|
||||||
import app.passwordstore.ui.compose.PasswordField
|
import app.passwordstore.ui.compose.PasswordField
|
||||||
import app.passwordstore.ui.compose.theme.APSThemePreview
|
import app.passwordstore.ui.compose.theme.APSTheme
|
||||||
import app.passwordstore.util.time.UserClock
|
import app.passwordstore.util.time.UserClock
|
||||||
import app.passwordstore.util.totp.UriTotpFinder
|
import app.passwordstore.util.totp.UriTotpFinder
|
||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
|
@ -106,7 +106,7 @@ private fun ExtraContent(
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun ViewPasswordScreenPreview() {
|
private fun ViewPasswordScreenPreview() {
|
||||||
APSThemePreview {
|
APSTheme {
|
||||||
ViewPasswordScreen(
|
ViewPasswordScreen(
|
||||||
entryName = "Test Entry",
|
entryName = "Test Entry",
|
||||||
entry = createTestEntry(),
|
entry = createTestEntry(),
|
||||||
|
|
|
@ -33,7 +33,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import app.passwordstore.R
|
import app.passwordstore.R
|
||||||
import app.passwordstore.crypto.PGPIdentifier
|
import app.passwordstore.crypto.PGPIdentifier
|
||||||
import app.passwordstore.ui.compose.theme.APSThemePreview
|
import app.passwordstore.ui.compose.theme.APSTheme
|
||||||
import app.passwordstore.util.extensions.conditional
|
import app.passwordstore.util.extensions.conditional
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
@ -139,7 +139,7 @@ private inline fun DeleteConfirmationDialog(
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun KeyListPreview() {
|
private fun KeyListPreview() {
|
||||||
APSThemePreview {
|
APSTheme {
|
||||||
Box(modifier = Modifier.background(MaterialTheme.colorScheme.background)) {
|
Box(modifier = Modifier.background(MaterialTheme.colorScheme.background)) {
|
||||||
KeyList(
|
KeyList(
|
||||||
identifiers =
|
identifiers =
|
||||||
|
@ -157,7 +157,7 @@ private fun KeyListPreview() {
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun EmptyKeyListPreview() {
|
private fun EmptyKeyListPreview() {
|
||||||
APSThemePreview {
|
APSTheme {
|
||||||
Box(modifier = Modifier.background(MaterialTheme.colorScheme.background)) {
|
Box(modifier = Modifier.background(MaterialTheme.colorScheme.background)) {
|
||||||
KeyList(identifiers = persistentListOf(), onItemClick = {})
|
KeyList(identifiers = persistentListOf(), onItemClick = {})
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,13 +13,11 @@ import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import app.passwordstore.R
|
import app.passwordstore.R
|
||||||
import app.passwordstore.ui.APSAppBar
|
import app.passwordstore.ui.APSAppBar
|
||||||
import app.passwordstore.ui.compose.theme.APSTheme
|
import app.passwordstore.ui.compose.theme.APSTheme
|
||||||
import app.passwordstore.ui.compose.theme.decideColorScheme
|
|
||||||
import app.passwordstore.util.viewmodel.PGPKeyListViewModel
|
import app.passwordstore.util.viewmodel.PGPKeyListViewModel
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
|
||||||
|
@ -38,8 +36,7 @@ class PGPKeyListActivity : ComponentActivity() {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
val isSelecting = intent.extras?.getBoolean(EXTRA_KEY_SELECTION) ?: false
|
val isSelecting = intent.extras?.getBoolean(EXTRA_KEY_SELECTION) ?: false
|
||||||
setContent {
|
setContent {
|
||||||
val context = LocalContext.current
|
APSTheme {
|
||||||
APSTheme(colors = decideColorScheme(context)) {
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
APSAppBar(
|
APSAppBar(
|
||||||
|
|
|
@ -23,4 +23,5 @@ dependencies {
|
||||||
api(libs.compose.foundation.layout)
|
api(libs.compose.foundation.layout)
|
||||||
api(libs.compose.material3)
|
api(libs.compose.material3)
|
||||||
api(libs.compose.ui.core)
|
api(libs.compose.ui.core)
|
||||||
|
implementation(libs.androidx.core.ktx)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,20 @@
|
||||||
package app.passwordstore.ui.compose.theme
|
package app.passwordstore.ui.compose.theme
|
||||||
|
|
||||||
import androidx.compose.material3.ColorScheme
|
import android.app.Activity
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.darkColorScheme
|
import androidx.compose.material3.darkColorScheme
|
||||||
|
import androidx.compose.material3.dynamicDarkColorScheme
|
||||||
|
import androidx.compose.material3.dynamicLightColorScheme
|
||||||
import androidx.compose.material3.lightColorScheme
|
import androidx.compose.material3.lightColorScheme
|
||||||
import androidx.compose.runtime.Composable
|
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.view.WindowCompat
|
||||||
|
|
||||||
internal val LightThemeColors =
|
internal val LightThemeColors =
|
||||||
lightColorScheme(
|
lightColorScheme(
|
||||||
|
@ -65,13 +75,29 @@ internal val DarkThemeColors =
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
public fun APSTheme(
|
public fun APSTheme(
|
||||||
colors: ColorScheme,
|
darkTheme: Boolean = isSystemInDarkTheme(),
|
||||||
|
dynamicColor: Boolean = true,
|
||||||
content: @Composable () -> Unit,
|
content: @Composable () -> Unit,
|
||||||
) {
|
) {
|
||||||
MaterialTheme(colorScheme = colors, typography = AppTypography, content = content)
|
val colorScheme =
|
||||||
}
|
when {
|
||||||
|
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
|
||||||
@Composable
|
val context = LocalContext.current
|
||||||
public fun APSThemePreview(content: @Composable () -> Unit) {
|
if (darkTheme) {
|
||||||
MaterialTheme(colorScheme = LightThemeColors, typography = AppTypography, content = content)
|
dynamicDarkColorScheme(context)
|
||||||
|
} else {
|
||||||
|
dynamicLightColorScheme(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> if (darkTheme) DarkThemeColors else LightThemeColors
|
||||||
|
}
|
||||||
|
val view = LocalView.current
|
||||||
|
if (!view.isInEditMode) {
|
||||||
|
SideEffect {
|
||||||
|
val window = (view.context as Activity).window
|
||||||
|
window.statusBarColor = Color.Transparent.toArgb()
|
||||||
|
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MaterialTheme(colorScheme = colorScheme, typography = AppTypography, content = content)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
package app.passwordstore.ui.compose.theme
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.os.Build
|
|
||||||
import androidx.compose.foundation.isSystemInDarkTheme
|
|
||||||
import androidx.compose.material3.ColorScheme
|
|
||||||
import androidx.compose.material3.dynamicDarkColorScheme
|
|
||||||
import androidx.compose.material3.dynamicLightColorScheme
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
public fun decideColorScheme(context: Context): ColorScheme {
|
|
||||||
val isDarkTheme = isSystemInDarkTheme()
|
|
||||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
||||||
if (isDarkTheme) {
|
|
||||||
dynamicDarkColorScheme(context)
|
|
||||||
} else {
|
|
||||||
dynamicLightColorScheme(context)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (isDarkTheme) {
|
|
||||||
DarkThemeColors
|
|
||||||
} else {
|
|
||||||
LightThemeColors
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue