Skip to content

Commit 9c624d9

Browse files
committed
[BOOK-256] feat: 누락된 Analytics 로그 수집 함수 추가
1 parent f46dee2 commit 9c624d9

File tree

9 files changed

+83
-21
lines changed

9 files changed

+83
-21
lines changed

core/common/src/main/kotlin/com/ninecraft/booket/core/common/analytics/AnalyticsHelper.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,12 @@ import javax.inject.Singleton
88

99
@Singleton
1010
class AnalyticsHelper @Inject constructor(
11-
private val firebaseAnalytics: FirebaseAnalytics
11+
private val firebaseAnalytics: FirebaseAnalytics,
1212
) {
1313

1414
fun logScreenView(screenName: String) {
1515
Logger.d("Analytics - Screen View: $screenName")
16-
17-
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) {
18-
param(FirebaseAnalytics.Param.SCREEN_NAME, screenName)
19-
}
16+
firebaseAnalytics.logEvent(screenName) {}
2017
}
2118

2219
fun logEvent(eventName: String) {
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package com.ninecraft.booket.core.common.analytics.di
22

3-
import android.content.Context
43
import com.google.firebase.Firebase
54
import com.google.firebase.analytics.FirebaseAnalytics
65
import com.google.firebase.analytics.analytics
76
import dagger.Module
87
import dagger.Provides
98
import dagger.hilt.InstallIn
10-
import dagger.hilt.android.qualifiers.ApplicationContext
119
import dagger.hilt.components.SingletonComponent
1210
import javax.inject.Singleton
1311

@@ -17,7 +15,7 @@ object AnalyticsModule {
1715

1816
@Provides
1917
@Singleton
20-
fun provideFirebaseAnalytics(@ApplicationContext context: Context): FirebaseAnalytics {
18+
fun provideFirebaseAnalytics(): FirebaseAnalytics {
2119
return Firebase.analytics
2220
}
2321
}

feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailPresenter.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class BookDetailPresenter @AssistedInject constructor(
5353
companion object {
5454
private const val PAGE_SIZE = 20
5555
private const val START_INDEX = 0
56+
private const val BOOK_DELETE = "library_book_delete"
57+
private const val BOOK_DELETE_COMPLETE = "library_book_delete_complete"
5658
}
5759

5860
private fun getRecordComparator(sortType: RecordSort): Comparator<ReadingRecordModel> {
@@ -221,6 +223,7 @@ class BookDetailPresenter @AssistedInject constructor(
221223
scope.launch {
222224
bookRepository.deleteBook(userBookId = userBookId)
223225
.onSuccess {
226+
analyticsHelper.logEvent(BOOK_DELETE_COMPLETE)
224227
onSuccess()
225228
}
226229
.onFailure { exception ->
@@ -323,6 +326,7 @@ class BookDetailPresenter @AssistedInject constructor(
323326
is BookDetailUiEvent.OnDeleteRecordClick -> {
324327
isRecordMenuBottomSheetVisible = false
325328
isRecordDeleteDialogVisible = true
329+
analyticsHelper.logScreenView(BOOK_DELETE)
326330
}
327331

328332
is BookDetailUiEvent.OnDeleteRecord -> {

feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/record/RecordDetailPresenter.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class RecordDetailPresenter @AssistedInject constructor(
3333
private val analyticsHelper: AnalyticsHelper,
3434
) : Presenter<RecordDetailUiState> {
3535

36+
companion object {
37+
private const val RECORD_DELETE = "record_delete"
38+
private const val RECORD_DELETE_COMPLETE = "record_delete_complete"
39+
}
40+
3641
@Composable
3742
override fun present(): RecordDetailUiState {
3843
val scope = rememberCoroutineScope()
@@ -73,6 +78,7 @@ class RecordDetailPresenter @AssistedInject constructor(
7378
scope.launch {
7479
repository.deleteRecord(readingRecordId = readingRecordId)
7580
.onSuccess {
81+
analyticsHelper.logEvent(RECORD_DELETE_COMPLETE)
7682
onSuccess()
7783
}
7884
.onFailure { exception ->
@@ -134,6 +140,7 @@ class RecordDetailPresenter @AssistedInject constructor(
134140
}
135141

136142
RecordDetailUiEvent.OnDeleteRecordClick -> {
143+
analyticsHelper.logEvent(RECORD_DELETE)
137144
isRecordMenuBottomSheetVisible = false
138145
isRecordDeleteDialogVisible = true
139146
}

feature/edit/src/main/kotlin/com/ninecraft/booket/feature/edit/record/RecordEditPresenter.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.compose.runtime.mutableStateOf
99
import androidx.compose.runtime.remember
1010
import androidx.compose.runtime.rememberCoroutineScope
1111
import androidx.compose.runtime.setValue
12+
import com.ninecraft.booket.core.common.analytics.AnalyticsHelper
1213
import com.ninecraft.booket.core.common.utils.handleException
1314
import com.ninecraft.booket.core.data.api.repository.RecordRepository
1415
import com.ninecraft.booket.feature.screens.EmotionEditScreen
@@ -20,6 +21,7 @@ import com.slack.circuit.foundation.rememberAnsweringNavigator
2021
import com.slack.circuit.retained.rememberRetained
2122
import com.slack.circuit.runtime.Navigator
2223
import com.slack.circuit.runtime.presenter.Presenter
24+
import com.slack.circuitx.effects.ImpressionEffect
2325
import dagger.assisted.Assisted
2426
import dagger.assisted.AssistedFactory
2527
import dagger.assisted.AssistedInject
@@ -30,8 +32,15 @@ class RecordEditPresenter @AssistedInject constructor(
3032
@Assisted private val screen: RecordEditScreen,
3133
@Assisted private val navigator: Navigator,
3234
private val repository: RecordRepository,
35+
private val analyticsHelper: AnalyticsHelper,
3336
) : Presenter<RecordEditUiState> {
3437

38+
companion object {
39+
private const val MAX_PAGE = 4032
40+
private const val RECORD_EDIT = "record_edit_save"
41+
private const val RECORD_EDIT_SAVE = "record_edit_save"
42+
}
43+
3544
@Composable
3645
override fun present(): RecordEditUiState {
3746
val scope = rememberCoroutineScope()
@@ -85,6 +94,7 @@ class RecordEditPresenter @AssistedInject constructor(
8594
emotionTags = emotionTags,
8695
review = impression,
8796
).onSuccess {
97+
analyticsHelper.logEvent(RECORD_EDIT_SAVE)
8898
onSuccess()
8999
}.onFailure { exception ->
90100
val handleErrorMessage = { message: String ->
@@ -133,6 +143,10 @@ class RecordEditPresenter @AssistedInject constructor(
133143
}
134144
}
135145

146+
ImpressionEffect {
147+
analyticsHelper.logScreenView(RECORD_EDIT)
148+
}
149+
136150
return RecordEditUiState(
137151
recordInfo = recordInfo,
138152
recordPageState = recordPageState,
@@ -153,8 +167,4 @@ class RecordEditPresenter @AssistedInject constructor(
153167
navigator: Navigator,
154168
): RecordEditPresenter
155169
}
156-
157-
companion object {
158-
const val MAX_PAGE = 4032
159-
}
160170
}

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/OcrPresenter.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class OcrPresenter @AssistedInject constructor(
2626
private val analyticsHelper: AnalyticsHelper,
2727
) : Presenter<OcrUiState> {
2828

29+
companion object {
30+
private const val RECORD_OCR_SENTENCE = "record_OCR_sentence"
31+
}
32+
2933
@Composable
3034
override fun present(): OcrUiState {
3135
var currentUi by rememberRetained { mutableStateOf(OcrUi.CAMERA) }
@@ -82,6 +86,7 @@ class OcrPresenter @AssistedInject constructor(
8286
sentenceList = persistentListOf(*sentences.toTypedArray())
8387

8488
currentUi = OcrUi.RESULT
89+
analyticsHelper.logScreenView(RECORD_OCR_SENTENCE)
8590
}
8691
}
8792

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ class RecordRegisterPresenter @AssistedInject constructor(
4343
private val analyticsHelper: AnalyticsHelper,
4444
) : Presenter<RecordRegisterUiState> {
4545

46+
companion object {
47+
private const val MAX_PAGE = 4032
48+
private const val RECORD_INPUT_SENTENCE = "record_input_sentence"
49+
private const val RECORD_SELECT_EMOTION = "record_select_emotion"
50+
private const val RECORD_INPUT_OPINION = "record_input_opinion"
51+
private const val RECORD_INPUT_HELP = "record_input_help"
52+
private const val RECORD_COMPLETE = "record_complete"
53+
private const val RECORD_DETAIL = "record_detail"
54+
private const val ERROR_RECORD_SAVE = "error_record_save"
55+
}
56+
4657
@Composable
4758
override fun present(): RecordRegisterUiState {
4859
val scope = rememberCoroutineScope()
@@ -118,6 +129,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
118129
emotionTags = emotionTags,
119130
review = impression,
120131
).onSuccess { result ->
132+
analyticsHelper.logEvent(RECORD_COMPLETE)
121133
savedRecordId = result.id
122134
isRecordSavedDialogVisible = true
123135
}.onFailure { exception ->
@@ -126,6 +138,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
126138
exception = exception,
127139
)
128140

141+
analyticsHelper.logEvent(ERROR_RECORD_SAVE)
129142
val handleErrorMessage = { message: String ->
130143
Logger.e(message)
131144
sideEffect = RecordRegisterSideEffect.ShowToast(message)
@@ -184,6 +197,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
184197
}
185198

186199
is RecordRegisterUiEvent.OnImpressionGuideButtonClick -> {
200+
analyticsHelper.logScreenView(RECORD_INPUT_HELP)
187201
beforeSelectedImpressionGuide = selectedImpressionGuide
188202
if (impressionState.text.isEmpty()) {
189203
selectedImpressionGuide = ""
@@ -247,6 +261,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
247261
}
248262

249263
is RecordRegisterUiEvent.OnRecordSavedDialogConfirm -> {
264+
analyticsHelper.logScreenView(RECORD_DETAIL)
250265
isRecordSavedDialogVisible = false
251266
navigator.pop()
252267
navigator.goTo(RecordDetailScreen(event.recordId))
@@ -261,8 +276,13 @@ class RecordRegisterPresenter @AssistedInject constructor(
261276
}
262277
}
263278

264-
ImpressionEffect {
265-
analyticsHelper.logScreenView(screen.name)
279+
ImpressionEffect(currentStep) {
280+
val screenName = when (currentStep) {
281+
RecordStep.QUOTE -> RECORD_INPUT_SENTENCE
282+
RecordStep.EMOTION -> RECORD_SELECT_EMOTION
283+
RecordStep.IMPRESSION -> RECORD_INPUT_OPINION
284+
}
285+
analyticsHelper.logScreenView(screenName)
266286
}
267287

268288
return RecordRegisterUiState(
@@ -294,8 +314,4 @@ class RecordRegisterPresenter @AssistedInject constructor(
294314
navigator: Navigator,
295315
): RecordRegisterPresenter
296316
}
297-
298-
companion object {
299-
const val MAX_PAGE = 4032
300-
}
301317
}

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchPresenter.kt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.ninecraft.booket.feature.search.book
33
import androidx.compose.foundation.text.input.clearText
44
import androidx.compose.foundation.text.input.rememberTextFieldState
55
import androidx.compose.runtime.Composable
6+
import androidx.compose.runtime.LaunchedEffect
67
import androidx.compose.runtime.getValue
78
import androidx.compose.runtime.mutableIntStateOf
89
import androidx.compose.runtime.mutableStateOf
@@ -27,7 +28,6 @@ import com.slack.circuit.retained.collectAsRetainedState
2728
import com.slack.circuit.retained.rememberRetained
2829
import com.slack.circuit.runtime.Navigator
2930
import com.slack.circuit.runtime.presenter.Presenter
30-
import com.slack.circuitx.effects.ImpressionEffect
3131
import dagger.assisted.Assisted
3232
import dagger.assisted.AssistedFactory
3333
import dagger.assisted.AssistedInject
@@ -44,6 +44,13 @@ class BookSearchPresenter @AssistedInject constructor(
4444
) : Presenter<BookSearchUiState> {
4545
companion object {
4646
private const val START_INDEX = 1
47+
private const val SEARCH_BOOK_INPUT = "search_book_input"
48+
private const val SEARCH_BOOK_RESULT = "search_book_result"
49+
private const val SEARCH_BOOK_NO_RESULT = "search_book_noresult"
50+
private const val ERROR_SEARCH_LOADING = "error_search_loading"
51+
private const val REGISTER_BOOK_OPTION = "register_book_option"
52+
private const val REGISTER_BOOK_COMPLETE = "register_book_complete"
53+
private const val ERROR_REGISTER_BOOK = "error_register_book"
4754
}
4855

4956
@Composable
@@ -89,9 +96,12 @@ class BookSearchPresenter @AssistedInject constructor(
8996
} else {
9097
footerState = if (isLastPage) FooterState.End else FooterState.Idle
9198
}
99+
100+
analyticsHelper.logEvent(SEARCH_BOOK_RESULT)
92101
}
93102
.onFailure { exception ->
94103
Logger.d(exception)
104+
analyticsHelper.logEvent(ERROR_SEARCH_LOADING)
95105
val errorMessage = exception.message ?: "알 수 없는 오류가 발생했습니다."
96106
if (startIndex == START_INDEX) {
97107
uiState = UiState.Error(exception)
@@ -113,6 +123,7 @@ class BookSearchPresenter @AssistedInject constructor(
113123
} else book
114124
}.toPersistentList()
115125

126+
analyticsHelper.logEvent(REGISTER_BOOK_COMPLETE)
116127
selectedBookIsbn = ""
117128
selectedBookStatus = null
118129
isBookRegisterBottomSheetVisible = false
@@ -124,6 +135,7 @@ class BookSearchPresenter @AssistedInject constructor(
124135
exception = exception,
125136
)
126137

138+
analyticsHelper.logEvent(ERROR_REGISTER_BOOK)
127139
val handleErrorMessage = { message: String ->
128140
Logger.e(message)
129141
sideEffect = BookSearchSideEffect.ShowToast(message)
@@ -163,6 +175,7 @@ class BookSearchPresenter @AssistedInject constructor(
163175
is BookSearchUiEvent.OnSearchClick -> {
164176
val query = event.query.trim()
165177
if (query.isNotEmpty()) {
178+
analyticsHelper.logEvent(SEARCH_BOOK_INPUT)
166179
searchBooks(query = query, startIndex = START_INDEX)
167180
}
168181
}
@@ -202,6 +215,7 @@ class BookSearchPresenter @AssistedInject constructor(
202215
}
203216

204217
is BookSearchUiEvent.OnBookStatusSelect -> {
218+
analyticsHelper.logEvent(REGISTER_BOOK_OPTION)
205219
selectedBookStatus = event.bookStatus
206220
}
207221

@@ -226,8 +240,10 @@ class BookSearchPresenter @AssistedInject constructor(
226240
}
227241
}
228242

229-
ImpressionEffect {
230-
analyticsHelper.logScreenView(SearchScreen.name)
243+
LaunchedEffect(recentSearches, uiState) {
244+
if (recentSearches.isEmpty() && uiState is UiState.Idle) {
245+
analyticsHelper.logEvent(SEARCH_BOOK_NO_RESULT)
246+
}
231247
}
232248

233249
return BookSearchUiState(

feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ class SettingsPresenter @AssistedInject constructor(
3131
private val analyticsHelper: AnalyticsHelper,
3232
) : Presenter<SettingsUiState> {
3333

34+
companion object {
35+
private const val SETTINGS_LOGOUT_COMPLETE = "settings_logout_complete"
36+
private const val SETTINGS_WITHDRAWAL_COMPLETE = "settings_withdrawal_warning"
37+
private const val SETTINGS_WITHDRAWAL_WARNING = "settings_withdrawal_warning"
38+
}
39+
3440
@Composable
3541
override fun present(): SettingsUiState {
3642
val scope = rememberCoroutineScope()
@@ -65,6 +71,7 @@ class SettingsPresenter @AssistedInject constructor(
6571
}
6672

6773
is SettingsUiEvent.OnWithdrawClick -> {
74+
analyticsHelper.logEvent(SETTINGS_WITHDRAWAL_WARNING)
6875
isWithdrawBottomSheetVisible = true
6976
}
7077

@@ -84,6 +91,7 @@ class SettingsPresenter @AssistedInject constructor(
8491
isLoading = true
8592
authRepository.logout()
8693
.onSuccess {
94+
analyticsHelper.logEvent(SETTINGS_LOGOUT_COMPLETE)
8795
navigator.resetRoot(LoginScreen)
8896
}
8997
.onFailure { exception ->
@@ -113,6 +121,7 @@ class SettingsPresenter @AssistedInject constructor(
113121
isLoading = true
114122
authRepository.withdraw()
115123
.onSuccess {
124+
analyticsHelper.logEvent(SETTINGS_WITHDRAWAL_COMPLETE)
116125
navigator.resetRoot(LoginScreen)
117126
}
118127
.onFailure { exception ->

0 commit comments

Comments
 (0)