Skip to content

Commit

Permalink
Merge pull request #201 from GEON-PPANG/feat-onboarding-amplitude
Browse files Browse the repository at this point in the history
[feat] 온보딩 엠플리튜드 트래킹 이벤트 코드 심기
  • Loading branch information
jooyyoo authored Sep 28, 2023
2 parents 890c4a7 + 79ff506 commit 9a39ef2
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,5 @@ class GPDataSource @Inject constructor(@ApplicationContext context: Context) {
const val ACCESS_TOKEN = "AccessToken"
const val REFRESH_TOKEN = "RefreshToken"
const val IS_LOGIN = "IsLogin"
const val NICKNAME = "nickname"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.sopt.geonppang.presentation.MainActivity
import com.sopt.geonppang.presentation.login.LoginActivity
import com.sopt.geonppang.presentation.type.AuthRoleType
import com.sopt.geonppang.presentation.type.PlatformType
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.binding.BindingActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
Expand All @@ -34,12 +35,14 @@ class SignActivity :
private fun addListeners() {
binding.btnStartKakao.setOnClickListener {
kakaoAuthService.startKakaoLogin(authViewModel::signUp)
AmplitudeUtils.trackEventWithProperties(START_SIGNUP, SIGNUP_TYPE, KAKAO)
}
binding.tvLoginWithEmail.setOnClickListener {
moveToLogin()
}
binding.tvSignupWithEmail.setOnClickListener {
moveToSignUp()
AmplitudeUtils.trackEventWithProperties(START_SIGNUP, SIGNUP_TYPE, EMAIL)
}
}

Expand Down Expand Up @@ -80,4 +83,11 @@ class SignActivity :
Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
}

