Remove colorState from list settings viewmodel

pull/3209/head
Alex Baker 11 months ago
parent a4cbbd2ed2
commit 4e0ed50e08

@ -13,6 +13,7 @@ import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
@ -44,9 +45,7 @@ import org.tasks.filters.Filter
import org.tasks.icons.OutlinedGoogleMaterial
import org.tasks.intents.TaskIntents
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.themes.ColorProvider
import org.tasks.themes.Theme
import org.tasks.themes.ThemeColor
import org.tasks.themes.contentColorFor
import org.tasks.widget.RequestPinWidgetReceiver
import org.tasks.widget.RequestPinWidgetReceiver.Companion.EXTRA_COLOR
@ -57,7 +56,6 @@ import javax.inject.Inject
abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicker.ColorPickedCallback, ColorWheelPicker.ColorPickedCallback {
@Inject lateinit var tasksTheme: Theme
@Inject lateinit var colorProvider: ColorProvider
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var firebase: Firebase
@ -91,16 +89,12 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
}
}
protected fun clearColor() {
onColorPicked(0)
}
protected fun showThemePicker() {
private fun showThemePicker() {
newColorPalette(null, 0, baseViewModel.color, Palette.COLORS)
.show(supportFragmentManager, FRAG_TAG_COLOR_PICKER)
}
val launcher = registerForIconPickerResult { selected ->
private val launcher = registerForIconPickerResult { selected ->
baseViewModel.setIcon(selected)
}
@ -110,28 +104,10 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
override fun onColorPicked(color: Int) {
baseViewModel.setColor(color)
updateTheme()
}
protected open fun promptDelete() { baseViewModel.promptDelete(true) }
protected fun updateTheme() {
val selectedColor = baseViewModel.color
val themeColor: ThemeColor =
if (selectedColor == 0) tasksTheme.themeColor
else colorProvider.getThemeColor(selectedColor, true)
baseViewModel.setColorState(
if (selectedColor == 0) Color.Unspecified
else Color((colorProvider.getThemeColor(selectedColor, true)).primaryColor)
)
//iconState.intValue = (getIconResId(selectedIcon) ?: getIconResId(defaultIcon))!!
themeColor.applyToNavigationBar(this)
}
/** Standard @Compose view content for descendants. Caller must wrap it to TasksTheme{} */
@Composable
protected fun BaseSettingsContent(
@ -144,12 +120,10 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
extensionContent: @Composable ColumnScope.() -> Unit = {},
) {
val viewState = baseViewModel.viewState.collectAsStateWithLifecycle().value
val color = if (viewState.color == 0) MaterialTheme.colorScheme.primary else Color(viewState.color)
ListSettingsScaffold(
title = title,
theme = if (viewState.colorState == Color.Unspecified)
Color(tasksTheme.themeColor.primaryColor)
else
viewState.colorState,
color = color,
promptDiscard = viewState.promptDiscard,
showProgress = viewState.showProgress,
dismissDiscardPrompt = { baseViewModel.promptDiscard(false) },
@ -159,7 +133,7 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
fab = fab,
) {
ListSettingsContent(
color = viewState.colorState,
color = viewState.color,
icon = viewState.icon ?: defaultIcon,
text = viewState.title,
error = viewState.error,
@ -170,22 +144,18 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
baseViewModel.setError("")
},
pickColor = { showThemePicker() },
clearColor = { clearColor() },
clearColor = { onColorPicked(0) },
pickIcon = { showIconPicker() },
addShortcutToHome = { createShortcut() },
addShortcutToHome = { createShortcut(color) },
addWidgetToHome = { createWidget() },
extensionContent = extensionContent,
)
}
}
protected fun createShortcut() {
protected fun createShortcut(color: Color) {
filter?.let {
val filterId = defaultFilterProvider.getFilterPreferenceValue(it)
val iconColor = if (baseViewModel.colorState == Color.Unspecified)
Color(tasksTheme.themeColor.primaryColor)
else
baseViewModel.colorState
val shortcutInfo = ShortcutInfoCompat.Builder(this, UUIDHelper.newUUID())
.setShortLabel(baseViewModel.title)
.setIcon(
@ -194,19 +164,16 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
try {
createShortcutIcon(
context = this,
backgroundColor = iconColor,
backgroundColor = color,
icon = icon,
iconColor = contentColorFor(iconColor.toArgb()),
iconColor = contentColorFor(color.toArgb()),
)
} catch (e: Exception) {
firebase.reportException(e)
null
}
}
?: createShortcutIcon(
this,
backgroundColor = iconColor
)
?: createShortcutIcon(this, backgroundColor = color)
)
.setIntent(TaskIntents.getTaskListByIdIntent(this, filterId))
.build()

@ -1,6 +1,5 @@
package org.tasks.activities
import androidx.compose.ui.graphics.Color
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@ -10,7 +9,6 @@ class BaseListSettingsViewModel : ViewModel() {
data class ViewState(
val title: String = "",
val error: String = "",
val colorState: Color = Color.Unspecified,
val showProgress: Boolean = false,
val promptDelete: Boolean = false,
val promptDiscard: Boolean = false,
@ -27,7 +25,9 @@ class BaseListSettingsViewModel : ViewModel() {
}
fun setColor(color: Int) {
_viewState.update { it.copy(color = color) }
_viewState.update {
it.copy(color = color)
}
}
fun setIcon(icon: String) {
@ -50,10 +50,6 @@ class BaseListSettingsViewModel : ViewModel() {
_viewState.update { it.copy(promptDelete = promptDelete) }
}
fun setColorState(colorState: Color) {
_viewState.update { it.copy(colorState = colorState) }
}
val title: String
get() = _viewState.value.title
@ -62,7 +58,4 @@ class BaseListSettingsViewModel : ViewModel() {
val color: Int
get() = _viewState.value.color
val colorState: Color
get() = _viewState.value.colorState
}

@ -76,7 +76,6 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
}
intent.getStringExtra(EXTRA_TITLE)?.let { baseViewModel.setTitle(it) }
}
updateTheme()
setContent {
TasksTheme { ActivityContent() }

@ -75,8 +75,6 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
Toaster(state = snackbar)
}
}
updateTheme()
}
override val filter: Filter?

@ -91,8 +91,6 @@ class PlaceSettingsActivity : BaseListSettingsActivity(),
sliderPos.floatValue = (place.radius / STEP * STEP).toFloat()
updateTheme()
setContent {
TasksTheme {
BaseSettingsContent {

@ -53,7 +53,6 @@ class TagSettingsActivity : BaseListSettingsActivity() {
BaseSettingsContent()
}
}
updateTheme()
}
override val filter: Filter?

@ -56,7 +56,6 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
baseViewModel.setIcon(caldavCalendar?.icon ?: defaultIcon)
}
}
updateTheme()
}
override val filter: Filter?

