Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2020-04-23 10:52:02 +0300
committerStefan Niedermann <info@niedermann.it>2020-04-23 10:52:02 +0300
commit51b9477067a0382227cff36132eaa1515c96016a (patch)
tree881739b3cd5589199afbe78466286c0a4476f04f /app/src/main/java/it/niedermann/nextcloud/deck/util
parent3c7248b2c0883f55ee8ef3dfca3098be6a92b0fd (diff)
parent87ef2bd5836581fff8bf0d7ca5137c33770881db (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.java87
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/util/glide/SingleSignOnUrlLoader.java33
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