How to pass params to AppGliceModule

Viewed 30

I need to add headers to Glide requests. I've found that GlideModule could be used for this purpuse.

I'm using OkHttpClient integration to use intercepters and add headers.

But I need to pass parameters to registerComponents method of AppGlideModule.

How could it be done?


My glide version is 4.13.2

My module looks like this:

class MyAppGlideModule : AppGlideModule() {
    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        super.registerComponents(context, glide, registry)

        val client = OkHttpClient
           .Builder()
            .apply {
                val loggingInterceptor = HttpLoggingInterceptor().apply {
                    level = HttpLoggingInterceptor.Level.BODY
                }
                addInterceptor(loggingInterceptor)
            }
            .addInterceptor(Interceptor { chain ->
                val newRequest = chain
                    .request()
                    .newBilder()
                    .header("X-header-18", <I NEED PARAM HERE>)
                    .build()
                chain.proceed(newRequest)
            })
            .build()

        registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(client))
    }
}
2 Answers

Hello below is my working solutions. You have to override one another method for option.

    public class GlideModule implements com.bumptech.glide.module.GlideModule {

    @Override public void applyOptions(Context context, GlideBuilder builder) {
    }

    @Override public void registerComponents(Context context, Glide glide) {
        // just to see the headers actually went through, Stetho or proxy can also be used for this
        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(new OkHttpClient.Builder()
                .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS))
                .build()));
        // override default loader with one that attaches headers
        glide.register(String.class, InputStream.class, new HeaderedLoader.Factory());
    }

    private static class HeaderedLoader extends BaseGlideUrlLoader<String> {

        private static final String APP_AGENT = "My App Agent";
        private static final String USER_AGENT = "My User Agent";
        public static final Headers HEADERS = new LazyHeaders.Builder()
                .addHeader("User-Agent", USER_AGENT)
                .addHeader("App-Agent", APP_AGENT)
                .build();

        public HeaderedLoader(Context context) {
            super(context);
        }

        @Override protected String getUrl(String model, int width, int height) {
            return model;
        }

        @Override protected Headers getHeaders(String model, int width, int height) {
            return HEADERS;
        }

        public static class Factory implements ModelLoaderFactory<String, InputStream> {

            @Override public StreamModelLoader<String> build(Context context, GenericLoaderFactory factories) {
                return new HeaderedLoader(context);
            }

            @Override public void teardown() { /* nothing to free */ }
        }
    }
}

Here is my own solution as an answer. But I still hope there is a better way to do such a thing.

MyAppGlideModule.kt:

@GlideModule
class MyAppGlideModule : AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        super.registerComponents(context, glide, registry)

        registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(client!!))
    }

    override fun applyOptions(context: Context, builder: GlideBuilder) {
        super.applyOptions(context, builder)
        if (debugEnabled) builder.setLogLevel(Log.DEBUG)
    }

    companion object {
        private var client: OkHttpClient? = null
        private var debugEnabled: Boolean = false

        fun initialize(client: OkHttpClient, debugEnabled: Boolean) {
            this.client = client
            this.debugEnabled = debugEnabled
        }
    }

}

AppClass.kt:

class AppClass {

    private lateinit var appComponent: AppComponentImpl // Dagger component

    override fun onCreate() {
        super.onCreate()

        initDagger()

        MyAppGlideModlue.initialize(client = appComponent.okHttpClient(),
        debugEnabled = appComponent.debugEnabled
}
Related