From b9fc82875566a1115f69c6773a9a304b67602581 Mon Sep 17 00:00:00 2001 From: stendler Date: Thu, 30 Oct 2025 10:27:47 +0100 Subject: [PATCH] add error handling to avoid crashes on API parsing --- .../dev/itsvic/parceltracker/MainActivity.kt | 51 ++++++++++--------- .../parceltracker/api/UPSDeliveryService.kt | 4 +- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/dev/itsvic/parceltracker/MainActivity.kt b/app/src/main/java/dev/itsvic/parceltracker/MainActivity.kt index 281adf4..ca76265 100644 --- a/app/src/main/java/dev/itsvic/parceltracker/MainActivity.kt +++ b/app/src/main/java/dev/itsvic/parceltracker/MainActivity.kt @@ -43,6 +43,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.toRoute +import com.squareup.moshi.JsonDataException import dev.itsvic.parceltracker.api.APIKeyMissingException import dev.itsvic.parceltracker.api.Parcel as APIParcel import dev.itsvic.parceltracker.api.ParcelHistoryItem @@ -196,6 +197,13 @@ fun ParcelAppNavigation(parcelToOpen: Int) { LaunchedEffect(parcelWithStatus) { if (dbParcel != null && !dbParcel.isArchived) { + fun apiParcelError(description: String, status: Status): APIParcel { + return APIParcel( + dbParcel.parcelId, + listOf(ParcelHistoryItem(description, LocalDateTime.now(), "")), + status) + } + launch(Dispatchers.IO) { try { apiParcel = @@ -220,33 +228,30 @@ fun ParcelAppNavigation(parcelToOpen: Int) { } catch (e: IOException) { Log.w("MainActivity", "Failed fetch: $e") apiParcel = - APIParcel( - dbParcel.parcelId, - listOf( - ParcelHistoryItem( - context.getString(R.string.network_failure_detail), - LocalDateTime.now(), - "")), - Status.NetworkFailure) + apiParcelError( + context.getString(R.string.network_failure_detail), Status.NetworkFailure) } catch (_: ParcelNonExistentException) { apiParcel = - APIParcel( - dbParcel.parcelId, - listOf( - ParcelHistoryItem( - context.getString(R.string.parcel_doesnt_exist_detail), - LocalDateTime.now(), - "")), - Status.NoData) + apiParcelError( + context.getString(R.string.parcel_doesnt_exist_detail), Status.NoData) } catch (_: APIKeyMissingException) { apiParcel = - APIParcel( - dbParcel.parcelId, - listOf( - ParcelHistoryItem( - context.getString(R.string.error_no_api_key_provided), - LocalDateTime.now(), - "")), + apiParcelError( + context.getString(R.string.error_no_api_key_provided), Status.NetworkFailure) + } catch (e: JsonDataException) { + Log.w( + "MainActivity", + "Unexpected JSON response that could not be converted: ${e.message}") + apiParcel = + apiParcelError( + context.getString(R.string.error_json_conversion).format(e.message), + Status.NetworkFailure) + } catch (e: Exception) { + // catchall to avoid crashes + Log.e("MainActivity", "Unexpected error", e) + apiParcel = + apiParcelError( + context.getString(R.string.error_unexpected_detail).format(e.message), Status.NetworkFailure) } } diff --git a/app/src/main/java/dev/itsvic/parceltracker/api/UPSDeliveryService.kt b/app/src/main/java/dev/itsvic/parceltracker/api/UPSDeliveryService.kt index db13801..9acf4bc 100644 --- a/app/src/main/java/dev/itsvic/parceltracker/api/UPSDeliveryService.kt +++ b/app/src/main/java/dev/itsvic/parceltracker/api/UPSDeliveryService.kt @@ -32,9 +32,7 @@ object UPSDeliveryService : DeliveryService { val tokens = getCsrfTokens(trackingId) val language = LocaleList.getDefault().get(0) - val country = - if (language.country.isEmpty()) defaultRegionsForLanguageCode[language.language] - else language.country + val country = language.country.ifEmpty { defaultRegionsForLanguageCode[language.language] } val locale = "${language.language}_$country" val resp = diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 135f41d..51acf0d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -18,7 +18,9 @@ Protokolle in Datei exportieren Bearbeiten Paket bearbeiten + Beim Parsen der Serverantwort ist ein Fehler aufgetreten, möglicherweise aufgrund einer Änderung der API.\n\nFehlermeldung der JSON Konvertierung:\n%1$s Dieser Zustelldienst erfordert einen API-Schlüssel, aber es wurde keiner angegeben. Weitere Informationen finden Sie in den App-Einstellungen. + Ein unbekannter Fehler ist aufgetreten mit der Nachricht:\n%1$s. Zurück Name darf nicht leer sein. Ignorieren diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b2fdd3f..d13f1dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,7 +19,9 @@ Dump logs to file Edit Edit parcel + There was an error parsing the response, possibly because the API changed.\n\nJSON conversion error message:\n%1$s This delivery service requires an API key, but none was provided. Check the app\'s settings for more information. + An unexpected error was encountered with the message:\n%1$s. Go back Name must not be blank. Ignore