Loading app/src/main/java/it/niedermann/owncloud/notes/glide/SingleSignOnStreamFetcher.java +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; Loading @@ -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; Loading @@ -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()) { Loading @@ -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 Loading app/src/main/java/it/niedermann/owncloud/notes/glide/SingleSignOnUrlLoader.java +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; Loading @@ -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; Loading @@ -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 Loading @@ -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)); } /** Loading @@ -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; } Loading Loading
app/src/main/java/it/niedermann/owncloud/notes/glide/SingleSignOnStreamFetcher.java +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; Loading @@ -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; Loading @@ -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()) { Loading @@ -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 Loading
app/src/main/java/it/niedermann/owncloud/notes/glide/SingleSignOnUrlLoader.java +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; Loading @@ -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; Loading @@ -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 Loading @@ -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)); } /** Loading @@ -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; } Loading