Convert priority control set to compose

pull/1911/head
Alex Baker 2 years ago
parent 1ca6076005
commit 708e2b14e6

@ -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,
),
)
}

@ -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

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<RadioGroup
android:id="@+id/priority_group"
android:layout_alignParentEnd="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:paddingStart="@dimen/keyline_first"
android:paddingEnd="0dp"
android:gravity="end"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/priority_none"
style="@style/priority_button" />
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/priority_low"
style="@style/priority_button" />
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/priority_medium"
style="@style/priority_button" />
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/priority_high"
style="@style/priority_button" />
</RadioGroup>
<TextView
android:id="@+id/text"
style="@style/TaskEditTextPrimary"
android:layout_alignParentStart="true"
android:layout_toStartOf="@id/priority_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:gravity="start|center_vertical"
android:text="@string/TEA_importance_label" />
</RelativeLayout>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:alpha="@dimen/alpha_secondary"
android:paddingStart="@dimen/keyline_first"
android:paddingTop="20dp"
android:paddingEnd="@dimen/keyline_second"
android:paddingBottom="20dp"
android:scaleType="center"
app:tint="@color/icon_tint"
tools:ignore="ContentDescription" />
<androidx.compose.ui.platform.ComposeView
android:id="@+id/compose_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Loading…
Cancel
Save