diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt index 65d076d65..0a3f621c2 100644 --- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt @@ -1,30 +1,16 @@ package org.tasks.activities import android.os.Bundle -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch -import org.tasks.R -import org.tasks.compose.Constants import org.tasks.compose.DeleteButton import org.tasks.compose.IconPickerActivity.Companion.launchIconPicker import org.tasks.compose.IconPickerActivity.Companion.registerForIconPickerResult -import org.tasks.compose.settings.ProgressBar -import org.tasks.compose.settings.PromptAction -import org.tasks.compose.settings.SelectColorRow -import org.tasks.compose.settings.SelectIconRow -import org.tasks.compose.settings.SettingsSurface -import org.tasks.compose.settings.TitleInput -import org.tasks.compose.settings.Toolbar +import org.tasks.compose.settings.BaseSettingsContent import org.tasks.dialogs.ColorPalettePicker import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette import org.tasks.dialogs.ColorPickerAdapter.Palette @@ -125,42 +111,33 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), Co protected fun BaseSettingsContent( title: String = toolbarTitle ?: "", requestKeyboard: Boolean = isNew, - optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton { promptDelete() } }, + optionButton: @Composable () -> Unit = { + if (!isNew) DeleteButton(toolbarTitle ?: "") { promptDelete() } + }, extensionContent: @Composable ColumnScope.() -> Unit = {} ) { - SettingsSurface { - Toolbar( - title = title, - save = { lifecycleScope.launch { save() } }, - optionButton = optionButton - ) - ProgressBar(showProgress) - TitleInput( - text = textState, error = errorState, requestKeyboard = requestKeyboard, - modifier = Modifier.padding(horizontal = Constants.KEYLINE_FIRST) - ) - Column(modifier = Modifier.fillMaxWidth()) { - SelectColorRow( - color = colorState, - selectColor = { showThemePicker() }, - clearColor = { clearColor() }) - SelectIconRow( - icon = selectedIcon.value ?: defaultIcon, - selectIcon = { showIconPicker() }) - extensionContent() - - PromptAction( - showDialog = promptDelete, - title = stringResource(id = R.string.delete_tag_confirmation, title), - onAction = { lifecycleScope.launch { delete() } } - ) - PromptAction( - showDialog = promptDiscard, - title = stringResource(id = R.string.discard_changes), - onAction = { lifecycleScope.launch { finish() } } - ) - } - } + BaseSettingsContent( + title = title, + color = colorState.value, + icon = selectedIcon.value ?: defaultIcon, + text = textState.value, + error = errorState.value, + requestKeyboard = requestKeyboard, + promptDiscard = promptDiscard.value, + showProgress = showProgress.value, + dismissDiscardPrompt = { promptDiscard.value = false }, + setText = { + textState.value = it + errorState.value = "" + }, + save = { lifecycleScope.launch { save() } }, + pickColor = { showThemePicker() }, + clearColor = { clearColor() }, + pickIcon = { showIconPicker() }, + discard = { finish() }, + optionButton = optionButton, + extensionContent = extensionContent, + ) } companion object { diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt index 2dd8e8bf1..a640b609d 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt @@ -184,7 +184,7 @@ class FilterSettingsActivity : BaseListSettingsActivity() { IconButton(onClick = { help() }) { Icon(imageVector = Icons.Outlined.Help, contentDescription = "") } - } else DeleteButton{ promptDelete() } + } else DeleteButton(filter?.title ?: ""){ promptDelete() } } ) { FilterCondition( diff --git a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt index a79cc48c1..751f1c19e 100644 --- a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt @@ -199,7 +199,7 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() { @Composable fun BaseCaldavSettingsContent ( - optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton { promptDelete() } }, + optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton(caldavCalendar?.name ?: "") { promptDelete() } }, extensionContent: @Composable ColumnScope.() -> Unit = {} ) { BaseSettingsContent ( diff --git a/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt index 760cd3819..54820d3d8 100644 --- a/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt @@ -22,7 +22,7 @@ class LocalListSettingsActivity : BaseCaldavCalendarSettingsActivity() { setContent { TasksTheme { BaseCaldavSettingsContent ( - optionButton = { if (!isNew && canDelete) DeleteButton { promptDelete() } } + optionButton = { if (!isNew && canDelete) DeleteButton(caldavCalendar?.name ?: "") { promptDelete() } } ) } } diff --git a/app/src/main/java/org/tasks/compose/DeleteButton.kt b/app/src/main/java/org/tasks/compose/DeleteButton.kt index 150db2e99..b79b0fa23 100644 --- a/app/src/main/java/org/tasks/compose/DeleteButton.kt +++ b/app/src/main/java/org/tasks/compose/DeleteButton.kt @@ -6,16 +6,31 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import org.tasks.R +import org.tasks.compose.settings.PromptAction @Composable -fun DeleteButton(onClick: () -> Unit) { - IconButton(onClick = onClick) { +fun DeleteButton( + title: String, + onDelete: () -> Unit +) { + var promptDelete by remember { mutableStateOf(false) } + IconButton(onClick = { promptDelete = true }) { Icon( imageVector = Icons.Outlined.Delete, contentDescription = stringResource(id = R.string.delete), tint = MaterialTheme.colorScheme.onSurface, ) } + PromptAction( + showDialog = promptDelete, + title = stringResource(id = R.string.delete_tag_confirmation, title), + onAction = { onDelete() }, + onCancel = { promptDelete = false }, + ) } diff --git a/app/src/main/java/org/tasks/compose/edit/CommentsRow.kt b/app/src/main/java/org/tasks/compose/edit/CommentsRow.kt index c554f8215..5a767b1c0 100644 --- a/app/src/main/java/org/tasks/compose/edit/CommentsRow.kt +++ b/app/src/main/java/org/tasks/compose/edit/CommentsRow.kt @@ -12,6 +12,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import org.tasks.R @@ -57,7 +58,9 @@ fun Comment( ) { Row(verticalAlignment = Alignment.Top) { Column( - modifier = Modifier.weight(1f).padding(top = 8.dp), + modifier = Modifier + .weight(1f) + .padding(top = 8.dp), ) { comment.message?.let { // TODO: linkify text @@ -70,7 +73,9 @@ fun Comment( AsyncImage( model = it, contentDescription = null, - modifier = Modifier.clickable { openImage(it) }.size(100.dp) + modifier = Modifier + .clickable { openImage(it) } + .size(100.dp) ) } Text( @@ -79,11 +84,8 @@ fun Comment( color = MaterialTheme.colorScheme.onSurface, ) } - DeleteButton( - onClick = { - // TODO: add confirmation dialog - deleteComment(comment) - } - ) + DeleteButton(stringResource(R.string.delete_comment)) { + deleteComment(comment) + } } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/compose/settings/BaseSettingsContent.kt b/app/src/main/java/org/tasks/compose/settings/BaseSettingsContent.kt new file mode 100644 index 000000000..28c107d60 --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/BaseSettingsContent.kt @@ -0,0 +1,68 @@ +package org.tasks.compose.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import org.tasks.R +import org.tasks.compose.Constants + +@Composable +fun BaseSettingsContent( + title: String, + color: Color, + icon: String, + text: String, + error: String, + requestKeyboard: Boolean, + promptDiscard: Boolean, + showProgress: Boolean, + dismissDiscardPrompt: () -> Unit, + setText: (String) -> Unit, + save: () -> Unit, + pickColor: () -> Unit, + clearColor: () -> Unit, + pickIcon: () -> Unit, + discard: () -> Unit, + optionButton: @Composable () -> Unit, + extensionContent: @Composable ColumnScope.() -> Unit, +) { + SettingsSurface { + Toolbar( + title = title, + save = { save() }, + optionButton = optionButton + ) + ProgressBar(showProgress) + TitleInput( + text = text, + error = error, + requestKeyboard = requestKeyboard, + modifier = Modifier.padding(horizontal = Constants.KEYLINE_FIRST), + setText = { setText(it) }, + ) + Column(modifier = Modifier.fillMaxWidth()) { + SelectColorRow( + color = color, + selectColor = { pickColor() }, + clearColor = { clearColor() }, + ) + SelectIconRow( + icon = icon, + selectIcon = { pickIcon() }, + ) + extensionContent() + + PromptAction( + showDialog = promptDiscard, + title = stringResource(id = R.string.discard_changes), + onAction = { discard() }, + onCancel = { dismissDiscardPrompt() }, + ) + } + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt b/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt index 772e62bd3..b441e005c 100644 --- a/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt +++ b/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt @@ -7,18 +7,17 @@ import androidx.compose.foundation.layout.requiredHeight import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource import androidx.compose.ui.unit.dp @Composable -fun ProgressBar(showProgress: State) { +fun ProgressBar(showProgress: Boolean) { Box(modifier = Modifier .fillMaxWidth() .requiredHeight(3.dp)) { - if (showProgress.value) { + if (showProgress) { LinearProgressIndicator( modifier = Modifier.fillMaxSize(), trackColor = LocalContentColor.current.copy(alpha = 0.3f), //Color.LightGray, diff --git a/app/src/main/java/org/tasks/compose/settings/PromptAction.kt b/app/src/main/java/org/tasks/compose/settings/PromptAction.kt index 933233dcb..f84098d2e 100644 --- a/app/src/main/java/org/tasks/compose/settings/PromptAction.kt +++ b/app/src/main/java/org/tasks/compose/settings/PromptAction.kt @@ -4,9 +4,6 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.tooling.preview.Preview import org.tasks.R import org.tasks.compose.Constants @@ -14,12 +11,12 @@ import org.tasks.themes.TasksTheme @Composable fun PromptAction( - showDialog: MutableState, + showDialog: Boolean, title: String, onAction: () -> Unit, - onCancel: () -> Unit = { showDialog.value = false } + onCancel: () -> Unit, ) { - if (showDialog.value) { + if (showDialog) { AlertDialog( onDismissRequest = onCancel, title = { Text(title, style = MaterialTheme.typography.headlineSmall) }, @@ -34,8 +31,10 @@ fun PromptAction( private fun PromptActionPreview() { TasksTheme { PromptAction( - showDialog = remember { mutableStateOf(true) }, + showDialog = true, title = "Delete list?", - onAction = { /*TODO*/ }) + onAction = { /*TODO*/ }, + onCancel = {}, + ) } } 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 dfe98ce41..cdb0f717c 100644 --- a/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt +++ b/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt @@ -12,9 +12,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -29,12 +26,12 @@ import org.tasks.kmp.org.tasks.compose.settings.SettingRow import org.tasks.themes.TasksTheme @Composable -fun SelectColorRow(color: State, selectColor: () -> Unit, clearColor: () -> Unit) = +fun SelectColorRow(color: Color, selectColor: () -> Unit, clearColor: () -> Unit) = SettingRow( modifier = Modifier.clickable(onClick = selectColor), left = { IconButton(onClick = { selectColor() }) { - if (color.value == Color.Unspecified) { + if (color == Color.Unspecified) { Icon( imageVector = Icons.Outlined.NotInterested, tint = colorResource(R.color.icon_tint_with_alpha), @@ -47,7 +44,7 @@ fun SelectColorRow(color: State, selectColor: () -> Unit, clearColor: () contentAlignment = Alignment.Center ) { Canvas(modifier = Modifier.size(24.dp)) { - drawCircle(color = color.value) + drawCircle(color = color) drawCircle(color = borderColor, style = Stroke(width = 4.0f) ) } @@ -62,7 +59,7 @@ fun SelectColorRow(color: State, selectColor: () -> Unit, clearColor: () ) }, right = { - if (color.value != Color.Unspecified) { + if (color != Color.Unspecified) { IconButton(onClick = clearColor) { Icon( imageVector = Icons.Outlined.Clear, @@ -78,7 +75,7 @@ fun SelectColorRow(color: State, selectColor: () -> Unit, clearColor: () private fun ColorSelectPreview () { TasksTheme { SelectColorRow( - color = remember { mutableStateOf(Color.Red) }, + color = Color.Red, selectColor = {}, clearColor = {} ) diff --git a/app/src/main/java/org/tasks/compose/settings/TitleInput.kt b/app/src/main/java/org/tasks/compose/settings/TitleInput.kt index 499c2de9a..3d5f34e7b 100644 --- a/app/src/main/java/org/tasks/compose/settings/TitleInput.kt +++ b/app/src/main/java/org/tasks/compose/settings/TitleInput.kt @@ -12,7 +12,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -32,9 +31,10 @@ import org.tasks.R @Composable fun TitleInput( - text: MutableState, - error: MutableState, + text: String, + error: String, requestKeyboard: Boolean, + setText: (String) -> Unit, modifier: Modifier = Modifier, label: String = stringResource(R.string.display_name), errorState: Color = MaterialTheme.colorScheme.secondary, @@ -45,12 +45,12 @@ fun TitleInput( val requester = remember { FocusRequester() } val focused = remember { mutableStateOf(false) } val labelColor = when { - (error.value != "") -> errorState + (error != "") -> errorState (focused.value) -> activeState else -> inactiveState } val dividerColor = if (focused.value) errorState else labelColor - val labelText = if (error.value != "") error.value else label + val labelText = if (error != "") error else label Row (modifier = modifier) { @@ -65,15 +65,12 @@ fun TitleInput( ) BasicTextField( - value = text.value, + value = text, textStyle = TextStyle( fontSize = LocalTextStyle.current.fontSize, color = LocalContentColor.current ), - onValueChange = { - text.value = it - if (error.value != "") error.value = "" - }, + onValueChange = { setText(it) }, cursorBrush = SolidColor(errorState), // SolidColor(LocalContentColor.current), modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/org/tasks/compose/settings/Toolbar.kt b/app/src/main/java/org/tasks/compose/settings/Toolbar.kt index badfce72e..c29de97db 100644 --- a/app/src/main/java/org/tasks/compose/settings/Toolbar.kt +++ b/app/src/main/java/org/tasks/compose/settings/Toolbar.kt @@ -73,7 +73,7 @@ private fun TitleBarPreview() { Toolbar( title = "Toolbar title", save = { /*TODO*/ }, - optionButton = { DeleteButton {} } + optionButton = { DeleteButton("test") {} } ) } } diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt index fafb1764b..20b5dc673 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt @@ -29,7 +29,7 @@ class OpenTasksListSettingsActivity : BaseCaldavCalendarSettingsActivity() { save = { lifecycleScope.launch { save() } }, optionButton = { }, ) - ProgressBar(showProgress) + ProgressBar(showProgress.value) SelectIconRow(icon = selectedIcon.value?: defaultIcon) { showIconPicker() } } Toaster(state = snackbar) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 990e2a483..ef9f93be1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -262,6 +262,7 @@ File %1$s contained %2$s.\n\n Create new tag Create new list Delete %s? + comment Timers Active for %s! Timer started this task: