Sort options for completed tasks

pull/2332/head
Alex Baker 3 years ago
parent a4184fa63a
commit 48e73b4bb3

@ -132,7 +132,10 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
}
TaskListFragment.REQUEST_SORT ->
if (resultCode == RESULT_OK) {
sortChanged(data?.getBooleanExtra(SortSettingsActivity.EXTRA_FORCE_RELOAD, false) ?: false)
sortChanged(
reload = data?.getBooleanExtra(SortSettingsActivity.EXTRA_FORCE_RELOAD, false) ?: false,
groupChange = data?.getBooleanExtra(SortSettingsActivity.EXTRA_CHANGED_GROUP, false) ?: false,
)
}
else ->
super.onActivityResult(requestCode, resultCode, data)
@ -449,8 +452,10 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
}
}
private fun sortChanged(reload: Boolean) {
taskListFragment?.clearCollapsed()
private fun sortChanged(reload: Boolean, groupChange: Boolean) {
if (groupChange) {
taskListFragment?.clearCollapsed()
}
localBroadcastManager.broadcastRefresh()
if (reload) {
openTaskListFragment(filter, true)

@ -41,6 +41,7 @@ public class SortHelper {
public static final int SORT_CALDAV = 7;
public static final int SORT_START = 8;
public static final int SORT_LIST = 9;
public static final int SORT_COMPLETED = 10;
public static final long APPLE_EPOCH = 978307200000L; // 1/1/2001 GMT
@SuppressLint("DefaultLocale")
@ -192,6 +193,7 @@ public class SortHelper {
case SORT_GTASKS -> "tasks.`order`";
case SORT_CALDAV -> CALDAV_ORDER_COLUMN;
case SORT_LIST -> "CASE WHEN cdl_order = -1 THEN cdl_name ELSE cdl_order END";
case SORT_COMPLETED -> "tasks.completed";
default -> "(CASE WHEN (tasks.dueDate=0) "
+ // if no due date
"THEN (strftime('%s','now')*1000)*2 "

@ -33,8 +33,7 @@ internal object TaskListQueryNonRecursive {
val sortGroup = field(SortHelper.getSortGroup(groupMode) ?: "NULL").`as`("sortGroup")
val query = SortHelper.adjustQueryForFlagsAndSort(preferences, joinedQuery, sortMode)
val completeAtBottom = if (preferences.completedTasksAtBottom) "parentComplete ASC," else ""
val completionSort =
if (preferences.completedTasksAtBottom && preferences.sortCompletedByCompletionDate) {
val completionSort = if (preferences.completedTasksAtBottom) {
"tasks.completed DESC,"
} else {
""

@ -60,6 +60,7 @@ internal object TaskListQueryRecursive {
manualSort && filter is CaldavFilter -> SortHelper.SORT_CALDAV
else -> sortPreference
}
val completedMode = preferences.completedMode
val groupAscending =
preferences.groupAscending && groupMode != SortHelper.GROUP_NONE
val sortAscending =
@ -72,12 +73,11 @@ internal object TaskListQueryRecursive {
primarySortSelect
}
val parentCompleted = if (preferences.completedTasksAtBottom) "tasks.completed > 0" else "0"
val completionSort =
if (preferences.completedTasksAtBottom && preferences.sortCompletedByCompletionDate) {
"tasks.completed"
} else {
"0"
}
val completionSort = if (preferences.completedTasksAtBottom) {
"(CASE WHEN tasks.completed > 0 THEN ${SortHelper.orderSelectForSortTypeRecursive(completedMode, false)} ELSE 0 END)"
} else {
"0"
}
val withClause = """
CREATE TEMPORARY TABLE `recursive_tasks` AS
WITH RECURSIVE recursive_tasks (task, parent_complete, subtask_complete, completion_sort, parent, collapsed, hidden, indent, title, primary_group, primary_sort, secondary_sort, sort_group) AS (
@ -96,7 +96,7 @@ internal object TaskListQueryRecursive {
$parentQuery
UNION ALL SELECT tasks._id, recursive_tasks.parent_complete, $parentCompleted as subtask_complete, $completionSort as completion_sort, recursive_tasks.task as parent, tasks.collapsed as collapsed, CASE WHEN recursive_tasks.collapsed > 0 OR recursive_tasks.hidden > 0 THEN 1 ELSE 0 END as hidden, recursive_tasks.indent+1 AS sort_indent, UPPER(tasks.title) AS sort_title, recursive_tasks.primary_group as primary_group, recursive_tasks.primary_sort as primary_sort, $secondarySortSelect as secondary_sort, recursive_tasks.sort_group FROM tasks
$SUBTASK_QUERY
ORDER BY parent_complete ASC, sort_indent DESC, subtask_complete ASC, completion_sort DESC, ${SortHelper.orderForGroupTypeRecursive(groupMode, groupAscending)}, ${SortHelper.orderForSortTypeRecursive(sortMode, sortAscending)}
ORDER BY parent_complete ASC, sort_indent DESC, subtask_complete ASC, completion_sort ${if (preferences.completedAscending) "ASC" else "DESC"}, ${SortHelper.orderForGroupTypeRecursive(groupMode, groupAscending)}, ${SortHelper.orderForSortTypeRecursive(sortMode, sortAscending)}
) SELECT * FROM recursive_tasks
WHERE indent = (SELECT MAX(indent) FROM recursive_tasks as r WHERE r.task = recursive_tasks.task)
""".trimIndent()

@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@ -27,8 +28,10 @@ import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowDownward
import androidx.compose.material.icons.outlined.ArrowUpward
import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Switch
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -79,12 +82,16 @@ class SortSettingsActivity : ComponentActivity() {
val scope = rememberCoroutineScope()
var showGroupPicker by remember { mutableStateOf(false) }
var showSortPicker by remember { mutableStateOf(false) }
var showCompletedPicker by remember { mutableStateOf(false) }
ModalBottomSheet(
onDismissRequest = {
val forceReload = viewModel.forceReload
val changedGroup = viewModel.changedGroup
setResult(
RESULT_OK,
Intent().putExtra(EXTRA_FORCE_RELOAD, forceReload)
Intent()
.putExtra(EXTRA_FORCE_RELOAD, forceReload)
.putExtra(EXTRA_CHANGED_GROUP, changedGroup)
)
finish()
overridePendingTransition(0, 0)
@ -97,14 +104,20 @@ class SortSettingsActivity : ComponentActivity() {
BottomSheetContent(
groupMode = state.groupMode,
sortMode = state.sortMode,
completedMode = state.completedMode,
sortAscending = state.sortAscending,
groupAscending = state.groupAscending,
completedAscending = state.completedAscending,
manualSort = state.manualSort && manualEnabled,
astridSort = state.astridSort && astridEnabled,
completedAtBottom = state.completedAtBottom,
setSortAscending = { viewModel.setSortAscending(it) },
setGroupAscending = { viewModel.setGroupAscending(it) },
setCompletedAscending = { viewModel.setCompletedAscending(it) },
setCompletedAtBottom = { viewModel.setCompletedAtBottom(it) },
clickGroupMode = { showGroupPicker = true },
clickSortMode = { showSortPicker = true },
clickCompletedMode = { showCompletedPicker = true },
)
}
)
@ -123,8 +136,9 @@ class SortSettingsActivity : ComponentActivity() {
scrimColor = Color.Transparent,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = {
GroupSheetContent(
SortPicker(
selected = state.groupMode,
options = groupOptions,
onSelected = {
viewModel.setGroupMode(it)
closePicker()
@ -175,6 +189,35 @@ class SortSettingsActivity : ComponentActivity() {
sheetState.show()
}
}
if (showCompletedPicker) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val closePicker: () -> Unit = {
scope.launch {
sheetState.hide()
showCompletedPicker = false
}
}
ModalBottomSheet(
onDismissRequest = closePicker,
sheetState = sheetState,
containerColor = MaterialTheme.colors.surface,
scrimColor = Color.Transparent,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = {
SortPicker(
selected = state.completedMode,
options = completedOptions,
onSelected = {
viewModel.setCompletedMode(it)
closePicker()
}
)
}
)
LaunchedEffect(Unit) {
sheetState.show()
}
}
LaunchedEffect(Unit) {
mainSheetState.show()
}
@ -195,6 +238,7 @@ class SortSettingsActivity : ComponentActivity() {
const val EXTRA_ASTRID_ORDER = "extra_astrid_order"
const val EXTRA_WIDGET_ID = "extra_widget_id"
const val EXTRA_FORCE_RELOAD = "extra_force_reload"
const val EXTRA_CHANGED_GROUP = "extra_changed_group"
const val WIDGET_NONE = -1
fun getIntent(
@ -234,83 +278,56 @@ fun SortSheetContent(
setAstridSort(true)
}
}
SortOption(
resId = R.string.SSD_sort_auto,
selected = !manualSortSelected && selected == SortHelper.SORT_AUTO,
onClick = { onSelected(SortHelper.SORT_AUTO) }
)
SortOption(
resId = R.string.SSD_sort_start,
selected = !manualSortSelected && selected == SortHelper.SORT_START,
onClick = { onSelected(SortHelper.SORT_START) }
)
SortOption(
resId = R.string.SSD_sort_due,
selected = !manualSortSelected && selected == SortHelper.SORT_DUE,
onClick = { onSelected(SortHelper.SORT_DUE) }
)
SortOption(
resId = R.string.SSD_sort_importance,
selected = !manualSortSelected && selected == SortHelper.SORT_IMPORTANCE,
onClick = { onSelected(SortHelper.SORT_IMPORTANCE) }
)
SortOption(
resId = R.string.SSD_sort_alpha,
selected = !manualSortSelected && selected == SortHelper.SORT_ALPHA,
onClick = { onSelected(SortHelper.SORT_ALPHA) }
)
SortOption(
resId = R.string.SSD_sort_modified,
selected = !manualSortSelected && selected == SortHelper.SORT_MODIFIED,
onClick = { onSelected(SortHelper.SORT_MODIFIED) }
)
SortOption(
resId = R.string.sort_created,
selected = !manualSortSelected && selected == SortHelper.SORT_CREATED,
onClick = { onSelected(SortHelper.SORT_CREATED) }
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_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.sort_created to SortHelper.SORT_CREATED,
)
val groupOptions = linkedMapOf(
R.string.none to SortHelper.GROUP_NONE,
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_modified to SortHelper.SORT_MODIFIED,
R.string.sort_created to SortHelper.SORT_CREATED,
R.string.sort_list to SortHelper.SORT_LIST,
)
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_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.sort_created to SortHelper.SORT_CREATED,
)
@Composable
fun GroupSheetContent(
fun SortPicker(
selected: Int,
options: Map<Int, Int>,
onSelected: (Int) -> Unit,
) {
SortOption(
resId = R.string.none,
selected = selected == SortHelper.GROUP_NONE,
onClick = { onSelected(SortHelper.GROUP_NONE) }
)
SortOption(
resId = R.string.SSD_sort_due,
selected = selected == SortHelper.SORT_DUE,
onClick = { onSelected(SortHelper.SORT_DUE) }
)
SortOption(
resId = R.string.SSD_sort_start,
selected = selected == SortHelper.SORT_START,
onClick = { onSelected(SortHelper.SORT_START) }
)
SortOption(
resId = R.string.SSD_sort_importance,
selected = selected == SortHelper.SORT_IMPORTANCE,
onClick = { onSelected(SortHelper.SORT_IMPORTANCE) }
)
SortOption(
resId = R.string.SSD_sort_modified,
selected = selected == SortHelper.SORT_MODIFIED,
onClick = { onSelected(SortHelper.SORT_MODIFIED) }
)
SortOption(
resId = R.string.sort_created,
selected = selected == SortHelper.SORT_CREATED,
onClick = { onSelected(SortHelper.SORT_CREATED) }
)
SortOption(
resId = R.string.sort_list,
selected = selected == SortHelper.SORT_LIST,
onClick = { onSelected(SortHelper.SORT_LIST) }
)
options.forEach { (resId, sortMode) ->
SortOption(
resId = resId,
selected = selected == sortMode,
onClick = { onSelected(sortMode) },
)
}
}
@Composable
@ -336,14 +353,20 @@ fun SortOption(
fun BottomSheetContent(
groupMode: Int,
sortMode: Int,
completedMode: Int,
sortAscending: Boolean,
groupAscending: Boolean,
completedAscending: Boolean,
manualSort: Boolean,
astridSort: Boolean,
completedAtBottom: Boolean,
setSortAscending: (Boolean) -> Unit,
setGroupAscending: (Boolean) -> Unit,
setCompletedAscending: (Boolean) -> Unit,
setCompletedAtBottom: (Boolean) -> Unit,
clickGroupMode: () -> Unit,
clickSortMode: () -> Unit,
clickCompletedMode: () -> Unit,
) {
Row(
modifier = Modifier.padding(16.dp),
@ -369,24 +392,9 @@ fun BottomSheetContent(
SortHelper.SORT_IMPORTANCE -> !groupAscending
else -> groupAscending
}
Chip(
onClick = { setGroupAscending(!groupAscending) },
shape = RoundedCornerShape(4.dp),
border = ChipDefaults.outlinedBorder,
colors = ChipDefaults.outlinedChipColors(),
leadingIcon = {
Icon(
imageVector = if (displayAscending) Icons.Outlined.ArrowUpward else Icons.Outlined.ArrowDownward,
modifier = Modifier.size(16.dp),
contentDescription = null,
)
},
content = {
Text(
text = stringResource(id = if (displayAscending) R.string.sort_ascending else R.string.sort_descending),
style = MaterialTheme.typography.body1,
)
},
OrderingChip(
ascending = displayAscending,
onClick = { setGroupAscending(!groupAscending) }
)
}
}
@ -421,29 +429,94 @@ fun BottomSheetContent(
SortHelper.SORT_IMPORTANCE -> !sortAscending
else -> sortAscending
}
Chip(
onClick = { setSortAscending(!sortAscending) },
shape = RoundedCornerShape(4.dp),
border = ChipDefaults.outlinedBorder,
colors = ChipDefaults.outlinedChipColors(),
leadingIcon = {
Icon(
imageVector = if (displayAscending) Icons.Outlined.ArrowUpward else Icons.Outlined.ArrowDownward,
modifier = Modifier.size(16.dp),
contentDescription = null,
OrderingChip(
ascending = displayAscending,
onClick = { setSortAscending(!sortAscending) }
)
}
}
if (!astridSort) {
Divider(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp)
.height(1.dp)
)
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(horizontal = 16.dp)
) {
Text(
text = stringResource(R.string.completed_tasks_at_bottom),
style = MaterialTheme.typography.body1,
modifier = Modifier.weight(1f),
)
Switch(
checked = completedAtBottom,
onCheckedChange = { setCompletedAtBottom(it) }
)
}
if (completedAtBottom) {
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Column(
modifier = Modifier
.weight(1f)
.clickable { clickCompletedMode() }
) {
Text(
text = stringResource(id = R.string.completed),
style = MaterialTheme.typography.h6,
)
},
content = {
Text(
text = stringResource(id = if (displayAscending) R.string.sort_ascending else R.string.sort_descending),
text = stringResource(id = completedMode.modeString),
style = MaterialTheme.typography.body1,
)
},
)
}
Spacer(modifier = Modifier.width(16.dp))
val displayAscending = when (completedMode) {
SortHelper.SORT_IMPORTANCE -> !completedAscending
else -> completedAscending
}
OrderingChip(
ascending = displayAscending,
onClick = { setCompletedAscending(!completedAscending) }
)
}
}
}
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun OrderingChip(
ascending: Boolean,
onClick: () -> Unit,
) {
Chip(
onClick = onClick,
shape = RoundedCornerShape(4.dp),
border = ChipDefaults.outlinedBorder,
colors = ChipDefaults.outlinedChipColors(),
leadingIcon = {
Icon(
imageVector = if (ascending) Icons.Outlined.ArrowUpward else Icons.Outlined.ArrowDownward,
modifier = Modifier.size(16.dp),
contentDescription = null,
)
},
content = {
Text(
text = stringResource(id = if (ascending) R.string.sort_ascending else R.string.sort_descending),
style = MaterialTheme.typography.body1,
)
},
)
}
private val Int.modeString: Int
get() = when (this) {
SortHelper.GROUP_NONE -> R.string.none
@ -454,6 +527,7 @@ private val Int.modeString: Int
SortHelper.SORT_CREATED -> R.string.sort_created
SortHelper.SORT_START -> R.string.SSD_sort_start
SortHelper.SORT_LIST -> R.string.sort_list
SortHelper.SORT_COMPLETED -> R.string.sort_completed
else -> R.string.SSD_sort_auto
}
@ -462,17 +536,25 @@ private val Int.modeString: Int
@Composable
fun PreviewSortBottomSheet() {
MdcTheme {
BottomSheetContent(
groupMode = SortHelper.GROUP_NONE,
sortMode = SortHelper.SORT_AUTO,
sortAscending = false,
groupAscending = false,
manualSort = false,
astridSort = false,
clickGroupMode = {},
clickSortMode = {},
setSortAscending = {},
setGroupAscending = {},
)
Column {
BottomSheetContent(
groupMode = SortHelper.GROUP_NONE,
sortMode = SortHelper.SORT_AUTO,
completedMode = SortHelper.SORT_ALPHA,
sortAscending = false,
groupAscending = false,
completedAscending = false,
manualSort = false,
astridSort = false,
completedAtBottom = true,
clickGroupMode = {},
clickSortMode = {},
clickCompletedMode = {},
setCompletedAtBottom = {},
setSortAscending = {},
setGroupAscending = {},
setCompletedAscending = {},
)
}
}
}

@ -25,8 +25,11 @@ class SortSettingsViewModel @Inject constructor(
val astridSort: Boolean,
val groupMode: Int,
val groupAscending: Boolean,
val completedAtBottom: Boolean,
val sortMode: Int,
val sortAscending: Boolean,
val completedMode: Int,
val completedAscending: Boolean,
)
private val widgetId = savedStateHandle[SortSettingsActivity.EXTRA_WIDGET_ID] ?: WIDGET_NONE
private val preferences =
@ -40,6 +43,9 @@ class SortSettingsViewModel @Inject constructor(
astridSort = preferences.isAstridSort,
groupMode = preferences.groupMode,
groupAscending = preferences.groupAscending,
completedMode = preferences.completedMode,
completedAscending = preferences.completedAscending,
completedAtBottom = preferences.completedTasksAtBottom,
sortMode = preferences.sortMode,
sortAscending = preferences.sortAscending,
)
@ -56,6 +62,16 @@ class SortSettingsViewModel @Inject constructor(
_viewState.update { it.copy(groupAscending = ascending) }
}
fun setCompletedAscending(ascending: Boolean) {
preferences.completedAscending = ascending
_viewState.update { it.copy(completedAscending = ascending) }
}
fun setCompletedAtBottom(completedAtBottom: Boolean) {
preferences.completedTasksAtBottom = completedAtBottom
_viewState.update { it.copy(completedAtBottom = completedAtBottom) }
}
fun setGroupMode(groupMode: Int) {
if (groupMode != SortHelper.GROUP_NONE) {
preferences.isManualSort = false
@ -78,6 +94,22 @@ class SortSettingsViewModel @Inject constructor(
}
}
fun setCompletedMode(completedMode: Int) {
preferences.completedMode = completedMode
val ascending = when (completedMode) {
SortHelper.SORT_MODIFIED,
SortHelper.SORT_CREATED -> false
else -> true
}
preferences.completedAscending = ascending
_viewState.update {
it.copy(
completedMode = completedMode,
completedAscending = ascending,
)
}
}
fun setSortMode(sortMode: Int) {
preferences.isManualSort = false
preferences.isAstridSort = false
@ -127,4 +159,7 @@ class SortSettingsViewModel @Inject constructor(
val forceReload: Boolean
get() = initialState.manualSort != _viewState.value.manualSort
|| initialState.astridSort != _viewState.value.astridSort
val changedGroup: Boolean
get() = initialState.groupMode != _viewState.value.groupMode
}

@ -357,6 +357,10 @@ class Preferences @JvmOverloads constructor(
get() = getInt(R.string.p_group_mode, SortHelper.GROUP_NONE)
set(value) { setInt(R.string.p_group_mode, value) }
override var completedMode: Int
get() = getInt(R.string.p_completed_mode, SortHelper.SORT_COMPLETED)
set(value) { setInt(R.string.p_completed_mode, value) }
override var showHidden: Boolean
get() = getBoolean(R.string.p_show_hidden_tasks, true)
set(value) { setBoolean(R.string.p_show_hidden_tasks, value) }
@ -369,11 +373,9 @@ class Preferences @JvmOverloads constructor(
get() = getBoolean(R.string.p_always_display_full_date, false)
set(value) { setBoolean(R.string.p_always_display_full_date, value)}
override val completedTasksAtBottom: Boolean
override var completedTasksAtBottom: Boolean
get() = getBoolean(R.string.p_completed_tasks_at_bottom, true)
override val sortCompletedByCompletionDate: Boolean
get() = getBoolean(R.string.p_completed_tasks_sort, true)
set(value) { setBoolean(R.string.p_completed_tasks_at_bottom, value) }
val backupDirectory: Uri?
get() = getDirectory(R.string.p_backup_dir, "backups")
@ -504,6 +506,10 @@ class Preferences @JvmOverloads constructor(
get() = getBoolean(R.string.p_group_ascending, false)
set(value) { setBoolean(R.string.p_group_ascending, value) }
override var completedAscending: Boolean
get() = getBoolean(R.string.p_completed_ascending, false)
set(value) { setBoolean(R.string.p_completed_ascending, value) }
val defaultPriority: Int
get() = getIntegerFromString(R.string.p_default_importance_key, Task.Priority.LOW)

@ -5,6 +5,8 @@ interface QueryPreferences {
var groupMode: Int
var completedMode: Int
var isManualSort: Boolean
var isAstridSort: Boolean
@ -13,13 +15,13 @@ interface QueryPreferences {
var groupAscending: Boolean
var completedAscending: Boolean
val showHidden: Boolean
val showCompleted: Boolean
var alwaysDisplayFullDate: Boolean
val completedTasksAtBottom: Boolean
val sortCompletedByCompletionDate: Boolean
var completedTasksAtBottom: Boolean
}

@ -296,8 +296,8 @@ public class WidgetPreferences implements QueryPreferences {
}
@Override
public boolean getSortCompletedByCompletionDate() {
return preferences.getSortCompletedByCompletionDate();
public void setCompletedTasksAtBottom(boolean value) {
preferences.setBoolean(R.string.p_completed_tasks_at_bottom, value);
}
@Override
@ -334,4 +334,24 @@ public class WidgetPreferences implements QueryPreferences {
public void setAlwaysDisplayFullDate(boolean noWeekday) {
preferences.setAlwaysDisplayFullDate(noWeekday);
}
@Override
public int getCompletedMode() {
return preferences.getCompletedMode();
}
@Override
public void setCompletedMode(int mode) {
preferences.setCompletedMode(mode);
}
@Override
public boolean getCompletedAscending() {
return preferences.getCompletedAscending();
}
@Override
public void setCompletedAscending(boolean ascending) {
preferences.setCompletedAscending(ascending);
}
}

@ -761,7 +761,6 @@
<string name="app_bar_position">موقع شريط التطبيق</string>
<string name="alarm_after_start">%s بعد البدئ</string>
<string name="alarm_before_due">%s حتى موعد الإنتهاء</string>
<string name="completed_tasks_sort">فرز حسب تاريخ الإكتمال</string>
<string name="completed_tasks_at_bottom">انقل المهام المكتملة إلى الأسفل</string>
<string name="snackbar_tasks_completed">%d مهمة اكتملت</string>
<string name="alarm_before_start">%s قبل البدئ</string>

@ -684,7 +684,6 @@
<string name="upgrade_google_tasks">Синхронизиранр на няколко профила</string>
<string name="snackbar_task_completed">Задачата е завършена</string>
<string name="share_list">Споделяне на списък</string>
<string name="completed_tasks_sort">Сортиране по дата на завършване</string>
<string name="app_bar_collapse">Свиване на лентата на приложението</string>
<string name="insufficient_sponsorship">Не е намерен подходящо спонсорство в GitHub</string>
<string name="upgrade_automation_description">Приставки за Tasker, Automate и Locale</string>

@ -730,7 +730,6 @@
<string name="top">Horní</string>
<string name="completed">Splněný</string>
<string name="completed_tasks_at_bottom">Přesunout splněné úkoly naspod</string>
<string name="completed_tasks_sort">Seřadit podle data splnění</string>
<string name="snackbar_tasks_completed">%d úkolů splněno</string>
<string name="caldav_server_type">Typ serveru</string>
<string name="filter_snoozed">Odloženo</string>

@ -688,7 +688,6 @@
</plurals>
<string name="randomly_every">Tilfældigt hver %s</string>
<string name="snackbar_task_completed">Opgave udført</string>
<string name="completed_tasks_sort">Sorter efter færdiggørelsesdato</string>
<plurals name="reminder_hours">
<item quantity="one">Time</item>
<item quantity="other">Timer</item>

@ -687,7 +687,6 @@
<string name="completed">Abgeschlossen</string>
<string name="snackbar_task_completed">Aufgabe abgeschlossen</string>
<string name="completed_tasks_at_bottom">Erledigte Aufgaben nach unten verschieben</string>
<string name="completed_tasks_sort">Nach Fertigstellungsdatum sortieren</string>
<string name="snackbar_tasks_completed">%d Aufgaben erledigt</string>
<string name="alarm_before_start">%s vor dem Start</string>
<string name="alarm_after_start">%s nach dem Start</string>

@ -706,7 +706,6 @@
<string name="completed_tasks_at_bottom">Mover las tareas completadas a la parte inferior</string>
<string name="snackbar_tasks_completed">%d tareas completadas</string>
<string name="alarm_after_due">%s después de la fecha límite</string>
<string name="completed_tasks_sort">Ordenar por fecha de finalización</string>
<string name="alarm_before_start">%s antes de empezar</string>
<string name="alarm_after_start">%s tras el inicio</string>
<string name="alarm_before_due">%s antes de la fecha límite</string>

@ -685,7 +685,6 @@
<string name="completed">Amaituta</string>
<string name="snackbar_task_completed">Amaitutako zereginak</string>
<string name="completed_tasks_at_bottom">Betetako atazak behealdera mugitu</string>
<string name="completed_tasks_sort">Ordenatu amaiera-dataren arabera</string>
<string name="snackbar_tasks_completed">%d atazak osatuta</string>
<string name="alarm_before_start">%s hasi aurretik</string>
<string name="alarm_after_start">%s hasi ondoren</string>

@ -703,7 +703,6 @@
<string name="rmd_time_description">Näytä ilmoitukset tehtäville ilman eräpäivää</string>
<string name="microsoft_selection_description">Synkronoi henkilökohtaisen Microsoft-tilin kanssa</string>
<string name="completed_tasks_at_bottom">Siirrä valmiit tehtävät alimmaiseksi</string>
<string name="completed_tasks_sort">Järjestä valmistumispäivän mukaan</string>
<string name="caldav_server_unknown">Tuntematon</string>
<string name="caldav_server_other">Muu</string>
<string name="caldav_server_type">Palvelimen tyyppi</string>

@ -700,7 +700,6 @@
<string name="snackbar_task_completed">Tâche terminée</string>
<string name="completed_tasks_at_bottom">Déplacer les tâches terminées vers le bas</string>
<string name="snackbar_tasks_completed">%d tâches terminées</string>
<string name="completed_tasks_sort">Trier par date d\'achèvement</string>
<string name="alarm_before_start">%s avant le début</string>
<string name="alarm_after_start">%s après le début</string>
<string name="alarm_before_due">%s avant échéance</string>

@ -405,7 +405,6 @@
<string name="caldav_server_unknown">Descoñecido</string>
<string name="caldav_server_other">Outro</string>
<string name="more_options">Máis opcións</string>
<string name="completed_tasks_sort">Escoller por data de fin</string>
<string name="snackbar_tasks_completed">%d tarefas finalizadas</string>
<string name="caldav_server_type">Tipo de servidor</string>
<string name="filter_snoozed">Posposta</string>

@ -704,7 +704,6 @@
<string name="app_bar_collapse">Sklopi programske trake</string>
<string name="snackbar_task_completed">Zadatak obavljen</string>
<string name="completed_tasks_at_bottom">Premjesti obavljene zadatke na kraj</string>
<string name="completed_tasks_sort">Razvrtaj prema datumu obavljanja</string>
<string name="snackbar_tasks_completed">%d zadaci obavljeni</string>
<string name="alarm_before_start">%s prije početka</string>
<string name="alarm_after_start">%s nakon početka</string>

@ -685,7 +685,6 @@
<string name="bottom">Alul</string>
<string name="snackbar_task_completed">Feladat elvégezve</string>
<string name="completed_tasks_at_bottom">Az elvégzett feladatok kerüljenek alulra</string>
<string name="completed_tasks_sort">Rendezés elvégzés dátuma alapján</string>
<string name="snackbar_tasks_completed">%d feladat elvégezve</string>
<string name="alarm_before_start">%s kezdés előtt</string>
<string name="alarm_after_start">%s kezdés után</string>

@ -691,7 +691,6 @@
<string name="snackbar_task_completed">Tugas selesai</string>
<string name="custom_notification">Notifikasi kustom</string>
<string name="hint_customize_edit_body">Kamu dapat mengubah bagian ini dengan mengurutkan atau menghapus kolom</string>
<string name="completed_tasks_sort">Urutkan berdasarkan tanggal selesai</string>
<string name="alarm_before_start">Detik sebelum mulai</string>
<string name="alarm_after_start">Detik setelah mulai</string>
</resources>

@ -704,7 +704,6 @@
<string name="bottom">In basso</string>
<string name="snackbar_task_completed">Attività completata</string>
<string name="completed_tasks_at_bottom">Sposta le attività completate in basso</string>
<string name="completed_tasks_sort">Ordina per data di completamento</string>
<string name="snackbar_tasks_completed">%d attività completate</string>
<string name="alarm_after_due">%s dopo la scadenza</string>
<string name="alarm_before_start">%s prima di iniziare</string>

@ -667,7 +667,6 @@
<string name="upgrade_tasks_org_account_description">Tasks.org と同期し、他のユーザーと共同作業が可能</string>
<string name="upgrade_desktop_access">デスクトップアクセス</string>
<string name="upgrade_open_source_description">あなたの支援が継続的な開発を支えます</string>
<string name="completed_tasks_sort">完了日順で並び替え</string>
<string name="snackbar_tasks_completed">完了したタスク: %d</string>
<string name="alarm_before_start">着手 %s 前</string>
<string name="alarm_after_start">着手 %s 後</string>

@ -705,7 +705,6 @@
</plurals>
<string name="customize_edit_screen_summary">필드 순서 변경 또는 삭제</string>
<string name="sort_completion_group">%s 완료</string>
<string name="completed_tasks_sort">완료일순 정렬</string>
<string name="dismiss">닫기</string>
<string name="hint_customize_edit_title">정보가 너무 많은가요\?</string>
<string name="app_bar_position">앱 바메뉴 위치</string>

@ -741,7 +741,6 @@
<string name="snoozed_until">Užmigdyta iki %s</string>
<string name="completion_sound">Groti užbaigimo garsą</string>
<string name="TEA_creation_date">Sukūrimo data</string>
<string name="completed_tasks_sort">Rūšiuoti pagal užbaigimo datą</string>
<string name="microsoft_selection_description">Sinchronizuoti su asmenine Microsoft paskyra</string>
<string name="sort_completion_group">Užbaigimas %s</string>
<string name="completed_tasks_at_bottom">Perkelti užbaigtas užduotis į apačią</string>

@ -702,7 +702,6 @@
<string name="TEA_creation_date">Opprettelsesdato</string>
<string name="microsoft_selection_description">Synkroniser med din personlige Microsoft-konto</string>
<string name="sort_completion_group">Fullføring %s</string>
<string name="completed_tasks_sort">Sorter etter fullførelsesdato</string>
<string name="snackbar_tasks_completed">%d gjøremål fullført</string>
<string name="sign_in">Logg inn</string>
<string name="custom_filter_has_reminder">Har påminnelse</string>

@ -688,7 +688,6 @@
<string name="snackbar_task_completed">Taak voltooid</string>
<string name="completed_tasks_at_bottom">Plaats voltooide taken onderaan</string>
<string name="snackbar_tasks_completed">%d taken voltooid</string>
<string name="completed_tasks_sort">Sorteren op datum voltooien</string>
<string name="alarm_before_due">%s voor vervallen</string>
<string name="alarm_after_due">%s na vervallen</string>
<string name="alarm_before_start">%s voor begin</string>

@ -732,7 +732,6 @@
<string name="top">Góra</string>
<string name="custom_notification">Własne powiadomienie</string>
<string name="snackbar_task_completed">Zadanie zakończone</string>
<string name="completed_tasks_sort">Posortuj po dacie zakończenia</string>
<string name="snackbar_tasks_completed">%d zadań zakończonych</string>
<string name="alarm_before_start">%s przed startem</string>
<string name="alarm_after_start">%s po rozpoczęciu</string>

@ -705,7 +705,6 @@
<string name="custom_notification">Notificação personalizada</string>
<string name="snackbar_task_completed">Tarefa completa</string>
<string name="snackbar_tasks_completed">%d tarefas concluídas</string>
<string name="completed_tasks_sort">Classificar por data de conclusão</string>
<string name="alarm_before_start">%s antes de começar</string>
<string name="alarm_after_start">%s após o início</string>
<string name="alarm_before_due">%s antes do vencimento</string>

@ -688,7 +688,6 @@
<string name="snackbar_task_completed">Tarefa terminada</string>
<string name="completed_tasks_at_bottom">Mover as tarefas terminadas para o fundo</string>
<string name="snackbar_tasks_completed">%d tarefas terminadas</string>
<string name="completed_tasks_sort">Ordenar por data de finalização</string>
<string name="alarm_before_start">%s antes de começar</string>
<string name="alarm_after_start">%s após o início</string>
<string name="alarm_before_due">%s antes do término</string>

@ -703,7 +703,6 @@
<string name="snackbar_task_completed">Sarcină îndeplinită</string>
<string name="completed_tasks_at_bottom">Mutați sarcinile finalizate în partea de jos</string>
<string name="snackbar_tasks_completed">%d sarcini finalizate</string>
<string name="completed_tasks_sort">Sortează după data de finalizare</string>
<string name="alarm_before_start">%s înainte de start</string>
<string name="alarm_after_start">%s după pornire</string>
<string name="alarm_after_due">%s după scadență</string>

@ -737,7 +737,6 @@
<string name="alarm_before_due">%s до</string>
<string name="alarm_after_due">%s после</string>
<string name="alarm_after_start">%s после начала</string>
<string name="completed_tasks_sort">Сортировать по дате завершения</string>
<string name="filter_snoozed">Отложенные</string>
<string name="caldav_server_unknown">Неизвестный</string>
<string name="caldav_server_other">Другой</string>

@ -705,7 +705,6 @@
<item quantity="other">මිනිත්තු</item>
</plurals>
<string name="completed_tasks_at_bottom">සම්පුර්ණ කරන ලද කාර්යයන් පහළට ගෙන යන්න</string>
<string name="completed_tasks_sort">සම්පූර්ණ කරන දිනය අනුව වර්ග කරන්න</string>
<string name="alarm_before_start">%s ආරම්භයට පෙර</string>
<string name="alarm_after_start">%s ආරම්භයෙන් පසුව</string>
</resources>

@ -704,7 +704,6 @@
<string name="snackbar_task_completed">Uppgiften slutförd</string>
<string name="completed_tasks_at_bottom">Flytta slutförda uppgifter till botten</string>
<string name="snackbar_tasks_completed">%d uppgifter slutförda</string>
<string name="completed_tasks_sort">Sortera efter färdigdatum</string>
<string name="custom_filter_has_reminder">Har påminnelse</string>
<string name="caldav_server_unknown">Okänd</string>
<string name="caldav_server_other">Övrig</string>

@ -688,7 +688,6 @@
<string name="snackbar_task_completed">Görev tamamlandı</string>
<string name="completed_tasks_at_bottom">Tamamlanan görevleri alta taşı</string>
<string name="snackbar_tasks_completed">%d görev tamamlandı</string>
<string name="completed_tasks_sort">Tamamlanma tarihine göre sırala</string>
<string name="custom_filter_has_reminder">Anımsatıcılı</string>
<plurals name="reminder_hours">
<item quantity="one">Saat</item>

@ -709,7 +709,6 @@
<string name="completed_tasks_at_bottom">Перемістити виконані завдання вниз</string>
<string name="alarm_before_start">%s до початку</string>
<string name="alarm_after_start">%s після початку</string>
<string name="completed_tasks_sort">Сортувати за датою завершення</string>
<string name="snackbar_tasks_completed">%d завдань виконано</string>
<string name="alarm_before_due">%s до</string>
<string name="alarm_after_due">%s після</string>

@ -672,7 +672,6 @@
<string name="snoozed_until">Đã đặt báo lại cho đến %s</string>
<string name="snackbar_task_completed">Công việc đã hoàn tất</string>
<string name="completed_tasks_at_bottom">Di chuyển công việc đã hoàn tất xuống dưới</string>
<string name="completed_tasks_sort">Sắp xếp theo ngày hoàn thành</string>
<string name="snackbar_tasks_completed">%d công việc đã hoàn tất</string>
<string name="alarm_before_start">%s trước bắt đầu</string>
<string name="alarm_after_start">%s sau bắt đầu</string>

@ -678,7 +678,6 @@
<string name="completed_tasks_at_bottom">将已完成任务移至底部</string>
<string name="snackbar_tasks_completed">完成了 %d 个任务</string>
<string name="alarm_after_start">开始后 %s</string>
<string name="completed_tasks_sort">按完成日期排序</string>
<string name="alarm_before_start">开始前 %s</string>
<string name="alarm_before_due">到期前 %s</string>
<string name="alarm_after_due">到期后 %s</string>

@ -273,11 +273,13 @@
<string name="p_show_completed_tasks">show_completed_tasks</string>
<string name="p_sort_ascending">sort_ascending</string>
<string name="p_group_ascending">group_ascending</string>
<string name="p_completed_ascending">completed_ascending</string>
<string name="p_manual_sort">manual_sort</string>
<string name="p_astrid_sort">astrid_sort</string>
<string name="p_astrid_sort_enabled">astrid_sort_enabled</string>
<string name="p_sort_mode">sort_mode</string>
<string name="p_group_mode">group_mode</string>
<string name="p_completed_mode">completed_mode</string>
<string-array name="TEA_control_sets_prefs">
<item>@string/TEA_ctrl_hide_until_pref</item>
@ -446,7 +448,6 @@
<string name="p_app_bar_position">app_bar_position</string>
<string name="p_app_bar_collapse">app_bar_collapse</string>
<string name="p_completed_tasks_at_bottom">completed_tasks_at_bottom</string>
<string name="p_completed_tasks_sort">completed_tasks_sort</string>
<string name="p_shown_beast_mode_hint">shown_beast_mode_hint</string>
<string name="p_last_sync">last_sync_time</string>
</resources>

@ -43,6 +43,7 @@ File %1$s contained %2$s.\n\n
<string name="SSD_sort_modified">By last modified</string>
<string name="sort_created">By creation time</string>
<string name="sort_list">By list</string>
<string name="sort_completed">By completion time</string>
<string name="FLA_search_filter">Matching \'%s\'</string>
<string name="FLA_new_filter">Create new filter</string>
<string name="TEA_title_hint">Task name</string>
@ -713,7 +714,6 @@ File %1$s contained %2$s.\n\n
<string name="completed">Completed</string>
<string name="snackbar_task_completed">Task completed</string>
<string name="completed_tasks_at_bottom">Move completed tasks to bottom</string>
<string name="completed_tasks_sort">Sort by completion date</string>
<string name="snackbar_tasks_completed">%d tasks completed</string>
<string name="alarm_before_start">%s before start</string>
<string name="alarm_after_start">%s after start</string>

@ -55,18 +55,6 @@
android:summary="@string/linkify_description"
android:title="@string/linkify" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="@string/p_completed_tasks_at_bottom"
android:title="@string/completed_tasks_at_bottom"
app:allowDividerAbove="true" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:dependency="@string/p_completed_tasks_at_bottom"
android:key="@string/p_completed_tasks_sort"
android:title="@string/completed_tasks_sort" />
<PreferenceCategory android:title="@string/chips">
<ListPreference

Loading…
Cancel
Save