From d9ba8c5e274ef9e51c842903a44ab7f9426dc1c9 Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Fri, 30 Jul 2021 23:33:35 +0300 Subject: [PATCH] Create example application --- app/build.gradle | 19 +++++++-- .../module/hilt/ExampleInstrumentedTest.kt | 24 ------------ app/src/main/AndroidManifest.xml | 8 +++- .../module/hilt/ExampleApplication.kt | 7 ++++ .../reloadable/module/hilt/LoginActivity.kt | 39 +++++++++++++++++++ .../reloadable/module/hilt/MainActivity.kt | 22 ++++++++++- .../module/hilt/SettingsActivity.kt | 35 +++++++++++++++++ .../module/hilt/data/ContentGenerator.kt | 9 +++++ .../module/hilt/data/ContentRepository.kt | 10 +++++ .../reloadable/module/hilt/data/User.kt | 3 ++ .../module/hilt/data/UserRepository.kt | 14 +++++++ .../module/hilt/di/LoggedInModuleInject.kt | 8 ++++ .../reloadable/module/hilt/usecase/GetUser.kt | 14 +++++++ .../module/hilt/usecase/LoginUseCase.kt | 13 +++++++ .../module/hilt/usecase/LogoutUseCase.kt | 13 +++++++ app/src/main/res/drawable/ic_exit.xml | 10 +++++ app/src/main/res/drawable/ic_settings.xml | 10 +++++ app/src/main/res/layout/activity_login.xml | 38 ++++++++++++++++++ app/src/main/res/layout/activity_logout.xml | 30 ++++++++++++++ app/src/main/res/layout/activity_main.xml | 16 +++++++- app/src/main/res/values/dimens.xml | 5 +++ app/src/main/res/values/strings.xml | 7 ++++ .../reloadable/module/hilt/ExampleUnitTest.kt | 17 -------- build.gradle | 3 +- 24 files changed, 322 insertions(+), 52 deletions(-) delete mode 100644 app/src/androidTest/java/org/fnives/library/reloadable/module/hilt/ExampleInstrumentedTest.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/ExampleApplication.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/LoginActivity.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/SettingsActivity.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentGenerator.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/data/ContentRepository.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/data/User.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/data/UserRepository.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/di/LoggedInModuleInject.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/GetUser.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LoginUseCase.kt create mode 100644 app/src/main/java/org/fnives/library/reloadable/module/hilt/usecase/LogoutUseCase.kt create mode 100644 app/src/main/res/drawable/ic_exit.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_logout.xml create mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/test/java/org/fnives/library/reloadable/module/hilt/ExampleUnitTest.kt 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