Skip to content

Commit 06b5f0c

Browse files
committed
fix handling of multiple permission dialogs
1 parent 42cbcbd commit 06b5f0c

File tree

3 files changed

+70
-60
lines changed

3 files changed

+70
-60
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ android {
1212
applicationId "org.blitzortung.android.app"
1313
minSdkVersion 21
1414
targetSdkVersion 35
15-
versionCode 340
15+
versionCode 341
1616
versionName '2.4.0'
1717
multiDexEnabled false
1818
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

app/src/androidTest/java/org/blitzortung/android/app/MainTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ class MainTest {
3838
@Test
3939
fun mainActivity_isLaunched_andMapViewIsDisplayed() {
4040
waitForAndAcceptLocationPermissionDialog()
41-
4241
waitForAndAcceptQuickSettingsDialog()
4342

4443
// Check if the map view is displayed using Espresso

app/src/main/java/org/blitzortung/android/app/Main.kt

Lines changed: 69 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,6 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
136136

137137
private var currentResult: ResultEvent? = null
138138

139-
private var justReturnedFromSettings = false
140-
141139
private val keepZoomOnGotoOwnLocation: Boolean
142140
inline get() = preferences.get(PreferenceKey.KEEP_ZOOM_GOTO_OWN_LOCATION, false)
143141

@@ -152,51 +150,51 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
152150

153151
statusComponent.indicateError(event.failed)
154152
if (!event.failed && sequenceValidator.isUpdate(event.sequenceNumber)) {
155-
currentResult = event
153+
currentResult = event
156154

157-
Log.d(LOG_TAG, "Main.onDataUpdate() $event")
155+
Log.d(LOG_TAG, "Main.onDataUpdate() $event")
158156

159-
val resultParameters = event.parameters
157+
val resultParameters = event.parameters
160158

161-
clearDataIfRequested()
159+
clearDataIfRequested()
162160

163-
val initializeOverlay = strikeListOverlay.parameters != resultParameters
164-
with(strikeListOverlay) {
165-
parameters = resultParameters
166-
gridParameters = event.gridParameters
167-
referenceTime = event.referenceTime
168-
}
161+
val initializeOverlay = strikeListOverlay.parameters != resultParameters
162+
with(strikeListOverlay) {
163+
parameters = resultParameters
164+
gridParameters = event.gridParameters
165+
referenceTime = event.referenceTime
166+
}
169167

170-
if (event.updated >= 0 && !initializeOverlay) {
171-
strikeListOverlay.expireStrikes()
172-
} else {
173-
strikeListOverlay.clear()
174-
}
168+
if (event.updated >= 0 && !initializeOverlay) {
169+
strikeListOverlay.expireStrikes()
170+
} else {
171+
strikeListOverlay.clear()
172+
}
175173

176-
if (event.strikes != null) {
177-
val strikes = if (event.updated > 0 && !initializeOverlay) {
178-
val size = event.strikes.size
179-
event.strikes.subList(size - event.updated, size)
180-
} else {
181-
event.strikes
182-
}
183-
strikeListOverlay.addStrikes(strikes)
174+
if (event.strikes != null) {
175+
val strikes = if (event.updated > 0 && !initializeOverlay) {
176+
val size = event.strikes.size
177+
event.strikes.subList(size - event.updated, size)
178+
} else {
179+
event.strikes
184180
}
181+
strikeListOverlay.addStrikes(strikes)
182+
}
185183

186-
binding.alertView.setColorHandler(
187-
strikeColorHandler,
188-
strikeListOverlay.parameters.intervalDuration
189-
)
184+
binding.alertView.setColorHandler(
185+
strikeColorHandler,
186+
strikeListOverlay.parameters.intervalDuration
187+
)
190188

191-
strikeListOverlay.refresh()
192-
mapFragment.mapView.invalidate()
189+
strikeListOverlay.refresh()
190+
mapFragment.mapView.invalidate()
193191

194-
binding.legendView.requestLayout()
195-
binding.timeSlider.update(event.parameters, event.history!!)
192+
binding.legendView.requestLayout()
193+
binding.timeSlider.update(event.parameters, event.history!!)
196194

197-
if (event.flags.mode == Mode.ANIMATION || !event.containsRealtimeData()) {
198-
setHistoricStatusString()
199-
}
195+
if (event.flags.mode == Mode.ANIMATION || !event.containsRealtimeData()) {
196+
setHistoricStatusString()
197+
}
200198
}
201199

202200
statusComponent.stopProgress()
@@ -456,18 +454,20 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
456454

457455
stopService()
458456

459-
Log.v(LOG_TAG, "Main.onResume() justReturnedFromSettings: $justReturnedFromSettings")
460-
461-
val cameFromSettings = justReturnedFromSettings
462-
if (justReturnedFromSettings) {
463-
justReturnedFromSettings = false
464-
}
457+
Log.v(LOG_TAG, "Main.onResume()")
465458

466459
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
467-
if (!cameFromSettings) {
468-
requestLocationPermissions(preferences)
469-
requestWakeupPermissions(baseContext)
470-
requestNotificationPermissions()
460+
val calls: List<Pair<String, () -> Boolean>> = listOf(
461+
Pair("location", { requestLocationPermissions(preferences) }),
462+
Pair("wakeup", { requestWakeupPermissions(baseContext) }),
463+
Pair("notification", { requestNotificationPermissions() })
464+
)
465+
for (pair in calls) {
466+
val result = pair.second()
467+
Log.v(LOG_TAG, "Main.onResume() permission ${pair.first}: result: $result")
468+
if (result) {
469+
break
470+
}
471471
}
472472
}
473473

@@ -603,28 +603,37 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
603603
if (providerRelation != null) {
604604
val providerName = providerRelation.providerName
605605
if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
606-
Log.i(LOG_TAG, "$providerName permission has now been granted.")
606+
Log.i(
607+
LOG_TAG,
608+
"Main..onRequestPermissionResult() $providerName permission has now been granted. (code $requestCode)"
609+
)
607610
preferences.edit {
608611
put(PreferenceKey.LOCATION_MODE, providerName)
609612
}
610613
locationHandler.update(preferences)
611614
} else {
612-
Log.i(LOG_TAG, "$providerName permission was NOT granted.")
615+
Log.i(
616+
LOG_TAG,
617+
"Main..onRequestPermissionResult() $providerName permission was NOT granted. (code $requestCode)"
618+
)
613619
locationHandler.shutdown()
614620
}
615621
} else {
616622
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
617623
}
618624
}
619625

620-
private fun requestNotificationPermissions() {
621-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
626+
private fun requestNotificationPermissions(): Boolean {
627+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
622628
requestPermission(POST_NOTIFICATIONS, REQUEST_CODE_POST_NOTIFICATIONS, R.string.post_notifications_request)
629+
true
630+
} else {
631+
false
623632
}
624633
}
625634

626635
@RequiresApi(Build.VERSION_CODES.M)
627-
private fun requestLocationPermissions(sharedPreferences: SharedPreferences) {
636+
private fun requestLocationPermissions(sharedPreferences: SharedPreferences): Boolean {
628637
val locationProviderName = sharedPreferences.get(PreferenceKey.LOCATION_MODE, PASSIVE_PROVIDER)
629638
val permission = when (locationProviderName) {
630639
PASSIVE_PROVIDER, GPS_PROVIDER -> ACCESS_FINE_LOCATION
@@ -650,7 +659,6 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
650659
)
651660

652661
val requestCode = (LocationProviderRelation.byProviderName[locationProviderName]?.ordinal ?: Int.MAX_VALUE)
653-
654662
if (requiresBackgroundPermission && isAtLeast(Build.VERSION_CODES.Q)) {
655663
Log.v(
656664
LOG_TAG,
@@ -668,14 +676,17 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
668676
}.setNegativeButton(android.R.string.cancel) { _, _ ->
669677
preferences.edit { put(PreferenceKey.BACKGROUND_QUERY_PERIOD, "0") }
670678
}.show()
671-
}
672-
if (requiresPermission) {
679+
} else if (requiresPermission) {
673680
requestPermission(
674681
permission, requestCode,
675682
R.string.location_permission_required
676683
)
684+
} else {
685+
return false
677686
}
687+
return true
678688
}
689+
return false
679690
}
680691

681692

@@ -685,7 +696,7 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
685696
val permissionIsGranted = checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
686697
Log.v(
687698
LOG_TAG,
688-
"Main.requestPermission() permission: $permission, isGranted: $permissionIsGranted, shouldShowRationale: ${!shouldShowPermissionRationale}"
699+
"Main.requestPermission() permission: $permission, requestCode: $requestCode, isGranted: $permissionIsGranted, shouldShowRationale: ${!shouldShowPermissionRationale}"
689700
)
690701

691702
if (!permissionIsGranted) {
@@ -712,13 +723,12 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
712723
AlertDialog.Builder(this).setMessage(locationText).setCancelable(false)
713724
.setPositiveButton(android.R.string.ok) { dialog, count ->
714725
dialog.dismiss()
715-
justReturnedFromSettings = true
716726
requestPermissions(arrayOf(permission), requestCode)
717727
}.show()
718728
}
719729

720730
@RequiresApi(Build.VERSION_CODES.M)
721-
private fun requestWakeupPermissions(context: Context) {
731+
private fun requestWakeupPermissions(context: Context): Boolean {
722732
Log.v(LOG_TAG, "requestWakeupPermissions() background alerts: $backgroundAlertEnabled")
723733

724734
if (backgroundAlertEnabled) {
@@ -737,7 +747,6 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
737747
val allowIgnoreBatteryOptimization =
738748
context.checkSelfPermission(REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) == PackageManager.PERMISSION_GRANTED
739749
val intent = if (allowIgnoreBatteryOptimization) {
740-
justReturnedFromSettings = true
741750
Intent(
742751
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
743752
"package:$packageName".toUri()
@@ -771,11 +780,13 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
771780
AlertDialog.Builder(this).setMessage(locationText)
772781
.setPositiveButton(android.R.string.ok, dialogClickListener)
773782
.setNegativeButton(android.R.string.cancel, dialogClickListener).show()
783+
return true
774784
}
775785
} else {
776786
Log.w(LOG_TAG, "requestWakeupPermissions() could not get PowerManager")
777787
}
778788
}
789+
return false
779790
}
780791

781792
private enum class LocationProviderRelation(val providerName: String) {

0 commit comments

Comments
 (0)