Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[UI/#12] onboarding #13

Merged
merged 12 commits into from
Jul 24, 2024
5 changes: 5 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name="com.kkkk.presentation.main.onboarding.onbarding.OnboardingActivity"
android:exported="false"
android:screenOrientation="portrait" />

</application>

</manifest>
3 changes: 3 additions & 0 deletions core/src/main/java/com/kkkk/core/extension/ActivityExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Build
import android.text.TextUtils.replace
import android.util.DisplayMetrics
import android.view.View
import android.view.WindowInsets
Expand All @@ -13,6 +14,8 @@ import android.widget.EditText
import androidx.activity.ComponentActivity
import androidx.activity.OnBackPressedCallback
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.kkkk.core.R

fun Activity.setStatusBarColorFromResource(colorResId: Int) {
val statusBarColor = ContextCompat.getColor(this, colorResId)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.kkkk.presentation.main.onboarding.onbarding

import android.os.Bundle
import android.os.CountDownTimer
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import androidx.fragment.app.replace
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.kkkk.core.base.BaseActivity
import com.kkkk.core.extension.navigateToScreenClear
import com.kkkk.presentation.main.MainActivity
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kr.genti.presentation.R
import kr.genti.presentation.databinding.ActivityOnboardingBinding

class OnboardingActivity : BaseActivity<ActivityOnboardingBinding>(R.layout.activity_onboarding) {
private lateinit var timer: CountDownTimer
private val viewModel by viewModels<OnboardingViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

initFragmentManager()
observeOnboardingState()
}

private fun initFragmentManager() {
supportFragmentManager.findFragmentById(R.id.fcv_onboarding)
}

private fun observeOnboardingState() {
viewModel.state
.flowWithLifecycle(lifecycle)
.onEach { state ->
when (state) {
OnboardingState.START -> navigateTo<OnboardingStartFragment>()
OnboardingState.MEASURE -> navigateTo<OnboardingMeasureFragment>()
OnboardingState.END -> navigateTo<OnboardingEndFragment>()
OnboardingState.DONE -> navigateToScreenClear<MainActivity>()
}
}.launchIn(lifecycleScope)
}

private fun startTimer() {
timer = object : CountDownTimer(60000, 1000) {
override fun onTick(millisUntilFinished: Long) {}

override fun onFinish() {
viewModel.setState(OnboardingState.END)
}
}.start()
Comment on lines +48 to +54
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 신기하다

}

override fun onDestroy() {
super.onDestroy()
if (::timer.isInitialized) {
timer.cancel()
}
}

private inline fun <reified T : Fragment> navigateTo() {
supportFragmentManager.commit {
replace<T>(R.id.fcv_onboarding, T::class.java.canonicalName)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.kkkk.presentation.main.onboarding.onbarding

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import com.kkkk.core.base.BaseFragment
import kr.genti.presentation.R
import kr.genti.presentation.databinding.FragmentOnboardingEndBinding
import kr.genti.presentation.databinding.FragmentOnboardingStartBinding

class OnboardingEndFragment :
BaseFragment<FragmentOnboardingEndBinding>(R.layout.fragment_onboarding_end) {
private val viewModel by activityViewModels<OnboardingViewModel>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

initButtonListener()
}

private fun initButtonListener() {
with(binding) {
btnOnboardingEndStart.setOnClickListener {
viewModel.setState(OnboardingState.DONE)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

state 관리하는거 개마싯네 진짜
야미에요

}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.kkkk.presentation.main.onboarding.onbarding

import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import com.kkkk.core.base.BaseFragment
import kr.genti.presentation.R
import kr.genti.presentation.databinding.FragmentOnboardingMeasureBinding

class OnboardingMeasureFragment :
BaseFragment<FragmentOnboardingMeasureBinding>(R.layout.fragment_onboarding_measure) {
private val viewModel by activityViewModels<OnboardingViewModel>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

initButtonListener()
}

private fun initButtonListener() {
with(binding) {
btnOnboardingMeasureLater.setOnClickListener {
viewModel.setState(OnboardingState.DONE)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.kkkk.presentation.main.onboarding.onbarding

import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import com.kkkk.core.base.BaseFragment
import kr.genti.presentation.R
import kr.genti.presentation.databinding.FragmentOnboardingStartBinding

class OnboardingStartFragment :
BaseFragment<FragmentOnboardingStartBinding>(R.layout.fragment_onboarding_start) {
private val viewModel by activityViewModels<OnboardingViewModel>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

initButtonListener()
}

private fun initButtonListener() {
with(binding) {
btnOnboardingStartLater.setOnClickListener {
viewModel.setState(OnboardingState.DONE)
}
btnOnboardingStartMeasure.setOnClickListener {
viewModel.setState(OnboardingState.MEASURE)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.kkkk.presentation.main.onboarding.onbarding

enum class OnboardingState {
START,
MEASURE,
END,
DONE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.kkkk.presentation.main.onboarding.onbarding

import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject

@HiltViewModel
class OnboardingViewModel @Inject constructor(
) : ViewModel() {
private val _state = MutableStateFlow(OnboardingState.START)
val state: StateFlow<OnboardingState> = _state

fun setState(newState: OnboardingState) {
_state.value = newState
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import com.kkkk.core.base.BaseActivity
import com.kkkk.core.extension.navigateToScreenClear
import com.kkkk.core.extension.setNavigationBarColorFromResource
import com.kkkk.core.extension.setStatusBarColorFromResource
import com.kkkk.presentation.main.MainActivity
import com.kkkk.presentation.main.onboarding.onbarding.OnboardingActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
Expand All @@ -32,7 +32,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(R.layout.activity_spl

private fun observeUserState() {
viewModel.userState.flowWithLifecycle(lifecycle).onEach { state ->
navigateToScreenClear<MainActivity>()
navigateToScreenClear<OnboardingActivity>()
}.launchIn(lifecycleScope)
}
}
28 changes: 28 additions & 0 deletions presentation/src/main/res/drawable/ic_logo_full_name.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="98dp"
android:height="16dp"
android:viewportWidth="98"
android:viewportHeight="16">
<group>
<clip-path
android:pathData="M0,0h98v16h-98z"/>
<path
android:pathData="M82.834,0.01L68.799,0.002C68.66,0.002 68.546,0.112 68.546,0.247V15.756C68.546,15.89 68.66,16 68.799,16H72.2C72.34,16 72.453,15.89 72.453,15.756V10.702C72.453,10.568 72.567,10.458 72.706,10.458H82.834C82.974,10.458 83.088,10.348 83.088,10.214V0.254C83.088,0.12 82.975,0.01 82.834,0.01ZM79.27,6.92H72.58C72.51,6.92 72.453,6.865 72.453,6.798V3.662C72.453,3.595 72.51,3.54 72.58,3.54H79.27C79.34,3.54 79.396,3.595 79.396,3.662V6.798C79.396,6.865 79.34,6.92 79.27,6.92Z"
android:fillColor="#1E2027"/>
<path
android:pathData="M85.506,0.247V15.756C85.506,15.89 85.62,16 85.759,16H97.62C97.76,16 97.873,15.89 97.873,15.756V0.247C97.873,0.112 97.76,0.002 97.62,0.002H85.759C85.62,0.002 85.506,0.112 85.506,0.247ZM93.876,12.707H89.502C89.432,12.707 89.375,12.652 89.375,12.584V3.418C89.375,3.351 89.432,3.296 89.502,3.296H93.876C93.946,3.296 94.003,3.351 94.003,3.418V12.584C94.003,12.652 93.946,12.707 93.876,12.707Z"
android:fillColor="#1E2027"/>
<path
android:pathData="M30.145,0.001H16.923C16.784,0.001 16.67,0.111 16.67,0.246V3.295C16.67,3.429 16.784,3.539 16.923,3.539H21.358C21.428,3.539 21.485,3.594 21.485,3.661V15.755C21.485,15.889 21.598,15.999 21.738,15.999H25.354C25.493,15.999 25.607,15.889 25.607,15.755V3.661C25.607,3.594 25.664,3.539 25.734,3.539H30.145C30.284,3.539 30.398,3.429 30.398,3.295V0.246C30.398,0.111 30.284,0.001 30.145,0.001Z"
android:fillColor="#1E2027"/>
<path
android:pathData="M46.065,3.294V0.245C46.065,0.111 45.952,0.001 45.813,0.001H32.378C32.239,0.001 32.125,0.111 32.125,0.245V15.754C32.125,15.889 32.239,15.998 32.378,15.998H45.813C45.952,15.998 46.065,15.889 46.065,15.754V12.705C46.065,12.571 45.952,12.461 45.813,12.461H36.374C36.305,12.461 36.248,12.406 36.248,12.339V9.532C36.248,9.465 36.305,9.41 36.374,9.41H45.513C45.652,9.41 45.766,9.3 45.766,9.166V6.521C45.766,6.387 45.652,6.277 45.513,6.277H36.374C36.305,6.277 36.248,6.222 36.248,6.155V3.661C36.248,3.594 36.305,3.539 36.374,3.539H45.813C45.952,3.539 46.065,3.429 46.065,3.294Z"
android:fillColor="#1E2027"/>
<path
android:pathData="M3.869,6.124V3.416C3.869,3.348 3.926,3.294 3.996,3.294H14.23C14.37,3.294 14.483,3.184 14.483,3.049V0.244C14.483,0.11 14.37,0 14.23,0H0.253C0.114,0 0,0.11 0,0.244V9.296C0,9.43 0.114,9.54 0.253,9.54H10.678C10.748,9.54 10.805,9.595 10.805,9.662V12.584C10.805,12.652 10.748,12.707 10.678,12.707H0.253C0.114,12.707 0,12.816 0,12.951V15.756C0,15.89 0.114,16 0.253,16H14.421C14.561,16 14.674,15.89 14.674,15.756V6.491C14.674,6.356 14.561,6.246 14.421,6.246H3.996C3.926,6.246 3.869,6.192 3.869,6.124Z"
android:fillColor="#1E2027"/>
<path
android:pathData="M65.489,0.001H59.247C59.187,0.001 59.135,0.043 59.123,0.099L57.417,8.348C57.389,8.477 57.197,8.477 57.169,8.348L55.462,0.099C55.449,0.043 55.397,0.001 55.338,0.001H49.099C48.959,0.001 48.846,0.11 48.846,0.246V13.438C49.194,13.287 49.578,13.201 49.984,13.201C50.164,13.201 50.344,13.218 50.518,13.251C50.621,13.271 50.688,13.433 50.668,13.532C50.647,13.631 50.549,13.752 50.445,13.732C50.294,13.704 50.139,13.689 49.983,13.689C48.758,13.689 47.746,14.583 47.608,15.731C47.591,15.873 47.712,15.995 47.86,15.995H52.497C52.567,15.995 52.624,15.94 52.624,15.873V3.871C52.624,3.725 52.843,3.703 52.874,3.847L55.399,15.903C55.411,15.959 55.463,16 55.523,16H59.057C59.117,16 59.168,15.96 59.181,15.903L61.709,3.83C61.74,3.686 61.96,3.708 61.96,3.854V13.403C62.284,13.274 62.638,13.202 63.01,13.202C63.19,13.202 63.369,13.219 63.544,13.252C63.646,13.272 63.714,13.49 63.693,13.589C63.673,13.688 63.573,13.753 63.471,13.733C63.32,13.705 63.164,13.691 63.009,13.691C61.784,13.691 60.771,14.584 60.634,15.732C60.617,15.873 60.737,15.997 60.885,15.997L65.612,16C65.618,16 65.624,15.998 65.631,15.997H65.649V15.993C65.7,15.977 65.737,15.933 65.737,15.878V0.246C65.737,0.111 65.623,0.001 65.484,0.001H65.489Z"
android:fillColor="#784DF0"/>
</group>
</vector>
Loading
Loading