#2257 Change priority for selected items (#2452)

pull/2520/head
vulewuxe86 2 years ago committed by GitHub
parent 138cc21796
commit 113cf6f1b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -100,6 +100,7 @@ import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.dialogs.PriorityPicker.Companion.newPriorityPicker
import org.tasks.dialogs.SortSettingsActivity import org.tasks.dialogs.SortSettingsActivity
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
import org.tasks.extensions.Context.toast import org.tasks.extensions.Context.toast
@ -750,6 +751,19 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
} }
true true
} }
R.id.edit_priority -> {
lifecycleScope.launch {
taskDao
.fetch(selected)
.filterNot { it.readOnly }
.takeIf { it.isNotEmpty() }
?.let {
newPriorityPicker(preferences.getBoolean(R.string.p_desaturate_colors, false), it)
.show(parentFragmentManager, FRAG_TAG_PRIORITY_PICKER)
}
}
true
}
R.id.move_tasks -> { R.id.move_tasks -> {
lifecycleScope.launch { lifecycleScope.launch {
val singleFilter = taskMover.getSingleFilter(selected) val singleFilter = taskMover.getSingleFilter(selected)
@ -879,7 +893,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
makeSnackbar(R.string.delete_multiple_tasks_confirmation, result.size.toString())?.show() makeSnackbar(R.string.delete_multiple_tasks_confirmation, result.size.toString())?.show()
} }
private fun setSelected(tasks: List<Long>) { private fun setSelected(tasks: List<Long>) {
taskAdapter.setSelected(tasks) taskAdapter.setSelected(tasks)
updateModeTitle() updateModeTitle()
@ -1020,6 +1033,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private const val EXTRA_FILTER = "extra_filter" private const val EXTRA_FILTER = "extra_filter"
private const val FRAG_TAG_REMOTE_LIST_PICKER = "frag_tag_remote_list_picker" private const val FRAG_TAG_REMOTE_LIST_PICKER = "frag_tag_remote_list_picker"
private const val FRAG_TAG_DATE_TIME_PICKER = "frag_tag_date_time_picker" private const val FRAG_TAG_DATE_TIME_PICKER = "frag_tag_date_time_picker"
private const val FRAG_TAG_PRIORITY_PICKER = "frag_tag_priority_picker"
private const val REQUEST_LIST_SETTINGS = 10101 private const val REQUEST_LIST_SETTINGS = 10101
private const val REQUEST_TAG_TASKS = 10106 private const val REQUEST_TAG_TASKS = 10106
const val REQUEST_SORT = 10107 const val REQUEST_SORT = 10107

@ -40,7 +40,7 @@ fun PriorityRow(
TaskEditRow( TaskEditRow(
iconRes = R.drawable.ic_outline_flag_24px, iconRes = R.drawable.ic_outline_flag_24px,
content = { content = {
Priority( PriorityLabeled(
selected = priority, selected = priority,
onClick = { onChangePriority(it) }, onClick = { onChangePriority(it) },
desaturate = desaturate, desaturate = desaturate,
@ -54,6 +54,24 @@ fun Priority(
selected: Int, selected: Int,
onClick: (Int) -> Unit = {}, onClick: (Int) -> Unit = {},
desaturate: Boolean, desaturate: Boolean,
) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
for (i in Task.Priority.NONE downTo Task.Priority.HIGH) {
PriorityButton(
priority = i,
selected = selected,
onClick = onClick,
desaturate = desaturate,
)
}
}
}
@Composable
fun PriorityLabeled(
selected: Int,
onClick: (Int) -> Unit = {},
desaturate: Boolean,
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@ -70,16 +88,7 @@ fun Priority(
modifier = Modifier.padding(end = 16.dp) modifier = Modifier.padding(end = 16.dp)
) )
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
Row(horizontalArrangement = Arrangement.SpaceBetween) { Priority(selected = selected, onClick = onClick, desaturate = desaturate)
for (i in Task.Priority.NONE downTo Task.Priority.HIGH) {
PriorityButton(
priority = i,
selected = selected,
onClick = onClick,
desaturate = desaturate,
)
}
}
} }
} }

@ -0,0 +1,78 @@
package org.tasks.dialogs
import android.app.Dialog
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.Priority
import org.tasks.databinding.DialogDateTimePickerBinding
import org.tasks.databinding.DialogPriorityPickerBinding
import javax.inject.Inject
@AndroidEntryPoint
class PriorityPicker : DialogFragment() {
@Inject lateinit var taskDao: TaskDao
private val taskIds: LongArray
get() = arguments?.getLongArray(EXTRA_TASKS) ?: longArrayOf()
companion object {
const val EXTRA_TASKS = "extra_tasks"
const val EXTRA_DESATURATE = "extra_desaturatee"
fun newPriorityPicker(desaturateColors: Boolean, tasks: List<Task>): PriorityPicker {
val bundle = Bundle()
bundle.putLongArray(EXTRA_TASKS, tasks.map { it.id }.toLongArray())
bundle.putBoolean(EXTRA_DESATURATE, desaturateColors)
val fragment = PriorityPicker()
fragment.arguments = bundle
return fragment
}
}
lateinit var binding: DialogDateTimePickerBinding
private val priorityPickerViewModel: PriorityPickerViewModel by viewModels()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return requireActivity().let { fragmentActivity ->
val inflater = fragmentActivity.layoutInflater
val binding = DialogPriorityPickerBinding.inflate(inflater, null, false)
binding.priorityRow.setContent { Priority(selected = priorityPickerViewModel.priority.collectAsStateLifecycleAware().value,
onClick = { priorityPickerViewModel.setPriority( it ) }, desaturate = savedInstanceState?.getBoolean(
EXTRA_DESATURATE) ?: false) }
val builder = AlertDialog.Builder(fragmentActivity)
.setTitle("Change priority")
.setView(binding.root)
builder.setNegativeButton("Cancel") { _, _ ->
}
builder.setPositiveButton("Ok") { _, _ ->
changePriority()
}
builder.create()
}
}
private fun changePriority() {
lifecycleScope.launch(NonCancellable) {
taskDao
.fetch(taskIds.toList())
.forEach {
it.priority = priorityPickerViewModel.priority.value
taskDao.save(it)
}
}
dismiss()
}
}

@ -0,0 +1,20 @@
package org.tasks.dialogs
import androidx.lifecycle.ViewModel
import com.todoroo.astrid.data.Task
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import javax.inject.Inject
@HiltViewModel
class PriorityPickerViewModel @Inject constructor(): ViewModel() {
private val _priority = MutableStateFlow(Task.Priority.NONE)
val priority = _priority.asStateFlow()
fun setPriority(priority: Int) {
_priority.value = priority
}
}

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/dialog_background">
<androidx.compose.ui.platform.ComposeView
android:id="@+id/priority_row"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

@ -8,6 +8,12 @@
android:title="@string/tags" android:title="@string/tags"
app:showAsAction="always" /> app:showAsAction="always" />
<item
android:id="@+id/edit_priority"
android:icon="@drawable/ic_outline_flag_24px"
android:title="@string/priorities"
app:showAsAction="always" />
<item <item
android:id="@+id/move_tasks" android:id="@+id/move_tasks"
android:icon="@drawable/ic_list_24px" android:icon="@drawable/ic_list_24px"

@ -260,6 +260,8 @@
<string name="when_overdue">Wenn überfällig</string> <string name="when_overdue">Wenn überfällig</string>
<string name="when_due">Wenn fällig</string> <string name="when_due">Wenn fällig</string>
<string name="tags">Schlagwörter</string> <string name="tags">Schlagwörter</string>
<string name="priorities">Dringlichkeit</string>
<string name="change_priority">Dringlichkeit ändern</string>
<string name="filters">Filter</string> <string name="filters">Filter</string>
<string name="date_shortcut_hour">Für eine Stunde</string> <string name="date_shortcut_hour">Für eine Stunde</string>
<string name="date_shortcut_morning">Vormittag</string> <string name="date_shortcut_morning">Vormittag</string>

@ -338,6 +338,8 @@ File %1$s contained %2$s.\n\n
<string name="geofence_radius">Geofence radius</string> <string name="geofence_radius">Geofence radius</string>
<string name="location_radius_meters">%s m</string> <string name="location_radius_meters">%s m</string>
<string name="tags">Tags</string> <string name="tags">Tags</string>
<string name="priorities">Priorities</string>
<string name="change_priority">Change priority</string>
<string name="filters">Filters</string> <string name="filters">Filters</string>
<string name="date_shortcut_hour">For an hour</string> <string name="date_shortcut_hour">For an hour</string>
<string name="date_shortcut_morning">Morning</string> <string name="date_shortcut_morning">Morning</string>

Loading…
Cancel
Save