57: Prepare for testing r=msfjarvis a=msfjarvis

Work towards #56

bors r+

Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
bors[bot] 2020-10-30 09:18:43 +00:00 committed by GitHub
commit 4f2c5b1909
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 34 deletions

View file

@ -1,17 +1,19 @@
package dev.msfjarvis.lobsters
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.Text
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.BottomNavigation
import androidx.compose.material.BottomNavigationItem
import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.setContent
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.viewinterop.viewModel
import androidx.navigation.compose.KEY_ROUTE
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
@ -32,14 +34,13 @@ import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var urlLauncher: UrlLauncher
private val viewModel: LobstersViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Providers(UrlLauncherAmbient provides urlLauncher) {
LobstersTheme {
LobstersApp(viewModel)
LobstersApp()
}
}
}
@ -47,11 +48,12 @@ class MainActivity : AppCompatActivity() {
}
@Composable
fun LobstersApp(
viewModel: LobstersViewModel,
) {
fun LobstersApp() {
val viewModel: LobstersViewModel = viewModel()
val navController = rememberNavController()
val destinations = arrayOf(Destination.Hottest, Destination.Saved)
val hottestPosts by viewModel.posts.collectAsState()
val savedPosts by viewModel.savedPosts.collectAsState()
Scaffold(
bottomBar = {
@ -60,14 +62,7 @@ fun LobstersApp(
val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE)
destinations.forEach { screen ->
BottomNavigationItem(
icon = {
IconResource(
resourceId = when (screen) {
Destination.Hottest -> R.drawable.ic_whatshot_24px
Destination.Saved -> R.drawable.ic_favorite_24px
}
)
},
icon = { IconResource(resourceId = screen.badgeRes) },
label = { Text(stringResource(id = screen.labelRes)) },
selected = currentRoute == screen.route,
onClick = {
@ -84,12 +79,21 @@ fun LobstersApp(
}
},
) {
val hottestPostsListState = rememberLazyListState()
NavHost(navController, startDestination = Destination.Hottest.route) {
composable(Destination.Hottest.route) {
HottestPosts(viewModel = viewModel)
HottestPosts(
posts = hottestPosts,
listState = hottestPostsListState,
saveAction = viewModel::savePost,
overscrollAction = viewModel::getMorePosts,
)
}
composable(Destination.Saved.route) {
SavedPosts(viewModel = viewModel)
SavedPosts(
posts = savedPosts,
saveAction = viewModel::removeSavedPost,
)
}
}
}

View file

@ -1,5 +1,6 @@
package dev.msfjarvis.lobsters.ui
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import dev.msfjarvis.lobsters.R
@ -9,7 +10,8 @@ import dev.msfjarvis.lobsters.R
sealed class Destination(
val route: String,
@StringRes val labelRes: Int,
@DrawableRes val badgeRes: Int,
) {
object Hottest : Destination("hottest", R.string.hottest_posts)
object Saved : Destination("saved", R.string.saved_posts)
object Hottest : Destination("hottest", R.string.hottest_posts, R.drawable.ic_whatshot_24px)
object Saved : Destination("saved", R.string.saved_posts, R.drawable.ic_favorite_24px)
}

View file

@ -2,22 +2,21 @@ package dev.msfjarvis.lobsters.ui
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumnForIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import dev.msfjarvis.lobsters.data.LobstersViewModel
import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
@Composable
fun HottestPosts(
viewModel: LobstersViewModel,
posts: List<LobstersPost>,
listState: LazyListState,
modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit,
overscrollAction: () -> Unit,
) {
val posts by viewModel.posts.collectAsState()
val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current
if (posts.isEmpty()) {
@ -29,13 +28,13 @@ fun HottestPosts(
modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
) { index, item ->
if (posts.lastIndex == index) {
viewModel.getMorePosts()
overscrollAction.invoke()
}
LobstersItem(
post = item,
linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) },
commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) },
saveAction = viewModel::savePost
saveAction = saveAction,
)
}
}

View file

@ -4,19 +4,17 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumnFor
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import dev.msfjarvis.lobsters.data.LobstersViewModel
import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
@Composable
fun SavedPosts(
viewModel: LobstersViewModel,
posts: List<LobstersPost>,
modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit
) {
val posts by viewModel.savedPosts.collectAsState()
val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current
@ -32,7 +30,7 @@ fun SavedPosts(
post = item,
linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) },
commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) },
saveAction = viewModel::removeSavedPost
saveAction = saveAction,
)
}
}

View file

@ -1,5 +1,5 @@
package dev.msfjarvis.lobsters.urllauncher
interface UrlLauncher {
fun interface UrlLauncher {
fun launch(url: String)
}