diff --git a/app/src/main/java/org/tasks/ui/PriorityControlSet.kt b/app/src/main/java/org/tasks/ui/PriorityControlSet.kt
index 767ade5c0..44d3d0aca 100644
--- a/app/src/main/java/org/tasks/ui/PriorityControlSet.kt
+++ b/app/src/main/java/org/tasks/ui/PriorityControlSet.kt
@@ -1,77 +1,97 @@
package org.tasks.ui
-import android.content.res.ColorStateList
-import android.os.Bundle
import android.view.ViewGroup
-import androidx.appcompat.widget.AppCompatRadioButton
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.RadioButton
+import androidx.compose.material.RadioButtonDefaults
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import com.google.android.material.composethemeadapter.MdcTheme
import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
-import org.tasks.databinding.ControlSetPriorityBinding
-import org.tasks.themes.ColorProvider
-import javax.inject.Inject
@AndroidEntryPoint
class PriorityControlSet : TaskEditControlFragment() {
- @Inject lateinit var colorProvider: ColorProvider
-
- private lateinit var priorityHigh: AppCompatRadioButton
- private lateinit var priorityMedium: AppCompatRadioButton
- private lateinit var priorityLow: AppCompatRadioButton
- private lateinit var priorityNone: AppCompatRadioButton
-
- private fun onPriorityChanged() {
- viewModel.priority = getPriority()
- }
-
- override fun createView(savedInstanceState: Bundle?) {
- when (viewModel.priority) {
- 0 -> priorityHigh.isChecked = true
- 1 -> priorityMedium.isChecked = true
- 2 -> priorityLow.isChecked = true
- else -> priorityNone.isChecked = true
- }
- tintRadioButton(priorityHigh, 0)
- tintRadioButton(priorityMedium, 1)
- tintRadioButton(priorityLow, 2)
- tintRadioButton(priorityNone, 3)
- }
override fun bind(parent: ViewGroup?) =
- ControlSetPriorityBinding.inflate(layoutInflater, parent, true).let {
- priorityHigh = it.priorityHigh.apply {
- setOnClickListener { onPriorityChanged() }
- }
- priorityMedium = it.priorityMedium.apply {
- setOnClickListener { onPriorityChanged() }
+ (parent?.findViewById(R.id.compose_view) as ComposeView).apply {
+ setContent {
+ MdcTheme {
+ val priority = viewModel.priority.collectAsState()
+ PriorityRow(
+ selected = priority.value,
+ onClick = { viewModel.priority.value = it })
+ }
}
- priorityLow = it.priorityLow.apply {
- setOnClickListener { onPriorityChanged() }
- }
- priorityNone = it.priorityNone.apply {
- setOnClickListener { onPriorityChanged() }
- }
- it.root
}
override val icon = R.drawable.ic_outline_flag_24px
+ override val rootLayout = R.layout.control_set_template_compose
+
override fun controlId() = TAG
- private fun tintRadioButton(radioButton: AppCompatRadioButton, priority: Int) {
- val color = colorProvider.getPriorityColor(priority, true)
- radioButton.buttonTintList = ColorStateList(arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)), intArrayOf(color, color))
+ companion object {
+ const val TAG = R.string.TEA_ctrl_importance_pref
}
+}
- @Task.Priority
- private fun getPriority() = when {
- priorityHigh.isChecked -> Task.Priority.HIGH
- priorityMedium.isChecked -> Task.Priority.MEDIUM
- priorityLow.isChecked -> Task.Priority.LOW
- else -> Task.Priority.NONE
+@Composable
+fun PriorityRow(
+ selected: Int,
+ onClick: (Int) -> Unit = {}
+) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .wrapContentHeight()
+ .padding(
+ top = dimensionResource(id = R.dimen.half_keyline_first),
+ bottom = dimensionResource(id = R.dimen.half_keyline_first),
+ end = 16.dp
+ ),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Text(
+ text = stringResource(id = R.string.TEA_importance_label),
+ style = MaterialTheme.typography.body1,
+ )
+ Spacer(modifier = Modifier.weight(1f))
+ PriorityButton(priority = Task.Priority.HIGH, selected = selected, onClick = onClick)
+ PriorityButton(priority = Task.Priority.MEDIUM, selected = selected, onClick = onClick)
+ PriorityButton(priority = Task.Priority.LOW, selected = selected, onClick = onClick)
+ PriorityButton(priority = Task.Priority.NONE, selected = selected, onClick = onClick)
}
+}
- companion object {
- const val TAG = R.string.TEA_ctrl_importance_pref
+@Composable
+fun PriorityButton(
+ @Task.Priority priority: Int,
+ selected: Int,
+ onClick: (Int) -> Unit,
+) {
+ val color = when (priority) {
+ in Int.MIN_VALUE..Task.Priority.HIGH -> colorResource(id = R.color.red_500)
+ Task.Priority.MEDIUM -> colorResource(id = R.color.amber_500)
+ Task.Priority.LOW -> colorResource(id = R.color.blue_500)
+ else -> colorResource(R.color.grey_500)
}
+ RadioButton(
+ selected = priority == selected,
+ onClick = { onClick(priority) },
+ colors = RadioButtonDefaults.colors(
+ selectedColor = color,
+ unselectedColor = color,
+ ),
+ )
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt
index 7da8e1d5d..02db42075 100644
--- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt
+++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt
@@ -33,22 +33,13 @@ import org.tasks.R
import org.tasks.Strings
import org.tasks.analytics.Firebase
import org.tasks.calendars.CalendarEventProvider
-import org.tasks.data.Alarm
+import org.tasks.data.*
import org.tasks.data.Alarm.Companion.TYPE_RANDOM
import org.tasks.data.Alarm.Companion.TYPE_REL_END
import org.tasks.data.Alarm.Companion.TYPE_REL_START
import org.tasks.data.Alarm.Companion.whenDue
import org.tasks.data.Alarm.Companion.whenOverdue
import org.tasks.data.Alarm.Companion.whenStarted
-import org.tasks.data.CaldavDao
-import org.tasks.data.CaldavTask
-import org.tasks.data.GoogleTask
-import org.tasks.data.GoogleTaskDao
-import org.tasks.data.Location
-import org.tasks.data.LocationDao
-import org.tasks.data.TagDao
-import org.tasks.data.TagData
-import org.tasks.data.TagDataDao
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.location.GeofenceApi
import org.tasks.preferences.PermissionChecker
@@ -125,6 +116,8 @@ class TaskEditViewModel @Inject constructor(
originalCalendar = preferences.defaultCalendar
}
eventUri = task.calendarURI
+
+ priority.value = task.priority
}
lateinit var task: Task
@@ -147,8 +140,7 @@ class TaskEditViewModel @Inject constructor(
}
}
- var priority: Int? = null
- get() = field ?: task.priority
+ var priority = MutableStateFlow(Task.Priority.NONE)
var description: String? = null
get() = field ?: task.notes.stripCarriageReturns()
@@ -287,7 +279,7 @@ class TaskEditViewModel @Inject constructor(
(task.title != title || (isNew && title?.isNotBlank() == true)) ||
task.isCompleted != completed ||
task.dueDate != dueDate ||
- task.priority != priority ||
+ task.priority != priority.value ||
if (task.notes.isNullOrBlank()) {
!description.isNullOrBlank()
} else {
@@ -332,7 +324,7 @@ class TaskEditViewModel @Inject constructor(
clear(remove)
task.title = if (title.isNullOrBlank()) context.getString(R.string.no_title) else title
task.dueDate = dueDate!!
- task.priority = priority!!
+ task.priority = priority.value
task.notes = description
task.hideUntil = hideUntil!!
task.recurrence = recurrence
diff --git a/app/src/main/res/layout/control_set_priority.xml b/app/src/main/res/layout/control_set_priority.xml
deleted file mode 100644
index 9b2dc9fe3..000000000
--- a/app/src/main/res/layout/control_set_priority.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/control_set_template_compose.xml b/app/src/main/res/layout/control_set_template_compose.xml
new file mode 100644
index 000000000..c73cd7af7
--- /dev/null
+++ b/app/src/main/res/layout/control_set_template_compose.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file