diff --git a/app/src/main/java/com/todoroo/astrid/core/SortHelper.java b/app/src/main/java/com/todoroo/astrid/core/SortHelper.java index 469be7e50..8156f5407 100644 --- a/app/src/main/java/com/todoroo/astrid/core/SortHelper.java +++ b/app/src/main/java/com/todoroo/astrid/core/SortHelper.java @@ -53,17 +53,19 @@ public class SortHelper { private static final String ADJUSTED_START_DATE = "(CASE WHEN (hideUntil / 1000) % 60 > 0 THEN hideUntil ELSE (hideUntil + 86399000) END)"; - private static final String GROUP_DUE_DATE = "((CASE WHEN (tasks.dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE " + private static final Long NO_DATE = 3538339200000L; + + private static final String GROUP_DUE_DATE = "((CASE WHEN (tasks.dueDate=0) THEN " + NO_DATE + " ELSE " + "tasks.dueDate END)+tasks.importance * 1000)"; - private static final String SORT_DUE_DATE = "((CASE WHEN (tasks.dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE " + private static final String SORT_DUE_DATE = "((CASE WHEN (tasks.dueDate=0) THEN " + NO_DATE + " ELSE " + ADJUSTED_DUE_DATE.replace("dueDate", "tasks.dueDate") + " END)+tasks.importance * 1000)"; - private static final String GROUP_START_DATE = "((CASE WHEN (tasks.hideUntil=0) THEN (strftime('%s','now')*1000)*2 ELSE " + private static final String GROUP_START_DATE = "((CASE WHEN (tasks.hideUntil=0) THEN " + NO_DATE + " ELSE " + "tasks.hideUntil END)+tasks.importance * 1000)"; - private static final String SORT_START_DATE = "((CASE WHEN (tasks.hideUntil=0) THEN (strftime('%s','now')*1000)*2 ELSE " + private static final String SORT_START_DATE = "((CASE WHEN (tasks.hideUntil=0) THEN " + NO_DATE + " ELSE " + ADJUSTED_START_DATE.replace("hideUntil", "tasks.hideUntil") + " END)+tasks.importance * 1000)"; diff --git a/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt b/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt index e9f81e6bb..481a802c6 100644 --- a/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt +++ b/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt @@ -18,9 +18,12 @@ 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.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material.Chip import androidx.compose.material.ChipDefaults +import androidx.compose.material.ContentAlpha import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme @@ -44,6 +47,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat @@ -136,14 +140,20 @@ class SortSettingsActivity : ComponentActivity() { scrimColor = Color.Transparent, shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), content = { - SortPicker( - selected = state.groupMode, - options = groupOptions, - onSelected = { - viewModel.setGroupMode(it) - closePicker() - } - ) + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .fillMaxWidth() + ) { + SortPicker( + selected = state.groupMode, + options = groupOptions, + onClick = { + viewModel.setGroupMode(it) + closePicker() + } + ) + } } ) LaunchedEffect(Unit) { @@ -204,14 +214,20 @@ class SortSettingsActivity : ComponentActivity() { scrimColor = Color.Transparent, shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), content = { - SortPicker( - selected = state.completedMode, - options = completedOptions, - onSelected = { - viewModel.setCompletedMode(it) - closePicker() - } - ) + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .fillMaxWidth() + ) { + SortPicker( + selected = state.completedMode, + options = completedOptions, + onClick = { + viewModel.setCompletedMode(it) + closePicker() + } + ) + } } ) LaunchedEffect(Unit) { @@ -268,30 +284,39 @@ fun SortSheetContent( setAstridSort: (Boolean) -> Unit, onSelected: (Int) -> Unit, ) { - if (manualSortEnabled) { - SortOption(resId = R.string.SSD_sort_my_order, selected = manualSortSelected) { - setManualSort(true) - } - } - if (astridSortEnabled) { - SortOption(resId = R.string.astrid_sort_order, selected = manualSortSelected) { - setAstridSort(true) + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .fillMaxWidth() + ) { + SortPicker( + selected = if (manualSortSelected) -1 else selected, + options = sortOptions, + onClick = { onSelected(it) }, + ) + if (astridSortEnabled) { + SortOption( + resId = R.string.astrid_sort_order, + selected = manualSortSelected, + onClick = { setAstridSort(true) } + ) } + SortOption( + resId = R.string.SSD_sort_my_order, + selected = manualSortSelected && !astridSortEnabled, + enabled = manualSortEnabled, + onClick = { setManualSort(true) }, + ) } - SortPicker( - selected = if (manualSortSelected) -1 else selected, - options = sortOptions, - onSelected = { onSelected(it) }, - ) } val sortOptions = linkedMapOf( - R.string.SSD_sort_auto to SortHelper.SORT_AUTO, - R.string.SSD_sort_start to SortHelper.SORT_START, R.string.SSD_sort_due to SortHelper.SORT_DUE, + R.string.SSD_sort_start to SortHelper.SORT_START, R.string.SSD_sort_importance to SortHelper.SORT_IMPORTANCE, R.string.SSD_sort_alpha to SortHelper.SORT_ALPHA, R.string.SSD_sort_modified to SortHelper.SORT_MODIFIED, + R.string.SSD_sort_auto to SortHelper.SORT_AUTO, R.string.sort_created to SortHelper.SORT_CREATED, ) @@ -307,8 +332,8 @@ val groupOptions = linkedMapOf( private val completedOptions = linkedMapOf( R.string.sort_completed to SortHelper.SORT_COMPLETED, - R.string.SSD_sort_start to SortHelper.SORT_START, R.string.SSD_sort_due to SortHelper.SORT_DUE, + R.string.SSD_sort_start to SortHelper.SORT_START, R.string.SSD_sort_importance to SortHelper.SORT_IMPORTANCE, R.string.SSD_sort_alpha to SortHelper.SORT_ALPHA, R.string.SSD_sort_modified to SortHelper.SORT_MODIFIED, @@ -319,13 +344,13 @@ private val completedOptions = linkedMapOf( fun SortPicker( selected: Int, options: Map, - onSelected: (Int) -> Unit, + onClick: (Int) -> Unit, ) { options.forEach { (resId, sortMode) -> SortOption( resId = resId, selected = selected == sortMode, - onClick = { onSelected(sortMode) }, + onClick = { onClick(sortMode) }, ) } } @@ -334,21 +359,37 @@ fun SortPicker( fun SortOption( resId: Int, selected: Boolean, + enabled: Boolean = true, onClick: () -> Unit ) { - Text( + Column( modifier = Modifier .fillMaxWidth() - .clickable { onClick() } - .padding(horizontal = 16.dp, vertical = 8.dp), - text = stringResource(id = resId), - style = MaterialTheme.typography.h6.copy( - color = if (selected) MaterialTheme.colors.primary else MaterialTheme.colors.onSurface, - ), - ) + .clickable(enabled = enabled, onClick = onClick) + .padding(horizontal = 16.dp, vertical = 8.dp) + ) { + Text( + text = stringResource(id = resId), + style = MaterialTheme.typography.h6.copy( + color = when { + selected -> MaterialTheme.colors.primary + enabled -> MaterialTheme.colors.onSurface + else -> MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled) + } + ), + ) + if (!enabled) { + Text( + text = stringResource(id = R.string.sort_not_available), + style = MaterialTheme.typography.body2.copy( + color = MaterialTheme.colors.error, + fontStyle = FontStyle.Italic, + ), + ) + } + } } -@OptIn(ExperimentalMaterialApi::class) @Composable fun BottomSheetContent( groupMode: Int, @@ -374,6 +415,7 @@ fun BottomSheetContent( ) { Column( modifier = Modifier + .verticalScroll(rememberScrollState()) .weight(1f) .clickable { clickGroupMode() } ) { diff --git a/app/src/main/java/org/tasks/dialogs/SortSettingsViewModel.kt b/app/src/main/java/org/tasks/dialogs/SortSettingsViewModel.kt index ddb244f4a..d5d6544e5 100644 --- a/app/src/main/java/org/tasks/dialogs/SortSettingsViewModel.kt +++ b/app/src/main/java/org/tasks/dialogs/SortSettingsViewModel.kt @@ -97,6 +97,7 @@ class SortSettingsViewModel @Inject constructor( fun setCompletedMode(completedMode: Int) { preferences.completedMode = completedMode val ascending = when (completedMode) { + SortHelper.SORT_COMPLETED, SortHelper.SORT_MODIFIED, SortHelper.SORT_CREATED -> false else -> true diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9f6710274..0a2bb569b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -737,4 +737,5 @@ File %1$s contained %2$s.\n\n Grouping Ascending Descending + Not available for tags, filters, or places