Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62405ecf authored by Stefan Niedermann's avatar Stefan Niedermann
Browse files

Use for each account an own API instance for Glide

parent be61d512
Loading
Loading
Loading
Loading
+69 −19
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes.glide;

import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;
@@ -8,9 +9,15 @@ import com.bumptech.glide.Priority;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.load.model.GlideUrl;
import com.google.gson.GsonBuilder;
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;
@@ -25,21 +32,48 @@ import java.util.Map;
 */
public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> {

    private final NextcloudAPI client;
    private static final String TAG = SingleSignOnStreamFetcher.class.getSimpleName();
    private static final String METHOD_GET = "GET";

    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) {Log.v("yey", "yey fetcher");
    public void loadData(@NonNull Priority priority, @NonNull final DataCallback<? super InputStream> callback) {
        NextcloudAPI client = null;
        try {
            NextcloudRequest.Builder requestBuilder = new NextcloudRequest.Builder()
                    .setMethod("GET")
            SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context);
            client = INITIALIZED_APIs.get(ssoAccount.name);
            boolean didInitialize = false;
            if (client == null) {
                client = new NextcloudAPI(context, SingleAccountHelper.getCurrentSingleSignOnAccount(context), new GsonBuilder().create(), new NextcloudAPI.ApiConnectedListener() {
                    @Override
                    public void onConnected() {
                        Log.v(TAG, "SSO API successfully initialized");
                    }

                    @Override
                    public void onError(Exception ex) {
                        Log.e(TAG, ex.getMessage(), ex);
                    }
                });
                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()) {
@@ -47,14 +81,30 @@ public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> {
                }
                requestBuilder.setHeader(header);
                NextcloudRequest nextcloudRequest = requestBuilder.build();
                Log.v(TAG, nextcloudRequest.toString());
                Response response = client.performNetworkRequestV2(nextcloudRequest);
                callback.onDataReady(response.getBody());
            } catch (MalformedURLException e) {
                callback.onLoadFailed(e);
            } catch (TokenMismatchException e) {
                if (!didInitialize) {
                    Log.w(TAG, "SSO Glide loader failed with TokenMismatchException, trying to re-initialize...");
                    client.stop();
                    INITIALIZED_APIs.remove(ssoAccount.name);
                    loadData(priority, callback);
                } else {
                    e.printStackTrace();
                    callback.onLoadFailed(e);
                }
            } catch (Exception e) {
                callback.onLoadFailed(e);
            }

        } catch (NextcloudFilesAppAccountNotFoundException e) {
            e.printStackTrace();
        } catch (NoCurrentAccountSelectedException e) {
            e.printStackTrace();
        }
    }

    @Override
+6 −28
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes.glide;

import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;

@@ -10,11 +9,6 @@ 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.google.gson.GsonBuilder;
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 java.io.InputStream;

@@ -24,12 +18,12 @@ import java.io.InputStream;
public class SingleSignOnUrlLoader implements ModelLoader<GlideUrl, InputStream> {

    private static final String TAG = SingleSignOnUrlLoader.class.getSimpleName();
    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
@@ -40,7 +34,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));
    }

    /**
@@ -55,28 +49,12 @@ 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), new GsonBuilder().create(), new NextcloudAPI.ApiConnectedListener() {
                    @Override
                    public void onConnected() {
                        Log.v(TAG, "SSO API successfully initialized");
                    }

                    @Override
                    public void onError(Exception ex) {
                        Log.e(TAG, ex.getMessage(), ex);
                    }
                }));
            } catch (NextcloudFilesAppAccountNotFoundException e) {
                e.printStackTrace();
            } catch (NoCurrentAccountSelectedException e) {
                e.printStackTrace();
            }
            loader = new SingleSignOnUrlLoader(context);
        }

        @NonNull
        @Override
        public ModelLoader<GlideUrl, InputStream> build(MultiModelLoaderFactory multiFactory) {
        public ModelLoader<GlideUrl, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {
            return loader;
        }