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