Skip to content

Commit 8161faa

Browse files
authored
[FEAT/#1629] SP3 마이페이지, 솝트로그 앰플리튜드 추가 (#1632)
* [FEAT/#1629] mypage dependency * [FEAT/#1629] soptlog dependency * [FEAT/#1629] soptlog amplitude 추가 * [FEAT/#1629] soptlog amplitude eventtype * [FEAT/#1629] mypage amplitude eventtype * [FEAT/#1629] mypage amplitude 추가 * [FEAT/#1629] navigator intent * [MOD/#1623] 오타 및 패키징 수정
1 parent 0d0f13b commit 8161faa

13 files changed

Lines changed: 140 additions & 17 deletions

File tree

app/src/main/java/org/sopt/official/feature/navigator/NavigatorProviderIntent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ class NavigatorProviderIntent @Inject constructor(
5252
notificationId
5353
)
5454

55-
override fun getAdjustSentenceActivityIntent(): Intent = AdjustSentenceActivity.getIntent(
56-
context
55+
override fun getAdjustSentenceActivityIntent(userStatus: UserStatus): Intent = AdjustSentenceActivity.getIntent(
56+
context,
57+
AdjustSentenceActivity.StartArgs(userStatus = userStatus.name),
5758
)
5859

5960
override fun getPokeActivityIntent(userStatus: UserStatus): Intent {

core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ enum class DeepLinkType(
6363
},
6464
MY_PAGE_SOPTAMP("mypage/soptamp") {
6565
override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) =
66-
userStatus.setIntent(navigator.getAdjustSentenceActivityIntent())
66+
userStatus.setIntent(navigator.getAdjustSentenceActivityIntent(userStatus))
6767
},
6868
ATTENDANCE("home/attendance") {
6969
override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) =

core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ interface NavigatorProvider {
3434
fun getAuthActivityIntent(): Intent
3535
fun getNotificationActivityIntent(): Intent
3636
fun getNotificationDetailActivityIntent(notificationId: String): Intent
37-
fun getAdjustSentenceActivityIntent(): Intent
37+
fun getAdjustSentenceActivityIntent(userStatus: UserStatus): Intent
3838
fun getAttendanceActivityIntent(): Intent
3939
fun getSoptampActivityIntent(): Intent
4040
fun getAppjamtampActivityIntent(): Intent

feature/main/src/main/java/org/sopt/official/feature/main/MainScreen.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ fun MainScreen(
356356
)
357357

358358
myPageNavGraph(
359+
userStatus = userStatus,
359360
navigateToSoptLog = {
360361
navigator.navController.navigate(SoptLog)
361362
},
@@ -370,6 +371,7 @@ fun MainScreen(
370371
}
371372
) {
372373
soptLogNavGraph(
374+
userStatus = userStatus,
373375
soptLogNavigation = object : SoptLogNavigation {
374376
override fun navigateToDeepLink(url: String) {
375377
if (userStatus == UserStatus.UNAUTHENTICATED) isOpenDialog = true

feature/mypage/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ dependencies {
4646
implementation(projects.core.model)
4747
implementation(projects.core.navigation)
4848
implementation(projects.core.webview)
49+
implementation(projects.core.analytics)
4950

5051
implementation(platform(libs.firebase))
5152
implementation(libs.bundles.firebase)

feature/mypage/src/main/java/org/sopt/official/feature/mypage/MyPageScreen.kt

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ package org.sopt.official.feature.mypage
2727
import android.content.Intent
2828
import android.provider.Settings
2929
import androidx.compose.foundation.background
30-
import org.sopt.official.webview.view.WebViewActivity
3130
import androidx.compose.foundation.layout.Column
3231
import androidx.compose.foundation.layout.Spacer
3332
import androidx.compose.foundation.layout.fillMaxSize
@@ -50,6 +49,9 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
5049
import androidx.lifecycle.compose.collectAsStateWithLifecycle
5150
import kotlinx.collections.immutable.ImmutableList
5251
import kotlinx.collections.immutable.persistentListOf
52+
import org.sopt.official.analytics.Tracker
53+
import org.sopt.official.analytics.compose.LocalTracker
54+
import org.sopt.official.analytics.trackViewType
5355
import org.sopt.official.designsystem.SoptTheme
5456
import org.sopt.official.feature.mypage.component.MyPageDialog
5557
import org.sopt.official.feature.mypage.component.MyPageNavigatorButton
@@ -63,16 +65,21 @@ import org.sopt.official.feature.mypage.signout.SignOutActivity
6365
import org.sopt.official.feature.mypage.soptamp.ui.AdjustSentenceActivity
6466
import org.sopt.official.feature.mypage.web.WebUrlConstant
6567
import org.sopt.official.model.UserStatus
68+
import org.sopt.official.model.toViewType
69+
import org.sopt.official.webview.view.WebViewActivity
6670

6771
@Composable
6872
internal fun MyPageRoute(
6973
navigateToSoptLog: () -> Unit,
7074
navigateToPlayGroundProfile: () -> Unit,
7175
onRestartApp: () -> Unit,
76+
userStatus: UserStatus,
7277
viewModel: MyPageViewModel = hiltViewModel(),
7378
) {
7479
val context = LocalContext.current
80+
val tracker = LocalTracker.current
7581
val urlHandler = LocalUriHandler.current
82+
val viewType = userStatus.toViewType()
7683
val state by viewModel.state.collectAsStateWithLifecycle()
7784
val isAppjamMode by viewModel.isAppjamMode.collectAsStateWithLifecycle()
7885

@@ -84,6 +91,10 @@ internal fun MyPageRoute(
8491
}
8592
}
8693

94+
LaunchedEffect(Unit) {
95+
tracker.trackViewType(MypageAnalyticsEvent.VIEW_MYPAGE_MAIN, viewType)
96+
}
97+
8798
val serviceSectionItems = remember {
8899
persistentListOf(
89100
MyPageUiModel.Header(title = "서비스 이용 방침"),
@@ -107,7 +118,10 @@ internal fun MyPageRoute(
107118
),
108119
MyPageUiModel.MyPageItem(
109120
title = "의견 보내기",
110-
onItemClick = { urlHandler.openUri(WebUrlConstant.OPINION_KAKAO_CHAT) }
121+
onItemClick = {
122+
urlHandler.openUri(WebUrlConstant.OPINION_KAKAO_CHAT)
123+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_FEEDBACK, viewType)
124+
}
111125
)
112126
)
113127
}
@@ -123,6 +137,7 @@ internal fun MyPageRoute(
123137
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
124138
}
125139
context.startActivity(intent)
140+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_NOTIFICATION, viewType)
126141
}
127142
)
128143
)
@@ -133,11 +148,22 @@ internal fun MyPageRoute(
133148
MyPageUiModel.Header(title = "솝탬프 설정"),
134149
MyPageUiModel.MyPageItem(
135150
title = "한 마디 편집",
136-
onItemClick = { context.startActivity(AdjustSentenceActivity.getIntent(context)) }
151+
onItemClick = {
152+
context.startActivity(
153+
AdjustSentenceActivity.getIntent(
154+
context,
155+
AdjustSentenceActivity.StartArgs(userStatus = userStatus.name),
156+
)
157+
)
158+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_EDIT_STATUSMESSAGE, viewType)
159+
}
137160
),
138161
MyPageUiModel.MyPageItem(
139162
title = "스탬프 초기화",
140-
onItemClick = { viewModel.onAction(MyPageAction.ClearSoptamp) }
163+
onItemClick = {
164+
viewModel.onAction(MyPageAction.ClearSoptamp)
165+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_RESET_STAMP, viewType)
166+
}
141167
)
142168
)
143169
}
@@ -147,11 +173,16 @@ internal fun MyPageRoute(
147173
MyPageUiModel.Header(title = "기타"),
148174
MyPageUiModel.MyPageItem(
149175
title = "로그아웃",
150-
onItemClick = { viewModel.onAction(MyPageAction.RequestLogout) }
176+
onItemClick = {
177+
viewModel.onAction(MyPageAction.RequestLogout)
178+
}
151179
),
152180
MyPageUiModel.MyPageItem(
153181
title = "탈퇴하기",
154-
onItemClick = { context.startActivity(SignOutActivity.getIntent(context)) }
182+
onItemClick = {
183+
context.startActivity(SignOutActivity.getIntent(context))
184+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_QUIT, viewType)
185+
}
155186
)
156187
)
157188
}
@@ -177,6 +208,8 @@ internal fun MyPageRoute(
177208
onAction = viewModel::onAction,
178209
navigateToSoptLog = navigateToSoptLog,
179210
navigateToPlayGroundProfile = navigateToPlayGroundProfile,
211+
tracker = tracker,
212+
viewType = viewType
180213
)
181214
}
182215

