Skip to content

Commit 58b13d6

Browse files
committed
[FEAT] #9 : 7차 세미나 성장과제
- Navigation Componenet를 활용한 온보딩 구현
1 parent 848c549 commit 58b13d6

14 files changed

+353
-22
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@
1414
android:supportsRtl="true"
1515
android:theme="@style/Theme.SOPT_Seminar_30th"
1616
android:usesCleartextTraffic="true">
17+
<activity
18+
android:name=".presentation.ui.onboarding.OnBoardingActivity"
19+
android:exported="true">
20+
<intent-filter>
21+
<action android:name="android.intent.action.MAIN" />
22+
23+
<category android:name="android.intent.category.LAUNCHER" />
24+
</intent-filter>
25+
</activity>
1726
<activity
1827
android:name=".presentation.ui.detail.DetailActivity"
1928
android:exported="false" />
@@ -27,13 +36,7 @@
2736
<activity
2837
android:name=".presentation.ui.auth.SignInActivity"
2938
android:exported="true"
30-
android:windowSoftInputMode="adjustResize">
31-
<intent-filter>
32-
<action android:name="android.intent.action.MAIN" />
33-
34-
<category android:name="android.intent.category.LAUNCHER" />
35-
</intent-filter>
36-
</activity>
39+
android:windowSoftInputMode="adjustResize" />
3740
</application>
3841

3942
</manifest>

app/src/main/java/co/kr/sopt_seminar_30th/data/datasource/local/SopthubDataStore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@ class SopthubDataStore @Inject constructor(
3333
var autoLogin: Boolean
3434
set(value) = dataStore.edit { putBoolean("AUTO_LOGIN", value) }
3535
get() = dataStore.getBoolean("AUTO_LOGIN", false)
36+
37+
var onBoardingEnabled: Boolean
38+
set(value) = dataStore.edit { putBoolean("ON_BOARDING_ENABLED", value) }
39+
get() = dataStore.getBoolean("ON_BOARDING_ENABLED", false)
3640
}

