From 3a6f7be80836f62fc1581843453465592380f090 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Wed, 26 Jun 2024 11:58:12 +0530 Subject: [PATCH] fix(android): surface upstream downtime more prominently --- .../claw/android/paging/LobstersPagingSource.kt | 3 ++- .../claw/android/paging/SearchPagingSource.kt | 3 ++- .../kotlin/dev/msfjarvis/claw/android/ui/ext.kt | 17 +++++++++++++++++ .../claw/android/viewmodel/ClawViewModel.kt | 12 +++--------- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt index ee50f56e..6487ab44 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt @@ -13,6 +13,7 @@ import com.slack.eithernet.ApiResult.Success import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import dev.msfjarvis.claw.android.ui.toError import dev.msfjarvis.claw.android.viewmodel.ReadPostsRepository import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository import dev.msfjarvis.claw.core.injection.IODispatcher @@ -62,7 +63,7 @@ constructor( ) is Failure.NetworkFailure -> LoadResult.Error(result.error) is Failure.UnknownFailure -> LoadResult.Error(result.error) - is Failure.HttpFailure, + is Failure.HttpFailure -> LoadResult.Error(result.toError()) is Failure.ApiFailure -> LoadResult.Error(IOException("API returned an invalid response")) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/SearchPagingSource.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/SearchPagingSource.kt index 35ec2204..32132b72 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/SearchPagingSource.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/SearchPagingSource.kt @@ -14,6 +14,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dev.msfjarvis.claw.android.paging.LobstersPagingSource.Companion.PAGE_SIZE import dev.msfjarvis.claw.android.paging.LobstersPagingSource.Companion.STARTING_PAGE_INDEX +import dev.msfjarvis.claw.android.ui.toError import dev.msfjarvis.claw.android.viewmodel.ReadPostsRepository import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository import dev.msfjarvis.claw.api.LobstersSearchApi @@ -80,7 +81,7 @@ constructor( } is ApiResult.Failure.NetworkFailure -> LoadResult.Error(result.error) is ApiResult.Failure.UnknownFailure -> LoadResult.Error(result.error) - is ApiResult.Failure.HttpFailure, + is ApiResult.Failure.HttpFailure -> LoadResult.Error(result.toError()) is ApiResult.Failure.ApiFailure -> LoadResult.Error(IOException("API returned an invalid response")) } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt index 3fa6f72c..01208097 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt @@ -13,12 +13,15 @@ import androidx.activity.ComponentActivity import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.navigation.NavController +import com.slack.eithernet.ApiResult import dev.msfjarvis.claw.android.ui.navigation.Destinations import dev.msfjarvis.claw.android.viewmodel.ClawViewModel import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.urllauncher.UrlLauncher import dev.msfjarvis.claw.model.LinkMetadata import dev.msfjarvis.claw.model.UIPost +import java.io.IOException +import java.net.HttpURLConnection fun Context.getActivity(): ComponentActivity? { return when (this) { @@ -80,3 +83,17 @@ fun rememberPostActions( } } } + +/** + * Convert an [ApiResult.Failure.HttpFailure] to a scoped down error with a more useful user-facing + * message. + */ +@Suppress("NOTHING_TO_INLINE") // We inline this to eliminate the stacktrace frame. +inline fun ApiResult.Failure.HttpFailure.toError(): Throwable = + when (code) { + HttpURLConnection.HTTP_NOT_FOUND -> IOException("Story was removed by moderator") + HttpURLConnection.HTTP_INTERNAL_ERROR, + HttpURLConnection.HTTP_BAD_GATEWAY, + HttpURLConnection.HTTP_UNAVAILABLE -> IOException("It appears lobste.rs is currently down") + else -> IOException("API returned an invalid response") + } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index a2c72580..d1cfb3e1 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -29,6 +29,7 @@ import dev.msfjarvis.claw.android.paging.LobstersPagingSource import dev.msfjarvis.claw.android.paging.LobstersPagingSource.Companion.PAGE_SIZE import dev.msfjarvis.claw.android.paging.LobstersPagingSource.Companion.STARTING_PAGE_INDEX import dev.msfjarvis.claw.android.paging.SearchPagingSource +import dev.msfjarvis.claw.android.ui.toError import dev.msfjarvis.claw.api.LobstersApi import dev.msfjarvis.claw.core.injection.IODispatcher import dev.msfjarvis.claw.core.injection.MainDispatcher @@ -39,7 +40,6 @@ import dev.msfjarvis.claw.model.toUIPost import java.io.IOException import java.io.InputStream import java.io.OutputStream -import java.net.HttpURLConnection import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter @@ -139,13 +139,7 @@ constructor( is Success -> result.value.toUIPost() is Failure.NetworkFailure -> throw result.error is Failure.UnknownFailure -> throw result.error - is Failure.HttpFailure -> { - if (result.code == HttpURLConnection.HTTP_NOT_FOUND) { - throw IOException("Story was removed by moderator") - } else { - throw IOException("API returned an invalid response") - } - } + is Failure.HttpFailure -> throw result.toError() is Failure.ApiFailure -> throw IOException("API returned an invalid response") } } @@ -165,7 +159,7 @@ constructor( is Success -> result.value is Failure.NetworkFailure -> throw result.error is Failure.UnknownFailure -> throw result.error - is Failure.HttpFailure, + is Failure.HttpFailure -> throw result.toError() is Failure.ApiFailure -> throw IOException("API returned an invalid response") } }