Skip to content

Commit 409305f

Browse files
committed
feat: Firebase Analytics 이벤트 계측 확장 (Phase 1/2/3)
코스→러닝 전환율 20% 병목 분석을 위해 Firebase 이벤트를 35개에서 64개로 확장. 12개 블랙박스 화면(RunActivity, CountDown 등)에 계측 코드 삽입. - Phase 1 (P0): 러닝 전구간, 카운트다운, 코스 그리기 완성 플로우 - Phase 2 (P1): 로그인 성공/실패, 온보딩, 검색, 업로드, 보관함, 딥링크 - Phase 3 (P2): 리워드, 프로필 수정
1 parent eeccb1c commit 409305f

File tree

19 files changed

+378
-29
lines changed

19 files changed

+378
-29
lines changed

app/src/main/java/com/runnect/runnect/presentation/countdown/CountDownActivity.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import com.runnect.runnect.binding.BindingActivity
1212
import com.runnect.runnect.data.dto.CourseData
1313
import com.runnect.runnect.databinding.ActivityCountDownBinding
1414
import com.runnect.runnect.presentation.run.RunActivity
15+
import com.runnect.runnect.util.analytics.Analytics
16+
import com.runnect.runnect.util.analytics.EventName
17+
import com.runnect.runnect.util.analytics.EventName.Param
1518
import com.runnect.runnect.util.extension.getCompatibleParcelableExtra
1619
import timber.log.Timber
1720

