From f2c93304c57896d97151fa89048d5811fa5940fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=82=E1=85=A1=E1=84=8B?= =?UTF-8?q?=E1=85=A7=E1=86=BC?= Date: Sun, 9 Apr 2023 13:41:56 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[FEAT]=20ga=5Futil=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9=20(#823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../havit/ui/contents/ContentsViewModel.kt | 6 +- .../sopt/havit/ui/mypage/MyPageFragment.kt | 7 ++ .../sopt/havit/ui/search/SearchViewModel.kt | 26 +++--- .../java/org/sopt/havit/ui/web/WebActivity.kt | 24 +++++- .../org/sopt/havit/ui/web/WebViewModel.kt | 6 +- .../sopt/havit/util/GoogleAnalyticsUtil.kt | 80 +++++++++++++++++++ 6 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt diff --git a/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt b/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt index 4aaaa47c4..732a8f9b2 100644 --- a/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt +++ b/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt @@ -7,10 +7,10 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.sopt.havit.data.remote.ContentsMoreData import org.sopt.havit.domain.entity.Contents import org.sopt.havit.domain.entity.NetworkState import org.sopt.havit.domain.repository.ContentsRepository +import org.sopt.havit.util.GoogleAnalyticsUtil import javax.inject.Inject @HiltViewModel @@ -78,6 +78,10 @@ class ContentsViewModel @Inject constructor( kotlin.runCatching { contentsRepository.isSeen(contentsId) }.onSuccess { + GoogleAnalyticsUtil.logClickEventWithContentCheck( + GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, + it.data.isSeen + ) _requestSeenState.postValue(NetworkState.SUCCESS) }.onFailure { _requestSeenState.postValue(NetworkState.FAIL) diff --git a/app/src/main/java/org/sopt/havit/ui/mypage/MyPageFragment.kt b/app/src/main/java/org/sopt/havit/ui/mypage/MyPageFragment.kt index 4d029427c..0c3d91a0e 100644 --- a/app/src/main/java/org/sopt/havit/ui/mypage/MyPageFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/mypage/MyPageFragment.kt @@ -13,6 +13,10 @@ import org.sopt.havit.databinding.FragmentMyPageBinding import org.sopt.havit.ui.base.BaseBindingFragment import org.sopt.havit.ui.contents.ContentsActivity import org.sopt.havit.ui.setting.SettingActivity +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_CHECKED_CONTENT +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_MY_CATEGORY +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_MY_CONTENT @AndroidEntryPoint class MyPageFragment : BaseBindingFragment(R.layout.fragment_my_page) { @@ -42,6 +46,7 @@ class MyPageFragment : BaseBindingFragment(R.layout.fragm private fun setListeners() { binding.clCategoryNum.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_MY_CATEGORY) startActivity( Intent( requireContext(), @@ -50,6 +55,7 @@ class MyPageFragment : BaseBindingFragment(R.layout.fragm ) } binding.clSavedContents.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_MY_CONTENT) startActivity( Intent(requireContext(), ContentsActivity::class.java).apply { putExtra("categoryId", ALL_CONTENTS_ID) @@ -58,6 +64,7 @@ class MyPageFragment : BaseBindingFragment(R.layout.fragm ) } binding.clSeenContents.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_CHECKED_CONTENT) startActivity( Intent(requireContext(), ContentsActivity::class.java).apply { putExtra("categoryId", SEEN_CONTENTS_ID) diff --git a/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt b/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt index 899a37f6b..2800c7017 100644 --- a/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt +++ b/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt @@ -12,6 +12,7 @@ import org.sopt.havit.domain.entity.Contents import org.sopt.havit.domain.entity.NetworkState import org.sopt.havit.domain.repository.ContentsRepository import org.sopt.havit.domain.usecase.SearchUseCase +import org.sopt.havit.util.GoogleAnalyticsUtil import javax.inject.Inject @HiltViewModel @@ -23,14 +24,10 @@ class SearchViewModel @Inject constructor( private val _searchResult = MutableLiveData>() var searchResult: LiveData> = _searchResult - var searchResultSize = MutableLiveData(0) - private var _searchReload = MutableLiveData(false) + private var _searchReload = MutableLiveData(false) var searchReload: LiveData = _searchReload - fun setReload() { - _searchReload.value = !(_searchReload.value)!! - } var searchTv = MutableLiveData(false) private var isSeenCheck = MutableLiveData(false) @@ -38,6 +35,8 @@ class SearchViewModel @Inject constructor( private var _isRead = MutableLiveData() var isRead: LiveData = _isRead + var isServerNetwork = MutableLiveData() + fun getSearchContents(keyWord: String) { viewModelScope.launch { searchUseCase.getSearchContents(keyWord).collect { @@ -59,10 +58,19 @@ class SearchViewModel @Inject constructor( fun setIsSeen(contentsId: Int) { viewModelScope.launch(Dispatchers.IO) { - try { - val response = contentsRepository.isSeen(contentsId) - isSeenCheck.postValue(response.success) - } catch (e: Exception) { + kotlin.runCatching { + contentsRepository.isSeen(contentsId) + + }.onSuccess { + isServerNetwork.postValue(NetworkState.SUCCESS) + isSeenCheck.postValue(it.success) + GoogleAnalyticsUtil.logClickEventWithContentCheck( + GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, + it.data.isSeen + ) + + }.onFailure { + isServerNetwork.postValue(NetworkState.FAIL) } } } diff --git a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt index ed45c81f8..2c38db3e8 100644 --- a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt +++ b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt @@ -2,12 +2,11 @@ package org.sopt.havit.ui.web import android.content.Intent import android.os.Bundle -import android.util.Log +import android.os.SystemClock import android.view.animation.AnimationUtils import android.webkit.* import android.widget.Toast import androidx.activity.viewModels -import androidx.core.content.ContentProviderCompat.requireContext import androidx.core.view.isVisible import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint @@ -16,17 +15,24 @@ import org.sopt.havit.databinding.ActivityWebBinding import org.sopt.havit.domain.entity.NetworkState import org.sopt.havit.ui.base.BaseBindingActivity import org.sopt.havit.util.EventObserver -import retrofit2.http.Url +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_GO_BACK +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_REFRESH +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_SHARE +import org.sopt.havit.util.GoogleAnalyticsUtil.CONTENT_SCREEN_TIME @AndroidEntryPoint class WebActivity : BaseBindingActivity(R.layout.activity_web) { private val webViewModel: WebViewModel by viewModels() + private var startTime: Long = 0 + private var endTime: Long = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) binding.vm = webViewModel + startTime = SystemClock.elapsedRealtime() initIsHavit() initHavitSeen() setUrlCheck() @@ -103,15 +109,18 @@ class WebActivity : BaseBindingActivity(R.layout.activity_we webViewModel.setHavit(intent!!.getIntExtra("contentsId", 0)) } binding.ibWebBack.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_GO_BACK) finish() } binding.llWebShare.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_SHARE) val intentShare = Intent(Intent.ACTION_SEND) intentShare.putExtra(Intent.EXTRA_TEXT, intent.getStringExtra("url")) intentShare.type = "text/plain" startActivity(Intent.createChooser(intentShare, "앱을 선택해 주세요.")) } binding.ibWebReload.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_REFRESH) binding.wbCustom.reload() } binding.layoutNetworkError.ivRefresh.setOnClickListener { @@ -136,6 +145,13 @@ class WebActivity : BaseBindingActivity(R.layout.activity_we override fun onBackPressed() { super.onBackPressed() super.finish() + GoogleAnalyticsUtil.logClickEvent(CLICK_GO_BACK) } -} \ No newline at end of file + override fun onDestroy() { + super.onDestroy() + endTime = SystemClock.elapsedRealtime() + GoogleAnalyticsUtil.logScreenDurationTimeEvent(CONTENT_SCREEN_TIME, endTime - startTime) + } + +} diff --git a/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt b/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt index eb9fdc606..8bbdccc39 100644 --- a/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt +++ b/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt @@ -5,11 +5,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.sopt.havit.domain.entity.NetworkState import org.sopt.havit.domain.repository.ContentsRepository import org.sopt.havit.util.Event +import org.sopt.havit.util.GoogleAnalyticsUtil import javax.inject.Inject @HiltViewModel @@ -40,6 +40,10 @@ class WebViewModel @Inject constructor(private val contentsRepository: ContentsR isServerNetwork.postValue(NetworkState.SUCCESS) _isHavit.value = Event(!(_isHavit.value!!.peekContent())) _isClick.value = Event(!(_isClick.value!!.peekContent())) + GoogleAnalyticsUtil.logClickEventWithContentCheck( + GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, + _isHavit.value!!.peekContent() + ) } }.onFailure { isServerNetwork.postValue(NetworkState.FAIL) diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt new file mode 100644 index 000000000..f9e1dacad --- /dev/null +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -0,0 +1,80 @@ +package org.sopt.havit.util + +import com.google.firebase.analytics.FirebaseAnalytics +import com.google.firebase.analytics.ktx.analytics +import com.google.firebase.analytics.ktx.logEvent +import com.google.firebase.ktx.Firebase +import org.sopt.havit.BuildConfig.IS_DEV + +object GoogleAnalyticsUtil { + + private const val STATUS_INSTALLED = "installed" + private const val STATUS_INSTANT = "instant" + private const val ANALYTICS_USER_PROP = "app_type" + + + private const val CONTENT_CHECK = "CONTENT_CHECK" + private const val SCREEN_TIME = "SCREEN_TIME" + + const val CLICK_MY_CATEGORY = "CLICK_MY_CATEGORY" + const val CLICK_MY_CONTENT = "CLICK_MY_CONTENT" + const val CLICK_CHECKED_CONTENT = "CLICK_CHECKED_CONTENT" + const val CLICK_GO_BACK = "CLICK_GO_BACK" + const val CLICK_REFRESH = "CLICK_REFRESH" + const val CLICK_SHARE = "CLICK_SHARE" + const val CLICK_CONTENT_CHECK = "CLICK_CONTENT_CHECK" + const val CONTENT_SCREEN_TIME = "CONTENT_SCREEN_TIME" + + fun logScreenEvent(screenName: String) { + if (IS_DEV) { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) + Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { + param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) + } + } else { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) + Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { + param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) + } + } + } + + fun logClickEvent(contentName: String) { + if (IS_DEV) { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) + Firebase.analytics.logEvent(contentName, null) + } else { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) + Firebase.analytics.logEvent(contentName, null) + } + } + + fun logClickEventWithContentCheck(contentName: String, contentCheck: Boolean) { + if (IS_DEV) { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) + Firebase.analytics.logEvent(contentName) { + param(CONTENT_CHECK, contentCheck.toString()) + } + } else { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) + Firebase.analytics.logEvent(contentName) { + param(CONTENT_CHECK, contentCheck.toString()) + } + } + } + + fun logScreenDurationTimeEvent(contentName: String, durationTime: Long) { + if (IS_DEV) { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) + Firebase.analytics.logEvent(contentName) { + param(SCREEN_TIME, durationTime) + } + } else { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) + Firebase.analytics.logEvent(contentName) { + param(SCREEN_TIME, durationTime) + } + } + } + +} From 25d3acdad9241d87658b6b2a2550da51a8c8114b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=82=E1=85=A1=E1=84=8B?= =?UTF-8?q?=E1=85=A7=E1=86=BC?= Date: Tue, 11 Apr 2023 15:33:11 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[FEAT]=20contentCheck=20Boolean=20?= =?UTF-8?q?=EA=B0=92=EC=9C=BC=EB=A1=9C=20=EC=A0=84=EB=8B=AC=20(#823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/havit/util/GoogleAnalyticsUtil.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index f9e1dacad..3580b41ab 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -1,5 +1,6 @@ package org.sopt.havit.util +import android.os.Bundle import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.analytics.ktx.logEvent @@ -52,14 +53,16 @@ object GoogleAnalyticsUtil { fun logClickEventWithContentCheck(contentName: String, contentCheck: Boolean) { if (IS_DEV) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) - Firebase.analytics.logEvent(contentName) { - param(CONTENT_CHECK, contentCheck.toString()) + val params = Bundle().apply { + putBoolean(CONTENT_CHECK, contentCheck) } + Firebase.analytics.logEvent(contentName, params) } else { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) - Firebase.analytics.logEvent(contentName) { - param(CONTENT_CHECK, contentCheck.toString()) + val params = Bundle().apply { + putBoolean(CONTENT_CHECK, contentCheck) } + Firebase.analytics.logEvent(contentName, params) } } From cc6980fa34d0bbd1ecdb8184bd28085878e3ab9e Mon Sep 17 00:00:00 2001 From: kxxhyorim Date: Tue, 11 Apr 2023 15:40:30 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[FEAT]=20Prod=EC=9D=B8=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=EC=97=90=EB=A7=8C=20GA=EC=A0=84=EC=86=A1=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=88=98=EC=A0=95=20(#823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/havit/util/GoogleAnalyticsUtil.kt | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index 3580b41ab..ae2270fa1 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -5,7 +5,7 @@ import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.analytics.ktx.logEvent import com.google.firebase.ktx.Firebase -import org.sopt.havit.BuildConfig.IS_DEV +import org.sopt.havit.BuildConfig.IS_PROD object GoogleAnalyticsUtil { @@ -27,12 +27,7 @@ object GoogleAnalyticsUtil { const val CONTENT_SCREEN_TIME = "CONTENT_SCREEN_TIME" fun logScreenEvent(screenName: String) { - if (IS_DEV) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) - Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { - param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) - } - } else { + if (IS_PROD) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) @@ -41,23 +36,14 @@ object GoogleAnalyticsUtil { } fun logClickEvent(contentName: String) { - if (IS_DEV) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) - Firebase.analytics.logEvent(contentName, null) - } else { + if (IS_PROD) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) Firebase.analytics.logEvent(contentName, null) } } fun logClickEventWithContentCheck(contentName: String, contentCheck: Boolean) { - if (IS_DEV) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) - val params = Bundle().apply { - putBoolean(CONTENT_CHECK, contentCheck) - } - Firebase.analytics.logEvent(contentName, params) - } else { + if (IS_PROD) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) val params = Bundle().apply { putBoolean(CONTENT_CHECK, contentCheck) @@ -67,17 +53,11 @@ object GoogleAnalyticsUtil { } fun logScreenDurationTimeEvent(contentName: String, durationTime: Long) { - if (IS_DEV) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTANT) - Firebase.analytics.logEvent(contentName) { - param(SCREEN_TIME, durationTime) - } - } else { + if (IS_PROD) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) Firebase.analytics.logEvent(contentName) { param(SCREEN_TIME, durationTime) } } } - } From 18d57a35b2c35dcec29d0a3f5e7ff94d31c2ca2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=82=E1=85=A1=E1=84=8B?= =?UTF-8?q?=E1=85=A7=E1=86=BC?= Date: Tue, 11 Apr 2023 16:37:02 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[FEAT]=20ga=20=ED=95=A8=EC=88=98=20activi?= =?UTF-8?q?ty=20=EB=A1=9C=20=EC=BD=94=EB=93=9C=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/sopt/havit/ui/contents/ContentsActivity.kt | 4 ++++ .../java/org/sopt/havit/ui/contents/ContentsViewModel.kt | 5 ----- app/src/main/java/org/sopt/havit/ui/search/SearchActivity.kt | 5 +++++ .../main/java/org/sopt/havit/ui/search/SearchViewModel.kt | 5 ----- app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt | 4 ++++ app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt | 5 ----- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/contents/ContentsActivity.kt b/app/src/main/java/org/sopt/havit/ui/contents/ContentsActivity.kt index a6df800c7..9793e8a12 100644 --- a/app/src/main/java/org/sopt/havit/ui/contents/ContentsActivity.kt +++ b/app/src/main/java/org/sopt/havit/ui/contents/ContentsActivity.kt @@ -432,6 +432,10 @@ class ContentsActivity : BaseBindingActivity(R.layout.a contentsViewModel.setIsSeen(contentsAdapter.currentList[position].id) currentHavitView = v currentHavitPosition = position + GoogleAnalyticsUtil.logClickEventWithContentCheck( + GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, + !(contentsAdapter.currentList[position].isSeen) + ) } }) } diff --git a/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt b/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt index 732a8f9b2..cf5b2d925 100644 --- a/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt +++ b/app/src/main/java/org/sopt/havit/ui/contents/ContentsViewModel.kt @@ -10,7 +10,6 @@ import kotlinx.coroutines.launch import org.sopt.havit.domain.entity.Contents import org.sopt.havit.domain.entity.NetworkState import org.sopt.havit.domain.repository.ContentsRepository -import org.sopt.havit.util.GoogleAnalyticsUtil import javax.inject.Inject @HiltViewModel @@ -78,10 +77,6 @@ class ContentsViewModel @Inject constructor( kotlin.runCatching { contentsRepository.isSeen(contentsId) }.onSuccess { - GoogleAnalyticsUtil.logClickEventWithContentCheck( - GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, - it.data.isSeen - ) _requestSeenState.postValue(NetworkState.SUCCESS) }.onFailure { _requestSeenState.postValue(NetworkState.FAIL) diff --git a/app/src/main/java/org/sopt/havit/ui/search/SearchActivity.kt b/app/src/main/java/org/sopt/havit/ui/search/SearchActivity.kt index 883d0faf2..021b315db 100644 --- a/app/src/main/java/org/sopt/havit/ui/search/SearchActivity.kt +++ b/app/src/main/java/org/sopt/havit/ui/search/SearchActivity.kt @@ -17,6 +17,7 @@ import org.sopt.havit.ui.base.BaseBindingActivity import org.sopt.havit.ui.contents.more.ContentsMoreFragment import org.sopt.havit.ui.web.WebActivity import org.sopt.havit.util.DialogUtil +import org.sopt.havit.util.GoogleAnalyticsUtil import org.sopt.havit.util.KeyBoardUtil import java.io.Serializable @@ -118,6 +119,10 @@ class SearchActivity : BaseBindingActivity(R.layout.activ ) { searchContentsAdapter.searchContents[pos].isSeen = !(data.isSeen) searchViewModel.setIsSeen(data.id) + GoogleAnalyticsUtil.logClickEventWithContentCheck( + GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, + data.isSeen + ) if (v.tag == "seen") { Glide.with(v.context) .load(R.drawable.ic_contents_unread) diff --git a/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt b/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt index 2800c7017..f9dc28d16 100644 --- a/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt +++ b/app/src/main/java/org/sopt/havit/ui/search/SearchViewModel.kt @@ -64,11 +64,6 @@ class SearchViewModel @Inject constructor( }.onSuccess { isServerNetwork.postValue(NetworkState.SUCCESS) isSeenCheck.postValue(it.success) - GoogleAnalyticsUtil.logClickEventWithContentCheck( - GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, - it.data.isSeen - ) - }.onFailure { isServerNetwork.postValue(NetworkState.FAIL) } diff --git a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt index 2c38db3e8..aacfd53a8 100644 --- a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt +++ b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt @@ -106,6 +106,10 @@ class WebActivity : BaseBindingActivity(R.layout.activity_we private fun setListeners() { binding.llWebview.setOnClickListener { + GoogleAnalyticsUtil.logClickEventWithContentCheck( + GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, + !(webViewModel.isHavit.value!!.peekContent()) + ) webViewModel.setHavit(intent!!.getIntExtra("contentsId", 0)) } binding.ibWebBack.setOnClickListener { diff --git a/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt b/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt index 8bbdccc39..9afbc8689 100644 --- a/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt +++ b/app/src/main/java/org/sopt/havit/ui/web/WebViewModel.kt @@ -9,7 +9,6 @@ import kotlinx.coroutines.launch import org.sopt.havit.domain.entity.NetworkState import org.sopt.havit.domain.repository.ContentsRepository import org.sopt.havit.util.Event -import org.sopt.havit.util.GoogleAnalyticsUtil import javax.inject.Inject @HiltViewModel @@ -40,10 +39,6 @@ class WebViewModel @Inject constructor(private val contentsRepository: ContentsR isServerNetwork.postValue(NetworkState.SUCCESS) _isHavit.value = Event(!(_isHavit.value!!.peekContent())) _isClick.value = Event(!(_isClick.value!!.peekContent())) - GoogleAnalyticsUtil.logClickEventWithContentCheck( - GoogleAnalyticsUtil.CLICK_CONTENT_CHECK, - _isHavit.value!!.peekContent() - ) } }.onFailure { isServerNetwork.postValue(NetworkState.FAIL) From 2126d4ca8583477c5332e66ebb836532e70da841 Mon Sep 17 00:00:00 2001 From: hyein Date: Sun, 16 Apr 2023 17:11:13 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[FEAT]=20=ED=99=88=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20ga=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=B6=99=EC=9D=B4?= =?UTF-8?q?=EA=B8=B0=20(#825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/havit/ui/home/HomeFragment.kt | 17 ++++++++++++++ .../sopt/havit/util/GoogleAnalyticsUtil.kt | 23 +++++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 2 +- app/src/main/res/layout/fragment_picker.xml | 2 +- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt b/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt index da17b54fb..f19d2ffd4 100644 --- a/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt @@ -23,6 +23,16 @@ import org.sopt.havit.ui.web.WebActivity import org.sopt.havit.util.PopupSharedPreference import org.sopt.havit.util.setDragSensitivity import org.sopt.havit.util.setOnSingleClickListener +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_GO_BACK +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_REFRESH +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_SHARE +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_MUST_SEE_CONTENT +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_SEARCH_CONTENT +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_WHOLE_CATEGORY +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_HAVIT_SERVICE_GUIDE +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_SEE_MORE +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_RECOMMENDED_SITE @AndroidEntryPoint class HomeFragment : BaseBindingFragment(R.layout.fragment_home) { @@ -92,6 +102,8 @@ class HomeFragment : BaseBindingFragment(R.layout.fragment_ recommendRvAdapter.setItemClickListener(object : HomeRecommendRvAdapter.OnItemClickListener { override fun onWebClick(v: View, position: Int) { + GoogleAnalyticsUtil.logClickEventWithRecommendedSiteNum(CLICK_RECOMMENDED_SITE, position) + val intent = Intent(v.context, WebActivity::class.java) homeViewModel.recommendList.value?.get(position) ?.let { @@ -229,24 +241,29 @@ class HomeFragment : BaseBindingFragment(R.layout.fragment_ startActivity(intent) } binding.clReachContents.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_MUST_SEE_CONTENT) val intent = Intent(requireActivity(), ContentsSimpleActivity::class.java) intent.putExtra(CONTENT_TYPE, "unseen") startActivity(intent) } binding.layoutCategory.tvCategoryAll.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_WHOLE_CATEGORY) val intent = Intent(requireActivity(), HomeCategoryAllActivity::class.java) startActivity((intent)) } binding.clSearchClickable.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_SEARCH_CONTENT) val intent = Intent(requireActivity(), SearchActivity::class.java) startActivity(intent) } binding.tvMoreContents.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_SEE_MORE) val intent = Intent(requireActivity(), ContentsSimpleActivity::class.java) intent.putExtra(CONTENT_TYPE, "recent") startActivity(intent) } binding.ivServiceGuide.setOnClickListener { + GoogleAnalyticsUtil.logClickEvent(CLICK_HAVIT_SERVICE_GUIDE) val intent = Intent(requireActivity(), ServiceGuideActivity::class.java) startActivity(intent) } diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index ae2270fa1..03d8f125e 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -16,6 +16,7 @@ object GoogleAnalyticsUtil { private const val CONTENT_CHECK = "CONTENT_CHECK" private const val SCREEN_TIME = "SCREEN_TIME" + private const val SITE_NUM = "SITE_NUM" const val CLICK_MY_CATEGORY = "CLICK_MY_CATEGORY" const val CLICK_MY_CONTENT = "CLICK_MY_CONTENT" @@ -26,6 +27,18 @@ object GoogleAnalyticsUtil { const val CLICK_CONTENT_CHECK = "CLICK_CONTENT_CHECK" const val CONTENT_SCREEN_TIME = "CONTENT_SCREEN_TIME" + // 홈 + const val CLICK_MUST_SEE_CONTENT = "CLICK_MUST_SEE_CONTENT" + const val CLICK_SEARCH_CONTENT = "CLICK_SEARCH_CONTENT" + const val CLICK_WHOLE_CATEGORY = "CLICK_WHOLE_CATEGORY" + const val CLICK_HAVIT_SERVICE_GUIDE = "CLICK_HAVIT_SERVICE_GUIDE" + const val CLICK_SEE_MORE = "CLICK_SEE_MORE" + const val CLICK_RECOMMENDED_SITE = "CLICK_RECOMMENDED_SITE" + const val GNB_HOME = "GNB_HOME" + const val GNB_CATEGORY = "GNB_CATEGORY" + const val GNB_MYPAGE = "GNB_MYPAGE" + const val GNB_ADD_CONTENT = "GNB_ADD_CONTENT" + fun logScreenEvent(screenName: String) { if (IS_PROD) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) @@ -60,4 +73,14 @@ object GoogleAnalyticsUtil { } } } + + fun logClickEventWithRecommendedSiteNum(contentName: String, siteNum: Int) { + if (IS_PROD) { + Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) + val params = Bundle().apply { + putString(SITE_NUM, siteNum.toString()) + } + Firebase.analytics.logEvent(contentName, params) + } + } } diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 3a89560e2..6fc6af985 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -629,4 +629,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_picker.xml b/app/src/main/res/layout/fragment_picker.xml index ae380bdb0..121e7e1fb 100644 --- a/app/src/main/res/layout/fragment_picker.xml +++ b/app/src/main/res/layout/fragment_picker.xml @@ -111,4 +111,4 @@ android:textColor="@color/havit_purple" app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + From d9fdcb7ea1bfba06f50e33e8f64eb23b6cef2e63 Mon Sep 17 00:00:00 2001 From: hyein Date: Sun, 16 Apr 2023 17:15:04 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[CHORE]=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20import=20=EC=82=AD=EC=A0=9C=20(#825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt b/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt index f19d2ffd4..b772ffd4b 100644 --- a/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/home/HomeFragment.kt @@ -24,9 +24,6 @@ import org.sopt.havit.util.PopupSharedPreference import org.sopt.havit.util.setDragSensitivity import org.sopt.havit.util.setOnSingleClickListener import org.sopt.havit.util.GoogleAnalyticsUtil -import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_GO_BACK -import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_REFRESH -import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_SHARE import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_MUST_SEE_CONTENT import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_SEARCH_CONTENT import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_WHOLE_CATEGORY From 5af1e334b7afa4758a3c60ac48f2578571c1233f Mon Sep 17 00:00:00 2001 From: hyein Date: Sun, 16 Apr 2023 21:15:40 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[FEAT]=20=EB=B0=94=ED=85=80=EB=84=A4?= =?UTF-8?q?=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98(=ED=99=88,=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC,=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80)=20&=20=ED=94=8C=EB=A1=9C=ED=8C=85=EB=B2=84?= =?UTF-8?q?=ED=8A=BC(=EC=BD=98=ED=85=90=EC=B8=A0=EC=83=9D=EC=84=B1)=20GA?= =?UTF-8?q?=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=B6=99=EC=9D=B4=EA=B8=B0=20?= =?UTF-8?q?(#826)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/sopt/havit/MainActivity.kt | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/MainActivity.kt b/app/src/main/java/org/sopt/havit/MainActivity.kt index d429a94da..b32e76e88 100644 --- a/app/src/main/java/org/sopt/havit/MainActivity.kt +++ b/app/src/main/java/org/sopt/havit/MainActivity.kt @@ -4,11 +4,18 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import dagger.hilt.android.AndroidEntryPoint import org.sopt.havit.databinding.ActivityMainBinding +import org.sopt.havit.ui.category.CategoryFragment +import org.sopt.havit.ui.home.HomeFragment +import org.sopt.havit.ui.mypage.MyPageFragment import org.sopt.havit.ui.save.SaveFragment +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.GNB_ADD_CONTENT +import org.sopt.havit.util.GoogleAnalyticsUtil.GNB_CATEGORY +import org.sopt.havit.util.GoogleAnalyticsUtil.GNB_HOME +import org.sopt.havit.util.GoogleAnalyticsUtil.GNB_MYPAGE @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -28,18 +35,47 @@ class MainActivity : AppCompatActivity() { } private fun setBottomNavi() { - navView = binding.navView - navHostFragment = - supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment - navController = navHostFragment.navController - navView.setupWithNavController(navController) + // TODO GA붙이기 위해 임의로 막아놓은 코드 + //navView = binding.navView + //navHostFragment = + // supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment + //navController = navHostFragment.navController + //navView.setupWithNavController(navController) binding.navView.background = null } private fun setListeners() { binding.floatingSave.bringToFront() binding.floatingSave.setOnClickListener { + // 콘텐츠 추가 플로팅 버튼 클릭 시 + GoogleAnalyticsUtil.logClickEvent(GNB_ADD_CONTENT) SaveFragment("").show(supportFragmentManager, "save") } + + binding.navView.setOnItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.navigation_home -> { + changeFragment(HomeFragment::class.java.name) + GoogleAnalyticsUtil.logClickEvent(GNB_HOME) + } + R.id.navigation_category -> { + changeFragment(CategoryFragment::class.java.name) + GoogleAnalyticsUtil.logClickEvent(GNB_CATEGORY) + } + R.id.navigation_my_page -> { + changeFragment(MyPageFragment::class.java.name) + GoogleAnalyticsUtil.logClickEvent(GNB_MYPAGE) + } + else -> {} + } + true + } + } + + private fun changeFragment(className: String) { + val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, className) + supportFragmentManager.beginTransaction() + .replace(R.id.nav_host_fragment_activity_main, fragment).commit() + //supportFragmentManager.beginTransaction().replace(R.id.nav_host_fragment_activity_main, fragment).commit() } } From 4f77a16c057a6ba6b23e21c8ef1f74b53a44099a Mon Sep 17 00:00:00 2001 From: hyein Date: Mon, 17 Apr 2023 18:42:56 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[REFACTOR]=20navigation=EC=9D=84=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20ga=EB=A5=BC=20=EB=B3=B4?= =?UTF-8?q?=EB=82=BC=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#826)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/sopt/havit/MainActivity.kt | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/MainActivity.kt b/app/src/main/java/org/sopt/havit/MainActivity.kt index b32e76e88..896e80d91 100644 --- a/app/src/main/java/org/sopt/havit/MainActivity.kt +++ b/app/src/main/java/org/sopt/havit/MainActivity.kt @@ -4,12 +4,10 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import dagger.hilt.android.AndroidEntryPoint import org.sopt.havit.databinding.ActivityMainBinding -import org.sopt.havit.ui.category.CategoryFragment -import org.sopt.havit.ui.home.HomeFragment -import org.sopt.havit.ui.mypage.MyPageFragment import org.sopt.havit.ui.save.SaveFragment import org.sopt.havit.util.GoogleAnalyticsUtil import org.sopt.havit.util.GoogleAnalyticsUtil.GNB_ADD_CONTENT @@ -23,6 +21,7 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var navController: NavController private lateinit var navView: BottomNavigationView + private var isInitialized: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -35,47 +34,40 @@ class MainActivity : AppCompatActivity() { } private fun setBottomNavi() { - // TODO GA붙이기 위해 임의로 막아놓은 코드 - //navView = binding.navView - //navHostFragment = - // supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment - //navController = navHostFragment.navController - //navView.setupWithNavController(navController) - binding.navView.background = null - } - - private fun setListeners() { - binding.floatingSave.bringToFront() - binding.floatingSave.setOnClickListener { - // 콘텐츠 추가 플로팅 버튼 클릭 시 - GoogleAnalyticsUtil.logClickEvent(GNB_ADD_CONTENT) - SaveFragment("").show(supportFragmentManager, "save") - } - - binding.navView.setOnItemSelectedListener { menuItem -> - when (menuItem.itemId) { + navView = binding.navView + navHostFragment = + supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment + navController = navHostFragment.navController + // 바텀네비게이션 클릭 시 ga 이벤트 보냄 + navController.addOnDestinationChangedListener { _, destination, _ -> + when (destination.id) { R.id.navigation_home -> { - changeFragment(HomeFragment::class.java.name) - GoogleAnalyticsUtil.logClickEvent(GNB_HOME) + // 처음 홈 화면 진입 시는 클릭해서 진입한게 아니므로 이벤트 보내지 않음 + if (isInitialized) { + GoogleAnalyticsUtil.logClickEvent(GNB_HOME) + } else { + isInitialized = true + } } R.id.navigation_category -> { - changeFragment(CategoryFragment::class.java.name) GoogleAnalyticsUtil.logClickEvent(GNB_CATEGORY) } R.id.navigation_my_page -> { - changeFragment(MyPageFragment::class.java.name) GoogleAnalyticsUtil.logClickEvent(GNB_MYPAGE) } else -> {} } - true } + navView.setupWithNavController(navController) + binding.navView.background = null } - private fun changeFragment(className: String) { - val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, className) - supportFragmentManager.beginTransaction() - .replace(R.id.nav_host_fragment_activity_main, fragment).commit() - //supportFragmentManager.beginTransaction().replace(R.id.nav_host_fragment_activity_main, fragment).commit() + private fun setListeners() { + binding.floatingSave.bringToFront() + binding.floatingSave.setOnClickListener { + // 콘텐츠 추가 플로팅 버튼 클릭 시 + GoogleAnalyticsUtil.logClickEvent(GNB_ADD_CONTENT) + SaveFragment("").show(supportFragmentManager, "save") + } } } From 4f899f88d53360978953680afc3d6fc30a65f5bf Mon Sep 17 00:00:00 2001 From: kxxhyorim Date: Mon, 17 Apr 2023 22:51:02 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[FIX]=20=EA=B8=B0=ED=9A=8D=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A7=80=EC=A0=95=ED=95=9C=20Event=20=EB=AA=85?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/havit/util/GoogleAnalyticsUtil.kt | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index 03d8f125e..c0b634df1 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -10,34 +10,33 @@ import org.sopt.havit.BuildConfig.IS_PROD object GoogleAnalyticsUtil { private const val STATUS_INSTALLED = "installed" - private const val STATUS_INSTANT = "instant" private const val ANALYTICS_USER_PROP = "app_type" - private const val CONTENT_CHECK = "CONTENT_CHECK" - private const val SCREEN_TIME = "SCREEN_TIME" - private const val SITE_NUM = "SITE_NUM" + private const val CONTENT_CHECK = "click_content_check" + private const val SCREEN_TIME = "content_screen_time" + private const val SITE_NUM = "site_num" - const val CLICK_MY_CATEGORY = "CLICK_MY_CATEGORY" - const val CLICK_MY_CONTENT = "CLICK_MY_CONTENT" - const val CLICK_CHECKED_CONTENT = "CLICK_CHECKED_CONTENT" - const val CLICK_GO_BACK = "CLICK_GO_BACK" - const val CLICK_REFRESH = "CLICK_REFRESH" - const val CLICK_SHARE = "CLICK_SHARE" - const val CLICK_CONTENT_CHECK = "CLICK_CONTENT_CHECK" - const val CONTENT_SCREEN_TIME = "CONTENT_SCREEN_TIME" + const val CLICK_MY_CATEGORY = "click_my_category" + const val CLICK_MY_CONTENT = "click_my_content" + const val CLICK_CHECKED_CONTENT = "click_checked_content" + const val CLICK_GO_BACK = "click_go_back" + const val CLICK_REFRESH = "click_refresh" + const val CLICK_SHARE = "click_share" + const val CLICK_CONTENT_CHECK = "click_content_check" + const val CONTENT_SCREEN_TIME = "content_screen_time" // 홈 - const val CLICK_MUST_SEE_CONTENT = "CLICK_MUST_SEE_CONTENT" - const val CLICK_SEARCH_CONTENT = "CLICK_SEARCH_CONTENT" - const val CLICK_WHOLE_CATEGORY = "CLICK_WHOLE_CATEGORY" - const val CLICK_HAVIT_SERVICE_GUIDE = "CLICK_HAVIT_SERVICE_GUIDE" - const val CLICK_SEE_MORE = "CLICK_SEE_MORE" - const val CLICK_RECOMMENDED_SITE = "CLICK_RECOMMENDED_SITE" - const val GNB_HOME = "GNB_HOME" - const val GNB_CATEGORY = "GNB_CATEGORY" - const val GNB_MYPAGE = "GNB_MYPAGE" - const val GNB_ADD_CONTENT = "GNB_ADD_CONTENT" + const val CLICK_MUST_SEE_CONTENT = "click_must_see_content" + const val CLICK_SEARCH_CONTENT = "click_search_content" + const val CLICK_WHOLE_CATEGORY = "click_whole_category" + const val CLICK_HAVIT_SERVICE_GUIDE = "click_havit_service_guide" + const val CLICK_SEE_MORE = "click_see_more" + const val CLICK_RECOMMENDED_SITE = "click_recommended_site" + const val GNB_HOME = "gnb_home" + const val GNB_CATEGORY = "gnb_category" + const val GNB_MYPAGE = "gnb_mypage" + const val GNB_ADD_CONTENT = "gnb_add_content" fun logScreenEvent(screenName: String) { if (IS_PROD) { From 391bd85aa116c18a83f26482ca2403d238e2e77c Mon Sep 17 00:00:00 2001 From: kxxhyorim Date: Mon, 17 Apr 2023 22:58:10 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[CHORE]=20=EC=BD=98=ED=85=90=EC=B8=A0=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5,=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=83=81=EC=88=98=20=EC=A0=95=EC=9D=98=20(#828)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/havit/util/GoogleAnalyticsUtil.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index c0b634df1..5f430859d 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -9,14 +9,29 @@ import org.sopt.havit.BuildConfig.IS_PROD object GoogleAnalyticsUtil { + // property private const val STATUS_INSTALLED = "installed" private const val ANALYTICS_USER_PROP = "app_type" - + // parameter private const val CONTENT_CHECK = "click_content_check" private const val SCREEN_TIME = "content_screen_time" private const val SITE_NUM = "site_num" + // save contents + const val SELECT_CATEGORY = "select_category" + const val CONTENT_CUSTOM = "content_custom" + const val CLICK_COMPLETE_SAVE_CONTENT = "click_complete_save_content" + const val SETTING_ALARM = "setting_alarm" + const val CLICK_COMPLETE_SETTING_ALARM = "click_complete_setting_alarm" + const val MODIFY_TITLE = "modify_title" + const val CLICK_COMPLETE_MODIFY_TITLE = "click_complete_modify_title" + + // create category + const val ADD_CATEGORY = "add_category" + const val SELECT_ICON = "select_icon" + const val CLICK_COMPLETE_SELECT_ICON = "click_complete_select_icon" + const val CLICK_MY_CATEGORY = "click_my_category" const val CLICK_MY_CONTENT = "click_my_content" const val CLICK_CHECKED_CONTENT = "click_checked_content" From 2b5e18cdc34abca7614f8b5e648ac10af7b45113 Mon Sep 17 00:00:00 2001 From: kxxhyorim Date: Tue, 18 Apr 2023 17:34:37 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[FEAT]=20=EC=BD=98=ED=85=90=EC=B8=A0=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20GA=20=EB=A1=9C=EA=B9=85=20(#828)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contents_summery/ContentsSummeryFragment.kt | 12 ++++++++++++ .../ui/share/edit_title/EditTitleFragment.kt | 17 +++++++++++++---- .../notification/SetNotificationFragment.kt | 13 +++++++++++++ .../select_category/SelectCategoryFragment.kt | 7 +++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/share/contents_summery/ContentsSummeryFragment.kt b/app/src/main/java/org/sopt/havit/ui/share/contents_summery/ContentsSummeryFragment.kt index 6eb454e56..f5b00f9e3 100644 --- a/app/src/main/java/org/sopt/havit/ui/share/contents_summery/ContentsSummeryFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/share/contents_summery/ContentsSummeryFragment.kt @@ -12,6 +12,8 @@ import org.sopt.havit.domain.model.NetworkStatus import org.sopt.havit.ui.base.BaseBindingFragment import org.sopt.havit.ui.share.ShareViewModel import org.sopt.havit.util.* +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_COMPLETE_SAVE_CONTENT +import org.sopt.havit.util.GoogleAnalyticsUtil.CONTENT_CUSTOM import javax.inject.Inject @AndroidEntryPoint @@ -30,6 +32,7 @@ class ContentsSummeryFragment : initListener() toolbarClickListener() onClickRefreshButtonOnNetworkError() + setScreenEventLogging() } private fun initListener() { @@ -74,6 +77,7 @@ class ContentsSummeryFragment : private fun saveContents() { viewModel.saveContents() + setClickEventLogging() } private fun toolbarClickListener() { @@ -99,5 +103,13 @@ class ContentsSummeryFragment : } } + private fun setScreenEventLogging() { + GoogleAnalyticsUtil.logScreenEvent(CONTENT_CUSTOM) + } + + private fun setClickEventLogging() { + GoogleAnalyticsUtil.logClickEvent(CLICK_COMPLETE_SAVE_CONTENT) + } + private fun setCustomToast() = ToastUtil(requireContext()).makeToast(ADD_CONTENT_TYPE) } diff --git a/app/src/main/java/org/sopt/havit/ui/share/edit_title/EditTitleFragment.kt b/app/src/main/java/org/sopt/havit/ui/share/edit_title/EditTitleFragment.kt index de618b8c4..b48ed9b01 100644 --- a/app/src/main/java/org/sopt/havit/ui/share/edit_title/EditTitleFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/share/edit_title/EditTitleFragment.kt @@ -11,10 +11,9 @@ import androidx.navigation.fragment.navArgs import dagger.hilt.android.AndroidEntryPoint import org.sopt.havit.databinding.FragmentEditTitleBinding import org.sopt.havit.ui.share.ShareViewModel -import org.sopt.havit.util.AutoClearedValue -import org.sopt.havit.util.DialogUtil -import org.sopt.havit.util.KeyBoardUtil -import org.sopt.havit.util.OnBackPressedHandler +import org.sopt.havit.util.* +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_COMPLETE_MODIFY_TITLE +import org.sopt.havit.util.GoogleAnalyticsUtil.MODIFY_TITLE @AndroidEntryPoint class EditTitleFragment : Fragment(), OnBackPressedHandler { @@ -36,6 +35,7 @@ class EditTitleFragment : Fragment(), OnBackPressedHandler { setKeyBoardUp() initClickListener() setCursor() + setScreenEventLogging() } private fun setCursor() { @@ -58,10 +58,15 @@ class EditTitleFragment : Fragment(), OnBackPressedHandler { binding.icBack.setOnClickListener { onBackClicked() } binding.tvComplete.setOnClickListener { viewModel.ogData.value?.ogTitle = binding.etTitle.text.toString() + setClickEventLogging() goBack() } } + private fun setClickEventLogging() { + GoogleAnalyticsUtil.logClickEvent(CLICK_COMPLETE_MODIFY_TITLE) + } + private fun onBackClicked() { if (isTitleChanged) showEditTitleWarningDialog() else goBack() @@ -83,4 +88,8 @@ class EditTitleFragment : Fragment(), OnBackPressedHandler { private fun goBack() { findNavController().popBackStack() } + + private fun setScreenEventLogging() { + GoogleAnalyticsUtil.logScreenEvent(MODIFY_TITLE) + } } diff --git a/app/src/main/java/org/sopt/havit/ui/share/notification/SetNotificationFragment.kt b/app/src/main/java/org/sopt/havit/ui/share/notification/SetNotificationFragment.kt index 7c7bbb05a..7746eaffe 100644 --- a/app/src/main/java/org/sopt/havit/ui/share/notification/SetNotificationFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/share/notification/SetNotificationFragment.kt @@ -15,6 +15,9 @@ import org.sopt.havit.ui.share.notification.SetNotificationFragment.Companion.TH import org.sopt.havit.ui.share.notification.SetNotificationFragment.Companion.TWENTY_FOUR import org.sopt.havit.ui.share.notification.SetNotificationFragment.Companion.TWO import org.sopt.havit.util.DialogUtil +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.CLICK_COMPLETE_SETTING_ALARM +import org.sopt.havit.util.GoogleAnalyticsUtil.SETTING_ALARM import org.sopt.havit.util.OnBackPressedHandler import java.util.* @@ -33,6 +36,7 @@ class SetNotificationFragment : initRadioGroupListener() initToolbarListener() initDeleteNotiBtn() + setScreenEventLogging() } private fun initDeleteNotiBtn() { @@ -68,10 +72,15 @@ class SetNotificationFragment : binding.icBack.setOnClickListener { onBackClicked() } binding.tvComplete.setOnClickListener { viewModel.syncFinalDataWithTempData() + setClickEventLogging() goBack() } } + private fun setClickEventLogging() { + GoogleAnalyticsUtil.logClickEvent(CLICK_COMPLETE_SETTING_ALARM) + } + private fun showPickerFragment() { val bottomSheet = PickerFragment() bottomSheet.show(childFragmentManager, bottomSheet.tag) @@ -114,6 +123,10 @@ class SetNotificationFragment : findNavController().popBackStack() } + private fun setScreenEventLogging() { + GoogleAnalyticsUtil.logScreenEvent(SETTING_ALARM) + } + companion object { const val ONE = 1 const val TWO = 2 diff --git a/app/src/main/java/org/sopt/havit/ui/share/select_category/SelectCategoryFragment.kt b/app/src/main/java/org/sopt/havit/ui/share/select_category/SelectCategoryFragment.kt index da912db7a..89e5a095e 100644 --- a/app/src/main/java/org/sopt/havit/ui/share/select_category/SelectCategoryFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/share/select_category/SelectCategoryFragment.kt @@ -12,6 +12,8 @@ import org.sopt.havit.databinding.FragmentSelectCategoryBinding import org.sopt.havit.ui.base.BaseBindingFragment import org.sopt.havit.ui.contents.more.edit_category.SelectableCategoryAdapter import org.sopt.havit.ui.share.ShareViewModel +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.SELECT_CATEGORY import org.sopt.havit.util.setOnSingleClickListener @AndroidEntryPoint @@ -33,6 +35,7 @@ class SelectCategoryFragment : initListener() toolbarClickListener() onClickRefreshButtonOnNetworkError() + setScreenEventLogging() } private fun getCategoryData() { @@ -96,6 +99,10 @@ class SelectCategoryFragment : toast.show() } + private fun setScreenEventLogging() { + GoogleAnalyticsUtil.logScreenEvent(SELECT_CATEGORY) + } + override fun onDestroyView() { viewModel.clearCategoryViewState() super.onDestroyView() From da341ada384acf67a38d1be31098f13148d8e1d5 Mon Sep 17 00:00:00 2001 From: kxxhyorim Date: Tue, 18 Apr 2023 22:24:37 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[FEAT]=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=83=9D=EC=84=B1=20GA=20=EB=A1=9C=EA=B9=85=20(#82?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../share/add_category/ChooseIconFragment.kt | 18 ++++++++++++++---- .../add_category/EnterCategoryTitleFragment.kt | 7 +++++++ .../org/sopt/havit/util/GoogleAnalyticsUtil.kt | 12 ++++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/share/add_category/ChooseIconFragment.kt b/app/src/main/java/org/sopt/havit/ui/share/add_category/ChooseIconFragment.kt index 8ad59d061..d7588151a 100644 --- a/app/src/main/java/org/sopt/havit/ui/share/add_category/ChooseIconFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/share/add_category/ChooseIconFragment.kt @@ -13,10 +13,8 @@ import org.sopt.havit.ui.base.BaseBindingFragment import org.sopt.havit.ui.category.CategoryAddActivity import org.sopt.havit.ui.share.AddCategoryViewModel import org.sopt.havit.ui.share.add_category.IconAdapter.Companion.clickedPosition -import org.sopt.havit.util.ADD_CATEGORY_TYPE -import org.sopt.havit.util.ToastUtil -import org.sopt.havit.util.setOnSingleClickListener -import org.sopt.havit.util.setOnSinglePostClickListener +import org.sopt.havit.util.* +import org.sopt.havit.util.GoogleAnalyticsUtil.SELECT_ICON @AndroidEntryPoint class ChooseIconFragment : @@ -35,6 +33,7 @@ class ChooseIconFragment : initNetworkErrorViewClickListener() toolbarClickListener() observeNetworkStatus() + setScreenEventLogging() } private fun toolbarClickListener() { @@ -66,9 +65,16 @@ class ChooseIconFragment : private fun initNormalViewClickNext() { binding.btnNext.setOnSinglePostClickListener { viewModel.addCategory() + setClickEventLogging() } } + private fun setClickEventLogging() { + val iconIdx = requireNotNull(viewModel.selectedIconPosition.value) + GoogleAnalyticsUtil.logClickEventOnAddCategory(iconNum = iconIdx) + } + + private fun observeNetworkStatus() { viewModel.addCategoryViewState.observe(viewLifecycleOwner) { when (it) { @@ -95,4 +101,8 @@ class ChooseIconFragment : categoryName = viewModel.categoryTitle.value ?: throw IllegalStateException() ) } + + private fun setScreenEventLogging() { + GoogleAnalyticsUtil.logScreenEvent(SELECT_ICON) + } } diff --git a/app/src/main/java/org/sopt/havit/ui/share/add_category/EnterCategoryTitleFragment.kt b/app/src/main/java/org/sopt/havit/ui/share/add_category/EnterCategoryTitleFragment.kt index fd9ec04fe..36a95b9ac 100644 --- a/app/src/main/java/org/sopt/havit/ui/share/add_category/EnterCategoryTitleFragment.kt +++ b/app/src/main/java/org/sopt/havit/ui/share/add_category/EnterCategoryTitleFragment.kt @@ -12,6 +12,8 @@ import org.sopt.havit.databinding.FragmentEnterCategoryTitleBinding import org.sopt.havit.domain.model.NetworkStatus import org.sopt.havit.ui.base.BaseBindingFragment import org.sopt.havit.ui.share.AddCategoryViewModel +import org.sopt.havit.util.GoogleAnalyticsUtil +import org.sopt.havit.util.GoogleAnalyticsUtil.ADD_CATEGORY import org.sopt.havit.util.KeyBoardUtil import org.sopt.havit.util.KeyBoardUtil.setUpAsSoftKeyboard import org.sopt.havit.util.setOnSingleClickListener @@ -34,6 +36,7 @@ class EnterCategoryTitleFragment : setKeyBoardState() toolbarClickListener() setUpAsSoftKeyboard(view) // 다음버튼 위/아래 움직이게 + setScreenEventLogging() } private fun getExistingCategoryList() { @@ -87,4 +90,8 @@ class EnterCategoryTitleFragment : KeyBoardUtil.openKeyBoard(requireContext(), binding.etCategoryTitle) else KeyBoardUtil.hideKeyBoard(requireActivity()) } + + private fun setScreenEventLogging() { + GoogleAnalyticsUtil.logScreenEvent(ADD_CATEGORY) + } } diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index 5f430859d..dd8307460 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -15,8 +15,9 @@ object GoogleAnalyticsUtil { // parameter private const val CONTENT_CHECK = "click_content_check" - private const val SCREEN_TIME = "content_screen_time" + private const val SCREEN_TIME = "screen_time" private const val SITE_NUM = "site_num" + private const val ICON_NUM = "icon_num" // save contents const val SELECT_CATEGORY = "select_category" @@ -92,9 +93,16 @@ object GoogleAnalyticsUtil { if (IS_PROD) { Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) val params = Bundle().apply { - putString(SITE_NUM, siteNum.toString()) + putInt(SITE_NUM, siteNum) } Firebase.analytics.logEvent(contentName, params) } } + + fun logClickEventOnAddCategory(iconNum: Int) { + val params = Bundle().apply { + putInt(ICON_NUM, iconNum) + } + Firebase.analytics.logEvent(CLICK_COMPLETE_SELECT_ICON, params) + } } From afb6a763763d181d66eb4e975af3077987b49cf5 Mon Sep 17 00:00:00 2001 From: kxxhyorim Date: Tue, 18 Apr 2023 23:22:06 +0900 Subject: [PATCH 13/16] [FEAT] userProperty OS_TYPE, ANDROID (#828) --- .../sopt/havit/util/GoogleAnalyticsUtil.kt | 102 ++++++++---------- 1 file changed, 47 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index dd8307460..fca6d052a 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -5,13 +5,53 @@ import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.analytics.ktx.logEvent import com.google.firebase.ktx.Firebase -import org.sopt.havit.BuildConfig.IS_PROD object GoogleAnalyticsUtil { // property - private const val STATUS_INSTALLED = "installed" - private const val ANALYTICS_USER_PROP = "app_type" + private const val OS_TYPE = "os_type" + private const val ANDROID = "android" + + init { + Firebase.analytics.setUserProperty(OS_TYPE, ANDROID) + } + + fun logScreenEvent(screenName: String) { + Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { + param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) + } + } + + fun logClickEvent(contentName: String) { + Firebase.analytics.logEvent(contentName, null) + } + + fun logClickEventWithContentCheck(contentName: String, contentCheck: Boolean) { + val params = Bundle().apply { + putBoolean(CONTENT_CHECK, contentCheck) + } + Firebase.analytics.logEvent(contentName, params) + } + + fun logScreenDurationTimeEvent(contentName: String, durationTime: Long) { + Firebase.analytics.logEvent(contentName) { + param(SCREEN_TIME, durationTime) + } + } + + fun logClickEventWithRecommendedSiteNum(contentName: String, siteNum: Int) { + val params = Bundle().apply { + putInt(SITE_NUM, siteNum) + } + Firebase.analytics.logEvent(contentName, params) + } + + fun logClickEventOnAddCategory(iconNum: Int) { + val params = Bundle().apply { + putInt(ICON_NUM, iconNum) + } + Firebase.analytics.logEvent(CLICK_COMPLETE_SELECT_ICON, params) + } // parameter private const val CONTENT_CHECK = "click_content_check" @@ -33,16 +73,19 @@ object GoogleAnalyticsUtil { const val SELECT_ICON = "select_icon" const val CLICK_COMPLETE_SELECT_ICON = "click_complete_select_icon" + // mypage const val CLICK_MY_CATEGORY = "click_my_category" const val CLICK_MY_CONTENT = "click_my_content" const val CLICK_CHECKED_CONTENT = "click_checked_content" + + // webview const val CLICK_GO_BACK = "click_go_back" const val CLICK_REFRESH = "click_refresh" const val CLICK_SHARE = "click_share" const val CLICK_CONTENT_CHECK = "click_content_check" const val CONTENT_SCREEN_TIME = "content_screen_time" - // 홈 + // home const val CLICK_MUST_SEE_CONTENT = "click_must_see_content" const val CLICK_SEARCH_CONTENT = "click_search_content" const val CLICK_WHOLE_CATEGORY = "click_whole_category" @@ -54,55 +97,4 @@ object GoogleAnalyticsUtil { const val GNB_MYPAGE = "gnb_mypage" const val GNB_ADD_CONTENT = "gnb_add_content" - fun logScreenEvent(screenName: String) { - if (IS_PROD) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) - Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { - param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) - } - } - } - - fun logClickEvent(contentName: String) { - if (IS_PROD) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) - Firebase.analytics.logEvent(contentName, null) - } - } - - fun logClickEventWithContentCheck(contentName: String, contentCheck: Boolean) { - if (IS_PROD) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) - val params = Bundle().apply { - putBoolean(CONTENT_CHECK, contentCheck) - } - Firebase.analytics.logEvent(contentName, params) - } - } - - fun logScreenDurationTimeEvent(contentName: String, durationTime: Long) { - if (IS_PROD) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) - Firebase.analytics.logEvent(contentName) { - param(SCREEN_TIME, durationTime) - } - } - } - - fun logClickEventWithRecommendedSiteNum(contentName: String, siteNum: Int) { - if (IS_PROD) { - Firebase.analytics.setUserProperty(ANALYTICS_USER_PROP, STATUS_INSTALLED) - val params = Bundle().apply { - putInt(SITE_NUM, siteNum) - } - Firebase.analytics.logEvent(contentName, params) - } - } - - fun logClickEventOnAddCategory(iconNum: Int) { - val params = Bundle().apply { - putInt(ICON_NUM, iconNum) - } - Firebase.analytics.logEvent(CLICK_COMPLETE_SELECT_ICON, params) - } } From e34f8d17293dc97730673c0f5e5e5c25b0bb7a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=82=E1=85=A1=E1=84=8B?= =?UTF-8?q?=E1=85=A7=E1=86=BC?= Date: Wed, 19 Apr 2023 14:13:08 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[FIX]=20=EC=B6=94=EC=B2=9C=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EC=9B=B9=EB=B7=B0=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B3=B5=EC=9C=A0=ED=95=98=EA=B8=B0=20=EC=98=81=EC=97=AD=20?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94=20(#830)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt | 4 ++-- app/src/main/res/layout/activity_web.xml | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt index aacfd53a8..975314af0 100644 --- a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt +++ b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt @@ -3,11 +3,11 @@ package org.sopt.havit.ui.web import android.content.Intent import android.os.Bundle import android.os.SystemClock +import android.view.View.GONE import android.view.animation.AnimationUtils import android.webkit.* import android.widget.Toast import androidx.activity.viewModels -import androidx.core.view.isVisible import com.bumptech.glide.Glide import dagger.hilt.android.AndroidEntryPoint import org.sopt.havit.R @@ -46,7 +46,7 @@ class WebActivity : BaseBindingActivity(R.layout.activity_we private fun initHavitSeen() { if (intent.getIntExtra("contentsId", -1) == -1) { - binding.llWebBottom.isVisible = false + binding.llWebview.visibility = GONE } if (!intent.getBooleanExtra("isSeen", false)) { Glide.with(this).load(R.drawable.ic_contents_unread).into(binding.ivWebviewUnread) diff --git a/app/src/main/res/layout/activity_web.xml b/app/src/main/res/layout/activity_web.xml index 092cd8f02..a7aa894e2 100644 --- a/app/src/main/res/layout/activity_web.xml +++ b/app/src/main/res/layout/activity_web.xml @@ -1,7 +1,6 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -98,7 +97,7 @@ @@ -113,7 +112,7 @@ - \ No newline at end of file + From 2a273d04e413f9b264c5456b69dc2fba27dbbe24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=82=E1=85=A1=E1=84=8B?= =?UTF-8?q?=E1=85=A7=E1=86=BC?= Date: Thu, 20 Apr 2023 11:31:10 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[FIX]=20durationTime=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84=20(#832)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/havit/ui/web/WebActivity.kt | 19 ++++++++++--------- .../sopt/havit/util/GoogleAnalyticsUtil.kt | 7 ++++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt index 975314af0..0f61cc59d 100644 --- a/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt +++ b/app/src/main/java/org/sopt/havit/ui/web/WebActivity.kt @@ -25,14 +25,14 @@ import org.sopt.havit.util.GoogleAnalyticsUtil.CONTENT_SCREEN_TIME class WebActivity : BaseBindingActivity(R.layout.activity_web) { private val webViewModel: WebViewModel by viewModels() - private var startTime: Long = 0 - private var endTime: Long = 0 + private var startTime: Int = 0 + private var endTime: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) binding.vm = webViewModel - startTime = SystemClock.elapsedRealtime() + startTime = SystemClock.elapsedRealtime().toInt() initIsHavit() initHavitSeen() setUrlCheck() @@ -113,6 +113,7 @@ class WebActivity : BaseBindingActivity(R.layout.activity_we webViewModel.setHavit(intent!!.getIntExtra("contentsId", 0)) } binding.ibWebBack.setOnClickListener { + setWebViewDurationTimeLogging() GoogleAnalyticsUtil.logClickEvent(CLICK_GO_BACK) finish() } @@ -146,16 +147,16 @@ class WebActivity : BaseBindingActivity(R.layout.activity_we toast.show() } + private fun setWebViewDurationTimeLogging() { + endTime = SystemClock.elapsedRealtime().toInt() + GoogleAnalyticsUtil.logScreenDurationTimeEvent(CONTENT_SCREEN_TIME, endTime - startTime) + } + override fun onBackPressed() { super.onBackPressed() super.finish() + setWebViewDurationTimeLogging() GoogleAnalyticsUtil.logClickEvent(CLICK_GO_BACK) } - override fun onDestroy() { - super.onDestroy() - endTime = SystemClock.elapsedRealtime() - GoogleAnalyticsUtil.logScreenDurationTimeEvent(CONTENT_SCREEN_TIME, endTime - startTime) - } - } diff --git a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt index fca6d052a..4f9e9e4a4 100644 --- a/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt +++ b/app/src/main/java/org/sopt/havit/util/GoogleAnalyticsUtil.kt @@ -33,10 +33,11 @@ object GoogleAnalyticsUtil { Firebase.analytics.logEvent(contentName, params) } - fun logScreenDurationTimeEvent(contentName: String, durationTime: Long) { - Firebase.analytics.logEvent(contentName) { - param(SCREEN_TIME, durationTime) + fun logScreenDurationTimeEvent(contentName: String, durationTime: Int) { + val params = Bundle().apply { + putInt(SCREEN_TIME, durationTime) } + Firebase.analytics.logEvent(contentName, params) } fun logClickEventWithRecommendedSiteNum(contentName: String, siteNum: Int) { From 01e84714f04ce2c7bd386671445a814662bc45b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A1=E1=86=AB=E1=84=82=E1=85=A1=E1=84=8B?= =?UTF-8?q?=E1=85=A7=E1=86=BC?= Date: Sat, 22 Apr 2023 18:09:36 +0900 Subject: [PATCH 16/16] [CHORE] version code, name v1.0.3 -> v1.0.4 (#834) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a99e22b7a..9d1c672c0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { applicationId "org.sopt.havit" minSdk 23 targetSdk 31 - versionCode 103 - versionName "1.0.3" + versionCode 104 + versionName "1.0.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField("String", "HAVIT_BASE_URL_DEV", properties["HAVIT_BASE_URL_DEV"]) buildConfigField("String", "HAVIT_BASE_URL_PROD", properties["HAVIT_BASE_URL_PROD"])