From fc49eae5127e19aa81cbb94c0549edd631391231 Mon Sep 17 00:00:00 2001 From: admin Date: Sat, 18 Jul 2026 16:29:34 +0200 Subject: [PATCH] =?UTF-8?q?Zatrzymaj=20aktywny=20kurs=20po=20wyga=C5=9Bni?= =?UTF-8?q?=C4=99ciu=20sesji?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kierowca/data/upload/RoutePointWorker.kt | 7 ++++- .../tracking/ActiveRouteTrackingService.kt | 7 +++++ .../firmatpp/kierowca/ui/DriverViewModel.kt | 26 ++++++++++++------- .../data/upload/RoutePointWorkerRulesTest.kt | 11 ++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/pl/firmatpp/kierowca/data/upload/RoutePointWorker.kt b/app/src/main/java/pl/firmatpp/kierowca/data/upload/RoutePointWorker.kt index fec1227..a6b62fb 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/data/upload/RoutePointWorker.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/data/upload/RoutePointWorker.kt @@ -67,9 +67,11 @@ class RoutePointWorker( "retryable" to error.retryable, ), ) + if (shouldStopRouteTrackingAfterPointError(error.kind, error.code)) { + ActiveRouteTrackingService.stop(applicationContext, routeId) + } if (isInactiveRoutePointError(error.code)) { dao.delete(pointIds) - ActiveRouteTrackingService.stop(applicationContext, routeId) continue } @@ -105,3 +107,6 @@ class RoutePointWorker( } internal fun isInactiveRoutePointError(code: String?): Boolean = code == "ROUTE_POINTS_INVALID_STATUS" + +internal fun shouldStopRouteTrackingAfterPointError(kind: ApiErrorKind, code: String?): Boolean = + kind == ApiErrorKind.Auth || isInactiveRoutePointError(code) diff --git a/app/src/main/java/pl/firmatpp/kierowca/tracking/ActiveRouteTrackingService.kt b/app/src/main/java/pl/firmatpp/kierowca/tracking/ActiveRouteTrackingService.kt index b048f80..859f3b3 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/tracking/ActiveRouteTrackingService.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/tracking/ActiveRouteTrackingService.kt @@ -136,6 +136,13 @@ class ActiveRouteTrackingService : Service(), LocationListener { override fun onDestroy() { runCatching { locationManager.removeUpdates(this) } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } else { + @Suppress("DEPRECATION") + stopForeground(true) + } + getSystemService(NotificationManager::class.java).cancel(NOTIFICATION_ID) getSharedPreferences(TRACKING_PREFERENCES, Context.MODE_PRIVATE) .edit() .remove(ACTIVE_ROUTE_ID) diff --git a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt index 5b2f305..78ea18e 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt @@ -463,15 +463,14 @@ class DriverViewModel(application: Application) : AndroidViewModel(application) }.onFailure { throwable -> if (generation != routesRequestGeneration) return@onFailure reportHandledException("load_routes", throwable, mapOf("date" to date)) - _state.update { - val apiError = ApiErrorMapper.map(throwable) - it.withApiError(throwable).copy( - screen = when { - apiError.kind == ApiErrorKind.Auth -> DriverScreen.Phone - it.screen == DriverScreen.Initializing -> DriverScreen.Routes - else -> it.screen - }, - ) + if (ApiErrorMapper.map(throwable).kind == ApiErrorKind.Auth) { + handleExpiredSession() + } else { + _state.update { + it.withApiError(throwable).copy( + screen = if (it.screen == DriverScreen.Initializing) DriverScreen.Routes else it.screen, + ) + } } } @@ -548,7 +547,12 @@ class DriverViewModel(application: Application) : AndroidViewModel(application) } } .onFailure { throwable -> - if (generation == routeDetailRequestGeneration) _state.update { it.withApiError(throwable) } + if (generation != routeDetailRequestGeneration) return@onFailure + if (ApiErrorMapper.map(throwable).kind == ApiErrorKind.Auth) { + handleExpiredSession() + } else { + _state.update { it.withApiError(throwable) } + } } if (generation == routeDetailRequestGeneration) _state.update { it.copy(refreshing = false) } @@ -1455,6 +1459,7 @@ class DriverViewModel(application: Application) : AndroidViewModel(application) dispatchSheetUploadsJob?.cancel() realtimeBannerJob?.cancel() liveSyncClient.stop() + ActiveRouteTrackingService.stop(getApplication()) offlineOutboxManager.clearAll() repository.logout(notifyServer = _state.value.isOnline) syncRepository.clearCache() @@ -1665,6 +1670,7 @@ class DriverViewModel(application: Application) : AndroidViewModel(application) private suspend fun handleExpiredSession() { liveSyncClient.stop() + ActiveRouteTrackingService.stop(getApplication()) offlineOutboxManager.clearAll() repository.logout(notifyServer = false) syncRepository.clearCache() diff --git a/app/src/test/java/pl/firmatpp/kierowca/data/upload/RoutePointWorkerRulesTest.kt b/app/src/test/java/pl/firmatpp/kierowca/data/upload/RoutePointWorkerRulesTest.kt index 8aa5272..9064a64 100644 --- a/app/src/test/java/pl/firmatpp/kierowca/data/upload/RoutePointWorkerRulesTest.kt +++ b/app/src/test/java/pl/firmatpp/kierowca/data/upload/RoutePointWorkerRulesTest.kt @@ -3,6 +3,7 @@ package pl.firmatpp.kierowca.data.upload import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test +import pl.firmatpp.kierowca.data.ApiErrorKind class RoutePointWorkerRulesTest { @Test @@ -15,4 +16,14 @@ class RoutePointWorkerRulesTest { assertFalse(isInactiveRoutePointError("SERVER_UNAVAILABLE")) assertFalse(isInactiveRoutePointError(null)) } + + @Test + fun revokedSessionStopsRouteTracking() { + assertTrue(shouldStopRouteTrackingAfterPointError(ApiErrorKind.Auth, null)) + } + + @Test + fun temporaryFailureKeepsRouteTrackingActive() { + assertFalse(shouldStopRouteTrackingAfterPointError(ApiErrorKind.Server, "SERVER_UNAVAILABLE")) + } }