Refactoring TaskEditControlFragments

pull/3363/head
Alex Baker 9 months ago
parent 2d8df0bb67
commit 840049b206

@ -177,6 +177,7 @@ dependencies {
implementation(libs.dagger.hilt) implementation(libs.dagger.hilt)
ksp(libs.dagger.hilt.compiler) ksp(libs.dagger.hilt.compiler)
ksp(libs.androidx.hilt.compiler) ksp(libs.androidx.hilt.compiler)
implementation(libs.androidx.hilt.navigation)
implementation(libs.androidx.hilt.work) implementation(libs.androidx.hilt.work)
implementation(libs.androidx.datastore) implementation(libs.androidx.datastore)

@ -8,10 +8,9 @@ package com.todoroo.astrid.files
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import androidx.compose.runtime.Composable
import android.view.View import androidx.compose.runtime.LaunchedEffect
import android.view.ViewGroup import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -34,21 +33,17 @@ class FilesControlSet : TaskEditControlFragment() {
@Inject lateinit var taskAttachmentDao: TaskAttachmentDao @Inject lateinit var taskAttachmentDao: TaskAttachmentDao
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
override fun createView(savedInstanceState: Bundle?) { @Composable
val task = viewModel.viewState.value.task override fun Content() {
if (savedInstanceState == null) { val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
if (task.hasTransitory(TaskAttachment.KEY)) { LaunchedEffect(Unit) {
for (uri in (task.getTransitory<ArrayList<Uri>>(TaskAttachment.KEY))!!) { if (viewState.task.hasTransitory(TaskAttachment.KEY)) {
for (uri in (viewState.task.getTransitory<ArrayList<Uri>>(TaskAttachment.KEY))!!) {
newAttachment(uri) newAttachment(uri)
} }
} }
} }
} val context = LocalContext.current
override fun bind(parent: ViewGroup?): View =
(parent as ComposeView).apply {
setContent {
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
AttachmentRow( AttachmentRow(
attachments = viewState.attachments, attachments = viewState.attachments,
openAttachment = { openAttachment = {
@ -69,7 +64,6 @@ class FilesControlSet : TaskEditControlFragment() {
}, },
) )
} }
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == AddAttachmentDialog.REQUEST_CAMERA || requestCode == AddAttachmentDialog.REQUEST_AUDIO) { if (requestCode == AddAttachmentDialog.REQUEST_CAMERA || requestCode == AddAttachmentDialog.REQUEST_AUDIO) {

@ -7,12 +7,9 @@ package com.todoroo.astrid.repeats
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Intent import android.content.Intent
import android.os.Bundle import androidx.compose.runtime.Composable
import android.view.View import androidx.compose.runtime.LaunchedEffect
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import net.fortuna.ical4j.model.Recur import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.WeekDay import net.fortuna.ical4j.model.WeekDay
@ -67,18 +64,13 @@ class RepeatControlSet : TaskEditControlFragment() {
} }
} }
override fun createView(savedInstanceState: Bundle?) { @Composable
lifecycleScope.launchWhenResumed { override fun Content() {
viewModel.dueDate.collect { val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
val dueDate = viewModel.dueDate.collectAsStateWithLifecycle().value
LaunchedEffect(dueDate) {
onDueDateChanged() onDueDateChanged()
} }
}
}
override fun bind(parent: ViewGroup?): View =
(parent as ComposeView).apply {
setContent {
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
RepeatRow( RepeatRow(
recurrence = viewState.task.recurrence?.let { repeatRuleToString.toString(it) }, recurrence = viewState.task.recurrence?.let { repeatRuleToString.toString(it) },
repeatFrom = viewState.task.repeatFrom, repeatFrom = viewState.task.repeatFrom,
@ -88,7 +80,7 @@ class RepeatControlSet : TaskEditControlFragment() {
target = this@RepeatControlSet, target = this@RepeatControlSet,
rc = REQUEST_RECURRENCE, rc = REQUEST_RECURRENCE,
rrule = viewState.task.recurrence, rrule = viewState.task.recurrence,
dueDate = viewModel.dueDate.value, dueDate = dueDate,
accountType = accountType, accountType = accountType,
) )
.show(parentFragmentManager, FRAG_TAG_BASIC_RECURRENCE) .show(parentFragmentManager, FRAG_TAG_BASIC_RECURRENCE)
@ -96,7 +88,6 @@ class RepeatControlSet : TaskEditControlFragment() {
onRepeatFromChanged = { viewModel.setRepeatFrom(it) } onRepeatFromChanged = { viewModel.setRepeatFrom(it) }
) )
} }
}
companion object { companion object {
val TAG = R.string.TEA_ctrl_repeat_pref val TAG = R.string.TEA_ctrl_repeat_pref

@ -2,9 +2,7 @@ package com.todoroo.astrid.tags
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.view.View import androidx.compose.runtime.Composable
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.core.content.IntentCompat import androidx.core.content.IntentCompat
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -22,25 +20,23 @@ import javax.inject.Inject
class TagsControlSet : TaskEditControlFragment() { class TagsControlSet : TaskEditControlFragment() {
@Inject lateinit var chipProvider: ChipProvider @Inject lateinit var chipProvider: ChipProvider
private fun onRowClick() { @Composable
} override fun Content() {
override fun bind(parent: ViewGroup?): View =
(parent as ComposeView).apply {
setContent {
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
TagsRow( TagsRow(
tags = viewState.tags, tags = viewState.tags,
colorProvider = { chipProvider.getColor(it) }, colorProvider = { chipProvider.getColor(it) },
onClick = { onClick = {
val intent = Intent(context, TagPickerActivity::class.java) val intent = Intent(context, TagPickerActivity::class.java)
intent.putParcelableArrayListExtra(TagPickerActivity.EXTRA_SELECTED, ArrayList(viewState.tags)) intent.putParcelableArrayListExtra(
TagPickerActivity.EXTRA_SELECTED,
ArrayList(viewState.tags)
)
startActivityForResult(intent, REQUEST_TAG_PICKER_ACTIVITY) startActivityForResult(intent, REQUEST_TAG_PICKER_ACTIVITY)
}, },
onClear = { viewModel.setTags(viewState.tags.minus(it)) }, onClear = { viewModel.setTags(viewState.tags.minus(it)) },
) )
} }
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_TAG_PICKER_ACTIVITY) { if (requestCode == REQUEST_TAG_PICKER_ACTIVITY) {

@ -6,12 +6,11 @@
package com.todoroo.astrid.timers package com.todoroo.astrid.timers
import android.app.Activity import android.app.Activity
import android.os.Bundle
import android.text.format.DateUtils import android.text.format.DateUtils
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.compose.ui.platform.ComposeView import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.ui.TimeDurationControlSet import com.todoroo.astrid.ui.TimeDurationControlSet
@ -45,14 +44,6 @@ class TimerControlSet : TaskEditControlFragment() {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private lateinit var dialogView: View private lateinit var dialogView: View
override fun createView(savedInstanceState: Bundle?) {
dialogView = activity.layoutInflater.inflate(R.layout.control_set_timers_dialog, null)
estimated = TimeDurationControlSet(activity, dialogView, R.id.estimatedDuration, theme)
elapsed = TimeDurationControlSet(activity, dialogView, R.id.elapsedDuration, theme)
estimated.setTimeDuration(viewModel.estimatedSeconds.value)
elapsed.setTimeDuration(viewModel.elapsedSeconds.value)
}
private fun onRowClick() { private fun onRowClick() {
if (dialog == null) { if (dialog == null) {
dialog = buildDialog() dialog = buildDialog()
@ -86,9 +77,15 @@ class TimerControlSet : TaskEditControlFragment() {
} }
} }
override fun bind(parent: ViewGroup?): View = @Composable
(parent as ComposeView).apply { override fun Content() {
setContent { LaunchedEffect(Unit) {
dialogView = activity.layoutInflater.inflate(R.layout.control_set_timers_dialog, null)
estimated = TimeDurationControlSet(activity, dialogView, R.id.estimatedDuration, theme)
elapsed = TimeDurationControlSet(activity, dialogView, R.id.elapsedDuration, theme)
estimated.setTimeDuration(viewModel.estimatedSeconds.value)
elapsed.setTimeDuration(viewModel.elapsedSeconds.value)
}
TimerRow( TimerRow(
started = viewModel.timerStarted.collectAsStateWithLifecycle().value, started = viewModel.timerStarted.collectAsStateWithLifecycle().value,
estimated = viewModel.estimatedSeconds.collectAsStateWithLifecycle().value, estimated = viewModel.estimatedSeconds.collectAsStateWithLifecycle().value,
@ -97,7 +94,6 @@ class TimerControlSet : TaskEditControlFragment() {
onClick = this@TimerControlSet::onRowClick, onClick = this@TimerControlSet::onRowClick,
) )
} }
}
private fun timerActive() = viewModel.timerStarted.value > 0 private fun timerActive() = viewModel.timerStarted.value > 0

@ -5,15 +5,14 @@ import android.app.Activity
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.PermissionStatus
@ -39,42 +38,24 @@ class ReminderControlSet : TaskEditControlFragment() {
@Inject lateinit var activity: Activity @Inject lateinit var activity: Activity
@Inject lateinit var dialogBuilder: DialogBuilder @Inject lateinit var dialogBuilder: DialogBuilder
private val ringMode = mutableStateOf(0) private val ringMode = mutableIntStateOf(0)
override fun createView(savedInstanceState: Bundle?) {
when {
viewModel.ringNonstop -> setRingMode(2)
viewModel.ringFiveTimes -> setRingMode(1)
else -> setRingMode(0)
}
}
private fun onClickRingType() {
val modes = resources.getStringArray(R.array.reminder_ring_modes)
val ringMode = when {
viewModel.ringNonstop -> 2
viewModel.ringFiveTimes -> 1
else -> 0
}
dialogBuilder
.newDialog()
.setSingleChoiceItems(modes, ringMode) { dialog: DialogInterface, which: Int ->
setRingMode(which)
dialog.dismiss()
}
.show()
}
private fun setRingMode(ringMode: Int) { private fun setRingMode(ringMode: Int) {
viewModel.ringNonstop = ringMode == 2 viewModel.ringNonstop = ringMode == 2
viewModel.ringFiveTimes = ringMode == 1 viewModel.ringFiveTimes = ringMode == 1
this.ringMode.value = ringMode this.ringMode.intValue = ringMode
} }
@OptIn(ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
override fun bind(parent: ViewGroup?): View = @Composable
(parent as ComposeView).apply { override fun Content() {
setContent { LaunchedEffect(Unit) {
when {
viewModel.ringNonstop -> setRingMode(2)
viewModel.ringFiveTimes -> setRingMode(1)
else -> setRingMode(0)
}
}
val ringMode by remember { this@ReminderControlSet.ringMode } val ringMode by remember { this@ReminderControlSet.ringMode }
val hasReminderPermissions by rememberReminderPermissionState() val hasReminderPermissions by rememberReminderPermissionState()
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) { val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {
@ -100,6 +81,7 @@ class ReminderControlSet : TaskEditControlFragment() {
viewModel.addAlarm(Alarm(time = timestamp, type = TYPE_DATE_TIME)) viewModel.addAlarm(Alarm(time = timestamp, type = TYPE_DATE_TIME))
} }
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
val context = LocalContext.current
AlarmRow( AlarmRow(
alarms = viewState.alarms, alarms = viewState.alarms,
hasNotificationPermissions = hasReminderPermissions && hasNotificationPermissions = hasReminderPermissions &&
@ -113,7 +95,21 @@ class ReminderControlSet : TaskEditControlFragment() {
}, },
ringMode = ringMode, ringMode = ringMode,
addAlarm = viewModel::addAlarm, addAlarm = viewModel::addAlarm,
openRingType = this@ReminderControlSet::onClickRingType, openRingType = {
val modes = resources.getStringArray(R.array.reminder_ring_modes)
val selectedIndex = when {
viewModel.ringNonstop -> 2
viewModel.ringFiveTimes -> 1
else -> 0
}
dialogBuilder
.newDialog()
.setSingleChoiceItems(modes, selectedIndex) { dialog: DialogInterface, which: Int ->
setRingMode(which)
dialog.dismiss()
}
.show()
},
deleteAlarm = viewModel::removeAlarm, deleteAlarm = viewModel::removeAlarm,
pickDateAndTime = { replace -> pickDateAndTime = { replace ->
val timestamp = replace?.takeIf { it.type == TYPE_DATE_TIME }?.time val timestamp = replace?.takeIf { it.type == TYPE_DATE_TIME }?.time
@ -126,7 +122,6 @@ class ReminderControlSet : TaskEditControlFragment() {
} }
) )
} }
}
companion object { companion object {
val TAG = R.string.TEA_ctrl_reminders_pref val TAG = R.string.TEA_ctrl_reminders_pref

@ -3,12 +3,10 @@ package com.todoroo.astrid.ui
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import androidx.compose.runtime.Composable
import android.view.ViewGroup import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.tasks.R import org.tasks.R
@ -34,31 +32,23 @@ class StartDateControlSet : TaskEditControlFragment() {
private val vm: StartDateViewModel by viewModels() private val vm: StartDateViewModel by viewModels()
override fun createView(savedInstanceState: Bundle?) { @Composable
if (savedInstanceState == null) { override fun Content() {
LaunchedEffect(Unit) {
vm.init( vm.init(
dueDate = viewModel.dueDate.value, dueDate = viewModel.dueDate.value,
startDate = viewModel.startDate.value, startDate = viewModel.startDate.value,
isNew = viewModel.viewState.value.isNew isNew = viewModel.viewState.value.isNew
) )
} }
lifecycleScope.launchWhenResumed { val dueDate = viewModel.dueDate.collectAsStateWithLifecycle().value
viewModel.dueDate.collect {
applySelected()
}
}
}
override fun bind(parent: ViewGroup?) =
(parent as ComposeView).apply {
setContent {
val selectedDay = vm.selectedDay.collectAsStateWithLifecycle().value val selectedDay = vm.selectedDay.collectAsStateWithLifecycle().value
val selectedTime = vm.selectedTime.collectAsStateWithLifecycle().value val selectedTime = vm.selectedTime.collectAsStateWithLifecycle().value
StartDateRow( StartDateRow(
startDate = viewModel.startDate.collectAsStateWithLifecycle().value, startDate = viewModel.startDate.collectAsStateWithLifecycle().value,
selectedDay = selectedDay, selectedDay = selectedDay,
selectedTime = selectedTime, selectedTime = selectedTime,
hasDueDate = viewModel.dueDate.collectAsStateWithLifecycle().value > 0, hasDueDate = dueDate > 0,
printDate = { printDate = {
runBlocking { runBlocking {
getRelativeDateTime( getRelativeDateTime(
@ -86,6 +76,9 @@ class StartDateControlSet : TaskEditControlFragment() {
} }
} }
) )
LaunchedEffect(dueDate) {
applySelected()
} }
} }

@ -4,11 +4,9 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.provider.CalendarContract import android.provider.CalendarContract
import android.view.View
import android.view.ViewGroup
import android.widget.Toast.LENGTH_SHORT import android.widget.Toast.LENGTH_SHORT
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.todoroo.astrid.activity.TaskEditFragment import com.todoroo.astrid.activity.TaskEditFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -42,9 +40,8 @@ class CalendarControlSet : TaskEditControlFragment() {
} }
} }
override fun bind(parent: ViewGroup?): View = @Composable
(parent as ComposeView).apply { override fun Content() {
setContent {
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
CalendarRow( CalendarRow(
eventUri = viewModel.eventUri.collectAsStateWithLifecycle().value, eventUri = viewModel.eventUri.collectAsStateWithLifecycle().value,
@ -73,7 +70,6 @@ class CalendarControlSet : TaskEditControlFragment() {
} }
) )
} }
}
private fun openCalendarEvent() { private fun openCalendarEvent() {
val cr = activity.contentResolver val cr = activity.contentResolver

@ -4,9 +4,7 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Parcelable import android.os.Parcelable
import android.view.View import androidx.compose.runtime.Composable
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.core.content.IntentCompat import androidx.core.content.IntentCompat
import androidx.core.util.Pair import androidx.core.util.Pair
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
@ -53,9 +51,8 @@ class LocationControlSet : TaskEditControlFragment() {
} }
@OptIn(ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
override fun bind(parent: ViewGroup?): View = @Composable
(parent as ComposeView).apply { override fun Content() {
setContent {
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
val hasPermissions = val hasPermissions =
rememberMultiplePermissionsState(permissions = backgroundPermissions()) rememberMultiplePermissionsState(permissions = backgroundPermissions())
@ -103,7 +100,6 @@ class LocationControlSet : TaskEditControlFragment() {
} }
) )
} }
}
private fun openWebsite() { private fun openWebsite() {
viewModel.viewState.value.location?.let { context?.openUri(it.url) } viewModel.viewState.value.location?.let { context?.openUri(it.url) }

@ -1,12 +1,10 @@
package org.tasks.ui package org.tasks.ui
import android.app.Activity import android.app.Activity
import android.os.Bundle import androidx.compose.runtime.Composable
import android.view.View import androidx.compose.runtime.LaunchedEffect
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.activity.MainActivityViewModel import com.todoroo.astrid.activity.MainActivityViewModel
@ -39,20 +37,17 @@ class SubtaskControlSet : TaskEditControlFragment() {
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
@Inject lateinit var firebase: Firebase @Inject lateinit var firebase: Firebase
private lateinit var listViewModel: TaskListViewModel
private val mainViewModel: MainActivityViewModel by activityViewModels() private val mainViewModel: MainActivityViewModel by activityViewModels()
override fun createView(savedInstanceState: Bundle?) { @Composable
viewModel.viewState.value.task.takeIf { it.id > 0 }?.let { override fun Content() {
listViewModel.setFilter(SubtaskFilter(it.id)) val listViewModel: TaskListViewModel = hiltViewModel()
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
LaunchedEffect(viewState.task) {
if (viewState.task.id > 0) {
listViewModel.setFilter(SubtaskFilter(viewState.task.id))
} }
} }
override fun bind(parent: ViewGroup?): View =
(parent as ComposeView).apply {
listViewModel = ViewModelProvider(requireParentFragment())[TaskListViewModel::class.java]
setContent {
val viewState = viewModel.viewState.collectAsStateWithLifecycle().value
val originalState = viewModel.originalState.collectAsStateWithLifecycle().value val originalState = viewModel.originalState.collectAsStateWithLifecycle().value
SubtaskRow( SubtaskRow(
originalFilter = originalState.list, originalFilter = originalState.list,
@ -87,7 +82,6 @@ class SubtaskControlSet : TaskEditControlFragment() {
deleteSubtask = { viewModel.setSubtasks(viewState.newSubtasks - it) }, deleteSubtask = { viewModel.setSubtasks(viewState.newSubtasks - it) },
) )
} }
}
private fun openSubtask(task: Task) = lifecycleScope.launch { private fun openSubtask(task: Task) = lifecycleScope.launch {
mainViewModel.setTask(task) mainViewModel.setTask(task)

@ -2,11 +2,11 @@ package org.tasks.ui
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.runtime.Composable
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.fragment.compose.content
import androidx.hilt.navigation.compose.hiltViewModel
abstract class TaskEditControlFragment : Fragment() { abstract class TaskEditControlFragment : Fragment() {
lateinit var viewModel: TaskEditViewModel lateinit var viewModel: TaskEditViewModel
@ -15,15 +15,11 @@ abstract class TaskEditControlFragment : Fragment() {
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ) = content {
val composeView = ComposeView(requireActivity()) viewModel = hiltViewModel<TaskEditViewModel>(viewModelStoreOwner = requireParentFragment())
viewModel = ViewModelProvider(requireParentFragment())[TaskEditViewModel::class.java] Content()
bind(composeView)
createView(savedInstanceState)
return composeView
} }
abstract fun bind(parent: ViewGroup?): View @Composable
abstract fun Content()
protected open fun createView(savedInstanceState: Bundle?) {}
} }

@ -591,7 +591,7 @@ class TaskEditViewModel @Inject constructor(
} }
init { init {
viewModelScope.launch { runBlocking {
val attachments = async { val attachments = async {
taskAttachmentDao taskAttachmentDao
.getAttachments(task.id) .getAttachments(task.id)

@ -78,6 +78,7 @@ androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscree
androidx-datastore = { module = "androidx.datastore:datastore-preferences", version = "1.1.2" } androidx-datastore = { module = "androidx.datastore:datastore-preferences", version = "1.1.2" }
androidx-fragment-compose = { module = "androidx.fragment:fragment-compose", version = "1.8.6" } androidx-fragment-compose = { module = "androidx.fragment:fragment-compose", version = "1.8.6" }
androidx-hilt-compiler = { module = "androidx.hilt:hilt-compiler", version.ref = "hilt" } androidx-hilt-compiler = { module = "androidx.hilt:hilt-compiler", version.ref = "hilt" }
androidx-hilt-navigation = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hilt" }
androidx-hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hilt" } androidx-hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hilt" }
androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit" } androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit" }
androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime", version.ref = "lifecycle" } androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime", version.ref = "lifecycle" }

Loading…
Cancel
Save