From 1799ae95a02680b9fbf8bb65c5233c2795a71c14 Mon Sep 17 00:00:00 2001 From: desperateCoder Date: Sat, 8 Jan 2022 18:08:08 +0100 Subject: #1169 try to better handle networking errors --- .../nextcloud/deck/api/RequestHelper.java | 2 +- .../deck/api/ServerCommunicationErrorHandler.java | 39 +++++++++++++++++++++ .../deck/exceptions/OfflineException.java | 40 +++++++++++++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/RequestHelper.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/RequestHelper.java index 26091e8bc..79790484a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/api/RequestHelper.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/RequestHelper.java @@ -42,7 +42,7 @@ public class RequestHelper { private final Consumer exceptionConsumer = new Consumer<>() { @Override public void accept(final Throwable throwable) { - callback.onError(throwable); + callback.onError(ServerCommunicationErrorHandler.translateError(throwable)); } }; diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java new file mode 100644 index 000000000..a76bca956 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java @@ -0,0 +1,39 @@ +package it.niedermann.nextcloud.deck.api; + +import com.nextcloud.android.sso.exceptions.UnknownErrorException; + +import java.util.Objects; + +import it.niedermann.nextcloud.deck.exceptions.OfflineException; + +public class ServerCommunicationErrorHandler { + public static Throwable translateError (Throwable error){ + try { + if (error.getClass() == UnknownErrorException.class) { + return handleSsoExceptions(error); + } else if(error.getClass() == ClassNotFoundException.class) { + return handleClassNotFoundError(error); + } + } catch (NullPointerException e) { + return error; + } + + return error; + } + + private static Throwable handleClassNotFoundError(Throwable error) { + String message = Objects.requireNonNull(error.getMessage(), "ClassNotFound handler got no ExceptionMessage").toLowerCase(); + if (message.contains("connecttimeoutexception")) { + return new OfflineException(OfflineException.Reason.CONNECTION_TIMEOUT); + } + return error; + } + + private static Throwable handleSsoExceptions(Throwable error) { + String message = Objects.requireNonNull(error.getMessage(), "SSO handler got no ExceptionMessage").toLowerCase(); + if (message.contains("econnrefused") || message.contains("connection refused")) { + return new OfflineException(OfflineException.Reason.CONNECTION_REFUSED); + } + return error; + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/exceptions/OfflineException.java b/app/src/main/java/it/niedermann/nextcloud/deck/exceptions/OfflineException.java index c63b801a0..bcd41cb16 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/exceptions/OfflineException.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/exceptions/OfflineException.java @@ -1,7 +1,45 @@ package it.niedermann.nextcloud.deck.exceptions; +import androidx.annotation.Nullable; + public class OfflineException extends IllegalStateException { + + private final Reason reason; + + public enum Reason { + OFFLINE("offline", "The device is currently offline"), + CONNECTION_REFUSED("connection_refused", "Connection was refused, please check if your server is reachable"), + CONNECTION_TIMEOUT("connection_timeout", "Connection timed out, please check if you're connected to the internet"), + ; + + private String key; + private String whatHappened; + + Reason(String key, String whatHappened) { + this.key = key; + this.whatHappened = whatHappened; + } + + public String getKey() { + return key; + } + + public String getWhatHappened() { + return whatHappened; + } + } + + public OfflineException() { - super("Device is currently offline."); + this(Reason.OFFLINE); + } + public OfflineException(Reason reason) { + super(reason.getWhatHappened()); + this.reason = reason; + } + + @Nullable + public Reason getReason() { + return reason; } } -- cgit v1.2.3