mise en place du squelette de l'application

This commit is contained in:
Lucas Zborowski 2024-12-10 17:40:17 +01:00
parent 61ad631f28
commit 4539301619
13 changed files with 253 additions and 5 deletions

View File

@ -7,6 +7,9 @@ plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.compose)
alias(libs.plugins.hilt)
alias(libs.plugins.kotlin.serialization)
} }
// Keystore // Keystore
@ -88,6 +91,7 @@ dependencies {
implementation(libs.hilt.android) implementation(libs.hilt.android)
ksp(libs.hilt.compiler) ksp(libs.hilt.compiler)
implementation(libs.hilt.navigation.compose) implementation(libs.hilt.navigation.compose)
implementation(libs.matomo)
// Compose // Compose
implementation(platform(libs.compose.bom)) implementation(platform(libs.compose.bom))
@ -96,9 +100,15 @@ dependencies {
// Timber // Timber
implementation(libs.timber) implementation(libs.timber)
implementation(libs.androidx.navigation.compose)
// Tests // Tests
testImplementation(libs.test.junit) testImplementation(libs.test.junit)
androidTestImplementation(libs.test.junit) androidTestImplementation(libs.test.junit)
androidTestImplementation(libs.test.espresso) androidTestImplementation(libs.test.espresso)
androidTestImplementation(libs.test.androidx.junit) androidTestImplementation(libs.test.androidx.junit)
implementation(libs.kotlin.serialization)
} }

View File

@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" > xmlns:tools="http://schemas.android.com/tools" >
<application <application
android:name=".DemoApplication"
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"

View File

@ -0,0 +1,13 @@
package fr.openium.consentium
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class DemoApplication : Application() {
override fun onCreate() {
super.onCreate()
}
}

View File

@ -4,6 +4,7 @@ import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
@ -11,19 +12,29 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.compose.rememberNavController
import dagger.hilt.android.AndroidEntryPoint
import fr.openium.afu.ui.navigation.DemoNavGraph
import fr.openium.consentium.ui.theme.ConsentiumTheme import fr.openium.consentium.ui.theme.ConsentiumTheme
@AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
val navHostController = rememberNavController()
ConsentiumTheme { ConsentiumTheme {
Scaffold( modifier = Modifier.fillMaxSize() ) { innerPadding -> Scaffold( modifier = Modifier.fillMaxSize() ) { paddingValues ->
Greeting( Box(
name = "Android", modifier = Modifier
modifier = Modifier.padding(innerPadding) .fillMaxSize()
) .padding(paddingValues)
) {
DemoNavGraph(navHostController = navHostController)
}
} }
} }
} }

View File

@ -0,0 +1,49 @@
package fr.openium.afu.ui.navigation
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.runtime.Composable
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import fr.openium.consentium.ui.screens.main.MainScreen
import fr.openium.consentium.ui.screens.splash.SplashScreen
private const val NAV_ANIMATION_TIME = 100
@Composable
fun DemoNavGraph(navHostController: NavHostController) {
NavHost(
navController = navHostController,
startDestination = Destination.Splash,
enterTransition = {
fadeIn(animationSpec = tween(NAV_ANIMATION_TIME))
},
exitTransition = {
fadeOut(animationSpec = tween(NAV_ANIMATION_TIME))
},
) {
composable<Destination.Splash> {
SplashScreen(
navigateToMain = { ->
navHostController.navigate(Destination.Main) {
popUpTo(navHostController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
})
}
composable<Destination.Main> {
MainScreen()
}
}
}

View File

@ -0,0 +1,14 @@
package fr.openium.afu.ui.navigation
import kotlinx.serialization.Serializable
sealed interface Destination {
@kotlinx.serialization.Serializable
data object Splash : Destination
@Serializable
data object Main : Destination
}

View File

@ -0,0 +1,14 @@
package fr.openium.consentium.ui.screens.main
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel
@Composable
fun MainScreen(
viewModel: MainScreenViewModel = hiltViewModel()
) {
Text("Main")
}

View File

@ -0,0 +1,11 @@
package fr.openium.consentium.ui.screens.main
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class MainScreenViewModel @Inject constructor(
) : ViewModel() {
}

View File

@ -0,0 +1,50 @@
package fr.openium.consentium.ui.screens.splash
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
@Composable
fun SplashScreen(
viewModel: SplashScreenViewModel = hiltViewModel(),
navigateToMain: () -> Unit,
) {
val state by viewModel.state.collectAsState()
Text("Splash")
when (val _state = state) {
is SplashScreenViewModel.State.Loading -> Box(
modifier = Modifier.fillMaxSize()
) {
CircularProgressIndicator(
modifier = Modifier
.size(200.dp)
.align(Alignment.Center)
)
//tracking matomo
}
is SplashScreenViewModel.State.Loaded -> {
navigateToMain()
}
}
}

View File

@ -0,0 +1,43 @@
package fr.openium.consentium.ui.screens.splash
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class SplashScreenViewModel @Inject constructor(
) : ViewModel() {
private val _state = MutableStateFlow<State>(State.Loading)
val state: StateFlow<State> = _state
private fun loadMain() {
val delay = viewModelScope.launch {
delay(1500L)
}
viewModelScope.launch {
_state.value = State.Loading
try {
delay.join()
_state.value = State.Loaded
} catch (e: Exception) {
e.printStackTrace()
}
}
}
sealed interface State {
data object Loading : State
data object Loaded : State
}
init {
loadMain()
}
}

View File

@ -14,4 +14,10 @@ plugins {
// Agp // Agp
alias(libs.plugins.android.library) apply false alias(libs.plugins.android.library) apply false
alias(libs.plugins.hilt) apply false
alias(libs.plugins.kotlin.serialization) apply false
} }

View File

@ -37,6 +37,18 @@ kotlin = "2.0.0"
ksp = "2.0.0-1.0.23" ksp = "2.0.0-1.0.23"
junitVersion = "1.2.1" junitVersion = "1.2.1"
# Matomo
matomo = "4.3"
# Serialization
serialization = "1.7.1"
navigationCommonKtx = "2.8.2"
navigationRuntimeKtx = "2.8.2"
navigationCompose = "2.8.2"
[libraries] [libraries]
# AndroidX # AndroidX
@ -67,6 +79,14 @@ compose-material3 = { group = "androidx.compose.material3", name = "material3" }
# Material # Material
material = { group = "com.google.android.material", name = "material", version.ref = "material" } material = { group = "com.google.android.material", name = "material", version.ref = "material" }
# Matomo
matomo = { module = "com.github.matomo-org:matomo-sdk-android", version.ref = "matomo" }
kotlin-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
androidx-navigation-common-ktx = { group = "androidx.navigation", name = "navigation-common-ktx", version.ref = "navigationCommonKtx" }
androidx-navigation-runtime-ktx = { group = "androidx.navigation", name = "navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
# Test # Test
test-junit = { group = "junit", name = "junit", version.ref = "junit" } test-junit = { group = "junit", name = "junit", version.ref = "junit" }
test-androidx-junit = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "junitExtVersion" } test-androidx-junit = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "junitExtVersion" }
@ -79,6 +99,10 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
android-library = { id = "com.android.library", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
[bundles] [bundles]
androidx = ["androidx-core-ktx", "androidx-activity-compose"] androidx = ["androidx-core-ktx", "androidx-activity-compose"]

View File

@ -16,6 +16,8 @@ dependencyResolutionManagement {
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
maven { url = uri("https://jitpack.io/") }
} }
} }