mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-12 13:17:42 +02:00
refactor: move compose view factory to common
This commit is contained in:
@ -0,0 +1,78 @@
|
||||
package me.rhunk.snapenhance.common.ui
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import androidx.activity.OnBackPressedDispatcher
|
||||
import androidx.activity.OnBackPressedDispatcherOwner
|
||||
import androidx.activity.setViewTreeOnBackPressedDispatcherOwner
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.Recomposer
|
||||
import androidx.compose.ui.platform.AndroidUiDispatcher
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||
import androidx.compose.ui.platform.compositionContext
|
||||
import androidx.lifecycle.*
|
||||
import androidx.savedstate.SavedStateRegistry
|
||||
import androidx.savedstate.SavedStateRegistryController
|
||||
import androidx.savedstate.SavedStateRegistryOwner
|
||||
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
// https://github.com/tberghuis/FloatingCountdownTimer/blob/master/app/src/main/java/xyz/tberghuis/floatingtimer/service/overlayViewFactory.kt
|
||||
fun createComposeView(context: Context, content: @Composable () -> Unit) = ComposeView(context).apply {
|
||||
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
|
||||
val lifecycleOwner = OverlayLifecycleOwner().apply {
|
||||
performRestore(null)
|
||||
handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
|
||||
}
|
||||
setViewTreeLifecycleOwner(lifecycleOwner)
|
||||
setViewTreeSavedStateRegistryOwner(lifecycleOwner)
|
||||
|
||||
val viewModelStore = ViewModelStore()
|
||||
setViewTreeViewModelStoreOwner(object : ViewModelStoreOwner {
|
||||
override val viewModelStore: ViewModelStore
|
||||
get() = viewModelStore
|
||||
})
|
||||
|
||||
val backPressedDispatcherOwner = OnBackPressedDispatcher()
|
||||
setViewTreeOnBackPressedDispatcherOwner(object: OnBackPressedDispatcherOwner {
|
||||
override val lifecycle: Lifecycle
|
||||
get() = lifecycleOwner.lifecycle
|
||||
override val onBackPressedDispatcher: OnBackPressedDispatcher
|
||||
get() = backPressedDispatcherOwner
|
||||
})
|
||||
|
||||
val coroutineContext = AndroidUiDispatcher.CurrentThread
|
||||
val runRecomposeScope = CoroutineScope(coroutineContext)
|
||||
val recomposer = Recomposer(coroutineContext)
|
||||
compositionContext = recomposer
|
||||
runRecomposeScope.launch {
|
||||
recomposer.runRecomposeAndApplyChanges()
|
||||
}
|
||||
|
||||
setContent {
|
||||
AppMaterialTheme {
|
||||
content()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class OverlayLifecycleOwner : SavedStateRegistryOwner {
|
||||
private var mLifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
|
||||
private var mSavedStateRegistryController: SavedStateRegistryController =
|
||||
SavedStateRegistryController.create(this)
|
||||
override val lifecycle: Lifecycle
|
||||
get() = mLifecycleRegistry
|
||||
override val savedStateRegistry: SavedStateRegistry
|
||||
get() = mSavedStateRegistryController.savedStateRegistry
|
||||
fun handleLifecycleEvent(event: Lifecycle.Event) {
|
||||
mLifecycleRegistry.handleLifecycleEvent(event)
|
||||
}
|
||||
fun performRestore(savedState: Bundle?) {
|
||||
mSavedStateRegistryController.performRestore(savedState)
|
||||
}
|
||||
fun performSave(outBundle: Bundle) {
|
||||
mSavedStateRegistryController.performSave(outBundle)
|
||||
}
|
||||
}
|
162
common/src/main/kotlin/me/rhunk/snapenhance/common/ui/Theme.kt
Normal file
162
common/src/main/kotlin/me/rhunk/snapenhance/common/ui/Theme.kt
Normal file
@ -0,0 +1,162 @@
|
||||
package me.rhunk.snapenhance.common.ui
|
||||
|
||||
import android.os.Build
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.dynamicDarkColorScheme
|
||||
import androidx.compose.material3.dynamicLightColorScheme
|
||||
import androidx.compose.material3.lightColorScheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
|
||||
val md_theme_light_primary = Color(0xFF6750A4)
|
||||
val md_theme_light_onPrimary = Color(0xFFFFFFFF)
|
||||
val md_theme_light_primaryContainer = Color(0xFFE9DDFF)
|
||||
val md_theme_light_onPrimaryContainer = Color(0xFF22005D)
|
||||
val md_theme_light_secondary = Color(0xFF625B71)
|
||||
val md_theme_light_onSecondary = Color(0xFFFFFFFF)
|
||||
val md_theme_light_secondaryContainer = Color(0xFFE8DEF8)
|
||||
val md_theme_light_onSecondaryContainer = Color(0xFF1E192B)
|
||||
val md_theme_light_tertiary = Color(0xFF3C5BA9)
|
||||
val md_theme_light_onTertiary = Color(0xFFFFFFFF)
|
||||
val md_theme_light_tertiaryContainer = Color(0xFFDBE1FF)
|
||||
val md_theme_light_onTertiaryContainer = Color(0xFF001849)
|
||||
val md_theme_light_error = Color(0xFFBA1A1A)
|
||||
val md_theme_light_errorContainer = Color(0xFFFFDAD6)
|
||||
val md_theme_light_onError = Color(0xFFFFFFFF)
|
||||
val md_theme_light_onErrorContainer = Color(0xFF410002)
|
||||
val md_theme_light_background = Color(0xFFFFFBFF)
|
||||
val md_theme_light_onBackground = Color(0xFF1C1B1E)
|
||||
val md_theme_light_surface = Color(0xFFFFFBFF)
|
||||
val md_theme_light_onSurface = Color(0xFF1C1B1E)
|
||||
val md_theme_light_surfaceVariant = Color(0xFFE7E0EB)
|
||||
val md_theme_light_onSurfaceVariant = Color(0xFF49454E)
|
||||
val md_theme_light_outline = Color(0xFF7A757F)
|
||||
val md_theme_light_inverseOnSurface = Color(0xFFF4EFF4)
|
||||
val md_theme_light_inverseSurface = Color(0xFF313033)
|
||||
val md_theme_light_inversePrimary = Color(0xFFCFBCFF)
|
||||
val md_theme_light_surfaceTint = Color(0xFF6750A4)
|
||||
val md_theme_light_outlineVariant = Color(0xFFCAC4CF)
|
||||
val md_theme_light_scrim = Color(0xFF000000)
|
||||
|
||||
val md_theme_dark_primary = Color(0xFFCFBCFF)
|
||||
val md_theme_dark_onPrimary = Color(0xFF381E72)
|
||||
val md_theme_dark_primaryContainer = Color(0xFF4F378A)
|
||||
val md_theme_dark_onPrimaryContainer = Color(0xFFE9DDFF)
|
||||
val md_theme_dark_secondary = Color(0xFFCBC2DB)
|
||||
val md_theme_dark_onSecondary = Color(0xFF332D41)
|
||||
val md_theme_dark_secondaryContainer = Color(0xFF4A4458)
|
||||
val md_theme_dark_onSecondaryContainer = Color(0xFFE8DEF8)
|
||||
val md_theme_dark_tertiary = Color(0xFFB3C5FF)
|
||||
val md_theme_dark_onTertiary = Color(0xFF002B75)
|
||||
val md_theme_dark_tertiaryContainer = Color(0xFF21428F)
|
||||
val md_theme_dark_onTertiaryContainer = Color(0xFFDBE1FF)
|
||||
val md_theme_dark_error = Color(0xFFFFB4AB)
|
||||
val md_theme_dark_errorContainer = Color(0xFF93000A)
|
||||
val md_theme_dark_onError = Color(0xFF690005)
|
||||
val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6)
|
||||
val md_theme_dark_background = Color(0xFF1C1B1E)
|
||||
val md_theme_dark_onBackground = Color(0xFFE6E1E6)
|
||||
val md_theme_dark_surface = Color(0xFF1C1B1E)
|
||||
val md_theme_dark_onSurface = Color(0xFFE6E1E6)
|
||||
val md_theme_dark_surfaceVariant = Color(0xFF49454E)
|
||||
val md_theme_dark_onSurfaceVariant = Color(0xFFCAC4CF)
|
||||
val md_theme_dark_outline = Color(0xFF948F99)
|
||||
val md_theme_dark_inverseOnSurface = Color(0xFF1C1B1E)
|
||||
val md_theme_dark_inverseSurface = Color(0xFFE6E1E6)
|
||||
val md_theme_dark_inversePrimary = Color(0xFF6750A4)
|
||||
val md_theme_dark_surfaceTint = Color(0xFFCFBCFF)
|
||||
val md_theme_dark_outlineVariant = Color(0xFF49454E)
|
||||
val md_theme_dark_scrim = Color(0xFF000000)
|
||||
|
||||
|
||||
val seed = Color(0xFF6750A4)
|
||||
|
||||
|
||||
private val LightThemeColors = lightColorScheme(
|
||||
primary = md_theme_light_primary,
|
||||
onPrimary = md_theme_light_onPrimary,
|
||||
primaryContainer = md_theme_light_primaryContainer,
|
||||
onPrimaryContainer = md_theme_light_onPrimaryContainer,
|
||||
secondary = md_theme_light_secondary,
|
||||
onSecondary = md_theme_light_onSecondary,
|
||||
secondaryContainer = md_theme_light_secondaryContainer,
|
||||
onSecondaryContainer = md_theme_light_onSecondaryContainer,
|
||||
tertiary = md_theme_light_tertiary,
|
||||
onTertiary = md_theme_light_onTertiary,
|
||||
tertiaryContainer = md_theme_light_tertiaryContainer,
|
||||
onTertiaryContainer = md_theme_light_onTertiaryContainer,
|
||||
error = md_theme_light_error,
|
||||
onError = md_theme_light_onError,
|
||||
errorContainer = md_theme_light_errorContainer,
|
||||
onErrorContainer = md_theme_light_onErrorContainer,
|
||||
background = md_theme_light_background,
|
||||
onBackground = md_theme_light_onBackground,
|
||||
surface = md_theme_light_surface,
|
||||
onSurface = md_theme_light_onSurface,
|
||||
surfaceVariant = md_theme_light_surfaceVariant,
|
||||
onSurfaceVariant = md_theme_light_onSurfaceVariant,
|
||||
outline = md_theme_light_outline,
|
||||
inverseOnSurface = md_theme_light_inverseOnSurface,
|
||||
inverseSurface = md_theme_light_inverseSurface,
|
||||
inversePrimary = md_theme_light_inversePrimary,
|
||||
surfaceTint = md_theme_light_surfaceTint,
|
||||
outlineVariant = md_theme_light_outlineVariant,
|
||||
scrim = md_theme_light_scrim
|
||||
)
|
||||
|
||||
private val DarkThemeColors = lightColorScheme(
|
||||
primary = md_theme_dark_primary,
|
||||
onPrimary = md_theme_dark_onPrimary,
|
||||
primaryContainer = md_theme_dark_primaryContainer,
|
||||
onPrimaryContainer = md_theme_dark_onPrimaryContainer,
|
||||
secondary = md_theme_dark_secondary,
|
||||
onSecondary = md_theme_dark_onSecondary,
|
||||
secondaryContainer = md_theme_dark_secondaryContainer,
|
||||
onSecondaryContainer = md_theme_dark_onSecondaryContainer,
|
||||
tertiary = md_theme_dark_tertiary,
|
||||
onTertiary = md_theme_dark_onTertiary,
|
||||
tertiaryContainer = md_theme_dark_tertiaryContainer,
|
||||
onTertiaryContainer = md_theme_dark_onTertiaryContainer,
|
||||
error = md_theme_dark_error,
|
||||
onError = md_theme_dark_onError,
|
||||
errorContainer = md_theme_dark_errorContainer,
|
||||
onErrorContainer = md_theme_dark_onErrorContainer,
|
||||
background = md_theme_dark_background,
|
||||
onBackground = md_theme_dark_onBackground,
|
||||
surface = md_theme_dark_surface,
|
||||
onSurface = md_theme_dark_onSurface,
|
||||
surfaceVariant = md_theme_dark_surfaceVariant,
|
||||
onSurfaceVariant = md_theme_dark_onSurfaceVariant,
|
||||
outline = md_theme_dark_outline,
|
||||
inverseOnSurface = md_theme_dark_inverseOnSurface,
|
||||
inverseSurface = md_theme_dark_inverseSurface,
|
||||
inversePrimary = md_theme_dark_inversePrimary,
|
||||
surfaceTint = md_theme_dark_surfaceTint,
|
||||
outlineVariant = md_theme_dark_outlineVariant,
|
||||
scrim = md_theme_dark_scrim
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun AppMaterialTheme(
|
||||
isDarkTheme: Boolean = isSystemInDarkTheme(),
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
val dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
|
||||
val colorScheme = when {
|
||||
dynamicColor && isDarkTheme -> {
|
||||
dynamicDarkColorScheme(LocalContext.current)
|
||||
}
|
||||
dynamicColor && !isDarkTheme -> {
|
||||
dynamicLightColorScheme(LocalContext.current)
|
||||
}
|
||||
!isDarkTheme -> LightThemeColors
|
||||
else -> DarkThemeColors
|
||||
}
|
||||
|
||||
MaterialTheme(
|
||||
colorScheme = colorScheme,
|
||||
content = content
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user