@@ -192,6 +225,8 @@ internal fun MyPageScreen(
192225
onAction: (MyPageAction) -> Unit,
193226
navigateToSoptLog: () -> Unit,
194227
navigateToPlayGroundProfile: () -> Unit,
228+
tracker:Tracker,
229+
viewType:String
195230
) {
196231
val scrollState = rememberScrollState()
197232

@@ -227,7 +262,10 @@ internal fun MyPageScreen(
227262
text = "프로필 수정",
228263
modifier = Modifier
229264
.padding(horizontal = 20.dp),
230-
onClick = navigateToPlayGroundProfile
265+
onClick = {
266+
navigateToPlayGroundProfile()
267+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_PROFILE_EDIT_BUTTON, viewType )
268+
}
231269
)
232270

233271
Spacer(modifier = Modifier.height(12.dp))
@@ -248,7 +286,10 @@ internal fun MyPageScreen(
248286
shape = RoundedCornerShape(999.dp),
249287
modifier = Modifier
250288
.padding(horizontal = 20.dp),
251-
onClick = navigateToSoptLog
289+
onClick = {
290+
navigateToSoptLog()
291+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_SOPTLOG, viewType )
292+
}
252293
)
253294

254295
Spacer(modifier = Modifier.height(12.dp))
@@ -283,7 +324,10 @@ internal fun MyPageScreen(
283324
dialogState = state.dialogState,
284325
onDismissRequest = { onAction(MyPageAction.CloseDialog) },
285326
onClearSoptampClick = { onAction(MyPageAction.ResetSoptamp) },
286-
onLogoutClick = { onAction(MyPageAction.ConfirmLogout) },
327+
onLogoutClick = {
328+
onAction(MyPageAction.ConfirmLogout)
329+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_DONE_LOGOUT, viewType)
330+
},
287331
)
288332
}
289333
}
@@ -327,6 +371,8 @@ private fun ShowMyPageDialog(
327371
@Composable
328372
private fun MyPageScreenPreview() {
329373
SoptTheme {
374+
val track = LocalTracker.current
375+
330376
MyPageScreen(
331377
state = MyPageState(
332378
userStatus = UserStatus.ACTIVE,
@@ -360,6 +406,8 @@ private fun MyPageScreenPreview() {
360406
onAction = {},
361407
navigateToSoptLog = {},
362408
navigateToPlayGroundProfile = {},
409+
tracker = track,
410+
viewType = "",
363411
)
364412
}
365-
}
413+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.sopt.official.feature.mypage
2+
3+
import org.sopt.official.analytics.AnalyticsEvent
4+
import org.sopt.official.analytics.EventType
5+
6+
enum class MypageAnalyticsEvent(
7+
override val type : EventType,
8+
override val eventName : String
9+
):AnalyticsEvent {
10+
VIEW_MYPAGE_MAIN(EventType.VIEW,"mypage_main"),
11+
CLICK_PROFILE_EDIT_BUTTON(EventType.CLICK,"profile_edit_button"),
12+
CLICK_MYPAGE_SOPTLOG(EventType.CLICK,"mypage_soptlog"),
13+
CLICK_MYPAGE_FEEDBACK(EventType.CLICK,"mypage_feedback"),
14+
CLICK_MYPAGE_NOTIFICATION(EventType.CLICK,"mypage_notification"),
15+
CLICK_MYPAGE_EDIT_STATUSMESSAGE(EventType.CLICK,"mypage_edit_statusmessage"),
16+
CLICK_DONE_EDIT_STATUSMESSAGE(EventType.CLICK,"done_edit_statusmessage"),
17+
CLICK_MYPAGE_RESET_STAMP(EventType.CLICK,"mypage_reset_stamp"),
18+
CLICK_DONE_LOGOUT(EventType.CLICK,"done_logout"),
19+
CLICK_MYPAGE_QUIT(EventType.CLICK,"mypage_quit"),
20+
}

feature/mypage/src/main/java/org/sopt/official/feature/mypage/navigation/MyPageNavigator.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import kotlinx.serialization.Serializable
3333
import org.sopt.official.core.navigation.MainTabRoute
3434
import org.sopt.official.core.navigation.Route
3535
import org.sopt.official.feature.mypage.MyPageRoute
36+
import org.sopt.official.model.UserStatus
3637

3738
@Serializable
3839
data object MyPageGraph : MainTabRoute
@@ -45,6 +46,7 @@ fun NavController.navigateToMyPage(navOptions: NavOptions? = null) {
4546
}
4647

4748
fun NavGraphBuilder.myPageNavGraph(
49+
userStatus: UserStatus,
4850
navigateToSoptLog: () -> Unit,
4951
navigateToAuthActivity: () -> Unit,
5052
navigateToPlayGroundProfile: () -> Unit,
@@ -56,6 +58,7 @@ fun NavGraphBuilder.myPageNavGraph(
5658
navigateToSoptLog = navigateToSoptLog,
5759
navigateToPlayGroundProfile = navigateToPlayGroundProfile,
5860
onRestartApp = navigateToAuthActivity,
61+
userStatus = userStatus
5962
)
6063
}
6164
builder()

feature/mypage/src/main/java/org/sopt/official/feature/mypage/soptamp/ui/AdjustSentenceActivity.kt

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,38 @@ import androidx.compose.ui.platform.LocalContext
4343
import androidx.compose.ui.res.stringResource
4444
import androidx.compose.ui.unit.dp
4545
import dagger.hilt.android.AndroidEntryPoint
46+
import java.io.Serializable
47+
import org.sopt.official.analytics.compose.LocalTracker
48+
import org.sopt.official.analytics.trackViewType
49+
import org.sopt.official.common.util.serializableExtra
4650
import org.sopt.official.common.view.toast
4751
import org.sopt.official.designsystem.SoptTheme
52+
import org.sopt.official.feature.mypage.MypageAnalyticsEvent
4853
import org.sopt.official.feature.mypage.R
4954
import org.sopt.official.feature.mypage.component.MyPageButton
5055
import org.sopt.official.feature.mypage.component.MyPageTextField
5156
import org.sopt.official.feature.mypage.component.MyPageTopBar
5257
import org.sopt.official.feature.mypage.di.userRepository
5358
import org.sopt.official.feature.mypage.soptamp.state.rememberModifyProfileState
59+
import org.sopt.official.model.UserStatus
60+
import org.sopt.official.model.toViewType
5461

5562
@AndroidEntryPoint
5663
class AdjustSentenceActivity : AppCompatActivity() {
5764

65+
private val args by serializableExtra(StartArgs(UserStatus.UNAUTHENTICATED.name))
66+
5867
override fun onCreate(savedInstanceState: Bundle?) {
5968
super.onCreate(savedInstanceState)
69+
70+
val userStatus = args?.userStatus?.let { UserStatus.of(it) } ?: UserStatus.UNAUTHENTICATED
71+
6072
setContent {
6173
SoptTheme {
6274
val context = LocalContext.current
75+
val tracker = LocalTracker.current
76+
val viewType = userStatus.toViewType()
77+
6378
val uiState = rememberModifyProfileState(
6479
userRepository = userRepository,
6580
onShowToast = { context.toast(it) }
@@ -94,7 +109,10 @@ class AdjustSentenceActivity : AppCompatActivity() {
94109
modifier = Modifier
95110
.padding(20.dp)
96111
.fillMaxWidth(),
97-
onClick = uiState.onUpdate,
112+
onClick = {
113+
uiState.onUpdate()
114+
tracker.trackViewType(MypageAnalyticsEvent.CLICK_DONE_EDIT_STATUSMESSAGE, viewType)
115+
},
98116
isEnabled = uiState.isConfirmed
99117
) {
100118
Text(
@@ -108,8 +126,14 @@ class AdjustSentenceActivity : AppCompatActivity() {
108126
}
109127
}
110128

129+
data class StartArgs(
130+
val userStatus: String,
131+
) : Serializable
132+
111133
companion object {
112134
@JvmStatic
113-
fun getIntent(context: Context) = Intent(context, AdjustSentenceActivity::class.java)
135+
fun getIntent(context: Context, args: StartArgs) = Intent(context, AdjustSentenceActivity::class.java).apply {
136+
putExtra("args", args)
137+
}
114138
}
115-
}
139+
}

feature/soptlog/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ dependencies {
4545
implementation(projects.core.localstorage)
4646
implementation(projects.core.navigation)
4747
implementation(projects.core.analytics)
48+
implementation(projects.core.model)
4849

4950
// domain
5051
implementation(projects.domain.appjamtamp)

0 commit comments

Comments
 (0)