Dependency Injection using Hilt
continuous-integration/drone/push Build is passing Details

pull/3/head
Arthur VALIN 1 year ago
parent 16c6cb2309
commit 8c0cd243ae

@ -1,6 +1,8 @@
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id "kotlin-kapt"
id "dagger.hilt.android.plugin"
} }
android { android {
@ -66,5 +68,10 @@ dependencies {
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
implementation("androidx.core:core-splashscreen:1.0.1") implementation("androidx.core:core-splashscreen:1.0.1")
//Hilt
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
implementation "androidx.hilt:hilt-navigation-compose:1.0.0"
implementation 'com.github.racra:smooth-corner-rect-android-compose:v1.0.0' implementation 'com.github.racra:smooth-corner-rect-android-compose:v1.0.0'
} }

@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<application <application
android:name=".AllInApplication"
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
@ -12,7 +13,7 @@
android:theme="@style/Theme.Allin" android:theme="@style/Theme.Allin"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity
android:name=".MainActivity" android:name=".ui.MainActivity"
android:exported="true" android:exported="true"
android:theme="@style/Theme.Allin"> android:theme="@style/Theme.Allin">
<intent-filter> <intent-filter>

@ -0,0 +1,7 @@
package fr.iut.alldev.allin
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class AllInApplication : Application()

@ -1,4 +1,4 @@
package fr.iut.alldev.allin package fr.iut.alldev.allin.ui
import android.app.Activity import android.app.Activity
import android.os.Build import android.os.Build
@ -11,9 +11,11 @@ import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import dagger.hilt.android.AndroidEntryPoint
import fr.iut.alldev.allin.ui.navigation.AllInNavHost import fr.iut.alldev.allin.ui.navigation.AllInNavHost
import fr.iut.alldev.allin.ui.theme.AllInTheme import fr.iut.alldev.allin.ui.theme.AllInTheme
@AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

@ -14,6 +14,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import fr.iut.alldev.allin.R import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.core.AllInGradientButton import fr.iut.alldev.allin.ui.core.AllInGradientButton
import fr.iut.alldev.allin.ui.core.AllInPasswordField import fr.iut.alldev.allin.ui.core.AllInPasswordField
@ -24,7 +25,8 @@ import fr.iut.alldev.allin.ui.theme.AllInTheme
@Composable @Composable
fun LoginScreen( fun LoginScreen(
onClickLogin: ()->Unit, onClickLogin: ()->Unit,
onClickRegister: ()->Unit onClickRegister: ()->Unit,
loginViewModel: LoginViewModel = hiltViewModel()
) { ) {
val bringIntoViewRequester = BringIntoViewRequester() val bringIntoViewRequester = BringIntoViewRequester()

@ -0,0 +1,11 @@
package fr.iut.alldev.allin.ui.login
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class LoginViewModel @Inject constructor(
) : ViewModel() {
}

@ -16,6 +16,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import fr.iut.alldev.allin.R import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.core.AllInGradientButton import fr.iut.alldev.allin.ui.core.AllInGradientButton
import fr.iut.alldev.allin.ui.core.AllInPasswordField import fr.iut.alldev.allin.ui.core.AllInPasswordField
@ -25,12 +26,15 @@ import fr.iut.alldev.allin.ui.theme.AllInTheme
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun RegisterScreen( fun RegisterScreen(
onClickRegister: ()->Unit, onClickRegister: () -> Unit,
onClickLogin: ()->Unit onClickLogin: () -> Unit,
registerViewModel: RegisterViewModel = hiltViewModel(),
) { ) {
var username by remember{ val (username, setUsername) = remember{ registerViewModel.username }
mutableStateOf("") val (email, setEmail) = remember{ registerViewModel.email }
} val (password, setPassword) = remember{ registerViewModel.password }
val (passwordValidation, setPasswordValidation) = remember{ registerViewModel.passwordValidation }
val bringIntoViewRequester = remember { BringIntoViewRequester() } val bringIntoViewRequester = remember { BringIntoViewRequester() }
Box( Box(
@ -78,30 +82,30 @@ fun RegisterScreen(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
placeholder = stringResource(id = R.string.username), placeholder = stringResource(id = R.string.username),
value = username, value = username,
onValueChange = { username = it }, onValueChange = setUsername,
maxChar = 20, maxChar = 20,
bringIntoViewRequester = bringIntoViewRequester bringIntoViewRequester = bringIntoViewRequester
) )
AllInTextField( AllInTextField(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
placeholder = stringResource(id = R.string.email), placeholder = stringResource(id = R.string.email),
value = "", value = email,
onValueChange = { }, onValueChange = setEmail,
keyboardType = KeyboardType.Email, keyboardType = KeyboardType.Email,
bringIntoViewRequester = bringIntoViewRequester bringIntoViewRequester = bringIntoViewRequester
) )
AllInPasswordField( AllInPasswordField(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
placeholder = stringResource(id = R.string.password), placeholder = stringResource(id = R.string.password),
value = "", value = password,
onValueChange = { }, onValueChange = setPassword,
bringIntoViewRequester = bringIntoViewRequester bringIntoViewRequester = bringIntoViewRequester
) )
AllInPasswordField( AllInPasswordField(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
placeholder = stringResource(id = R.string.confirm_password), placeholder = stringResource(id = R.string.confirm_password),
value = "", value = passwordValidation,
onValueChange = { }, onValueChange = setPasswordValidation,
bringIntoViewRequester = bringIntoViewRequester bringIntoViewRequester = bringIntoViewRequester
) )
} }

@ -0,0 +1,18 @@
package fr.iut.alldev.allin.ui.register
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import fr.iut.alldev.allin.data.repository.UserRepository
import javax.inject.Inject
@HiltViewModel
class RegisterViewModel @Inject constructor(
val userRepository: UserRepository
) : ViewModel() {
val username = mutableStateOf("")
val email = mutableStateOf("")
val password = mutableStateOf("")
val passwordValidation = mutableStateOf("")
}

@ -2,10 +2,13 @@ buildscript {
ext { ext {
compose_version = '1.2.0' compose_version = '1.2.0'
accompanist_version = '0.25.1' accompanist_version = '0.25.1'
hilt_version = "2.45"
} }
}// Top-level build file where you can add configuration options common to all sub-projects/modules. }// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins { plugins {
id 'com.android.application' version '7.4.2' apply false id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.7.0' apply false id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
id("com.google.dagger.hilt.android") version "$hilt_version" apply false
} }

@ -1,6 +1,7 @@
plugins { plugins {
id 'com.android.library' id 'com.android.library'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id "kotlin-kapt"
} }
android { android {
@ -38,4 +39,8 @@ dependencies {
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
//Hilt
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
} }

@ -0,0 +1,17 @@
package fr.iut.alldev.allin.data.di
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import fr.iut.alldev.allin.data.repository.UserRepository
import fr.iut.alldev.allin.data.repository.impl.UserRepositoryImpl
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Singleton
@Binds
abstract fun provideUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository
}

@ -0,0 +1,8 @@
package fr.iut.alldev.allin.data.model
data class User(
val id : String,
val username : String,
val email : String,
val coins : Int
)

@ -0,0 +1,4 @@
package fr.iut.alldev.allin.data.repository
abstract class UserRepository {
}

@ -0,0 +1,10 @@
package fr.iut.alldev.allin.data.repository.impl
import fr.iut.alldev.allin.data.repository.UserRepository
import javax.inject.Inject
class UserRepositoryImpl @Inject constructor(
) : UserRepository() {
}
Loading…
Cancel
Save