android: move Pager into a ViewModel

This commit is contained in:
Harsh Shandilya 2021-09-25 18:13:42 +05:30
parent ddd57603bc
commit 8e96225a9d
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
6 changed files with 30 additions and 16 deletions

View file

@ -17,6 +17,7 @@ dependencies {
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose)
implementation(libs.androidx.appcompat) implementation(libs.androidx.appcompat)
implementation(libs.androidx.coreKtx) implementation(libs.androidx.coreKtx)
implementation(libs.androidx.lifecycle.compose)
implementation(libs.androidx.paging.compose) implementation(libs.androidx.paging.compose)
implementation(libs.dagger.hilt.android) implementation(libs.dagger.hilt.android)
implementation(libs.retrofit.moshiConverter) implementation(libs.retrofit.moshiConverter)

View file

@ -4,29 +4,22 @@ import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.paging.Pager
import androidx.paging.PagingConfig
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.msfjarvis.claw.android.paging.LobstersPagingSource
import dev.msfjarvis.claw.android.ui.LobstersApp import dev.msfjarvis.claw.android.ui.LobstersApp
import dev.msfjarvis.claw.api.LobstersApi
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@Inject lateinit var api: LobstersApi
@Inject lateinit var urlLauncher: UrlLauncher @Inject lateinit var urlLauncher: UrlLauncher
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) }
setContent { setContent {
LobstersApp( LobstersApp(
pager, urlLauncher = urlLauncher,
urlLauncher,
) )
} }
} }

View file

@ -15,19 +15,19 @@ import androidx.compose.runtime.SideEffect
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.Pager
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import com.google.accompanist.insets.ProvideWindowInsets import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.insets.statusBarsPadding
import com.google.accompanist.systemuicontroller.rememberSystemUiController 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.theme.LobstersTheme
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
@Composable @Composable
fun LobstersApp( fun LobstersApp(
pager: Pager<Int, LobstersPost>, viewModel: ClawViewModel = viewModel(),
urlLauncher: UrlLauncher, urlLauncher: UrlLauncher,
) { ) {
val systemUiController = rememberSystemUiController() val systemUiController = rememberSystemUiController()
@ -40,7 +40,7 @@ fun LobstersApp(
SideEffect { SideEffect {
systemUiController.setSystemBarsColor(color = systemBarsColor, darkIcons = useDarkIcons) systemUiController.setSystemBarsColor(color = systemBarsColor, darkIcons = useDarkIcons)
} }
val items = pager.flow.collectAsLazyPagingItems() val items = viewModel.pagerFlow.collectAsLazyPagingItems()
Scaffold( Scaffold(
scaffoldState = scaffoldState, scaffoldState = scaffoldState,
topBar = { ClawAppBar(modifier = Modifier.statusBarsPadding()) }, topBar = { ClawAppBar(modifier = Modifier.statusBarsPadding()) },
@ -49,7 +49,7 @@ fun LobstersApp(
if (items.loadState.refresh != LoadState.Loading) { if (items.loadState.refresh != LoadState.Loading) {
NetworkPosts( NetworkPosts(
items = items, items = items,
urlLauncher = urlLauncher, launchUrl = urlLauncher::launch,
modifier = Modifier.padding(top = 16.dp), modifier = Modifier.padding(top = 16.dp),
) )
} else { } else {

View file

@ -15,7 +15,7 @@ import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
@Composable @Composable
fun NetworkPosts( fun NetworkPosts(
items: LazyPagingItems<LobstersPost>, items: LazyPagingItems<LobstersPost>,
urlLauncher: UrlLauncher, launchUrl: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
LazyColumn( LazyColumn(
@ -26,8 +26,8 @@ fun NetworkPosts(
LobstersCard( LobstersCard(
post = item.toDbModel(), post = item.toDbModel(),
isSaved = false, isSaved = false,
viewPost = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) }, viewPost = { launchUrl(item.url.ifEmpty { item.commentsUrl }) },
viewComments = { urlLauncher.launch(item.commentsUrl) }, viewComments = { launchUrl(item.commentsUrl) },
toggleSave = {}, toggleSave = {},
modifier = Modifier.padding(bottom = 16.dp, start = 16.dp, end = 16.dp), modifier = Modifier.padding(bottom = 16.dp, start = 16.dp, end = 16.dp),
) )

View file

@ -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
}

View file

@ -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-appcompat = "androidx.appcompat:appcompat:1.4.0-alpha03"
androidx-browser = "androidx.browser:browser:1.4.0-alpha01" androidx-browser = "androidx.browser:browser:1.4.0-alpha01"
androidx-coreKtx = "androidx.core:core-ktx:1.7.0-beta01" 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" androidx-paging-compose = "androidx.paging:paging-compose:1.0.0-alpha12"
aurora-component = { module = "org.pushing-pixels:aurora-component", version.ref = "aurora" } aurora-component = { module = "org.pushing-pixels:aurora-component", version.ref = "aurora" }