Skip to content
Prev Previous commit
Next Next commit
Reverts navigation abstraction and fixes tests
Change-Id: I632f72c50f8ecf19f497fa126ec73ce1a1b64e94
  • Loading branch information
JoseAlcerreca committed Nov 20, 2020
commit 97ed75862cda0bc97283ffc7f714efa99a1b6c2c
6 changes: 6 additions & 0 deletions Owl/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ android {
kotlinCompilerVersion Libs.Kotlin.version
kotlinCompilerExtensionVersion Libs.AndroidX.Compose.version
}

packagingOptions {
exclude "META-INF/licenses/**"
exclude "META-INF/AL2.0"
exclude "META-INF/LGPL2.1"
}
}

dependencies {
Expand Down
31 changes: 17 additions & 14 deletions Owl/app/src/androidTest/java/com/example/owl/ui/NavigationTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,20 @@ package com.example.owl.ui

import androidx.activity.ComponentActivity
import androidx.compose.runtime.Providers
import androidx.compose.ui.test.hasLabel
import androidx.compose.ui.test.hasSubstring
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithLabel
import androidx.compose.ui.test.onNodeWithSubstring
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.printToLog
import androidx.test.platform.app.InstrumentationRegistry
import androidx.ui.test.createAndroidComposeRule
import androidx.ui.test.hasLabel
import androidx.ui.test.hasSubstring
import androidx.ui.test.onNodeWithLabel
import androidx.ui.test.onNodeWithSubstring
import androidx.ui.test.onRoot
import androidx.ui.test.performClick
import androidx.ui.test.printToLog
import com.example.owl.R
import com.example.owl.model.courses
import com.example.owl.ui.fakes.ProvideTestImageLoader
import com.example.owl.ui.utils.AmbientBackDispatcher
import dev.chrisbanes.accompanist.insets.ProvideWindowInsets
import org.junit.Rule
import org.junit.Test

Expand All @@ -49,11 +50,13 @@ class NavigationTest {
}
composeTestRule.setContent {
Providers(AmbientBackDispatcher provides activity.onBackPressedDispatcher) {
ProvideTestImageLoader {
if (startDestination == null) {
NavGraph()
} else {
NavGraph(startDestination)
ProvideWindowInsets {
ProvideTestImageLoader {
if (startDestination == null) {
NavGraph()
} else {
NavGraph(startDestination)
}
}
}
}
Expand Down Expand Up @@ -85,7 +88,7 @@ class NavigationTest {
@Test
fun coursesToDetail() {
// Given the app in the courses screen
startActivity(MainDestinations.Courses.route)
startActivity(MainDestinations.COURSES_ROUTE)

composeTestRule.onRoot().printToLog("jalc")
// Navigate to the first course
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,11 @@ import coil.request.Disposable
import coil.request.ImageRequest
import coil.request.ImageResult
import coil.request.SuccessResult
import com.example.owl.ui.utils.AmbientImageLoader
import dev.chrisbanes.accompanist.coil.AmbientImageLoader

/**
* Replaces all images with a simple black drawable to make testing faster and hermetic.
*/
@OptIn(ExperimentalCoilApi::class)
@Composable
fun ProvideTestImageLoader(content: @Composable () -> Unit) {
Expand Down
63 changes: 26 additions & 37 deletions Owl/app/src/main/java/com/example/owl/ui/NavGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

package com.example.owl.ui

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.navigation.NavHostController
Expand All @@ -26,71 +25,61 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.navArgument
import androidx.navigation.compose.navigate
import androidx.navigation.compose.rememberNavController
import com.example.owl.ui.MainDestinations.COURSE_DETAIL_ID_KEY
import com.example.owl.ui.course.CourseDetails
import com.example.owl.ui.courses.Courses
import com.example.owl.ui.onboarding.Onboarding

open class Destination(open val route: String)
open class DestinationSingleArg(
private val rootRoute: String,
private val argName: String,
argType: NavType<*>
) {
val args = listOf(navArgument(argName) { type = argType })
val route = "$rootRoute/{$argName}"
fun getRouteWithArg(courseId: Long) = "$rootRoute/$courseId"
fun getArgFromBundle(args: Bundle) = args.getLong(argName)
}

/**
* Destinations used in the main screen ([OwlApp]).
*/
object MainDestinations {
val Onboarding = Destination("onboarding")
val Courses = Destination("courses")
val CourseDetail = DestinationSingleArg("courses", "courseId", NavType.LongType)
}

/**
* Models the navigation actions in the app.
*/
class MainActions(navController: NavHostController) {
val onboardingComplete: () -> Unit = {
navController.navigate(MainDestinations.Courses.route)
}
val selectCourse: (Long) -> Unit = { courseId: Long ->
navController.navigate(MainDestinations.CourseDetail.getRouteWithArg(courseId))
}
val upPress: () -> Unit = {
navController.popBackStack()
}
const val ONBOARDING_ROUTE = "onboarding"
const val COURSES_ROUTE = "courses"
const val COURSE_DETAIL_ROUTE = "course"
const val COURSE_DETAIL_ID_KEY = "courseId"
}

@Composable
fun NavGraph(startDestination: String = MainDestinations.Onboarding.route) {
fun NavGraph(startDestination: String = MainDestinations.ONBOARDING_ROUTE) {
val navController = rememberNavController()

val actions = remember(navController) { MainActions(navController) }
NavHost(
navController = navController,
startDestination = startDestination
) {
composable(MainDestinations.Onboarding.route) {
composable(MainDestinations.ONBOARDING_ROUTE) {
Onboarding(onboardingComplete = actions.onboardingComplete)
}
composable(MainDestinations.Courses.route) {
composable(MainDestinations.COURSES_ROUTE) {
Courses(selectCourse = actions.selectCourse)
}
composable(
MainDestinations.CourseDetail.route,
arguments = MainDestinations.CourseDetail.args
"${MainDestinations.COURSE_DETAIL_ROUTE}/{$COURSE_DETAIL_ID_KEY}",
arguments = listOf(navArgument(COURSE_DETAIL_ID_KEY) { type = NavType.LongType })
) { backStackEntry ->
val arguments = requireNotNull(backStackEntry.arguments)
CourseDetails(
courseId = MainDestinations.CourseDetail.getArgFromBundle(arguments),
courseId = arguments.getLong(COURSE_DETAIL_ID_KEY),
selectCourse = actions.selectCourse,
upPress = actions.upPress
)
}
}
}

/**
* Models the navigation actions in the app.
*/
class MainActions(navController: NavHostController) {
val onboardingComplete: () -> Unit = {
navController.navigate(MainDestinations.COURSES_ROUTE)
}
val selectCourse: (Long) -> Unit = { courseId: Long ->
navController.navigate("${MainDestinations.COURSE_DETAIL_ROUTE}/$courseId")
}
val upPress: () -> Unit = {
navController.popBackStack()
}
}
4 changes: 2 additions & 2 deletions Owl/app/src/main/java/com/example/owl/ui/OwlApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ import androidx.activity.OnBackPressedDispatcher
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
import com.example.owl.ui.utils.AmbientBackDispatcher
import com.example.owl.ui.utils.ProvideDisplayInsets
import com.example.owl.ui.utils.ProvideImageLoader
import dev.chrisbanes.accompanist.insets.ProvideWindowInsets

@Composable
fun OwlApp(backDispatcher: OnBackPressedDispatcher) {

Providers(AmbientBackDispatcher provides backDispatcher) {
ProvideDisplayInsets {
ProvideWindowInsets {
ProvideImageLoader {
NavGraph()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.OndemandVideo
import androidx.compose.runtime.Composable
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.accessibilityLabel
import androidx.compose.ui.semantics.semantics
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ object Libs {

object AndroidX {
const val coreKtx = "androidx.core:core-ktx:1.5.0-alpha04"
const val navigation = "androidx.navigation:navigation-compose:1.0.0-alpha01"
const val navigation = "androidx.navigation:navigation-compose:1.0.0-alpha02"

object Compose {
const val snapshot = ""
Expand Down