companion object {
const val START_SIGNUP = "start_signup"
const val SIGNUP_TYPE = "signup_type"
const val EMAIL = "email"
const val KAKAO = "kakao"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.ActivitySignupBinding
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.UiState
import com.sopt.geonppang.util.binding.BindingActivity
import com.sopt.geonppang.util.extension.hideKeyboard
Expand Down Expand Up @@ -43,6 +44,7 @@ class SignUpActivity :
}
binding.btnNext.setOnClickListener {
moveToNickname()
AmplitudeUtils.trackEvent(COMPLETE_SIGNUP)
}
binding.toolbar.ivBack.setOnClickListener {
finish()
Expand Down Expand Up @@ -124,5 +126,6 @@ class SignUpActivity :
companion object {
const val EMAIL = "email"
const val PASSWORD = "password"
const val COMPLETE_SIGNUP = "complete_signup"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.ActivityWelcomeBinding
import com.sopt.geonppang.presentation.filterSetting.FilterSettingActivity
import com.sopt.geonppang.presentation.type.FilterInfoType
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.binding.BindingActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
Expand All @@ -22,6 +23,7 @@ class WelcomeActivity : BindingActivity<ActivityWelcomeBinding>(R.layout.activit
private fun initLayout() {
val nickName = intent.getStringExtra(NICKNAME)
binding.tvStartWelcomeTitle.text = this.getString(R.string.welcome_to_geonppang, nickName)
AmplitudeUtils.trackEventWithProperties(COMPLETE_NICKNAME, NICKNAME, nickName)
}

private fun loadWelcomeScreen() {
Expand All @@ -43,5 +45,6 @@ class WelcomeActivity : BindingActivity<ActivityWelcomeBinding>(R.layout.activit
companion object {
const val NICKNAME = "nickName"
const val FILTER_INFO = "filterInfo"
const val COMPLETE_NICKNAME = "complete_nickname"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ import androidx.viewpager2.widget.ViewPager2
import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.ActivityFilterBinding
import com.sopt.geonppang.presentation.MainActivity
import com.sopt.geonppang.presentation.auth.SignActivity
import com.sopt.geonppang.presentation.type.BreadFilterType
import com.sopt.geonppang.presentation.type.FilterInfoType
import com.sopt.geonppang.presentation.type.NutrientFilterType
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.UiState
import com.sopt.geonppang.util.binding.BindingActivity
Expand Down Expand Up @@ -49,6 +50,7 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac
}
})
setPreviousActivity()
AmplitudeUtils.trackEvent(START_FILTER_ONBOARDING)
}

private fun addListeners() {
Expand All @@ -67,13 +69,22 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac

binding.btnFilterNext.setOnSingleClickListener {
when (binding.vpFilterContainer.currentItem) {
2 -> {
viewModel.setUserFilter()
0 -> {
AmplitudeUtils.trackEvent(FILTER_SETTING_FIRST_PAGE)
binding.vpFilterContainer.currentItem++
}

else -> {
1 -> {
AmplitudeUtils.trackEvent(FILTER_SETTING_SECOND_PAGE)
binding.vpFilterContainer.currentItem++
}

2 -> {
viewModel.setUserFilter()
AmplitudeUtils.trackEvent(FILTER_SETTING_LAST_PAGE)
}

else -> {}
}
}
}
Expand All @@ -97,10 +108,9 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac
}
}.launchIn(lifecycleScope)

viewModel.isFilterBtnEnabled.flowWithLifecycle(lifecycle)
.onEach { isFilterBtnEnabled ->
binding.btnFilterNext.isEnabled = isFilterBtnEnabled
}.launchIn(lifecycleScope)
viewModel.isFilterBtnEnabled.flowWithLifecycle(lifecycle).onEach { isFilterBtnEnabled ->
binding.btnFilterNext.isEnabled = isFilterBtnEnabled
}.launchIn(lifecycleScope)

viewModel.selectedFilterState.flowWithLifecycle(lifecycle).onEach {
when (it) {
Expand All @@ -123,6 +133,16 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac

FilterInfoType.ONBOARDING -> {
moveOnBoardingToMain()
it.data.mainPurposeType?.let { mainPurposeType ->
AmplitudeUtils.trackEventWithMapProperties(
COMPLETE_FILTER_ONBOARDING,
mapOf(
MAIN_PURPOSE to mainPurposeType,
BREAD_TYPE to getStringBreadType(it.data.breadType),
INGREDIENTS_TYPE to getStringIngredientType(it.data.ingredientType)
)
)
}
}

else -> {}
Expand All @@ -137,8 +157,7 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac

private fun moveOnBoardingToMain() {
val intent = Intent(this, MainActivity::class.java)
intent.flags =
Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
}

Expand All @@ -151,13 +170,6 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac
startActivity(intent)
}

private fun moveToSign() {
val intent = Intent(this, SignActivity::class.java)
intent.flags =
Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
}

private fun setPreviousActivity() {
intent.getStringExtra(FILTER_INFO)?.let { filterInfoType ->
viewModel.setPreviousActivity(FilterInfoType.valueOf(filterInfoType))
Expand Down Expand Up @@ -186,6 +198,14 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac
}
}

private fun getStringBreadType(breadType: Map<BreadFilterType, Boolean>): List<String> {
return breadType.entries.filter { it.value }.map { it.key.name }
}

private fun getStringIngredientType(ingredientType: Map<NutrientFilterType, Boolean>): List<String> {
return ingredientType.entries.filter { it.value }.map { it.key.name }
}

companion object {
const val FILTER_INFO = "filterInfo"
const val MY_PAGE_FRAGMENT = "MyPageFragment"
Expand All @@ -197,5 +217,13 @@ class FilterSettingActivity : BindingActivity<ActivityFilterBinding>(R.layout.ac
const val COMPLETE_FILTER_HOME = "complete_filter_home"
const val COMPLETE_FILTER_LIST = "complete_filter_list"
const val COMPLETE_FILTER_MY = "complete_filter_mypage"
const val START_FILTER_ONBOARDING = "start_filter_onboarding"
const val COMPLETE_FILTER_ONBOARDING = "complete_filter_onboarding"
const val MAIN_PURPOSE = "main purpose"
const val BREAD_TYPE = "breadtype"
const val INGREDIENTS_TYPE = "ingredients type"
const val FILTER_SETTING_FIRST_PAGE = "click_mainpurpose"
const val FILTER_SETTING_SECOND_PAGE = "click_breadtype"
const val FILTER_SETTING_LAST_PAGE = "click_ingredients type"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.geonppang.data.datasource.local.GPDataSource
import com.sopt.geonppang.data.model.request.RequestSettingFilter
import com.sopt.geonppang.domain.model.SelectedFilter
import com.sopt.geonppang.domain.repository.FilterSettingRepository
import com.sopt.geonppang.presentation.model.AmplitudeFilterSettingInfo
import com.sopt.geonppang.presentation.type.BreadFilterType
import com.sopt.geonppang.presentation.type.FilterInfoType
import com.sopt.geonppang.presentation.type.MainPurposeType
Expand All @@ -26,7 +26,8 @@ class FilterSettingViewModel @Inject constructor(
gpDataSource: GPDataSource,
private val filterRepository: FilterSettingRepository
) : ViewModel() {
private val _selectedFilterState = MutableStateFlow<UiState<SelectedFilter>>(UiState.Loading)
private val _selectedFilterState =
MutableStateFlow<UiState<AmplitudeFilterSettingInfo>>(UiState.Loading)
val selectedFilterState get() = _selectedFilterState.asStateFlow()
private val _previousActivity = MutableStateFlow<FilterInfoType?>(null)
val previousActivity get() = _previousActivity.asStateFlow()
Expand Down Expand Up @@ -112,8 +113,14 @@ class FilterSettingViewModel @Inject constructor(
filterRepository.setUserFilter(
it
)
.onSuccess { selectedFilter ->
_selectedFilterState.value = UiState.Success(selectedFilter)
.onSuccess {
_selectedFilterState.value = UiState.Success(
AmplitudeFilterSettingInfo(
mainPurposeType = _mainPurposeType.value,
breadType = breadFilterType.value,
ingredientType = nutrientFilterType.value,
)
)
}
.onFailure { throwable ->
_selectedFilterState.value = UiState.Error(throwable.message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import androidx.fragment.app.activityViewModels
import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.FragmentMainPurposeFilterBinding
import com.sopt.geonppang.presentation.MainActivity
import com.sopt.geonppang.presentation.auth.SignActivity
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.binding.BindingFragment

class MainPurposeFilterFragment :
Expand All @@ -27,6 +27,10 @@ class MainPurposeFilterFragment :
binding.layoutMainPurposeSkip.setOnClickListener {
moveToMain()
}

binding.tvMainPurposeSkip.setOnClickListener {
AmplitudeUtils.trackEvent(CLICK_SKIP)
}
}

private fun moveToMain() {
Expand All @@ -36,10 +40,7 @@ class MainPurposeFilterFragment :
startActivity(intent)
}

private fun moveToSign() {
val intent = Intent(requireContext(), SignActivity::class.java)
intent.flags =
Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
companion object {
const val CLICK_SKIP = "click_skip"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sopt.geonppang.presentation.model

import com.sopt.geonppang.presentation.type.BreadFilterType
import com.sopt.geonppang.presentation.type.MainPurposeType
import com.sopt.geonppang.presentation.type.NutrientFilterType

data class AmplitudeFilterSettingInfo(
val mainPurposeType: MainPurposeType?,
val breadType: Map<BreadFilterType, Boolean>,
val ingredientType: Map<NutrientFilterType, Boolean>
)

0 comments on commit 9a39ef2

Please sign in to comment.