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)