diff --git a/src/app/build.gradle b/src/app/build.gradle index 36bf23c..8694db6 100644 --- a/src/app/build.gradle +++ b/src/app/build.gradle @@ -5,7 +5,18 @@ plugins { id "dagger.hilt.android.plugin" } +def keystorePropertiesFile = rootProject.file("app/keys/keystore.properties") +def keystoreProperties = new Properties() +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + android { + signingConfigs { + release { + storeFile file(keystoreProperties['store']) + storePassword keystoreProperties['password'] + keyPassword keystoreProperties['password'] + } + } namespace 'fr.iut.alldev.allin' compileSdk 34 @@ -24,8 +35,15 @@ android { buildTypes { release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug + } + + debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug } } compileOptions { diff --git a/src/app/debug/app-debug.aab b/src/app/debug/app-debug.aab new file mode 100644 index 0000000..d2b5176 Binary files /dev/null and b/src/app/debug/app-debug.aab differ diff --git a/src/app/keys/keystore.jks b/src/app/keys/keystore.jks new file mode 100644 index 0000000..bb4e75c Binary files /dev/null and b/src/app/keys/keystore.jks differ diff --git a/src/app/keys/keystore.properties b/src/app/keys/keystore.properties new file mode 100644 index 0000000..fe9ab09 --- /dev/null +++ b/src/app/keys/keystore.properties @@ -0,0 +1,2 @@ +store=keys/keystore.jks +password=placeYourBets \ No newline at end of file diff --git a/src/app/keys/private_key.pepk b/src/app/keys/private_key.pepk new file mode 100644 index 0000000..be8173b Binary files /dev/null and b/src/app/keys/private_key.pepk differ diff --git a/src/app/release/app-release.aab b/src/app/release/app-release.aab new file mode 100644 index 0000000..621d252 Binary files /dev/null and b/src/app/release/app-release.aab differ diff --git a/src/app/src/debug/res/values/strings.xml b/src/app/src/debug/res/values/strings.xml new file mode 100644 index 0000000..851c1c6 --- /dev/null +++ b/src/app/src/debug/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Allin_DEBUG + \ No newline at end of file diff --git a/src/app/src/main/AndroidManifest.xml b/src/app/src/main/AndroidManifest.xml index b5080f8..7a815cd 100644 --- a/src/app/src/main/AndroidManifest.xml +++ b/src/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + Unit, + onConfirm: ()->Unit = onDismiss +) { + if(enabled) { + AlertDialog( + title = { + Text( + text = title, + fontSize = 20.sp, + style = AllInTheme.typography.h1 + ) + }, + text = { + Text( + text = text, + style = AllInTheme.typography.r + ) + }, + confirmButton = { + TextButton( + onClick = onConfirm + ) { + Text( + text = confirmText, + fontSize = 15.sp, + style = AllInTheme.typography.h1.copy( + brush = AllInTheme.colors.allIn_MainGradient + ) + ) + } + + }, + onDismissRequest = onDismiss, + containerColor = AllInTheme.themeColors.main_surface, + titleContentColor = AllInTheme.themeColors.on_main_surface, + textContentColor = AllInTheme.themeColors.on_background_2, + ) + } +} + +@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun AllInAlertDialogPreview() { + AllInTheme { + AllInAlertDialog( + title = "Titre", + text = "Lorem Ipsum", + onDismiss = {} + ) + } +} \ No newline at end of file diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginScreen.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginScreen.kt index d9af848..2e11705 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginScreen.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginScreen.kt @@ -1,12 +1,19 @@ package fr.iut.alldev.allin.ui.login import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.* +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.relocation.BringIntoViewRequester +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.ClickableText +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -17,13 +24,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import fr.iut.alldev.allin.R -import fr.iut.alldev.allin.ui.core.AllInGradientButton -import fr.iut.alldev.allin.ui.core.AllInLoading -import fr.iut.alldev.allin.ui.core.AllInPasswordField -import fr.iut.alldev.allin.ui.core.AllInTextField +import fr.iut.alldev.allin.ui.core.* import fr.iut.alldev.allin.ui.theme.AllInTheme -@OptIn(ExperimentalFoundationApi::class) +@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @Composable fun LoginScreen( navigateToDashboard: ()->Unit, @@ -33,6 +37,10 @@ fun LoginScreen( val bringIntoViewRequester = BringIntoViewRequester() val loading by remember{ loginViewModel.loading } + var hasLoginError by remember{ loginViewModel.hasError } + + val (username, setUsername) = remember{ loginViewModel.username } + val (password, setPassword) = remember{ loginViewModel.password } Box( Modifier @@ -68,15 +76,15 @@ fun LoginScreen( AllInTextField( modifier = Modifier.fillMaxWidth(), placeholder = stringResource(id = R.string.username), - value = "", - onValueChange = { }, + value = username, + onValueChange = setUsername, bringIntoViewRequester = bringIntoViewRequester ) AllInPasswordField( modifier = Modifier.fillMaxWidth(), placeholder = stringResource(id = R.string.password), - value = "", - onValueChange = { }, + value = password, + onValueChange = setPassword, bringIntoViewRequester = bringIntoViewRequester ) } @@ -135,4 +143,10 @@ fun LoginScreen( AnimatedVisibility(visible = loading) { AllInLoading() } + AllInAlertDialog( + enabled = hasLoginError, + title = stringResource(id = R.string.Login_Error_Title), + text = stringResource(id = R.string.Login_Error_Content), + onDismiss = { hasLoginError = false } + ) } \ No newline at end of file diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginViewModel.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginViewModel.kt index 2fbe80f..a92bba6 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginViewModel.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/login/LoginViewModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import fr.iut.alldev.allin.data.repository.UserRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -11,18 +12,30 @@ import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( + private val userRepository: UserRepository ) : ViewModel() { var loading = mutableStateOf(false) + var hasError = mutableStateOf(false) + + val username = mutableStateOf("") + val password = mutableStateOf("") fun onLogin( navigateToDashboard: ()->Unit ){ viewModelScope.launch { loading.value = true + withContext(Dispatchers.IO) { - Thread.sleep(3000) + try{ + userRepository.login(username.value, password.value) + } catch (e: retrofit2.HttpException){ + hasError.value = true + } + } + if(!hasError.value){ + navigateToDashboard() } - navigateToDashboard() loading.value = false } } diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterScreen.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterScreen.kt index 014fbf8..5fcdacb 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterScreen.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterScreen.kt @@ -1,5 +1,6 @@ package fr.iut.alldev.allin.ui.register +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.relocation.BringIntoViewRequester @@ -19,6 +20,7 @@ import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import fr.iut.alldev.allin.R import fr.iut.alldev.allin.ui.core.AllInGradientButton +import fr.iut.alldev.allin.ui.core.AllInLoading import fr.iut.alldev.allin.ui.core.AllInPasswordField import fr.iut.alldev.allin.ui.core.AllInTextField import fr.iut.alldev.allin.ui.theme.AllInTheme @@ -30,6 +32,8 @@ fun RegisterScreen( navigateToLogin: () -> Unit, registerViewModel: RegisterViewModel = hiltViewModel(), ) { + val loading by remember{ registerViewModel.loading } + val (username, setUsername) = remember{ registerViewModel.username } val (email, setEmail) = remember{ registerViewModel.email } val (password, setPassword) = remember{ registerViewModel.password } @@ -118,7 +122,9 @@ fun RegisterScreen( ) { AllInGradientButton( text = stringResource(id = R.string.Register), - onClick = navigateToDashboard + onClick = { + registerViewModel.onRegister(navigateToDashboard) + } ) Spacer(modifier = Modifier.height(30.dp)) Row( @@ -145,4 +151,7 @@ fun RegisterScreen( } } } + AnimatedVisibility(visible = loading) { + AllInLoading() + } } \ No newline at end of file diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterViewModel.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterViewModel.kt index 50cee46..53cd8aa 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterViewModel.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/register/RegisterViewModel.kt @@ -2,8 +2,12 @@ package fr.iut.alldev.allin.ui.register import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import fr.iut.alldev.allin.data.repository.UserRepository +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject @HiltViewModel @@ -11,8 +15,28 @@ class RegisterViewModel @Inject constructor( val userRepository: UserRepository ) : ViewModel() { + var loading = mutableStateOf(false) + val username = mutableStateOf("") val email = mutableStateOf("") val password = mutableStateOf("") val passwordValidation = mutableStateOf("") + + fun onRegister( + navigateToDashboard: ()->Unit + ){ + viewModelScope.launch { + loading.value = true + + withContext(Dispatchers.IO) { + userRepository.register( + username.value, + email.value, + password.value + ) + } + navigateToDashboard() + loading.value = false + } + } } \ No newline at end of file diff --git a/src/app/src/main/res/values-fr/strings.xml b/src/app/src/main/res/values-fr/strings.xml index 2d04fbf..3cca4a7 100644 --- a/src/app/src/main/res/values-fr/strings.xml +++ b/src/app/src/main/res/values-fr/strings.xml @@ -11,6 +11,7 @@ S\'inscrire Valider Annuler + OK Bets @@ -36,6 +37,8 @@ Te revoilà ! Bon retour parmis nous tu nous as manqué ! + Erreur de connexion + La connexion a échoué\nVeuillez réessayer. Le sujet du bet. Généralement la question à laquelle les participants devront répondre. diff --git a/src/app/src/main/res/values/strings.xml b/src/app/src/main/res/values/strings.xml index cc235c7..d339f48 100644 --- a/src/app/src/main/res/values/strings.xml +++ b/src/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Register Validate Cancel + OK Bets @@ -40,6 +41,8 @@ Welcome back ! We missed you. + Connection error + Failed to login\nPlease try again. Question Answer diff --git a/src/build.gradle b/src/build.gradle index 3acbbfe..8ffeef2 100644 --- a/src/build.gradle +++ b/src/build.gradle @@ -4,11 +4,13 @@ buildscript { 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. plugins { id 'com.android.application' 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("com.google.dagger.hilt.android") version "$hilt_version" apply false + id 'com.google.dagger.hilt.android' version "$hilt_version" apply false + id 'org.jetbrains.kotlin.plugin.serialization' version '1.7.0' apply false +} -} \ No newline at end of file diff --git a/src/data/build.gradle b/src/data/build.gradle index f99eae0..853b789 100644 --- a/src/data/build.gradle +++ b/src/data/build.gradle @@ -2,9 +2,21 @@ plugins { id 'com.android.library' id 'org.jetbrains.kotlin.android' id "kotlin-kapt" + id "kotlinx-serialization" } +def keystorePropertiesFile = rootProject.file("app/keys/keystore.properties") +def keystoreProperties = new Properties() +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + android { + signingConfigs { + release { + storeFile file(keystoreProperties['store']) + storePassword keystoreProperties['password'] + keyPassword keystoreProperties['password'] + } + } namespace 'fr.iut.alldev.allin.data' compileSdk 34 @@ -18,8 +30,15 @@ android { buildTypes { release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug + } + + debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug } } compileOptions { @@ -43,4 +62,11 @@ dependencies { //Hilt implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-android-compiler:$hilt_version" + + // Retrofit + api "com.squareup.retrofit2:retrofit:2.9.0" + implementation "com.squareup.okhttp3:okhttp:4.11.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" + api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1" + implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" } \ No newline at end of file diff --git a/src/data/src/debug/java/fr/iut/alldev/allin/data/di/DebugModule.kt b/src/data/src/debug/java/fr/iut/alldev/allin/data/di/DebugModule.kt new file mode 100644 index 0000000..75aa252 --- /dev/null +++ b/src/data/src/debug/java/fr/iut/alldev/allin/data/di/DebugModule.kt @@ -0,0 +1,9 @@ +package fr.iut.alldev.allin.data.di + +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module(includes = [DebugNetworkModule::class]) +@InstallIn(SingletonComponent::class) +object DebugModule \ No newline at end of file diff --git a/src/data/src/debug/java/fr/iut/alldev/allin/data/di/DebugNetworkModule.kt b/src/data/src/debug/java/fr/iut/alldev/allin/data/di/DebugNetworkModule.kt new file mode 100644 index 0000000..8b47e52 --- /dev/null +++ b/src/data/src/debug/java/fr/iut/alldev/allin/data/di/DebugNetworkModule.kt @@ -0,0 +1,25 @@ +package fr.iut.alldev.allin.data.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object DebugNetworkModule { + + @Provides + @Singleton + fun provideOkHttpClient(): OkHttpClient = + OkHttpClient.Builder() + .addInterceptor( + HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BODY + } + ) + .build() +} \ No newline at end of file diff --git a/src/data/src/main/java/fr/iut/alldev/allin/data/api/AllInApi.kt b/src/data/src/main/java/fr/iut/alldev/allin/data/api/AllInApi.kt new file mode 100644 index 0000000..e96d2d4 --- /dev/null +++ b/src/data/src/main/java/fr/iut/alldev/allin/data/api/AllInApi.kt @@ -0,0 +1,19 @@ +package fr.iut.alldev.allin.data.api + +import fr.iut.alldev.allin.data.api.model.CheckUser +import fr.iut.alldev.allin.data.api.model.ResponseUser +import retrofit2.http.Body +import retrofit2.http.POST + + +interface AllInApi { + @POST("users/login") + suspend fun login( + @Body body: CheckUser + ): ResponseUser + + @POST("users/register") + suspend fun register( + @Body body: ResponseUser + ): ResponseUser +} \ No newline at end of file diff --git a/src/data/src/main/java/fr/iut/alldev/allin/data/api/model/ResponseUser.kt b/src/data/src/main/java/fr/iut/alldev/allin/data/api/model/ResponseUser.kt new file mode 100644 index 0000000..122e39b --- /dev/null +++ b/src/data/src/main/java/fr/iut/alldev/allin/data/api/model/ResponseUser.kt @@ -0,0 +1,20 @@ +package fr.iut.alldev.allin.data.api.model + +import androidx.annotation.Keep +import kotlinx.serialization.Serializable + +@Keep +@Serializable +data class ResponseUser( + val username: String, + val email: String, + val password: String, + var nbCoins: Int, +) + +@Keep +@Serializable +data class CheckUser( + val username: String, + val password: String, +) \ No newline at end of file diff --git a/src/data/src/main/java/fr/iut/alldev/allin/data/di/ApiModule.kt b/src/data/src/main/java/fr/iut/alldev/allin/data/di/ApiModule.kt new file mode 100644 index 0000000..9bc2238 --- /dev/null +++ b/src/data/src/main/java/fr/iut/alldev/allin/data/di/ApiModule.kt @@ -0,0 +1,23 @@ +package fr.iut.alldev.allin.data.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import fr.iut.alldev.allin.data.api.AllInApi +import fr.iut.alldev.allin.data.di.NetworkModule.createRetrofit +import okhttp3.HttpUrl +import okhttp3.OkHttpClient +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class ApiModule { + + @Provides + @Singleton + fun provideAllInApi(@AllInUrl url: HttpUrl, okHttpClient: OkHttpClient): AllInApi { + val retrofit = createRetrofit(url = url, okHttpClient = okHttpClient) + return retrofit.create(AllInApi::class.java) + } +} \ No newline at end of file diff --git a/src/data/src/main/java/fr/iut/alldev/allin/data/di/NetworkModule.kt b/src/data/src/main/java/fr/iut/alldev/allin/data/di/NetworkModule.kt new file mode 100644 index 0000000..05ada4a --- /dev/null +++ b/src/data/src/main/java/fr/iut/alldev/allin/data/di/NetworkModule.kt @@ -0,0 +1,41 @@ +package fr.iut.alldev.allin.data.di + +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import javax.inject.Qualifier + +internal val json by lazy { + Json { + ignoreUnknownKeys = true + encodeDefaults = false + } +} + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class AllInUrl + +@Module +@InstallIn(SingletonComponent::class) +internal object NetworkModule { + + @AllInUrl + @Provides + fun provideUrl(): HttpUrl = "https://codefirst.iut.uca.fr/containers/AllDev-api/".toHttpUrl() + + fun createRetrofit(url: HttpUrl, okHttpClient: OkHttpClient): Retrofit = + Retrofit.Builder() + .client(okHttpClient) + .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .baseUrl(url) + .build() +} \ No newline at end of file diff --git a/src/data/src/main/java/fr/iut/alldev/allin/data/repository/UserRepository.kt b/src/data/src/main/java/fr/iut/alldev/allin/data/repository/UserRepository.kt index 2b7ebe4..d441409 100644 --- a/src/data/src/main/java/fr/iut/alldev/allin/data/repository/UserRepository.kt +++ b/src/data/src/main/java/fr/iut/alldev/allin/data/repository/UserRepository.kt @@ -1,4 +1,13 @@ package fr.iut.alldev.allin.data.repository abstract class UserRepository { + abstract suspend fun login( + username: String, + password: String + ) + abstract suspend fun register( + username: String, + email: String, + password: String + ) } \ No newline at end of file diff --git a/src/data/src/main/java/fr/iut/alldev/allin/data/repository/impl/UserRepositoryImpl.kt b/src/data/src/main/java/fr/iut/alldev/allin/data/repository/impl/UserRepositoryImpl.kt index 7e0194f..d946253 100644 --- a/src/data/src/main/java/fr/iut/alldev/allin/data/repository/impl/UserRepositoryImpl.kt +++ b/src/data/src/main/java/fr/iut/alldev/allin/data/repository/impl/UserRepositoryImpl.kt @@ -1,10 +1,32 @@ package fr.iut.alldev.allin.data.repository.impl +import fr.iut.alldev.allin.data.api.AllInApi +import fr.iut.alldev.allin.data.api.model.CheckUser +import fr.iut.alldev.allin.data.api.model.ResponseUser import fr.iut.alldev.allin.data.repository.UserRepository import javax.inject.Inject class UserRepositoryImpl @Inject constructor( - + private val api: AllInApi, ) : UserRepository() { + override suspend fun login(username: String, password: String) { + api.login( + CheckUser( + username = username, + password = password + ) + ) + } + + override suspend fun register(username: String, email: String, password: String) { + api.register( + ResponseUser( + username = username, + email = email, + password = password, + nbCoins = 0 + ) + ) + } } \ No newline at end of file diff --git a/src/data/src/release/java/fr.iut.alldev.allin.data.di/ReleaseModule.kt b/src/data/src/release/java/fr.iut.alldev.allin.data.di/ReleaseModule.kt new file mode 100644 index 0000000..02df214 --- /dev/null +++ b/src/data/src/release/java/fr.iut.alldev.allin.data.di/ReleaseModule.kt @@ -0,0 +1,13 @@ +package fr.iut.alldev.allin.data.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import javax.inject.Singleton + +@Module(includes = [ReleaseNetworkModule::class]) +@InstallIn(SingletonComponent::class) +object ReleaseModule \ No newline at end of file diff --git a/src/data/src/release/java/fr.iut.alldev.allin.data.di/ReleaseNetworkModule.kt b/src/data/src/release/java/fr.iut.alldev.allin.data.di/ReleaseNetworkModule.kt new file mode 100644 index 0000000..328e8a8 --- /dev/null +++ b/src/data/src/release/java/fr.iut.alldev.allin.data.di/ReleaseNetworkModule.kt @@ -0,0 +1,20 @@ +package fr.iut.alldev.allin.data.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object ReleaseNetworkModule { + + @Provides + @Singleton + fun provideOkHttpClient(): OkHttpClient = + OkHttpClient.Builder() + .build() +} \ No newline at end of file