Sorting updates

* Make contents scrollable
* Use fixed value for 'no date' sorting
* Completion sort defaults to descending
* Show error if 'My order' is not supported
pull/2335/head
Alex Baker 3 years ago
parent be55a3bc5d
commit f5ab0e6f56

@ -53,17 +53,19 @@ public class SortHelper {
private static final String ADJUSTED_START_DATE = private static final String ADJUSTED_START_DATE =
"(CASE WHEN (hideUntil / 1000) % 60 > 0 THEN hideUntil ELSE (hideUntil + 86399000) END)"; "(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)"; + "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") + ADJUSTED_DUE_DATE.replace("dueDate", "tasks.dueDate")
+ " END)+tasks.importance * 1000)"; + " 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)"; + "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") + ADJUSTED_START_DATE.replace("hideUntil", "tasks.hideUntil")
+ " END)+tasks.importance * 1000)"; + " END)+tasks.importance * 1000)";

@ -18,9 +18,12 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Chip import androidx.compose.material.Chip
import androidx.compose.material.ChipDefaults import androidx.compose.material.ChipDefaults
import androidx.compose.material.ContentAlpha
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Icon import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
@ -44,6 +47,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -136,15 +140,21 @@ class SortSettingsActivity : ComponentActivity() {
scrimColor = Color.Transparent, scrimColor = Color.Transparent,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = { content = {
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.fillMaxWidth()
) {
SortPicker( SortPicker(
selected = state.groupMode, selected = state.groupMode,
options = groupOptions, options = groupOptions,
onSelected = { onClick = {
viewModel.setGroupMode(it) viewModel.setGroupMode(it)
closePicker() closePicker()
} }
) )
} }
}
) )
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
sheetState.show() sheetState.show()
@ -204,15 +214,21 @@ class SortSettingsActivity : ComponentActivity() {
scrimColor = Color.Transparent, scrimColor = Color.Transparent,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = { content = {
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.fillMaxWidth()
) {
SortPicker( SortPicker(
selected = state.completedMode, selected = state.completedMode,
options = completedOptions, options = completedOptions,
onSelected = { onClick = {
viewModel.setCompletedMode(it) viewModel.setCompletedMode(it)
closePicker() closePicker()
} }
) )
} }
}
) )
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
sheetState.show() sheetState.show()
@ -268,30 +284,39 @@ fun SortSheetContent(
setAstridSort: (Boolean) -> Unit, setAstridSort: (Boolean) -> Unit,
onSelected: (Int) -> Unit, onSelected: (Int) -> Unit,
) { ) {
if (manualSortEnabled) { Column(
SortOption(resId = R.string.SSD_sort_my_order, selected = manualSortSelected) { modifier = Modifier
setManualSort(true) .verticalScroll(rememberScrollState())
} .fillMaxWidth()
} ) {
if (astridSortEnabled) {
SortOption(resId = R.string.astrid_sort_order, selected = manualSortSelected) {
setAstridSort(true)
}
}
SortPicker( SortPicker(
selected = if (manualSortSelected) -1 else selected, selected = if (manualSortSelected) -1 else selected,
options = sortOptions, options = sortOptions,
onSelected = { onSelected(it) }, 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) },
) )
}
} }
val sortOptions = linkedMapOf( 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_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_importance to SortHelper.SORT_IMPORTANCE,
R.string.SSD_sort_alpha to SortHelper.SORT_ALPHA, R.string.SSD_sort_alpha to SortHelper.SORT_ALPHA,
R.string.SSD_sort_modified to SortHelper.SORT_MODIFIED, 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, R.string.sort_created to SortHelper.SORT_CREATED,
) )
@ -307,8 +332,8 @@ val groupOptions = linkedMapOf(
private val completedOptions = linkedMapOf( private val completedOptions = linkedMapOf(
R.string.sort_completed to SortHelper.SORT_COMPLETED, 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_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_importance to SortHelper.SORT_IMPORTANCE,
R.string.SSD_sort_alpha to SortHelper.SORT_ALPHA, R.string.SSD_sort_alpha to SortHelper.SORT_ALPHA,
R.string.SSD_sort_modified to SortHelper.SORT_MODIFIED, R.string.SSD_sort_modified to SortHelper.SORT_MODIFIED,
@ -319,13 +344,13 @@ private val completedOptions = linkedMapOf(
fun SortPicker( fun SortPicker(
selected: Int, selected: Int,
options: Map<Int, Int>, options: Map<Int, Int>,
onSelected: (Int) -> Unit, onClick: (Int) -> Unit,
) { ) {
options.forEach { (resId, sortMode) -> options.forEach { (resId, sortMode) ->
SortOption( SortOption(
resId = resId, resId = resId,
selected = selected == sortMode, selected = selected == sortMode,
onClick = { onSelected(sortMode) }, onClick = { onClick(sortMode) },
) )
} }
} }
@ -334,21 +359,37 @@ fun SortPicker(
fun SortOption( fun SortOption(
resId: Int, resId: Int,
selected: Boolean, selected: Boolean,
enabled: Boolean = true,
onClick: () -> Unit onClick: () -> Unit
) { ) {
Text( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clickable { onClick() } .clickable(enabled = enabled, onClick = onClick)
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp)
) {
Text(
text = stringResource(id = resId), text = stringResource(id = resId),
style = MaterialTheme.typography.h6.copy( style = MaterialTheme.typography.h6.copy(
color = if (selected) MaterialTheme.colors.primary else MaterialTheme.colors.onSurface, 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 @Composable
fun BottomSheetContent( fun BottomSheetContent(
groupMode: Int, groupMode: Int,
@ -374,6 +415,7 @@ fun BottomSheetContent(
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
.verticalScroll(rememberScrollState())
.weight(1f) .weight(1f)
.clickable { clickGroupMode() } .clickable { clickGroupMode() }
) { ) {

@ -97,6 +97,7 @@ class SortSettingsViewModel @Inject constructor(
fun setCompletedMode(completedMode: Int) { fun setCompletedMode(completedMode: Int) {
preferences.completedMode = completedMode preferences.completedMode = completedMode
val ascending = when (completedMode) { val ascending = when (completedMode) {
SortHelper.SORT_COMPLETED,
SortHelper.SORT_MODIFIED, SortHelper.SORT_MODIFIED,
SortHelper.SORT_CREATED -> false SortHelper.SORT_CREATED -> false
else -> true else -> true

@ -737,4 +737,5 @@ File %1$s contained %2$s.\n\n
<string name="sort_grouping">Grouping</string> <string name="sort_grouping">Grouping</string>
<string name="sort_ascending">Ascending</string> <string name="sort_ascending">Ascending</string>
<string name="sort_descending">Descending</string> <string name="sort_descending">Descending</string>
<string name="sort_not_available">Not available for tags, filters, or places</string>
</resources> </resources>

Loading…
Cancel
Save