diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerUiState.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerUiState.kt index 19aa5bae..01196aee 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerUiState.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerUiState.kt @@ -5,6 +5,7 @@ import com.gravatar.quickeditor.data.repository.EmailAvatars import com.gravatar.quickeditor.ui.editor.AvatarPickerContentLayout import com.gravatar.restapi.models.Avatar import com.gravatar.restapi.models.Profile +import com.gravatar.services.ErrorType import com.gravatar.types.Email import com.gravatar.ui.components.ComponentState @@ -81,7 +82,7 @@ internal data class AvatarsSectionUiState( internal data class AvatarUploadFailure( val uri: Uri, - val error: String?, + val error: ErrorType?, ) internal sealed class AvatarUi(val avatarId: String) { diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt index d0067f19..31dc1726 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt @@ -184,8 +184,7 @@ internal class AvatarPickerViewModel( scrollToIndex = null, failedUploads = currentState.failedUploads + AvatarUploadFailure( uri, - error = ((result.error as? QuickEditorError.Request)?.type as? ErrorType.InvalidRequest) - ?.error?.error, + error = (result.error as? QuickEditorError.Request)?.type, ), ) } @@ -266,6 +265,7 @@ internal class AvatarPickerViewModel( ErrorType.Timeout, is ErrorType.Unknown, is ErrorType.InvalidRequest, + ErrorType.ContentLengthExceeded, -> SectionError.Unknown } } diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/FailedAvatarUploadAlertDialog.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/FailedAvatarUploadAlertDialog.kt index bb26648f..70269e97 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/FailedAvatarUploadAlertDialog.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/FailedAvatarUploadAlertDialog.kt @@ -9,6 +9,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.gravatar.quickeditor.R import com.gravatar.quickeditor.ui.avatarpicker.AvatarUploadFailure +import com.gravatar.services.ErrorType import com.gravatar.ui.GravatarTheme @Composable @@ -26,7 +27,15 @@ internal fun FailedAvatarUploadAlertDialog( Text(text = stringResource(id = R.string.avatar_upload_failure_dialog_title)) }, text = { - avatarUploadFailure.error?.let { Text(text = it) } + avatarUploadFailure.error?.let { + when (it) { + is ErrorType.InvalidRequest -> it.error?.error + is ErrorType.ContentLengthExceeded -> stringResource( + id = R.string.gravatar_avatar_upload_failure_image_too_big, + ) + else -> null + }?.let { errorString -> Text(text = errorString) } + } }, confirmButton = { TextButton( @@ -47,7 +56,7 @@ internal fun FailedAvatarUploadAlertDialog( @Composable private fun FailedAvatarUploadAlertDialogPreview() { FailedAvatarUploadAlertDialog( - avatarUploadFailure = AvatarUploadFailure(Uri.EMPTY, "Error message"), + avatarUploadFailure = AvatarUploadFailure(Uri.EMPTY, ErrorType.ContentLengthExceeded), onRemoveUploadClicked = {}, onRetryClicked = {}, onDismiss = {}, diff --git a/gravatar-quickeditor/src/main/res/values/strings.xml b/gravatar-quickeditor/src/main/res/values/strings.xml index fe8b6395..a97a8414 100644 --- a/gravatar-quickeditor/src/main/res/values/strings.xml +++ b/gravatar-quickeditor/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ Upload failed, tap to see actions. Couldn\'t upload image Remove upload + The provided image exceeds the maximum size: 10MB Something went wrong when verifying your email. Permission required To take a picture, you need to grant camera permission. You can grant it in the app settings. diff --git a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt index fada864c..b6c8599d 100644 --- a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt +++ b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt @@ -440,7 +440,7 @@ class AvatarPickerViewModelTest { avatarPickerUiState.copy( uploadingAvatar = null, scrollToIndex = null, - failedUploads = setOf(AvatarUploadFailure(uri, errorMessage)), + failedUploads = setOf(AvatarUploadFailure(uri, invalidRequest.type)), ), awaitItem(), ) @@ -550,7 +550,7 @@ class AvatarPickerViewModelTest { scrollToIndex = 0, avatarPickerContentLayout = avatarPickerContentLayout, failedUploads = setOf( - AvatarUploadFailure(uriOne, errorMessage), + AvatarUploadFailure(uriOne, invalidRequest.type), ), ) assertEquals( @@ -597,7 +597,7 @@ class AvatarPickerViewModelTest { expectMostRecentItem() viewModel.onEvent(AvatarPickerEvent.FailedAvatarTapped(uri)) - assertEquals(AvatarUploadFailure(uri, errorMessage), awaitItem().failedUploadDialog) + assertEquals(AvatarUploadFailure(uri, invalidRequest.type), awaitItem().failedUploadDialog) } } @@ -649,7 +649,7 @@ class AvatarPickerViewModelTest { val awaitItem = awaitItem() assertEquals(null, awaitItem.failedUploadDialog) - assertEquals(setOf(AvatarUploadFailure(uri, errorMessage)), awaitItem.failedUploads) + assertEquals(setOf(AvatarUploadFailure(uri, invalidRequest.type)), awaitItem.failedUploads) } } diff --git a/gravatar/api/gravatar.api b/gravatar/api/gravatar.api index 34ef9baa..5743ecb3 100644 --- a/gravatar/api/gravatar.api +++ b/gravatar/api/gravatar.api @@ -654,6 +654,13 @@ public final class com/gravatar/services/AvatarService { public abstract class com/gravatar/services/ErrorType { } +public final class com/gravatar/services/ErrorType$ContentLengthExceeded : com/gravatar/services/ErrorType { + public static final field INSTANCE Lcom/gravatar/services/ErrorType$ContentLengthExceeded; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + public final class com/gravatar/services/ErrorType$InvalidRequest : com/gravatar/services/ErrorType { public fun (Lcom/gravatar/restapi/models/Error;)V public fun equals (Ljava/lang/Object;)Z diff --git a/gravatar/src/main/java/com/gravatar/HttpResponseCode.kt b/gravatar/src/main/java/com/gravatar/HttpResponseCode.kt index 8e3dc0da..cf22cb0d 100644 --- a/gravatar/src/main/java/com/gravatar/HttpResponseCode.kt +++ b/gravatar/src/main/java/com/gravatar/HttpResponseCode.kt @@ -7,6 +7,7 @@ internal object HttpResponseCode { const val HTTP_TOO_MANY_REQUESTS = 429 const val UNAUTHORIZED = 401 const val INVALID_REQUEST = 400 + const val CONTENT_TOO_LARGE = 413 private const val HTTP_INTERNAL_ERROR = 500 private const val NETWORK_CONNECT_TIMEOUT_ERROR = 599 diff --git a/gravatar/src/main/java/com/gravatar/services/ErrorType.kt b/gravatar/src/main/java/com/gravatar/services/ErrorType.kt index e2002b24..24db238b 100644 --- a/gravatar/src/main/java/com/gravatar/services/ErrorType.kt +++ b/gravatar/src/main/java/com/gravatar/services/ErrorType.kt @@ -18,7 +18,7 @@ internal fun HttpException.errorTypeFromHttpCode(moshi: Moshi): ErrorType = when }.getOrNull() ErrorType.InvalidRequest(error) } - + HttpResponseCode.CONTENT_TOO_LARGE -> ErrorType.ContentLengthExceeded in HttpResponseCode.SERVER_ERRORS -> ErrorType.Server else -> ErrorType.Unknown("HTTP Code $code - ErrorBody $rawErrorBody") } @@ -54,6 +54,9 @@ public sealed class ErrorType { /** User not authorized to perform given action **/ public data object Unauthorized : ErrorType() + /** Content length exceeded **/ + public data object ContentLengthExceeded : ErrorType() + /** * An unknown error occurred * diff --git a/gravatar/src/test/java/com/gravatar/services/ErrorTypeTest.kt b/gravatar/src/test/java/com/gravatar/services/ErrorTypeTest.kt index 12cbb86a..d22e95b3 100644 --- a/gravatar/src/test/java/com/gravatar/services/ErrorTypeTest.kt +++ b/gravatar/src/test/java/com/gravatar/services/ErrorTypeTest.kt @@ -1,5 +1,6 @@ package com.gravatar.services +import com.gravatar.HttpResponseCode.CONTENT_TOO_LARGE import com.gravatar.HttpResponseCode.HTTP_CLIENT_TIMEOUT import com.gravatar.HttpResponseCode.HTTP_NOT_FOUND import com.gravatar.HttpResponseCode.HTTP_TOO_MANY_REQUESTS @@ -39,6 +40,7 @@ class ErrorTypeTest { error = "Only square images are accepted" }, ), + CONTENT_TOO_LARGE to ErrorType.ContentLengthExceeded, ).apply { SERVER_ERRORS.forEach { code -> add(code to ErrorType.Server)