Convert ListFragment to compose

pull/1917/head
Alex Baker 2 years ago
parent 9832eef2c6
commit 25877f05e2

@ -111,6 +111,8 @@ class ChipProvider @Inject constructor(
fun FilterChip(
filter: Filter,
defaultIcon: Int,
showText: Boolean = this@ChipProvider.showText,
showIcon: Boolean = this@ChipProvider.showIcon,
onClick: (Any) -> Unit,
) {
TasksChip(
@ -182,17 +184,6 @@ class ChipProvider @Inject constructor(
}
}
fun newListChip(filter: Filter, defIcon: Int, onClick: () -> Unit) = newView {
TasksChip(
getIcon(filter.icon, defIcon),
filter.listingTitle,
filter.tint,
showText = true,
showIcon = true,
onClick = onClick,
)
}
fun newTagChip(tag: TagData, onClick: () -> Unit): View {
return newView {
TasksChip(

@ -2,22 +2,24 @@ package org.tasks.ui
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.ViewGroup
import com.google.android.material.chip.ChipGroup
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp
import com.google.accompanist.flowlayout.FlowRow
import com.google.android.material.composethemeadapter.MdcTheme
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.activities.ListPicker
import org.tasks.databinding.ControlSetRemoteListBinding
import javax.inject.Inject
@AndroidEntryPoint
class ListFragment : TaskEditControlFragment() {
private lateinit var chipGroup: ChipGroup
@Inject lateinit var chipProvider: ChipProvider
private lateinit var callback: OnListChanged
@ -31,20 +33,28 @@ class ListFragment : TaskEditControlFragment() {
callback = activity as OnListChanged
}
override fun createView(savedInstanceState: Bundle?) {
refreshView()
}
private fun setSelected(filter: Filter) {
viewModel.selectedList = filter
refreshView()
viewModel.selectedList.value = filter
callback.onListChanged(filter)
}
override fun bind(parent: ViewGroup?) =
ControlSetRemoteListBinding.inflate(layoutInflater, parent, true).let {
chipGroup = it.chipGroup
it.root
(parent?.findViewById(R.id.compose_view) as ComposeView).apply {
setContent {
MdcTheme {
val list = viewModel.selectedList.collectAsState()
val selectedList = list.value ?: return@MdcTheme
FlowRow(modifier = Modifier.padding(vertical = 20.dp)) {
chipProvider.FilterChip(
filter = selectedList,
defaultIcon = R.drawable.ic_list_24px,
showText = true,
showIcon = true,
onClick = { openPicker() }
)
}
}
}
}
override val icon = R.drawable.ic_list_24px
@ -55,8 +65,10 @@ class ListFragment : TaskEditControlFragment() {
override val isClickable = true
override val rootLayout = R.layout.control_set_template_compose
private fun openPicker() =
ListPicker.newListPicker(viewModel.selectedList!!, this, REQUEST_CODE_SELECT_LIST)
ListPicker.newListPicker(viewModel.selectedList.value!!, this, REQUEST_CODE_SELECT_LIST)
.show(parentFragmentManager, FRAG_TAG_GOOGLE_TASK_LIST_SELECTION)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
@ -75,16 +87,6 @@ class ListFragment : TaskEditControlFragment() {
}
}
private fun refreshView() {
chipGroup.removeAllViews()
val chip = chipProvider.newListChip(
viewModel.selectedList!!,
R.drawable.ic_list_24px,
this::openPicker
)
chipGroup.addView(chip)
}
companion object {
const val TAG = R.string.TEA_ctrl_google_task_list
private const val FRAG_TAG_GOOGLE_TASK_LIST_SELECTION = "frag_tag_google_task_list_selection"

@ -88,7 +88,7 @@ class TaskEditViewModel @Inject constructor(
this.task = task
isNew = task.isNew
originalList = list
selectedList = list
selectedList.value = list
originalLocation = location
originalTags = tags.toList()
selectedTags = ArrayList(tags)
@ -237,7 +237,7 @@ class TaskEditViewModel @Inject constructor(
private lateinit var originalList: Filter
var selectedList: Filter? = null
var selectedList = MutableStateFlow(null as Filter?)
var originalLocation: Location? = null
private set(value) {
@ -301,7 +301,7 @@ class TaskEditViewModel @Inject constructor(
} ||
task.elapsedSeconds != elapsedSeconds ||
task.estimatedSeconds != estimatedSeconds ||
originalList != selectedList ||
originalList != selectedList.value ||
originalLocation != selectedLocation ||
originalTags.toHashSet() != selectedTags.toHashSet() ||
newSubtasks.isNotEmpty() ||
@ -341,9 +341,9 @@ class TaskEditViewModel @Inject constructor(
taskDao.createNew(task)
}
if (isNew || originalList != selectedList) {
if (isNew || originalList != selectedList.value) {
task.parent = 0
taskMover.move(listOf(task.id), selectedList!!)
taskMover.move(listOf(task.id), selectedList.value!!)
}
if ((isNew && selectedLocation != null) || originalLocation != selectedLocation) {
@ -379,15 +379,15 @@ class TaskEditViewModel @Inject constructor(
}
taskDao.createNew(subtask)
firebase?.addTask("subtasks")
when (selectedList) {
when (selectedList.value) {
is GtasksFilter -> {
val googleTask = GoogleTask(subtask.id, (selectedList as GtasksFilter).remoteId)
val googleTask = GoogleTask(subtask.id, (selectedList.value as GtasksFilter).remoteId)
googleTask.parent = task.id
googleTask.isMoved = true
googleTaskDao.insertAndShift(googleTask, false)
}
is CaldavFilter -> {
val caldavTask = CaldavTask(subtask.id, (selectedList as CaldavFilter).uuid)
val caldavTask = CaldavTask(subtask.id, (selectedList.value as CaldavFilter).uuid)
subtask.parent = task.id
caldavTask.remoteParent = caldavDao.getRemoteIdForTask(task.id)
taskDao.save(subtask)

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.chip.ChipGroup xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/chip_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:chipSpacingVertical="@dimen/chip_spacing"
app:chipSpacingHorizontal="@dimen/chip_spacing" />
Loading…
Cancel
Save