From 01a788bdb667330fac38e73a65d62605f787f756 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 18 Jun 2024 01:58:25 -0500 Subject: [PATCH] Use lifecycle-runtime-compose --- app/build.gradle.kts | 3 +- .../todoroo/astrid/activity/MainActivity.kt | 4 +-- .../astrid/activity/TaskEditFragment.kt | 10 +++--- .../astrid/activity/TaskListFragment.kt | 8 ++--- .../todoroo/astrid/files/FilesControlSet.kt | 6 ++-- .../astrid/repeats/RepeatControlSet.kt | 12 +++---- .../com/todoroo/astrid/tags/TagsControlSet.kt | 4 +-- .../todoroo/astrid/timers/TimerControlSet.kt | 8 ++--- .../todoroo/astrid/ui/ReminderControlSet.kt | 4 +-- .../todoroo/astrid/ui/StartDateControlSet.kt | 10 +++--- .../caldav/CaldavCalendarSettingsActivity.kt | 4 +-- .../tasks/compose/FilterSelectionActivity.kt | 3 +- .../java/org/tasks/compose/FlowHelpers.kt | 36 ------------------- .../java/org/tasks/compose/edit/AlarmRow.kt | 4 +-- .../tasks/compose/pickers/CalendarPicker.kt | 4 +-- .../java/org/tasks/dialogs/PriorityPicker.kt | 6 ++-- .../org/tasks/dialogs/SortSettingsActivity.kt | 10 +++--- .../tasks/repeats/CustomRecurrenceActivity.kt | 4 +-- .../java/org/tasks/ui/CalendarControlSet.kt | 6 ++-- .../java/org/tasks/ui/LocationControlSet.kt | 4 +-- .../java/org/tasks/ui/SubtaskControlSet.kt | 8 ++--- data/build.gradle.kts | 2 +- deps_fdroid.txt | 34 ++++++++++++++++++ deps_googleplay.txt | 34 ++++++++++++++++++ gradle/libs.versions.toml | 7 ++-- 25 files changed, 135 insertions(+), 100 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 75d4389a6..e44a6402c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -182,6 +182,7 @@ dependencies { implementation(libs.androidx.fragment.ktx) implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.room) implementation(libs.androidx.sqlite) @@ -201,7 +202,7 @@ dependencies { debugImplementation(libs.kotlin.reflect) implementation(libs.kotlin.jdk8) - implementation(libs.kotlin.immutable) + implementation(libs.kotlinx.immutable) implementation(libs.kotlinx.serialization) implementation(libs.okhttp) implementation(libs.persistent.cookiejar) diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt index b9a92cefc..859a91b11 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt @@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.core.content.IntentCompat.getParcelableExtra import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -38,7 +39,6 @@ import org.tasks.activities.TagSettingsActivity import org.tasks.analytics.Firebase import org.tasks.billing.Inventory import org.tasks.caldav.BaseCaldavCalendarSettingsActivity -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.drawer.TasksMenu import org.tasks.data.dao.AlarmDao import org.tasks.data.dao.CaldavDao @@ -105,7 +105,7 @@ class MainActivity : AppCompatActivity() { handleIntent() binding.composeView.setContent { - val state = viewModel.state.collectAsStateLifecycleAware().value + val state = viewModel.state.collectAsStateWithLifecycle().value if (state.drawerOpen) { TasksTheme { TasksMenu( diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt index 9c2ddeedc..bd4d43c37 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt @@ -39,6 +39,7 @@ import androidx.core.os.BundleCompat import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import com.google.android.material.appbar.AppBarLayout 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.FilterSelectionActivity.Companion.launch import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.CommentsRow import org.tasks.compose.edit.DescriptionRow import org.tasks.compose.edit.DueDateRow @@ -435,7 +435,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener { @Composable private fun DueDateRow() { - val dueDate = editViewModel.dueDate.collectAsStateLifecycleAware().value + val dueDate = editViewModel.dueDate.collectAsStateWithLifecycle().value DueDateRow( dueDate = if (dueDate == 0L) { null @@ -470,7 +470,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener { @Composable private fun PriorityRow() { PriorityRow( - priority = editViewModel.priority.collectAsStateLifecycleAware().value, + priority = editViewModel.priority.collectAsStateWithLifecycle().value, onChangePriority = { editViewModel.priority.value = it }, desaturate = preferences.desaturateDarkMode, ) @@ -488,7 +488,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener { @Composable private fun ListRow() { - val list = editViewModel.selectedList.collectAsStateLifecycleAware().value + val list = editViewModel.selectedList.collectAsStateWithLifecycle().value ListRow( list = list, colorProvider = { chipProvider.getColor(it) }, @@ -517,7 +517,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener { CommentsRow( comments = userActivityDao .watchComments(editViewModel.task.uuid) - .collectAsStateLifecycleAware(emptyList()) + .collectAsStateWithLifecycle(emptyList()) .value, deleteComment = { lifecycleScope.launch { diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt index 7b42ad937..a8371b515 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt @@ -40,6 +40,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle 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_TASK_ID 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.dao.TaskDao 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.NotificationsDisabledBanner import org.tasks.compose.SubscriptionNagBanner -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.rememberReminderPermissionState import org.tasks.data.TaskContainer import org.tasks.data.dao.CaldavDao @@ -124,7 +122,9 @@ import org.tasks.filters.AstridOrderingFilter import org.tasks.filters.CaldavFilter import org.tasks.filters.Filter import org.tasks.filters.FilterImpl +import org.tasks.filters.GtasksFilter import org.tasks.filters.PlaceFilter +import org.tasks.filters.TagFilter import org.tasks.markdown.MarkdownProvider import org.tasks.preferences.Device import org.tasks.preferences.Preferences @@ -357,7 +357,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL setupMenu(toolbar) binding.banner.setContent { val context = LocalContext.current - val state = listViewModel.state.collectAsStateLifecycleAware().value + val state = listViewModel.state.collectAsStateWithLifecycle().value TasksTheme { val hasRemindersPermission by rememberReminderPermissionState() val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) { diff --git a/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.kt b/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.kt index c6ccb4ec8..dc09c2cb9 100644 --- a/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/files/FilesControlSet.kt @@ -12,16 +12,16 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import org.tasks.R import org.tasks.Strings -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.AttachmentRow -import org.tasks.data.entity.TaskAttachment import org.tasks.data.dao.TaskAttachmentDao +import org.tasks.data.entity.TaskAttachment import org.tasks.dialogs.AddAttachmentDialog import org.tasks.files.FileHelper import org.tasks.preferences.Preferences @@ -50,7 +50,7 @@ class FilesControlSet : TaskEditControlFragment() { setContent { TasksTheme { AttachmentRow( - attachments = viewModel.selectedAttachments.collectAsStateLifecycleAware().value, + attachments = viewModel.selectedAttachments.collectAsStateWithLifecycle().value, openAttachment = { FileHelper.startActionView( requireActivity(), diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt index 80b1f8c0c..8ca1d1cd8 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt @@ -11,18 +11,18 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope -import org.tasks.filters.CaldavFilter -import org.tasks.filters.GtasksFilter import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import net.fortuna.ical4j.model.Recur import net.fortuna.ical4j.model.WeekDay import org.tasks.R -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.RepeatRow -import org.tasks.data.entity.CaldavAccount 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.RecurrenceUtils.newRecur import org.tasks.repeats.RepeatRuleToString @@ -87,10 +87,10 @@ class RepeatControlSet : TaskEditControlFragment() { setContent { TasksTheme { RepeatRow( - recurrence = viewModel.recurrence.collectAsStateLifecycleAware().value?.let { + recurrence = viewModel.recurrence.collectAsStateWithLifecycle().value?.let { repeatRuleToString.toString(it) }, - repeatAfterCompletion = viewModel.repeatAfterCompletion.collectAsStateLifecycleAware().value, + repeatAfterCompletion = viewModel.repeatAfterCompletion.collectAsStateWithLifecycle().value, onClick = { lifecycleScope.launch { val accountType = viewModel.selectedList.value diff --git a/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.kt b/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.kt index 9787f282a..61ffae9b5 100644 --- a/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.kt @@ -5,10 +5,10 @@ import android.content.Intent import android.view.View import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.update import org.tasks.R -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.TagsRow import org.tasks.tags.TagPickerActivity import org.tasks.themes.TasksTheme @@ -31,7 +31,7 @@ class TagsControlSet : TaskEditControlFragment() { setContent { TasksTheme { TagsRow( - tags = viewModel.selectedTags.collectAsStateLifecycleAware().value, + tags = viewModel.selectedTags.collectAsStateWithLifecycle().value, colorProvider = { chipProvider.getColor(it) }, onClick = this@TagsControlSet::onRowClick, onClear = { tag -> diff --git a/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt b/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt index c2c81303a..8e7942edc 100644 --- a/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt @@ -12,13 +12,13 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.compose.ui.platform.ComposeView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import com.todoroo.andlib.utility.DateUtilities import com.todoroo.astrid.ui.TimeDurationControlSet import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.tasks.R -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.TimerRow import org.tasks.data.entity.Task import org.tasks.date.DateTimeUtils @@ -91,9 +91,9 @@ class TimerControlSet : TaskEditControlFragment() { setContent { TasksTheme { TimerRow( - started = viewModel.timerStarted.collectAsStateLifecycleAware().value, - estimated = viewModel.estimatedSeconds.collectAsStateLifecycleAware().value, - elapsed = viewModel.elapsedSeconds.collectAsStateLifecycleAware().value, + started = viewModel.timerStarted.collectAsStateWithLifecycle().value, + estimated = viewModel.estimatedSeconds.collectAsStateWithLifecycle().value, + elapsed = viewModel.elapsedSeconds.collectAsStateWithLifecycle().value, timerClicked = this@TimerControlSet::timerClicked, onClick = this@TimerControlSet::onRowClick, ) diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt index 9bfd01788..b5f09fbd9 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.platform.ComposeView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.rememberPermissionState @@ -21,7 +22,6 @@ import com.todoroo.andlib.utility.AndroidUtilities import dagger.hilt.android.AndroidEntryPoint import org.tasks.R import org.tasks.activities.DateAndTimePickerActivity -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.AlarmRow import org.tasks.compose.rememberReminderPermissionState import org.tasks.data.entity.Alarm @@ -105,7 +105,7 @@ class ReminderControlSet : TaskEditControlFragment() { } AlarmRow( locale = locale, - alarms = viewModel.selectedAlarms.collectAsStateLifecycleAware().value, + alarms = viewModel.selectedAlarms.collectAsStateWithLifecycle().value, hasNotificationPermissions = hasReminderPermissions && (notificationPermissions == null || notificationPermissions.status == PermissionStatus.Granted), fixNotificationPermissions = { diff --git a/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt index 2d5fabe59..b4e1d78cf 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt @@ -7,12 +7,12 @@ import android.os.Bundle import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.viewModels +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities.getTimeString import dagger.hilt.android.AndroidEntryPoint import org.tasks.R -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.StartDateRow import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.dialogs.StartDatePicker @@ -49,13 +49,13 @@ class StartDateControlSet : TaskEditControlFragment() { (parent as ComposeView).apply { setContent { TasksTheme { - val selectedDay = vm.selectedDay.collectAsStateLifecycleAware().value - val selectedTime = vm.selectedTime.collectAsStateLifecycleAware().value + val selectedDay = vm.selectedDay.collectAsStateWithLifecycle().value + val selectedTime = vm.selectedTime.collectAsStateWithLifecycle().value StartDateRow( - startDate = viewModel.startDate.collectAsStateLifecycleAware().value, + startDate = viewModel.startDate.collectAsStateWithLifecycle().value, selectedDay = selectedDay, selectedTime = selectedTime, - hasDueDate = viewModel.dueDate.collectAsStateLifecycleAware().value > 0, + hasDueDate = viewModel.dueDate.collectAsStateWithLifecycle().value > 0, printDate = { DateUtilities.getRelativeDateTime( context, diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt index 0a02da905..e3284f873 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt @@ -10,13 +10,13 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.painterResource import androidx.core.view.isVisible +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.tasks.R import org.tasks.compose.ListSettingsComposables.PrincipalList import org.tasks.compose.ShareInvite.ShareInviteDialog -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.data.PrincipalWithAccess import org.tasks.data.dao.PrincipalDao import org.tasks.data.entity.CaldavAccount @@ -54,7 +54,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() { caldavCalendar?.takeIf { it.id > 0 }?.let { findViewById(R.id.people).setContent { TasksTheme { - val principals = principalDao.getPrincipals(it.id).collectAsStateLifecycleAware(initial = emptyList()).value + val principals = principalDao.getPrincipals(it.id).collectAsStateWithLifecycle(initialValue = emptyList()).value PrincipalList( principals = principals, onRemove = if (canRemovePrincipals) { { onRemove(it) } } else null, diff --git a/app/src/main/java/org/tasks/compose/FilterSelectionActivity.kt b/app/src/main/java/org/tasks/compose/FilterSelectionActivity.kt index 4d6f9c997..288406a80 100644 --- a/app/src/main/java/org/tasks/compose/FilterSelectionActivity.kt +++ b/app/src/main/java/org/tasks/compose/FilterSelectionActivity.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp import androidx.core.content.IntentCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import dagger.hilt.android.AndroidEntryPoint import org.tasks.LocalBroadcastManager @@ -54,7 +55,7 @@ class FilterSelectionActivity : AppCompatActivity() { colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme() ) { val viewModel: FilterPickerViewModel = viewModel() - val state = viewModel.viewState.collectAsStateLifecycleAware().value + val state = viewModel.viewState.collectAsStateWithLifecycle().value BasicAlertDialog( onDismissRequest = { finish() }, modifier = Modifier.padding(vertical = 32.dp) diff --git a/app/src/main/java/org/tasks/compose/FlowHelpers.kt b/app/src/main/java/org/tasks/compose/FlowHelpers.kt index f4fb264c1..fc5f1e6fe 100644 --- a/app/src/main/java/org/tasks/compose/FlowHelpers.kt +++ b/app/src/main/java/org/tasks/compose/FlowHelpers.kt @@ -1,20 +1,9 @@ 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.flow.Flow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flow -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext fun Flow.throttleLatest(period: Long) = flow { conflate().collect { @@ -22,28 +11,3 @@ fun Flow.throttleLatest(period: Long) = flow { delay(period) } } - -// https://proandroiddev.com/how-to-collect-flows-lifecycle-aware-in-jetpack-compose-babd53582d0b - -@Composable -fun rememberFlow( - flow: Flow, - lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current -): Flow { - return remember(key1 = flow, key2 = lifecycleOwner) { flow.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED) } -} - -@Composable -fun Flow.collectAsStateLifecycleAware( - initial: R, - context: CoroutineContext = EmptyCoroutineContext -): State { - val lifecycleAwareFlow = rememberFlow(flow = this) - return lifecycleAwareFlow.collectAsState(initial = initial, context = context) -} - -@Suppress("StateFlowValueCalledInComposition") -@Composable -fun StateFlow.collectAsStateLifecycleAware( - context: CoroutineContext = EmptyCoroutineContext -): State = collectAsStateLifecycleAware(value, context) diff --git a/app/src/main/java/org/tasks/compose/edit/AlarmRow.kt b/app/src/main/java/org/tasks/compose/edit/AlarmRow.kt index 53687ae50..9d5399850 100644 --- a/app/src/main/java/org/tasks/compose/edit/AlarmRow.kt +++ b/app/src/main/java/org/tasks/compose/edit/AlarmRow.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.todoroo.astrid.ui.ReminderControlSetViewModel @@ -28,7 +29,6 @@ import org.tasks.compose.AddReminderDialog import org.tasks.compose.ClearButton import org.tasks.compose.DisabledText import org.tasks.compose.TaskEditRow -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.data.entity.Alarm import org.tasks.reminders.AlarmToString import org.tasks.themes.TasksTheme @@ -51,7 +51,7 @@ fun AlarmRow( TaskEditRow( iconRes = R.drawable.ic_outline_notifications_24px, content = { - val viewState = vm.viewState.collectAsStateLifecycleAware().value + val viewState = vm.viewState.collectAsStateWithLifecycle().value if (hasNotificationPermissions) { Alarms( alarms = alarms, diff --git a/app/src/main/java/org/tasks/compose/pickers/CalendarPicker.kt b/app/src/main/java/org/tasks/compose/pickers/CalendarPicker.kt index 63b09242a..4ec8fea88 100644 --- a/app/src/main/java/org/tasks/compose/pickers/CalendarPicker.kt +++ b/app/src/main/java/org/tasks/compose/pickers/CalendarPicker.kt @@ -17,13 +17,13 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberMultiplePermissionsState import org.tasks.R import org.tasks.calendars.AndroidCalendar import org.tasks.calendars.CalendarPickerViewModel -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.themes.TasksTheme @OptIn(ExperimentalPermissionsApi::class) @@ -43,7 +43,7 @@ fun CalendarPicker( ) if (hasPermissions.allPermissionsGranted) { CalendarPickerList( - calendars = viewModel.viewState.collectAsStateLifecycleAware().value.calendars, + calendars = viewModel.viewState.collectAsStateWithLifecycle().value.calendars, selected = selected, onSelected = onSelected, ) diff --git a/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt b/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt index 14ea5418d..41b977b33 100644 --- a/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt +++ b/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt @@ -5,15 +5,15 @@ import android.os.Bundle import androidx.appcompat.app.AlertDialog import androidx.fragment.app.DialogFragment import androidx.fragment.app.viewModels +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import com.todoroo.astrid.dao.TaskDao -import org.tasks.data.entity.Task import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import org.tasks.R -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.Priority +import org.tasks.data.entity.Task import org.tasks.databinding.DialogDateTimePickerBinding import org.tasks.databinding.DialogPriorityPickerBinding import javax.inject.Inject @@ -47,7 +47,7 @@ class PriorityPicker : DialogFragment() { return requireActivity().let { fragmentActivity -> val inflater = fragmentActivity.layoutInflater 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( EXTRA_DESATURATE) ?: false) } val builder = AlertDialog.Builder(fragmentActivity) diff --git a/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt b/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt index a46083042..643c2e480 100644 --- a/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt +++ b/app/src/main/java/org/tasks/dialogs/SortSettingsActivity.kt @@ -23,9 +23,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll 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.outlined.ArrowDownward 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.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Switch +import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -55,12 +55,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.todoroo.astrid.core.SortHelper import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.tasks.R import org.tasks.compose.SystemBars -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.themes.TasksTheme @AndroidEntryPoint @@ -84,7 +84,7 @@ class SortSettingsActivity : ComponentActivity() { statusBarColor = scrimColor, navigationBarColor = MaterialTheme.colorScheme.surface, ) - val state = viewModel.state.collectAsStateLifecycleAware().value + val state = viewModel.state.collectAsStateWithLifecycle().value val mainSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val scope = rememberCoroutineScope() var showGroupPicker by remember { mutableStateOf(false) } diff --git a/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt b/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt index 5fc3d14f5..98bc27bb7 100644 --- a/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt +++ b/app/src/main/java/org/tasks/repeats/CustomRecurrenceActivity.kt @@ -6,8 +6,8 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.compose.collectAsStateWithLifecycle import dagger.hilt.android.AndroidEntryPoint -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.pickers.CustomRecurrence import org.tasks.themes.TasksTheme @@ -20,7 +20,7 @@ class CustomRecurrenceActivity : FragmentActivity() { setContent { TasksTheme { CustomRecurrence( - state = viewModel.state.collectAsStateLifecycleAware().value, + state = viewModel.state.collectAsStateWithLifecycle().value, save = { setResult(RESULT_OK, Intent().putExtra(EXTRA_RRULE, viewModel.getRecur())) finish() diff --git a/app/src/main/java/org/tasks/ui/CalendarControlSet.kt b/app/src/main/java/org/tasks/ui/CalendarControlSet.kt index f9edc56fc..e83b07676 100644 --- a/app/src/main/java/org/tasks/ui/CalendarControlSet.kt +++ b/app/src/main/java/org/tasks/ui/CalendarControlSet.kt @@ -8,13 +8,13 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast.LENGTH_SHORT import androidx.compose.ui.platform.ComposeView +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.todoroo.astrid.activity.TaskEditFragment import dagger.hilt.android.AndroidEntryPoint import org.tasks.R import org.tasks.Strings.isNullOrEmpty import org.tasks.calendars.CalendarPicker import org.tasks.calendars.CalendarProvider -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.CalendarRow import org.tasks.extensions.Context.toast import org.tasks.preferences.PermissionChecker @@ -47,8 +47,8 @@ class CalendarControlSet : TaskEditControlFragment() { setContent { TasksTheme { CalendarRow( - eventUri = viewModel.eventUri.collectAsStateLifecycleAware().value, - selectedCalendar = viewModel.selectedCalendar.collectAsStateLifecycleAware().value?.let { + eventUri = viewModel.eventUri.collectAsStateWithLifecycle().value, + selectedCalendar = viewModel.selectedCalendar.collectAsStateWithLifecycle().value?.let { calendarProvider.getCalendar(it)?.name }, onClick = { diff --git a/app/src/main/java/org/tasks/ui/LocationControlSet.kt b/app/src/main/java/org/tasks/ui/LocationControlSet.kt index 2236720cd..3cd278873 100644 --- a/app/src/main/java/org/tasks/ui/LocationControlSet.kt +++ b/app/src/main/java/org/tasks/ui/LocationControlSet.kt @@ -8,12 +8,12 @@ import android.view.View import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.core.util.Pair +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberMultiplePermissionsState import dagger.hilt.android.AndroidEntryPoint import org.tasks.R import org.tasks.Strings.isNullOrEmpty -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.LocationRow import org.tasks.data.Location import org.tasks.data.createGeofence @@ -90,7 +90,7 @@ class LocationControlSet : TaskEditControlFragment() { rememberMultiplePermissionsState(permissions = backgroundPermissions()) .allPermissionsGranted LocationRow( - location = viewModel.selectedLocation.collectAsStateLifecycleAware().value, + location = viewModel.selectedLocation.collectAsStateWithLifecycle().value, hasPermissions = hasPermissions, onClick = this@LocationControlSet::onRowClick, openGeofenceOptions = { diff --git a/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt b/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt index bdd37dae6..918d5c889 100644 --- a/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt +++ b/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import com.todoroo.astrid.activity.MainActivityViewModel import com.todoroo.astrid.dao.TaskDao @@ -15,7 +16,6 @@ import com.todoroo.astrid.service.TaskCreator import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.tasks.R -import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.edit.SubtaskRow import org.tasks.data.dao.GoogleTaskDao import org.tasks.data.entity.Task @@ -55,15 +55,15 @@ class SubtaskControlSet : TaskEditControlFragment() { TasksTheme { SubtaskRow( originalFilter = viewModel.originalList, - filter = viewModel.selectedList.collectAsStateLifecycleAware().value, + filter = viewModel.selectedList.collectAsStateWithLifecycle().value, hasParent = viewModel.hasParent, desaturate = preferences.desaturateDarkMode, existingSubtasks = if (viewModel.isNew) { TaskListViewModel.TasksResults.Results(SectionedDataSource()) } 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, completeExistingSubtask = this@SubtaskControlSet::complete, toggleSubtask = this@SubtaskControlSet::toggleSubtask, diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 2aac7b6dd..62840805f 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -68,5 +68,5 @@ android { } dependencies { - add("kspAndroid", libs.androidx.room.compiler) + ksp(libs.androidx.room.compiler) } \ No newline at end of file diff --git a/deps_fdroid.txt b/deps_fdroid.txt index fe142a8f6..48fd2f937 100644 --- a/deps_fdroid.txt +++ b/deps_fdroid.txt @@ -43,6 +43,7 @@ +| | +--- 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-compose: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) @@ -70,6 +71,7 @@ +| +--- 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-compose: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) @@ -101,6 +103,7 @@ +| | +--- 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-compose: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) @@ -120,6 +123,7 @@ +| | | +--- 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-compose: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) @@ -136,6 +140,7 @@ +| | | +--- 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-compose: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) @@ -151,6 +156,7 @@ +| | +--- 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-compose: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) @@ -169,6 +175,7 @@ +| | +--- androidx.lifecycle:lifecycle-livedata-core-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-compose: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) @@ -186,6 +193,7 @@ +| | +--- 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-compose: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-compose:2.8.2 (c) @@ -205,6 +213,7 @@ +| +--- 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-compose: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-compose:2.8.2 (c) @@ -352,6 +361,7 @@ +| | | | | | | | | +--- 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-compose: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) @@ -377,6 +387,7 @@ +| | | | | | | | +--- 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-compose: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) @@ -580,6 +591,7 @@ +| | | +--- 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-compose: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) @@ -728,6 +740,7 @@ +| | +--- androidx.lifecycle:lifecycle-livedata-core-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-compose: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) @@ -844,6 +857,26 @@ +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*) +| \--- androidx.fragment:fragment:1.8.0 (c) ++--- 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.room:room-runtime:2.7.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-process: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-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) diff --git a/deps_googleplay.txt b/deps_googleplay.txt index daeed6ee2..bd3c2f743 100644 --- a/deps_googleplay.txt +++ b/deps_googleplay.txt @@ -44,6 +44,7 @@ +| | +--- 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-compose: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) @@ -71,6 +72,7 @@ +| +--- 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-compose: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) @@ -102,6 +104,7 @@ +| | +--- 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-compose: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) @@ -121,6 +124,7 @@ +| | | +--- 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-compose: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) @@ -137,6 +141,7 @@ +| | | +--- 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-compose: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) @@ -152,6 +157,7 @@ +| | +--- 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-compose: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) @@ -170,6 +176,7 @@ +| | +--- androidx.lifecycle:lifecycle-livedata-core-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-compose: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) @@ -187,6 +194,7 @@ +| | +--- 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-compose: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-compose:2.8.2 (c) @@ -206,6 +214,7 @@ +| +--- 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-compose: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-compose:2.8.2 (c) @@ -275,6 +284,7 @@ +| | | | | | | +--- 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-compose: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) @@ -692,6 +702,7 @@ +| | | | | | | | +--- 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-compose: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) @@ -889,6 +900,7 @@ +| | | +--- 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-compose: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) @@ -973,6 +985,7 @@ +| | +--- androidx.lifecycle:lifecycle-livedata-core-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-compose: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) @@ -1080,6 +1093,26 @@ +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*) +| \--- androidx.fragment:fragment:1.8.0 (c) ++--- 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.room:room-runtime:2.7.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-process: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-service:2.8.2 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.2 (c) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 921460da9..0f4eefc91 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,7 +32,7 @@ jems = "1.33" junit-junit = "4.13.2" junit = "1.1.5" kotlin = "2.0.0" -kotlinx-coroutines-test = "1.8.1" +kotlinx-coroutines = "1.8.1" leakcanary = "2.14" lib-recur = "0.11.4" 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-junit = { module = "androidx.test.ext:junit", version.ref = "junit" } 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-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } 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" } kermit = { module = "co.touchlab:kermit", version = "2.0.4" } 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-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" } leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" } locale = { module = "com.github.twofortyfouram:android-plugin-api-for-locale", version.ref = "locale" }