How to add MyServiceInterceptor class to networkmodule using dagger hilt android?

Viewed 3279

I need to add MyServiceInterceptor class to my hilt servicemodule for different request. for example my login request don't need header authorize but my other request needs bearer token.

My question is how can i add this ? Any help please ?

My Networking Module

@Module
@InstallIn(ApplicationComponent::class)
object NetworkingModule {

    @Provides
    fun providesBaseUrl(): String {
        return NetworkingConstants.BASE_URL
    }

    @Provides
    fun providesLoggingInterceptor(): HttpLoggingInterceptor {
        return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
    }




    @Provides
    fun provideOkHttpClient(loggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
        val okHttpClient = OkHttpClient().newBuilder()

        okHttpClient.callTimeout(40, TimeUnit.SECONDS)
        okHttpClient.connectTimeout(40, TimeUnit.SECONDS)
        okHttpClient.readTimeout(40, TimeUnit.SECONDS)
        okHttpClient.writeTimeout(40, TimeUnit.SECONDS)
        okHttpClient.addInterceptor(loggingInterceptor)
        okHttpClient.build()
        return okHttpClient.build()
    }



    @Provides
    fun provideConverterFactory(): Converter.Factory {
        return GsonConverterFactory.create()
    }

    @Provides
    fun provideRetrofitClient(okHttpClient: OkHttpClient, baseUrl: String, converterFactory: Converter.Factory): Retrofit {
        return Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(okHttpClient)
            .addConverterFactory(converterFactory)
            .build()
    }

    @Provides
    fun provideRestApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }
}

And MyServiceInterceptorClass

@Singleton
public class MyServiceInterceptor @Inject constructor(
    private val preferencesHelper: PreferencesHelper
) : Interceptor {

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        var newRequest: Request = chain.request()

        newRequest = newRequest.newBuilder()
            .addHeader(
                "AccessToken",
                preferencesHelper.getAccessTokenFromPreference()!!
            )
            .build()

        return chain.proceed(newRequest)

    }
}
3 Answers

You can use qualifiers in order to add your service interceptor class in your network module. Here is a working example.

First of all, create a class qualifiers.kt and define your annotation there for your service class

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ApiKeyInterceptorOkHttpClient

You can make your separate class for Interceptor as follow:

class ApiKeyInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val original: Request = chain.request()
        val httpUrl: HttpUrl = original.url
        val url: HttpUrl = httpUrl.newBuilder()
            .addQueryParameter("api_key", BuildConfig.API_KEY)
            .build()
        val request: Request = original.newBuilder().url(url).build()
        return chain.proceed(request)
    }
}

Then, in your network module, you can then provide your interceptor

@ApiKeyInterceptorOkHttpClient
@Singleton
@Provides
fun providesApiKeyInterceptor(): Interceptor = ApiKeyInterceptor()

Finally you can use your interceptor in your Okhttp Client.

@Singleton
@Provides
fun providesOkhttpClient(
     httpLoggingInterceptor: HttpLoggingInterceptor,
     @ApiKeyInterceptorOkHttpClient apiKeyInterceptor: Interceptor) =
     OkHttpClient.Builder()
         .addInterceptor(httpLoggingInterceptor)
         .addInterceptor(apiKeyInterceptor)
         .connectTimeout(30, TimeUnit.SECONDS)
         .readTimeout(30, TimeUnit.SECONDS)
         .writeTimeout(30, TimeUnit.SECONDS)
         .build()
@Provides
fun providesLoggingInterceptor(): HttpLoggingInterceptor {
    return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
}


@Provides
fun providesOkhttpInterceptor() : Interceptor{
    return  Interceptor { chain: Interceptor.Chain ->
        val original: Request = chain.request()
        val requestBuilder: Request.Builder = original.newBuilder()
            .addHeader("Accept", "Application/JSON")
        val request: Request = requestBuilder.build()
        chain.proceed(request)
    }
}


@Provides
fun providesOkHttpClient(
    loggingInterceptor: HttpLoggingInterceptor,
    interceptor: Interceptor
): OkHttpClient {
    return OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .addInterceptor(interceptor)
        .callTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build()
}
Related