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

Commit e8c74447 authored by Stefan Niedermann's avatar Stefan Niedermann
Browse files

Make Glide-SSO integration independent from app models

parent ceee7971
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -8,12 +8,11 @@ import androidx.core.util.Consumer;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.request.RequestOptions;

import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.databinding.ItemAccountChooseBinding;
import it.niedermann.owncloud.notes.glide.SingleSignOnOriginHeader;
import it.niedermann.owncloud.notes.glide.SingleSignOnUrl;
import it.niedermann.owncloud.notes.model.LocalAccount;

public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder {
@@ -29,7 +28,7 @@ public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder {
        binding.accountName.setText(localAccount.getUserName());
        binding.accountHost.setText(Uri.parse(localAccount.getUrl()).getHost());
        Glide.with(itemView.getContext())
                .load(new GlideUrl(localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64", new SingleSignOnOriginHeader(localAccount)))
                .load(new SingleSignOnUrl(localAccount.getAccountName(), localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64"))
                .placeholder(R.drawable.ic_account_circle_grey_24dp)
                .error(R.drawable.ic_account_circle_grey_24dp)
                .apply(RequestOptions.circleCropTransform())
+2 −7
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes.android.fragment;

import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.request.RequestOptions;

import java.util.List;

import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.databinding.ItemAccountChooseBinding;
import it.niedermann.owncloud.notes.glide.SingleSignOnOriginHeader;
import it.niedermann.owncloud.notes.glide.SingleSignOnUrl;
import it.niedermann.owncloud.notes.model.LocalAccount;

import static it.niedermann.owncloud.notes.android.fragment.AccountChooserAdapter.AccountChooserViewHolder;
@@ -66,7 +61,7 @@ public class AccountChooserAdapter extends RecyclerView.Adapter<AccountChooserVi
        public void bind(LocalAccount localAccount, MoveAccountListener moveAccountListener) {
            Glide
                    .with(binding.accountItemAvatar.getContext())
                    .load(new GlideUrl(localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64", new SingleSignOnOriginHeader(localAccount)))
                    .load(new SingleSignOnUrl(localAccount.getAccountName(), localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64"))
                    .placeholder(R.drawable.ic_account_circle_grey_24dp)
                    .error(R.drawable.ic_account_circle_grey_24dp)
                    .apply(RequestOptions.circleCropTransform())
+0 −38
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes.glide;

import androidx.annotation.NonNull;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.model.Headers;
import com.bumptech.glide.load.model.LazyHeaders;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
import com.nextcloud.android.sso.model.SingleSignOnAccount;

import java.util.Map;

import it.niedermann.owncloud.notes.model.LocalAccount;

public class SingleSignOnOriginHeader implements Headers {

    private LazyHeaders headers;

    /**
     * Use this header and set the {@link SingleSignOnAccount} name property as value
     * Format of the value needs to be
     */
    public static final String X_HEADER_SSO_ACCOUNT_NAME = "X-SSO-Account-Name";

    /**
     * Use this as {@link Headers} if you want to do a {@link Glide} request for an {@link SingleSignOnAccount} which is not set by {@link SingleAccountHelper} as current {@link SingleSignOnAccount}.
     *
     * @param account Account from which host the request should be fired
     */
    public SingleSignOnOriginHeader(@NonNull LocalAccount account) {
        this.headers = new LazyHeaders.Builder().addHeader(X_HEADER_SSO_ACCOUNT_NAME, account.getAccountName()).build();
    }

    @Override
    public Map<String, String> getHeaders() {
        return this.headers.getHeaders();
    }
}
+7 −3
Original line number Diff line number Diff line
@@ -27,14 +27,18 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static it.niedermann.owncloud.notes.glide.SingleSignOnOriginHeader.X_HEADER_SSO_ACCOUNT_NAME;


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

    /**
     * Use this header and set the {@link SingleSignOnAccount} name property as value
     * Format of the value needs to be
     */
    public static final String X_HEADER_SSO_ACCOUNT_NAME = "X-SSO-Account-Name";

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

+88 −0
Original line number Diff line number Diff line
package it.niedermann.owncloud.notes.glide;

import android.content.Context;

import androidx.annotation.NonNull;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.Headers;
import com.bumptech.glide.load.model.LazyHeaders;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
import com.nextcloud.android.sso.model.SingleSignOnAccount;

import java.net.URL;
import java.util.Map;

import static it.niedermann.owncloud.notes.glide.SingleSignOnStreamFetcher.X_HEADER_SSO_ACCOUNT_NAME;

/**
 * Use this as kind of {@link GlideUrl} if you want to do a {@link Glide} request from a {@link SingleSignOnAccount} which is not set by {@link SingleAccountHelper#setCurrentAccount(Context, String)}.
 */
public class SingleSignOnUrl extends GlideUrl {

    public SingleSignOnUrl(@NonNull SingleSignOnAccount ssoAccount, @NonNull String url) {
        this(ssoAccount.name, url);
    }

    public SingleSignOnUrl(@NonNull SingleSignOnAccount ssoAccount, @NonNull URL url) {
        this(ssoAccount.name, url);
    }

    public SingleSignOnUrl(@NonNull SingleSignOnAccount ssoAccount, @NonNull String url, @NonNull Headers headers) {
        this(ssoAccount.name, url, headers);
    }

    public SingleSignOnUrl(@NonNull SingleSignOnAccount ssoAccount, @NonNull URL url, @NonNull Headers headers) {
        this(ssoAccount.name, url, headers);
    }

    public SingleSignOnUrl(@NonNull String ssoAccountName, @NonNull String url) {
        super(url, new SingleSignOnOriginHeader(ssoAccountName));
    }

    public SingleSignOnUrl(@NonNull String ssoAccountName, @NonNull URL url) {
        super(url, new SingleSignOnOriginHeader(ssoAccountName));
    }

    public SingleSignOnUrl(@NonNull String ssoAccountName, @NonNull String url, @NonNull Headers headers) {
        super(url, new SingleSignOnOriginHeader(ssoAccountName, headers));
    }

    public SingleSignOnUrl(@NonNull String ssoAccountName, @NonNull URL url, @NonNull Headers headers) {
        super(url, new SingleSignOnOriginHeader(ssoAccountName, headers));
    }

    private static class SingleSignOnOriginHeader implements Headers {

        private Headers headers;

        /**
         * Use this as {@link Headers} if you want to do a {@link Glide} request for an {@link SingleSignOnAccount} which is not set by {@link SingleAccountHelper} as current {@link SingleSignOnAccount}.
         *
         * @param ssoAccountName Account name from which host the request should be fired (needs to match {@link SingleSignOnAccount#name})
         */
        public SingleSignOnOriginHeader(@NonNull String ssoAccountName) {
            this.headers = new LazyHeaders.Builder().addHeader(X_HEADER_SSO_ACCOUNT_NAME, ssoAccountName).build();
        }

        /**
         * Use this as {@link Headers} if you want to do a {@link Glide} request for an {@link SingleSignOnAccount} which is not set by {@link SingleAccountHelper} as current {@link SingleSignOnAccount}.
         *
         * @param ssoAccountName Account name from which host the request should be fired (needs to match {@link SingleSignOnAccount#name})
         */
        public SingleSignOnOriginHeader(@NonNull String ssoAccountName, Headers headers) {
            LazyHeaders.Builder builder = new LazyHeaders.Builder();
            for (Map.Entry<String, String> entry : headers.getHeaders().entrySet()) {
                builder.addHeader(entry.getKey(), entry.getValue());
            }
            builder.addHeader(X_HEADER_SSO_ACCOUNT_NAME, ssoAccountName).build();
            this.headers = builder.build();
        }

        @Override
        public Map<String, String> getHeaders() {
            return this.headers.getHeaders();
        }
    }
}
Loading