Skip to content

Commit 6ae455b

Browse files
committed
fix merge conflicts
2 parents 91a05e0 + 44dbc80 commit 6ae455b

File tree

11 files changed

+97
-90
lines changed

11 files changed

+97
-90
lines changed

app/build.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import com.android.tools.build.jetifier.core.utils.Log
21
import java.util.Properties
32

43
plugins {

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/MainActivity.kt

+1-6
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ import androidx.activity.compose.setContent
2222
import androidx.activity.enableEdgeToEdge
2323
import androidx.compose.material3.MaterialTheme
2424
import androidx.compose.material3.Surface
25-
import androidx.compose.runtime.CompositionLocalProvider
26-
import androidx.navigation.compose.rememberNavController
27-
import com.esri.arcgismaps.kotlin.sampleviewer.navigation.LocalNavController
2825
import com.esri.arcgismaps.kotlin.sampleviewer.navigation.NavGraph
2926
import com.esri.arcgismaps.kotlin.sampleviewer.ui.theme.SampleAppTheme
3027

@@ -37,9 +34,7 @@ class MainActivity : ComponentActivity() {
3734

3835
SampleAppTheme {
3936
Surface(color = MaterialTheme.colorScheme.background) {
40-
CompositionLocalProvider(value = LocalNavController provides rememberNavController()) {
41-
NavGraph()
42-
}
37+
NavGraph()
4338
}
4439
}
4540
}

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/navigation/NavGraph.kt

+55-31
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
package com.esri.arcgismaps.kotlin.sampleviewer.navigation
1818

19+
import android.content.Context
20+
import android.util.Log
21+
import android.widget.Toast
1922
import androidx.compose.runtime.Composable
20-
import androidx.compose.runtime.compositionLocalOf
21-
import androidx.compose.ui.platform.LocalInspectionMode
23+
import androidx.compose.ui.platform.LocalContext
2224
import androidx.navigation.NavGraph.Companion.findStartDestination
2325
import androidx.navigation.NavHostController
2426
import androidx.navigation.NavType
@@ -35,37 +37,28 @@ import com.esri.arcgismaps.kotlin.sampleviewer.ui.screens.sampleList.SampleListS
3537
import com.esri.arcgismaps.kotlin.sampleviewer.ui.screens.search.SearchResults
3638
import com.esri.arcgismaps.kotlin.sampleviewer.ui.screens.search.SearchScreen
3739

38-
// Composition Local for the app wide navigation controller
39-
val LocalNavController = compositionLocalOf<NavHostController> {
40-
error("LocalNavController not found")
41-
}
42-
4340
/**
4441
* A composable function to host the navigation system.
4542
*/
4643
@Composable
47-
fun NavGraph() {
48-
val navController = if (LocalInspectionMode.current) {
49-
rememberNavController()
50-
} else {
51-
LocalNavController.current
52-
}
53-
44+
internal fun NavGraph() {
45+
val context = LocalContext.current
46+
val navController = rememberNavController()
5447
NavHost(
5548
navController = navController,
5649
startDestination = Routes.HOME_SCREEN,
5750
) {
5851

5952
composable(Routes.HOME_SCREEN) {
6053
HomeCategoryScreen(
61-
navigateToSearch = { navController.navigate(Routes.SEARCH_SCREEN) },
62-
navigateToAbout = { navController.navigate(Routes.ABOUT_SCREEN) },
63-
navigateToCategory = { navController.navigate(Routes.createCategoryRoute(it)) }
54+
onNavigateToSearch = { navController.navigate(Routes.SEARCH_SCREEN) },
55+
onNavigateToAbout = { navController.navigate(Routes.ABOUT_SCREEN) },
56+
onNavigateToCategory = { navController.navigate(Routes.createCategoryRoute(it)) }
6457
)
6558
}
6659

6760
composable(Routes.ABOUT_SCREEN) {
68-
AboutScreen()
61+
AboutScreen(onBackPressed = { navController.pop() })
6962
}
7063

7164
composable(
@@ -76,13 +69,15 @@ fun NavGraph() {
7669
if (!categoryNavEntry.isNullOrEmpty())
7770
SampleListScreen(
7871
categoryNavEntry = categoryNavEntry,
79-
navigateToInfo = { optionPosition, sample ->
72+
onNavigateToInfo = { optionPosition, sample ->
8073
navController.navigate(
8174
Routes.createSampleInfoRoute(optionPosition, sample.name)
8275
)
83-
})
76+
},
77+
onBackPressed = { navController.pop() }
78+
)
8479
else {
85-
navController.navigateToHome()
80+
navController.displayError("categoryNavEntry is null/empty", context)
8681
}
8782
}
8883

@@ -100,17 +95,23 @@ fun NavGraph() {
10095
val sampleNavEntry = DefaultSampleInfoRepository.getSampleByName(sampleNameNavEntry)
10196
SampleInfoScreen(
10297
sample = sampleNavEntry,
103-
optionPosition = optionPositionNavEntry
98+
optionPosition = optionPositionNavEntry,
99+
onBackPressed = { navController.pop() }
104100
)
101+
} else if (optionPositionNavEntry == null) {
102+
navController.displayError("optionPositionNavEntry is null", context)
105103
} else {
106-
navController.navigateToHome()
104+
navController.displayError("sampleNameNavEntry is null/empty", context)
107105
}
108106
}
109107

110108
composable(Routes.SEARCH_SCREEN) {
111-
SearchScreen(navigateToSearchResults = {
112-
navController.navigate(Routes.createSearchResultsRoute(it))
113-
})
109+
SearchScreen(
110+
onNavigateToSearchResults = {
111+
navController.navigate(Routes.createSearchResultsRoute(it))
112+
},
113+
onBackPressed = { navController.pop() }
114+
)
114115
}
115116

116117
composable(
@@ -128,29 +129,52 @@ fun NavGraph() {
128129
sample.name
129130
)
130131
)
131-
})
132+
},
133+
onBackPressed = { navController.pop() }
134+
)
132135
} else {
133-
navController.navigateToHome()
136+
navController.displayError("queryNavEntry is null/empty", context)
134137
}
135138
}
136139
}
137140
}
138141