@ -85,7 +85,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
FloatingActionButton(
onClick = { openDialog.value = true },
modifier = Modifier.padding(Constants.KEYLINE_FIRST),
containerColor = Color(accent.accentColor)
containerColor = accentColor
) {
Icon(
imageVector = Icons.Outlined.PersonAdd,

@ -4,12 +4,11 @@ import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import org.tasks.compose.Constants
@Composable
fun ColumnScope.ListSettingsContent(
color: Color,
color: Int,
icon: String,
text: String,
error: String,

@ -33,7 +33,7 @@ import org.tasks.themes.colorOn
@Composable
fun ListSettingsScaffold(
title: String,
theme: Color,
color: Color,
promptDiscard: Boolean,
showProgress: Boolean,
dismissDiscardPrompt: () -> Unit,
@ -47,8 +47,8 @@ fun ListSettingsScaffold(
topBar = {
Column {
val context = LocalContext.current
val contentColor = colorOn(theme)
LaunchedEffect(theme, contentColor, context) {
val contentColor = colorOn(color)
LaunchedEffect(contentColor, context) {
val systemBarStyle = if (contentColor == Color.White) {
SystemBarStyle.dark(0)
} else {
@ -61,7 +61,7 @@ fun ListSettingsScaffold(
}
TopAppBar(
colors = TopAppBarDefaults.topAppBarColors(
containerColor = theme,
containerColor = color,
navigationIconContentColor = contentColor,
titleContentColor = contentColor,
actionIconContentColor = contentColor,

@ -16,6 +16,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.tooling.preview.Preview
@ -26,12 +27,12 @@ import org.tasks.kmp.org.tasks.compose.settings.SettingRow
import org.tasks.themes.TasksTheme
@Composable
fun SelectColorRow(color: Color, selectColor: () -> Unit, clearColor: () -> Unit) =
fun SelectColorRow(color: Int, selectColor: () -> Unit, clearColor: () -> Unit) =
SettingRow(
modifier = Modifier.clickable(onClick = selectColor),
left = {
IconButton(onClick = { selectColor() }) {
if (color == Color.Unspecified) {
if (color == 0) {
Icon(
imageVector = Icons.Outlined.NotInterested,
tint = colorResource(R.color.icon_tint_with_alpha),
@ -44,7 +45,7 @@ fun SelectColorRow(color: Color, selectColor: () -> Unit, clearColor: () -> Unit
contentAlignment = Alignment.Center
) {
Canvas(modifier = Modifier.size(24.dp)) {
drawCircle(color = color)
drawCircle(color = Color(color))
drawCircle(color = borderColor, style = Stroke(width = 4.0f)
)
}
@ -59,7 +60,7 @@ fun SelectColorRow(color: Color, selectColor: () -> Unit, clearColor: () -> Unit
)
},
right = {
if (color != Color.Unspecified) {
if (color != 0) {
IconButton(onClick = clearColor) {
Icon(
imageVector = Icons.Outlined.Clear,
@ -75,7 +76,7 @@ fun SelectColorRow(color: Color, selectColor: () -> Unit, clearColor: () -> Unit
private fun ColorSelectPreview () {
TasksTheme {
SelectColorRow(
color = Color.Red,
color = Color.Red.toArgb(),
selectColor = {},
clearColor = {}
)

@ -2,6 +2,7 @@ package org.tasks.opentasks
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.compose.material3.MaterialTheme
import androidx.compose.ui.graphics.Color
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
@ -26,12 +27,10 @@ class OpenTasksListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
setContent {
TasksTheme {
val viewState = baseViewModel.viewState.collectAsStateWithLifecycle().value
val color = if (viewState.color == 0) MaterialTheme.colorScheme.primary else Color(viewState.color)
ListSettingsScaffold(
title = toolbarTitle,
theme = if (viewState.colorState == Color.Unspecified)
Color(tasksTheme.themeColor.primaryColor)
else
viewState.colorState,
color = color,
promptDiscard = viewState.promptDiscard,
showProgress = viewState.showProgress,
dismissDiscardPrompt = { baseViewModel.promptDiscard(false) },
@ -39,7 +38,7 @@ class OpenTasksListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
discard = { finish() },
) {
SelectIconRow(icon = viewState.icon ?: defaultIcon) { showIconPicker() }
AddShortcutToHomeRow(onClick = { createShortcut() })
AddShortcutToHomeRow(onClick = { createShortcut(color) })
AddWidgetToHomeRow(onClick = { createWidget() })
}
Toaster(state = snackbar)

@ -10,6 +10,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.luminance
import androidx.compose.ui.graphics.toArgb
import org.tasks.kmp.org.tasks.themes.ColorProvider.saturated
const val BLUE = -14575885
const val WHITE = -1
@ -56,12 +57,16 @@ fun TasksTheme(
3 -> wallpaperScheme
else -> if (isSystemInDarkTheme()) darkColorScheme else lightColorScheme
}
val colorOnPrimary = colorOn(primary)
val desaturated = if (isSystemInDarkTheme()) {
saturated[primary] ?: primary
} else {
primary
}
val colorOnPrimary = colorOn(desaturated)
MaterialTheme(
colorScheme = colorScheme.copy(
primary = Color(primary),
primary = Color(desaturated),
onPrimary = colorOnPrimary,
secondary = Color.Red, // Hady: Sorry for this hack, I believe the regular solution is planned
),
) {
content()

Loading…
Cancel
Save