From 3b2367273be3937ddc096d25c2dd7dc573a9c35b Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 25 Sep 2021 18:36:30 +0530 Subject: [PATCH] android: add swipe refresh --- android/build.gradle.kts | 1 + .../msfjarvis/claw/android/ui/LobstersApp.kt | 30 +++++++++---------- .../msfjarvis/claw/android/ui/NetworkPosts.kt | 1 - .../claw/android/viewmodel/ClawViewModel.kt | 14 +++++++-- gradle/libs.versions.toml | 1 + 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 3a644d7e..1c0db52d 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { implementation(projects.api) implementation(projects.common) implementation(libs.accompanist.insets) + implementation(libs.accompanist.swiperefresh) implementation(libs.accompanist.sysuicontroller) implementation(libs.androidx.activity.compose) implementation(libs.androidx.appcompat) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 3671bb74..b60c7680 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -4,15 +4,12 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.primarySurface import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel @@ -20,6 +17,8 @@ import androidx.paging.LoadState import androidx.paging.compose.collectAsLazyPagingItems import com.google.accompanist.insets.ProvideWindowInsets import com.google.accompanist.insets.statusBarsPadding +import com.google.accompanist.swiperefresh.SwipeRefresh +import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.google.accompanist.systemuicontroller.rememberSystemUiController import dev.msfjarvis.claw.android.viewmodel.ClawViewModel import dev.msfjarvis.claw.common.theme.LobstersTheme @@ -46,19 +45,18 @@ fun LobstersApp( topBar = { ClawAppBar(modifier = Modifier.statusBarsPadding()) }, modifier = Modifier, ) { - if (items.loadState.refresh != LoadState.Loading) { - NetworkPosts( - items = items, - launchUrl = urlLauncher::launch, - modifier = Modifier.padding(top = 16.dp), - ) - } else { - Box( - modifier = Modifier.fillMaxSize(), - ) { - CircularProgressIndicator( - modifier = Modifier.size(64.dp).align(Alignment.Center), - color = MaterialTheme.colors.secondary, + val isRefreshing = items.loadState.refresh == LoadState.Loading + SwipeRefresh( + state = rememberSwipeRefreshState(isRefreshing), + onRefresh = viewModel::reloadPosts, + ) { + if (items.itemCount == 0) { + Box(modifier = Modifier.fillMaxSize()) + } else { + NetworkPosts( + items = items, + launchUrl = urlLauncher::launch, + modifier = Modifier.padding(top = 16.dp), ) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt index a89cdd0e..d3e28af4 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt @@ -10,7 +10,6 @@ import androidx.paging.compose.items import dev.msfjarvis.claw.android.ext.toDbModel import dev.msfjarvis.claw.api.model.LobstersPost import dev.msfjarvis.claw.common.posts.LobstersCard -import dev.msfjarvis.claw.common.urllauncher.UrlLauncher @Composable fun NetworkPosts( diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index 3f2072db..9de12d20 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -9,11 +9,21 @@ import dev.msfjarvis.claw.api.LobstersApi import javax.inject.Inject @HiltViewModel -class ClawViewModel @Inject constructor( +class ClawViewModel +@Inject +constructor( api: LobstersApi, ) : ViewModel() { - private val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) } + var lastPagingSource: LobstersPagingSource? = null + private val pager = + Pager(PagingConfig(20)) { + LobstersPagingSource(api::getHottestPosts).also { lastPagingSource = it } + } val pagerFlow get() = pager.flow + + fun reloadPosts() { + lastPagingSource?.invalidate() + } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index be665b98..61bbb2bc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,7 @@ kotlin-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-co kotlin-coroutines-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "coroutines" } accompanist-insets = { module = "com.google.accompanist:accompanist-insets", version.ref = "accompanist" } +accompanist-swiperefresh = { module = "com.google.accompanist:accompanist-swiperefresh", version.ref = "accompanist" } accompanist-sysuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" } androidx-activity-compose = "androidx.activity:activity-compose:1.4.0-alpha02"