From bbfb7a9af01a6b4c4f2d30e644dd15e8ccf700aa Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 25 Aug 2026 13:16:20 -0700 Subject: [PATCH] fix(android): preserve background location during onboarding (#129543) --- .../java/ai/openclaw/app/ui/OnboardingFlow.kt | 15 +++++++++-- .../app/ui/OnboardingFlowLogicTest.kt | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt b/apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt index 43714943cf6f..9ba82dd72826 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt @@ -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) }, ) diff --git a/apps/android/app/src/test/java/ai/openclaw/app/ui/OnboardingFlowLogicTest.kt b/apps/android/app/src/test/java/ai/openclaw/app/ui/OnboardingFlowLogicTest.kt index 5199cf293a99..5aea5718e2c0 100644 --- a/apps/android/app/src/test/java/ai/openclaw/app/ui/OnboardingFlowLogicTest.kt +++ b/apps/android/app/src/test/java/ai/openclaw/app/ui/OnboardingFlowLogicTest.kt @@ -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,