//Add Dagger plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'kotlin-parcelize' id 'dagger.hilt.android.plugin' } dependencies { // RETROFIT implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") implementation("com.squareup.okhttp3:okhttp:4.9.1") implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") implementation("com.squareup.okhttp3:okhttp-tls:3.11.0") // RETROFIT // COROUTINES implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") // COROUTINES // LIFECYCLE implementation("androidx.lifecycle:lifecycle-extensions:2.2.0") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") // LIFECYCLE // DAGGER implementation("com.google.dagger:dagger:2.50") implementation("com.google.dagger:hilt-android:2.50") implementation("com.google.dagger:hilt-compiler:2.50") kapt("com.google.dagger:dagger-compiler:2.50") // WARNING! - We must use kapt because ksp not work properly // DAGGER } //...and in main build.gradle buildscript { dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21") classpath("com.google.dagger:hilt-android-gradle-plugin:2.50") } } plugins { id("com.android.application") version "8.2.0" apply false id("org.jetbrains.kotlin.android") version "1.9.10" apply false id("com.google.devtools.ksp") version "1.9.21-1.0.16" apply false } //Add Dagger //Add viewbinding android { buildFeatures { viewBinding = true } } //Add viewbinding //Define app as HiltApp @HiltAndroidApp class MyApplication : Application() //Define app as HiltApp //Create viewmodel @HiltViewModel class ClazzViewModel @Inject constructor( private val clazzInjected: ClazzInjected ) : ViewModel() {} //Create viewmodel //Add view model and binding @AndroidEntryPoint class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) } } //Add view model and binding //Create network model @Module @InstallIn(SingletonComponent::class) class NetworkModule { @Singleton @Provides //Eventually with interceptor fun provideService(okHttpClient: OkHttpClient): Service { return Retrofit.Builder() .baseUrl(BASE_URL) .client(okHttpClient) //.addConverterFactory(GsonConverterFactory.create(defaultGson)) .build() .create(BeerService::class.java) } @Singleton @Provides fun provideOkHttpClient(): OkHttpClient { return OkHttpClient.Builder().apply { connectTimeout(30, TimeUnit.SECONDS) readTimeout(30, TimeUnit.SECONDS) writeTimeout(30, TimeUnit.SECONDS) hostnameVerifier { _, _ -> true } }.build() } } //Create network model //Create database @InstallIn(SingletonComponent::class) @Module class DatabaseModule { @Provides @Singleton fun provideAppDatabase(@ApplicationContext context: Context): BeerDatabase { return Room.databaseBuilder(context, AppDatabase::class.java, "database") .fallbackToDestructiveMigration().build() } } /**/ @Database( entities = [ Clazz::class, ], version = 1, exportSchema = false, ) abstract class BeerDatabase : RoomDatabase() { abstract fun clazzDao(): ClazzDao } /**/ @Dao interface ClazzDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun addList(list: List) @Query("DELETE from clazz") suspend fun deleteAll() @Query("SELECT * FROM clazz") suspend fun getAll(): List } //Create database