Skip to content

Commit

Permalink
Rename SessionConfiguration -> NavigatorConfiguration
Browse files Browse the repository at this point in the history
  • Loading branch information
jayohms committed May 21, 2024
1 parent fcccfae commit d02cb28
Show file tree
Hide file tree
Showing 17 changed files with 82 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dev.hotwire.core.navigation.activities

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration

/**
* Activity that should be implemented by any Activity using Hotwire.
Expand All @@ -11,7 +11,7 @@ abstract class HotwireActivity : AppCompatActivity() {
lateinit var delegate: HotwireActivityDelegate
private set

abstract fun sessionConfigurations(): List<SessionConfiguration>
abstract fun navigatorConfigurations(): List<NavigatorConfiguration>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package dev.hotwire.core.navigation.activities

import android.os.Bundle
import androidx.activity.OnBackPressedCallback
import androidx.annotation.IdRes
import androidx.navigation.NavController
import dev.hotwire.core.navigation.session.NavigatorHost
import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.turbo.nav.HotwireNavDestination
import dev.hotwire.core.navigation.session.NavigatorConfiguration
import dev.hotwire.core.turbo.nav.Navigator
import dev.hotwire.core.turbo.observers.HotwireActivityObserver
import dev.hotwire.core.turbo.visit.VisitOptions

/**
* Initializes the Activity for Hotwire navigation and provides all the hooks for an
Expand All @@ -27,7 +24,7 @@ class HotwireActivityDelegate(val activity: HotwireActivity) {
}
}

private var currentNavigatorHostId = activity.sessionConfigurations().first().navHostFragmentId
private var currentNavigatorHostId = activity.navigatorConfigurations().first().navigatorHostId
set(value) {
field = value
updateOnBackPressedCallback(currentNavigatorHost.navController)
Expand Down Expand Up @@ -58,12 +55,12 @@ class HotwireActivityDelegate(val activity: HotwireActivity) {
}

/**
* Sets the currently active session in your Activity. If you use multiple
* Sets the currently active navigator in your Activity. If you use multiple
* [NavigatorHost] instances in your app (such as for bottom tabs),
* you must update this whenever the current session changes.
* you must update this whenever the current navigator changes.
*/
fun setCurrentSession(sessionConfiguration: SessionConfiguration) {
currentNavigatorHostId = sessionConfiguration.navHostFragmentId
fun setCurrentNavigator(configuration: NavigatorConfiguration) {
currentNavigatorHostId = configuration.navigatorHostId
}

internal fun registerNavigatorHost(host: NavigatorHost) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dev.hotwire.core.navigation.routing

import androidx.core.net.toUri
import dev.hotwire.core.navigation.activities.HotwireActivity
import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration

class AppNavigationRoute : Router.Route {
override val name = "app-navigation"
Expand All @@ -11,14 +11,14 @@ class AppNavigationRoute : Router.Route {

override fun matches(
location: String,
sessionConfiguration: SessionConfiguration
configuration: NavigatorConfiguration
): Boolean {
return sessionConfiguration.startLocation.toUri().host == location.toUri().host
return configuration.startLocation.toUri().host == location.toUri().host
}

override fun handle(
location: String,
sessionConfiguration: SessionConfiguration,
configuration: NavigatorConfiguration,
activity: HotwireActivity
) {
// No-op
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.content.Intent
import androidx.core.net.toUri
import dev.hotwire.core.lib.logging.logError
import dev.hotwire.core.navigation.activities.HotwireActivity
import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration

class BrowserRoute : Router.Route {
override val name = "browser"
Expand All @@ -14,14 +14,14 @@ class BrowserRoute : Router.Route {

override fun matches(
location: String,
sessionConfiguration: SessionConfiguration
configuration: NavigatorConfiguration
): Boolean {
return sessionConfiguration.startLocation.toUri().host != location.toUri().host
return configuration.startLocation.toUri().host != location.toUri().host
}

override fun handle(
location: String,
sessionConfiguration: SessionConfiguration,
configuration: NavigatorConfiguration,
activity: HotwireActivity
) {
val intent = Intent(Intent.ACTION_VIEW, location.toUri())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.net.toUri
import com.google.android.material.R
import dev.hotwire.core.navigation.activities.HotwireActivity
import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration
import dev.hotwire.core.turbo.util.colorFromThemeAttr

class BrowserTabRoute : Router.Route {
Expand All @@ -15,14 +15,14 @@ class BrowserTabRoute : Router.Route {

override fun matches(
location: String,
sessionConfiguration: SessionConfiguration
configuration: NavigatorConfiguration
): Boolean {
return sessionConfiguration.startLocation.toUri().host != location.toUri().host
return configuration.startLocation.toUri().host != location.toUri().host
}

override fun handle(
location: String,
sessionConfiguration: SessionConfiguration,
configuration: NavigatorConfiguration,
activity: HotwireActivity
) {
val color = activity.colorFromThemeAttr(R.attr.colorSurface)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dev.hotwire.core.navigation.routing

import dev.hotwire.core.lib.logging.logEvent
import dev.hotwire.core.navigation.activities.HotwireActivity
import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration
import dev.hotwire.core.navigation.routing.Router.Route

/**
Expand Down Expand Up @@ -34,7 +34,7 @@ class Router(private val routes: List<Route>) {
*/
fun matches(
location: String,
sessionConfiguration: SessionConfiguration
configuration: NavigatorConfiguration
): Boolean

/**
Expand All @@ -43,7 +43,7 @@ class Router(private val routes: List<Route>) {
*/
fun handle(
location: String,
sessionConfiguration: SessionConfiguration,
configuration: NavigatorConfiguration,
activity: HotwireActivity
)
}
Expand All @@ -62,17 +62,17 @@ class Router(private val routes: List<Route>) {

internal fun route(
location: String,
sessionConfiguration: SessionConfiguration,
configuration: NavigatorConfiguration,
activity: HotwireActivity
): RouteResult {
routes.forEach { route ->
if (route.matches(location, sessionConfiguration)) {
if (route.matches(location, configuration)) {
logEvent("routeMatch", listOf(
"route" to route.name,
"location" to location
))

route.handle(location, sessionConfiguration, activity)
route.handle(location, configuration, activity)
return route.result
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package dev.hotwire.core.navigation.session

import androidx.annotation.IdRes

data class SessionConfiguration(
data class NavigatorConfiguration(
val name: String,
val startLocation: String,
@IdRes val navHostFragmentId: Int,
@IdRes val navigatorHostId: Int,
)
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ open class NavigatorHost : NavHostFragment() {
lateinit var navigator: Navigator
private set

val sessionConfiguration get() = activity.sessionConfigurations().first {
id == it.navHostFragmentId
val configuration get() = activity.navigatorConfigurations().first {
id == it.navigatorHostId
}

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -36,7 +36,7 @@ open class NavigatorHost : NavHostFragment() {
internal fun initControllerGraph() {
navController.apply {
graph = TurboNavGraphBuilder(
startLocation = sessionConfiguration.startLocation,
startLocation = configuration.startLocation,
pathConfiguration = pathConfiguration,
navController = findNavController()
).build(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ class TurboNestedFragmentDelegate(val fragment: Fragment, navigatorHostId: Int)
val navigator: Navigator
get() = navigatorHost.navigator

private fun findNavigatorHost(@IdRes navHostFragmentId: Int): NavigatorHost {
return fragment.childFragmentManager.findFragmentById(navHostFragmentId) as? NavigatorHost
?: throw IllegalStateException("No NavigatorHost found with ID: $navHostFragmentId")
private fun findNavigatorHost(@IdRes navigatorHostId: Int): NavigatorHost {
return fragment.childFragmentManager.findFragmentById(navigatorHostId) as? NavigatorHost
?: throw IllegalStateException("No NavigatorHost found with ID: $navigatorHostId")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ interface HotwireNavDestination {
fun route(newLocation: String): Router.RouteResult {
return Hotwire.router.route(
location = newLocation,
sessionConfiguration = navigator.host.sessionConfiguration,
configuration = navigator.host.configuration,
activity = fragment.requireActivity() as HotwireActivity
)
}
Expand Down
18 changes: 9 additions & 9 deletions core/src/main/kotlin/dev/hotwire/core/turbo/nav/Navigator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Navigator(val host: NavigatorHost) {
*/
val currentDestination: HotwireNavDestination
get() = host.childFragmentManager.primaryNavigationFragment as HotwireNavDestination?
?: throw IllegalStateException("No current destination found in NavHostFragment")
?: throw IllegalStateException("No current destination found in NavigatorHost")

/**
* Gets the location for the current destination.
Expand All @@ -48,7 +48,7 @@ class Navigator(val host: NavigatorHost) {
private set

internal fun createNewSession() = Session(
sessionName = host.sessionConfiguration.name,
sessionName = host.configuration.name,
activity = host.activity,
webView = Hotwire.config.makeCustomWebView(host.requireContext())
).also {
Expand Down Expand Up @@ -189,13 +189,13 @@ class Navigator(val host: NavigatorHost) {
/**
* Finds the [NavigatorHost] with the given resource ID.
*/
fun findNavHostFragment(@IdRes navHostFragmentId: Int): NavigatorHost {
fun findNavigatorHost(@IdRes navigatorHostId: Int): NavigatorHost {
val fragment = currentDestination.fragment

return fragment.parentFragment?.childFragmentManager?.findNavHostFragment(navHostFragmentId)
?: fragment.parentFragment?.parentFragment?.childFragmentManager?.findNavHostFragment(navHostFragmentId)
?: fragment.requireActivity().supportFragmentManager.findNavHostFragment(navHostFragmentId)
?: throw IllegalStateException("No NavigatorHost found with ID: $navHostFragmentId")
return fragment.parentFragment?.childFragmentManager?.findNavigatorHost(navigatorHostId)
?: fragment.parentFragment?.parentFragment?.childFragmentManager?.findNavigatorHost(navigatorHostId)
?: fragment.requireActivity().supportFragmentManager.findNavigatorHost(navigatorHostId)
?: throw IllegalStateException("No NavigatorHost found with ID: $navigatorHostId")
}

private fun navigateWhenReady(onReady: () -> Unit) {
Expand Down Expand Up @@ -382,8 +382,8 @@ class Navigator(val host: NavigatorHost) {
)
}

private fun FragmentManager.findNavHostFragment(navHostFragmentId: Int): NavigatorHost? {
return findFragmentById(navHostFragmentId) as? NavigatorHost
private fun FragmentManager.findNavigatorHost(navigatorHostId: Int): NavigatorHost? {
return findFragmentById(navigatorHostId) as? NavigatorHost
}

private val NavBackStackEntry?.isModalContext: Boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ import java.util.*

/**
* This class is primarily responsible for managing an instance of an Android WebView that will
* be shared between fragments. An implementation of [SessionNavHostFragment] will create
* a session for you and it can be retrieved via [SessionNavHostFragment.session].
* be shared between destinations. A a [Navigator] will create a session for you and it can be
* retrieved via [Navigator.session].
*
* @property sessionName An arbitrary name to be used as an identifier for a given session.
* @property activity The activity to which the session will be bound to.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.hotwire.core.navigation.routing

import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration
import org.junit.Assert.*
import org.junit.Test
import org.junit.runner.RunWith
Expand All @@ -9,10 +9,10 @@ import org.robolectric.RobolectricTestRunner
@RunWith(RobolectricTestRunner::class)
class AppNavigationRouteTest {
private val route = AppNavigationRoute()
private val sessionConfig = SessionConfiguration(
private val config = NavigatorConfiguration(
name = "test",
startLocation = "https://my.app.com",
navHostFragmentId = 0
navigatorHostId = 0
)

@Test
Expand All @@ -23,18 +23,18 @@ class AppNavigationRouteTest {
@Test
fun `url on app domain matches`() {
val url = "https://my.app.com/page"
assertTrue(route.matches(url, sessionConfig))
assertTrue(route.matches(url, config))
}

@Test
fun `url without subdomain does not match`() {
val url = "https://app.com/page"
assertFalse(route.matches(url, sessionConfig))
assertFalse(route.matches(url, config))
}

@Test
fun `masqueraded url does not match`() {
val url = "https://[email protected]"
assertFalse(route.matches(url, sessionConfig))
assertFalse(route.matches(url, config))
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.hotwire.core.navigation.routing

import dev.hotwire.core.navigation.session.SessionConfiguration
import dev.hotwire.core.navigation.session.NavigatorConfiguration
import org.junit.Assert.*
import org.junit.Test
import org.junit.runner.RunWith
Expand All @@ -9,10 +9,10 @@ import org.robolectric.RobolectricTestRunner
@RunWith(RobolectricTestRunner::class)
class BrowserRouteTest {
private val route = BrowserRoute()
private val sessionConfig = SessionConfiguration(
private val config = NavigatorConfiguration(
name = "test",
startLocation = "https://my.app.com",
navHostFragmentId = 0
navigatorHostId = 0
)

@Test
Expand All @@ -23,18 +23,18 @@ class BrowserRouteTest {
@Test
fun `url on external domain matches`() {
val url = "https://external.com/page"
assertTrue(route.matches(url, sessionConfig))
assertTrue(route.matches(url, config))
}

@Test
fun `url without subdomain matches`() {
val url = "https://app.com/page"
assertTrue(route.matches(url, sessionConfig))
assertTrue(route.matches(url, config))
}

@Test
fun `url on app domain does not match`() {
val url = "https://my.app.com/page"
assertFalse(route.matches(url, sessionConfig))
assertFalse(route.matches(url, config))
}
}
Loading

0 comments on commit d02cb28

Please sign in to comment.