android: integrate with Paging

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2021-06-08 00:45:39 +05:30
parent 3cae306c0c
commit 010983ccba
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
3 changed files with 66 additions and 8 deletions

View file

@ -4,21 +4,31 @@ import android.os.Bundle
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import dev.msfjarvis.claw.common.posts.LobstersItem import androidx.paging.Pager
import dev.msfjarvis.claw.common.posts.TEST_POST import androidx.paging.PagingConfig
import androidx.paging.compose.collectAsLazyPagingItems
import dagger.hilt.android.AndroidEntryPoint
import dev.msfjarvis.claw.android.paging.LobstersPagingSource
import dev.msfjarvis.claw.android.ui.NetworkPosts
import dev.msfjarvis.claw.api.LobstersApi
import dev.msfjarvis.claw.common.theme.LobstersTheme import dev.msfjarvis.claw.common.theme.LobstersTheme
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@Inject lateinit var api: LobstersApi
@Inject lateinit var urlLauncher: UrlLauncher
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) }
setContent { setContent {
LobstersTheme(darkTheme = isSystemInDarkTheme()) { LobstersTheme(darkTheme = isSystemInDarkTheme()) {
LobstersItem( val items = pager.flow.collectAsLazyPagingItems()
post = TEST_POST, NetworkPosts(
isSaved = false, items = items,
{}, urlLauncher = urlLauncher,
{},
{},
) )
} }
} }

View file

@ -0,0 +1,18 @@
package dev.msfjarvis.claw.android.ext
import dev.msfjarvis.claw.api.model.LobstersPost
import dev.msfjarvis.claw.database.local.SavedPost
/** Convert a [LobstersPost] object returned by the API into a [SavedPost] for persistence. */
fun LobstersPost.toDbModel(): SavedPost {
return SavedPost(
shortId = shortId,
title = title,
url = url,
createdAt = createdAt,
commentsUrl = commentsUrl,
submitterName = submitter.username,
submitterAvatarUrl = submitter.avatarUrl,
tags = tags,
)
}

View file

@ -0,0 +1,30 @@
package dev.msfjarvis.claw.android.ui
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.paging.compose.LazyPagingItems
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.LobstersItem
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
@Composable
fun NetworkPosts(
items: LazyPagingItems<LobstersPost>,
urlLauncher: UrlLauncher,
) {
LazyColumn {
items(items) { item ->
if (item != null) {
LobstersItem(
post = item.toDbModel(),
isSaved = false,
viewPost = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
viewComments = { urlLauncher.launch(item.commentsUrl) },
toggleSave = {},
)
}
}
}
}