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

View file

@ -1,5 +1,6 @@
package dev.msfjarvis.lobsters.ui package dev.msfjarvis.lobsters.ui
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import dev.msfjarvis.lobsters.R import dev.msfjarvis.lobsters.R
@ -9,7 +10,8 @@ import dev.msfjarvis.lobsters.R
sealed class Destination( sealed class Destination(
val route: String, val route: String,
@StringRes val labelRes: Int, @StringRes val labelRes: Int,
@DrawableRes val badgeRes: Int,
) { ) {
object Hottest : Destination("hottest", R.string.hottest_posts) object Hottest : Destination("hottest", R.string.hottest_posts, R.drawable.ic_whatshot_24px)
object Saved : Destination("saved", R.string.saved_posts) 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.layout.padding
import androidx.compose.foundation.lazy.LazyColumnForIndexed 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.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.msfjarvis.lobsters.data.LobstersViewModel import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
@Composable @Composable
fun HottestPosts( fun HottestPosts(
viewModel: LobstersViewModel, posts: List<LobstersPost>,
listState: LazyListState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit,
overscrollAction: () -> Unit,
) { ) {
val posts by viewModel.posts.collectAsState()
val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current val urlLauncher = UrlLauncherAmbient.current
if (posts.isEmpty()) { if (posts.isEmpty()) {
@ -29,13 +28,13 @@ fun HottestPosts(
modifier = Modifier.padding(horizontal = 8.dp).then(modifier) modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
) { index, item -> ) { index, item ->
if (posts.lastIndex == index) { if (posts.lastIndex == index) {
viewModel.getMorePosts() overscrollAction.invoke()
} }
LobstersItem( LobstersItem(
post = item, post = item,
linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) },
commentOpenAction = { post -> urlLauncher.launch(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.LazyColumnFor
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.msfjarvis.lobsters.data.LobstersViewModel import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
@Composable @Composable
fun SavedPosts( fun SavedPosts(
viewModel: LobstersViewModel, posts: List<LobstersPost>,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit
) { ) {
val posts by viewModel.savedPosts.collectAsState()
val listState = rememberLazyListState() val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current val urlLauncher = UrlLauncherAmbient.current
@ -32,7 +30,7 @@ fun SavedPosts(
post = item, post = item,
linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) },
commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) },
saveAction = viewModel::removeSavedPost saveAction = saveAction,
) )
} }
} }

View file

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