app/src/main/java/co/kr/sopt_seminar_30th/presentation/ui/auth/SignInActivity.kt

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,34 +78,22 @@ class SignInActivity : BaseActivity<ActivitySignInBinding>() {
7878
}
7979
}
8080
}
81-
8281
signInViewModel.isEmailIncorrect.observe(this) {
83-
if(it) {
82+
if (it) {
8483
Toast.makeText(this, "존재하지 않는 계정입니다", Toast.LENGTH_SHORT).show()
8584
binding.etUserPassword.text.clear()
8685
}
8786
}
88-
8987
signInViewModel.isPasswordIncorrect.observe(this) {
90-
if(it) {
88+
if (it) {
9189
Toast.makeText(this, "비밀번호가 일치하지 않습니다", Toast.LENGTH_SHORT).show()
9290
binding.etUserPassword.text.clear()
9391
}
9492
}
95-
9693
signInViewModel.isEmpty.observe(this) {
9794
if (it) {
9895
Toast.makeText(this, "아이디/비밀번호를 확인해주세요", Toast.LENGTH_SHORT).show()
9996
}
10097
}
101-
102-
signInViewModel.autoLogin.observe(this) {
103-
if (it) {
104-
Toast.makeText(this, "자동로그인 성공", Toast.LENGTH_SHORT).show()
105-
val intent = Intent(this, HomeActivity::class.java)
106-
startActivity(intent)
107-
finish()
108-
}
109-
}
11098
}
11199
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package co.kr.sopt_seminar_30th.presentation.ui.onboarding
2+
3+
import android.content.Intent
4+
import android.os.Bundle
5+
import co.kr.sopt_seminar_30th.R
6+
import co.kr.sopt_seminar_30th.data.datasource.local.SopthubDataStore
7+
import co.kr.sopt_seminar_30th.databinding.ActivityOnBoardingBinding
8+
import co.kr.sopt_seminar_30th.presentation.ui.auth.SignInActivity
9+
import co.kr.sopt_seminar_30th.presentation.ui.base.BaseActivity
10+
import co.kr.sopt_seminar_30th.presentation.ui.home.HomeActivity
11+
import dagger.hilt.android.AndroidEntryPoint
12+
import javax.inject.Inject
13+
14+
@AndroidEntryPoint
15+
class OnBoardingActivity : BaseActivity<ActivityOnBoardingBinding>() {
16+
override val layoutRes: Int
17+
get() = R.layout.activity_on_boarding
18+
19+
@Inject
20+
lateinit var dataStore: SopthubDataStore
21+
22+
override fun onCreate(savedInstanceState: Bundle?) {
23+
super.onCreate(savedInstanceState)
24+
checkAutoLoginEnabled()
25+
checkOnBoardingEnabled()
26+
}
27+
28+
private fun checkAutoLoginEnabled() {
29+
if (dataStore.autoLogin) {
30+
startActivity(Intent(this, HomeActivity::class.java))
31+
finish()
32+
}
33+
}
34+
35+
private fun checkOnBoardingEnabled() {
36+
if (dataStore.onBoardingEnabled) {
37+
if(!isFinishing) {
38+
startActivity(Intent(this, SignInActivity::class.java))
39+
finish()
40+
}
41+
}
42+
}
43+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package co.kr.sopt_seminar_30th.presentation.ui.onboarding
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.findNavController
6+
import co.kr.sopt_seminar_30th.R
7+
import co.kr.sopt_seminar_30th.data.datasource.local.SopthubDataStore
8+
import co.kr.sopt_seminar_30th.databinding.FragmentOnBoardingFirstBinding
9+
import co.kr.sopt_seminar_30th.presentation.ui.base.BaseFragment
10+
import dagger.hilt.android.AndroidEntryPoint
11+
import javax.inject.Inject
12+
13+
@AndroidEntryPoint
14+
class OnBoardingFirstFragment : BaseFragment<FragmentOnBoardingFirstBinding>() {
15+
override val TAG: String
16+
get() = OnBoardingFirstFragment::class.java.simpleName
17+
override val layoutRes: Int
18+
get() = R.layout.fragment_on_boarding_first
19+
20+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
21+
super.onViewCreated(view, savedInstanceState)
22+
setOnBtnNextClickListener()
23+
}
24+
25+
private fun setOnBtnNextClickListener() {
26+
binding.btnOnBoardingNext.setOnClickListener {
27+
findNavController().navigate(R.id.action_fragment_on_boarding_first_to_fragment_on_boarding_second)
28+
}
29+
}
30+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package co.kr.sopt_seminar_30th.presentation.ui.onboarding
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.findNavController
6+
import co.kr.sopt_seminar_30th.R
7+
import co.kr.sopt_seminar_30th.databinding.FragmentOnBoardingSecondBinding
8+
import co.kr.sopt_seminar_30th.presentation.ui.base.BaseFragment
9+
import dagger.hilt.android.AndroidEntryPoint
10+
11+
@AndroidEntryPoint
12+
class OnBoardingSecondFragment : BaseFragment<FragmentOnBoardingSecondBinding>() {
13+
override val TAG: String
14+
get() = OnBoardingSecondFragment::class.java.simpleName
15+
override val layoutRes: Int
16+
get() = R.layout.fragment_on_boarding_second
17+
18+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
19+
super.onViewCreated(view, savedInstanceState)
20+
setOnBtnNextClickListener()
21+
}
22+
23+
private fun setOnBtnNextClickListener() {
24+
binding.btnOnBoardingNext.setOnClickListener {
25+
findNavController().navigate(R.id.action_fragment_on_boarding_second_to_fragment_on_boarding_third)
26+
}
27+
}
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package co.kr.sopt_seminar_30th.presentation.ui.onboarding
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.findNavController
6+
import co.kr.sopt_seminar_30th.R
7+
import co.kr.sopt_seminar_30th.data.datasource.local.SopthubDataStore
8+
import co.kr.sopt_seminar_30th.databinding.FragmentOnBoardingThirdBinding
9+
import co.kr.sopt_seminar_30th.presentation.ui.base.BaseFragment
10+
import dagger.hilt.android.AndroidEntryPoint
11+
import javax.inject.Inject
12+
13+
@AndroidEntryPoint
14+
class OnBoardingThirdFragment : BaseFragment<FragmentOnBoardingThirdBinding>() {
15+
override val TAG: String
16+
get() = OnBoardingThirdFragment::class.java.simpleName
17+
override val layoutRes: Int
18+
get() = R.layout.fragment_on_boarding_third
19+
20+
@Inject
21+
lateinit var dataStore: SopthubDataStore
22+
23+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
24+
super.onViewCreated(view, savedInstanceState)
25+
setOnBtnStartClickListener()
26+
}
27+
28+
private fun setOnBtnStartClickListener() {
29+
binding.btnOnBoardingStart.setOnClickListener {
30+
dataStore.onBoardingEnabled = true
31+
findNavController().navigate(R.id.action_fragment_on_boarding_third_to_activity_sign_in)
32+
requireActivity().finish()
33+
}
34+
}
35+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<data>
7+
8+
</data>
9+
10+
<androidx.constraintlayout.widget.ConstraintLayout
11+
android:layout_width="match_parent"
12+
android:layout_height="match_parent"
13+
tools:context=".presentation.ui.onboarding.OnBoardingActivity">
14+
15+
<TextView
16+
android:id="@+id/tv_on_boarding_title"
17+
android:layout_width="0dp"
18+
android:layout_height="wrap_content"
19+
android:paddingVertical="20dp"
20+
android:text="@string/text_on_boarding"
21+
android:textAlignment="center"
22+
android:textColor="@color/black"
23+
android:textSize="20sp"
24+
app:layout_constraintBottom_toTopOf="@id/fcv_on_boarding"
25+
app:layout_constraintEnd_toEndOf="parent"
26+
app:layout_constraintStart_toStartOf="parent"
27+
app:layout_constraintTop_toTopOf="parent" />
28+
29+
<androidx.fragment.app.FragmentContainerView
30+
android:id="@+id/fcv_on_boarding"
31+
android:name="androidx.navigation.fragment.NavHostFragment"
32+
android:layout_width="match_parent"
33+
android:layout_height="0dp"
34+
app:defaultNavHost="true"
35+
app:layout_constraintBottom_toBottomOf="parent"
36+
app:layout_constraintTop_toBottomOf="@id/tv_on_boarding_title"
37+
app:navGraph="@navigation/nav_graph_on_boarding" />
38+
39+
</androidx.constraintlayout.widget.ConstraintLayout>
40+
41+
</layout>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
3+
4+
<data>
5+
6+
</data>
7+
8+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
9+
xmlns:tools="http://schemas.android.com/tools"
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
tools:context=".presentation.ui.onboarding.OnBoardingFirstFragment">
13+
14+
<TextView
15+
android:id="@+id/tv_on_boarding_first"
16+
android:layout_width="match_parent"
17+
android:layout_height="0dp"
18+
android:gravity="center"
19+
android:text="@string/text_on_boarding_first"
20+
android:textColor="@color/black"
21+
android:textSize="40sp"
22+
app:layout_constraintBottom_toTopOf="@id/btn_on_boarding_next"
23+
app:layout_constraintTop_toTopOf="parent" />
24+
25+
<Button
26+
android:id="@+id/btn_on_boarding_next"
27+
android:layout_width="match_parent"
28+
android:layout_height="wrap_content"
29+
android:backgroundTint="@color/purple_200"
30+
android:text="@string/text_next"
31+
android:layout_margin="20dp"
32+
app:layout_constraintBottom_toBottomOf="parent"
33+
app:layout_constraintTop_toBottomOf="@id/tv_on_boarding_first" />
34+
35+
</androidx.constraintlayout.widget.ConstraintLayout>
36+
37+
</layout>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
2+
3+
<data>
4+
5+
</data>
6+
7+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
8+
xmlns:tools="http://schemas.android.com/tools"
9+
android:layout_width="match_parent"
10+
android:layout_height="match_parent"
11+
tools:context=".presentation.ui.onboarding.OnBoardingSecondFragment">
12+
13+
<TextView
14+
android:id="@+id/tv_on_boarding_second"
15+
android:layout_width="match_parent"
16+
android:layout_height="0dp"
17+
android:gravity="center"
18+
android:text="@string/text_on_boarding_second"
19+
android:textColor="@color/black"
20+
android:textSize="40sp"
21+
app:layout_constraintBottom_toTopOf="@id/btn_on_boarding_next"
22+
app:layout_constraintTop_toTopOf="parent" />
23+
24+
<Button
25+
android:id="@+id/btn_on_boarding_next"
26+
android:layout_width="match_parent"
27+
android:layout_height="wrap_content"
28+
android:backgroundTint="@color/purple_200"
29+
android:text="@string/text_next"
30+
android:layout_margin="20dp"
31+
app:layout_constraintBottom_toBottomOf="parent"
32+
app:layout_constraintTop_toBottomOf="@id/tv_on_boarding_second" />
33+
34+
</androidx.constraintlayout.widget.ConstraintLayout>
35+
36+
</layout>

0 commit comments

Comments
 (0)