diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt index f01b2af5..7ee3bcc4 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt @@ -59,14 +59,14 @@ fun parseDate(dateAsString: String): Calendar { fun checkErrorCallParsed(mockWebServerRule: MockWebServerRule, apiRequest: () -> Response): T { - mockWebServerRule.enqueueResponse("generic_error_response.json") + mockWebServerRule.enqueueResponse("request_data_not_found_error_response.json") val response = apiRequest() assertResponseSuccessful(response) with(response.body()) { status `should be` SubsonicResponse.Status.ERROR - error `should be` SubsonicError.GENERIC + error `should be` SubsonicError.RequestedDataWasNotFound } return response.body() } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt new file mode 100644 index 00000000..34234a73 --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt @@ -0,0 +1,51 @@ +package org.moire.ultrasonic.api.subsonic + +import org.amshove.kluent.`should equal` +import org.amshove.kluent.`should not be` +import org.amshove.kluent.`should throw` +import org.junit.Test +import org.moire.ultrasonic.api.subsonic.SubsonicError.Generic +import org.moire.ultrasonic.api.subsonic.SubsonicError.WrongUsernameOrPassword +import org.moire.ultrasonic.api.subsonic.response.SubsonicResponse +import retrofit2.Response +import java.io.IOException + +/** + * Integration test that checks validity of api errors parsing. + */ +class SubsonicApiErrorsTest : SubsonicAPIClientTest() { + @Test + fun `Should parse wrong username or password error`() { + mockWebServerRule.enqueueResponse("wrong_username_or_password_error.json") + + val response = client.api.ping().execute() + + response.assertError(WrongUsernameOrPassword) + } + + @Test + fun `Should parse generic error with message`() { + mockWebServerRule.enqueueResponse("generic_error.json") + + val response = client.api.ping().execute() + + response.assertError(Generic("Some generic error message.")) + } + + @Test + fun `Should fail on unknown error`() { + mockWebServerRule.enqueueResponse("unexpected_error.json") + + val fail = { + client.api.ping().execute() + } + + fail `should throw` IOException::class + } + + private fun Response.assertError(expectedError: SubsonicError) = + with(body()) { + error `should not be` null + error `should equal` expectedError + } +} diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt index deeab4a3..91acfe65 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt @@ -13,14 +13,14 @@ import org.junit.Test class SubsonicApiGetAvatarTest : SubsonicAPIClientTest() { @Test fun `Should handle api error response`() { - mockWebServerRule.enqueueResponse("generic_error_response.json") + mockWebServerRule.enqueueResponse("request_data_not_found_error_response.json") val response = client.getAvatar("some") with(response) { stream `should be` null responseHttpCode `should equal to` 200 - apiError `should equal` SubsonicError.GENERIC + apiError `should equal` SubsonicError.RequestedDataWasNotFound } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt index 3b22d396..d327e06c 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt @@ -13,14 +13,14 @@ import org.junit.Test class SubsonicApiGetCoverArtTest : SubsonicAPIClientTest() { @Test fun `Should handle api error response`() { - mockWebServerRule.enqueueResponse("generic_error_response.json") + mockWebServerRule.enqueueResponse("request_data_not_found_error_response.json") val response = client.getCoverArt("some-id") with(response) { stream `should be` null responseHttpCode `should equal to` 200 - apiError `should equal` SubsonicError.GENERIC + apiError `should equal` SubsonicError.RequestedDataWasNotFound } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt index b0255d66..730ee8a1 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt @@ -13,14 +13,14 @@ import org.junit.Test class SubsonicApiStreamTest : SubsonicAPIClientTest() { @Test fun `Should handle api error response`() { - mockWebServerRule.enqueueResponse("generic_error_response.json") + mockWebServerRule.enqueueResponse("request_data_not_found_error_response.json") val response = client.stream("some-id") with(response) { stream `should be` null responseHttpCode `should equal to` 200 - apiError `should equal` SubsonicError.GENERIC + apiError `should equal` SubsonicError.RequestedDataWasNotFound } } diff --git a/subsonic-api/src/integrationTest/resources/generic_error.json b/subsonic-api/src/integrationTest/resources/generic_error.json new file mode 100644 index 00000000..7118efc9 --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/generic_error.json @@ -0,0 +1,10 @@ +{ + "subsonic-response": { + "status": "failed", + "version": "1.15.0", + "error": { + "code": 0, + "message": "Some generic error message." + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/generic_error_response.json b/subsonic-api/src/integrationTest/resources/request_data_not_found_error_response.json similarity index 60% rename from subsonic-api/src/integrationTest/resources/generic_error_response.json rename to subsonic-api/src/integrationTest/resources/request_data_not_found_error_response.json index 1b5db1cc..bd97c058 100644 --- a/subsonic-api/src/integrationTest/resources/generic_error_response.json +++ b/subsonic-api/src/integrationTest/resources/request_data_not_found_error_response.json @@ -3,8 +3,8 @@ "status" : "failed", "version" : "1.13.0", "error" : { - "code" : 0, - "message" : "Generic error." + "code" : 70, + "message" : "Requested data was not found." } } } \ No newline at end of file diff --git a/subsonic-api/src/integrationTest/resources/unexpected_error.json b/subsonic-api/src/integrationTest/resources/unexpected_error.json new file mode 100644 index 00000000..fce1661b --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/unexpected_error.json @@ -0,0 +1,10 @@ +{ + "subsonic-response": { + "status": "failed", + "version": "1.15.0", + "error": { + "code": 1000000, + "message": "New funky error message." + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/wrong_username_or_password_error.json b/subsonic-api/src/integrationTest/resources/wrong_username_or_password_error.json new file mode 100644 index 00000000..a35e593b --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/wrong_username_or_password_error.json @@ -0,0 +1,10 @@ +{ + "subsonic-response": { + "status": "failed", + "version": "1.15.0", + "error": { + "code": 40, + "message": "Wrong username or password." + } + } +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt index 06bbd508..89559cb2 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt @@ -9,29 +9,41 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize * Common API errors. */ @JsonDeserialize(using = SubsonicError.Companion.SubsonicErrorDeserializer::class) -enum class SubsonicError(val code: Int) { - GENERIC(0), - REQUIRED_PARAM_MISSING(10), - INCOMPATIBLE_CLIENT_PROTOCOL_VERSION(20), - INCOMPATIBLE_SERVER_PROTOCOL_VERSION(30), - WRONG_USERNAME_OR_PASSWORD(40), - TOKEN_AUTH_NOT_SUPPORTED_FOR_LDAP(41), - USER_NOT_AUTHORIZED_FOR_OPERATION(50), - TRIAL_PERIOD_IS_OVER(60), - REQUESTED_DATA_WAS_NOT_FOUND(70); +sealed class SubsonicError(val code: Int) { + data class Generic(val message: String) : SubsonicError(0) + object RequiredParamMissing : SubsonicError(10) + object IncompatibleClientProtocolVersion : SubsonicError(20) + object IncompatibleServerProtocolVersion : SubsonicError(30) + object WrongUsernameOrPassword : SubsonicError(40) + object TokenAuthNotSupportedForLDAP : SubsonicError(41) + object UserNotAuthorizedForOperation : SubsonicError(50) + object TrialPeriodIsOver : SubsonicError(60) + object RequestedDataWasNotFound : SubsonicError(70) companion object { - fun parseErrorFromJson(jsonErrorCode: Int) = SubsonicError.values() - .filter { it.code == jsonErrorCode }.firstOrNull() - ?: throw IllegalArgumentException("Unknown code $jsonErrorCode") + fun getError(code: Int, message: String) = when (code) { + 0 -> Generic(message) + 10 -> RequiredParamMissing + 20 -> IncompatibleClientProtocolVersion + 30 -> IncompatibleServerProtocolVersion + 40 -> WrongUsernameOrPassword + 41 -> TokenAuthNotSupportedForLDAP + 50 -> UserNotAuthorizedForOperation + 60 -> TrialPeriodIsOver + 70 -> RequestedDataWasNotFound + else -> throw IllegalArgumentException("Unknown code $code") + } class SubsonicErrorDeserializer : JsonDeserializer() { override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): SubsonicError { - p.nextToken() // "code" - val error = parseErrorFromJson(p.valueAsInt) - p.nextToken() // "message" - p.nextToken() // end of error object - return error + p.nextToken() // { -> "code" + p.nextToken() // "code" -> codeValue + val code = p.valueAsInt + p.nextToken() // codeValue -> "message" + p.nextToken() // "message" -> messageValue + val message = p.text + p.nextToken() // value -> } + return getError(code, message) } } } diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt deleted file mode 100644 index 28258de9..00000000 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.moire.ultrasonic.api.subsonic - -import org.amshove.kluent.`should equal` -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.Parameterized - -/** - * Unit test for [SubsonicError]. - */ -@RunWith(Parameterized::class) -class SubsonicErrorTest(private val error: SubsonicError) { - companion object { - @JvmStatic - @Parameterized.Parameters - fun data(): List = SubsonicError.values().toList() - } - - @Test - fun `Should proper convert error code to error`() { - SubsonicError.parseErrorFromJson(error.code) `should equal` error - } - - @Test(expected = IllegalArgumentException::class) - fun `Should throw IllegalArgumentException from unknown error code`() { - SubsonicError.parseErrorFromJson(error.code + 10000) - } -} diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt index 76085241..ee3c0253 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.api.subsonic.response import org.amshove.kluent.`should equal to` import org.junit.Test -import org.moire.ultrasonic.api.subsonic.SubsonicError.GENERIC +import org.moire.ultrasonic.api.subsonic.SubsonicError.RequestedDataWasNotFound /** * Unit test for [StreamResponse]. @@ -10,7 +10,8 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError.GENERIC class StreamResponseTest { @Test fun `Should have error if subsonic error is not null`() { - StreamResponse(apiError = GENERIC, responseHttpCode = 200).hasError() `should equal to` true + StreamResponse(apiError = RequestedDataWasNotFound, responseHttpCode = 200) + .hasError() `should equal to` true } @Test diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/JukeboxService.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/JukeboxService.java index 849d73ac..4d85b0b6 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/JukeboxService.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/JukeboxService.java @@ -31,7 +31,6 @@ import org.moire.ultrasonic.R; import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException; import org.moire.ultrasonic.domain.JukeboxStatus; import org.moire.ultrasonic.domain.PlayerState; -import org.moire.ultrasonic.service.parser.SubsonicRESTException; import org.moire.ultrasonic.util.Util; import java.util.ArrayList; diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java index 41b57e72..d9c7ca7d 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java @@ -89,7 +89,6 @@ import org.moire.ultrasonic.domain.SearchCriteria; import org.moire.ultrasonic.domain.SearchResult; import org.moire.ultrasonic.domain.Share; import org.moire.ultrasonic.domain.UserInfo; -import org.moire.ultrasonic.service.parser.SubsonicRESTException; import org.moire.ultrasonic.util.CancellableTask; import org.moire.ultrasonic.util.FileUtil; import org.moire.ultrasonic.util.ProgressListener; @@ -1077,7 +1076,7 @@ public class RESTMusicService implements MusicService { } private void checkResponseSuccessful(@NonNull final Response response) - throws IOException { + throws SubsonicRESTException, IOException { if (response.isSuccessful() && response.body().getStatus() == SubsonicResponse.Status.OK) { return; @@ -1087,7 +1086,7 @@ public class RESTMusicService implements MusicService { throw new IOException("Server error, code: " + response.code()); } else if (response.body().getStatus() == SubsonicResponse.Status.ERROR && response.body().getError() != null) { - throw new IOException("Server error: " + response.body().getError().getCode()); + throw new SubsonicRESTException(response.body().getError()); } else { throw new IOException("Failed to perform request: " + response.code()); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/parser/SubsonicRESTException.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/parser/SubsonicRESTException.java deleted file mode 100644 index 5ffbc3dd..00000000 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/parser/SubsonicRESTException.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.moire.ultrasonic.service.parser; - -import org.moire.ultrasonic.api.subsonic.SubsonicError; - -/** - * Exception returned by API with given {@code code}. - * - * @author Sindre Mehus - * @version $Id$ - */ -public class SubsonicRESTException extends Exception { - private final SubsonicError error; - - public SubsonicRESTException(final SubsonicError error) { - super("Api error: " + error.name()); - this.error = error; - } - - public int getCode() - { - return error.getCode(); - } - - public SubsonicError getError() { - return error; - } -} diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/BackgroundTask.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/BackgroundTask.java index 4909a55b..ae47bdcb 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/BackgroundTask.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/BackgroundTask.java @@ -25,7 +25,7 @@ import android.util.Log; import com.fasterxml.jackson.core.JsonParseException; import org.moire.ultrasonic.R; -import org.moire.ultrasonic.service.parser.SubsonicRESTException; +import org.moire.ultrasonic.service.SubsonicRESTException; import org.moire.ultrasonic.subsonic.RestErrorMapper; import java.io.FileNotFoundException; diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/SubsonicRESTException.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/SubsonicRESTException.kt new file mode 100644 index 00000000..4d315d0a --- /dev/null +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/SubsonicRESTException.kt @@ -0,0 +1,10 @@ +package org.moire.ultrasonic.service + +import org.moire.ultrasonic.api.subsonic.SubsonicError + +/** + * Exception returned by API with given `code`. + */ +class SubsonicRESTException(val error: SubsonicError) : Exception("Api error: ${error.code}") { + val code: Int get() = error.code +} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/RestErrorMapper.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/RestErrorMapper.kt index 32fc7982..385cdb25 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/RestErrorMapper.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/RestErrorMapper.kt @@ -3,16 +3,16 @@ package org.moire.ultrasonic.subsonic import android.content.Context import org.moire.ultrasonic.R -import org.moire.ultrasonic.api.subsonic.SubsonicError.GENERIC -import org.moire.ultrasonic.api.subsonic.SubsonicError.INCOMPATIBLE_CLIENT_PROTOCOL_VERSION -import org.moire.ultrasonic.api.subsonic.SubsonicError.INCOMPATIBLE_SERVER_PROTOCOL_VERSION -import org.moire.ultrasonic.api.subsonic.SubsonicError.REQUESTED_DATA_WAS_NOT_FOUND -import org.moire.ultrasonic.api.subsonic.SubsonicError.REQUIRED_PARAM_MISSING -import org.moire.ultrasonic.api.subsonic.SubsonicError.TOKEN_AUTH_NOT_SUPPORTED_FOR_LDAP -import org.moire.ultrasonic.api.subsonic.SubsonicError.TRIAL_PERIOD_IS_OVER -import org.moire.ultrasonic.api.subsonic.SubsonicError.USER_NOT_AUTHORIZED_FOR_OPERATION -import org.moire.ultrasonic.api.subsonic.SubsonicError.WRONG_USERNAME_OR_PASSWORD -import org.moire.ultrasonic.service.parser.SubsonicRESTException +import org.moire.ultrasonic.api.subsonic.SubsonicError.Generic +import org.moire.ultrasonic.api.subsonic.SubsonicError.IncompatibleClientProtocolVersion +import org.moire.ultrasonic.api.subsonic.SubsonicError.IncompatibleServerProtocolVersion +import org.moire.ultrasonic.api.subsonic.SubsonicError.RequestedDataWasNotFound +import org.moire.ultrasonic.api.subsonic.SubsonicError.RequiredParamMissing +import org.moire.ultrasonic.api.subsonic.SubsonicError.TokenAuthNotSupportedForLDAP +import org.moire.ultrasonic.api.subsonic.SubsonicError.TrialPeriodIsOver +import org.moire.ultrasonic.api.subsonic.SubsonicError.UserNotAuthorizedForOperation +import org.moire.ultrasonic.api.subsonic.SubsonicError.WrongUsernameOrPassword +import org.moire.ultrasonic.service.SubsonicRESTException /** * Extension for [SubsonicRESTException] that returns localized error string, that can used to @@ -20,19 +20,19 @@ import org.moire.ultrasonic.service.parser.SubsonicRESTException */ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String = when (error) { - GENERIC -> context.getString(R.string.api_subsonic_generic, message) - REQUIRED_PARAM_MISSING -> context.getString(R.string.api_subsonic_param_missing) - INCOMPATIBLE_CLIENT_PROTOCOL_VERSION -> context + is Generic -> context + .getString(R.string.api_subsonic_generic, (error as Generic).message) + RequiredParamMissing -> context.getString(R.string.api_subsonic_param_missing) + IncompatibleClientProtocolVersion -> context .getString(R.string.api_subsonic_upgrade_client) - INCOMPATIBLE_SERVER_PROTOCOL_VERSION -> context + IncompatibleServerProtocolVersion -> context .getString(R.string.api_subsonic_upgrade_server) - WRONG_USERNAME_OR_PASSWORD -> context.getString(R.string.api_subsonic_not_authenticated) - TOKEN_AUTH_NOT_SUPPORTED_FOR_LDAP -> context + WrongUsernameOrPassword -> context.getString(R.string.api_subsonic_not_authenticated) + TokenAuthNotSupportedForLDAP -> context .getString(R.string.api_subsonic_token_auth_not_supported_for_ldap) - USER_NOT_AUTHORIZED_FOR_OPERATION -> context + UserNotAuthorizedForOperation -> context .getString(R.string.api_subsonic_not_authorized) - TRIAL_PERIOD_IS_OVER -> context.getString(R.string.api_subsonic_trial_period_is_over) - REQUESTED_DATA_WAS_NOT_FOUND -> context + TrialPeriodIsOver -> context.getString(R.string.api_subsonic_trial_period_is_over) + RequestedDataWasNotFound -> context .getString(R.string.api_subsonic_requested_data_was_not_found) - else -> context.getString(R.string.api_subsonic_unknown_api_error) } diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml index 63726c43..e43aa0c3 100644 --- a/ultrasonic/src/main/res/values-es/strings.xml +++ b/ultrasonic/src/main/res/values-es/strings.xml @@ -430,7 +430,6 @@ Falta el parámetro requerido. No se encontraron los datos solicitados. El período de prueba ha terminado. - Error de api desconocido. Versiones incompatibles. Por favor actualiza la aplicación de Android UltraSonic. Versiones incompatibles. Por favor actualiza el servidor de Subsonic. diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml index 551a4d56..936b85f1 100644 --- a/ultrasonic/src/main/res/values-fr/strings.xml +++ b/ultrasonic/src/main/res/values-fr/strings.xml @@ -430,7 +430,6 @@ Param nécessaire manquant. Les données demandées n\'ont pas été trouvées. La période d\'essai est terminée. - Erreur d\'api inconnue. Versions incompatible. Veuillez mette à jour l\'application Android UltraSonic. Versions incompatible. Veuillez mette à jour le serveur Subsonic. diff --git a/ultrasonic/src/main/res/values-hu/strings.xml b/ultrasonic/src/main/res/values-hu/strings.xml index 168332d2..8ed1f179 100644 --- a/ultrasonic/src/main/res/values-hu/strings.xml +++ b/ultrasonic/src/main/res/values-hu/strings.xml @@ -430,7 +430,6 @@ A szükséges param hiányzik. A keresett adatokat nem találtuk. A próbaidő vége. - Ismeretlen api hiba. Nem kompatibilis verzió. Kérjük, frissítse az UltraSonic Android alkalmazást! Nem kompatibilis verzió. Kérjük, frissítse a Subsonic kiszolgálót! diff --git a/ultrasonic/src/main/res/values-pt-rBR/strings.xml b/ultrasonic/src/main/res/values-pt-rBR/strings.xml index d55a773a..9ef2d86b 100644 --- a/ultrasonic/src/main/res/values-pt-rBR/strings.xml +++ b/ultrasonic/src/main/res/values-pt-rBR/strings.xml @@ -430,7 +430,6 @@ O parâmetro requerido está faltando. Os dados solicitados não foram encontrados. O período de avaliação acabou. - Erro de api desconhecido. Versões incompativeis. Atualize o aplicativo UltraSonic para Android. Versões incompativeis. Atualize o servidor UltraSonic. diff --git a/ultrasonic/src/main/res/values-pt/strings.xml b/ultrasonic/src/main/res/values-pt/strings.xml index 0afe06c6..4f8da965 100644 --- a/ultrasonic/src/main/res/values-pt/strings.xml +++ b/ultrasonic/src/main/res/values-pt/strings.xml @@ -430,7 +430,6 @@ O parâmetro requerido está faltando. Os dados solicitados não foram encontrados. O período de avaliação acabou. - Erro de api desconhecido. Versões incompativeis. Atualize o aplicativo UltraSonic para Android. Versões incompativeis. Atualize o servidor UltraSonic. diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 2a1905e7..9a1d99e9 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -432,7 +432,6 @@ Required param is missing. Requested data was not found. Trial period is over. - Unknown api error. Incompatible versions. Please upgrade UltraSonic Android app. Incompatible versions. Please upgrade Subsonic server.