all: move all Hilt processing to app module

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2021-02-20 14:08:59 +05:30
parent cff16d17b5
commit 027e3410d8
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
9 changed files with 29 additions and 18 deletions

View file

@ -0,0 +1,52 @@
package dev.msfjarvis.lobsters.injection
import com.squareup.moshi.Moshi
import dagger.Lazy
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dev.msfjarvis.lobsters.data.api.LobstersApi
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.create
@Module
@InstallIn(SingletonComponent::class)
object ApiModule {
@Provides
@BaseUrlQualifier
fun provideBaseUrl(): String {
return LobstersApi.BASE_URL
}
@Provides
fun provideClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}
/**
* Using [Lazy] here is a trick I picked up from Zac Sweers, which he explained in more
* detail here: https://www.zacsweers.dev/dagger-party-tricks-deferred-okhttp-init/
*/
@Provides
fun provideRetrofit(
client: Lazy<OkHttpClient>,
moshi: Lazy<Moshi>,
@BaseUrlQualifier baseUrl: String
): Retrofit {
return Retrofit.Builder()
.client(client.get())
.baseUrl(baseUrl)
.addConverterFactory(MoshiConverterFactory.create(moshi.get()))
.build()
}
@Provides
fun provideApi(retrofit: Retrofit): LobstersApi {
return retrofit.create()
}
}

View file

@ -0,0 +1,11 @@
package dev.msfjarvis.lobsters.injection
import javax.inject.Qualifier
/**
* Qualifier for a string value that needs to be provided to the [ApiModule.provideRetrofit] method
* as the base URL of our API.
*/
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class BaseUrlQualifier

View file

@ -0,0 +1,54 @@
package dev.msfjarvis.lobsters.injection
import android.content.Context
import com.squareup.moshi.JsonAdapter
import com.squareup.sqldelight.android.AndroidSqliteDriver
import com.squareup.sqldelight.db.SqlDriver
import dagger.Module
import dagger.Provides
import dagger.Reusable
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import dev.msfjarvis.lobsters.data.local.LobstersPost
import dev.msfjarvis.lobsters.database.LobstersDatabase
import dev.msfjarvis.lobsters.model.Submitter
import dev.msfjarvis.lobsters.model.SubmitterAdapter
import dev.msfjarvis.lobsters.model.TagsAdapter
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Reusable
fun providesSubmitterAdapter(jsonAdapter: JsonAdapter<Submitter>): SubmitterAdapter {
return SubmitterAdapter(jsonAdapter)
}
@Provides
@Reusable
fun providesTagsAdapter(): TagsAdapter {
return TagsAdapter()
}
@Provides
@Singleton
fun providesSqlDriver(@ApplicationContext context: Context): SqlDriver {
return AndroidSqliteDriver(LobstersDatabase.Schema, context, "SavedPosts.db")
}
@Provides
@Singleton
fun providesLobstersDatabase(
sqlDriver: SqlDriver,
submitterAdapter: SubmitterAdapter,
tagsAdapter: TagsAdapter
): LobstersDatabase {
return LobstersDatabase(
sqlDriver,
LobstersPost.Adapter(submitterAdapter, tagsAdapter)
)
}
}

View file

@ -0,0 +1,31 @@
package dev.msfjarvis.lobsters.injection
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.adapter
import dagger.Module
import dagger.Provides
import dagger.Reusable
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dev.msfjarvis.lobsters.model.Submitter
import dev.zacsweers.moshix.reflect.MetadataKotlinJsonAdapterFactory
@Module
@InstallIn(SingletonComponent::class)
object MoshiModule {
@Provides
@Reusable
fun provideMoshi(): Moshi {
return Moshi.Builder()
.add(MetadataKotlinJsonAdapterFactory())
.build()
}
@OptIn(ExperimentalStdlibApi::class)
@Provides
@Reusable
fun provideSubmitterJsonAdapter(moshi: Moshi): JsonAdapter<Submitter> {
return moshi.adapter()
}
}