Skip to content

Commit 08131c1

Browse files
committed
fix: crash when finding nav controller before activity is started
Signed-off-by: Kyle Corry <kylecorry31@gmail.com>
1 parent 707601c commit 08131c1

7 files changed

Lines changed: 27 additions & 27 deletions

File tree

app/src/main/java/com/kylecorry/trail_sense/main/MainActivity.kt

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class MainActivity : AndromedaActivity() {
7070
private val binding: ActivityMainBinding
7171
get() = _binding!!
7272

73-
private val navController: NavController
73+
private val navController: NavController?
7474
get() = findNavController()
7575

7676
val errorBanner: ErrorBannerView
@@ -146,7 +146,7 @@ class MainActivity : AndromedaActivity() {
146146
* Update the bottom nav selection based on the current navigation destination
147147
*/
148148
private fun updateBottomNavSelection() {
149-
val currentNavId = navController.currentDestination?.id
149+
val currentNavId = navController?.currentDestination?.id
150150
val tools = Tools.getTools(this)
151151
val selectedTool = tools.firstOrNull { it.isOpen(currentNavId ?: 0) }
152152
// If the tool appears in the bottom nav, select it. Otherwise, select the Tools tab
@@ -222,7 +222,7 @@ class MainActivity : AndromedaActivity() {
222222
appInitialized = true
223223
updateBottomNavigation()
224224

225-
navController.addOnDestinationChangedListener { _, _, _ ->
225+
navController?.addOnDestinationChangedListener { _, _, _ ->
226226
binding.quickActionsSheet.close()
227227
updateBottomNavSelection()
228228
}
@@ -280,11 +280,11 @@ class MainActivity : AndromedaActivity() {
280280
errorBanner.dismissAll()
281281

282282
if (shouldReloadNavigation) {
283-
navController.navigate(
283+
navController?.navigate(
284284
binding.bottomNavigation.selectedItemId,
285285
null,
286286
NavOptions.Builder().setPopUpTo(
287-
navController.currentDestination?.id ?: R.id.action_experimental_tools, true
287+
navController?.currentDestination?.id ?: R.id.action_experimental_tools, true
288288
).build()
289289
)
290290
}
@@ -316,7 +316,7 @@ class MainActivity : AndromedaActivity() {
316316
if (intent.action == TrailSenseExceptionHandler.ACTION_TOOL_ERROR) {
317317
val toolId = intent.getLongExtra(TrailSenseExceptionHandler.EXTRA_TOOL_ID, 0L)
318318
val error = intent.getStringExtra(TrailSenseExceptionHandler.EXTRA_ERROR) ?: ""
319-
navController.navigate(
319+
navController?.navigate(
320320
R.id.fragmentToolErrorHandler,
321321
bundleOf("tool_id" to toolId, "error" to error)
322322
)
@@ -327,8 +327,8 @@ class MainActivity : AndromedaActivity() {
327327
val toolId = intent.getLongExtra("tool_id", -1)
328328
val tool = Tools.getTool(this, toolId)
329329
if (tool != null) {
330-
if (navController.currentDestination?.id != tool.navAction) {
331-
navController.navigate(tool.navAction)
330+
if (navController?.currentDestination?.id != tool.navAction) {
331+
navController?.navigate(tool.navAction)
332332
}
333333
binding.bottomNavigation.selectedItemId = tool.navAction
334334
}
@@ -361,7 +361,7 @@ class MainActivity : AndromedaActivity() {
361361
if (savedInstanceState.containsKey("navigation")) {
362362
tryOrNothing {
363363
val bundle = savedInstanceState.getBundle("navigation_arguments")
364-
navController.navigate(savedInstanceState.getInt("navigation"), bundle)
364+
navController?.navigate(savedInstanceState.getInt("navigation"), bundle)
365365
}
366366
}
367367
}
@@ -370,10 +370,10 @@ class MainActivity : AndromedaActivity() {
370370
super.onSaveInstanceState(outState)
371371
tryOrLog {
372372
outState.putInt("page", binding.bottomNavigation.selectedItemId)
373-
navController.currentBackStackEntry?.arguments?.let {
373+
navController?.currentBackStackEntry?.arguments?.let {
374374
outState.putBundle("navigation_arguments", it)
375375
}
376-
navController.currentDestination?.id?.let {
376+
navController?.currentDestination?.id?.let {
377377
outState.putInt("navigation", it)
378378
}
379379
}
@@ -412,7 +412,7 @@ class MainActivity : AndromedaActivity() {
412412
}
413413

414414
private fun getVolumeAction(): VolumeAction? {
415-
val navigationId = navController.currentDestination?.id
415+
val navigationId = navController?.currentDestination?.id
416416
val fragment = getFragment() as? AndromedaFragment ?: return null
417417
val tools = Tools.getTools(this)
418418

@@ -492,7 +492,7 @@ class MainActivity : AndromedaActivity() {
492492
getString(R.string.tools)
493493
).setIcon(R.drawable.apps)
494494
.setOnMenuItemClickListener {
495-
if (navController.currentDestination?.id == R.id.action_experimental_tools && !binding.quickActionsSheet.isOpen()) {
495+
if (navController?.currentDestination?.id == R.id.action_experimental_tools && !binding.quickActionsSheet.isOpen()) {
496496
val searchinput = findViewById<TextInputEditText>(R.id.search_view_edit_text)
497497
if (searchinput?.requestFocus() == true) {
498498
val imm = getSystemService(InputMethodManager::class.java)
@@ -525,15 +525,16 @@ class MainActivity : AndromedaActivity() {
525525
initializeNavGraph(initialItem)
526526
}
527527
// Bind to navigation
528-
binding.bottomNavigation.setupWithNavController(navController, false)
528+
navController?.let { binding.bottomNavigation.setupWithNavController(it, false) }
529529

530530
updateBottomNavSelection()
531531
}
532532

533533
private fun initializeNavGraph(startDestination: Int) {
534-
val navGraph = navController.navInflater.inflate(R.navigation.nav_graph)
534+
val nav = navController ?: return
535+
val navGraph = nav.navInflater.inflate(R.navigation.nav_graph)
535536
navGraph.setStartDestination(startDestination)
536-
navController.graph = navGraph
537+
nav.graph = navGraph
537538
}
538539

539540
private fun onPowerSavingModeChanged(data: Bundle): Boolean {

app/src/main/java/com/kylecorry/trail_sense/main/errors/TrailSenseExceptionHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class TrailSenseExceptionHandler(
5252
return false
5353
}
5454

55-
val currentNavId = activity.findNavController().currentDestination?.id ?: return false
55+
val currentNavId = activity.findNavController()?.currentDestination?.id ?: return false
5656
val tools = Tools.getTools(activity)
5757
val selectedTool = tools.firstOrNull { it.isOpen(currentNavId) } ?: return false
5858

app/src/main/java/com/kylecorry/trail_sense/shared/extensions/ActivityExtensions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ import androidx.navigation.NavController
55
import androidx.navigation.fragment.NavHostFragment
66
import com.kylecorry.trail_sense.R
77

8-
fun AppCompatActivity.findNavController(): NavController {
9-
return (supportFragmentManager.findFragmentById(R.id.fragment_holder) as NavHostFragment).navController
8+
fun AppCompatActivity.findNavController(): NavController? {
9+
return (supportFragmentManager.findFragmentById(R.id.fragment_holder) as? NavHostFragment)?.navController
1010
}

app/src/main/java/com/kylecorry/trail_sense/shared/map_layers/preferences/ui/converters/LabelMapLayerViewPreferenceConverter.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ class LabelMapLayerViewPreferenceConverter : MapLayerViewPreferenceConverter {
2525
androidPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
2626
// TODO: Find a better way to do this
2727
if (preference.openDemSettingsOnClick && context is MainActivity) {
28-
context.findNavController()
29-
.navigateWithAnimation(R.id.calibrateAltimeterFragment)
28+
context.findNavController()?.navigateWithAnimation(R.id.calibrateAltimeterFragment)
3029
}
3130
true
3231
}

app/src/main/java/com/kylecorry/trail_sense/tools/beacons/BeaconsToolRegistration.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ object BeaconsToolRegistration : ToolRegistration {
3737
val geo = GeoUri.from(intentData) ?: return@ToolIntentHandler false
3838

3939
val bundle = bundleOf("initial_location" to geo)
40-
activity.findNavController().navigate(
40+
activity.findNavController()?.navigate(
4141
R.id.beacon_list,
4242
bundle
4343
)
@@ -49,7 +49,7 @@ object BeaconsToolRegistration : ToolRegistration {
4949
val beaconId = intent.getLongExtra("beacon_id", -1L)
5050
if (beaconId == -1L) return@ToolIntentHandler false
5151
val bundle = bundleOf("beacon_id" to beaconId)
52-
activity.findNavController().navigate(
52+
activity.findNavController()?.navigate(
5353
R.id.beaconDetailsFragment,
5454
bundle
5555
)

app/src/main/java/com/kylecorry/trail_sense/tools/navigation/infrastructure/NavigationScreenLock.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,16 @@ class NavigationScreenLock(private val alwaysLock: Boolean = false) {
5454

5555
private fun removeNavigationListener(activity: Activity) {
5656
val mainActivity = activity as? MainActivity ?: return
57-
val navController = mainActivity.findNavController()
57+
val navController = mainActivity.findNavController() ?: return
5858
navController.removeOnDestinationChangedListener(listener)
5959
}
6060

6161
private fun addNavigationListener(activity: Activity) {
6262
val weakActivity = WeakReference(activity)
6363
val mainActivity = weakActivity.get() as? MainActivity ?: return
6464
val navController = mainActivity.findNavController()
65-
selfDestinationId = navController.currentDestination?.id
66-
navController.addOnDestinationChangedListener(listener)
65+
selfDestinationId = navController?.currentDestination?.id
66+
navController?.addOnDestinationChangedListener(listener)
6767
}
6868

6969
}

app/src/main/java/com/kylecorry/trail_sense/tools/photo_maps/PhotoMapsToolRegistration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ object PhotoMapsToolRegistration : ToolRegistration {
2929

3030
val intentUri = intent.clipData?.getItemAt(0)?.uri ?: return@ToolIntentHandler false
3131
val bundle = bundleOf("map_intent_uri" to intentUri)
32-
activity.findNavController().navigate(R.id.mapListFragment, bundle)
32+
activity.findNavController()?.navigate(R.id.mapListFragment, bundle)
3333
true
3434
}
3535

0 commit comments

Comments
 (0)