diff --git a/app/build.gradle b/app/build.gradle
index 83f697d..84672cb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,6 +1,8 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
+ id 'kotlin-kapt'
+ id 'dagger.hilt.android.plugin'
}
android {
@@ -29,15 +31,24 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+kapt {
+ correctErrorTypes = true
}
dependencies {
-
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
- testImplementation 'junit:junit:4.+'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+
+ implementation "com.google.dagger:hilt-android:$hilt_version"
+ kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
+
+ implementation project(":annotation")
+ kapt project(":processor")
}
\ No newline at end of file
diff --git a/app/src/androidTest/java/org/fnives/library/reloadable/module/hilt/ExampleInstrumentedTest.kt b/app/src/androidTest/java/org/fnives/library/reloadable/module/hilt/ExampleInstrumentedTest.kt
deleted file mode 100644
index e23edd4..0000000
--- a/app/src/androidTest/java/org/fnives/library/reloadable/module/hilt/ExampleInstrumentedTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.fnives.library.reloadable.module.hilt
-
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-import org.junit.Test
-import org.junit.runner.RunWith
-
-import org.junit.Assert.*
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
- @Test
- fun useAppContext() {
- // Context of the app under test.
- val appContext = InstrumentationRegistry.getInstrumentation().targetContext
- assertEquals("org.fnives.library.reloadable.module.hilt", appContext.packageName)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c0adba4..8dca098 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,14 +3,16 @@
package="org.fnives.library.reloadable.module.hilt">
@@ -18,6 +20,8 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/ExampleApplication.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/ExampleApplication.kt
new file mode 100644
index 0000000..37c4cd5
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/ExampleApplication.kt
@@ -0,0 +1,7 @@
+package org.fnives.library.reloadable.module.hilt
+
+import android.app.Application
+import dagger.hilt.android.HiltAndroidApp
+
+@HiltAndroidApp
+class ExampleApplication : Application()
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/LoginActivity.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/LoginActivity.kt
new file mode 100644
index 0000000..1f1a0c6
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/LoginActivity.kt
@@ -0,0 +1,39 @@
+package org.fnives.library.reloadable.module.hilt
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.LayoutInflater
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.widget.doAfterTextChanged
+import dagger.hilt.android.AndroidEntryPoint
+import org.fnives.library.reloadable.module.hilt.usecase.LoginUseCase
+import org.fnives.library.reloadable.module.hilt.databinding.ActivityLoginBinding
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class LoginActivity : AppCompatActivity() {
+
+ @Inject
+ lateinit var loginUseCase: LoginUseCase
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val binding = ActivityLoginBinding.inflate(LayoutInflater.from(this))
+ setContentView(binding.root)
+
+ binding.loginCta.setOnClickListener {
+ try {
+ loginUseCase.login(binding.nameEditText.text?.toString().orEmpty())
+ } catch (illegalArgumentException: IllegalArgumentException) {
+ binding.nameInput.error = getString(R.string.please_fill_username)
+ return@setOnClickListener
+ }
+ startActivity(Intent(this, MainActivity::class.java))
+ finish()
+ }
+
+ binding.nameEditText.doAfterTextChanged {
+ binding.nameInput.isErrorEnabled = false
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/MainActivity.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/MainActivity.kt
index 6df75f5..0bb48fc 100644
--- a/app/src/main/java/org/fnives/library/reloadable/module/hilt/MainActivity.kt
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/MainActivity.kt
@@ -1,11 +1,29 @@
package org.fnives.library.reloadable.module.hilt
-import androidx.appcompat.app.AppCompatActivity
+import android.content.Intent
import android.os.Bundle
+import android.view.LayoutInflater
+import androidx.appcompat.app.AppCompatActivity
+import dagger.hilt.android.AndroidEntryPoint
+import org.fnives.library.reloadable.module.hilt.databinding.ActivityMainBinding
+import org.fnives.library.reloadable.module.hilt.usecase.GetUser
+import javax.inject.Inject
+@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
+
+ @Inject
+ lateinit var getUser: GetUser
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
+ val binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
+ setContentView(binding.root)
+
+ val user = getUser.invoke()
+ binding.welcome.text = getString(R.string.hello_user, user.name, user.content)
+ binding.settingsCta.setOnClickListener {
+ startActivity(Intent(this, SettingsActivity::class.java))
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/SettingsActivity.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/SettingsActivity.kt
new file mode 100644
index 0000000..b5ebe1f
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/SettingsActivity.kt
@@ -0,0 +1,35 @@
+package org.fnives.library.reloadable.module.hilt
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.LayoutInflater
+import androidx.appcompat.app.AppCompatActivity
+import dagger.hilt.android.AndroidEntryPoint
+import org.fnives.library.reloadable.module.hilt.databinding.ActivityLogoutBinding
+import org.fnives.library.reloadable.module.hilt.usecase.GetUser
+import org.fnives.library.reloadable.module.hilt.usecase.LogoutUseCase
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class SettingsActivity : AppCompatActivity() {
+
+ @Inject
+ lateinit var logoutUseCase: LogoutUseCase
+
+ @Inject
+ lateinit var getUserUseCase: GetUser
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val binding = ActivityLogoutBinding.inflate(LayoutInflater.from(this))
+ setContentView(binding.root)
+ val user = getUserUseCase.invoke()
+ binding.bye.text = getString(R.string.bye_user, user.name, user.content)
+
+ binding.logoutCta.setOnClickListener {
+ logoutUseCase.invoke()
+ startActivity(Intent(this, LoginActivity::class.java))
+ finishAffinity()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentGenerator.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentGenerator.kt
new file mode 100644
index 0000000..82797b2
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentGenerator.kt
@@ -0,0 +1,9 @@
+package org.fnives.library.reloadable.module.hilt.data
+
+import javax.inject.Inject
+import kotlin.random.Random
+
+class ContentGenerator @Inject constructor(){
+
+ fun getContent() = Random.nextInt(100)
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentRepository.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentRepository.kt
new file mode 100644
index 0000000..f1ca830
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentRepository.kt
@@ -0,0 +1,10 @@
+package org.fnives.library.reloadable.module.hilt.data
+
+import org.fnives.library.reloadable.module.hilt.di.LoggedInModuleInject
+
+class ContentRepository @LoggedInModuleInject constructor(private val contentGenerator: ContentGenerator) {
+
+ private var content: Int? = null
+
+ fun getContent() = content ?: contentGenerator.getContent().also { content = it }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/User.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/User.kt
new file mode 100644
index 0000000..5b34c7a
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/User.kt
@@ -0,0 +1,3 @@
+package org.fnives.library.reloadable.module.hilt.data
+
+data class User(val name: String, val content: Int)
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/UserRepository.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/UserRepository.kt
new file mode 100644
index 0000000..7d1f8db
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/data/UserRepository.kt
@@ -0,0 +1,14 @@
+package org.fnives.library.reloadable.module.hilt.data
+
+import org.fnives.library.reloadable.module.hilt.di.LoggedInModuleInject
+
+class UserRepository @LoggedInModuleInject constructor() {
+
+ var userName: String? = null
+ private set
+
+ fun login(name: String) {
+ userName = name
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/di/LoggedInModuleInject.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/di/LoggedInModuleInject.kt
new file mode 100644
index 0000000..7abcdb8
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/di/LoggedInModuleInject.kt
@@ -0,0 +1,8 @@
+package org.fnives.library.reloadable.module.hilt.di
+
+import org.fnives.library.reloadable.module.annotation.ReloadableModule
+
+@ReloadableModule
+@Target(AnnotationTarget.CONSTRUCTOR)
+@Retention(AnnotationRetention.SOURCE)
+annotation class LoggedInModuleInject
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/GetUser.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/GetUser.kt
new file mode 100644
index 0000000..5c3fbfe
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/GetUser.kt
@@ -0,0 +1,14 @@
+package org.fnives.library.reloadable.module.hilt.usecase
+
+import org.fnives.library.reloadable.module.hilt.data.ContentRepository
+import org.fnives.library.reloadable.module.hilt.data.User
+import org.fnives.library.reloadable.module.hilt.data.UserRepository
+import javax.inject.Inject
+
+class GetUser @Inject constructor(
+ private val userRepository: UserRepository,
+ private val contentRepository: ContentRepository
+) {
+
+ fun invoke() = User(userRepository.userName.orEmpty(), contentRepository.getContent())
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LoginUseCase.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LoginUseCase.kt
new file mode 100644
index 0000000..40a1164
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LoginUseCase.kt
@@ -0,0 +1,13 @@
+package org.fnives.library.reloadable.module.hilt.usecase
+
+import org.fnives.library.reloadable.module.hilt.data.UserRepository
+import javax.inject.Inject
+
+class LoginUseCase @Inject constructor(private val userRepository: UserRepository) {
+
+ @Throws(IllegalArgumentException::class)
+ fun login(name: String) {
+ if (name.isEmpty()) throw IllegalArgumentException("")
+ userRepository.login(name)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LogoutUseCase.kt b/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LogoutUseCase.kt
new file mode 100644
index 0000000..3a25e1d
--- /dev/null
+++ b/app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LogoutUseCase.kt
@@ -0,0 +1,13 @@
+package org.fnives.library.reloadable.module.hilt.usecase
+
+import org.fnives.library.reloadable.module.hilt.di.ReloadLoggedInModuleInjectModule
+import javax.inject.Inject
+
+class LogoutUseCase @Inject constructor(
+ private val reloadLoggedInModuleInjectModule: ReloadLoggedInModuleInjectModule
+) {
+
+ fun invoke() {
+ reloadLoggedInModuleInjectModule.reload()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml
new file mode 100644
index 0000000..83cdf05
--- /dev/null
+++ b/app/src/main/res/drawable/ic_exit.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml
new file mode 100644
index 0000000..41a82ed
--- /dev/null
+++ b/app/src/main/res/drawable/ic_settings.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..c29c853
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_logout.xml b/app/src/main/res/layout/activity_logout.xml
new file mode 100644
index 0000000..bccdb78
--- /dev/null
+++ b/app/src/main/res/layout/activity_logout.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 4fc2444..9344ac5 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -6,10 +6,22 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
-
+
+
+
+ 24dp
+ 48dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 59fdddb..f41f494 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,10 @@
HiltReloadableModule
+ login
+ Any Name
+ Please give a name
+ hello %1$s your content: %2$d!
+ Bye %1$s your content: %2$d!
+ Settings
+ Logout
\ No newline at end of file
diff --git a/app/src/test/java/org/fnives/library/reloadable/module/hilt/ExampleUnitTest.kt b/app/src/test/java/org/fnives/library/reloadable/module/hilt/ExampleUnitTest.kt
deleted file mode 100644
index c6cde2d..0000000
--- a/app/src/test/java/org/fnives/library/reloadable/module/hilt/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.fnives.library.reloadable.module.hilt
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
- @Test
- fun addition_isCorrect() {
- assertEquals(4, 2 + 2)
- }
-}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index c38fd43..86564d5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,8 @@ buildscript {
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.0"
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files