@@ -21,6 +24,11 @@ class CountDownActivity: BindingActivity<ActivityCountDownBinding>(R.layout.acti
2124
override fun onCreate(savedInstanceState: Bundle?) {
2225
super.onCreate(savedInstanceState)
2326

27+
Analytics.logEvent(
28+
EventName.VIEW_COUNTDOWN,
29+
Param.COURSE_ID to courseData?.courseId
30+
)
31+
2432
val intentToRun = Intent(this, RunActivity::class.java)
2533
val numList = arrayListOf(
2634
AppCompatResources.getDrawable(this, R.drawable.anim_num1),
@@ -32,6 +40,10 @@ class CountDownActivity: BindingActivity<ActivityCountDownBinding>(R.layout.acti
3240
}
3341

3442
override fun onBackPressed() {
43+
Analytics.logEvent(
44+
EventName.CLICK_CANCEL_COUNTDOWN,
45+
Param.COURSE_ID to courseData?.courseId
46+
)
3547
finish()
3648
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right)
3749
}

app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ import com.runnect.runnect.presentation.profile.ProfileActivity
3939
import com.runnect.runnect.presentation.scheme.SchemeActivity
4040
import com.runnect.runnect.presentation.state.UiStateV2
4141
import com.runnect.runnect.util.analytics.Analytics
42+
import com.runnect.runnect.util.analytics.EventName
4243
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_SHARE
4344
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_USER_PROFILE
45+
import com.runnect.runnect.util.analytics.EventName.Param
4446
import com.runnect.runnect.util.analytics.EventName.VIEW_COURSE_DETAIL
4547
import com.runnect.runnect.util.custom.dialog.CommonDialogFragment
4648
import com.runnect.runnect.util.custom.dialog.CommonDialogText
@@ -187,6 +189,11 @@ class CourseDetailActivity :
187189
}
188190

189191
private fun navigateToCountDownScreen() {
192+
Analytics.logEvent(
193+
EventName.CLICK_RUN_FROM_DETAIL,
194+
Param.COURSE_ID to courseDetail.courseId,
195+
Param.DISTANCE_M to courseDetail.distance
196+
)
190197
Intent(
191198
this@CourseDetailActivity,
192199
CountDownActivity::class.java
@@ -545,6 +552,12 @@ class CourseDetailActivity :
545552
val response = state.data
546553
binding.tvCourseDetailScrapCount.text = response.scrapCount.toString()
547554
binding.ivCourseDetailScrap.isSelected = response.scrapTF
555+
if (!response.scrapTF) {
556+
Analytics.logEvent(
557+
EventName.CLICK_UNSCRAP,
558+
Param.COURSE_ID to publicCourseId
559+
)
560+
}
548561
}
549562

550563
is UiStateV2.Failure -> {

app/src/main/java/com/runnect/runnect/presentation/discover/pick/DiscoverPickActivity.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import com.runnect.runnect.presentation.discover.pick.adapter.DiscoverPickAdapte
1414
import com.runnect.runnect.presentation.discover.upload.DiscoverUploadActivity
1515
import com.runnect.runnect.presentation.search.SearchActivity
1616
import com.runnect.runnect.presentation.state.UiStateV2
17+
import com.runnect.runnect.util.analytics.Analytics
18+
import com.runnect.runnect.util.analytics.EventName
1719
import com.runnect.runnect.util.custom.deco.GridSpacingItemDecoration
1820
import com.runnect.runnect.util.extension.applyScreenEnterAnimation
1921
import com.runnect.runnect.util.extension.navigateToPreviousScreenWithAnimation
@@ -30,6 +32,7 @@ class DiscoverPickActivity :
3032
super.onCreate(savedInstanceState)
3133
binding.vm = viewModel
3234
binding.lifecycleOwner = this
35+
Analytics.logEvent(EventName.VIEW_DISCOVER_PICK)
3336

3437
initLayout()
3538
addListener()

app/src/main/java/com/runnect/runnect/presentation/discover/search/DiscoverSearchActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse
2424
import com.runnect.runnect.presentation.discover.search.adapter.DiscoverSearchAdapter
2525
import com.runnect.runnect.presentation.state.UiStateV2
2626
import com.runnect.runnect.util.analytics.Analytics
27+
import com.runnect.runnect.util.analytics.EventName
2728
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_TRY_SEARCH_COURSE
29+
import com.runnect.runnect.util.analytics.EventName.Param
2830
import com.runnect.runnect.util.analytics.EventName.VIEW_COURSE_SEARCH
2931
import com.runnect.runnect.util.custom.deco.GridSpacingItemDecoration
3032
import com.runnect.runnect.util.extension.applyScreenEnterAnimation
@@ -173,6 +175,11 @@ class DiscoverSearchActivity :
173175
dismissProgressBar()
174176
showRecyclerView()
175177
searchAdapter.submitList(state.data)
178+
Analytics.logEvent(
179+
EventName.ACTION_COURSE_SEARCH_EXECUTE,
180+
Param.KEYWORD to binding.etDiscoverSearchTitle.text.toString(),
181+
Param.RESULT_COUNT to (state.data?.size ?: 0)
182+
)
176183
}
177184

178185
else -> {

app/src/main/java/com/runnect/runnect/presentation/discover/upload/DiscoverUploadActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ import com.runnect.runnect.presentation.event.ScreenRefreshEvent
1818
import com.runnect.runnect.presentation.event.ScreenRefreshEventBus
1919
import com.runnect.runnect.presentation.state.UiState
2020
import com.runnect.runnect.util.analytics.Analytics
21+
import com.runnect.runnect.util.analytics.EventName
2122
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_COURSE_UPLOAD
23+
import com.runnect.runnect.util.analytics.EventName.Param
2224
import com.runnect.runnect.util.analytics.EventName.VIEW_COURSE_UPLOAD
2325
import com.runnect.runnect.util.extension.applyScreenExitAnimation
2426
import com.runnect.runnect.util.extension.getCompatibleParcelableExtra
@@ -113,6 +115,11 @@ class DiscoverUploadActivity :
113115
}
114116

115117
private fun handleReturnToDiscover() {
118+
Analytics.logEvent(
119+
EventName.ACTION_COURSE_UPLOAD_COMPLETE,
120+
Param.COURSE_ID to viewModel.id,
121+
Param.DISTANCE_M to uploadCourse?.distance
122+
)
116123
showToast("업로드 완료!")
117124
binding.indeterminateBar.isVisible = false
118125

app/src/main/java/com/runnect/runnect/presentation/draw/DrawActivity.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import com.runnect.runnect.presentation.state.UiState
4949
import com.runnect.runnect.util.DepartureSetMode
5050
import com.runnect.runnect.util.analytics.Analytics
5151
import com.runnect.runnect.util.analytics.EventName
52+
import com.runnect.runnect.util.analytics.EventName.Param
5253
import com.runnect.runnect.util.custom.dialog.RequireLoginDialogFragment
5354
import com.runnect.runnect.util.extension.PermissionUtil
5455
import com.runnect.runnect.util.extension.hideKeyboard
@@ -110,6 +111,7 @@ class DrawActivity : BindingActivity<ActivityDrawBinding>(R.layout.activity_draw
110111
binding.model = viewModel
111112
binding.lifecycleOwner = this
112113

114+
Analytics.logEvent(EventName.VIEW_COURSE_DRAWING)
113115
initMapView()
114116
getSearchIntent()
115117
addObserver()
@@ -492,6 +494,13 @@ class DrawActivity : BindingActivity<ActivityDrawBinding>(R.layout.activity_draw
492494
UiState.Loading -> showLoadingBar()
493495
UiState.Success -> {
494496
hideLoadingBar()
497+
Analytics.logEvent(
498+
EventName.ACTION_COURSE_DRAWING_COMPLETE,
499+
Param.COURSE_ID to viewModel.uploadCourseId,
500+
Param.DISTANCE_M to viewModel.distanceSum.value,
501+
Param.POINT_COUNT to touchList.size,
502+
Param.DEPARTURE_NAME to viewModel.departureName
503+
)
495504
notifyCreateFinish()
496505
}
497506

@@ -552,6 +561,11 @@ class DrawActivity : BindingActivity<ActivityDrawBinding>(R.layout.activity_draw
552561
dialog.dismiss()
553562
}
554563
}
564+
Analytics.logEvent(
565+
EventName.VIEW_COURSE_COMPLETE_RESULT,
566+
Param.COURSE_ID to viewModel.uploadCourseId,
567+
Param.DISTANCE_M to viewModel.distanceSum.value
568+
)
555569
dialog.show()
556570
}
557571

app/src/main/java/com/runnect/runnect/presentation/endrun/EndRunActivity.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import com.runnect.runnect.databinding.ActivityEndRunBinding
1919
import com.runnect.runnect.presentation.MainActivity
2020
import com.runnect.runnect.presentation.state.UiState
2121
import com.runnect.runnect.util.analytics.Analytics
22+
import com.runnect.runnect.util.analytics.EventName
2223
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_BACK_RUNNING_TRACKING
2324
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_STORE_RUNNING_TRACKING
25+
import com.runnect.runnect.util.analytics.EventName.Param
2426
import com.runnect.runnect.util.custom.toast.RunnectToast
2527
import com.runnect.runnect.util.extension.hideKeyboard
2628
import com.runnect.runnect.util.extension.round
@@ -60,6 +62,15 @@ class EndRunActivity: BindingActivity<ActivityEndRunBinding>(R.layout.activity_e
6062
backBtn()
6163
editTextController()
6264
getIntentValue()
65+
66+
val totalTimeSec = ((runToEndRunData.timerHour ?: 0) * 3600) + ((runToEndRunData.timerMinute ?: 0) * 60) + (runToEndRunData.timerSecond ?: 0)
67+
Analytics.logEvent(
68+
EventName.VIEW_END_RUN,
69+
Param.COURSE_ID to runToEndRunData.courseId,
70+
Param.TOTAL_DISTANCE_M to runToEndRunData.totalDistance,
71+
Param.TOTAL_TIME_SEC to totalTimeSec
72+
)
73+
6374
setTimerViewModelValue()
6475
transferMinuteForCalcPace()
6576
setPaceViewModelValue()
@@ -157,6 +168,10 @@ class EndRunActivity: BindingActivity<ActivityEndRunBinding>(R.layout.activity_e
157168
private fun saveRecord() {
158169
binding.btnEndRunSave.setOnClickListener {
159170
Analytics.logClickedItemEvent(EVENT_CLICK_STORE_RUNNING_TRACKING)
171+
Analytics.logEvent(
172+
EventName.CLICK_SAVE_RUN_RECORD,
173+
Param.COURSE_ID to viewModel.courseId.value
174+
)
160175
viewModel.postRecord(
161176
RequestPostRunningHistory(
162177
courseId = viewModel.courseId.value!!,

app/src/main/java/com/runnect/runnect/presentation/login/GiveNicknameActivity.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import com.runnect.runnect.binding.BindingActivity
1111
import com.runnect.runnect.databinding.ActivityGiveNicknameBinding
1212
import com.runnect.runnect.presentation.MainActivity
1313
import com.runnect.runnect.presentation.state.UiState
14+
import com.runnect.runnect.util.analytics.Analytics
15+
import com.runnect.runnect.util.analytics.EventName
16+
import com.runnect.runnect.util.analytics.EventName.Param
1417
import com.runnect.runnect.util.extension.hideKeyboard
1518
import com.runnect.runnect.util.extension.showToast
1619
import com.runnect.runnect.util.preference.AuthUtil.saveToken
@@ -24,6 +27,7 @@ class GiveNicknameActivity :
2427
super.onCreate(savedInstanceState)
2528
binding.vm = viewModel
2629
binding.lifecycleOwner = this
30+
Analytics.logEvent(EventName.VIEW_GIVE_NICKNAME)
2731
addListener()
2832
addObserver()
2933
}
@@ -70,6 +74,10 @@ class GiveNicknameActivity :
7074
}
7175

7276
private fun handleSuccessfulSignup() {
77+
Analytics.logEvent(
78+
EventName.ACTION_NICKNAME_COMPLETE,
79+
Param.NICKNAME_LENGTH to (viewModel.nickName.value?.length ?: 0)
80+
)
7381
saveSignTokenInfo()
7482
showToast("회원가입 되었습니다")
7583
binding.indeterminateBar.isVisible = false

app/src/main/java/com/runnect/runnect/presentation/login/LoginActivity.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import com.runnect.runnect.databinding.ActivityLoginBinding
1313
import com.runnect.runnect.presentation.MainActivity
1414
import com.runnect.runnect.presentation.state.UiState
1515
import com.runnect.runnect.util.analytics.Analytics
16+
import com.runnect.runnect.util.analytics.EventName
1617
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_VISITOR
1718
import com.runnect.runnect.util.analytics.EventName.EVENT_VIEW_SOCIAL_LOGIN
19+
import com.runnect.runnect.util.analytics.EventName.Param
1820
import com.runnect.runnect.util.extension.showSnackbar
1921
import com.runnect.runnect.util.extension.showToast
2022
import com.runnect.runnect.util.preference.AuthUtil.getAccessToken
@@ -106,19 +108,37 @@ class LoginActivity :
106108
}
107109
}
108110
viewModel.errorMessage.observe(this) {
111+
val method = if (::socialLogin.isInitialized && socialLogin is GoogleLogin) "google" else "kakao"
112+
Analytics.logEvent(
113+
EventName.ACTION_LOGIN_FAIL,
114+
Param.METHOD to method,
115+
Param.ERROR_CODE to it
116+
)
109117
showSnackbar(binding.root, it)
110118
Timber.tag(ContentValues.TAG).d("로그인 통신 실패: $it")
111119
}
112120
}
113121

114122
private fun handleSuccessfulLogin() {
123+
val method = if (::socialLogin.isInitialized && socialLogin is GoogleLogin) "google" else "kakao"
124+
Analytics.logEvent(
125+
EventName.ACTION_LOGIN_SUCCESS,
126+
Param.METHOD to method,
127+
Param.IS_NEW_USER to false
128+
)
115129
saveSignTokenInfo()
116130
moveToMain()
117131
Toast.makeText(this@LoginActivity, MESSAGE_LOGIN_SUCCESS, Toast.LENGTH_SHORT).show()
118132
binding.indeterminateBar.isVisible = false
119133
}
120134

121135
private fun handleSuccessfulSignup() {
136+
val method = if (::socialLogin.isInitialized && socialLogin is GoogleLogin) "google" else "kakao"
137+
Analytics.logEvent(
138+
EventName.ACTION_LOGIN_SUCCESS,
139+
Param.METHOD to method,
140+
Param.IS_NEW_USER to true
141+
)
122142
saveSignTokenInfo()
123143
moveToGiveNickName()
124144
}

app/src/main/java/com/runnect/runnect/presentation/mypage/editname/MyPageEditNameActivity.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import com.runnect.runnect.R
1313
import com.runnect.runnect.binding.BindingActivity
1414
import com.runnect.runnect.databinding.ActivityMyPageEditNameBinding
1515
import com.runnect.runnect.presentation.state.UiState
16+
import com.runnect.runnect.util.analytics.Analytics
17+
import com.runnect.runnect.util.analytics.EventName
18+
import com.runnect.runnect.util.analytics.EventName.Param
1619
import com.runnect.runnect.util.extension.hideKeyboard
1720
import com.runnect.runnect.util.extension.showToast
1821
import dagger.hilt.android.AndroidEntryPoint
@@ -25,6 +28,7 @@ class MyPageEditNameActivity :
2528
super.onCreate(savedInstanceState)
2629
binding.vm = viewModel
2730
binding.lifecycleOwner = this
31+
Analytics.logEvent(EventName.VIEW_EDIT_PROFILE)
2832
initLayout()
2933
addListener()
3034
addObserver()
@@ -66,6 +70,10 @@ class MyPageEditNameActivity :
6670
UiState.Loading -> binding.indeterminateBar.isVisible = true
6771
UiState.Success -> {
6872
binding.indeterminateBar.isVisible = false
73+
Analytics.logEvent(
74+
EventName.ACTION_EDIT_PROFILE_COMPLETE,
75+
Param.CHANGED_FIELDS to "nickname"
76+
)
6977
setResult(
7078
RESULT_OK,
7179
Intent().putExtra(EXTRA_NICK_NAME, viewModel.nickName.value)

0 commit comments

Comments
 (0)