Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -13,6 +13,8 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.eatssu.android.R
import com.eatssu.android.analytics.LocalAnalyticsTracker
import com.eatssu.common.analytics.ChangeLanguageEvent
import com.eatssu.common.enums.AppLanguage
import com.eatssu.design_system.component.EatSsuRadioCheckBoxGroup
import com.eatssu.design_system.component.EatSsuTopBar
Expand All @@ -25,11 +27,22 @@ fun LanguageSelectorScreen(
onBack: () -> Unit = {}
) {
val selectedLanguage by viewModel.selectedLanguage.collectAsStateWithLifecycle()
val analyticsTracker = LocalAnalyticsTracker.current

LanguageSelectorContent(
modifier = modifier,
selectedLanguage = selectedLanguage,
onLanguageSelected = { viewModel.selectLanguage(it) },
onLanguageSelected = { language ->
if (selectedLanguage != language) {
analyticsTracker.track(
ChangeLanguageEvent(
lang_from = selectedLanguage.code,
lang_to = language.code,
),
)
}
viewModel.selectLanguage(language)
},
Comment on lines +35 to +45
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To avoid redundant network calls and unnecessary Activity recreations (triggered by AppCompatDelegate.setApplicationLocales), the call to viewModel.selectLanguage(language) should be moved inside the if (selectedLanguage != language) block. This ensures that processing only occurs when a different language is actually selected.

Suggested change
onLanguageSelected = { language ->
if (selectedLanguage != language) {
analyticsTracker.track(
ChangeLanguageEvent(
lang_from = selectedLanguage.code,
lang_to = language.code,
),
)
}
viewModel.selectLanguage(language)
},
onLanguageSelected = { language ->
if (selectedLanguage != language) {
analyticsTracker.track(
ChangeLanguageEvent(
languageBefore = selectedLanguage.code,
languageAfter = language.code,
),
)
viewModel.selectLanguage(language)
}
},

onBack = onBack
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.eatssu.android.analytics

import com.eatssu.common.analytics.AnalyticsIdentity
import com.eatssu.common.analytics.AppAnalyticsEvent
import com.eatssu.common.analytics.ChangeLanguageEvent
import com.eatssu.common.analytics.PopupEvent
import com.eatssu.common.analytics.WidgetAnalyticsEvent
import com.eatssu.common.enums.LaunchPath
Expand All @@ -26,6 +27,23 @@ class PostHogAnalyticsTrackerTest {
)
}

@Test
fun `change language payload keeps previous and next locale codes`() {
val payload = ChangeLanguageEvent(
lang_from = "ko",
lang_to = "en",
).toPayload()

assertEquals("change_language", payload.eventName)
assertEquals(
mapOf(
"lang_from" to "ko",
"lang_to" to "en",
),
payload.properties,
)
}
Comment on lines +31 to +45
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Updating the test case to reflect the suggested naming improvements in ChangeLanguageEvent for consistency and adherence to Kotlin naming conventions.

Suggested change
fun `change language payload keeps previous and next locale codes`() {
val payload = ChangeLanguageEvent(
lang_from = "ko",
lang_to = "en",
).toPayload()
assertEquals("change_language", payload.eventName)
assertEquals(
mapOf(
"lang_from" to "ko",
"lang_to" to "en",
),
payload.properties,
)
}
@Test
fun `change language payload keeps previous and next locale codes`() {
val payload = ChangeLanguageEvent(
languageBefore = "ko",
languageAfter = "en",
).toPayload()
assertEquals("change_language", payload.eventName)
assertEquals(
mapOf(
"language_before" to "ko",
"language_after" to "en",
),
payload.properties,
)
}


@Test
fun `popup event payload keeps popup name and action`() {
val payload = PopupEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,16 @@ data class PopupEvent(
}
}


data class ChangeLanguageEvent(
val lang_from: String,
val lang_to: String,
) : AppAnalyticsEvent {
override val eventName = "change_language"
override val properties = buildMap {
put("lang_from", lang_from)
put("lang_to", lang_to)
}
}
Comment on lines +254 to +263
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Kotlin property names should follow the camelCase convention (e.g., languageBefore instead of lang_from). Additionally, for consistency with other transition-based events in this repository (like WidgetAnalyticsEvent.Changed), it is recommended to use language_before and language_after as the property keys in the analytics payload.

Suggested change
data class ChangeLanguageEvent(
val lang_from: String,
val lang_to: String,
) : AppAnalyticsEvent {
override val eventName = "change_language"
override val properties = buildMap {
put("lang_from", lang_from)
put("lang_to", lang_to)
}
}
data class ChangeLanguageEvent(
val languageBefore: String,
val languageAfter: String,
) : AppAnalyticsEvent {
override val eventName = "change_language"
override val properties = buildMap {
put("language_before", languageBefore)
put("language_after", languageAfter)
}
}


private fun String.toWeekdayCode() = when (this) {
"SUNDAY" -> "sun"
Expand Down
Loading