From 4e0ed50e08905bb2fcd10eaf09f448903ef19fe5 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 26 Dec 2024 02:44:06 -0600 Subject: [PATCH] Remove colorState from list settings viewmodel --- .../activities/BaseListSettingsActivity.kt | 57 ++++--------------- .../activities/BaseListSettingsViewModel.kt | 13 +---- .../activities/FilterSettingsActivity.kt | 1 - .../GoogleTaskListSettingsActivity.kt | 2 - .../tasks/activities/PlaceSettingsActivity.kt | 2 - .../tasks/activities/TagSettingsActivity.kt | 1 - .../BaseCaldavCalendarSettingsActivity.kt | 1 - .../caldav/CaldavCalendarSettingsActivity.kt | 2 +- .../compose/settings/ListSettingsContent.kt | 3 +- .../compose/settings/ListSettingsScaffold.kt | 8 +-- .../tasks/compose/settings/SelectColorRow.kt | 11 ++-- .../OpenTasksListSettingsActivity.kt | 9 ++- .../kotlin/org/tasks/themes/TasksTheme.kt | 11 +++- 13 files changed, 39 insertions(+), 82 deletions(-) diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt index b7c99a6df..f656af674 100644 --- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt @@ -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() diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsViewModel.kt b/app/src/main/java/org/tasks/activities/BaseListSettingsViewModel.kt index 9857de690..f40f9dd15 100644 --- a/app/src/main/java/org/tasks/activities/BaseListSettingsViewModel.kt +++ b/app/src/main/java/org/tasks/activities/BaseListSettingsViewModel.kt @@ -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 } diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt index ae77a7780..c40c1fd87 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt @@ -76,7 +76,6 @@ class FilterSettingsActivity : BaseListSettingsActivity() { } intent.getStringExtra(EXTRA_TITLE)?.let { baseViewModel.setTitle(it) } } - updateTheme() setContent { TasksTheme { ActivityContent() } diff --git a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt index dc58c1410..d3f527aae 100644 --- a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt @@ -75,8 +75,6 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() { Toaster(state = snackbar) } } - - updateTheme() } override val filter: Filter? diff --git a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt index 076cbf219..8c5f1d575 100644 --- a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt @@ -91,8 +91,6 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), sliderPos.floatValue = (place.radius / STEP * STEP).toFloat() - updateTheme() - setContent { TasksTheme { BaseSettingsContent { diff --git a/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt b/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt index 8396efec8..63c1b9448 100644 --- a/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt @@ -53,7 +53,6 @@ class TagSettingsActivity : BaseListSettingsActivity() { BaseSettingsContent() } } - updateTheme() } override val filter: Filter? diff --git a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt index fa1669faf..e47359c72 100644 --- a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt @@ -56,7 +56,6 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() { baseViewModel.setIcon(caldavCalendar?.icon ?: defaultIcon) } } - updateTheme() } override val filter: Filter? diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt index d87b05da6..d515ba476 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt @@ -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, diff --git a/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt b/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt index b54a24058..e1e35580d 100644 --- a/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt +++ b/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt @@ -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, diff --git a/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt b/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt index 73ebb0a2a..5f2e4cc46 100644 --- a/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt +++ b/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt @@ -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, diff --git a/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt b/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt index cdb0f717c..6eb889898 100644 --- a/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt +++ b/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt @@ -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 = {} ) diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt index 0c5de1f05..d9e451f82 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt @@ -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) diff --git a/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt b/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt index 6725ae08b..8bfcfc474 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt @@ -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()