diff --git a/app/src/main/java/fi/bitrite/android/ws/api/helper/HttpErrorHelper.java b/app/src/main/java/fi/bitrite/android/ws/api/helper/HttpErrorHelper.java index 9a1f7a56..9ff3f3a4 100644 --- a/app/src/main/java/fi/bitrite/android/ws/api/helper/HttpErrorHelper.java +++ b/app/src/main/java/fi/bitrite/android/ws/api/helper/HttpErrorHelper.java @@ -2,13 +2,13 @@ import android.content.Context; -import androidx.annotation.StringRes; import android.widget.Toast; import org.json.JSONException; import java.io.IOException; +import androidx.annotation.StringRes; import fi.bitrite.android.ws.R; import fi.bitrite.android.ws.util.Tools; import retrofit2.HttpException; @@ -18,7 +18,14 @@ public class HttpErrorHelper { @StringRes public static int getErrorStringRes(Throwable throwable) { if (throwable instanceof HttpException) { - return R.string.http_server_access_failure; + HttpException httpError = (HttpException) throwable; + if (httpError.code() == 403) { + return R.string.access_denied; + } else if (httpError.code() >= 500) { + return R.string.internal_server_error; + } else { + return R.string.http_server_access_failure; + } } else if (throwable instanceof IOException) { return R.string.io_error; } else if (throwable instanceof JSONException) { diff --git a/app/src/main/java/fi/bitrite/android/ws/repository/FeedbackRepository.java b/app/src/main/java/fi/bitrite/android/ws/repository/FeedbackRepository.java index 8489c270..981125da 100644 --- a/app/src/main/java/fi/bitrite/android/ws/repository/FeedbackRepository.java +++ b/app/src/main/java/fi/bitrite/android/ws/repository/FeedbackRepository.java @@ -17,6 +17,7 @@ import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; +import retrofit2.HttpException; /** * This repository is split into two parts. One lives in the account scope as we need access to its @@ -114,7 +115,7 @@ Observable>> loadFromNetwork(int recipientId) { return new LoadResult<>(LoadResult.Source.NETWORK, feedbacks); } else { - throw new Error(apiFeedbackResponse.errorBody().string()); + throw new HttpException(apiFeedbackResponse); } }); } @@ -131,7 +132,7 @@ Completable giveFeedback(int recipientId, @NonNull String body, Feedback.Relatio body, relation, rating, yearWeMet, monthWeMet)) .flatMapCompletable(apiResponse -> { if (!apiResponse.isSuccessful()) { - throw new Error(apiResponse.errorBody().string()); + throw new HttpException(apiResponse); } markAsOld(recipientId); diff --git a/app/src/main/java/fi/bitrite/android/ws/repository/MessageRepository.java b/app/src/main/java/fi/bitrite/android/ws/repository/MessageRepository.java index 64c8d4dd..0729ea32 100644 --- a/app/src/main/java/fi/bitrite/android/ws/repository/MessageRepository.java +++ b/app/src/main/java/fi/bitrite/android/ws/repository/MessageRepository.java @@ -38,6 +38,7 @@ import io.reactivex.Single; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import retrofit2.HttpException; /** * Acts as a intermediate to return messages from the database and in the background re-fetching @@ -98,7 +99,7 @@ public Completable reloadThreads() { .observeOn(Schedulers.io()) .flatMapCompletable(apiResponse -> { if (!apiResponse.isSuccessful()) { - throw new Error(apiResponse.errorBody().string()); + return Completable.error(new HttpException(apiResponse)); } MessageThreadListResponse responseBody = apiResponse.body(); @@ -130,7 +131,7 @@ public Observable createThread(String subject, String message, .filter(response -> { // Throwing errors is not allowed in onSuccess(). if (!response.isSuccessful()) { - throw new Exception(response.errorBody().string()); + throw new HttpException(response); } else if (!response.body().isSuccessful) { throw new Exception("Retreived an unsuccessful response."); } @@ -167,7 +168,7 @@ public Observable createThread(String subject, String message, }); }, throwable -> { Log.e(WSAndroidApplication.TAG, - "Could not chreate the thread: " + throwable.toString()); + "Could not create the thread: " + throwable.toString()); emitter.onError(throwable); }); }).subscribeOn(Schedulers.io()); @@ -182,13 +183,13 @@ public Completable sendMessage(int threadId, String body) { // Creates and saves a new message. MessageThread thread = getRaw(threadId); if (thread == null) { - throw new Error("The thread needs to already be in the cache."); + throw new Exception("The thread needs to already be in the cache."); } int id = getNextPendingMessageId(thread); int authorId = mLoggedInUserHelper.getId(); if (authorId == -1) { - throw new Error("No currently logged in user."); + throw new Exception("No currently logged in user."); } // Creates a temporary message and saves it into the database. We need to clone the @@ -322,7 +323,7 @@ Observable> loadFromNetwork(int threadId) { .subscribeOn(Schedulers.io()) .flatMap(apiResponse -> { if (!apiResponse.isSuccessful()) { - throw new Error(apiResponse.errorBody().string()); + throw new HttpException(apiResponse); } MessageThreadResponse apiThread = apiResponse.body(); diff --git a/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java b/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java index 91bb92d8..2fdc3281 100644 --- a/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java +++ b/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java @@ -20,6 +20,7 @@ import io.reactivex.Maybe; import io.reactivex.Observable; import io.reactivex.schedulers.Schedulers; +import retrofit2.HttpException; /** * This repository is split into two parts. One lives in the account scope as we need access to its @@ -127,7 +128,7 @@ Observable> loadFromNetwork(int userId) { .subscribeOn(Schedulers.io()) .map(apiUserResponse -> { if (!apiUserResponse.isSuccessful()) { - throw new Error(apiUserResponse.errorBody().string()); + throw new HttpException(apiUserResponse); } return new LoadResult<>( @@ -143,7 +144,7 @@ Observable> searchByKeyword(String keyword) { .subscribeOn(Schedulers.io()) .map(apiResponse -> { if (!apiResponse.isSuccessful()) { - throw new Error(apiResponse.errorBody().string()); + throw new HttpException(apiResponse); } Collection apiUsers = apiResponse.body().users.values(); @@ -178,7 +179,7 @@ Observable> searchByLocation( .subscribeOn(Schedulers.io()) .map(apiResponse -> { if (!apiResponse.isSuccessful()) { - throw new Error(apiResponse.errorBody().string()); + throw new HttpException(apiResponse); } return apiResponse.body().users; diff --git a/app/src/main/java/fi/bitrite/android/ws/ui/ContactUserFragment.java b/app/src/main/java/fi/bitrite/android/ws/ui/ContactUserFragment.java index b5213692..41c23da6 100644 --- a/app/src/main/java/fi/bitrite/android/ws/ui/ContactUserFragment.java +++ b/app/src/main/java/fi/bitrite/android/ws/ui/ContactUserFragment.java @@ -12,7 +12,6 @@ import android.widget.Button; import android.widget.EditText; import android.widget.TextView; -import android.widget.Toast; import java.util.Collections; import java.util.List; @@ -24,6 +23,7 @@ import butterknife.OnClick; import fi.bitrite.android.ws.R; import fi.bitrite.android.ws.WSAndroidApplication; +import fi.bitrite.android.ws.api.helper.HttpErrorHelper; import fi.bitrite.android.ws.model.SimpleUser; import fi.bitrite.android.ws.repository.MessageRepository; import fi.bitrite.android.ws.ui.util.DialogHelper; @@ -109,8 +109,7 @@ public void onResume() { navigationController.navigateToMessageThreads(); } } else { - Toast.makeText(getContext(), R.string.message_thread_create_failed, - Toast.LENGTH_LONG).show(); + HttpErrorHelper.showErrorToast(getContext(), result.throwable); } })); } diff --git a/app/src/main/java/fi/bitrite/android/ws/ui/MapFragment.java b/app/src/main/java/fi/bitrite/android/ws/ui/MapFragment.java index ccac7b05..5708f48d 100644 --- a/app/src/main/java/fi/bitrite/android/ws/ui/MapFragment.java +++ b/app/src/main/java/fi/bitrite/android/ws/ui/MapFragment.java @@ -62,6 +62,7 @@ import butterknife.OnClick; import butterknife.Unbinder; import fi.bitrite.android.ws.R; +import fi.bitrite.android.ws.api.helper.HttpErrorHelper; import fi.bitrite.android.ws.api.response.UserSearchByLocationResponse; import fi.bitrite.android.ws.model.SimpleUser; import fi.bitrite.android.ws.model.User; @@ -566,7 +567,7 @@ private void fetchUsersForCurrentMapPosition() { }, throwable -> { // TODO(saemy): Error handling. Log.e(TAG, throwable.getMessage()); - sendMessage(R.string.http_server_access_failure); + HttpErrorHelper.showErrorToast(getContext(), throwable); })); } diff --git a/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadFragment.java b/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadFragment.java index d26dad3c..78f0c63e 100644 --- a/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadFragment.java +++ b/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadFragment.java @@ -21,6 +21,7 @@ import butterknife.ButterKnife; import butterknife.OnClick; import fi.bitrite.android.ws.R; +import fi.bitrite.android.ws.api.helper.HttpErrorHelper; import fi.bitrite.android.ws.repository.MessageRepository; import fi.bitrite.android.ws.repository.UserRepository; import fi.bitrite.android.ws.ui.listadapter.MessageListAdapter; @@ -117,9 +118,7 @@ public void onResume() { if (result.throwable != null) { // This should not happen, if there is no network connection we schedule // sending the message for when it is back. - Toast.makeText(getContext(), R.string.message_send_failed, - Toast.LENGTH_LONG) - .show(); + HttpErrorHelper.showErrorToast(getContext(), result.throwable); } else { mEdtNewMessage.setText(""); } diff --git a/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadsFragment.java b/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadsFragment.java index 6b51a5e0..cc23dc92 100644 --- a/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadsFragment.java +++ b/app/src/main/java/fi/bitrite/android/ws/ui/MessageThreadsFragment.java @@ -6,7 +6,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import java.util.ArrayList; import java.util.HashMap; @@ -23,6 +22,7 @@ import butterknife.BindView; import butterknife.ButterKnife; import fi.bitrite.android.ws.R; +import fi.bitrite.android.ws.api.helper.HttpErrorHelper; import fi.bitrite.android.ws.model.MessageThread; import fi.bitrite.android.ws.repository.MessageRepository; import fi.bitrite.android.ws.repository.Resource; @@ -165,9 +165,9 @@ private void reloadThreads() { mMessageRepository.reloadThreads() .observeOn(AndroidSchedulers.mainThread()) .doOnEvent(t -> mSwipeRefresh.setRefreshing(false)) - .subscribe(() -> {}, throwable -> Toast.makeText( - getContext(), R.string.messages_reload_failed, Toast.LENGTH_LONG) - .show())); + .subscribe(() -> {}, + throwable -> HttpErrorHelper.showErrorToast(getContext(), + throwable))); } @Override diff --git a/app/src/main/java/fi/bitrite/android/ws/ui/SearchFragment.java b/app/src/main/java/fi/bitrite/android/ws/ui/SearchFragment.java index 6439d877..920e40e9 100644 --- a/app/src/main/java/fi/bitrite/android/ws/ui/SearchFragment.java +++ b/app/src/main/java/fi/bitrite/android/ws/ui/SearchFragment.java @@ -28,6 +28,7 @@ import butterknife.OnItemClick; import fi.bitrite.android.ws.R; import fi.bitrite.android.ws.WSAndroidApplication; +import fi.bitrite.android.ws.api.helper.HttpErrorHelper; import fi.bitrite.android.ws.model.SimpleUser; import fi.bitrite.android.ws.model.User; import fi.bitrite.android.ws.repository.Resource; @@ -125,8 +126,8 @@ public void onResume() { } if (result.throwable != null) { - // TODO(saemy): Better error message. - DialogHelper.alert(getContext(), R.string.http_server_access_failure); + DialogHelper.alert(getContext(), + HttpErrorHelper.getErrorStringRes(result.throwable)); } else { if (result.userIds.isEmpty()) { DialogHelper.alert(getContext(), R.string.no_results); diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c398ad7a..1bf5b279 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -222,13 +222,9 @@ Gastgeber Gastgeber-Filter - Fehler beim Erstellen eines neuen Chats. - Fehler beim Abrufen der Nachrichten. - Gib eine Nachricht ein Als ungelesen markieren Als gelesen markieren - Fehler beim Senden der Nachricht. Passwort speichern? Passwort vergessen? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 52bf6752..86169b71 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -223,12 +223,9 @@ Simular Sin Servicio Marcar como leído Marcar como no leído - Fallo al enviar el mensaje. Mostrar perfil Mostrar perfiles Escriba un mensaje - Error al obtener mensajes. - Error al crear una nueva conversación. El comentario no fue enviado. Ubicación desconocida diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1d4dd03c..f6e3af84 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -229,12 +229,9 @@ Simuler une absence de service Marque comme lue Marquer comme non lu - Échec de l’envoi du message. Montre le profile Afficher les profils Tapez un message - Erreur lors de l\'obtention de messages. - Erreur lors de la création d’une nouvelle conversation. L’envoi du commentaire a échoué. Position inconnue diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index beeec53b..2deaf593 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -220,13 +220,9 @@ Utenti Filtro Utenti - Impossibile creare un nuovo thread di messaggi. - Impossibile ricaricare i messaggi. - Scrivi un messaggio Segna come non letto Segna come letto - Impossibile inviare il messaggio. Memorizza la password? Password dimenticata? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f3755e21..5fdabe4a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -232,13 +232,9 @@ Users User Filters - Failed to create a new message thread. - Failed to reload the messages. - Type a message Mark unread Mark read - Failed to send the message. Remember password? Forgot your password? @@ -272,6 +268,8 @@ The server rejected the request. Please update the app.\n(%1$s) Too many login attempts. Your account is temporarily blocked. Please try again later. + Access denied. Please check your email for account confirmation message. + Oops... This is on us, sorry! Something has gone wrong on the server side. Please try again later. @string/title_fragment_messages