diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 896d2bc07..7d05af792 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ app-android-sdk-target = "34" activity-compose = "1.8.2" android-gradle = "8.2.2" +android-lifecycle-compose = "2.7.0" android-test-runner = "1.5.2" android-test-junit = "1.1.5" compose = "1.6.0-beta01" @@ -42,6 +43,7 @@ activity-compose = { module = "androidx.activity:activity-compose", version.ref androidx-compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "compose-material3" } androidx-datastore = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore" } androidx-emojipicker = { module = "androidx.emoji2:emoji2-emojipicker", version.ref = "emojipicker" } +androidx-lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "android-lifecycle-compose" } androidx-test-runner = { module = "androidx.test:runner", version.ref = "android-test-runner" } androidx-test-junit = { module = "androidx.test.ext:junit", version.ref = "android-test-junit" } androidx-test-junit-ktx = { module = "androidx.test.ext:junit-ktx", version.ref = "android-test-junit" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index bfddba702..180add4fc 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -57,6 +57,7 @@ kotlin { implementation(libs.androidx.compose.material3) implementation(libs.androidx.datastore) implementation(libs.androidx.emojipicker) + implementation(libs.androidx.lifecycle.compose) implementation(libs.koin.android) implementation(libs.ktor.android) implementation(libs.paging.android) diff --git a/shared/src/androidMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt b/shared/src/androidMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt new file mode 100644 index 000000000..a1fa7f515 --- /dev/null +++ b/shared/src/androidMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt @@ -0,0 +1,23 @@ +package com.faltenreich.diaguard.shared.view + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.lifecycle.Lifecycle + +@Composable +actual fun rememberLifecycleState(): LifecycleState { + val state by LocalLifecycleOwner.current.lifecycle.currentStateFlow.collectAsState() + return state.toDomain() +} + +private fun Lifecycle.State.toDomain(): LifecycleState { + return when (this) { + Lifecycle.State.DESTROYED -> LifecycleState.DESTROYED + Lifecycle.State.INITIALIZED -> LifecycleState.INITIALIZED + Lifecycle.State.CREATED -> LifecycleState.CREATED + Lifecycle.State.STARTED -> LifecycleState.STARTED + Lifecycle.State.RESUMED -> LifecycleState.RESUMED + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/log/Log.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/log/Log.kt index f586f6b47..f4c9d4f09 100644 --- a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/log/Log.kt +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/log/Log.kt @@ -26,7 +26,9 @@ import com.faltenreich.diaguard.log.item.LogEntry import com.faltenreich.diaguard.log.item.LogItem import com.faltenreich.diaguard.log.item.LogMonth import com.faltenreich.diaguard.shared.di.inject +import com.faltenreich.diaguard.shared.view.LifecycleState import com.faltenreich.diaguard.shared.view.Skeleton +import com.faltenreich.diaguard.shared.view.rememberLifecycleState import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull @@ -35,7 +37,6 @@ fun Log( modifier: Modifier = Modifier, viewModel: LogViewModel = inject(), ) { - // FIXME: Gets not updated on entry change val state = viewModel.collectState() ?: return val paginationItems = viewModel.pagingData.collectAsLazyPagingItems() val listState = rememberLazyListState() @@ -45,6 +46,14 @@ fun Log( listState.scrollBy(-state.monthHeaderSize.height.toFloat()) } + val lifecycleState = rememberLifecycleState() + LaunchedEffect(lifecycleState) { + if (lifecycleState == LifecycleState.RESUMED) { + // FIXME: Scrolls down, maybe due to wrong refreshKey + paginationItems.refresh() + } + } + LaunchedEffect(state) { snapshotFlow { listState.layoutInfo.visibleItemsInfo diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt new file mode 100644 index 000000000..1f1d115c3 --- /dev/null +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt @@ -0,0 +1,6 @@ +package com.faltenreich.diaguard.shared.view + +import androidx.compose.runtime.Composable + +@Composable +expect fun rememberLifecycleState(): LifecycleState \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleState.kt b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleState.kt new file mode 100644 index 000000000..7d78ef34d --- /dev/null +++ b/shared/src/commonMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleState.kt @@ -0,0 +1,9 @@ +package com.faltenreich.diaguard.shared.view + +enum class LifecycleState { + DESTROYED, + INITIALIZED, + CREATED, + STARTED, + RESUMED, +} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt b/shared/src/iosMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt new file mode 100644 index 000000000..6e70c6bcb --- /dev/null +++ b/shared/src/iosMain/kotlin/com/faltenreich/diaguard/shared/view/LifecycleExtensions.kt @@ -0,0 +1,8 @@ +package com.faltenreich.diaguard.shared.view + +import androidx.compose.runtime.Composable + +@Composable +actual fun rememberLifecycleState(): LifecycleState { + TODO("Not yet implemented") +} \ No newline at end of file