mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 19:57:04 +05:30
android: move Pager into a ViewModel
This commit is contained in:
parent
ddd57603bc
commit
8e96225a9d
6 changed files with 30 additions and 16 deletions
|
@ -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)
|
||||||
|
|
|
@ -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,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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),
|
||||||
)
|
)
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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" }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue