diff --git a/android/build.gradle.kts b/android/build.gradle.kts index c5faf066..3a644d7e 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation(libs.androidx.activity.compose) implementation(libs.androidx.appcompat) implementation(libs.androidx.coreKtx) + implementation(libs.androidx.lifecycle.compose) implementation(libs.androidx.paging.compose) implementation(libs.dagger.hilt.android) implementation(libs.retrofit.moshiConverter) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt index 89e80a80..217321b8 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt @@ -4,29 +4,22 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.core.view.WindowCompat -import androidx.paging.Pager -import androidx.paging.PagingConfig import dagger.hilt.android.AndroidEntryPoint -import dev.msfjarvis.claw.android.paging.LobstersPagingSource import dev.msfjarvis.claw.android.ui.LobstersApp -import dev.msfjarvis.claw.api.LobstersApi import dev.msfjarvis.claw.common.urllauncher.UrlLauncher import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { - @Inject lateinit var api: LobstersApi @Inject lateinit var urlLauncher: UrlLauncher override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) - val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) } setContent { LobstersApp( - pager, - urlLauncher, + urlLauncher = urlLauncher, ) } } 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 3a156a18..3671bb74 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 @@ -15,19 +15,19 @@ 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 import androidx.paging.LoadState -import androidx.paging.Pager import androidx.paging.compose.collectAsLazyPagingItems import com.google.accompanist.insets.ProvideWindowInsets import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.systemuicontroller.rememberSystemUiController -import dev.msfjarvis.claw.api.model.LobstersPost +import dev.msfjarvis.claw.android.viewmodel.ClawViewModel import dev.msfjarvis.claw.common.theme.LobstersTheme import dev.msfjarvis.claw.common.urllauncher.UrlLauncher @Composable fun LobstersApp( - pager: Pager, + viewModel: ClawViewModel = viewModel(), urlLauncher: UrlLauncher, ) { val systemUiController = rememberSystemUiController() @@ -40,7 +40,7 @@ fun LobstersApp( SideEffect { systemUiController.setSystemBarsColor(color = systemBarsColor, darkIcons = useDarkIcons) } - val items = pager.flow.collectAsLazyPagingItems() + val items = viewModel.pagerFlow.collectAsLazyPagingItems() Scaffold( scaffoldState = scaffoldState, topBar = { ClawAppBar(modifier = Modifier.statusBarsPadding()) }, @@ -49,7 +49,7 @@ fun LobstersApp( if (items.loadState.refresh != LoadState.Loading) { NetworkPosts( items = items, - urlLauncher = urlLauncher, + launchUrl = urlLauncher::launch, modifier = Modifier.padding(top = 16.dp), ) } else { 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 580c3182..a89cdd0e 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 @@ -15,7 +15,7 @@ import dev.msfjarvis.claw.common.urllauncher.UrlLauncher @Composable fun NetworkPosts( items: LazyPagingItems, - urlLauncher: UrlLauncher, + launchUrl: (String) -> Unit, modifier: Modifier = Modifier, ) { LazyColumn( @@ -26,8 +26,8 @@ fun NetworkPosts( LobstersCard( post = item.toDbModel(), isSaved = false, - viewPost = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) }, - viewComments = { urlLauncher.launch(item.commentsUrl) }, + viewPost = { launchUrl(item.url.ifEmpty { item.commentsUrl }) }, + viewComments = { launchUrl(item.commentsUrl) }, toggleSave = {}, modifier = Modifier.padding(bottom = 16.dp, start = 16.dp, end = 16.dp), ) 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 new file mode 100644 index 00000000..3f2072db --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -0,0 +1,19 @@ +package dev.msfjarvis.claw.android.viewmodel + +import androidx.lifecycle.ViewModel +import androidx.paging.Pager +import androidx.paging.PagingConfig +import dagger.hilt.android.lifecycle.HiltViewModel +import dev.msfjarvis.claw.android.paging.LobstersPagingSource +import dev.msfjarvis.claw.api.LobstersApi +import javax.inject.Inject + +@HiltViewModel +class ClawViewModel @Inject constructor( + api: LobstersApi, +) : ViewModel() { + private val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) } + + val pagerFlow + get() = pager.flow +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cff21797..be665b98 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,6 +20,7 @@ androidx-activity-compose = "androidx.activity:activity-compose:1.4.0-alpha02" androidx-appcompat = "androidx.appcompat:appcompat:1.4.0-alpha03" androidx-browser = "androidx.browser:browser:1.4.0-alpha01" androidx-coreKtx = "androidx.core:core-ktx:1.7.0-beta01" +androidx-lifecycle-compose = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07" androidx-paging-compose = "androidx.paging:paging-compose:1.0.0-alpha12" aurora-component = { module = "org.pushing-pixels:aurora-component", version.ref = "aurora" }