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

[feat] 온보딩 엠플리튜드 트래킹 이벤트 코드 심기 #201

Merged
merged 17 commits into from
Sep 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>
)
Loading