#2257 Change priority for selected items (#2452)

pull/2520/head
vulewuxe86 9 months 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.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.dialogs.PriorityPicker.Companion.newPriorityPicker
import org.tasks.dialogs.SortSettingsActivity
import org.tasks.extensions.Context.openUri
import org.tasks.extensions.Context.toast
@ -750,6 +751,19 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
}
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 -> {
lifecycleScope.launch {
val singleFilter = taskMover.getSingleFilter(selected)
@ -775,7 +789,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
true
}
R.id.menu_select_all -> {
lifecycleScope.launch {
lifecycleScope.launch {
setSelected(taskDao.fetchTasks(preferences, filter)
.map(TaskContainer::id))
}
@ -879,11 +893,10 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
makeSnackbar(R.string.delete_multiple_tasks_confirmation, result.size.toString())?.show()
}
private fun setSelected(tasks: List<Long>) {
taskAdapter.setSelected(tasks)
updateModeTitle()
recyclerAdapter?.notifyDataSetChanged()
taskAdapter.setSelected(tasks)
updateModeTitle()
recyclerAdapter?.notifyDataSetChanged()
}
private fun copySelectedItems(tasks: List<Long>) = lifecycleScope.launch {
@ -1020,6 +1033,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
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_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_TAG_TASKS = 10106
const val REQUEST_SORT = 10107

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

@ -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"
app:showAsAction="always" />
<item
android:id="@+id/edit_priority"
android:icon="@drawable/ic_outline_flag_24px"
android:title="@string/priorities"
app:showAsAction="always" />
<item
android:id="@+id/move_tasks"
android:icon="@drawable/ic_list_24px"
@ -44,4 +50,4 @@
android:title="@string/delete"
app:showAsAction="ifRoom"/>
</menu>
</menu>

@ -260,6 +260,8 @@
<string name="when_overdue">Wenn überfällig</string>
<string name="when_due">Wenn fällig</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="date_shortcut_hour">Für eine Stunde</string>
<string name="date_shortcut_morning">Vormittag</string>
@ -738,4 +740,4 @@
<string name="repeats_every">Wiederholt sich</string>
<string name="repeat_monthly_on_day_number">Monatlich an Tag %1d</string>
<string name="repeat_monthly_on_the_nth_weekday">Monatlich an dem %1$s %2$s</string>
</resources>
</resources>

@ -338,6 +338,8 @@ File %1$s contained %2$s.\n\n
<string name="geofence_radius">Geofence radius</string>
<string name="location_radius_meters">%s m</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="date_shortcut_hour">For an hour</string>
<string name="date_shortcut_morning">Morning</string>

Loading…
Cancel
Save