Skip to content

Commit

Permalink
Use stable app state to hold unstable navigation controller
Browse files Browse the repository at this point in the history
  • Loading branch information
newmanw committed Nov 3, 2023
1 parent 5168c26 commit 52dbebc
Show file tree
Hide file tree
Showing 21 changed files with 238 additions and 255 deletions.
15 changes: 7 additions & 8 deletions app/src/main/java/mil/nga/msi/ui/about/AboutNavigation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@ package mil.nga.msi.ui.about

import android.content.Intent
import android.net.Uri
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat.startActivity
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navigation
import mil.nga.msi.ui.navigation.MarlinAppState
import mil.nga.msi.ui.navigation.Route

sealed class AboutRoute(
Expand All @@ -24,7 +23,7 @@ sealed class AboutRoute(
}

fun NavGraphBuilder.settingsGraph(
navController: NavController,
appState: MarlinAppState,
bottomBarVisibility: (Boolean) -> Unit
) {
navigation(
Expand All @@ -37,12 +36,12 @@ fun NavGraphBuilder.settingsGraph(
val context = LocalContext.current

AboutScreen(
onClose = { navController.popBackStack() },
onClose = { appState.navController.popBackStack() },
onDisclaimer = {
navController.navigate(AboutRoute.Disclaimer.name)
appState.navController.navigate(AboutRoute.Disclaimer.name)
},
onPrivacy = {
navController.navigate(AboutRoute.Privacy.name)
appState.navController.navigate(AboutRoute.Privacy.name)
},
onContact = {
val intent = Intent(Intent.ACTION_SENDTO)
Expand All @@ -58,15 +57,15 @@ fun NavGraphBuilder.settingsGraph(
bottomBarVisibility(true)

DisclaimerScreen(
close = { navController.popBackStack() }
close = { appState.navController.popBackStack() }
)
}

composable(AboutRoute.Privacy.name) {
bottomBarVisibility(true)

PrivacyPolicyScreen(
close = { navController.popBackStack() }
close = { appState.navController.popBackStack() }
)
}
}
Expand Down
18 changes: 9 additions & 9 deletions app/src/main/java/mil/nga/msi/ui/asam/AsamNavigation.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package mil.nga.msi.ui.asam

import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navDeepLink
Expand All @@ -13,6 +12,7 @@ import mil.nga.msi.ui.action.AsamAction
import mil.nga.msi.ui.asam.detail.AsamDetailScreen
import mil.nga.msi.ui.asam.list.AsamsScreen
import mil.nga.msi.ui.filter.FilterScreen
import mil.nga.msi.ui.navigation.MarlinAppState
import mil.nga.msi.ui.navigation.Route
import mil.nga.msi.ui.sort.SortScreen

Expand All @@ -30,7 +30,7 @@ sealed class AsamRoute(

@OptIn(ExperimentalMaterialNavigationApi::class)
fun NavGraphBuilder.asamGraph(
navController: NavController,
appState: MarlinAppState,
bottomBarVisibility: (Boolean) -> Unit,
openNavigationDrawer: () -> Unit,
share: (Pair<String, String>) -> Unit,
Expand All @@ -52,13 +52,13 @@ fun NavGraphBuilder.asamGraph(

AsamsScreen(
openDrawer = { openNavigationDrawer() },
openFilter = { navController.navigate(AsamRoute.Filter.name) },
openSort = { navController.navigate(AsamRoute.Sort.name) },
openFilter = { appState.navController.navigate(AsamRoute.Filter.name) },
openSort = { appState.navController.navigate(AsamRoute.Sort.name) },
onAction = { action ->
when(action) {
is AsamAction.Share -> shareAsam(action.asam)
is AsamAction.Location -> showSnackbar("${action.text} copied to clipboard")
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}
)
Expand All @@ -70,12 +70,12 @@ fun NavGraphBuilder.asamGraph(
backstackEntry.arguments?.getString("reference")?.let { reference ->
AsamDetailScreen(
reference,
onBack = { navController.popBackStack() },
onBack = { appState.navController.popBackStack() },
onAction = { action ->
when(action) {
is AsamAction.Share -> shareAsam(action.asam)
is AsamAction.Location -> showSnackbar("${action.text} copied to clipboard")
else -> action.navigate(navController)
else -> action.navigate(appState.navController)
}
}
)
Expand All @@ -85,14 +85,14 @@ fun NavGraphBuilder.asamGraph(
bottomSheet(AsamRoute.Filter.name) {
FilterScreen(
dataSource = DataSource.ASAM,
close = { navController.popBackStack() }
close = { appState.navController.popBackStack() }
)
}

bottomSheet(AsamRoute.Sort.name) {
SortScreen(
dataSource = DataSource.ASAM,
close = { navController.popBackStack() }
close = { appState.navController.popBackStack() }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ fun AsamDetailScreen(
onAction: (Action) -> Unit,
viewModel: AsamViewModel = hiltViewModel()
) {
viewModel.setAsamReference(reference)
val asamWithBookmark by viewModel.asamWithBookmark.observeAsState()
viewModel.setAsamReference(reference)

Column {
TopBar(
Expand Down
27 changes: 13 additions & 14 deletions app/src/main/java/mil/nga/msi/ui/bookmark/BookmarkNavigation.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package mil.nga.msi.ui.bookmark

import androidx.compose.ui.graphics.Color
import androidx.core.os.BundleCompat
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavType
import androidx.navigation.compose.composable
Expand All @@ -22,6 +20,7 @@ import mil.nga.msi.ui.action.NavigationalWarningAction
import mil.nga.msi.ui.action.NoticeToMarinersAction
import mil.nga.msi.ui.action.PortAction
import mil.nga.msi.ui.action.RadioBeaconAction
import mil.nga.msi.ui.navigation.MarlinAppState
import mil.nga.msi.ui.navigation.NavTypeBookmark
import mil.nga.msi.ui.navigation.Route

Expand All @@ -37,7 +36,7 @@ sealed class BookmarkRoute(

@OptIn(ExperimentalMaterialNavigationApi::class)
fun NavGraphBuilder.bookmarksGraph(
navController: NavController,
appState: MarlinAppState,
bottomBarVisibility: (Boolean) -> Unit,
share: (Pair<String, String>) -> Unit,
showSnackbar: (String) -> Unit,
Expand All @@ -56,70 +55,70 @@ fun NavGraphBuilder.bookmarksGraph(
when(action) {
is AsamAction.Share -> onShare(action.asam.toString())
is AsamAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onDgpsStationAction: (DgpsStationAction) -> Unit = { action ->
when(action) {
is DgpsStationAction.Share -> onShare(action.dgpsStation.toString())
is DgpsStationAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onElectronicPublicationAction: (ElectronicPublicationAction) -> Unit = { action ->
action.navigate(navController)
action.navigate(appState.navController)
}

val onGeoPackageFeatureAction: (GeoPackageFeatureAction) -> Unit = { action ->
when(action) {
is GeoPackageFeatureAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onLightAction: (LightAction) -> Unit = { action ->
when(action) {
is LightAction.Share -> onShare(action.light.toString())
is LightAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onModuAction: (ModuAction) -> Unit = { action ->
when(action) {
is ModuAction.Share -> onShare(action.modu.toString())
is ModuAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onNavigationalWarningAction: (NavigationalWarningAction) -> Unit = { action ->
when(action) {
is NavigationalWarningAction.Share -> onShare(action.warning.toString())
is NavigationalWarningAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onNoticeToMarinersAction: (NoticeToMarinersAction) -> Unit = { action ->
action.navigate(navController)
action.navigate(appState.navController)
}

val onPortAction: (PortAction) -> Unit = { action ->
when(action) {
is PortAction.Share -> onShare(action.port.toString())
is PortAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

val onRadioBeaconAction: (RadioBeaconAction) -> Unit = { action ->
when(action) {
is RadioBeaconAction.Share -> onShare(action.radioBeacon.toString())
is RadioBeaconAction.Location -> onShowSnackbar(action.text)
else -> { action.navigate(navController) }
else -> { action.navigate(appState.navController) }
}
}

Expand Down Expand Up @@ -162,7 +161,7 @@ fun NavGraphBuilder.bookmarksGraph(
}?.let { bookmark ->
BookmarkNotesScreen(
bookmark = bookmark,
onDone = { navController.popBackStack() }
onDone = { appState.navController.popBackStack() }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package mil.nga.msi.ui.dgpsstation

import androidx.compose.ui.graphics.Color
import androidx.core.os.BundleCompat
import androidx.navigation.*
import androidx.navigation.compose.composable
Expand All @@ -14,6 +13,7 @@ import mil.nga.msi.ui.dgpsstation.detail.DgpsStationDetailScreen
import mil.nga.msi.ui.dgpsstation.list.DgpsStationsScreen
import mil.nga.msi.ui.filter.FilterScreen
import mil.nga.msi.ui.navigation.DgpsStation
import mil.nga.msi.ui.navigation.MarlinAppState
import mil.nga.msi.ui.navigation.Route
import mil.nga.msi.ui.sort.SortScreen

Expand All @@ -31,7 +31,7 @@ sealed class DgpsStationRoute(

@OptIn(ExperimentalMaterialNavigationApi::class)
fun NavGraphBuilder.dgpsStationGraph(
navController: NavController,
appState: MarlinAppState,
bottomBarVisibility: (Boolean) -> Unit,
openNavigationDrawer: () -> Unit,
share: (Pair<String, String>) -> Unit,
Expand All @@ -53,13 +53,13 @@ fun NavGraphBuilder.dgpsStationGraph(

DgpsStationsScreen(
openDrawer = { openNavigationDrawer() },
openFilter = { navController.navigate(DgpsStationRoute.Filter.name) },
openSort = { navController.navigate(DgpsStationRoute.Sort.name) },
openFilter = { appState.navController.navigate(DgpsStationRoute.Filter.name) },
openSort = { appState.navController.navigate(DgpsStationRoute.Sort.name) },
onAction = { action ->
when(action) {
is DgpsStationAction.Share -> shareDgps(action.dgpsStation)
is DgpsStationAction.Location -> showSnackbar("${action.text} copied to clipboard")
else -> action.navigate(navController)
else -> action.navigate(appState.navController)
}
}
)
Expand All @@ -76,12 +76,12 @@ fun NavGraphBuilder.dgpsStationGraph(
}?.let { key ->
DgpsStationDetailScreen(
key,
close = { navController.popBackStack() },
close = { appState.navController.popBackStack() },
onAction = { action ->
when(action) {
is DgpsStationAction.Share -> shareDgps(action.dgpsStation)
is DgpsStationAction.Location -> showSnackbar("${action.text} copied to clipboard")
else -> action.navigate(navController)
else -> action.navigate(appState.navController)
}
}
)
Expand All @@ -91,13 +91,13 @@ fun NavGraphBuilder.dgpsStationGraph(
bottomSheet(DgpsStationRoute.Filter.name) {
FilterScreen(
dataSource = DataSource.DGPS_STATION,
close = { navController.popBackStack() }
close = { appState.navController.popBackStack() }
)
}
bottomSheet(DgpsStationRoute.Sort.name) {
SortScreen(
dataSource = DataSource.DGPS_STATION,
close = { navController.popBackStack() }
close = { appState.navController.popBackStack() }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package mil.nga.msi.ui.electronicpublication

import android.net.Uri
import androidx.compose.ui.graphics.Color
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavType
import androidx.navigation.compose.composable
Expand All @@ -14,6 +12,7 @@ import mil.nga.msi.datasource.DataSource
import mil.nga.msi.datasource.electronicpublication.ElectronicPublicationType
import mil.nga.msi.repository.bookmark.BookmarkKey
import mil.nga.msi.ui.bookmark.BookmarkRoute
import mil.nga.msi.ui.navigation.MarlinAppState
import mil.nga.msi.ui.navigation.Route

sealed class ElectronicPublicationRoute(
Expand All @@ -31,7 +30,7 @@ fun routeForPubType(pubType: ElectronicPublicationType): String {
}

fun NavGraphBuilder.electronicPublicationGraph(
navController: NavController,
appState: MarlinAppState,
bottomBarVisibility: (Boolean) -> Unit,
openNavigationDrawer: () -> Unit
) {
Expand All @@ -48,7 +47,7 @@ fun NavGraphBuilder.electronicPublicationGraph(
ElectronicPublicationsScreen(
openDrawer = openNavigationDrawer,
onPubTypeTap = { pubType ->
navController.navigate(routeForPubType(pubType))
appState.navController.navigate(routeForPubType(pubType))
}
)
}
Expand All @@ -59,11 +58,11 @@ fun NavGraphBuilder.electronicPublicationGraph(
) {
bottomBarVisibility(true)
ElectronicPublicationTypeBrowseScreen(
onBack = { navController.popBackStack() },
onBack = { appState.navController.popBackStack() },
onBookmark = { publication ->
val key = BookmarkKey(publication.s3Key, DataSource.ELECTRONIC_PUBLICATION)
val encoded = Uri.encode(Json.encodeToString(key))
navController.navigate( "${BookmarkRoute.Notes.name}?bookmark=$encoded")
appState.navController.navigate( "${BookmarkRoute.Notes.name}?bookmark=$encoded")
}
)
}
Expand All @@ -78,11 +77,11 @@ fun NavGraphBuilder.electronicPublicationGraph(

ElectronicPublicationDetailScreen(
s3Key = Uri.decode(s3Key),
onBack = { navController.popBackStack() },
onBack = { appState.navController.popBackStack() },
onBookmark = { publication ->
val key = BookmarkKey(publication.s3Key, DataSource.ELECTRONIC_PUBLICATION)
val encoded = Uri.encode(Json.encodeToString(key))
navController.navigate( "${BookmarkRoute.Notes.name}?bookmark=$encoded")
appState.navController.navigate( "${BookmarkRoute.Notes.name}?bookmark=$encoded")
}
)
}
Expand Down
Loading

0 comments on commit 52dbebc

Please sign in to comment.