fix(android): preserve background location during onboarding (#129543)

This commit is contained in:
Peter Steinberger
2026-08-25 13:16:20 -07:00
committed by GitHub
parent 5dd1a39e86
commit bbfb7a9af0
2 changed files with 38 additions and 2 deletions
@@ -15,6 +15,7 @@ import ai.openclaw.app.i18n.nativeString
import ai.openclaw.app.i18n.nativeText
import ai.openclaw.app.i18n.resolveNativeTextResource
import ai.openclaw.app.i18n.verbatimText
import ai.openclaw.app.locationModeAfterBackgroundSettings
import ai.openclaw.app.node.DeviceNotificationListenerService
import ai.openclaw.app.photoReadPermissionsForRequest
import ai.openclaw.app.ui.design.ClawDesignTheme
@@ -3310,6 +3311,16 @@ private fun rememberPermissionState(
},
)
val requestedLocationMode =
locationModeAfterBackgroundSettings(
previousMode = currentLocationMode.takeUnless { it == LocationMode.Off } ?: LocationMode.WhileUsing,
foregroundGranted = locationGranted,
backgroundGranted =
currentLocationMode == LocationMode.Always &&
SensitiveFeatureConfig.backgroundLocationEnabled &&
hasPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION),
)
return PermissionState(
rows = rows,
requiresNodeApprovalAfterApply =
@@ -3317,13 +3328,13 @@ private fun rememberPermissionState(
currentCameraEnabled = currentCameraEnabled,
requestedCameraEnabled = cameraGranted,
currentLocationMode = currentLocationMode,
requestedLocationMode = if (locationGranted) LocationMode.WhileUsing else LocationMode.Off,
requestedLocationMode = requestedLocationMode,
currentSmsGranted = currentSmsGranted,
requestedSmsGranted = smsGranted,
),
applyToViewModel = {
viewModel.setCameraEnabled(cameraGranted)
viewModel.setLocationMode(if (locationGranted) LocationMode.WhileUsing else LocationMode.Off)
viewModel.setLocationMode(requestedLocationMode)
viewModel.setNotificationForwardingEnabled(notificationListenerGranted)
},
)
@@ -228,6 +228,31 @@ class OnboardingFlowLogicTest {
currentLocationMode = LocationMode.WhileUsing,
requestedLocationMode = LocationMode.WhileUsing,
),
PermissionApprovalCase(
expected = false,
currentLocationMode = LocationMode.Always,
requestedLocationMode = LocationMode.Always,
),
PermissionApprovalCase(
expected = true,
currentLocationMode = LocationMode.Always,
requestedLocationMode = LocationMode.WhileUsing,
),
PermissionApprovalCase(
expected = true,
currentLocationMode = LocationMode.Always,
requestedLocationMode = LocationMode.Off,
),
PermissionApprovalCase(
expected = true,
currentLocationMode = LocationMode.WhileUsing,
requestedLocationMode = LocationMode.Always,
),
PermissionApprovalCase(
expected = true,
currentLocationMode = LocationMode.Off,
requestedLocationMode = LocationMode.Always,
),
).forEach { case ->
assertBoolean(
case.expected,