Add displaying more specific api errors.

Now app will show more specific api errors to user.

Signed-off-by: Yahor Berdnikau <egorr.berd@gmail.com>
This commit is contained in:
Yahor Berdnikau 2018-01-07 13:17:53 +01:00
parent deaa75938b
commit 27465a086d
10 changed files with 134 additions and 41 deletions

View File

@ -698,7 +698,7 @@ public class RESTMusicService implements MusicService {
throws SubsonicRESTException, IOException { throws SubsonicRESTException, IOException {
if (response.hasError() || response.getStream() == null) { if (response.hasError() || response.getStream() == null) {
if (response.getApiError() != null) { if (response.getApiError() != null) {
throw new SubsonicRESTException(response.getApiError().getCode(), "rest error"); throw new SubsonicRESTException(response.getApiError());
} else { } else {
throw new IOException("Failed to make endpoint request, code: " + throw new IOException("Failed to make endpoint request, code: " +
response.getResponseHttpCode()); response.getResponseHttpCode());

View File

@ -1,26 +1,27 @@
package org.moire.ultrasonic.service.parser; package org.moire.ultrasonic.service.parser;
import org.moire.ultrasonic.api.subsonic.SubsonicError;
/** /**
* Exception returned by API with given {@code code}.
*
* @author Sindre Mehus * @author Sindre Mehus
* @version $Id$ * @version $Id$
*/ */
public class SubsonicRESTException extends Exception public class SubsonicRESTException extends Exception {
{ private final SubsonicError error;
/** public SubsonicRESTException(final SubsonicError error) {
* super("Api error: " + error.name());
*/ this.error = error;
private static final long serialVersionUID = 859440717343258203L; }
private final int code;
public SubsonicRESTException(int code, String message) public int getCode()
{ {
super(message); return error.getCode();
this.code = code; }
}
public int getCode() public SubsonicError getError() {
{ return error;
return code; }
}
} }

View File

@ -24,6 +24,8 @@ import android.util.Log;
import org.moire.ultrasonic.R; import org.moire.ultrasonic.R;
import org.moire.ultrasonic.service.parser.SubsonicRESTException;
import org.moire.ultrasonic.subsonic.RestErrorMapper;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -90,6 +92,10 @@ public abstract class BackgroundTask<T> implements ProgressListener
return activity.getResources().getString(R.string.background_task_parse_error); return activity.getResources().getString(R.string.background_task_parse_error);
} }
if (error instanceof SubsonicRESTException) {
return RestErrorMapper.getLocalizedErrorMessage((SubsonicRESTException) error, activity);
}
String message = error.getMessage(); String message = error.getMessage();
if (message != null) if (message != null)
{ {

View File

@ -0,0 +1,38 @@
@file:JvmName("RestErrorMapper")
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
/**
* Extension for [SubsonicRESTException] that returns localized error string, that can used to
* display error reason for user.
*/
fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String =
when (error) {
GENERIC -> context.getString(R.string.api_subsonic_generic)
REQUIRED_PARAM_MISSING -> context.getString(R.string.api_subsonic_param_missing)
INCOMPATIBLE_CLIENT_PROTOCOL_VERSION -> context
.getString(R.string.api_subsonic_upgrade_client)
INCOMPATIBLE_SERVER_PROTOCOL_VERSION -> 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
.getString(R.string.api_subsonic_token_auth_not_supported_for_ldap)
USER_NOT_AUTHORIZED_FOR_OPERATION -> 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
.getString(R.string.api_subsonic_requested_data_was_not_found)
else -> context.getString(R.string.api_subsonic_unknown_api_error)
}

View File

@ -108,12 +108,8 @@
<string name="music_library.label_offline">Medios sin conexión</string> <string name="music_library.label_offline">Medios sin conexión</string>
<string name="music_service.retry">Se ha producido un error de red. Reintento %1$d de %2$d.</string> <string name="music_service.retry">Se ha producido un error de red. Reintento %1$d de %2$d.</string>
<string name="parser.artist_count">Obtenido(s) %d artista(s).</string> <string name="parser.artist_count">Obtenido(s) %d artista(s).</string>
<string name="parser.not_authenticated">Nombre de usuario o contraseña incorrectos.</string>
<string name="parser.not_authorized">No autorizado. Comprueba los permisos de usuario en el servidor de Subsonic.</string>
<string name="parser.reading">Leyendo del servidor.</string> <string name="parser.reading">Leyendo del servidor.</string>
<string name="parser.reading_done">Leyendo del servidor. ¡Hecho!</string> <string name="parser.reading_done">Leyendo del servidor. ¡Hecho!</string>
<string name="parser.upgrade_client">Versiones incompatibles. Por favor actualiza la aplicación de Android UltraSonic.</string>
<string name="parser.upgrade_server">Versiones incompatibles. Por favor actualiza el servidor de Subsonic.</string>
<string name="playlist.label">Listas de reproducción</string> <string name="playlist.label">Listas de reproducción</string>
<string name="playlist.update_info">Actualizar Información</string> <string name="playlist.update_info">Actualizar Información</string>
<string name="playlist.updated_info">Actualizada la información de la lista de reproducción para %s</string> <string name="playlist.updated_info">Actualizada la información de la lista de reproducción para %s</string>
@ -426,4 +422,16 @@
<string name="podcasts.label">Podcast</string> <string name="podcasts.label">Podcast</string>
<string name="podcasts_channels.empty">No hay canales de Podcasts registrados</string> <string name="podcasts_channels.empty">No hay canales de Podcasts registrados</string>
<!-- Subsonic api errors -->
<string name="api.subsonic.generic">Error genérico de api.</string>
<string name="api.subsonic.token_auth_not_supported_for_ldap">La autenticación por token no es compatible con usuarios LDAP.</string>
<string name="api.subsonic.not_authenticated">Nombre de usuario o contraseña incorrectos.</string>
<string name="api.subsonic.not_authorized">No autorizado. Comprueba los permisos de usuario en el servidor de Subsonic.</string>
<string name="api.subsonic.param_missing">Falta el parámetro requerido.</string>
<string name="api.subsonic.requested_data_was_not_found">No se encontraron los datos solicitados.</string>
<string name="api.subsonic.trial_period_is_over">El período de prueba ha terminado.</string>
<string name="api.subsonic.unknown_api_error">Error de api desconocido.</string>
<string name="api.subsonic.upgrade_client">Versiones incompatibles. Por favor actualiza la aplicación de Android UltraSonic.</string>
<string name="api.subsonic.upgrade_server">Versiones incompatibles. Por favor actualiza el servidor de Subsonic.</string>
</resources> </resources>

View File

@ -108,12 +108,8 @@
<string name="music_library.label_offline">Musique hors-ligne</string> <string name="music_library.label_offline">Musique hors-ligne</string>
<string name="music_service.retry">Une erreur de réseau s\'est produite. Essai %1$d de %2$d.</string> <string name="music_service.retry">Une erreur de réseau s\'est produite. Essai %1$d de %2$d.</string>
<string name="parser.artist_count">%d artistes récupérés.</string> <string name="parser.artist_count">%d artistes récupérés.</string>
<string name="parser.not_authenticated">Mauvais nom d\'usager ou mot de passe.</string>
<string name="parser.not_authorized">Non autorisé. Vérifiez les permissions de l\'utilisateur dans le serveur Subsonic.</string>
<string name="parser.reading">Lecture du serveur.</string> <string name="parser.reading">Lecture du serveur.</string>
<string name="parser.reading_done">Lecture du serveur. Terminé!</string> <string name="parser.reading_done">Lecture du serveur. Terminé!</string>
<string name="parser.upgrade_client">Versions incompatible. Veuillez mette à jour l\'application Android UltraSonic.</string>
<string name="parser.upgrade_server">Versions incompatible. Veuillez mette à jour le serveur Subsonic.</string>
<string name="playlist.label">Playlists</string> <string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Mise à jour des informations</string> <string name="playlist.update_info">Mise à jour des informations</string>
<string name="playlist.updated_info">Informations de la playlist %s mises à jour</string> <string name="playlist.updated_info">Informations de la playlist %s mises à jour</string>
@ -426,4 +422,16 @@
<string name="podcasts.label">Podcast</string> <string name="podcasts.label">Podcast</string>
<string name="podcasts_channels.empty">No podcasts channels registered</string> <string name="podcasts_channels.empty">No podcasts channels registered</string>
<!-- Subsonic api errors -->
<string name="api.subsonic.generic">Erreur api générique.</string>
<string name="api.subsonic.token_auth_not_supported_for_ldap">L\'authentification par jeton n\'est pas prise en charge pour les utilisateurs LDAP.</string>
<string name="api.subsonic.not_authenticated">Mauvais nom d\'usager ou mot de passe.</string>
<string name="api.subsonic.not_authorized">Non autorisé. Vérifiez les permissions de l\'utilisateur dans le serveur Subsonic.</string>
<string name="api.subsonic.param_missing">Param nécessaire manquant.</string>
<string name="api.subsonic.requested_data_was_not_found">Les données demandées n\'ont pas été trouvées.</string>
<string name="api.subsonic.trial_period_is_over">La période d\'essai est terminée.</string>
<string name="api.subsonic.unknown_api_error">Erreur d\'api inconnue.</string>
<string name="api.subsonic.upgrade_client">Versions incompatible. Veuillez mette à jour l\'application Android UltraSonic.</string>
<string name="api.subsonic.upgrade_server">Versions incompatible. Veuillez mette à jour le serveur Subsonic.</string>
</resources> </resources>

View File

@ -108,12 +108,8 @@
<string name="music_library.label_offline">Kapcsolat nélküli médiák</string> <string name="music_library.label_offline">Kapcsolat nélküli médiák</string>
<string name="music_service.retry">Hálózati hiba történt! Újrapróbálkozás %1$d - %2$d.</string> <string name="music_service.retry">Hálózati hiba történt! Újrapróbálkozás %1$d - %2$d.</string>
<string name="parser.artist_count">%d előadó található a médiakönyvtárban.</string> <string name="parser.artist_count">%d előadó található a médiakönyvtárban.</string>
<string name="parser.not_authenticated">Hibás felhasználónév vagy jelszó!</string>
<string name="parser.not_authorized">Nem engedélyezett! Ellenőrizze a felhasználó jogosultságait a Subsonic kiszolgálón!</string>
<string name="parser.reading">Olvasás a kiszolgálóról&#8230;</string> <string name="parser.reading">Olvasás a kiszolgálóról&#8230;</string>
<string name="parser.reading_done">Olvasás a kiszolgálóról&#8230; Kész!</string> <string name="parser.reading_done">Olvasás a kiszolgálóról&#8230; Kész!</string>
<string name="parser.upgrade_client">Nem kompatibilis verzió. Kérjük, frissítse az UltraSonic Android alkalmazást!</string>
<string name="parser.upgrade_server">Nem kompatibilis verzió. Kérjük, frissítse a Subsonic kiszolgálót!</string>
<string name="playlist.label">Lejátszási listák</string> <string name="playlist.label">Lejátszási listák</string>
<string name="playlist.update_info">Módosítás</string> <string name="playlist.update_info">Módosítás</string>
<string name="playlist.updated_info">Módosított lejátszási lista %s</string> <string name="playlist.updated_info">Módosított lejátszási lista %s</string>
@ -426,4 +422,16 @@
<string name="podcasts.label">Podcast</string> <string name="podcasts.label">Podcast</string>
<string name="podcasts_channels.empty">No podcasts channels registered</string> <string name="podcasts_channels.empty">No podcasts channels registered</string>
<!-- Subsonic api errors -->
<string name="api.subsonic.generic">Általános api hiba.</string>
<string name="api.subsonic.token_auth_not_supported_for_ldap">Az LDAP-felhasználók számára nem támogatott a token-hitelesítés.</string>
<string name="api.subsonic.not_authenticated">Hibás felhasználónév vagy jelszó!</string>
<string name="api.subsonic.not_authorized">Nem engedélyezett! Ellenőrizze a felhasználó jogosultságait a Subsonic kiszolgálón!</string>
<string name="api.subsonic.param_missing">A szükséges param hiányzik.</string>
<string name="api.subsonic.requested_data_was_not_found">A keresett adatokat nem találtuk.</string>
<string name="api.subsonic.trial_period_is_over">A próbaidő vége.</string>
<string name="api.subsonic.unknown_api_error">Ismeretlen api hiba.</string>
<string name="api.subsonic.upgrade_client">Nem kompatibilis verzió. Kérjük, frissítse az UltraSonic Android alkalmazást!</string>
<string name="api.subsonic.upgrade_server">Nem kompatibilis verzió. Kérjük, frissítse a Subsonic kiszolgálót!</string>
</resources> </resources>

View File

@ -111,12 +111,8 @@
<string name="music_library.label_offline">Mídia Offline</string> <string name="music_library.label_offline">Mídia Offline</string>
<string name="music_service.retry">Ocorreu um erro de rede. Tentativa %1$d de %2$d.</string> <string name="music_service.retry">Ocorreu um erro de rede. Tentativa %1$d de %2$d.</string>
<string name="parser.artist_count">Obtive %d Artistas.</string> <string name="parser.artist_count">Obtive %d Artistas.</string>
<string name="parser.not_authenticated">Login ou senha errada.</string>
<string name="parser.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
<string name="parser.reading">Lendo do servidor.</string> <string name="parser.reading">Lendo do servidor.</string>
<string name="parser.reading_done">Lendo do servidor. Pronto!</string> <string name="parser.reading_done">Lendo do servidor. Pronto!</string>
<string name="parser.upgrade_client">Versões incompativeis. Atualize o aplicativo UltraSonic para Android.</string>
<string name="parser.upgrade_server">Versões incompativeis. Atualize o servidor UltraSonic.</string>
<string name="playlist.label">Playlists</string> <string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Atualizar Informação</string> <string name="playlist.update_info">Atualizar Informação</string>
<string name="playlist.updated_info">Informação da playlist atualizada para %s</string> <string name="playlist.updated_info">Informação da playlist atualizada para %s</string>
@ -426,4 +422,16 @@
<item quantity="other">Restam %d dias para o fim do período de teste</item> <item quantity="other">Restam %d dias para o fim do período de teste</item>
</plurals> </plurals>
<!-- Subsonic api errors -->
<string name="api.subsonic.generic">Erro de api genérico.</string>
<string name="api.subsonic.token_auth_not_supported_for_ldap">A autenticação por token não é suportada para usuários LDAP.</string>
<string name="api.subsonic.not_authenticated">Login ou senha errada.</string>
<string name="api.subsonic.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
<string name="api.subsonic.param_missing">O parâmetro requerido está faltando.</string>
<string name="api.subsonic.requested_data_was_not_found">Os dados solicitados não foram encontrados.</string>
<string name="api.subsonic.trial_period_is_over">O período de avaliação acabou.</string>
<string name="api.subsonic.unknown_api_error">Erro de api desconhecido.</string>
<string name="api.subsonic.upgrade_client">Versões incompativeis. Atualize o aplicativo UltraSonic para Android.</string>
<string name="api.subsonic.upgrade_server">Versões incompativeis. Atualize o servidor UltraSonic.</string>
</resources> </resources>

View File

@ -111,12 +111,8 @@
<string name="music_library.label_offline">Mídia Offline</string> <string name="music_library.label_offline">Mídia Offline</string>
<string name="music_service.retry">Ocorreu um erro de rede. Tentativa %1$d de %2$d.</string> <string name="music_service.retry">Ocorreu um erro de rede. Tentativa %1$d de %2$d.</string>
<string name="parser.artist_count">Obtive %d Artistas.</string> <string name="parser.artist_count">Obtive %d Artistas.</string>
<string name="parser.not_authenticated">Login ou senha errada.</string>
<string name="parser.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
<string name="parser.reading">Lendo do servidor.</string> <string name="parser.reading">Lendo do servidor.</string>
<string name="parser.reading_done">Lendo do servidor. Pronto!</string> <string name="parser.reading_done">Lendo do servidor. Pronto!</string>
<string name="parser.upgrade_client">Versões incompativeis. Atualize o aplicativo UltraSonic para Android.</string>
<string name="parser.upgrade_server">Versões incompativeis. Atualize o servidor UltraSonic.</string>
<string name="playlist.label">Playlists</string> <string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Atualizar Informação</string> <string name="playlist.update_info">Atualizar Informação</string>
<string name="playlist.updated_info">Informação da playlist atualizada para %s</string> <string name="playlist.updated_info">Informação da playlist atualizada para %s</string>
@ -426,4 +422,16 @@
<item quantity="other">Restam %d dias para o fim do período de teste</item> <item quantity="other">Restam %d dias para o fim do período de teste</item>
</plurals> </plurals>
<!-- Subsonic api errors -->
<string name="api.subsonic.generic">Erro de api genérico.</string>
<string name="api.subsonic.token_auth_not_supported_for_ldap">A autenticação por token não é suportada para usuários LDAP.</string>
<string name="api.subsonic.not_authenticated">Login ou senha errada.</string>
<string name="api.subsonic.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
<string name="api.subsonic.param_missing">O parâmetro requerido está faltando.</string>
<string name="api.subsonic.requested_data_was_not_found">Os dados solicitados não foram encontrados.</string>
<string name="api.subsonic.trial_period_is_over">O período de avaliação acabou.</string>
<string name="api.subsonic.unknown_api_error">Erro de api desconhecido.</string>
<string name="api.subsonic.upgrade_client">Versões incompativeis. Atualize o aplicativo UltraSonic para Android.</string>
<string name="api.subsonic.upgrade_server">Versões incompativeis. Atualize o servidor UltraSonic.</string>
</resources> </resources>

View File

@ -111,12 +111,8 @@
<string name="music_library.label_offline">Offline Media</string> <string name="music_library.label_offline">Offline Media</string>
<string name="music_service.retry">A network error occurred. Retrying %1$d of %2$d.</string> <string name="music_service.retry">A network error occurred. Retrying %1$d of %2$d.</string>
<string name="parser.artist_count">Got %d Artists.</string> <string name="parser.artist_count">Got %d Artists.</string>
<string name="parser.not_authenticated">Wrong username or password.</string>
<string name="parser.not_authorized">Not authorized. Check user permissions in Subsonic server.</string>
<string name="parser.reading">Reading from server.</string> <string name="parser.reading">Reading from server.</string>
<string name="parser.reading_done">Reading from server. Done!</string> <string name="parser.reading_done">Reading from server. Done!</string>
<string name="parser.upgrade_client">Incompatible versions. Please upgrade UltraSonic Android app.</string>
<string name="parser.upgrade_server">Incompatible versions. Please upgrade Subsonic server.</string>
<string name="playlist.label">Playlists</string> <string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Update Information</string> <string name="playlist.update_info">Update Information</string>
<string name="playlist.updated_info">Updated playlist information for %s</string> <string name="playlist.updated_info">Updated playlist information for %s</string>
@ -428,4 +424,16 @@
<item quantity="other">%d days left of trial period</item> <item quantity="other">%d days left of trial period</item>
</plurals> </plurals>
<!-- Subsonic api errors -->
<string name="api.subsonic.generic">Generic api error.</string>
<string name="api.subsonic.token_auth_not_supported_for_ldap">Authentication by token is not supported for LDAP users.</string>
<string name="api.subsonic.not_authenticated">Wrong username or password.</string>
<string name="api.subsonic.not_authorized">Not authorized. Check user permissions in Subsonic server.</string>
<string name="api.subsonic.param_missing">Required param is missing.</string>
<string name="api.subsonic.requested_data_was_not_found">Requested data was not found.</string>
<string name="api.subsonic.trial_period_is_over">Trial period is over.</string>
<string name="api.subsonic.unknown_api_error">Unknown api error.</string>
<string name="api.subsonic.upgrade_client">Incompatible versions. Please upgrade UltraSonic Android app.</string>
<string name="api.subsonic.upgrade_server">Incompatible versions. Please upgrade Subsonic server.</string>
</resources> </resources>