142+
143+
/**
144+
* Displays a Toast and a Log for the given [message] on route errors,
145+
* then reset navigation to home screen.
146+
*/
147+
private fun NavHostController.displayError(message: String, context: Context) {
148+
val exceptionTag = "InvalidRouteError"
149+
Toast.makeText(context, "$exceptionTag: $message", Toast.LENGTH_SHORT).show()
150+
Log.e(exceptionTag, message)
151+
navigateToHome()
152+
}
153+
154+
/**
155+
* Attempts to pop the controller's back stack. Checks if screen was navigated to
156+
* another destination, or navigate to home if no items in stack.
157+
*/
158+
private fun NavHostController.pop() {
159+
if (!popBackStack()) {
160+
navigateToHome()
161+
}
162+
}
163+
139164
/**
140165
* Navigates to the home screen, clearing the back stack and restoring the state.
141166
*/
142167
private fun NavHostController.navigateToHome() {
143168
navigate(Routes.HOME_SCREEN) {
144-
popUpTo(graph.findStartDestination().id) { saveState = false }
169+
popUpTo(graph.findStartDestination().id)
145170
launchSingleTop = true
146-
restoreState = false
147171
}
148172
}
149173

150174
/**
151175
* Navigation Routes for the application.
152176
*/
153-
object Routes {
177+
private object Routes {
154178
private const val SAMPLE_LIST = "Sample List"
155179
private const val SAMPLE_INFO = "Sample Info"
156180
private const val SEARCH_RESULTS = "Search Results"

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/ui/components/SampleViewerTopAppBar.kt

+3-12
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,17 @@ import androidx.compose.material3.Text
2727
import androidx.compose.material3.TopAppBar
2828
import androidx.compose.material3.TopAppBarDefaults
2929
import androidx.compose.runtime.Composable
30-
import androidx.compose.ui.platform.LocalInspectionMode
3130
import androidx.compose.ui.res.stringResource
3231
import androidx.compose.ui.tooling.preview.Preview
33-
import androidx.navigation.compose.rememberNavController
3432
import com.esri.arcgismaps.kotlin.sampleviewer.R
35-
import com.esri.arcgismaps.kotlin.sampleviewer.navigation.LocalNavController
3633
import com.esri.arcgismaps.kotlin.sampleviewer.ui.theme.SampleAppTheme
3734

3835
/**
3936
* The common [TopAppBar] used to display screen title and the back button for all screens.
4037
*/
4138
@Composable
4239
@OptIn(ExperimentalMaterial3Api::class)
43-
fun SampleViewerTopAppBar(title: String) {
44-
val navController = if (LocalInspectionMode.current) {
45-
rememberNavController()
46-
} else {
47-
LocalNavController.current
48-
}
49-
40+
fun SampleViewerTopAppBar(title: String, onBackPressed: () -> Unit) {
5041
TopAppBar(
5142
title = {
5243
Text(
@@ -60,7 +51,7 @@ fun SampleViewerTopAppBar(title: String) {
6051
navigationIconContentColor = MaterialTheme.colorScheme.onPrimaryContainer
6152
),
6253
navigationIcon = {
63-
IconButton(onClick = { navController.popBackStack() }) {
54+
IconButton(onClick = onBackPressed) {
6455
Icon(
6556
imageVector = Icons.AutoMirrored.Outlined.ArrowBack,
6657
contentDescription = stringResource(R.string.backButton)
@@ -75,7 +66,7 @@ fun SampleViewerTopAppBar(title: String) {
7566
@Composable
7667
fun PreviewSampleViewerTopAppBar() {
7768
SampleAppTheme {
78-
SampleViewerTopAppBar("Sample Viewer title")
69+
SampleViewerTopAppBar(title = "Sample Viewer title", onBackPressed = {})
7970
}
8071
}
8172

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/ui/screens/about/AboutScreen.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme
6767
* Showcase information about the application.
6868
*/
6969
@Composable
70-
fun AboutScreen() {
70+
fun AboutScreen(onBackPressed: () -> Unit) {
7171
Scaffold(
7272
modifier = Modifier
7373
.fillMaxSize(),
74-
topBar = { SampleViewerTopAppBar(title = "About") },
74+
topBar = { SampleViewerTopAppBar(title = "About", onBackPressed) },
7575
containerColor = MaterialTheme.colorScheme.background,
7676
contentColor = MaterialTheme.colorScheme.onBackground
7777
) { innerPadding ->
@@ -507,5 +507,5 @@ private fun ApiDetailsSection() {
507507
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true)
508508
@Composable
509509
fun PreviewAboutScreen() {
510-
SampleAppTheme { AboutScreen() }
510+
SampleAppTheme { AboutScreen {} }
511511
}

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/ui/screens/codePager/SampleInfoScreen.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,16 @@ import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme
6767
@Composable
6868
fun SampleInfoScreen(
6969
sample: Sample,
70-
optionPosition: Int
70+
optionPosition: Int,
71+
onBackPressed: () -> Unit
7172
) {
7273
val codePagerTitles = mutableListOf<String>()
7374
codePagerTitles.add("README.md")
7475
sample.codeFiles.forEach {
7576
codePagerTitles.add(it.name)
7677
}
7778
Scaffold(
78-
topBar = {
79-
SampleViewerTopAppBar(title = sample.name)
80-
},
79+
topBar = { SampleViewerTopAppBar(title = sample.name, onBackPressed) },
8180
containerColor = MaterialTheme.colorScheme.background,
8281
contentColor = MaterialTheme.colorScheme.onBackground,
8382
modifier = Modifier
@@ -201,7 +200,8 @@ fun PreviewSampleInfoScreen() {
201200
SampleAppTheme {
202201
SampleInfoScreen(
203202
sample = Sample.PREVIEW_INSTANCE,
204-
optionPosition = 0
203+
optionPosition = 0,
204+
onBackPressed = {}
205205
)
206206
}
207207
}

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/ui/screens/home/HomeCategoryScreen.kt

+10-11
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ import androidx.compose.ui.unit.times
5959
import com.esri.arcgismaps.kotlin.sampleviewer.R
6060
import com.esri.arcgismaps.kotlin.sampleviewer.model.Category
6161
import com.esri.arcgismaps.kotlin.sampleviewer.model.SampleCategory
62-
import com.esri.arcgismaps.kotlin.sampleviewer.navigation.Routes
6362
import com.esri.arcgismaps.kotlin.sampleviewer.ui.components.CategoryCard
6463
import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme
6564

@@ -69,9 +68,9 @@ import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme
6968
*/
7069
@Composable
7170
fun HomeCategoryScreen(
72-
navigateToAbout: () -> Unit,
73-
navigateToSearch: () -> Unit,
74-
navigateToCategory: (SampleCategory) -> Unit,
71+
onNavigateToAbout: () -> Unit,
72+
onNavigateToSearch: () -> Unit,
73+
onNavigateToCategory: (SampleCategory) -> Unit,
7574
) {
7675
val config = LocalConfiguration.current
7776
val layoutSpacing by remember { mutableStateOf(0.03f * config.screenWidthDp.dp) }
@@ -93,8 +92,8 @@ fun HomeCategoryScreen(
9392
}
9493
Scaffold(
9594
modifier = Modifier.fillMaxSize(),
96-
topBar = { HomeCategoryTopAppBar(navigateToAbout) },
97-
floatingActionButton = { SearchFloatingActionButton(isVisible, navigateToSearch) },
95+
topBar = { HomeCategoryTopAppBar(onNavigateToAbout) },
96+
floatingActionButton = { SearchFloatingActionButton(isVisible, onNavigateToSearch) },
9897
floatingActionButtonPosition = FabPosition.End,
9998
containerColor = MaterialTheme.colorScheme.background,
10099
contentColor = MaterialTheme.colorScheme.onBackground
@@ -114,7 +113,7 @@ fun HomeCategoryScreen(
114113
) {
115114
items(Category.SAMPLE_CATEGORIES.size) { index ->
116115
val category = Category.SAMPLE_CATEGORIES[index]
117-
CategoryCard(category) { navigateToCategory(category.title) }
116+
CategoryCard(category) { onNavigateToCategory(category.title) }
118117
}
119118
}
120119
}
@@ -150,7 +149,7 @@ private fun SearchFloatingActionButton(
150149
private fun HomeCategoryTopAppBar(navigateToAboutScreen: () -> Unit) {
151150
TopAppBar(
152151
title = {
153-
Text(text = Routes.HOME_SCREEN)
152+
Text(text = stringResource(R.string.home_screen_title))
154153
},
155154
colors = TopAppBarDefaults.topAppBarColors(
156155
containerColor = MaterialTheme.colorScheme.primaryContainer,
@@ -174,9 +173,9 @@ private fun HomeCategoryTopAppBar(navigateToAboutScreen: () -> Unit) {
174173
fun PreviewHomeCategoryScreen() {
175174
SampleAppTheme {
176175
HomeCategoryScreen(
177-
navigateToCategory = {},
178-
navigateToSearch = {},
179-
navigateToAbout = {}
176+
onNavigateToCategory = {},
177+
onNavigateToSearch = {},
178+
onNavigateToAbout = {}
180179
)
181180
}
182181
}

app/src/main/java/com/esri/arcgismaps/kotlin/sampleviewer/ui/screens/sampleList/SampleListScreen.kt

+8-6
Original file line numberDiff line numberDiff line change
@@ -62,27 +62,29 @@ import java.util.Locale
6262
* Shows the list of samples.
6363
*/
6464
@Composable
65-
fun SampleListScreen(categoryNavEntry: String, navigateToInfo: (Int, Sample) -> Unit) {
65+
fun SampleListScreen(
66+
categoryNavEntry: String,
67+
onNavigateToInfo: (Int, Sample) -> Unit,
68+
onBackPressed: () -> Unit
69+
) {
6670
val viewModel: FavoritesViewModel = viewModel()
6771
val favoriteSamplesFlow = remember { viewModel.getFavorites() }
6872
val favoriteSamples by favoriteSamplesFlow.collectAsState(initial = emptyList())
6973
val category = SampleCategory.toEnum(categoryNavEntry)
7074
val samplesList = DefaultSampleInfoRepository.getSamplesInCategory(category)
7175

7276
Scaffold(
73-
topBar = {
74-
SampleViewerTopAppBar(title = category.text)
75-
},
77+
topBar = { SampleViewerTopAppBar(title = category.text, onBackPressed) },
7678
modifier = Modifier
7779
.fillMaxSize(),
7880
) { innerPadding ->
7981
Column(modifier = Modifier.padding(innerPadding)) {
8082
if (samplesList.isEmpty() && category != SampleCategory.FAVORITES) {
8183
EmptySampleListScreen(stringResource(R.string.upcoming_samples_text))
8284
} else if (category == SampleCategory.FAVORITES) {
83-
FavoriteItemsListScreen(favoriteSamples, navigateToInfo)
85+
FavoriteItemsListScreen(favoriteSamples, onNavigateToInfo)
8486
} else {
85-
ListOfSamplesScreen(samplesList, navigateToInfo)
87+
ListOfSamplesScreen(samplesList, onNavigateToInfo)
8688
}
8789
}
8890
}

0 commit comments

Comments
 (0)