Update list settings

* Remove unused resources
* Fix check for icon changes
* Break out composables
pull/3193/head
Alex Baker 12 months ago
parent dc031da1b9
commit e17a6762d9

@ -18,13 +18,13 @@ 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.ListSettings.ProgressBar
import org.tasks.compose.ListSettings.SettingsSurface
import org.tasks.compose.ListSettings.TitleInput
import org.tasks.compose.ListSettings.Toolbar
import org.tasks.compose.ListSettings.PromptAction
import org.tasks.compose.ListSettings.SelectColorRow
import org.tasks.compose.ListSettings.SelectIconRow
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.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
import org.tasks.dialogs.ColorPickerAdapter.Palette
@ -122,7 +122,7 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), Co
/** Standard @Compose view content for descendants. Caller must wrap it to TasksTheme{} */
@Composable
protected fun baseSettingsContent(
protected fun BaseSettingsContent(
title: String = toolbarTitle ?: "",
requestKeyboard: Boolean = isNew,
optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton { promptDelete() } },
@ -166,7 +166,6 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), Co
companion object {
private const val EXTRA_SELECTED_THEME = "extra_selected_theme"
private const val EXTRA_SELECTED_ICON = "extra_selected_icon"
private const val FRAG_TAG_ICON_PICKER = "frag_tag_icon_picker"
private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
}
}

@ -6,10 +6,10 @@ import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Help
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
@ -269,7 +269,7 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.TopStart
) {
baseSettingsContent(
BaseSettingsContent(
optionButton = {
if (isNew) {
IconButton(onClick = { help() }) {

@ -18,7 +18,7 @@ import kotlinx.coroutines.withContext
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
import org.tasks.compose.ListSettings.Toaster
import org.tasks.compose.settings.Toaster
import org.tasks.data.dao.GoogleTaskListDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
@ -70,7 +70,7 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
setContent {
TasksTheme {
baseSettingsContent()
BaseSettingsContent()
Toaster(state = snackbar)
}
}
@ -162,7 +162,7 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
private fun colorChanged() = selectedColor != gtasksList.color
private fun iconChanged() = selectedIcon.value != gtasksList.icon
private fun iconChanged() = selectedIcon.value != (gtasksList.icon ?: TasksIcons.LIST)
private fun nameChanged() = newName != gtasksList.name

@ -96,7 +96,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(),
setContent {
TasksTheme {
baseSettingsContent {
BaseSettingsContent {
Row(
modifier = Modifier
.requiredHeight(56.dp)
@ -158,7 +158,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(),
override fun hasChanges() = textState.value != place.displayName
|| selectedColor != place.color
|| selectedIcon.value != place.icon
|| selectedIcon.value != (place.icon ?: TasksIcons.PLACE)
override suspend fun save() {
val newName: String = textState.value

@ -49,7 +49,7 @@ class TagSettingsActivity : BaseListSettingsActivity() {
setContent {
TasksTheme {
baseSettingsContent()
BaseSettingsContent()
}
}
updateTheme()
@ -120,7 +120,7 @@ class TagSettingsActivity : BaseListSettingsActivity() {
selectedColor >= 0 || selectedIcon.value?.isBlank() == false || !isNullOrEmpty(newName)
} else {
selectedColor != (tagData.color ?: 0)
|| selectedIcon.value != tagData.icon
|| selectedIcon.value != (tagData.icon ?: TasksIcons.LABEL)
|| newName != tagData.name
}
}

@ -17,7 +17,7 @@ import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
import org.tasks.activities.BaseListSettingsActivity
import org.tasks.compose.DeleteButton
import org.tasks.compose.ListSettings.Toaster
import org.tasks.compose.settings.Toaster
import org.tasks.data.UUIDHelper
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.CaldavAccount
@ -162,7 +162,7 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
private fun colorChanged(): Boolean = selectedColor != caldavCalendar!!.color
private fun iconChanged(): Boolean = selectedIcon.value != caldavCalendar!!.icon
private fun iconChanged(): Boolean = selectedIcon.value != (caldavCalendar!!.icon ?: TasksIcons.LIST)
private val newName: String
get() = textState.value.trim { it <= ' '}
@ -198,11 +198,11 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
}
@Composable
fun baseCaldavSettingsContent (
fun BaseCaldavSettingsContent (
optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton { promptDelete() } },
extensionContent: @Composable ColumnScope.() -> Unit = {}
) {
baseSettingsContent (
BaseSettingsContent (
optionButton = optionButton,
extensionContent = extensionContent
)

@ -6,6 +6,8 @@ import androidx.activity.viewModels
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.PersonAdd
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
@ -16,7 +18,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
@ -67,7 +68,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
setContent {
TasksTheme {
Box(contentAlignment = Alignment.TopStart) {// Box to layout FAB over main content
baseCaldavSettingsContent {
BaseCaldavSettingsContent {
caldavCalendar?.takeIf { it.id > 0 }?.let { calendar->
val principals = principalDao.getPrincipals(calendar.id).collectAsStateWithLifecycle(initialValue = emptyList()).value
PrincipalList(
@ -137,7 +138,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
containerColor = MaterialTheme.colorScheme.secondary
) {
Icon(
painter = painterResource(R.drawable.ic_outline_person_add_24),
imageVector = Icons.Outlined.PersonAdd,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSecondary,
)

@ -4,11 +4,10 @@ import android.os.Bundle
import androidx.activity.compose.setContent
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.runBlocking
import org.tasks.R
import org.tasks.compose.DeleteButton
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.dao.CaldavDao
import org.tasks.themes.TasksTheme
@AndroidEntryPoint
@ -22,7 +21,7 @@ class LocalListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
setContent {
TasksTheme {
baseCaldavSettingsContent (
BaseCaldavSettingsContent (
optionButton = { if (!isNew && canDelete) DeleteButton { promptDelete() } }
)
}

@ -62,8 +62,8 @@ import androidx.compose.ui.window.Dialog
import androidx.core.os.ConfigurationCompat
import com.todoroo.astrid.core.CriterionInstance
import org.tasks.R
import org.tasks.compose.ListSettings.SettingRow
import org.tasks.compose.SwipeOut.SwipeOut
import org.tasks.kmp.org.tasks.compose.settings.SettingRow
import org.tasks.extensions.formatNumber
import org.tasks.themes.TasksTheme
import java.util.Locale

@ -1,374 +0,0 @@
package org.tasks.compose
/**
* Composables for BaseListSettingActivity
*/
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material3.Snackbar
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
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.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay
import org.tasks.R
import org.tasks.compose.components.TasksIcon
import org.tasks.themes.TasksIcons
import org.tasks.themes.TasksTheme
@Composable
@Preview (showBackground = true)
private fun TitleBarPreview() {
TasksTheme {
ListSettings.Toolbar(
title = "Tollbar title",
save = { /*TODO*/ }, optionButton = { DeleteButton {} }
)
}
}
@Composable
@Preview(showBackground = true)
private fun PromptActionPreview() {
TasksTheme {
ListSettings.PromptAction(
showDialog = remember { mutableStateOf(true) },
title = "Delete list?",
onAction = { /*TODO*/ })
}
}
@Composable
@Preview (showBackground = true)
private fun IconSelectPreview () {
TasksTheme {
ListSettings.SelectIconRow(
icon = TasksIcons.FILTER_LIST,
selectIcon = {}
)
}
}
@Composable
@Preview (showBackground = true)
private fun ColorSelectPreview () {
TasksTheme {
ListSettings.SelectColorRow(
color = remember { mutableStateOf(Color.Red) },
selectColor = {},
clearColor = {}
)
}
}
object ListSettings {
@Composable
fun Toolbar(
title: String,
save: () -> Unit,
optionButton: @Composable () -> Unit,
) {
/* Hady: reminder for the future
val activity = LocalView.current.context as Activity
activity.window.statusBarColor = colorResource(id = R.color.drawer_color_selected).toArgb()
*/
Surface(
shadowElevation = 4.dp,
color = colorResource(id = R.color.content_background),
contentColor = colorResource(id = R.color.text_primary),
modifier = Modifier.requiredHeight(56.dp)
)
{
Row(verticalAlignment = Alignment.CenterVertically) {
IconButton(onClick = save, modifier = Modifier.size(56.dp)) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_outline_save_24px),
contentDescription = stringResource(id = R.string.save),
)
}
Text(
text = title,
fontWeight = FontWeight.Medium,
fontSize = 20.sp,
modifier = Modifier
.weight(0.9f)
.padding(start = Constants.KEYLINE_FIRST)
)
optionButton()
}
}
} /* ToolBar */
@Composable
fun ProgressBar(showProgress: State<Boolean>) {
Box(modifier = Modifier
.fillMaxWidth()
.requiredHeight(3.dp))
{
if (showProgress.value) {
LinearProgressIndicator(
modifier = Modifier.fillMaxSize(),
trackColor = LocalContentColor.current.copy(alpha = 0.3f), //Color.LightGray,
color = colorResource(org.tasks.kmp.R.color.red_a400)
)
}
}
}
@Composable
fun TitleInput(
text: MutableState<String>,
error: MutableState<String>,
requestKeyboard: Boolean,
modifier: Modifier = Modifier,
label: String = stringResource(R.string.display_name),
errorState: Color = MaterialTheme.colorScheme.secondary,
activeState: Color = LocalContentColor.current.copy(alpha = 0.75f),
inactiveState: Color = LocalContentColor.current.copy(alpha = 0.3f),
) {
val keyboardController = LocalSoftwareKeyboardController.current
val requester = remember { FocusRequester() }
val focused = remember { mutableStateOf(false) }
val labelColor = when {
(error.value != "") -> errorState
(focused.value) -> activeState
else -> inactiveState
}
val dividerColor = if (focused.value) errorState else labelColor
val labelText = if (error.value != "") error.value else label
Row (modifier = modifier)
{
Column {
Text(
modifier = Modifier.padding(top = 18.dp, bottom = 4.dp),
text = labelText,
fontSize = 12.sp,
letterSpacing = 0.sp,
fontWeight = FontWeight.Medium,
color = labelColor
)
BasicTextField(
value = text.value,
textStyle = TextStyle(
fontSize = LocalTextStyle.current.fontSize,
color = LocalContentColor.current
),
onValueChange = {
text.value = it
if (error.value != "") error.value = ""
},
cursorBrush = SolidColor(errorState), // SolidColor(LocalContentColor.current),
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 3.dp)
.focusRequester(requester)
.onFocusChanged { focused.value = (it.isFocused) }
)
HorizontalDivider(
color = dividerColor,
modifier = Modifier.padding(bottom = 8.dp)
)
}
}
if (requestKeyboard) {
LaunchedEffect(null) {
requester.requestFocus()
delay(30) // Workaround. Otherwise keyboard don't show in 4/5 tries
keyboardController?.show()
}
}
} /* TextInput */
@Composable
fun SelectColorRow(color: State<Color>, selectColor: () -> Unit, clearColor: () -> Unit) =
SettingRow(
modifier = Modifier.clickable(onClick = selectColor),
left = {
IconButton(onClick = { selectColor() }) {
if (color.value == Color.Unspecified) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_outline_not_interested_24px),
tint = colorResource(R.color.icon_tint_with_alpha),
contentDescription = null
)
} else {
val borderColor = colorResource(R.color.icon_tint_with_alpha) // colorResource(R.color.text_tertiary)
Box(
modifier = Modifier.size(56.dp),
contentAlignment = Alignment.Center
) {
Canvas(modifier = Modifier.size(24.dp)) {
drawCircle(color = color.value)
drawCircle(color = borderColor, style = Stroke(width = 4.0f)
)
}
}
}
}
},
center = {
Text(
text = LocalContext.current.getString(R.string.color),
modifier = Modifier.padding(start = Constants.KEYLINE_FIRST)
)
},
right = {
if (color.value != Color.Unspecified) {
IconButton(onClick = clearColor) {
Icon(
imageVector = ImageVector.vectorResource(id = R.drawable.ic_outline_clear_24px),
contentDescription = null
)
}
}
}
)
@Composable
fun SelectIconRow(icon: String, selectIcon: () -> Unit) =
SettingRow(
modifier = Modifier.clickable(onClick = selectIcon),
left = {
IconButton(onClick = selectIcon) {
TasksIcon(
label = icon,
tint = colorResource(R.color.icon_tint_with_alpha)
)
}
},
center = {
Text(
text = LocalContext.current.getString(R.string.icon),
modifier = Modifier.padding(start = Constants.KEYLINE_FIRST)
)
}
)
@Composable
fun SettingRow(
left: @Composable () -> Unit,
center: @Composable () -> Unit,
right: @Composable (() -> Unit)? = null,
modifier: Modifier = Modifier
) {
Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) {
Box (modifier = Modifier.size(56.dp), contentAlignment = Alignment.Center) {
left()
}
Box (
modifier = Modifier
.height(56.dp)
.weight(1f), contentAlignment = Alignment.CenterStart
) {
center()
}
right?.let {
Box (modifier = Modifier.size(56.dp), contentAlignment = Alignment.Center) {
it.invoke()
}
}
}
}
@Composable
fun SettingsSurface(content: @Composable ColumnScope.() -> Unit) {
ProvideTextStyle(LocalTextStyle.current.copy(fontSize = 18.sp)) {
Surface(
color = colorResource(id = R.color.window_background),
contentColor = colorResource(id = R.color.text_primary)
) {
Column(modifier = Modifier.fillMaxSize()) { content() }
}
}
}
@Composable
fun Toaster(state: SnackbarHostState) {
SnackbarHost(state) { data ->
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Snackbar(
modifier = Modifier.padding(horizontal = 24.dp),
shape = RoundedCornerShape(10.dp),
containerColor = colorResource(id = R.color.snackbar_background),
contentColor = colorResource(id = R.color.snackbar_text_color),
) {
Text(text = data.visuals.message, fontSize = 18.sp)
}
}
}
}
@Composable
fun PromptAction(
showDialog: MutableState<Boolean>,
title: String,
onAction: () -> Unit,
onCancel: () -> Unit = { showDialog.value = false }
) {
if (showDialog.value) {
AlertDialog(
onDismissRequest = onCancel,
title = { Text(title, style = MaterialTheme.typography.headlineSmall) },
confirmButton = { Constants.TextButton(text = R.string.ok, onClick = onAction) },
dismissButton = { Constants.TextButton(text = R.string.cancel, onClick = onCancel) }
)
}
}
}

@ -11,6 +11,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Clear
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@ -153,7 +155,7 @@ object ListSettingsComposables {
modifier = Modifier.then(Modifier.size(24.dp)),
onClick = { it(principal) }) {
Icon(
painter = painterResource(R.drawable.ic_outline_clear_24px),
imageVector = Icons.Outlined.Clear,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.alpha(ICON_ALPHA)

@ -0,0 +1,29 @@
package org.tasks.compose.settings
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
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<Boolean>) {
Box(modifier = Modifier
.fillMaxWidth()
.requiredHeight(3.dp))
{
if (showProgress.value) {
LinearProgressIndicator(
modifier = Modifier.fillMaxSize(),
trackColor = LocalContentColor.current.copy(alpha = 0.3f), //Color.LightGray,
color = colorResource(org.tasks.kmp.R.color.red_a400)
)
}
}
}

@ -0,0 +1,41 @@
package org.tasks.compose.settings
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
import org.tasks.themes.TasksTheme
@Composable
fun PromptAction(
showDialog: MutableState<Boolean>,
title: String,
onAction: () -> Unit,
onCancel: () -> Unit = { showDialog.value = false }
) {
if (showDialog.value) {
AlertDialog(
onDismissRequest = onCancel,
title = { Text(title, style = MaterialTheme.typography.headlineSmall) },
confirmButton = { Constants.TextButton(text = R.string.ok, onClick = onAction) },
dismissButton = { Constants.TextButton(text = R.string.cancel, onClick = onCancel) }
)
}
}
@Composable
@Preview(showBackground = true)
private fun PromptActionPreview() {
TasksTheme {
PromptAction(
showDialog = remember { mutableStateOf(true) },
title = "Delete list?",
onAction = { /*TODO*/ })
}
}

@ -0,0 +1,86 @@
package org.tasks.compose.settings
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Clear
import androidx.compose.material.icons.outlined.NotInterested
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
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.tasks.R
import org.tasks.compose.Constants
import org.tasks.kmp.org.tasks.compose.settings.SettingRow
import org.tasks.themes.TasksTheme
@Composable
fun SelectColorRow(color: State<Color>, selectColor: () -> Unit, clearColor: () -> Unit) =
SettingRow(
modifier = Modifier.clickable(onClick = selectColor),
left = {
IconButton(onClick = { selectColor() }) {
if (color.value == Color.Unspecified) {
Icon(
imageVector = Icons.Outlined.NotInterested,
tint = colorResource(R.color.icon_tint_with_alpha),
contentDescription = null
)
} else {
val borderColor = colorResource(R.color.icon_tint_with_alpha) // colorResource(R.color.text_tertiary)
Box(
modifier = Modifier.size(56.dp),
contentAlignment = Alignment.Center
) {
Canvas(modifier = Modifier.size(24.dp)) {
drawCircle(color = color.value)
drawCircle(color = borderColor, style = Stroke(width = 4.0f)
)
}
}
}
}
},
center = {
Text(
text = LocalContext.current.getString(R.string.color),
modifier = Modifier.padding(start = Constants.KEYLINE_FIRST)
)
},
right = {
if (color.value != Color.Unspecified) {
IconButton(onClick = clearColor) {
Icon(
imageVector = Icons.Outlined.Clear,
contentDescription = null
)
}
}
}
)
@Composable
@Preview(showBackground = true)
private fun ColorSelectPreview () {
TasksTheme {
SelectColorRow(
color = remember { mutableStateOf(Color.Red) },
selectColor = {},
clearColor = {}
)
}
}

@ -0,0 +1,48 @@
package org.tasks.compose.settings
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.tooling.preview.Preview
import org.tasks.R
import org.tasks.compose.Constants
import org.tasks.compose.components.TasksIcon
import org.tasks.kmp.org.tasks.compose.settings.SettingRow
import org.tasks.themes.TasksIcons
import org.tasks.themes.TasksTheme
@Composable
fun SelectIconRow(icon: String, selectIcon: () -> Unit) =
SettingRow(
modifier = Modifier.clickable(onClick = selectIcon),
left = {
IconButton(onClick = selectIcon) {
TasksIcon(
label = icon,
tint = colorResource(R.color.icon_tint_with_alpha)
)
}
},
center = {
Text(
text = LocalContext.current.getString(R.string.icon),
modifier = Modifier.padding(start = Constants.KEYLINE_FIRST)
)
}
)
@Composable
@Preview(showBackground = true)
private fun IconSelectPreview () {
TasksTheme {
SelectIconRow(
icon = TasksIcons.FILTER_LIST,
selectIcon = {}
)
}
}

@ -0,0 +1,25 @@
package org.tasks.compose.settings
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.unit.sp
import org.tasks.R
@Composable
fun SettingsSurface(content: @Composable ColumnScope.() -> Unit) {
ProvideTextStyle(LocalTextStyle.current.copy(fontSize = 18.sp)) {
Surface(
color = colorResource(id = R.color.window_background),
contentColor = colorResource(id = R.color.text_primary)
) {
Column(modifier = Modifier.fillMaxSize()) { content() }
}
}
}

@ -0,0 +1,98 @@
package org.tasks.compose.settings
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.LocalTextStyle
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
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay
import org.tasks.R
@Composable
fun TitleInput(
text: MutableState<String>,
error: MutableState<String>,
requestKeyboard: Boolean,
modifier: Modifier = Modifier,
label: String = stringResource(R.string.display_name),
errorState: Color = MaterialTheme.colorScheme.secondary,
activeState: Color = LocalContentColor.current.copy(alpha = 0.75f),
inactiveState: Color = LocalContentColor.current.copy(alpha = 0.3f),
) {
val keyboardController = LocalSoftwareKeyboardController.current
val requester = remember { FocusRequester() }
val focused = remember { mutableStateOf(false) }
val labelColor = when {
(error.value != "") -> errorState
(focused.value) -> activeState
else -> inactiveState
}
val dividerColor = if (focused.value) errorState else labelColor
val labelText = if (error.value != "") error.value else label
Row (modifier = modifier)
{
Column {
Text(
modifier = Modifier.padding(top = 18.dp, bottom = 4.dp),
text = labelText,
fontSize = 12.sp,
letterSpacing = 0.sp,
fontWeight = FontWeight.Medium,
color = labelColor
)
BasicTextField(
value = text.value,
textStyle = TextStyle(
fontSize = LocalTextStyle.current.fontSize,
color = LocalContentColor.current
),
onValueChange = {
text.value = it
if (error.value != "") error.value = ""
},
cursorBrush = SolidColor(errorState), // SolidColor(LocalContentColor.current),
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 3.dp)
.focusRequester(requester)
.onFocusChanged { focused.value = (it.isFocused) }
)
HorizontalDivider(
color = dividerColor,
modifier = Modifier.padding(bottom = 8.dp)
)
}
}
if (requestKeyboard) {
LaunchedEffect(null) {
requester.requestFocus()
delay(30) // Workaround. Otherwise keyboard don't show in 4/5 tries
keyboardController?.show()
}
}
}

@ -0,0 +1,36 @@
package org.tasks.compose.settings
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Snackbar
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
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.colorResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import org.tasks.R
@Composable
fun Toaster(state: SnackbarHostState) {
SnackbarHost(state) { data ->
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Snackbar(
modifier = Modifier.padding(horizontal = 24.dp),
shape = RoundedCornerShape(10.dp),
containerColor = colorResource(id = R.color.snackbar_background),
contentColor = colorResource(id = R.color.snackbar_text_color),
) {
Text(text = data.visuals.message, fontSize = 18.sp)
}
}
}
}

@ -0,0 +1,79 @@
package org.tasks.compose.settings
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import org.tasks.R
import org.tasks.compose.Constants
import org.tasks.compose.DeleteButton
import org.tasks.themes.TasksTheme
@Composable
fun Toolbar(
title: String,
save: () -> Unit,
optionButton: @Composable () -> Unit,
) {
/* Hady: reminder for the future
val activity = LocalView.current.context as Activity
activity.window.statusBarColor = colorResource(id = R.color.drawer_color_selected).toArgb()
*/
Surface(
shadowElevation = 4.dp,
color = colorResource(id = R.color.content_background),
contentColor = colorResource(id = R.color.text_primary),
modifier = Modifier.requiredHeight(56.dp)
)
{
Row(verticalAlignment = Alignment.CenterVertically) {
IconButton(onClick = save, modifier = Modifier.size(56.dp)) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_outline_save_24px),
contentDescription = stringResource(id = R.string.save),
)
}
Text(
text = title,
fontWeight = FontWeight.Medium,
fontSize = 20.sp,
modifier = Modifier
.weight(0.9f)
.padding(start = Constants.KEYLINE_FIRST),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
optionButton()
}
}
}
@Composable
@Preview(showBackground = true)
private fun TitleBarPreview() {
TasksTheme {
Toolbar(
title = "Toolbar title",
save = { /*TODO*/ },
optionButton = { DeleteButton {} }
)
}
}

@ -24,7 +24,7 @@ class EtebaseCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
setContent {
TasksTheme {
baseCaldavSettingsContent()
BaseCaldavSettingsContent()
}
}
}

@ -6,11 +6,11 @@ import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.ListSettings.ProgressBar
import org.tasks.compose.ListSettings.Toaster
import org.tasks.compose.ListSettings.SettingsSurface
import org.tasks.compose.ListSettings.Toolbar
import org.tasks.compose.ListSettings.SelectIconRow
import org.tasks.compose.settings.ProgressBar
import org.tasks.compose.settings.SelectIconRow
import org.tasks.compose.settings.SettingsSurface
import org.tasks.compose.settings.Toaster
import org.tasks.compose.settings.Toolbar
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.themes.TasksTheme

@ -8,11 +8,11 @@ import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.activity.TaskListFragment
import org.tasks.filters.CaldavFilter
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.filters.CaldavFilter
import org.tasks.themes.TasksTheme
@AndroidEntryPoint
@ -49,7 +49,7 @@ class MicrosoftListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
setContent {
TasksTheme {
baseCaldavSettingsContent()
BaseCaldavSettingsContent()
}
}
}

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.08" android:color="?attr/colorAccent" android:state_checked="true"/>
<item android:color="@android:color/transparent" android:state_checked="false"/>
</selector>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.16" android:color="?attr/colorAccent" android:state_pressed="true"/>
<item android:alpha="0.12" android:color="?attr/colorAccent" android:state_focused="true" android:state_hovered="true"/>
<item android:alpha="0.12" android:color="?attr/colorAccent" android:state_focused="true"/>
<item android:alpha="0.04" android:color="?attr/colorAccent" android:state_hovered="true"/>
<item android:alpha="0.00" android:color="?attr/colorAccent"/>
</selector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorAccent" android:state_checked="true"/>
<item android:alpha="0.12" android:color="?attr/colorOnSurface" android:state_checked="false"/>
</selector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM15,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4zM9,18c0.22,-0.72 3.31,-2 6,-2 2.7,0 5.8,1.29 6,2L9,18zM6,15v-3h3v-2L6,10L6,7L4,7v3L1,10v2h3v3z"/>
</vector>

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<include layout="@layout/toolbar"/>
<include
android:id="@+id/progress_bar"
layout="@layout/progress_view" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_layout"
style="@style/TagSettingsRow"
android:hint="@string/display_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name"
style="@style/TagSettingsEditText"
android:inputType="textCapSentences|textAutoCorrect" />
</com.google.android.material.textfield.TextInputLayout>
<include layout="@layout/list_settings_color"/>
<include layout="@layout/list_settings_icon"/>
<androidx.compose.ui.platform.ComposeView
android:id="@+id/people"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>
<androidx.compose.ui.platform.ComposeView
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/keyline_first"
android:layout_gravity="end|bottom"
android:padding="0dp"
android:visibility="gone" />
</FrameLayout>
</LinearLayout>

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar"/>
<include
android:id="@+id/progress_bar"
layout="@layout/progress_view"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
style="@style/TagSettingsRow"
android:hint="@string/display_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name"
style="@style/TagSettingsEditText"
android:inputType="textCapSentences|textFilter"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<include layout="@layout/list_settings_color"/>
<include layout="@layout/list_settings_icon"/>
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<include layout="@layout/toolbar"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_layout"
style="@style/TagSettingsRow"
android:hint="@string/display_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name"
style="@style/TagSettingsEditText"
android:inputType="textCapSentences|textAutoCorrect" />
</com.google.android.material.textfield.TextInputLayout>
<include layout="@layout/list_settings_color"/>
<include layout="@layout/list_settings_icon"/>
<TextView
style="@style/TagSettingsRow"
android:text="@string/geofence_radius"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first" />
<com.google.android.material.slider.Slider
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
app:trackColorActive="?attr/colorSecondary"
app:thumbColor="?attr/colorSecondary"
app:tickColorActive="?attr/colorOnSecondary"
app:tickColorInactive="?attr/colorSecondary"
app:tickColor="@android:color/transparent"
app:trackColorInactive="@color/text_tertiary"/>
<FrameLayout
android:id="@+id/map"
android:padding="@dimen/keyline_first"
android:layout_width="match_parent"
android:layout_height="300dp" />
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_layout"
style="@style/TagSettingsRow"
android:hint="@string/display_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name"
style="@style/TagSettingsEditText"
android:inputType="textCapSentences|textFilter"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<include layout="@layout/list_settings_color"/>
<include layout="@layout/list_settings_icon"/>
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/button_toggle"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/keyline_first"
android:orientation="horizontal"
app:selectionRequired="true"
app:singleSelection="true">
<com.google.android.material.button.MaterialButton
android:id="@+id/button_and"
style="@style/OutlineButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/custom_filter_and" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_or"
style="@style/OutlineButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/custom_filter_or" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_not"
style="@style/OutlineButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/custom_filter_not" />
</com.google.android.material.button.MaterialButtonToggleGroup>
</LinearLayout>

@ -1,80 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<include layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"/>
<androidx.core.widget.NestedScrollView
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_layout"
style="@style/TagSettingsRow"
android:hint="@string/display_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="flagNoExtractUi"
android:inputType="textCapSentences|textFilter"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<include layout="@layout/list_settings_color"/>
<include layout="@layout/list_settings_icon"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorSecondary"
android:text="@string/custom_filter_criteria"
android:padding="@dimen/keyline_first"
style="@style/TextAppearance.AppCompat.Body2" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/task_list_footer_height"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"/>
<androidx.compose.ui.platform.ComposeView
android:id="@+id/filter_criteria_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/keyline_first"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:text="@string/CFA_button_add"
app:icon="@drawable/ic_outline_add_24px"
app:borderWidth="0dp"/>
</RelativeLayout>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/icon_row"
style="@style/TagSettingsRow"
android:background="?attr/selectableItemBackground">
<androidx.compose.ui.platform.ComposeView
android:id="@+id/icon"
android:layout_alignParentStart="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/delete"
android:icon="@drawable/ic_outline_delete_24px"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
</menu>

@ -3,8 +3,6 @@
<color name="window_background">@color/md_background_dark</color>
<color name="content_background">@color/md_background_dark</color>
<color name="dialog_background">@color/md_background_dark</color>
<color name="widget_text_follow_system">@color/white_87</color>
<color name="widget_secondary_text_follow_system">@color/white_60</color>
<color name="widget_background_follow_system">@color/md_background_dark</color>
<color name="icon_tint">@color/icon_tint_dark</color>
<color name="icon_tint_with_alpha">@color/icon_tint_dark_alpha</color>

@ -33,16 +33,11 @@
<color name="snackbar_action_color">#f4b400</color>
<color name="snackbar_background">@color/grey_800</color>
<!-- deprecated -->
<color name="reminder_background">#262626</color>
<!-- Day colors -->
<color name="window_background">@color/md_background_light</color>
<color name="content_background">@color/md_background_light</color>
<color name="dialog_background">@color/md_background_light</color>
<color name="widget_text_follow_system">@color/black_87</color>
<color name="widget_secondary_text_follow_system">@color/black_60</color>
<color name="widget_background_follow_system">@color/md_background_light</color>
<color name="icon_tint">@color/icon_tint_light</color>
<color name="icon_tint_with_alpha">@color/icon_tint_light_alpha</color>

@ -5,7 +5,6 @@
<dimen name="keyline_first">16dp</dimen>
<dimen name="keyline_second">32dp</dimen>
<dimen name="keyline_content_inset">56dp</dimen>
<dimen name="bottom_sheet_corners">12dp</dimen>
<dimen name="task_list_footer_height">88dp</dimen>
<dimen name="task_edit_text_size">16sp</dimen>
@ -20,9 +19,6 @@
<dimen name="widget_padding_compact">6dp</dimen>
<dimen name="widget_padding">12dp</dimen>
<dimen name="widget_height_default">48dp</dimen>
<dimen name="widget_height_compact">36dp</dimen>
<dimen name="widget_height_none">24dp</dimen>
<dimen name="sku_details_row_text_size">14sp</dimen>

@ -177,13 +177,6 @@
<item name="android:elevation" tools:ignore="NewApi">@dimen/elevation_refresh_indicator</item>
</style>
<style name="OutlineButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
<item name="android:textColor">@color/button_accent_text</item>
<item name="backgroundTint">@color/button_accent_background</item>
<item name="rippleColor">@color/button_accent_ripple</item>
<item name="strokeColor">@color/button_selected_accent_stroke</item>
</style>
<style name="AlertButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog.Flush">
<item name="android:textColor">?attr/colorSecondary</item>
</style>

@ -0,0 +1,36 @@
package org.tasks.kmp.org.tasks.compose.settings
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun SettingRow(
left: @Composable () -> Unit,
center: @Composable () -> Unit,
right: @Composable (() -> Unit)? = null,
modifier: Modifier = Modifier
) {
Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) {
Box (modifier = Modifier.size(56.dp), contentAlignment = Alignment.Center) {
left()
}
Box (
modifier = Modifier
.height(56.dp)
.weight(1f), contentAlignment = Alignment.CenterStart
) {
center()
}
right?.let {
Box (modifier = Modifier.size(56.dp), contentAlignment = Alignment.Center) {
it.invoke()
}
}
}
}
Loading…
Cancel
Save