Skip to content

Commit 03d1fc0

Browse files
committed
fix crash by removing fragment constructor
1 parent d4a714d commit 03d1fc0

3 files changed

Lines changed: 26 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Mapbox welcomes participation and contributions from everyone.
55
## Unreleased
66
#### Features
77
#### Bug fixes and improvements
8+
- Fixed crash in `PermissionsLauncherFragment` occurring on device rotation. [#6635](https://github.com/mapbox/mapbox-navigation-android/pull/6635)
89

910
## Mapbox Navigation SDK 2.9.2 - 18 November, 2022
1011
### Changelog

libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/permission/PermissionsLauncherFragment.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,21 @@ import androidx.fragment.app.FragmentActivity
1313
/**
1414
* A view-less fragment that requests permissions using [ActivityResultCaller] interface.
1515
*/
16-
internal class PermissionsLauncherFragment(
17-
private val permissions: Array<String>,
18-
private val onResult: ActivityResultCallback<Map<String, Boolean>>
19-
) : Fragment() {
16+
internal class PermissionsLauncherFragment : Fragment() {
2017

18+
private var permissions: Array<String>? = null
19+
private var onResult: ActivityResultCallback<Map<String, Boolean>>? = null
2120
private var launcher: ActivityResultLauncher<Array<String>>? = null
2221

2322
override fun onAttach(context: Context) {
2423
super.onAttach(context)
25-
val missingPermissions = permissions.filter { permission ->
24+
val missingPermissions = permissions?.filter { permission ->
2625
checkSelfPermission(context, permission) != PERMISSION_GRANTED
2726
}
28-
if (missingPermissions.isNotEmpty()) {
29-
launcher = registerForActivityResult(RequestMultiplePermissions(), onResult)
27+
if (!missingPermissions.isNullOrEmpty()) {
28+
launcher = registerForActivityResult(RequestMultiplePermissions()) {
29+
onResult?.onActivityResult(it)
30+
}
3031
launcher?.launch(missingPermissions.toTypedArray())
3132
}
3233
}
@@ -45,9 +46,13 @@ internal class PermissionsLauncherFragment(
4546
onResult: ActivityResultCallback<Map<String, Boolean>>
4647
) {
4748
fragActivity.supportFragmentManager.apply {
49+
val fragment = PermissionsLauncherFragment().apply {
50+
this.permissions = permissions
51+
this.onResult = onResult
52+
}
4853
val t = beginTransaction()
4954
findFragmentByTag(TAG)?.also { t.remove(it) }
50-
t.add(PermissionsLauncherFragment(permissions, onResult), TAG)
55+
t.add(fragment, TAG)
5156
t.commit()
5257
}
5358
}
@@ -56,7 +61,7 @@ internal class PermissionsLauncherFragment(
5661
if (!fragActivity.isFinishing) {
5762
fragActivity.supportFragmentManager.apply {
5863
findFragmentByTag(TAG)?.also {
59-
beginTransaction().remove(it).commit()
64+
beginTransaction().remove(it).commitAllowingStateLoss()
6065
}
6166
}
6267
}

qa-test-app/src/main/java/com/mapbox/navigation/qa_test_app/view/NavigationViewFragmentLifecycleActivity.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class NavigationViewFragmentLifecycleActivity : AppCompatActivity() {
3434
supportFragmentManager.commit {
3535
add(
3636
R.id.navigationViewFragment,
37-
PageNavigationFragment(FIRST_FRAGMENT_TAG),
37+
PageNavigationFragment().apply { this.logTag = FIRST_FRAGMENT_TAG },
3838
FIRST_FRAGMENT_TAG
3939
)
4040
}
@@ -57,9 +57,15 @@ class NavigationViewFragmentLifecycleActivity : AppCompatActivity() {
5757
private fun swapFragments() {
5858
val fragment = supportFragmentManager.findFragmentById(R.id.navigationViewFragment)
5959
val newFragmentPair = if (fragment?.tag == FIRST_FRAGMENT_TAG) {
60-
Pair(PageNavigationFragment(SECOND_FRAGMENT_TAG), SECOND_FRAGMENT_TAG)
60+
Pair(
61+
PageNavigationFragment().apply { this.logTag = SECOND_FRAGMENT_TAG },
62+
SECOND_FRAGMENT_TAG
63+
)
6164
} else {
62-
Pair(PageNavigationFragment(FIRST_FRAGMENT_TAG), FIRST_FRAGMENT_TAG)
65+
Pair(
66+
PageNavigationFragment().apply { this.logTag = FIRST_FRAGMENT_TAG },
67+
FIRST_FRAGMENT_TAG
68+
)
6369
}
6470
supportFragmentManager.commit {
6571
replace(R.id.navigationViewFragment, newFragmentPair.first, newFragmentPair.second)
@@ -69,8 +75,9 @@ class NavigationViewFragmentLifecycleActivity : AppCompatActivity() {
6975
}
7076

7177
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
72-
class PageNavigationFragment(private val logTag: String) : Fragment() {
78+
class PageNavigationFragment : Fragment() {
7379

80+
var logTag: String = ""
7481
var navigationView: NavigationView? = null
7582
private set
7683
private var frame: FrameLayout? = null

0 commit comments

Comments
 (0)