refactor: tidy up files
This commit is contained in:
parent
bdd7ea4ed7
commit
be721c987c
13 changed files with 287 additions and 227 deletions
|
@ -18,6 +18,7 @@ android {
|
||||||
compileSdk = project.libs.versions.app.build.compileSDKVersion.get().toInt()
|
compileSdk = project.libs.versions.app.build.compileSDKVersion.get().toInt()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
applicationId = libs.versions.app.version.appId.get()
|
||||||
minSdk = project.libs.versions.app.build.minimumSDK.get().toInt()
|
minSdk = project.libs.versions.app.build.minimumSDK.get().toInt()
|
||||||
targetSdk = project.libs.versions.app.build.targetSDK.get().toInt()
|
targetSdk = project.libs.versions.app.build.targetSDK.get().toInt()
|
||||||
versionName = project.libs.versions.app.version.versionName.get()
|
versionName = project.libs.versions.app.version.versionName.get()
|
||||||
|
|
|
@ -8,7 +8,6 @@ import androidx.compose.runtime.*
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
||||||
import com.simplemobiletools.calculator.compose.theme.OnLifecycleEvent
|
|
||||||
|
|
||||||
fun Context.getActivity(): Activity {
|
fun Context.getActivity(): Activity {
|
||||||
if (this is Activity) return this
|
if (this is Activity) return this
|
||||||
|
@ -21,7 +20,7 @@ fun TransparentSystemBars() {
|
||||||
val systemUiController = rememberSystemUiController()
|
val systemUiController = rememberSystemUiController()
|
||||||
val isSystemInDarkTheme = isSystemInDarkTheme()
|
val isSystemInDarkTheme = isSystemInDarkTheme()
|
||||||
SideEffect {
|
SideEffect {
|
||||||
systemUiController.setSystemBarsColor(Color.Transparent, darkIcons = isSystemInDarkTheme)
|
systemUiController.setSystemBarsColor(Color.Transparent, darkIcons = !isSystemInDarkTheme)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.extensions
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.DisposableEffect
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.rememberUpdatedState
|
||||||
|
import androidx.compose.ui.platform.LocalLifecycleOwner
|
||||||
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import androidx.lifecycle.LifecycleEventObserver
|
||||||
|
import androidx.lifecycle.LifecycleOwner
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun OnLifecycleEvent(
|
||||||
|
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
|
||||||
|
onEvent: (event: Lifecycle.Event) -> Unit
|
||||||
|
) {
|
||||||
|
val currentOnEvent by rememberUpdatedState(onEvent)
|
||||||
|
DisposableEffect(lifecycleOwner) {
|
||||||
|
val observer = LifecycleEventObserver { _, event ->
|
||||||
|
currentOnEvent(event)
|
||||||
|
}
|
||||||
|
lifecycleOwner.lifecycle.addObserver(observer)
|
||||||
|
onDispose {
|
||||||
|
lifecycleOwner.lifecycle.removeObserver(observer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,7 +23,10 @@ import com.simplemobiletools.calculator.compose.settings.SettingsCheckBoxCompone
|
||||||
import com.simplemobiletools.calculator.compose.settings.SettingsGroup
|
import com.simplemobiletools.calculator.compose.settings.SettingsGroup
|
||||||
import com.simplemobiletools.calculator.compose.settings.SettingsPreferenceComponent
|
import com.simplemobiletools.calculator.compose.settings.SettingsPreferenceComponent
|
||||||
import com.simplemobiletools.calculator.compose.settings.SettingsTitleTextComponent
|
import com.simplemobiletools.calculator.compose.settings.SettingsTitleTextComponent
|
||||||
import com.simplemobiletools.calculator.compose.theme.*
|
import com.simplemobiletools.calculator.compose.theme.AppThemeSurface
|
||||||
|
import com.simplemobiletools.calculator.compose.theme.divider_grey
|
||||||
|
import com.simplemobiletools.calculator.compose.theme.isNotLitWell
|
||||||
|
import com.simplemobiletools.calculator.compose.theme.isSurfaceLitWell
|
||||||
import com.simplemobiletools.commons.R
|
import com.simplemobiletools.commons.R
|
||||||
import com.simplemobiletools.commons.helpers.isTiramisuPlus
|
import com.simplemobiletools.commons.helpers.isTiramisuPlus
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.app.ActivityManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import com.simplemobiletools.calculator.compose.extensions.getActivity
|
||||||
|
import com.simplemobiletools.calculator.helpers.Config
|
||||||
|
import com.simplemobiletools.commons.R
|
||||||
|
import com.simplemobiletools.commons.helpers.APP_ICON_IDS
|
||||||
|
import com.simplemobiletools.commons.helpers.APP_LAUNCHER_NAME
|
||||||
|
|
||||||
|
fun Activity.getAppIconIds(): ArrayList<Int> = ArrayList(intent.getIntegerArrayListExtra(APP_ICON_IDS).orEmpty())
|
||||||
|
fun Activity.getAppLauncherName(): String = intent.getStringExtra(APP_LAUNCHER_NAME).orEmpty()
|
||||||
|
internal fun updateRecentsAppIcon(baseConfig: Config, context: Context) {
|
||||||
|
if (baseConfig.isUsingModifiedAppIcon) {
|
||||||
|
val appIconIDs = context.getAppIconIds()
|
||||||
|
val currentAppIconColorIndex = baseConfig.getCurrentAppIconColorIndex(context)
|
||||||
|
if (appIconIDs.size - 1 < currentAppIconColorIndex) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val recentsIcon = BitmapFactory.decodeResource(context.resources, appIconIDs[currentAppIconColorIndex])
|
||||||
|
val title = context.getAppLauncherName()
|
||||||
|
val color = baseConfig.primaryColor
|
||||||
|
|
||||||
|
val description = ActivityManager.TaskDescription(title, recentsIcon, color)
|
||||||
|
context.getActivity().setTaskDescription(description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Config.getCurrentAppIconColorIndex(context: Context): Int {
|
||||||
|
val appIconColor = appIconColor
|
||||||
|
context.getAppIconColors().forEachIndexed { index, color ->
|
||||||
|
if (color == appIconColor) {
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Context.getAppIconColors() = resources.getIntArray(R.array.md_app_icon_colors).toCollection(ArrayList())
|
||||||
|
|
||||||
|
private fun Context.getAppIconIds(): List<Int> = getActivity().getAppIconIds()
|
||||||
|
|
||||||
|
private fun Context.getAppLauncherName(): String = getActivity().getAppLauncherName()
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.LocalView
|
||||||
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import com.simplemobiletools.calculator.compose.extensions.OnLifecycleEvent
|
||||||
|
import com.simplemobiletools.calculator.compose.theme.model.Theme.Companion.systemDefaultMaterialYou
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AppThemeSurface(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
content: @Composable () -> Unit,
|
||||||
|
) {
|
||||||
|
val view = LocalView.current
|
||||||
|
|
||||||
|
val context = LocalContext.current
|
||||||
|
val materialYouTheme = systemDefaultMaterialYou()
|
||||||
|
var currentTheme by remember {
|
||||||
|
mutableStateOf(
|
||||||
|
if (view.isInEditMode) materialYouTheme else getTheme(
|
||||||
|
context = context,
|
||||||
|
materialYouTheme = materialYouTheme
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
OnLifecycleEvent { event ->
|
||||||
|
if (event == Lifecycle.Event.ON_START && !view.isInEditMode) {
|
||||||
|
currentTheme = getTheme(context = context, materialYouTheme = materialYouTheme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Theme(theme = currentTheme) {
|
||||||
|
Surface(modifier = modifier.fillMaxSize()) {
|
||||||
|
content()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
|
import androidx.compose.material3.darkColorScheme
|
||||||
|
|
||||||
|
internal val darkColorScheme = darkColorScheme(
|
||||||
|
primary = color_primary,
|
||||||
|
secondary = color_primary_dark,
|
||||||
|
tertiary = color_accent,
|
||||||
|
)
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.ReadOnlyComposable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.graphics.luminance
|
||||||
|
|
||||||
|
@get:ReadOnlyComposable
|
||||||
|
val disabledTextColor @Composable get() = if (isInDarkThemeAndSurfaceIsNotLitWell()) Color.DarkGray else Color.LightGray
|
||||||
|
|
||||||
|
@get:ReadOnlyComposable
|
||||||
|
val textSubTitleColor
|
||||||
|
@Composable get() = if (isInDarkThemeAndSurfaceIsNotLitWell()) {
|
||||||
|
Color.White.copy(0.5f)
|
||||||
|
} else {
|
||||||
|
Color.Black.copy(
|
||||||
|
0.5f,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun preferenceSummaryColor(isEnabled: Boolean) =
|
||||||
|
if (isEnabled) textSubTitleColor else disabledTextColor
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun preferenceTitleColor(isEnabled: Boolean) = if (isEnabled) MaterialTheme.colorScheme.onSurface else disabledTextColor
|
||||||
|
|
||||||
|
fun Color.isLitWell(threshold : Float = LUMINANCE_THRESHOLD) = luminance() > threshold
|
||||||
|
|
||||||
|
fun Color.isNotLitWell(threshold: Float = LUMINANCE_THRESHOLD) = luminance() < threshold
|
|
@ -1,17 +1,13 @@
|
||||||
package com.simplemobiletools.calculator.compose.theme
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.toArgb
|
import androidx.compose.ui.graphics.toArgb
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import com.simplemobiletools.calculator.compose.theme.model.Theme
|
||||||
import com.simplemobiletools.calculator.extensions.config
|
import com.simplemobiletools.calculator.extensions.config
|
||||||
import com.simplemobiletools.commons.extensions.isBlackAndWhiteTheme
|
import com.simplemobiletools.commons.extensions.isBlackAndWhiteTheme
|
||||||
import com.simplemobiletools.commons.extensions.isWhiteTheme
|
import com.simplemobiletools.commons.extensions.isWhiteTheme
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun getCurrentTheme() = getTheme(LocalContext.current, Theme.systemDefaultMaterialYou())
|
|
||||||
|
|
||||||
fun getTheme(context: Context, materialYouTheme: Theme.SystemDefaultMaterialYou): Theme {
|
fun getTheme(context: Context, materialYouTheme: Theme.SystemDefaultMaterialYou): Theme {
|
||||||
val baseConfig = context.config
|
val baseConfig = context.config
|
||||||
val primaryColorInt = baseConfig.primaryColor
|
val primaryColorInt = baseConfig.primaryColor
|
||||||
|
|
|
@ -1,148 +1,24 @@
|
||||||
package com.simplemobiletools.calculator.compose.theme
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.app.ActivityManager
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.BitmapFactory
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.compose.foundation.isSystemInDarkTheme
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.darkColorScheme
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.material3.dynamicDarkColorScheme
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.material3.dynamicLightColorScheme
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.SideEffect
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.luminance
|
|
||||||
import androidx.compose.ui.graphics.toArgb
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalLifecycleOwner
|
|
||||||
import androidx.compose.ui.platform.LocalView
|
import androidx.compose.ui.platform.LocalView
|
||||||
import androidx.lifecycle.Lifecycle
|
|
||||||
import androidx.lifecycle.LifecycleEventObserver
|
|
||||||
import androidx.lifecycle.LifecycleOwner
|
|
||||||
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
||||||
import com.simplemobiletools.calculator.compose.extensions.getActivity
|
import com.simplemobiletools.calculator.compose.theme.model.Theme
|
||||||
import com.simplemobiletools.calculator.compose.theme.Theme.Companion.systemDefaultMaterialYou
|
import com.simplemobiletools.calculator.compose.theme.model.Theme.Companion.systemDefaultMaterialYou
|
||||||
import com.simplemobiletools.calculator.extensions.config
|
import com.simplemobiletools.calculator.extensions.config
|
||||||
import com.simplemobiletools.calculator.helpers.Config
|
|
||||||
import com.simplemobiletools.commons.R
|
|
||||||
import com.simplemobiletools.commons.helpers.APP_ICON_IDS
|
|
||||||
import com.simplemobiletools.commons.helpers.APP_LAUNCHER_NAME
|
|
||||||
|
|
||||||
private val darkColorScheme = darkColorScheme(
|
|
||||||
primary = color_primary,
|
|
||||||
secondary = color_primary_dark,
|
|
||||||
tertiary = color_accent,
|
|
||||||
)
|
|
||||||
|
|
||||||
@get:ReadOnlyComposable
|
|
||||||
val disabledTextColor @Composable get() = if (isInDarkThemeAndSurfaceIsNotLitWell()) Color.DarkGray else Color.LightGray
|
|
||||||
|
|
||||||
@get:ReadOnlyComposable
|
|
||||||
val textSubTitleColor
|
|
||||||
@Composable get() = if (isInDarkThemeAndSurfaceIsNotLitWell()) {
|
|
||||||
Color.White.copy(0.5f)
|
|
||||||
} else {
|
|
||||||
Color.Black.copy(
|
|
||||||
0.5f,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@ReadOnlyComposable
|
internal fun Theme(
|
||||||
fun preferenceSummaryColor(isEnabled: Boolean) =
|
|
||||||
if (isEnabled) textSubTitleColor else disabledTextColor
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
@ReadOnlyComposable
|
|
||||||
fun preferenceTitleColor(isEnabled: Boolean) = if (isEnabled) MaterialTheme.colorScheme.onSurface else disabledTextColor
|
|
||||||
|
|
||||||
interface CommonTheme {
|
|
||||||
val primaryColorInt: Int
|
|
||||||
val backgroundColorInt: Int
|
|
||||||
val appIconColorInt: Int
|
|
||||||
val textColorInt: Int
|
|
||||||
|
|
||||||
val primaryColor get() = Color(primaryColorInt)
|
|
||||||
val backgroundColor get() = Color(backgroundColorInt)
|
|
||||||
val appIconColor get() = Color(appIconColorInt)
|
|
||||||
val textColor get() = Color(textColorInt)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Stable
|
|
||||||
sealed class Theme : CommonTheme {
|
|
||||||
data class SystemDefaultMaterialYou(
|
|
||||||
override val primaryColorInt: Int,
|
|
||||||
override val backgroundColorInt: Int,
|
|
||||||
override val appIconColorInt: Int,
|
|
||||||
override val textColorInt: Int
|
|
||||||
) : Theme()
|
|
||||||
|
|
||||||
data class White(
|
|
||||||
val accentColor: Int,
|
|
||||||
override val primaryColorInt: Int,
|
|
||||||
override val backgroundColorInt: Int,
|
|
||||||
override val appIconColorInt: Int,
|
|
||||||
override val textColorInt: Int
|
|
||||||
) : Theme()
|
|
||||||
|
|
||||||
data class Dark(
|
|
||||||
override val primaryColorInt: Int,
|
|
||||||
override val backgroundColorInt: Int,
|
|
||||||
override val appIconColorInt: Int,
|
|
||||||
override val textColorInt: Int
|
|
||||||
) : Theme()
|
|
||||||
|
|
||||||
data class BlackAndWhite(
|
|
||||||
val accentColor: Int,
|
|
||||||
override val primaryColorInt: Int,
|
|
||||||
override val backgroundColorInt: Int,
|
|
||||||
override val appIconColorInt: Int,
|
|
||||||
override val textColorInt: Int
|
|
||||||
) : Theme()
|
|
||||||
|
|
||||||
data class Custom(
|
|
||||||
override val primaryColorInt: Int,
|
|
||||||
override val backgroundColorInt: Int,
|
|
||||||
override val appIconColorInt: Int,
|
|
||||||
override val textColorInt: Int
|
|
||||||
) : Theme()
|
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@Composable
|
|
||||||
fun systemDefaultMaterialYou() = SystemDefaultMaterialYou(
|
|
||||||
appIconColorInt = LocalContext.current.config.appIconColor,
|
|
||||||
primaryColorInt = LocalContext.current.config.primaryColor,
|
|
||||||
backgroundColorInt = LocalContext.current.config.backgroundColor,
|
|
||||||
textColorInt = (if (isInDarkThemeAndSurfaceIsNotLitWell()) Color.White else Color.Black).toArgb()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
@ReadOnlyComposable
|
|
||||||
fun isInDarkThemeAndSurfaceIsNotLitWell() = isSystemInDarkTheme() || isSurfaceNotLitWell()
|
|
||||||
|
|
||||||
private const val LUMINANCE_THRESHOLD = 0.5f
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
@ReadOnlyComposable
|
|
||||||
fun isSurfaceNotLitWell() = MaterialTheme.colorScheme.surface.luminance() < LUMINANCE_THRESHOLD
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
@ReadOnlyComposable
|
|
||||||
fun isSurfaceLitWell() = MaterialTheme.colorScheme.surface.luminance() > LUMINANCE_THRESHOLD
|
|
||||||
|
|
||||||
fun Color.isLitWell() = luminance() > LUMINANCE_THRESHOLD
|
|
||||||
|
|
||||||
fun Color.isNotLitWell() = luminance() < LUMINANCE_THRESHOLD
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
private fun Theme(
|
|
||||||
theme: Theme = systemDefaultMaterialYou(),
|
theme: Theme = systemDefaultMaterialYou(),
|
||||||
content: @Composable () -> Unit,
|
content: @Composable () -> Unit,
|
||||||
) {
|
) {
|
||||||
|
@ -199,88 +75,3 @@ private fun Theme(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Context.getAppIconIds(): List<Int> = getActivity().getAppIconIds()
|
|
||||||
fun Activity.getAppIconIds(): ArrayList<Int> = ArrayList(intent.getIntegerArrayListExtra(APP_ICON_IDS).orEmpty())
|
|
||||||
private fun Context.getAppLauncherName(): String = getActivity().getAppLauncherName()
|
|
||||||
fun Activity.getAppLauncherName(): String = intent.getStringExtra(APP_LAUNCHER_NAME).orEmpty()
|
|
||||||
private fun updateRecentsAppIcon(baseConfig: Config, context: Context) {
|
|
||||||
if (baseConfig.isUsingModifiedAppIcon) {
|
|
||||||
val appIconIDs = context.getAppIconIds()
|
|
||||||
val currentAppIconColorIndex = baseConfig.getCurrentAppIconColorIndex(context)
|
|
||||||
if (appIconIDs.size - 1 < currentAppIconColorIndex) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val recentsIcon = BitmapFactory.decodeResource(context.resources, appIconIDs[currentAppIconColorIndex])
|
|
||||||
val title = context.getAppLauncherName()
|
|
||||||
val color = baseConfig.primaryColor
|
|
||||||
|
|
||||||
val description = ActivityManager.TaskDescription(title, recentsIcon, color)
|
|
||||||
context.getActivity().setTaskDescription(description)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Config.getCurrentAppIconColorIndex(context: Context): Int {
|
|
||||||
val appIconColor = appIconColor
|
|
||||||
context.getAppIconColors().forEachIndexed { index, color ->
|
|
||||||
if (color == appIconColor) {
|
|
||||||
return index
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Context.getAppIconColors() = resources.getIntArray(R.array.md_app_icon_colors).toCollection(ArrayList())
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun AppThemeSurface(
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
content: @Composable () -> Unit,
|
|
||||||
) {
|
|
||||||
val view = LocalView.current
|
|
||||||
|
|
||||||
val context = LocalContext.current
|
|
||||||
val materialYouTheme = systemDefaultMaterialYou()
|
|
||||||
var currentTheme by remember {
|
|
||||||
mutableStateOf(
|
|
||||||
if (view.isInEditMode) materialYouTheme else getTheme(
|
|
||||||
context = context,
|
|
||||||
materialYouTheme = materialYouTheme
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
OnLifecycleEvent { event ->
|
|
||||||
if (event == Lifecycle.Event.ON_START && !view.isInEditMode) {
|
|
||||||
currentTheme = getTheme(context = context, materialYouTheme = materialYouTheme)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Theme(theme = currentTheme) {
|
|
||||||
Surface(modifier = modifier.fillMaxSize()) {
|
|
||||||
content()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun Context.isDarkMode(): Boolean {
|
|
||||||
val darkModeFlag = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
|
|
||||||
return darkModeFlag == Configuration.UI_MODE_NIGHT_YES
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun OnLifecycleEvent(
|
|
||||||
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
|
|
||||||
onEvent: (event: Lifecycle.Event) -> Unit
|
|
||||||
) {
|
|
||||||
val currentOnEvent by rememberUpdatedState(onEvent)
|
|
||||||
DisposableEffect(lifecycleOwner) {
|
|
||||||
val observer = LifecycleEventObserver { _, event ->
|
|
||||||
currentOnEvent(event)
|
|
||||||
}
|
|
||||||
lifecycleOwner.lifecycle.addObserver(observer)
|
|
||||||
onDispose {
|
|
||||||
lifecycleOwner.lifecycle.removeObserver(observer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.ReadOnlyComposable
|
||||||
|
import androidx.compose.ui.graphics.luminance
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import com.simplemobiletools.calculator.compose.theme.model.Theme.Companion.systemDefaultMaterialYou
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun getCurrentTheme() = getTheme(LocalContext.current, systemDefaultMaterialYou())
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun isInDarkThemeAndSurfaceIsNotLitWell() = isSystemInDarkTheme() || isSurfaceNotLitWell()
|
||||||
|
|
||||||
|
internal const val LUMINANCE_THRESHOLD = 0.5f
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun isSurfaceNotLitWell(threshold: Float = LUMINANCE_THRESHOLD) = MaterialTheme.colorScheme.surface.luminance() < threshold
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun isSurfaceLitWell(threshold: Float = LUMINANCE_THRESHOLD) = MaterialTheme.colorScheme.surface.luminance() > threshold
|
||||||
|
|
||||||
|
fun Context.isDarkMode(): Boolean {
|
||||||
|
val darkModeFlag = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
|
||||||
|
return darkModeFlag == Configuration.UI_MODE_NIGHT_YES
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme.model
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Immutable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
interface CommonTheme {
|
||||||
|
val primaryColorInt: Int
|
||||||
|
val backgroundColorInt: Int
|
||||||
|
val appIconColorInt: Int
|
||||||
|
val textColorInt: Int
|
||||||
|
|
||||||
|
val primaryColor get() = Color(primaryColorInt)
|
||||||
|
val backgroundColor get() = Color(backgroundColorInt)
|
||||||
|
val appIconColor get() = Color(appIconColorInt)
|
||||||
|
val textColor get() = Color(textColorInt)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package com.simplemobiletools.calculator.compose.theme.model
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.Stable
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.graphics.toArgb
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import com.simplemobiletools.calculator.compose.theme.isInDarkThemeAndSurfaceIsNotLitWell
|
||||||
|
import com.simplemobiletools.calculator.extensions.config
|
||||||
|
|
||||||
|
@Stable
|
||||||
|
sealed class Theme : CommonTheme {
|
||||||
|
data class SystemDefaultMaterialYou(
|
||||||
|
override val primaryColorInt: Int,
|
||||||
|
override val backgroundColorInt: Int,
|
||||||
|
override val appIconColorInt: Int,
|
||||||
|
override val textColorInt: Int
|
||||||
|
) : Theme()
|
||||||
|
|
||||||
|
data class White(
|
||||||
|
val accentColor: Int,
|
||||||
|
override val primaryColorInt: Int,
|
||||||
|
override val backgroundColorInt: Int,
|
||||||
|
override val appIconColorInt: Int,
|
||||||
|
override val textColorInt: Int
|
||||||
|
) : Theme()
|
||||||
|
|
||||||
|
data class Dark(
|
||||||
|
override val primaryColorInt: Int,
|
||||||
|
override val backgroundColorInt: Int,
|
||||||
|
override val appIconColorInt: Int,
|
||||||
|
override val textColorInt: Int
|
||||||
|
) : Theme()
|
||||||
|
|
||||||
|
data class BlackAndWhite(
|
||||||
|
val accentColor: Int,
|
||||||
|
override val primaryColorInt: Int,
|
||||||
|
override val backgroundColorInt: Int,
|
||||||
|
override val appIconColorInt: Int,
|
||||||
|
override val textColorInt: Int
|
||||||
|
) : Theme()
|
||||||
|
|
||||||
|
data class Custom(
|
||||||
|
override val primaryColorInt: Int,
|
||||||
|
override val backgroundColorInt: Int,
|
||||||
|
override val appIconColorInt: Int,
|
||||||
|
override val textColorInt: Int
|
||||||
|
) : Theme()
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@Composable
|
||||||
|
fun systemDefaultMaterialYou() = SystemDefaultMaterialYou(
|
||||||
|
appIconColorInt = LocalContext.current.config.appIconColor,
|
||||||
|
primaryColorInt = LocalContext.current.config.primaryColor,
|
||||||
|
backgroundColorInt = LocalContext.current.config.backgroundColor,
|
||||||
|
textColorInt = (if (isInDarkThemeAndSurfaceIsNotLitWell()) Color.White else Color.Black).toArgb()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue