From e17a6762d9f08329978e8c124d46f8f5f0d62cd7 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 18 Dec 2024 00:39:30 -0600 Subject: [PATCH] Update list settings * Remove unused resources * Fix check for icon changes * Break out composables --- .../activities/BaseListSettingsActivity.kt | 17 +- .../activities/FilterSettingsActivity.kt | 6 +- .../GoogleTaskListSettingsActivity.kt | 6 +- .../tasks/activities/PlaceSettingsActivity.kt | 4 +- .../tasks/activities/TagSettingsActivity.kt | 4 +- .../BaseCaldavCalendarSettingsActivity.kt | 8 +- .../caldav/CaldavCalendarSettingsActivity.kt | 7 +- .../tasks/caldav/LocalListSettingsActivity.kt | 5 +- .../java/org/tasks/compose/FilterCondition.kt | 2 +- .../java/org/tasks/compose/ListSettings.kt | 374 ------------------ .../java/org/tasks/compose/PrincipalList.kt | 4 +- .../org/tasks/compose/settings/ProgressBar.kt | 29 ++ .../tasks/compose/settings/PromptAction.kt | 41 ++ .../tasks/compose/settings/SelectColorRow.kt | 86 ++++ .../tasks/compose/settings/SelectIconRow.kt | 48 +++ .../tasks/compose/settings/SettingsSurface.kt | 25 ++ .../org/tasks/compose/settings/TitleInput.kt | 98 +++++ .../org/tasks/compose/settings/Toaster.kt | 36 ++ .../org/tasks/compose/settings/Toolbar.kt | 79 ++++ .../EtebaseCalendarSettingsActivity.kt | 2 +- .../OpenTasksListSettingsActivity.kt | 10 +- .../MicrosoftListSettingsActivity.kt | 4 +- .../res/color/button_accent_background.xml | 5 - .../main/res/color/button_accent_ripple.xml | 8 - .../color/button_selected_accent_stroke.xml | 5 - .../speech_bubble_reminder.9.png | Bin 2356 -> 0 bytes .../res/drawable/ic_outline_person_add_24.xml | 10 - .../activity_caldav_calendar_settings.xml | 64 --- .../activity_google_task_list_settings.xml | 44 --- .../res/layout/activity_location_settings.xml | 69 ---- .../main/res/layout/activity_tag_settings.xml | 41 -- .../layout/dialog_custom_filter_row_edit.xml | 41 -- .../res/layout/filter_settings_activity.xml | 80 ---- .../main/res/layout/list_settings_icon.xml | 13 - app/src/main/res/menu/menu_tag_settings.xml | 11 - app/src/main/res/values-night/colors.xml | 2 - app/src/main/res/values/colors.xml | 5 - app/src/main/res/values/dimens.xml | 4 - app/src/main/res/values/styles.xml | 7 - .../org/tasks/compose/settings/SettingRow.kt | 36 ++ 40 files changed, 518 insertions(+), 822 deletions(-) delete mode 100644 app/src/main/java/org/tasks/compose/ListSettings.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/ProgressBar.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/PromptAction.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/SelectIconRow.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/SettingsSurface.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/TitleInput.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/Toaster.kt create mode 100644 app/src/main/java/org/tasks/compose/settings/Toolbar.kt delete mode 100644 app/src/main/res/color/button_accent_background.xml delete mode 100644 app/src/main/res/color/button_accent_ripple.xml delete mode 100644 app/src/main/res/color/button_selected_accent_stroke.xml delete mode 100644 app/src/main/res/drawable-mdpi/speech_bubble_reminder.9.png delete mode 100644 app/src/main/res/drawable/ic_outline_person_add_24.xml delete mode 100644 app/src/main/res/layout/activity_caldav_calendar_settings.xml delete mode 100644 app/src/main/res/layout/activity_google_task_list_settings.xml delete mode 100644 app/src/main/res/layout/activity_location_settings.xml delete mode 100644 app/src/main/res/layout/activity_tag_settings.xml delete mode 100644 app/src/main/res/layout/dialog_custom_filter_row_edit.xml delete mode 100644 app/src/main/res/layout/filter_settings_activity.xml delete mode 100644 app/src/main/res/layout/list_settings_icon.xml delete mode 100644 app/src/main/res/menu/menu_tag_settings.xml create mode 100644 kmp/src/commonMain/kotlin/org/tasks/compose/settings/SettingRow.kt diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt index f6ae16961..65d076d65 100644 --- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt @@ -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" } } diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt index ce9cb77f3..1320034af 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt @@ -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() }) { diff --git a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt index a09632a19..bc3a01e80 100644 --- a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt index 83bb24955..0e92d6a12 100644 --- a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt b/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt index 03732466e..87dfd120f 100644 --- a/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt @@ -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 } } diff --git a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt index 96ff03c06..a79cc48c1 100644 --- a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt @@ -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 ) diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt index 949e6b4c9..19efd5fd0 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt @@ -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, ) diff --git a/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt index 0bd09b66f..760cd3819 100644 --- a/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/LocalListSettingsActivity.kt @@ -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() } } ) } diff --git a/app/src/main/java/org/tasks/compose/FilterCondition.kt b/app/src/main/java/org/tasks/compose/FilterCondition.kt index 36d14884b..e57397600 100644 --- a/app/src/main/java/org/tasks/compose/FilterCondition.kt +++ b/app/src/main/java/org/tasks/compose/FilterCondition.kt @@ -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 diff --git a/app/src/main/java/org/tasks/compose/ListSettings.kt b/app/src/main/java/org/tasks/compose/ListSettings.kt deleted file mode 100644 index 687c380e7..000000000 --- a/app/src/main/java/org/tasks/compose/ListSettings.kt +++ /dev/null @@ -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) { - 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, - error: MutableState, - 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, 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, - 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) } - ) - } - } - -} diff --git a/app/src/main/java/org/tasks/compose/PrincipalList.kt b/app/src/main/java/org/tasks/compose/PrincipalList.kt index 80bcf9255..b2fb33378 100644 --- a/app/src/main/java/org/tasks/compose/PrincipalList.kt +++ b/app/src/main/java/org/tasks/compose/PrincipalList.kt @@ -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) diff --git a/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt b/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt new file mode 100644 index 000000000..772e62bd3 --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/ProgressBar.kt @@ -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) { + 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) + ) + } + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/PromptAction.kt b/app/src/main/java/org/tasks/compose/settings/PromptAction.kt new file mode 100644 index 000000000..933233dcb --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/PromptAction.kt @@ -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, + 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*/ }) + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt b/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt new file mode 100644 index 000000000..dfe98ce41 --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/SelectColorRow.kt @@ -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, 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 = {} + ) + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/SelectIconRow.kt b/app/src/main/java/org/tasks/compose/settings/SelectIconRow.kt new file mode 100644 index 000000000..9e6fd83ae --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/SelectIconRow.kt @@ -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 = {} + ) + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/SettingsSurface.kt b/app/src/main/java/org/tasks/compose/settings/SettingsSurface.kt new file mode 100644 index 000000000..2e4ce951c --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/SettingsSurface.kt @@ -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() } + } + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/TitleInput.kt b/app/src/main/java/org/tasks/compose/settings/TitleInput.kt new file mode 100644 index 000000000..499c2de9a --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/TitleInput.kt @@ -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, + error: MutableState, + 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() + } + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/Toaster.kt b/app/src/main/java/org/tasks/compose/settings/Toaster.kt new file mode 100644 index 000000000..7fb838b2d --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/Toaster.kt @@ -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) + } + } + } +} diff --git a/app/src/main/java/org/tasks/compose/settings/Toolbar.kt b/app/src/main/java/org/tasks/compose/settings/Toolbar.kt new file mode 100644 index 000000000..badfce72e --- /dev/null +++ b/app/src/main/java/org/tasks/compose/settings/Toolbar.kt @@ -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 {} } + ) + } +} diff --git a/app/src/main/java/org/tasks/etebase/EtebaseCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/etebase/EtebaseCalendarSettingsActivity.kt index 42882b38e..4180de5a4 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseCalendarSettingsActivity.kt @@ -24,7 +24,7 @@ class EtebaseCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() { setContent { TasksTheme { - baseCaldavSettingsContent() + BaseCaldavSettingsContent() } } } diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt index 32f079bc9..fafb1764b 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivity.kt b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivity.kt index 06f63cf71..add1cb842 100644 --- a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivity.kt +++ b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivity.kt @@ -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() } } } diff --git a/app/src/main/res/color/button_accent_background.xml b/app/src/main/res/color/button_accent_background.xml deleted file mode 100644 index 404d7771b..000000000 --- a/app/src/main/res/color/button_accent_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/color/button_accent_ripple.xml b/app/src/main/res/color/button_accent_ripple.xml deleted file mode 100644 index 88ef2febb..000000000 --- a/app/src/main/res/color/button_accent_ripple.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/color/button_selected_accent_stroke.xml b/app/src/main/res/color/button_selected_accent_stroke.xml deleted file mode 100644 index ef283a50a..000000000 --- a/app/src/main/res/color/button_selected_accent_stroke.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-mdpi/speech_bubble_reminder.9.png b/app/src/main/res/drawable-mdpi/speech_bubble_reminder.9.png deleted file mode 100644 index 26e9e085f735d5cedeba771ab933f64212964845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2356 zcmV-43Cs40P){d zNl7W?=NHhSj}Ft0cXkcM+Y*c8;-pP1p6@)BP}qULD@i7YW5>?1vT`Slj*bxq#&R69 zv$v?LyPJ-Dc8ucfiO#q<<1d#q7L&>JW2-fxAa@A0sdwd78U@6z(+$vBiU?;E?Jhpr)n(h0BcN^ z_@dI%a^=AM4b0Ea0|_K0R`b#d1f9 z1wdr{I>6CmCn!2v`zKX`F&NArR=H|ukzb~pn*$IUKaYzqUM8JR&Qv8Bdt!3A*XO6( zZ0|C2>lT2}7Vaz(|NPKkwA6mvcMVrPW-rgDre!uo`ugY=t8->{7C>n83ky_n?K+t) zw#6qN%(`{!)}&`-x%>M2X_nPFJu?F!G`>=D-VKHx6wIo}4u;Jzv#ieP>1hC=@vCM0 zJ7*6HMuT7g9xa&1UXn#35t?Ds+0@h&fY9dHUfk)dP&b%xIIPrp^X5$eq1|G8@$zz~ zy1|4(VWrN=$w>gA@vVir!K7!odwWAlof8ui07Bzii?XtEb%O~8L#)o5G(J87AhhY} z87f6E0Lv(tK(JT2!*XnF96)GOQ`5xn>ryS4G!~5CA7lrcpplU=0HIAzPEpC1Woic# zQ0g2R83hm;-&&{^%-t_vX1Dl!e&y*f!^0y0LgQNt{wSvZ4d#hdvuV?&A0;NId3wBF z8W|m>q2XZwp^Z;W(AAPJpX>}HNzzM_Y}(A0V?F%tv~VP%9BgoC2ta6K%ehNqWn0|m~0-qo*UB2?|GfYB4!pm&wRhXKVNqPAN6zmPNDQT3=C<9-I z0`P1Z92$ObFyG8FHe1r~t+vEZwrt%#eCms{)YR-&_AUJbgUXBW$G`$S3;4?F;-xEO zu|CA6KPEhd* z3bS=zFxX20wsZp!9e-pPKerz{nEzU`84SNMnyv3=XK#%hJ$jrxo*w+MVPyovCV--% zCmhT-V?$KbOG(M8-j0t*15LsX;g5lo`@cIJe>G1&w zjelfv{z8$8!K7un8=G3F$LptVj~75_K7Wu3&KIg3Ofw6{#}3#7AT*yppnfn7jZJJi z^HNv02S8|iXID3X(D+K}T)_o(gQ;V|bg^JM*Z~1V=21JC6c$Wv zeIs?U>8!o83qWYyY-^EUa9-tL>Kdt|(?f0TT>wJs>h@AzK7s*QPQf&=V7l1>I{}2& z)!n0hFg3Mx)ZWoat!?c9LgQD;_yb{74aQYd%j)bPcWWDf&^p-0KR53jf&o}2!DP6r zT{X&d#_x*(5EDls|L#h>zzU|^*L!+%)JY_YYd5sZeFm{)x9in3v%cc~K z8bg*XnMaR(t^`w4+W;W6`i5ru+rIsz)5(8OB^XJPezo1PbIw&$hd($7jo;VBFJPr- zWcSC!#QadB(pY7&+VgU9^Qob+nH{(uKuG-jy?zfdE2z!WO`Mj_Ar<%QEX{8Us_hdqG?jzM70ZG`Qx!vRoBwr_a7jm z(VC%Isv*nf*sScWljjNw@2v^(4+6`TtEOK0pL@CUy0XzXS*!;f4##tvr5tQJ`>ib@ zsf@pY^B0PhO%z`r@`?eLi)vRb@ht?u!kd}3Wzc9e+cZyWtY5!=wPdtxu-lU_Y}vYf z?4JkTXK(BTeSY#Zoje8bbnx@<*zuF};i1E{bJx4`scD(5X0vU#B*p(!vs^}8oaHBa z+5Ec667MiuZH;D2e2>X&^8hR*e%_fawpuom>@gTjf7Tidzt(ECFK93@FjmeWfT!${ a$A19pHl>8ujnFv&0000 - - diff --git a/app/src/main/res/layout/activity_caldav_calendar_settings.xml b/app/src/main/res/layout/activity_caldav_calendar_settings.xml deleted file mode 100644 index 385216bb5..000000000 --- a/app/src/main/res/layout/activity_caldav_calendar_settings.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_google_task_list_settings.xml b/app/src/main/res/layout/activity_google_task_list_settings.xml deleted file mode 100644 index 2a1d4067b..000000000 --- a/app/src/main/res/layout/activity_google_task_list_settings.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_location_settings.xml b/app/src/main/res/layout/activity_location_settings.xml deleted file mode 100644 index 60756bf74..000000000 --- a/app/src/main/res/layout/activity_location_settings.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_tag_settings.xml b/app/src/main/res/layout/activity_tag_settings.xml deleted file mode 100644 index 7c65687e4..000000000 --- a/app/src/main/res/layout/activity_tag_settings.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_custom_filter_row_edit.xml b/app/src/main/res/layout/dialog_custom_filter_row_edit.xml deleted file mode 100644 index db8052dcf..000000000 --- a/app/src/main/res/layout/dialog_custom_filter_row_edit.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/filter_settings_activity.xml b/app/src/main/res/layout/filter_settings_activity.xml deleted file mode 100644 index eef72425d..000000000 --- a/app/src/main/res/layout/filter_settings_activity.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/list_settings_icon.xml b/app/src/main/res/layout/list_settings_icon.xml deleted file mode 100644 index 622354464..000000000 --- a/app/src/main/res/layout/list_settings_icon.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/menu/menu_tag_settings.xml b/app/src/main/res/menu/menu_tag_settings.xml deleted file mode 100644 index fc4fdd714..000000000 --- a/app/src/main/res/menu/menu_tag_settings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 81cb64454..1dd81a289 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -3,8 +3,6 @@ @color/md_background_dark @color/md_background_dark @color/md_background_dark - @color/white_87 - @color/white_60 @color/md_background_dark @color/icon_tint_dark @color/icon_tint_dark_alpha diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ad471727f..8906786d2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -33,16 +33,11 @@ #f4b400 @color/grey_800 - - #262626 - @color/md_background_light @color/md_background_light @color/md_background_light - @color/black_87 - @color/black_60 @color/md_background_light @color/icon_tint_light @color/icon_tint_light_alpha diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0e6fa2eee..2ca6b773c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,7 +5,6 @@ 16dp 32dp 56dp - 12dp 88dp 16sp @@ -20,9 +19,6 @@ 6dp 12dp - 48dp - 36dp - 24dp 14sp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 13acd316e..2df34b3e4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -177,13 +177,6 @@ @dimen/elevation_refresh_indicator - - diff --git a/kmp/src/commonMain/kotlin/org/tasks/compose/settings/SettingRow.kt b/kmp/src/commonMain/kotlin/org/tasks/compose/settings/SettingRow.kt new file mode 100644 index 000000000..e6f36a0ad --- /dev/null +++ b/kmp/src/commonMain/kotlin/org/tasks/compose/settings/SettingRow.kt @@ -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() + } + } + } +}