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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save