Use lifecycle-runtime-compose

pull/2937/head
Alex Baker 1 year ago
parent 12c7170a0b
commit 01a788bdb6

@ -182,6 +182,7 @@ dependencies {
implementation(libs.androidx.fragment.ktx) implementation(libs.androidx.fragment.ktx)
implementation(libs.androidx.lifecycle.runtime) implementation(libs.androidx.lifecycle.runtime)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.room) implementation(libs.androidx.room)
implementation(libs.androidx.sqlite) implementation(libs.androidx.sqlite)
@ -201,7 +202,7 @@ dependencies {
debugImplementation(libs.kotlin.reflect) debugImplementation(libs.kotlin.reflect)
implementation(libs.kotlin.jdk8) implementation(libs.kotlin.jdk8)
implementation(libs.kotlin.immutable) implementation(libs.kotlinx.immutable)
implementation(libs.kotlinx.serialization) implementation(libs.kotlinx.serialization)
implementation(libs.okhttp) implementation(libs.okhttp)
implementation(libs.persistent.cookiejar) implementation(libs.persistent.cookiejar)

@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.core.content.IntentCompat.getParcelableExtra import androidx.core.content.IntentCompat.getParcelableExtra
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
@ -38,7 +39,6 @@ import org.tasks.activities.TagSettingsActivity
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.drawer.TasksMenu import org.tasks.compose.drawer.TasksMenu
import org.tasks.data.dao.AlarmDao import org.tasks.data.dao.AlarmDao
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
@ -105,7 +105,7 @@ class MainActivity : AppCompatActivity() {
handleIntent() handleIntent()
binding.composeView.setContent { binding.composeView.setContent {
val state = viewModel.state.collectAsStateLifecycleAware().value val state = viewModel.state.collectAsStateWithLifecycle().value
if (state.drawerOpen) { if (state.drawerOpen) {
TasksTheme { TasksTheme {
TasksMenu( TasksMenu(

@ -39,6 +39,7 @@ import androidx.core.os.BundleCompat
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.AppBarLayout.Behavior.DragCallback import com.google.android.material.appbar.AppBarLayout.Behavior.DragCallback
@ -63,7 +64,6 @@ import org.tasks.calendars.CalendarPicker
import org.tasks.compose.BeastModeBanner import org.tasks.compose.BeastModeBanner
import org.tasks.compose.FilterSelectionActivity.Companion.launch import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.CommentsRow import org.tasks.compose.edit.CommentsRow
import org.tasks.compose.edit.DescriptionRow import org.tasks.compose.edit.DescriptionRow
import org.tasks.compose.edit.DueDateRow import org.tasks.compose.edit.DueDateRow
@ -435,7 +435,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
@Composable @Composable
private fun DueDateRow() { private fun DueDateRow() {
val dueDate = editViewModel.dueDate.collectAsStateLifecycleAware().value val dueDate = editViewModel.dueDate.collectAsStateWithLifecycle().value
DueDateRow( DueDateRow(
dueDate = if (dueDate == 0L) { dueDate = if (dueDate == 0L) {
null null
@ -470,7 +470,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
@Composable @Composable
private fun PriorityRow() { private fun PriorityRow() {
PriorityRow( PriorityRow(
priority = editViewModel.priority.collectAsStateLifecycleAware().value, priority = editViewModel.priority.collectAsStateWithLifecycle().value,
onChangePriority = { editViewModel.priority.value = it }, onChangePriority = { editViewModel.priority.value = it },
desaturate = preferences.desaturateDarkMode, desaturate = preferences.desaturateDarkMode,
) )
@ -488,7 +488,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
@Composable @Composable
private fun ListRow() { private fun ListRow() {
val list = editViewModel.selectedList.collectAsStateLifecycleAware().value val list = editViewModel.selectedList.collectAsStateWithLifecycle().value
ListRow( ListRow(
list = list, list = list,
colorProvider = { chipProvider.getColor(it) }, colorProvider = { chipProvider.getColor(it) },
@ -517,7 +517,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
CommentsRow( CommentsRow(
comments = userActivityDao comments = userActivityDao
.watchComments(editViewModel.task.uuid) .watchComments(editViewModel.task.uuid)
.collectAsStateLifecycleAware(emptyList()) .collectAsStateWithLifecycle(emptyList())
.value, .value,
deleteComment = { deleteComment = {
lifecycleScope.launch { lifecycleScope.launch {

@ -40,6 +40,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
@ -61,8 +62,6 @@ import com.todoroo.astrid.adapter.TaskAdapterProvider
import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_OLD_DUE_DATE import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_OLD_DUE_DATE
import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_TASK_ID import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_TASK_ID
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import org.tasks.filters.GtasksFilter
import org.tasks.filters.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.repeats.RepeatTaskHelper import com.todoroo.astrid.repeats.RepeatTaskHelper
@ -94,7 +93,6 @@ import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.compose.NotificationsDisabledBanner import org.tasks.compose.NotificationsDisabledBanner
import org.tasks.compose.SubscriptionNagBanner import org.tasks.compose.SubscriptionNagBanner
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.rememberReminderPermissionState import org.tasks.compose.rememberReminderPermissionState
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
@ -124,7 +122,9 @@ import org.tasks.filters.AstridOrderingFilter
import org.tasks.filters.CaldavFilter import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter import org.tasks.filters.Filter
import org.tasks.filters.FilterImpl import org.tasks.filters.FilterImpl
import org.tasks.filters.GtasksFilter
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter
import org.tasks.filters.TagFilter
import org.tasks.markdown.MarkdownProvider import org.tasks.markdown.MarkdownProvider
import org.tasks.preferences.Device import org.tasks.preferences.Device
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -357,7 +357,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
setupMenu(toolbar) setupMenu(toolbar)
binding.banner.setContent { binding.banner.setContent {
val context = LocalContext.current val context = LocalContext.current
val state = listViewModel.state.collectAsStateLifecycleAware().value val state = listViewModel.state.collectAsStateWithLifecycle().value
TasksTheme { TasksTheme {
val hasRemindersPermission by rememberReminderPermissionState() val hasRemindersPermission by rememberReminderPermissionState()
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) { val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {

@ -12,16 +12,16 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.Strings import org.tasks.Strings
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.AttachmentRow import org.tasks.compose.edit.AttachmentRow
import org.tasks.data.entity.TaskAttachment
import org.tasks.data.dao.TaskAttachmentDao import org.tasks.data.dao.TaskAttachmentDao
import org.tasks.data.entity.TaskAttachment
import org.tasks.dialogs.AddAttachmentDialog import org.tasks.dialogs.AddAttachmentDialog
import org.tasks.files.FileHelper import org.tasks.files.FileHelper
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -50,7 +50,7 @@ class FilesControlSet : TaskEditControlFragment() {
setContent { setContent {
TasksTheme { TasksTheme {
AttachmentRow( AttachmentRow(
attachments = viewModel.selectedAttachments.collectAsStateLifecycleAware().value, attachments = viewModel.selectedAttachments.collectAsStateWithLifecycle().value,
openAttachment = { openAttachment = {
FileHelper.startActionView( FileHelper.startActionView(
requireActivity(), requireActivity(),

@ -11,18 +11,18 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import org.tasks.filters.CaldavFilter
import org.tasks.filters.GtasksFilter
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.fortuna.ical4j.model.Recur import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.WeekDay import net.fortuna.ical4j.model.WeekDay
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.RepeatRow import org.tasks.compose.edit.RepeatRow
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.filters.CaldavFilter
import org.tasks.filters.GtasksFilter
import org.tasks.repeats.BasicRecurrenceDialog import org.tasks.repeats.BasicRecurrenceDialog
import org.tasks.repeats.RecurrenceUtils.newRecur import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.repeats.RepeatRuleToString import org.tasks.repeats.RepeatRuleToString
@ -87,10 +87,10 @@ class RepeatControlSet : TaskEditControlFragment() {
setContent { setContent {
TasksTheme { TasksTheme {
RepeatRow( RepeatRow(
recurrence = viewModel.recurrence.collectAsStateLifecycleAware().value?.let { recurrence = viewModel.recurrence.collectAsStateWithLifecycle().value?.let {
repeatRuleToString.toString(it) repeatRuleToString.toString(it)
}, },
repeatAfterCompletion = viewModel.repeatAfterCompletion.collectAsStateLifecycleAware().value, repeatAfterCompletion = viewModel.repeatAfterCompletion.collectAsStateWithLifecycle().value,
onClick = { onClick = {
lifecycleScope.launch { lifecycleScope.launch {
val accountType = viewModel.selectedList.value val accountType = viewModel.selectedList.value

@ -5,10 +5,10 @@ import android.content.Intent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.TagsRow import org.tasks.compose.edit.TagsRow
import org.tasks.tags.TagPickerActivity import org.tasks.tags.TagPickerActivity
import org.tasks.themes.TasksTheme import org.tasks.themes.TasksTheme
@ -31,7 +31,7 @@ class TagsControlSet : TaskEditControlFragment() {
setContent { setContent {
TasksTheme { TasksTheme {
TagsRow( TagsRow(
tags = viewModel.selectedTags.collectAsStateLifecycleAware().value, tags = viewModel.selectedTags.collectAsStateWithLifecycle().value,
colorProvider = { chipProvider.getColor(it) }, colorProvider = { chipProvider.getColor(it) },
onClick = this@TagsControlSet::onRowClick, onClick = this@TagsControlSet::onRowClick,
onClear = { tag -> onClear = { tag ->

@ -12,13 +12,13 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.ui.TimeDurationControlSet import com.todoroo.astrid.ui.TimeDurationControlSet
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.TimerRow import org.tasks.compose.edit.TimerRow
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import org.tasks.date.DateTimeUtils import org.tasks.date.DateTimeUtils
@ -91,9 +91,9 @@ class TimerControlSet : TaskEditControlFragment() {
setContent { setContent {
TasksTheme { TasksTheme {
TimerRow( TimerRow(
started = viewModel.timerStarted.collectAsStateLifecycleAware().value, started = viewModel.timerStarted.collectAsStateWithLifecycle().value,
estimated = viewModel.estimatedSeconds.collectAsStateLifecycleAware().value, estimated = viewModel.estimatedSeconds.collectAsStateWithLifecycle().value,
elapsed = viewModel.elapsedSeconds.collectAsStateLifecycleAware().value, elapsed = viewModel.elapsedSeconds.collectAsStateWithLifecycle().value,
timerClicked = this@TimerControlSet::timerClicked, timerClicked = this@TimerControlSet::timerClicked,
onClick = this@TimerControlSet::onRowClick, onClick = this@TimerControlSet::onRowClick,
) )

@ -14,6 +14,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
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
import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.rememberPermissionState
@ -21,7 +22,6 @@ import com.todoroo.andlib.utility.AndroidUtilities
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.activities.DateAndTimePickerActivity import org.tasks.activities.DateAndTimePickerActivity
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.AlarmRow import org.tasks.compose.edit.AlarmRow
import org.tasks.compose.rememberReminderPermissionState import org.tasks.compose.rememberReminderPermissionState
import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm
@ -105,7 +105,7 @@ class ReminderControlSet : TaskEditControlFragment() {
} }
AlarmRow( AlarmRow(
locale = locale, locale = locale,
alarms = viewModel.selectedAlarms.collectAsStateLifecycleAware().value, alarms = viewModel.selectedAlarms.collectAsStateWithLifecycle().value,
hasNotificationPermissions = hasReminderPermissions && hasNotificationPermissions = hasReminderPermissions &&
(notificationPermissions == null || notificationPermissions.status == PermissionStatus.Granted), (notificationPermissions == null || notificationPermissions.status == PermissionStatus.Granted),
fixNotificationPermissions = { fixNotificationPermissions = {

@ -7,12 +7,12 @@ import android.os.Bundle
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.andlib.utility.DateUtilities.getTimeString import com.todoroo.andlib.utility.DateUtilities.getTimeString
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.StartDateRow import org.tasks.compose.edit.StartDateRow
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.dialogs.StartDatePicker import org.tasks.dialogs.StartDatePicker
@ -49,13 +49,13 @@ class StartDateControlSet : TaskEditControlFragment() {
(parent as ComposeView).apply { (parent as ComposeView).apply {
setContent { setContent {
TasksTheme { TasksTheme {
val selectedDay = vm.selectedDay.collectAsStateLifecycleAware().value val selectedDay = vm.selectedDay.collectAsStateWithLifecycle().value
val selectedTime = vm.selectedTime.collectAsStateLifecycleAware().value val selectedTime = vm.selectedTime.collectAsStateWithLifecycle().value
StartDateRow( StartDateRow(
startDate = viewModel.startDate.collectAsStateLifecycleAware().value, startDate = viewModel.startDate.collectAsStateWithLifecycle().value,
selectedDay = selectedDay, selectedDay = selectedDay,
selectedTime = selectedTime, selectedTime = selectedTime,
hasDueDate = viewModel.dueDate.collectAsStateLifecycleAware().value > 0, hasDueDate = viewModel.dueDate.collectAsStateWithLifecycle().value > 0,
printDate = { printDate = {
DateUtilities.getRelativeDateTime( DateUtilities.getRelativeDateTime(
context, context,

@ -10,13 +10,13 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.compose.ListSettingsComposables.PrincipalList import org.tasks.compose.ListSettingsComposables.PrincipalList
import org.tasks.compose.ShareInvite.ShareInviteDialog import org.tasks.compose.ShareInvite.ShareInviteDialog
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.PrincipalWithAccess import org.tasks.data.PrincipalWithAccess
import org.tasks.data.dao.PrincipalDao import org.tasks.data.dao.PrincipalDao
import org.tasks.data.entity.CaldavAccount import org.tasks.data.entity.CaldavAccount
@ -54,7 +54,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
caldavCalendar?.takeIf { it.id > 0 }?.let { caldavCalendar?.takeIf { it.id > 0 }?.let {
findViewById<ComposeView>(R.id.people).setContent { findViewById<ComposeView>(R.id.people).setContent {
TasksTheme { TasksTheme {
val principals = principalDao.getPrincipals(it.id).collectAsStateLifecycleAware(initial = emptyList()).value val principals = principalDao.getPrincipals(it.id).collectAsStateWithLifecycle(initialValue = emptyList()).value
PrincipalList( PrincipalList(
principals = principals, principals = principals,
onRemove = if (canRemovePrincipals) { { onRemove(it) } } else null, onRemove = if (canRemovePrincipals) { { onRemove(it) } } else null,

@ -26,6 +26,7 @@ import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.IntentCompat import androidx.core.content.IntentCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
@ -54,7 +55,7 @@ class FilterSelectionActivity : AppCompatActivity() {
colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme() colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
) { ) {
val viewModel: FilterPickerViewModel = viewModel() val viewModel: FilterPickerViewModel = viewModel()
val state = viewModel.viewState.collectAsStateLifecycleAware().value val state = viewModel.viewState.collectAsStateWithLifecycle().value
BasicAlertDialog( BasicAlertDialog(
onDismissRequest = { finish() }, onDismissRequest = { finish() },
modifier = Modifier.padding(vertical = 32.dp) modifier = Modifier.padding(vertical = 32.dp)

@ -1,20 +1,9 @@
package org.tasks.compose package org.tasks.compose
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.flowWithLifecycle
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
fun <T> Flow<T>.throttleLatest(period: Long) = flow { fun <T> Flow<T>.throttleLatest(period: Long) = flow {
conflate().collect { conflate().collect {
@ -22,28 +11,3 @@ fun <T> Flow<T>.throttleLatest(period: Long) = flow {
delay(period) delay(period)
} }
} }
// https://proandroiddev.com/how-to-collect-flows-lifecycle-aware-in-jetpack-compose-babd53582d0b
@Composable
fun <T> rememberFlow(
flow: Flow<T>,
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
): Flow<T> {
return remember(key1 = flow, key2 = lifecycleOwner) { flow.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED) }
}
@Composable
fun <T : R, R> Flow<T>.collectAsStateLifecycleAware(
initial: R,
context: CoroutineContext = EmptyCoroutineContext
): State<R> {
val lifecycleAwareFlow = rememberFlow(flow = this)
return lifecycleAwareFlow.collectAsState(initial = initial, context = context)
}
@Suppress("StateFlowValueCalledInComposition")
@Composable
fun <T> StateFlow<T>.collectAsStateLifecycleAware(
context: CoroutineContext = EmptyCoroutineContext
): State<T> = collectAsStateLifecycleAware(value, context)

@ -19,6 +19,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.todoroo.astrid.ui.ReminderControlSetViewModel import com.todoroo.astrid.ui.ReminderControlSetViewModel
@ -28,7 +29,6 @@ import org.tasks.compose.AddReminderDialog
import org.tasks.compose.ClearButton import org.tasks.compose.ClearButton
import org.tasks.compose.DisabledText import org.tasks.compose.DisabledText
import org.tasks.compose.TaskEditRow import org.tasks.compose.TaskEditRow
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm
import org.tasks.reminders.AlarmToString import org.tasks.reminders.AlarmToString
import org.tasks.themes.TasksTheme import org.tasks.themes.TasksTheme
@ -51,7 +51,7 @@ fun AlarmRow(
TaskEditRow( TaskEditRow(
iconRes = R.drawable.ic_outline_notifications_24px, iconRes = R.drawable.ic_outline_notifications_24px,
content = { content = {
val viewState = vm.viewState.collectAsStateLifecycleAware().value val viewState = vm.viewState.collectAsStateWithLifecycle().value
if (hasNotificationPermissions) { if (hasNotificationPermissions) {
Alarms( Alarms(
alarms = alarms, alarms = alarms,

@ -17,13 +17,13 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState import com.google.accompanist.permissions.rememberMultiplePermissionsState
import org.tasks.R import org.tasks.R
import org.tasks.calendars.AndroidCalendar import org.tasks.calendars.AndroidCalendar
import org.tasks.calendars.CalendarPickerViewModel import org.tasks.calendars.CalendarPickerViewModel
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.themes.TasksTheme import org.tasks.themes.TasksTheme
@OptIn(ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
@ -43,7 +43,7 @@ fun CalendarPicker(
) )
if (hasPermissions.allPermissionsGranted) { if (hasPermissions.allPermissionsGranted) {
CalendarPickerList( CalendarPickerList(
calendars = viewModel.viewState.collectAsStateLifecycleAware().value.calendars, calendars = viewModel.viewState.collectAsStateWithLifecycle().value.calendars,
selected = selected, selected = selected,
onSelected = onSelected, onSelected = onSelected,
) )

@ -5,15 +5,15 @@ import android.os.Bundle
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import org.tasks.data.entity.Task
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.Priority import org.tasks.compose.edit.Priority
import org.tasks.data.entity.Task
import org.tasks.databinding.DialogDateTimePickerBinding import org.tasks.databinding.DialogDateTimePickerBinding
import org.tasks.databinding.DialogPriorityPickerBinding import org.tasks.databinding.DialogPriorityPickerBinding
import javax.inject.Inject import javax.inject.Inject
@ -47,7 +47,7 @@ class PriorityPicker : DialogFragment() {
return requireActivity().let { fragmentActivity -> return requireActivity().let { fragmentActivity ->
val inflater = fragmentActivity.layoutInflater val inflater = fragmentActivity.layoutInflater
val binding = DialogPriorityPickerBinding.inflate(inflater, null, false) val binding = DialogPriorityPickerBinding.inflate(inflater, null, false)
binding.priorityRow.setContent { Priority(selected = priorityPickerViewModel.priority.collectAsStateLifecycleAware().value, binding.priorityRow.setContent { Priority(selected = priorityPickerViewModel.priority.collectAsStateWithLifecycle().value,
onClick = { priorityPickerViewModel.setPriority( it ) }, desaturate = savedInstanceState?.getBoolean( onClick = { priorityPickerViewModel.setPriority( it ) }, desaturate = savedInstanceState?.getBoolean(
EXTRA_DESATURATE) ?: false) } EXTRA_DESATURATE) ?: false) }
val builder = AlertDialog.Builder(fragmentActivity) val builder = AlertDialog.Builder(fragmentActivity)

@ -23,9 +23,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ContentAlpha import androidx.compose.material.ContentAlpha
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowDownward import androidx.compose.material.icons.outlined.ArrowDownward
import androidx.compose.material.icons.outlined.ArrowUpward import androidx.compose.material.icons.outlined.ArrowUpward
@ -34,8 +31,11 @@ import androidx.compose.material.icons.outlined.SubdirectoryArrowRight
import androidx.compose.material.icons.outlined.SwapVert import androidx.compose.material.icons.outlined.SwapVert
import androidx.compose.material3.Divider import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -55,12 +55,12 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.todoroo.astrid.core.SortHelper import com.todoroo.astrid.core.SortHelper
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.compose.SystemBars import org.tasks.compose.SystemBars
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.themes.TasksTheme import org.tasks.themes.TasksTheme
@AndroidEntryPoint @AndroidEntryPoint
@ -84,7 +84,7 @@ class SortSettingsActivity : ComponentActivity() {
statusBarColor = scrimColor, statusBarColor = scrimColor,
navigationBarColor = MaterialTheme.colorScheme.surface, navigationBarColor = MaterialTheme.colorScheme.surface,
) )
val state = viewModel.state.collectAsStateLifecycleAware().value val state = viewModel.state.collectAsStateWithLifecycle().value
val mainSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val mainSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
var showGroupPicker by remember { mutableStateOf(false) } var showGroupPicker by remember { mutableStateOf(false) }

@ -6,8 +6,8 @@ import android.os.Bundle
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.pickers.CustomRecurrence import org.tasks.compose.pickers.CustomRecurrence
import org.tasks.themes.TasksTheme import org.tasks.themes.TasksTheme
@ -20,7 +20,7 @@ class CustomRecurrenceActivity : FragmentActivity() {
setContent { setContent {
TasksTheme { TasksTheme {
CustomRecurrence( CustomRecurrence(
state = viewModel.state.collectAsStateLifecycleAware().value, state = viewModel.state.collectAsStateWithLifecycle().value,
save = { save = {
setResult(RESULT_OK, Intent().putExtra(EXTRA_RRULE, viewModel.getRecur())) setResult(RESULT_OK, Intent().putExtra(EXTRA_RRULE, viewModel.getRecur()))
finish() finish()

@ -8,13 +8,13 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast.LENGTH_SHORT import android.widget.Toast.LENGTH_SHORT
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
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
import org.tasks.R import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.calendars.CalendarPicker import org.tasks.calendars.CalendarPicker
import org.tasks.calendars.CalendarProvider import org.tasks.calendars.CalendarProvider
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.CalendarRow import org.tasks.compose.edit.CalendarRow
import org.tasks.extensions.Context.toast import org.tasks.extensions.Context.toast
import org.tasks.preferences.PermissionChecker import org.tasks.preferences.PermissionChecker
@ -47,8 +47,8 @@ class CalendarControlSet : TaskEditControlFragment() {
setContent { setContent {
TasksTheme { TasksTheme {
CalendarRow( CalendarRow(
eventUri = viewModel.eventUri.collectAsStateLifecycleAware().value, eventUri = viewModel.eventUri.collectAsStateWithLifecycle().value,
selectedCalendar = viewModel.selectedCalendar.collectAsStateLifecycleAware().value?.let { selectedCalendar = viewModel.selectedCalendar.collectAsStateWithLifecycle().value?.let {
calendarProvider.getCalendar(it)?.name calendarProvider.getCalendar(it)?.name
}, },
onClick = { onClick = {

@ -8,12 +8,12 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.core.util.Pair import androidx.core.util.Pair
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState import com.google.accompanist.permissions.rememberMultiplePermissionsState
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.LocationRow import org.tasks.compose.edit.LocationRow
import org.tasks.data.Location import org.tasks.data.Location
import org.tasks.data.createGeofence import org.tasks.data.createGeofence
@ -90,7 +90,7 @@ class LocationControlSet : TaskEditControlFragment() {
rememberMultiplePermissionsState(permissions = backgroundPermissions()) rememberMultiplePermissionsState(permissions = backgroundPermissions())
.allPermissionsGranted .allPermissionsGranted
LocationRow( LocationRow(
location = viewModel.selectedLocation.collectAsStateLifecycleAware().value, location = viewModel.selectedLocation.collectAsStateWithLifecycle().value,
hasPermissions = hasPermissions, hasPermissions = hasPermissions,
onClick = this@LocationControlSet::onRowClick, onClick = this@LocationControlSet::onRowClick,
openGeofenceOptions = { openGeofenceOptions = {

@ -7,6 +7,7 @@ import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
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
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
@ -15,7 +16,6 @@ import com.todoroo.astrid.service.TaskCreator
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.SubtaskRow import org.tasks.compose.edit.SubtaskRow
import org.tasks.data.dao.GoogleTaskDao import org.tasks.data.dao.GoogleTaskDao
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
@ -55,15 +55,15 @@ class SubtaskControlSet : TaskEditControlFragment() {
TasksTheme { TasksTheme {
SubtaskRow( SubtaskRow(
originalFilter = viewModel.originalList, originalFilter = viewModel.originalList,
filter = viewModel.selectedList.collectAsStateLifecycleAware().value, filter = viewModel.selectedList.collectAsStateWithLifecycle().value,
hasParent = viewModel.hasParent, hasParent = viewModel.hasParent,
desaturate = preferences.desaturateDarkMode, desaturate = preferences.desaturateDarkMode,
existingSubtasks = if (viewModel.isNew) { existingSubtasks = if (viewModel.isNew) {
TaskListViewModel.TasksResults.Results(SectionedDataSource()) TaskListViewModel.TasksResults.Results(SectionedDataSource())
} else { } else {
listViewModel.state.collectAsStateLifecycleAware().value.tasks listViewModel.state.collectAsStateWithLifecycle().value.tasks
}, },
newSubtasks = viewModel.newSubtasks.collectAsStateLifecycleAware().value, newSubtasks = viewModel.newSubtasks.collectAsStateWithLifecycle().value,
openSubtask = this@SubtaskControlSet::openSubtask, openSubtask = this@SubtaskControlSet::openSubtask,
completeExistingSubtask = this@SubtaskControlSet::complete, completeExistingSubtask = this@SubtaskControlSet::complete,
toggleSubtask = this@SubtaskControlSet::toggleSubtask, toggleSubtask = this@SubtaskControlSet::toggleSubtask,

@ -68,5 +68,5 @@ android {
} }
dependencies { dependencies {
add("kspAndroid", libs.androidx.room.compiler) ksp(libs.androidx.room.compiler)
} }

@ -43,6 +43,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -70,6 +71,7 @@
+| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -101,6 +103,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
@ -120,6 +123,7 @@
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -136,6 +140,7 @@
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -151,6 +156,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -169,6 +175,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -186,6 +193,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
@ -205,6 +213,7 @@
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
@ -352,6 +361,7 @@
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -377,6 +387,7 @@
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -580,6 +591,7 @@
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -728,6 +740,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -844,6 +857,26 @@
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| \--- androidx.fragment:fragment:1.8.0 (c) +| \--- androidx.fragment:fragment:1.8.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:2.8.2 (*) ++--- androidx.lifecycle:lifecycle-runtime:2.8.2 (*)
++--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2
+| \--- androidx.lifecycle:lifecycle-runtime-compose-android:2.8.2
+| +--- androidx.annotation:annotation:1.8.0 (*)
+| +--- androidx.compose.runtime:runtime:1.6.5 -> 1.6.8 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (*)
+| +--- androidx.lifecycle:lifecycle-common:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.2 (c)
+| \--- androidx.lifecycle:lifecycle-common-java8:2.8.2 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (*) ++--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (*)
++--- androidx.room:room-runtime:2.7.0-alpha04 (*) ++--- androidx.room:room-runtime:2.7.0-alpha04 (*)
++--- androidx.sqlite:sqlite-bundled:2.5.0-alpha04 ++--- androidx.sqlite:sqlite-bundled:2.5.0-alpha04
@ -1057,6 +1090,7 @@
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)

@ -44,6 +44,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -71,6 +72,7 @@
+| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -102,6 +104,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
@ -121,6 +124,7 @@
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -137,6 +141,7 @@
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -152,6 +157,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -170,6 +176,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -187,6 +194,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
@ -206,6 +214,7 @@
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
@ -275,6 +284,7 @@
+| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -692,6 +702,7 @@
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -889,6 +900,7 @@
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -973,6 +985,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
@ -1080,6 +1093,26 @@
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| \--- androidx.fragment:fragment:1.8.0 (c) +| \--- androidx.fragment:fragment:1.8.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:2.8.2 (*) ++--- androidx.lifecycle:lifecycle-runtime:2.8.2 (*)
++--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2
+| \--- androidx.lifecycle:lifecycle-runtime-compose-android:2.8.2
+| +--- androidx.annotation:annotation:1.8.0 (*)
+| +--- androidx.compose.runtime:runtime:1.6.5 -> 1.6.8 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (*)
+| +--- androidx.lifecycle:lifecycle-common:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.2 (c)
+| \--- androidx.lifecycle:lifecycle-common-java8:2.8.2 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (*) ++--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (*)
++--- androidx.room:room-runtime:2.7.0-alpha04 (*) ++--- androidx.room:room-runtime:2.7.0-alpha04 (*)
++--- androidx.sqlite:sqlite-bundled:2.5.0-alpha04 ++--- androidx.sqlite:sqlite-bundled:2.5.0-alpha04
@ -1291,6 +1324,7 @@
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.2 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c)

@ -32,7 +32,7 @@ jems = "1.33"
junit-junit = "4.13.2" junit-junit = "4.13.2"
junit = "1.1.5" junit = "1.1.5"
kotlin = "2.0.0" kotlin = "2.0.0"
kotlinx-coroutines-test = "1.8.1" kotlinx-coroutines = "1.8.1"
leakcanary = "2.14" leakcanary = "2.14"
lib-recur = "0.11.4" lib-recur = "0.11.4"
lifecycle = "2.8.2" lifecycle = "2.8.2"
@ -77,6 +77,7 @@ androidx-hilt-compiler = { module = "androidx.hilt:hilt-compiler", version.ref =
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" }
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel", version.ref = "lifecycle" } androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" }
androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" } androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" }
@ -123,10 +124,10 @@ jchronic = { module = "com.rubiconproject.oss:jchronic", version.ref = "jchronic
junit = { module = "junit:junit", version.ref = "junit-junit" } junit = { module = "junit:junit", version.ref = "junit-junit" }
kermit = { module = "co.touchlab:kermit", version = "2.0.4" } kermit = { module = "co.touchlab:kermit", version = "2.0.4" }
kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
kotlin-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version = "0.3.7" }
kotlin-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlin-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" }
kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines-test" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" }
kotlinx-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version = "0.3.7" }
kotlinx-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version = "1.7.0" } kotlinx-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version = "1.7.0" }
leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" } leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" }
locale = { module = "com.github.twofortyfouram:android-plugin-api-for-locale", version.ref = "locale" } locale = { module = "com.github.twofortyfouram:android-plugin-api-for-locale", version.ref = "locale" }

Loading…
Cancel
Save