diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 22160448..2f0367c4 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,20 +3,7 @@ - - - - - - - - - - - - - - + diff --git a/core/build/intermediates/ktLint/reporterProviders.bin b/core/build/intermediates/ktLint/reporterProviders.bin deleted file mode 100644 index 11e8bd36..00000000 Binary files a/core/build/intermediates/ktLint/reporterProviders.bin and /dev/null differ diff --git a/core/build/intermediates/ktLint/reporters.bin b/core/build/intermediates/ktLint/reporters.bin deleted file mode 100644 index d5a0d616..00000000 Binary files a/core/build/intermediates/ktLint/reporters.bin and /dev/null differ diff --git a/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplahScreen.kt b/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplahScreen.kt index fb2c6ab0..d280601a 100644 --- a/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplahScreen.kt +++ b/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplahScreen.kt @@ -1,23 +1,39 @@ package com.wap.wapp.feature.splash import android.widget.Toast +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.animateDpAsState +import androidx.compose.animation.core.tween +import androidx.compose.animation.scaleIn +import androidx.compose.animation.scaleOut +import androidx.compose.animation.togetherWith import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.wap.designsystem.WappTheme import com.wap.wapp.core.commmon.extensions.TrackScreenViewEvent import com.wap.wapp.core.commmon.extensions.toSupportingText +import com.wap.wapp.core.designresource.R.drawable import com.wap.wapp.feature.splash.R.string @Composable @@ -27,6 +43,8 @@ internal fun SplashRoute( navigateToNotice: () -> Unit, ) { val context = LocalContext.current + val isIconLogoVisible by viewModel.isIconLogoVisible.collectAsStateWithLifecycle() + val isIconLogoGoUp by viewModel.isIconLogoGoUp.collectAsStateWithLifecycle() LaunchedEffect(true) { viewModel.splashUiEvent.collect { event -> @@ -42,24 +60,102 @@ internal fun SplashRoute( } } - SplashScreen() + SplashScreen( + isIconLogoVisible = isIconLogoVisible, + isIconLogoGoUp = isIconLogoGoUp, + ) } @Composable -internal fun SplashScreen() { +internal fun SplashScreen( + isIconLogoVisible: Boolean, + isIconLogoGoUp: Boolean, +) { + val ANIMATION_MILLS = 400 + TrackScreenViewEvent(screenName = "SplashScreen") - Box( + Column( modifier = Modifier .fillMaxSize() .background(WappTheme.colors.backgroundBlack), + ) { + AnimatedContent( + targetState = isIconLogoVisible, + transitionSpec = { + scaleIn(tween(ANIMATION_MILLS, ANIMATION_MILLS)) togetherWith + scaleOut(tween(ANIMATION_MILLS)) + }, + ) { isIconLogoVisible -> + if (!isIconLogoVisible) { + SplashTypoLogo() + } else { + SplashIconLogo(isIconLogoGoUp) + } + } + } +} + +@Composable +private fun SplashTypoLogo() { + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize(), ) { Image( painter = painterResource(id = R.drawable.ic_wapp_logo), modifier = Modifier - .align(Alignment.Center) + .align(Alignment.CenterHorizontally) .size(width = 230.dp, height = 230.dp), contentDescription = stringResource(id = string.wapp_icon_description), ) } } + +@Composable +private fun SplashIconLogo(isIconLogoGoUp: Boolean) { + val animatedPadding by animateDpAsState( + targetValue = if (isIconLogoGoUp) 200.dp else 0.dp, + animationSpec = tween(1000), + ) + + Column(modifier = Modifier.fillMaxSize()) { + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .weight(1f) + .padding(bottom = animatedPadding), + ) { + Image( + painter = painterResource(id = drawable.img_white_cat), + modifier = Modifier + .align(Alignment.CenterHorizontally) + .size(width = 230.dp, height = 230.dp), + contentDescription = stringResource(id = string.wapp_icon_description), + ) + + Row( + modifier = Modifier.align(Alignment.CenterHorizontally), + ) { + Column { + Spacer(modifier = Modifier.height(40.dp)) + + Text( + text = stringResource(id = string.application_name), + style = WappTheme.typography.titleBold, + fontSize = 48.sp, + color = WappTheme.colors.white, + ) + } + Text( + text = stringResource(id = string.application_name), + fontSize = 48.sp, + style = WappTheme.typography.titleBold, + color = WappTheme.colors.yellow34, + ) + } + } + } +} diff --git a/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplashViewModel.kt b/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplashViewModel.kt index 1ccba97d..1f98e6e0 100644 --- a/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplashViewModel.kt +++ b/feature/splash/src/main/java/com/wap/wapp/feature/splash/SplashViewModel.kt @@ -4,8 +4,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.wap.wapp.core.domain.usecase.auth.IsUserSignInUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -16,16 +19,29 @@ class SplashViewModel @Inject constructor( private val _splashUiEvent = MutableSharedFlow() val splashUiEvent = _splashUiEvent.asSharedFlow() + private var _isIconLogoVisible = MutableStateFlow(false) + var isIconLogoVisible = _isIconLogoVisible.asStateFlow() + + private var _isIconLogoGoUp = MutableStateFlow(false) + var isIconLogoGoUp = _isIconLogoGoUp.asStateFlow() + init { - isUserSignIn() + viewModelScope.launch { + delay(1000) + _isIconLogoVisible.value = true + delay(1000) + isUserSignIn() + } } - private fun isUserSignIn() = viewModelScope.launch { + private suspend fun isUserSignIn() { isUserSignInUseCase() .onSuccess { isSignIn -> if (isSignIn) { _splashUiEvent.emit(SplashEvent.SignInUser) } else { + _isIconLogoGoUp.value = true + delay(1000) _splashUiEvent.emit(SplashEvent.NonSignInUser) } }.onFailure { throwable -> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b3ff0eac..9515ff59 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ compileSdk = "34" minSdk = "26" targetSdk = "34" -versionName = "1.0.0" -versionCode = "1" +versionName = "1.0.2" +versionCode = "3" gradleplugin = "8.1.2"