Skip to content

Commit 387ac4e

Browse files
committed
[BOOK-232] feat: 스플래시 화면 Ui 구성 및 플로우 구현
1 parent b430c06 commit 387ac4e

9 files changed

Lines changed: 100 additions & 3 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
android:networkSecurityConfig="@xml/network_security_config"
2020
android:roundIcon="@mipmap/ic_launcher_round"
2121
android:supportsRtl="true"
22-
android:theme="@style/Theme.Booket"
22+
android:theme="@style/Theme.Booket.Splash"
2323
tools:targetApi="31">
2424

2525
<provider

core/designsystem/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ dependencies {
1313
implementations(
1414
projects.core.common,
1515

16+
libs.androidx.splash,
17+
1618
libs.coil.compose,
1719
libs.logger,
1820

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="108dp"
3+
android:height="108dp"
4+
android:viewportWidth="192"
5+
android:viewportHeight="192">
6+
7+
<path
8+
android:fillColor="@color/green_500"
9+
android:pathData="M0,0h1200v1200h-1200z" />
10+
11+
</vector>

core/designsystem/src/main/res/values/colors.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
<color name="teal_700">#FF018786</color>
88
<color name="black">#FF000000</color>
99
<color name="white">#FFFFFFFF</color>
10+
<color name="green_500">#FF2F9647</color>
1011
</resources>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<style name="Theme.Booket.Splash" parent="Theme.SplashScreen">
5+
<item name="windowSplashScreenBackground">#FF2F9647</item>
6+
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_dummy_splash</item>
7+
<item name="postSplashScreenTheme">@style/Theme.Booket</item>
8+
</style>
9+
10+
</resources>

feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashPresenter.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.ninecraft.booket.feature.main.splash
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.LaunchedEffect
45
import androidx.compose.runtime.getValue
6+
import androidx.compose.runtime.mutableStateOf
7+
import androidx.compose.runtime.setValue
58
import com.ninecraft.booket.core.data.api.repository.AuthRepository
69
import com.ninecraft.booket.core.data.api.repository.UserRepository
710
import com.ninecraft.booket.core.model.AutoLoginState
@@ -13,12 +16,14 @@ import com.ninecraft.booket.feature.screens.SplashScreen
1316
import com.skydoves.compose.effects.RememberedEffect
1417
import com.slack.circuit.codegen.annotations.CircuitInject
1518
import com.slack.circuit.retained.collectAsRetainedState
19+
import com.slack.circuit.retained.rememberRetained
1620
import com.slack.circuit.runtime.Navigator
1721
import com.slack.circuit.runtime.presenter.Presenter
1822
import dagger.assisted.Assisted
1923
import dagger.assisted.AssistedFactory
2024
import dagger.assisted.AssistedInject
2125
import dagger.hilt.android.components.ActivityRetainedComponent
26+
import kotlinx.coroutines.delay
2227

2328
class SplashPresenter @AssistedInject constructor(
2429
@Assisted private val navigator: Navigator,
@@ -30,8 +35,16 @@ class SplashPresenter @AssistedInject constructor(
3035
override fun present(): SplashUiState {
3136
val onboardingState by userRepository.onboardingState.collectAsRetainedState(initial = OnboardingState.IDLE)
3237
val autoLoginState by authRepository.autoLoginState.collectAsRetainedState(initial = AutoLoginState.IDLE)
38+
var isSplashTimeCompleted by rememberRetained { mutableStateOf(false) }
39+
40+
LaunchedEffect(Unit) {
41+
delay(3000L)
42+
isSplashTimeCompleted = true
43+
}
44+
45+
RememberedEffect(onboardingState, autoLoginState, isSplashTimeCompleted) {
46+
if (!isSplashTimeCompleted) return@RememberedEffect
3347

34-
RememberedEffect(onboardingState, autoLoginState) {
3548
when (onboardingState) {
3649
OnboardingState.NOT_COMPLETED -> {
3750
navigator.resetRoot(OnboardingScreen)
Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,76 @@
11
package com.ninecraft.booket.feature.main.splash
22

3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.background
35
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.Spacer
48
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.foundation.layout.height
11+
import androidx.compose.foundation.layout.width
12+
import androidx.compose.material3.Text
513
import androidx.compose.runtime.Composable
14+
import androidx.compose.runtime.DisposableEffect
15+
import androidx.compose.ui.Alignment
616
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.res.painterResource
18+
import androidx.compose.ui.res.stringResource
19+
import androidx.compose.ui.unit.dp
20+
import com.ninecraft.booket.core.designsystem.DevicePreview
21+
import com.ninecraft.booket.core.designsystem.theme.Green500
22+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
23+
import com.ninecraft.booket.feature.main.R
724
import com.ninecraft.booket.feature.screens.SplashScreen
825
import com.slack.circuit.codegen.annotations.CircuitInject
926
import dagger.hilt.android.components.ActivityRetainedComponent
27+
import tech.thdev.compose.exteions.system.ui.controller.rememberSystemUiController
1028

1129
@CircuitInject(SplashScreen::class, ActivityRetainedComponent::class)
1230
@Composable
1331
fun SplashUi(
1432
modifier: Modifier = Modifier,
1533
) {
16-
Box(modifier = modifier.fillMaxSize())
34+
val systemUiController = rememberSystemUiController()
35+
36+
DisposableEffect(systemUiController) {
37+
systemUiController.setSystemBarsColor(
38+
color = Green500,
39+
darkIcons = false,
40+
)
41+
42+
onDispose {}
43+
}
44+
45+
Box(
46+
modifier = modifier
47+
.fillMaxSize()
48+
.background(ReedTheme.colors.bgPrimary),
49+
contentAlignment = Alignment.Center,
50+
) {
51+
Column(
52+
modifier = Modifier.fillMaxWidth(),
53+
horizontalAlignment = Alignment.CenterHorizontally,
54+
) {
55+
Image(
56+
painter = painterResource(R.drawable.ic_reed_logo),
57+
contentDescription = "Reed Logo",
58+
modifier = Modifier.width(182.dp),
59+
)
60+
Spacer(modifier.height(ReedTheme.spacing.spacing5))
61+
Text(
62+
text = stringResource(R.string.splash_title),
63+
color = ReedTheme.colors.contentInverse,
64+
style = ReedTheme.typography.heading2SemiBold,
65+
)
66+
}
67+
}
68+
}
69+
70+
@DevicePreview
71+
@Composable
72+
private fun SplashPreview() {
73+
ReedTheme {
74+
SplashUi()
75+
}
1776
}
7.24 KB
Loading

feature/main/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
<string name="home_label">홈</string>
33
<string name="search_label">도서 검색</string>
44
<string name="library_label">내 서재</string>
5+
<string name="splash_title">책 덮기 전 한 문장을 기록해보세요</string>
56
</resources>

0 commit comments

Comments
 (0)