Notes

🧩 Syntax:
//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<ClazzViewModel>()

    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<Clazz>)

    @Query("DELETE from clazz")
    suspend fun deleteAll()

    @Query("SELECT * FROM clazz")
    suspend fun getAll(): List<Clazz>
}
//Create database