온보딩 튜토리얼 추가

This commit is contained in:
klaus 2023-08-18 16:41:36 +09:00
parent 3d96fab0f6
commit 9fa6ccb786
20 changed files with 222 additions and 4 deletions

View File

@ -89,6 +89,7 @@
<activity android:name=".live.now.all.LiveNowAllActivity" />
<activity android:name=".live.reservation.all.LiveReservationAllActivity" />
<activity android:name=".mypage.service_center.ServiceCenterActivity" />
<activity android:name=".onboarding.OnBoardingActivity" />
<activity
android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity"

View File

@ -13,6 +13,7 @@ object Constants {
const val PREF_IS_CONTENT_PLAY_LOOP = "pref_is_content_play_loop"
const val PREF_IS_FOLLOWED_CREATOR_LIVE = "pref_is_followed_creator_live"
const val PREF_NOT_SHOWING_EVENT_POPUP_ID = "pref_not_showing_event_popup_id"
const val PREF_IS_VIEWED_ON_BOARDING_TUTORIAL = "pref_is_viewed_on_boarding_tutorial"
const val EXTRA_CAN = "extra_can"
const val EXTRA_DATA = "extra_data"

View File

@ -116,4 +116,10 @@ object SharedPreferenceManager {
set(value) {
sharedPreferences[Constants.PREF_NOT_SHOWING_EVENT_POPUP_ID] = value
}
var isViewedOnboardingTutorial: Boolean
get() = sharedPreferences[Constants.PREF_IS_VIEWED_ON_BOARDING_TUTORIAL, false]
set(value) {
sharedPreferences[Constants.PREF_IS_VIEWED_ON_BOARDING_TUTORIAL] = value
}
}

View File

@ -0,0 +1,80 @@
package kr.co.vividnext.sodalive.onboarding
import android.content.Intent
import com.google.android.material.tabs.TabLayoutMediator
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ActivityOnboardingBinding
import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.user.login.LoginActivity
class OnBoardingActivity : BaseActivity<ActivityOnboardingBinding>(
ActivityOnboardingBinding::inflate
) {
private lateinit var adapter: OnBoardingViewPagerAdapter
override fun setupView() {
setupViewPager()
setupTabLayout()
setupButtonEvent()
}
private fun setupViewPager() {
binding.viewPager.offscreenPageLimit = 9
adapter = OnBoardingViewPagerAdapter(this)
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_0))
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_1))
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_2))
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_3))
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_4))
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_5))
adapter.addFragment(OnBoardingFragment(R.drawable.img_guide_6))
binding.viewPager.adapter = adapter
}
private fun setupTabLayout() {
TabLayoutMediator(binding.tabs, binding.viewPager) { _, _ -> }.attach()
}
private fun setupButtonEvent() {
binding.tvStart.setOnClickListener { moveNextActivity() }
}
private fun moveNextActivity() {
SharedPreferenceManager.isViewedOnboardingTutorial = true
if (SharedPreferenceManager.token.isBlank()) {
val nextIntent = Intent(applicationContext, LoginActivity::class.java)
val extras = intent.getBundleExtra(Constants.EXTRA_DATA)
?: if (intent.extras != null) {
intent.extras
} else {
null
}
if (extras != null) {
nextIntent.putExtra(Constants.EXTRA_DATA, extras)
}
startActivity(nextIntent)
} else {
val nextIntent = Intent(applicationContext, MainActivity::class.java)
val extras = intent.getBundleExtra(Constants.EXTRA_DATA)
?: if (intent.extras != null) {
intent.extras
} else {
null
}
if (extras != null) {
nextIntent.putExtra(Constants.EXTRA_DATA, extras)
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(nextIntent)
}
finish()
}
}

View File

@ -0,0 +1,15 @@
package kr.co.vividnext.sodalive.onboarding
import android.os.Bundle
import android.view.View
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentOnboardingBinding
class OnBoardingFragment(private val imageSrc: Int) : BaseFragment<FragmentOnboardingBinding>(
FragmentOnboardingBinding::inflate
) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.imageView.setImageResource(imageSrc)
}
}

View File

@ -0,0 +1,16 @@
package kr.co.vividnext.sodalive.onboarding
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
class OnBoardingViewPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {
private val fragmentList = ArrayList<Fragment>()
override fun getItemCount() = fragmentList.size
override fun createFragment(position: Int) = fragmentList[position]
fun addFragment(fragment: Fragment) {
fragmentList.add(fragment)
}
}

View File

@ -20,6 +20,7 @@ import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ActivitySplashBinding
import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.onboarding.OnBoardingActivity
import kr.co.vividnext.sodalive.user.login.LoginActivity
@SuppressLint("CustomSplashScreen")
@ -171,13 +172,30 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
}
private fun startNextActivity(extras: Bundle? = null) {
if (SharedPreferenceManager.token.isBlank()) {
showLoginActivity(extras)
if (SharedPreferenceManager.isViewedOnboardingTutorial) {
if (SharedPreferenceManager.token.isBlank()) {
showLoginActivity(extras)
} else {
showMainActivity(extras)
}
} else {
showMainActivity(extras)
showOnBoardingTutorialActivity(extras)
}
}
private fun showOnBoardingTutorialActivity(extras: Bundle?) {
handler.postDelayed({
startActivity(
Intent(applicationContext, OnBoardingActivity::class.java).apply {
putExtra(Constants.EXTRA_DATA, extras)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
)
finish()
}, 500)
}
private fun showMainActivity(extras: Bundle?) {
handler.postDelayed({
startActivity(

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadius="0dp"
android:shape="ring"
android:thickness="3.5dp"
android:useLevel="false">
<solid android:color="@color/color_555555" />
</shape>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadius="0dp"
android:shape="ring"
android:thickness="3.5dp"
android:useLevel="false">
<solid android:color="@color/color_1313bc" />
</shape>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/dot_selected" android:state_selected="true" />
<item android:drawable="@drawable/dot_default" />
</selector>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/tv_start"
android:layout_alignParentTop="true"
android:gravity="center">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@android:color/transparent"
app:tabBackground="@drawable/tab_dot_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp" />
</RelativeLayout>
<TextView
android:id="@+id/tv_start"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:background="@color/color_80d8ff"
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:text="시작하기"
android:textColor="@color/color_1313bc"
android:textSize="18.3sp" />
</RelativeLayout>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_root"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_ccf0ff">
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
tools:src="@drawable/img_guide_1" />
</RelativeLayout>

View File

@ -3,7 +3,7 @@
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="color_80d8ff">#80DFFF</color>
<color name="color_80d8ff">#80D8FF</color>
<color name="color_1313bc">#1313BC</color>
<color name="color_9970ff">#9970FF</color>
<color name="color_eeeeee">#EEEEEE</color>
@ -97,4 +97,5 @@
<color name="color_2f90b7">#2F90B7</color>
<color name="color_a94400">#A94400</color>
<color name="color_ffe368">#FFE368</color>
<color name="color_ccf0ff">#CCF0FF</color>
</resources>