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

SingleSignOnStreamFetcher.java « glide « notes « owncloud « niedermann « it « java « main « src « app - github.com/stefan-niedermann/nextcloud-notes.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c519e9aff1b3cb404cddc1f518958ef4f032bc56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package it.niedermann.owncloud.notes.glide;

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

import androidx.annotation.NonNull;

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;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * Fetches an {@link InputStream} using the sso library.
 */
public class SingleSignOnStreamFetcher implements DataFetcher<InputStream> {

    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(Context context, GlideUrl url) {
        this.context = context;
        this.url = url;
    }

    @Override
    public void loadData(@NonNull Priority priority, @NonNull final DataCallback<? super InputStream> callback) {
        NextcloudAPI client = null;
        try {
            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()) {
                    header.put(headerEntry.getKey(), Collections.singletonList(headerEntry.getValue()));
                }
                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
    public void cleanup() {

    }

    @Override
    public void cancel() {

    }

    @NonNull
    @Override
    public Class<InputStream> getDataClass() {
        return InputStream.class;
    }

    @NonNull
    @Override
    public DataSource getDataSource() {
        return DataSource.REMOTE;
    }
}