From 551b2f95b7255680c8f7a06a928fe6624c5a1ba8 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 11:40:04 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[chore]=20#147=20=EC=95=B0=ED=94=8C?= =?UTF-8?q?=EB=A6=AC=ED=8A=9C=EB=93=9C=20=EB=94=94=ED=8E=9C=EB=8D=98?= =?UTF-8?q?=EC=8B=9C=20=EC=B6=94=EA=B0=80,=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EB=B6=80=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 1 + app/src/main/res/layout/item_wineyfeed_post.xml | 1 + app/src/main/res/values/strings.xml | 2 +- buildSrc/src/main/java/Dependencies.kt | 4 +--- buildSrc/src/main/java/Versions.kt | 3 +-- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 47cddbf0..239e1a61 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -122,6 +122,7 @@ dependencies { implementation(lottie) implementation(circleImageView) implementation(kakaoLogin) + implementation(amplitude) debugImplementation(flipper) debugImplementation(flipperNetwork) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7bd01259..c28c03ba 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + 위니와 절약을 더 쉽고 재밌게! 절약한 소비를 피드에 올리고\n사람들과 소통해요 부자가 되고싶어 - 교통비를 아끼기 위해 대중교통 대신\n걸어서 출퇴근을 했습니다 + 교통비를 아끼기 위해 대중교통 대신 원 절약 신고하기 삭제하기 diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 9a8f8e13..e0f1e1b2 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -53,21 +53,18 @@ object KaptDependencies { object ThirdPartyDependencies { const val coil = "io.coil-kt:coil:${Versions.coilVersion}" - const val okHttpBom = "com.squareup.okhttp3:okhttp-bom:${Versions.okHttpVersion}" const val okHttp = "com.squareup.okhttp3:okhttp" const val okHttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor" const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofitVersion}" const val retrofitJsonConverter = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:${Versions.kotlinSerializationConverterVersion}" - const val timber = "com.jakewharton.timber:timber:${Versions.timberVersion}" const val ossLicense = "com.google.android.gms:play-services-oss-licenses:${Versions.ossVersion}" const val progressView = "com.github.skydoves:progressview:${Versions.progressViewVersion}" const val balloon = "com.github.skydoves:balloon:${Versions.balloonVersion}" const val lottie = "com.airbnb.android:lottie:${Versions.lottieVersion}" - const val flipper = "com.facebook.flipper:flipper:${Versions.flipperVersion}" const val flipperNetwork = "com.facebook.flipper:flipper-network-plugin:${Versions.flipperVersion}" @@ -78,6 +75,7 @@ object ThirdPartyDependencies { const val soloader = "com.facebook.soloader:soloader:${Versions.soloaderVersion}" const val circleImageView = "de.hdodenhof:circleimageview:${Versions.circleImageViewVersion}" const val kakaoLogin = "com.kakao.sdk:v2-user:${Versions.kakaoLoginVersion}" + const val amplitude = "com.amplitude:android-sdk:${Versions.amplitudeVersion}" } object FirebaseDependencies { diff --git a/buildSrc/src/main/java/Versions.kt b/buildSrc/src/main/java/Versions.kt index ce0113c1..b79a6f00 100644 --- a/buildSrc/src/main/java/Versions.kt +++ b/buildSrc/src/main/java/Versions.kt @@ -36,13 +36,12 @@ object Versions { const val progressViewVersion = "1.1.3" const val balloonVersion = "1.4.5" const val lottieVersion = "6.0.0" - const val flipperVersion = "0.193.0" const val soloaderVersion = "0.10.5" const val leakCanaryVersion = "2.11" - const val circleImageViewVersion = "3.1.0" const val kakaoLoginVersion = "2.10.0" + const val amplitudeVersion = "2.34.0" val javaVersion = JavaVersion.VERSION_17 const val jvmVersion = "17" From 9a11ea7bc96bb644d6ae71855ff064898012aeaf Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 11:53:12 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[chore]=20#147=20=EC=95=B0=ED=94=8C?= =?UTF-8?q?=EB=A6=AC=ED=8A=9C=EB=93=9C=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EC=96=B8=ED=8A=B8=20=EA=B0=9D=EC=B2=B4=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 5 +++ .../go/sopt/winey/di/AmplitudeModule.kt | 26 ++++++++++++++ .../winey/util/amplitude/AmplitudeUtils.kt | 36 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 app/src/main/java/com/android/go/sopt/winey/di/AmplitudeModule.kt create mode 100644 app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 239e1a61..bb5636eb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -31,6 +31,11 @@ android { "KAKAO_NATIVE_KEY", gradleLocalProperties(rootDir).getProperty("kakao.native.key") ) + buildConfigField( + "String", + "AMPLITUDE_API_KEY", + gradleLocalProperties(rootDir).getProperty("amplitude.api.key") + ) manifestPlaceholders["KAKAO_NATIVE_KEY"] = gradleLocalProperties(rootDir).getProperty("kakaoNativeKey") diff --git a/app/src/main/java/com/android/go/sopt/winey/di/AmplitudeModule.kt b/app/src/main/java/com/android/go/sopt/winey/di/AmplitudeModule.kt new file mode 100644 index 00000000..7b4ac873 --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/di/AmplitudeModule.kt @@ -0,0 +1,26 @@ +package com.android.go.sopt.winey.di + +import android.app.Application +import android.content.Context +import com.amplitude.api.Amplitude +import com.amplitude.api.AmplitudeClient +import com.android.go.sopt.winey.BuildConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AmplitudeModule { + @Provides + @Singleton + fun provideAmplitudeClient( + @ApplicationContext context: Context, + application: Application + ): AmplitudeClient = Amplitude.getInstance() + .initialize(context, BuildConfig.AMPLITUDE_API_KEY) + .enableForegroundTracking(application) +} diff --git a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt new file mode 100644 index 00000000..7ae5bdab --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt @@ -0,0 +1,36 @@ +package com.android.go.sopt.winey.util.amplitude + +import com.amplitude.api.AmplitudeClient +import com.amplitude.api.Identify +import org.json.JSONObject +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AmplitudeUtils @Inject constructor( + private val client: AmplitudeClient +) { + init { + setDefaultConfig() + } + + private fun setDefaultConfig() { + client.apply { + trackSessionEvents(true) + setEventUploadPeriodMillis(1000) + } + } + + fun logEvent(eventType: String, properties: JSONObject? = null) { + if (properties == null) { + client.logEvent(eventType) + } else { + client.logEvent(eventType, properties) + } + } + + fun setUserProperties(propertyName: String, values: T) { + val identify = Identify().set(propertyName, values) + client.identify(identify) + } +} From 91239ffc84adb90eb8416c15d568368a0f1fc255 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 13:59:18 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[feat]=20#147=20=EC=95=B1=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EC=9D=B4=EB=93=9C=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=83=9C=EA=B9=85=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/presentation/main/MainActivity.kt | 7 +++++ .../onboarding/guide/GuideActivity.kt | 27 +++++++++++++++++++ .../guide/GuideFragmentStateAdapter.kt | 3 ++- .../presentation/splash/SplashActivity.kt | 5 +--- .../winey/util/amplitude/AmplitudeUtils.kt | 10 ++++--- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index 2777e9b9..7d0fe1bb 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -14,6 +14,7 @@ import com.android.go.sopt.winey.presentation.main.feed.WineyFeedFragment import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.presentation.main.recommend.RecommendFragment import com.android.go.sopt.winey.presentation.onboarding.login.LoginActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.context.snackBar import com.android.go.sopt.winey.util.context.stringOf @@ -22,6 +23,7 @@ import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import javax.inject.Inject @AndroidEntryPoint class MainActivity : BindingActivity(R.layout.activity_main) { @@ -30,9 +32,14 @@ class MainActivity : BindingActivity(R.layout.activity_main private val isDeleteSuccess by lazy { intent.extras?.getBoolean(EXTRA_DELETE_KEY, false) } private val isReportSuccess by lazy { intent.extras?.getBoolean(EXTRA_REPORT_KEY, false) } + @Inject + lateinit var amplitude: AmplitudeUtils + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + amplitude.logEvent("view_mainfeed") + // 위니피드, 마이페이지 프래그먼트에서 getUserState 관찰 mainViewModel.getUser() diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt index f99b1e69..0b684bde 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt @@ -6,14 +6,24 @@ import androidx.viewpager2.widget.ViewPager2 import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.ActivityGuideBinding import com.android.go.sopt.winey.presentation.onboarding.login.LoginActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.context.stringOf +import dagger.hilt.android.AndroidEntryPoint +import org.json.JSONException +import org.json.JSONObject +import javax.inject.Inject +@AndroidEntryPoint class GuideActivity : BindingActivity(R.layout.activity_guide) { private var currentPosition = 0 + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + amplitudeUtils.logEvent("view_onboarding") initViewPagerAdapter() observePageChange() @@ -47,10 +57,27 @@ class GuideActivity : BindingActivity(R.layout.activity_gu navigateToLoginScreen() return@setOnClickListener } + + sendEventToAmplitude() + binding.vpGuide.setCurrentItem(++currentPosition, true) } } + private fun sendEventToAmplitude() { + val eventProperties = JSONObject() + + try { + eventProperties.put("button_name", "onboarding_next_button") + .put("page_number", currentPosition + 1) + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + amplitudeUtils.logEvent("click_button", eventProperties) + } + private fun navigateToLoginScreen() { Intent(this, LoginActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideFragmentStateAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideFragmentStateAdapter.kt index 34a985cf..15c361b5 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideFragmentStateAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideFragmentStateAdapter.kt @@ -5,7 +5,8 @@ import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter class GuideFragmentStateAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) { - private val fragments = listOf(WineyFeedGuideFragment(), RecommendGuideFragment(), LevelGuideFragment()) + private val fragments = + listOf(WineyFeedGuideFragment(), RecommendGuideFragment(), LevelGuideFragment()) override fun getItemCount(): Int = fragments.size diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt index 5fa7542d..e0fa3799 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt @@ -15,7 +15,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -34,8 +33,6 @@ class SplashActivity : BindingActivity(R.layout.activity_ private fun checkAutoLogin() { val accessToken = runBlocking { dataStoreRepository.getAccessToken().firstOrNull() } - Timber.e("ACCESS TOKEN: $accessToken") - if (accessToken.isNullOrBlank()) { navigateTo() } else { @@ -44,7 +41,7 @@ class SplashActivity : BindingActivity(R.layout.activity_ } private inline fun navigateTo() { - Intent(this@SplashActivity, T::class.java).apply { + Intent(this, T::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(this) } diff --git a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt index 7ae5bdab..5e7d7c09 100644 --- a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt +++ b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt @@ -21,11 +21,11 @@ class AmplitudeUtils @Inject constructor( } } - fun logEvent(eventType: String, properties: JSONObject? = null) { - if (properties == null) { + fun logEvent(eventType: String, eventProperties: JSONObject? = null) { + if (eventProperties == null) { client.logEvent(eventType) } else { - client.logEvent(eventType, properties) + client.logEvent(eventType, eventProperties) } } @@ -33,4 +33,8 @@ class AmplitudeUtils @Inject constructor( val identify = Identify().set(propertyName, values) client.identify(identify) } + + fun uploadEvents() { + client.uploadEvents() + } } From f7c8dfcb2a6694c601e622ad9aa1ca4856c67b80 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 14:12:24 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[feat]=20#147=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=ED=99=94=EB=A9=B4=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/guide/GuideActivity.kt | 3 -- .../onboarding/login/LoginActivity.kt | 35 +++++++++++++++++++ .../winey/util/amplitude/AmplitudeUtils.kt | 2 +- .../winey/util/amplitude/type/EventType.kt | 6 ++++ 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt index 0b684bde..e8e85236 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt @@ -59,14 +59,12 @@ class GuideActivity : BindingActivity(R.layout.activity_gu } sendEventToAmplitude() - binding.vpGuide.setCurrentItem(++currentPosition, true) } } private fun sendEventToAmplitude() { val eventProperties = JSONObject() - try { eventProperties.put("button_name", "onboarding_next_button") .put("page_number", currentPosition + 1) @@ -74,7 +72,6 @@ class GuideActivity : BindingActivity(R.layout.activity_gu System.err.println("Invalid JSON") e.printStackTrace() } - amplitudeUtils.logEvent("click_button", eventProperties) } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt index 20273c40..e88c2066 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt @@ -10,20 +10,32 @@ import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.ActivityLoginBinding import com.android.go.sopt.winey.presentation.main.MainActivity import com.android.go.sopt.winey.presentation.onboarding.story.StoryActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils +import com.android.go.sopt.winey.util.amplitude.type.EventType +import com.android.go.sopt.winey.util.amplitude.type.EventType.TYPE_CLICK_BUTTON +import com.android.go.sopt.winey.util.amplitude.type.EventType.TYPE_VIEW_SCREEN import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.context.snackBar import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.json.JSONException +import org.json.JSONObject import timber.log.Timber +import javax.inject.Inject @AndroidEntryPoint class LoginActivity : BindingActivity(R.layout.activity_login) { val viewModel: LoginViewModel by viewModels() + + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + sendEventToAmplitude(TYPE_VIEW_SCREEN) initKakaoLoginButtonClickListener() initLoginObserver() @@ -31,10 +43,33 @@ class LoginActivity : private fun initKakaoLoginButtonClickListener() { binding.btnLoginKakao.setOnClickListener { + sendEventToAmplitude(TYPE_CLICK_BUTTON) viewModel.loginKakao(this) } } + private fun sendEventToAmplitude(type: EventType) { + val eventProperties = JSONObject() + + try { + when (type) { + TYPE_VIEW_SCREEN -> eventProperties.put("screen_name", "sign_up") + TYPE_CLICK_BUTTON -> { + eventProperties.put("button_name", "kakao_signup_button") + .put("page_number", 1) + } + } + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + when (type) { + TYPE_VIEW_SCREEN -> amplitudeUtils.logEvent("view_signup", eventProperties) + TYPE_CLICK_BUTTON -> amplitudeUtils.logEvent("click_button", eventProperties) + } + } + private fun initLoginObserver() { viewModel.loginState.flowWithLifecycle(lifecycle).onEach { state -> when (state) { diff --git a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt index 5e7d7c09..39dfed15 100644 --- a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt +++ b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/AmplitudeUtils.kt @@ -17,7 +17,7 @@ class AmplitudeUtils @Inject constructor( private fun setDefaultConfig() { client.apply { trackSessionEvents(true) - setEventUploadPeriodMillis(1000) + setEventUploadPeriodMillis(100) } } diff --git a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt new file mode 100644 index 00000000..d0084705 --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt @@ -0,0 +1,6 @@ +package com.android.go.sopt.winey.util.amplitude.type + +enum class EventType { + TYPE_VIEW_SCREEN, + TYPE_CLICK_BUTTON +} From 2b988967628432f77020b7f376e52c95b68528d9 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 14:31:26 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[fix]=20#147=20page=5Fnumber=20=EB=8C=80?= =?UTF-8?q?=EC=8B=A0=EC=97=90=20paging=5Fnumber=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/guide/GuideActivity.kt | 10 +++---- .../onboarding/login/LoginActivity.kt | 2 +- .../onboarding/story/StoryActivity.kt | 26 +++++++++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt index e8e85236..cd9dd032 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt @@ -16,7 +16,7 @@ import javax.inject.Inject @AndroidEntryPoint class GuideActivity : BindingActivity(R.layout.activity_guide) { - private var currentPosition = 0 + private var currentPageIndex = 0 @Inject lateinit var amplitudeUtils: AmplitudeUtils @@ -38,7 +38,7 @@ class GuideActivity : BindingActivity(R.layout.activity_gu binding.vpGuide.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) - currentPosition = position + currentPageIndex = position when (position) { LAST_PAGE_INDEX -> @@ -53,13 +53,13 @@ class GuideActivity : BindingActivity(R.layout.activity_gu private fun initNextButtonClickListener() { binding.btnGuideNext.setOnClickListener { - if (currentPosition == LAST_PAGE_INDEX) { + if (currentPageIndex == LAST_PAGE_INDEX) { navigateToLoginScreen() return@setOnClickListener } + binding.vpGuide.setCurrentItem(++currentPageIndex, true) sendEventToAmplitude() - binding.vpGuide.setCurrentItem(++currentPosition, true) } } @@ -67,7 +67,7 @@ class GuideActivity : BindingActivity(R.layout.activity_gu val eventProperties = JSONObject() try { eventProperties.put("button_name", "onboarding_next_button") - .put("page_number", currentPosition + 1) + .put("paging_number", currentPageIndex + 1) } catch (e: JSONException) { System.err.println("Invalid JSON") e.printStackTrace() diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt index e88c2066..7ab8d92f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt @@ -56,7 +56,7 @@ class LoginActivity : TYPE_VIEW_SCREEN -> eventProperties.put("screen_name", "sign_up") TYPE_CLICK_BUTTON -> { eventProperties.put("button_name", "kakao_signup_button") - .put("page_number", 1) + .put("paging_number", 1) } } } catch (e: JSONException) { diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt index 6d96d76a..e7971b0f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt @@ -11,17 +11,27 @@ import androidx.fragment.app.replace import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.ActivityStoryBinding import com.android.go.sopt.winey.presentation.nickname.NicknameActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.context.colorOf import com.android.go.sopt.winey.util.context.stringOf +import dagger.hilt.android.AndroidEntryPoint +import org.json.JSONException +import org.json.JSONObject +import javax.inject.Inject +@AndroidEntryPoint class StoryActivity : BindingActivity(R.layout.activity_story) { private val viewModel by viewModels() private var currentPageNumber = FIRST_PAGE_NUM + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.vm = viewModel + amplitudeUtils.logEvent("view_storytelling") updateStatusBarColor() setUpDefaultNavigationText() @@ -41,11 +51,13 @@ class StoryActivity : BindingActivity(R.layout.activity_st when (supportFragmentManager.findFragmentById(R.id.fcv_story)) { is FirstStoryFragment -> { updateNavigationText(R.string.story_second_detail_text) + sendEventToAmplitude() navigateTo() } is SecondStoryFragment -> { updateNavigationText(R.string.story_third_detail_text) + sendEventToAmplitude() navigateTo() } @@ -61,6 +73,20 @@ class StoryActivity : BindingActivity(R.layout.activity_st } } + private fun sendEventToAmplitude() { + val eventProperties = JSONObject() + + try { + eventProperties.put("button_name", "storytelling_next_button") + .put("paging_number", currentPageNumber) + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + amplitudeUtils.logEvent("click_button", eventProperties) + } + private fun updateStatusBarColor() { window.statusBarColor = colorOf(R.color.gray_50) } From 2b643a1ba6a99341ea0009a0fe30ae6c0a69b942 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 14:36:07 +0900 Subject: [PATCH 06/17] =?UTF-8?q?[feat]=20#147=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=ED=99=94=EB=A9=B4=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/nickname/NicknameActivity.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt index 6ee1348c..a45aece5 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt @@ -12,6 +12,7 @@ import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.ActivityNicknameBinding import com.android.go.sopt.winey.domain.repository.DataStoreRepository import com.android.go.sopt.winey.presentation.main.MainActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.code.ErrorCode import com.android.go.sopt.winey.util.context.hideKeyboard @@ -24,6 +25,8 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.json.JSONException +import org.json.JSONObject import javax.inject.Inject @AndroidEntryPoint @@ -34,8 +37,13 @@ class NicknameActivity : BindingActivity(R.layout.activ @Inject lateinit var dataStoreRepository: DataStoreRepository + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + amplitudeUtils.logEvent("view_set_nickname") + binding.vm = viewModel viewModel.updatePrevScreenName(prevScreenName) @@ -49,6 +57,18 @@ class NicknameActivity : BindingActivity(R.layout.activ initPatchNicknameStateObserver() } + private fun sendEventToAmplitude() { + val eventProperties = JSONObject() + try { + eventProperties.put("button_name", "nickname_next_button") + .put("paging_number", 1) + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + amplitudeUtils.logEvent("click_button", eventProperties) + } + private fun initEditTextWatcher() { var prevText = "" binding.etNickname.addTextChangedListener(object : TextWatcher { @@ -84,6 +104,7 @@ class NicknameActivity : BindingActivity(R.layout.activ // 서버통신 결과 중복되지 않은 닉네임인 경우에만 PATCH 서버통신 진행 if (viewModel.isValidNickname.value) { + sendEventToAmplitude() viewModel.patchNickname() } } From 42ec41a96b983bb1a7315906c9ad5e75ef147441 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 14:38:14 +0900 Subject: [PATCH 07/17] =?UTF-8?q?[feat]=20#147=20=EC=9C=84=EB=8B=88?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EB=B7=B0=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../go/sopt/winey/presentation/main/MainActivity.kt | 7 ------- .../winey/presentation/main/feed/WineyFeedFragment.kt | 9 ++++++++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index 7d0fe1bb..2777e9b9 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -14,7 +14,6 @@ import com.android.go.sopt.winey.presentation.main.feed.WineyFeedFragment import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.presentation.main.recommend.RecommendFragment import com.android.go.sopt.winey.presentation.onboarding.login.LoginActivity -import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.context.snackBar import com.android.go.sopt.winey.util.context.stringOf @@ -23,7 +22,6 @@ import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import javax.inject.Inject @AndroidEntryPoint class MainActivity : BindingActivity(R.layout.activity_main) { @@ -32,14 +30,9 @@ class MainActivity : BindingActivity(R.layout.activity_main private val isDeleteSuccess by lazy { intent.extras?.getBoolean(EXTRA_DELETE_KEY, false) } private val isReportSuccess by lazy { intent.extras?.getBoolean(EXTRA_REPORT_KEY, false) } - @Inject - lateinit var amplitude: AmplitudeUtils - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - amplitude.logEvent("view_mainfeed") - // 위니피드, 마이페이지 프래그먼트에서 getUserState 관찰 mainViewModel.getUser() diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt index 8202712e..da9928a9 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt @@ -28,6 +28,7 @@ import com.android.go.sopt.winey.presentation.main.feed.detail.DetailActivity import com.android.go.sopt.winey.presentation.main.feed.upload.UploadActivity import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.presentation.main.notification.NotificationActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingFragment import com.android.go.sopt.winey.util.fragment.WineyDialogFragment import com.android.go.sopt.winey.util.fragment.snackBar @@ -63,17 +64,23 @@ class WineyFeedFragment : @Inject lateinit var dataStoreRepository: DataStoreRepository + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - removeRecyclerviewItemChangeAnimation() + amplitudeUtils.logEvent("view_homefeed") + binding.vm = mainViewModel mainViewModel.getHasNewNoti() + initAdapter() setSwipeRefreshListener() initFabClickListener() initGetFeedStateObserver() initPostLikeStateObserver() initNotificationButtonClickListener() + removeRecyclerviewItemChangeAnimation() } override fun onStart() { From 2322dd0eee634527063723d54e2818497f2eccaf Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 15:15:17 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[feat]=20#147=20=EC=9C=84=EB=8B=88?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD,=20=EC=A2=8B=EC=95=84=EC=9A=94/=EC=B7=A8=EC=86=8C,=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EB=B2=84=ED=8A=BC=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=83=9C=EA=B9=85=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/feed/WineyFeedAdapter.kt | 4 +- .../main/feed/WineyFeedFragment.kt | 46 +++++++++++++++++-- .../onboarding/login/LoginActivity.kt | 2 + .../winey/util/amplitude/type/EventType.kt | 4 +- .../main/res/layout/item_wineyfeed_post.xml | 2 - 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt index 86f040cb..ac84a537 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt @@ -57,14 +57,16 @@ class WineyFeedAdapter( holder.onBind(getItem(position)) } - fun updateItem(feedId: Int, isLiked: Boolean, likes: Int) { + fun updateItem(feedId: Int, isLiked: Boolean, likes: Int): WineyFeed? { snapshot().items.forEachIndexed { index, wineyFeed -> if (wineyFeed.feedId == feedId) { wineyFeed.isLiked = isLiked wineyFeed.likes = likes.toLong() notifyItemChanged(index) + return wineyFeed } } + return null } companion object { diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt index b095dddb..d026dd7f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt @@ -29,6 +29,9 @@ import com.android.go.sopt.winey.presentation.main.feed.upload.UploadActivity import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.presentation.main.notification.NotificationActivity import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils +import com.android.go.sopt.winey.util.amplitude.type.EventType +import com.android.go.sopt.winey.util.amplitude.type.EventType.TYPE_CLICK_FEED_ITEM +import com.android.go.sopt.winey.util.amplitude.type.EventType.TYPE_CLICK_LIKE import com.android.go.sopt.winey.util.binding.BindingFragment import com.android.go.sopt.winey.util.fragment.WineyDialogFragment import com.android.go.sopt.winey.util.fragment.snackBar @@ -47,6 +50,8 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.json.JSONException +import org.json.JSONObject import timber.log.Timber import javax.inject.Inject @@ -113,7 +118,10 @@ class WineyFeedFragment : onPopupMenuClicked = { anchorView, wineyFeed -> showFeedPopupMenu(anchorView, wineyFeed) }, - toFeedDetail = { wineyFeed -> navigateToDetail(wineyFeed) } + toFeedDetail = { wineyFeed -> + sendEventToAmplitude(TYPE_CLICK_FEED_ITEM, wineyFeed) + navigateToDetail(wineyFeed) + } ) binding.rvWineyfeedPost.adapter = ConcatAdapter( wineyFeedHeaderAdapter, @@ -254,11 +262,13 @@ class WineyFeedFragment : viewModel.postWineyFeedLikeState.flowWithLifecycle(viewLifeCycle).onEach { state -> when (state) { is UiState.Success -> { - wineyFeedAdapter.updateItem( + val item = wineyFeedAdapter.updateItem( state.data.data.feedId, state.data.data.isLiked, state.data.data.likes - ) + ) ?: return@onEach + + sendEventToAmplitude(TYPE_CLICK_LIKE, item) } is UiState.Failure -> { @@ -270,8 +280,38 @@ class WineyFeedFragment : }.launchIn(viewLifeCycleScope) } + private fun sendEventToAmplitude(type: EventType, feed: WineyFeed) { + val eventProperties = JSONObject() + + try { + eventProperties.put("article_id", feed.feedId) + .put("like_count", feed.likes) + .put("comment_count", feed.comments) + + if (type == TYPE_CLICK_LIKE) { + eventProperties.put("from", "feed") + } + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + when (type) { + TYPE_CLICK_FEED_ITEM -> amplitudeUtils.logEvent( + "click_homefeed_contents", + eventProperties + ) + + TYPE_CLICK_LIKE -> + amplitudeUtils.logEvent("click_like", eventProperties) + + else -> {} + } + } + private fun initFabClickListener() { binding.btnWineyfeedFloating.setOnSingleClickListener { + amplitudeUtils.logEvent("click_write_contents") initGetUserStateObserver() } } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt index 7ab8d92f..d3826e7f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/login/LoginActivity.kt @@ -58,6 +58,7 @@ class LoginActivity : eventProperties.put("button_name", "kakao_signup_button") .put("paging_number", 1) } + else -> {} } } catch (e: JSONException) { System.err.println("Invalid JSON") @@ -67,6 +68,7 @@ class LoginActivity : when (type) { TYPE_VIEW_SCREEN -> amplitudeUtils.logEvent("view_signup", eventProperties) TYPE_CLICK_BUTTON -> amplitudeUtils.logEvent("click_button", eventProperties) + else -> {} } } diff --git a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt index d0084705..c2edaa28 100644 --- a/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt +++ b/app/src/main/java/com/android/go/sopt/winey/util/amplitude/type/EventType.kt @@ -2,5 +2,7 @@ package com.android.go.sopt.winey.util.amplitude.type enum class EventType { TYPE_VIEW_SCREEN, - TYPE_CLICK_BUTTON + TYPE_CLICK_BUTTON, + TYPE_CLICK_FEED_ITEM, + TYPE_CLICK_LIKE } diff --git a/app/src/main/res/layout/item_wineyfeed_post.xml b/app/src/main/res/layout/item_wineyfeed_post.xml index 37466f1d..46f5e175 100644 --- a/app/src/main/res/layout/item_wineyfeed_post.xml +++ b/app/src/main/res/layout/item_wineyfeed_post.xml @@ -56,7 +56,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - Date: Mon, 28 Aug 2023 15:34:02 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[feat]=20#147=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=83=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/feed/detail/DetailActivity.kt | 53 ++++++++++++++++--- .../main/feed/detail/DetailFeedAdapter.kt | 3 +- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt index 8c335746..53cd22a4 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt @@ -18,6 +18,8 @@ import com.android.go.sopt.winey.domain.entity.DetailFeed import com.android.go.sopt.winey.domain.repository.DataStoreRepository import com.android.go.sopt.winey.presentation.main.MainActivity import com.android.go.sopt.winey.util.activity.hideKeyboard +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils +import com.android.go.sopt.winey.util.amplitude.type.EventType import com.android.go.sopt.winey.util.binding.BindingActivity import com.android.go.sopt.winey.util.context.colorOf import com.android.go.sopt.winey.util.context.snackBar @@ -31,6 +33,8 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.json.JSONException +import org.json.JSONObject import timber.log.Timber import javax.inject.Inject @@ -52,25 +56,28 @@ class DetailActivity : BindingActivity(R.layout.activity_ @Inject lateinit var dataStoreRepository: DataStoreRepository + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding.vm = viewModel - removeRecyclerviewItemChangeAnimation() - initBackButtonClickListener() + binding.vm = viewModel viewModel.getFeedDetail(feedId) + initGetFeedDetailObserver() initPostLikeStateObserver() initDeleteFeedStateObserver() - - initCommentAdapter() - initCommentCreateButtonClickListener() initPostCommentStateObserver() initDeleteCommentStateObserver() + initCommentAdapter() + initCommentCreateButtonClickListener() initEditTextFocusChangeListener() updateStatusBarColor() - binding.tvCommentCreate.bringToFront() + + removeRecyclerviewItemChangeAnimation() + initBackButtonClickListener() } private fun updateStatusBarColor() { @@ -272,6 +279,8 @@ class DetailActivity : BindingActivity(R.layout.activity_ val commentList = detailFeed.commentList switchCommentContainer(commentList) + + sendEventToAmplitude(EventType.TYPE_VIEW_SCREEN, detailFeed) } is UiState.Failure -> { @@ -299,7 +308,8 @@ class DetailActivity : BindingActivity(R.layout.activity_ is UiState.Success -> { val isLiked = state.data.data.isLiked val likes = state.data.data.likes.toLong() - detailFeedAdapter.updateLikeNumber(isLiked, likes) + val feed = detailFeedAdapter.updateLikeNumber(isLiked, likes) + sendEventToAmplitude(EventType.TYPE_CLICK_LIKE, feed) } is UiState.Failure -> { @@ -415,6 +425,33 @@ class DetailActivity : BindingActivity(R.layout.activity_ showAsDropDown(anchorView, -POPUP_MENU_POS_OFFSET, -POPUP_MENU_POS_OFFSET, Gravity.END) } + private fun sendEventToAmplitude(type: EventType, feed: DetailFeed) { + val eventProperties = JSONObject() + + try { + eventProperties.put("article_id", feed.feedId) + .put("like_count", feed.likes) + .put("comment_count", feed.comments) + + if (type == EventType.TYPE_CLICK_LIKE) { + eventProperties.put("from", "article") + } + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + when (type) { + EventType.TYPE_VIEW_SCREEN -> amplitudeUtils.logEvent( + "view_detail_contents", + eventProperties + ) + + EventType.TYPE_CLICK_LIKE -> amplitudeUtils.logEvent("click_like", eventProperties) + else -> {} + } + } + companion object { private const val KEY_FEED_ID = "feedId" private const val KEY_FEED_WRITER_ID = "feedWriterId" diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFeedAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFeedAdapter.kt index 65892a7b..385cbce6 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFeedAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFeedAdapter.kt @@ -27,10 +27,11 @@ class DetailFeedAdapter( holder.bind(detailFeed) } - fun updateLikeNumber(isLiked: Boolean, likes: Long) { + fun updateLikeNumber(isLiked: Boolean, likes: Long): DetailFeed { detailFeed.isLiked = isLiked // 이미지 변경 detailFeed.likes = likes // 개수 변경 notifyItemChanged(0) + return detailFeed } fun updateCommentNumber(comments: Long) { From 5b7cd6b2c085fef7d9f7e629ff74815fd842e1d3 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 15:43:58 +0900 Subject: [PATCH 10/17] =?UTF-8?q?[feat]=20#147=20=EC=9C=84=EB=8B=88?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EB=AA=A9=ED=91=9C=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/feed/WineyFeedFragment.kt | 108 +++++++++++------- 1 file changed, 68 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt index d026dd7f..b918efcc 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt @@ -119,7 +119,7 @@ class WineyFeedFragment : showFeedPopupMenu(anchorView, wineyFeed) }, toFeedDetail = { wineyFeed -> - sendEventToAmplitude(TYPE_CLICK_FEED_ITEM, wineyFeed) + sendWineyFeedEvent(TYPE_CLICK_FEED_ITEM, wineyFeed) navigateToDetail(wineyFeed) } ) @@ -268,7 +268,7 @@ class WineyFeedFragment : state.data.data.likes ) ?: return@onEach - sendEventToAmplitude(TYPE_CLICK_LIKE, item) + sendWineyFeedEvent(TYPE_CLICK_LIKE, item) } is UiState.Failure -> { @@ -280,35 +280,6 @@ class WineyFeedFragment : }.launchIn(viewLifeCycleScope) } - private fun sendEventToAmplitude(type: EventType, feed: WineyFeed) { - val eventProperties = JSONObject() - - try { - eventProperties.put("article_id", feed.feedId) - .put("like_count", feed.likes) - .put("comment_count", feed.comments) - - if (type == TYPE_CLICK_LIKE) { - eventProperties.put("from", "feed") - } - } catch (e: JSONException) { - System.err.println("Invalid JSON") - e.printStackTrace() - } - - when (type) { - TYPE_CLICK_FEED_ITEM -> amplitudeUtils.logEvent( - "click_homefeed_contents", - eventProperties - ) - - TYPE_CLICK_LIKE -> - amplitudeUtils.logEvent("click_like", eventProperties) - - else -> {} - } - } - private fun initFabClickListener() { binding.btnWineyfeedFloating.setOnSingleClickListener { amplitudeUtils.logEvent("click_write_contents") @@ -345,20 +316,48 @@ class WineyFeedFragment : private fun isGoalValid(data: User?) { if (data?.isOver == true) { - val dialog = WineyDialogFragment( - stringOf(R.string.wineyfeed_goal_dialog_title), - stringOf(R.string.wineyfeed_goal_dialog_subtitle), - stringOf(R.string.wineyfeed_goal_dialog_negative_button), - stringOf(R.string.wineyfeed_goal_dialog_positive_button), - handleNegativeButton = {}, - handlePositiveButton = { navigateTo() } - ) - dialog.show(parentFragmentManager, TAG_GOAL_DIALOG) + showGoalSettingDialog() } else { navigateToUpload() } } + private fun showGoalSettingDialog() { + amplitudeUtils.logEvent("view_goalsetting_popup") + + val dialog = WineyDialogFragment( + stringOf(R.string.wineyfeed_goal_dialog_title), + stringOf(R.string.wineyfeed_goal_dialog_subtitle), + stringOf(R.string.wineyfeed_goal_dialog_negative_button), + stringOf(R.string.wineyfeed_goal_dialog_positive_button), + handleNegativeButton = { + sendDialogClickEvent(false) + }, + handlePositiveButton = { + sendDialogClickEvent(true) + navigateTo() + } + ) + dialog.show(parentFragmentManager, TAG_GOAL_DIALOG) + } + + private fun sendDialogClickEvent(isNavigate: Boolean) { + val eventProperties = JSONObject() + + try { + if (isNavigate) { + eventProperties.put("method", "yes") + } else { + eventProperties.put("method", "no") + } + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + amplitudeUtils.logEvent("click_goalsetting", eventProperties) + } + private inline fun navigateTo() { parentFragmentManager.commit { replace(R.id.fcv_main, T::class.simpleName) @@ -389,6 +388,35 @@ class WineyFeedFragment : startActivity(intent) } + private fun sendWineyFeedEvent(type: EventType, feed: WineyFeed) { + val eventProperties = JSONObject() + + try { + eventProperties.put("article_id", feed.feedId) + .put("like_count", feed.likes) + .put("comment_count", feed.comments) + + if (type == TYPE_CLICK_LIKE) { + eventProperties.put("from", "feed") + } + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + when (type) { + TYPE_CLICK_FEED_ITEM -> amplitudeUtils.logEvent( + "click_homefeed_contents", + eventProperties + ) + + TYPE_CLICK_LIKE -> + amplitudeUtils.logEvent("click_like", eventProperties) + + else -> {} + } + } + companion object { private const val MSG_WINEYFEED_ERROR = "ERROR" private const val TAG_GOAL_DIALOG = "NO_GOAL_DIALOG" From 9497dda999ddc5b9ba468486fc8061808cee3f9a Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 15:45:33 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[feat]=20#147=20=EB=AA=A9=ED=91=9C?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20?= =?UTF-8?q?=EB=B7=B0=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../go/sopt/winey/presentation/main/mypage/MyPageFragment.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt index 87b55a3a..d62e98bf 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt @@ -21,6 +21,7 @@ import com.android.go.sopt.winey.presentation.main.mypage.myfeed.MyFeedFragment import com.android.go.sopt.winey.presentation.main.notification.NotificationActivity import com.android.go.sopt.winey.presentation.nickname.NicknameActivity import com.android.go.sopt.winey.presentation.onboarding.guide.GuideActivity +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingFragment import com.android.go.sopt.winey.util.fragment.WineyDialogFragment import com.android.go.sopt.winey.util.fragment.snackBar @@ -43,6 +44,9 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ @Inject lateinit var dataStoreRepository: DataStoreRepository + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -202,6 +206,7 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ true -> { val bottomSheet = TargetAmountBottomSheetFragment() bottomSheet.show(this.childFragmentManager, bottomSheet.tag) + amplitudeUtils.logEvent("view_goalsetting") } false -> { From 49d0a14b32e11f604450265a54093e2c4b7a47e5 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 15:53:00 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[feat]=20#147=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/winey/presentation/main/mypage/MyPageFragment.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt index d62e98bf..30750e87 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt @@ -49,6 +49,7 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + amplitudeUtils.logEvent("view_mypage") init1On1ButtonClickListener() initTermsButtonClickListener() @@ -61,6 +62,7 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ setupGetUserState() setupDeleteUserState() } + private val callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { val receivedBundle = arguments @@ -84,12 +86,14 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ private fun initNicknameButtonClickListener() { binding.ivMypageNickname.setOnClickListener { + amplitudeUtils.logEvent("click_edit_nickname") navigateToNicknameScreen() } } private fun initToMyFeedButtonClickListener() { binding.clMypageToMyfeed.setOnSingleClickListener { + amplitudeUtils.logEvent("click_myfeed") navigateAndBackStack() } } @@ -112,6 +116,7 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ private fun initLevelHelpButtonClickListener() { binding.btnMypageLevelHelp.setOnClickListener { + amplitudeUtils.logEvent("click_info") val intent = Intent(context, MypageHelpActivity::class.java) startActivity(intent) } @@ -119,6 +124,7 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ private fun initLogoutButtonClickListener() { binding.clMypageLogout.setOnClickListener { + amplitudeUtils.logEvent("click_logout") val dialog = WineyDialogFragment( stringOf(R.string.mypage_logout_dialog_title), stringOf(R.string.mypage_logout_dialog_subtitle), @@ -202,6 +208,8 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ private fun initBottomSheetClickListener(data: User?) { binding.clMypageTargetmoney.setOnSingleClickListener { + amplitudeUtils.logEvent("click_goalsetting") + when (data?.isOver) { true -> { val bottomSheet = TargetAmountBottomSheetFragment() From e4cfd6958f89c8d0d9faa83e8731bc893b526cef Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 16:03:52 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[feat]=20#147=20=EC=B6=94=EC=B2=9C?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=ED=83=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/recommend/RecommendAdapter.kt | 25 +++++-------- .../main/recommend/RecommendFragment.kt | 35 ++++++++++++++++++- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/recommend/RecommendAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/recommend/RecommendAdapter.kt index 2c473a70..988b47a5 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/recommend/RecommendAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/recommend/RecommendAdapter.kt @@ -1,7 +1,5 @@ package com.android.go.sopt.winey.presentation.main.recommend -import android.content.Intent -import android.net.Uri import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter @@ -11,27 +9,20 @@ import com.android.go.sopt.winey.domain.entity.Recommend import com.android.go.sopt.winey.util.view.ItemDiffCallback import com.android.go.sopt.winey.util.view.setOnSingleClickListener -class RecommendAdapter() : ListAdapter(diffUtil) { +class RecommendAdapter( + private val onItemLinkClicked: (Int, String) -> Unit +) : ListAdapter(diffUtil) { - class RecommendViewHolder( + inner class RecommendViewHolder( private val binding: ItemRecommendPostBinding ) : RecyclerView.ViewHolder(binding.root) { fun onBind(data: Recommend) { binding.apply { this.data = data - when (data.link == "null") { - true -> { - btnRecommendLink.isEnabled = false - } + btnRecommendLink.isEnabled = data.link != "null" - false -> { - btnRecommendLink.isEnabled = true - } - } btnRecommendLink.setOnSingleClickListener { - val url = data.link - val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) - it.context.startActivity(intent) + onItemLinkClicked(data.id, data.link) } executePendingBindings() } @@ -41,10 +32,10 @@ class RecommendAdapter() : ListAdapter(R.layout.fragment_recommend) { @@ -27,8 +32,12 @@ class RecommendFragment : BindingFragment(R.layout.fra private lateinit var recommendAdapter: RecommendAdapter private lateinit var recommendHeaderAdapter: RecommendHeaderAdapter + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + amplitudeUtils.logEvent("view_recommend") initAdapter() getRecommendListStateObserver() @@ -38,12 +47,36 @@ class RecommendFragment : BindingFragment(R.layout.fra } private fun initAdapter() { - recommendAdapter = RecommendAdapter() + recommendAdapter = RecommendAdapter( + onItemLinkClicked = { id, link -> + sendEventToAmplitude(id) + displayWebsite(link) + } + ) recommendHeaderAdapter = RecommendHeaderAdapter() binding.rvRecommendPost.adapter = ConcatAdapter(recommendHeaderAdapter, recommendAdapter) } + private fun sendEventToAmplitude(id: Int) { + val eventProperties = JSONObject() + + try { + eventProperties.put("contents_id", id) + .put("screen_name", "recommend_contents") + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + amplitudeUtils.logEvent("click_contents", eventProperties) + } + + private fun displayWebsite(link: String) { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) + requireActivity().startActivity(intent) + } + private fun getRecommendListStateObserver() { viewModel.getRecommendListState.flowWithLifecycle(lifecycle).onEach { state -> when (state) { From 4a6ebf92bac02979af0bdb1975ce7a9f00ee33c5 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 16:19:59 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[feat]=20#147=20=EC=9C=84=EB=8B=88=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=83=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/feed/upload/ContentFragment.kt | 24 +++++++++++++++++ .../main/feed/upload/PhotoFragment.kt | 26 ++++++++++++++++++- .../main/feed/upload/UploadActivity.kt | 2 -- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/ContentFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/ContentFragment.kt index 6f8d835e..955f00d9 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/ContentFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/ContentFragment.kt @@ -6,12 +6,21 @@ import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.FragmentContentBinding +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingFragment import com.android.go.sopt.winey.util.context.hideKeyboard +import dagger.hilt.android.AndroidEntryPoint +import org.json.JSONException +import org.json.JSONObject +import javax.inject.Inject +@AndroidEntryPoint class ContentFragment : BindingFragment(R.layout.fragment_content) { private val uploadViewModel by activityViewModels() + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.vm = uploadViewModel @@ -23,6 +32,7 @@ class ContentFragment : BindingFragment(R.layout.fragmen private fun initNextButtonClickListener() { binding.btnContentNext.setOnClickListener { + sendEventToAmplitude() navigateToNext() } } @@ -50,4 +60,18 @@ class ContentFragment : BindingFragment(R.layout.fragmen private fun focusOutEditText() { binding.etUploadContent.clearFocus() } + + private fun sendEventToAmplitude() { + val eventProperties = JSONObject() + + try { + eventProperties.put("button_name", "upload_next_button") + .put("paging_number", 3) + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + amplitudeUtils.logEvent("click_button", eventProperties) + } } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/PhotoFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/PhotoFragment.kt index 70dadf80..9a1d59b3 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/PhotoFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/PhotoFragment.kt @@ -8,16 +8,25 @@ import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.FragmentPhotoBinding +import com.android.go.sopt.winey.util.amplitude.AmplitudeUtils import com.android.go.sopt.winey.util.binding.BindingFragment -import com.android.go.sopt.winey.util.context.stringOf import com.android.go.sopt.winey.util.fragment.WineyDialogFragment import com.android.go.sopt.winey.util.fragment.stringOf +import dagger.hilt.android.AndroidEntryPoint +import org.json.JSONException +import org.json.JSONObject +import javax.inject.Inject +@AndroidEntryPoint class PhotoFragment : BindingFragment(R.layout.fragment_photo) { private val uploadViewModel by activityViewModels() + @Inject + lateinit var amplitudeUtils: AmplitudeUtils + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + amplitudeUtils.logEvent("view_upload") binding.vm = uploadViewModel initImageSelectButtonClickListener() @@ -72,6 +81,7 @@ class PhotoFragment : BindingFragment(R.layout.fragment_ph private fun initNextButtonClickListener() { binding.btnPhotoNext.setOnClickListener { + sendEventToAmplitude() navigateToNext() } } @@ -89,6 +99,20 @@ class PhotoFragment : BindingFragment(R.layout.fragment_ph } } + private fun sendEventToAmplitude() { + val eventProperties = JSONObject() + + try { + eventProperties.put("button_name", "upload_next_button") + .put("paging_number", 2) + } catch (e: JSONException) { + System.err.println("Invalid JSON") + e.printStackTrace() + } + + amplitudeUtils.logEvent("click_button", eventProperties) + } + companion object { private const val IMAGE_FILE = "image/*" private const val TAG_UPLOAD_DIALOG = "UPLOAD_DIALOG" diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/UploadActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/UploadActivity.kt index e5fdce54..ed0c627d 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/UploadActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/upload/UploadActivity.kt @@ -9,10 +9,8 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class UploadActivity : BindingActivity(R.layout.activity_upload) { - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setUpDefaultFragment(savedInstanceState) } From 197fa9885d28056e3fc3526be5b6f2d745624675 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 16:35:52 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[fix]=20#147=20=EC=95=B1=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EC=9D=B4=EB=93=9C=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=B7=B0=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/winey/presentation/onboarding/guide/GuideActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt index cd9dd032..7749c81f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt @@ -23,7 +23,7 @@ class GuideActivity : BindingActivity(R.layout.activity_gu override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - amplitudeUtils.logEvent("view_onboarding") + amplitudeUtils.logEvent("view_onboard") initViewPagerAdapter() observePageChange() From edd11e248567c6248027894d40426eba74b6d91e Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 17:07:45 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[fix]=20#147=20PR=20Checker=20yml=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=90=20=EC=95=B0=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=ED=8A=9C=EB=93=9C=20api=20key=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_checker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr_checker.yml b/.github/workflows/pr_checker.yml index ffe16277..0b0f1272 100644 --- a/.github/workflows/pr_checker.yml +++ b/.github/workflows/pr_checker.yml @@ -48,6 +48,7 @@ jobs: echo auth.base.url=\"$AUTH_BASE_URL\" >> ./local.properties echo kakao.native.key=\"$KAKAO_NATIVE_KEY\" >> ./local.properties echo kakaoNativeKey=$KAKAO_NATIVE_KEY >> ./local.properties + echo amplitude.api.key=\"AMPLITUDE_API_KEY\" >> ./local.properties # - name: Access Firebase Service # run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json From e14b2a94a3bc73e895798b648e219b8d4ebdb6e2 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 28 Aug 2023 17:07:45 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[fix]=20#147=20PR=20Checker=20yml=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=90=20=EC=95=B0=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=ED=8A=9C=EB=93=9C=20api=20key=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_checker.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pr_checker.yml b/.github/workflows/pr_checker.yml index ffe16277..9a4e96b3 100644 --- a/.github/workflows/pr_checker.yml +++ b/.github/workflows/pr_checker.yml @@ -44,10 +44,12 @@ jobs: env: AUTH_BASE_URL: ${{ secrets.AUTH_BASE_URL }} KAKAO_NATIVE_KEY: ${{ secrets.KAKAO_NATIVE_KEY }} + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} run: | echo auth.base.url=\"$AUTH_BASE_URL\" >> ./local.properties echo kakao.native.key=\"$KAKAO_NATIVE_KEY\" >> ./local.properties echo kakaoNativeKey=$KAKAO_NATIVE_KEY >> ./local.properties + echo amplitude.api.key=\"AMPLITUDE_API_KEY\" >> ./local.properties # - name: Access Firebase Service # run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json