diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-11-26 15:24:18 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2021-11-29 17:28:10 +0300 |
commit | 0133039d63532e73b8619f30a105ef6fd522d997 (patch) | |
tree | 947f2c7553f39122f81c53fcfe36727ee023d478 /app/src/main | |
parent | da470bf0cfc27478476fccb7954dc3601e69f499 (diff) |
#1165 Add further paths to extract fallback URI
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationViewModel.java | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationViewModel.java index 170af1a4a..1ab8ecc74 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationViewModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationViewModel.java @@ -18,6 +18,8 @@ import androidx.lifecycle.MutableLiveData; import com.nextcloud.android.sso.helper.SingleAccountHelper; +import java.net.MalformedURLException; +import java.net.URL; import java.util.Optional; import it.niedermann.nextcloud.deck.DeckLog; @@ -174,10 +176,10 @@ public class PushNotificationViewModel extends AndroidViewModel { * will be invoked, otherwise {@link PushNotificationCallback#onError(Throwable)}. */ private void publishErrorToCallback(@NonNull String message, @Nullable Throwable cause, @NonNull PushNotificationCallback callback, @NonNull Bundle bundle) { - try { - // TODO check behavior of Uri.parse for an empty string - callback.fallbackToBrowser(Uri.parse(bundle.getString(KEY_LINK))); - } catch (Throwable t) { + final var fallbackUri = extractFallbackUri(bundle); + if (fallbackUri.isPresent()) { + callback.fallbackToBrowser(fallbackUri.get()); + } else { final var info = "Error while receiving push notification:\n" + message + "\n" + KEY_SUBJECT + ": [" + bundle.getString(KEY_SUBJECT) + "]\n" @@ -191,6 +193,41 @@ public class PushNotificationViewModel extends AndroidViewModel { } } + private Optional<Uri> extractFallbackUri(@NonNull Bundle bundle) { + final var link = bundle.getString(KEY_LINK, ""); + if (link.trim().length() == 0) { + DeckLog.warn(KEY_LINK, "is blank"); + return Optional.empty(); + } + try { + return Optional.of(Uri.parse(new URL(link).toString())); + } catch (MalformedURLException e) { + DeckLog.warn(KEY_LINK, "is not a valid URL"); + final var account = extractAccount(bundle); + if (account.isPresent()) { + return account.flatMap(value -> link.startsWith("/") + ? Optional.of(Uri.parse(value.getUrl() + link)) + : Optional.of(Uri.parse(value.getUrl() + "/" + link))); + } else { + DeckLog.warn("Could not extract account"); + final var accountName = Optional.ofNullable(bundle.getString(KEY_ACCOUNT)); + //noinspection SimplifyOptionalCallChains + if (!accountName.isPresent()) { + DeckLog.warn(KEY_ACCOUNT, "is empty"); + return Optional.empty(); + } + final var parts = accountName.get().split("@"); + if (parts.length != 2) { + DeckLog.warn("Could not split host part from given account", KEY_ACCOUNT); + return Optional.empty(); + } + return link.startsWith("/") + ? Optional.of(Uri.parse("https://" + parts[1] + link)) + : Optional.of(Uri.parse("https://" + parts[1] + "/" + link)); + } + } + } + private Optional<Long> extractCardRemoteId(@NonNull Bundle bundle) { try { final String cardRemoteIdString = bundle.getString(KEY_CARD_REMOTE_ID); |