diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-04-23 10:52:02 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-04-23 10:52:02 +0300 |
commit | 51b9477067a0382227cff36132eaa1515c96016a (patch) | |
tree | 881739b3cd5589199afbe78466286c0a4476f04f /app/src/main/java/it/niedermann/nextcloud/deck/util | |
parent | 3c7248b2c0883f55ee8ef3dfca3098be6a92b0fd (diff) | |
parent | 87ef2bd5836581fff8bf0d7ca5137c33770881db (diff) |
Merge branch '324-avatars-not-updating-proof-of-concept'
# Conflicts:
# app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/util')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java | 87 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnUrlLoader.java | 33 |
2 files changed, 73 insertions, 47 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java index 0756227c8..4cf16d2c5 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnStreamFetcher.java @@ -1,5 +1,7 @@ package it.niedermann.nextcloud.deck.util.glide; +import android.content.Context; + import androidx.annotation.NonNull; import com.bumptech.glide.Priority; @@ -9,6 +11,11 @@ import com.bumptech.glide.load.model.GlideUrl; import com.nextcloud.android.sso.aidl.NextcloudRequest; import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.api.Response; +import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; +import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; +import com.nextcloud.android.sso.exceptions.TokenMismatchException; +import com.nextcloud.android.sso.helper.SingleAccountHelper; +import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.io.InputStream; import java.net.MalformedURLException; @@ -17,6 +24,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.api.GsonConfig; + /** * Fetches an {@link InputStream} using the Nextcloud SSO library. @@ -24,37 +34,76 @@ import java.util.Map; public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> { private static final String METHOD_GET = "GET"; - private final NextcloudAPI client; + private static final Map<String, NextcloudAPI> INITIALIZED_APIs = new HashMap<>(); + + private final Context context; private final GlideUrl url; // Public API. @SuppressWarnings("WeakerAccess") - public SingleSignOnStreamFetcher(NextcloudAPI client, GlideUrl url) { - this.client = client; + public SingleSignOnStreamFetcher(Context context, GlideUrl url) { + this.context = context; this.url = url; } @Override public void loadData(@NonNull Priority priority, @NonNull final DataCallback<? super InputStream> callback) { - final NextcloudRequest.Builder requestBuilder; + NextcloudAPI client = null; try { - requestBuilder = new NextcloudRequest.Builder() - .setMethod(METHOD_GET) - .setUrl(url.toURL().getPath()); - final Map<String, List<String>> header = new HashMap<>(); - for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) { - header.put(headerEntry.getKey(), Collections.singletonList(headerEntry.getValue())); + SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context); + client = INITIALIZED_APIs.get(ssoAccount.name); + boolean didInitialize = false; + if (client == null){ + client = new NextcloudAPI(context, ssoAccount, GsonConfig.getGson(), new NextcloudAPI.ApiConnectedListener() { + @Override + public void onConnected() { + DeckLog.log("success: init SSO-Api"); + } + + @Override + public void onError(Exception e) { + DeckLog.logError(e); + } + }); + INITIALIZED_APIs.put(ssoAccount.name, client); + didInitialize = true; + } + + NextcloudRequest.Builder requestBuilder = null; + try { + requestBuilder = new NextcloudRequest.Builder() + .setMethod(METHOD_GET) + .setUrl(url.toURL().getPath()); + Map<String, List<String>> header = new HashMap<>(); + for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) { + header.put(headerEntry.getKey(), Collections.singletonList(headerEntry.getValue())); + } + requestBuilder.setHeader(header); + NextcloudRequest nextcloudRequest = requestBuilder.build(); + DeckLog.log(nextcloudRequest.toString()); + Response response = client.performNetworkRequestV2(nextcloudRequest); + callback.onDataReady(response.getBody()); + } catch (MalformedURLException e) { + callback.onLoadFailed(e); + } catch (TokenMismatchException e) { + if (!didInitialize){ + DeckLog.warn("SSO Glide loader failed with TokenMismatchException, trying to re-initialize..."); + client.stop(); + INITIALIZED_APIs.remove(ssoAccount.name); + loadData(priority, callback); + } else { + DeckLog.logError(e); + callback.onLoadFailed(e); + } + } catch (Exception e) { + callback.onLoadFailed(e); } - requestBuilder.setHeader(header); - final NextcloudRequest nextcloudRequest = requestBuilder.build(); - final Response response = client.performNetworkRequestV2(nextcloudRequest); - callback.onDataReady(response.getBody()); - } catch (MalformedURLException e) { - callback.onLoadFailed(e); - } catch (Exception e) { - callback.onLoadFailed(e); - } + } catch (NextcloudFilesAppAccountNotFoundException e) { + e.printStackTrace(); + } catch (NoCurrentAccountSelectedException e) { + e.printStackTrace(); + } } @Override diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnUrlLoader.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnUrlLoader.java index 86ad3c76a..41ab323fc 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnUrlLoader.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnUrlLoader.java @@ -9,29 +9,22 @@ import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.ModelLoader; import com.bumptech.glide.load.model.ModelLoaderFactory; import com.bumptech.glide.load.model.MultiModelLoaderFactory; -import com.nextcloud.android.sso.api.NextcloudAPI; -import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; -import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; -import com.nextcloud.android.sso.helper.SingleAccountHelper; import org.jetbrains.annotations.NotNull; import java.io.InputStream; -import it.niedermann.nextcloud.deck.DeckLog; -import it.niedermann.nextcloud.deck.api.GsonConfig; - /** * A simple model loader for fetching media over http/https using Nextcloud SSO. */ public class SingleSignOnUrlLoader implements ModelLoader<GlideUrl, InputStream> { - private final NextcloudAPI client; + private final Context context; // Public API. @SuppressWarnings("WeakerAccess") - public SingleSignOnUrlLoader(@NonNull NextcloudAPI client) { - this.client = client; + public SingleSignOnUrlLoader(@NonNull Context context) { + this.context = context; } @Override @@ -42,7 +35,7 @@ public class SingleSignOnUrlLoader implements ModelLoader<GlideUrl, InputStream> @Override public LoadData<InputStream> buildLoadData( @NonNull GlideUrl model, int width, int height, @NonNull Options options) { - return new LoadData<>(model, new SingleSignOnStreamFetcher(client, model)); + return new LoadData<>(model, new SingleSignOnStreamFetcher(context, model)); } /** @@ -57,23 +50,7 @@ public class SingleSignOnUrlLoader implements ModelLoader<GlideUrl, InputStream> * Constructor for a new Factory that runs requests using given client. */ public Factory(@NonNull Context context) { - try { - loader = new SingleSignOnUrlLoader(new NextcloudAPI(context, SingleAccountHelper.getCurrentSingleSignOnAccount(context), GsonConfig.getGson(), new NextcloudAPI.ApiConnectedListener() { - @Override - public void onConnected() { - DeckLog.log("success: init SSO-Api"); - } - - @Override - public void onError(Exception e) { - DeckLog.logError(e); - } - })); - } catch (NextcloudFilesAppAccountNotFoundException e) { - e.printStackTrace(); - } catch (NoCurrentAccountSelectedException e) { - e.printStackTrace(); - } + loader = new SingleSignOnUrlLoader(context); } @NonNull |