Skip to content

Commit 2af9c83

Browse files
coolteyWilliamrai
andauthored
YiR: wire up instrumentation (#6062)
* YiR: wire up instrumentation * Add events for slides * Put slide names to screen data functions * Fix * Wire up click actions * Only send impression for the current slide * Fix lint * Update after discussion * Wire up survey * highlight share * Code review comment * Avoid sending multiple events * Finalized instrumentation --------- Co-authored-by: William Rai <[email protected]>
1 parent 5ca0e83 commit 2af9c83

18 files changed

+302
-60
lines changed

app/src/main/java/org/wikipedia/activity/SingleWebViewActivity.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.wikipedia.Constants
2222
import org.wikipedia.R
2323
import org.wikipedia.WikipediaApp
2424
import org.wikipedia.analytics.eventplatform.DonorExperienceEvent
25+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
2526
import org.wikipedia.bridge.JavaScriptActionHandler
2627
import org.wikipedia.databinding.ActivitySingleWebViewBinding
2728
import org.wikipedia.dataclient.SharedPreferenceCookieManager
@@ -36,6 +37,7 @@ import org.wikipedia.page.PageViewModel
3637
import org.wikipedia.staticdata.MainPageNameData
3738
import org.wikipedia.util.StringUtil
3839
import org.wikipedia.util.UriUtil
40+
import org.wikipedia.yearinreview.YearInReviewViewModel
3941

4042
class SingleWebViewActivity : BaseActivity() {
4143
private lateinit var binding: ActivitySingleWebViewBinding
@@ -177,8 +179,23 @@ class SingleWebViewActivity : BaseActivity() {
177179
}
178180

179181
private fun goBack() {
180-
if (intent.getStringExtra(EXTRA_PAGE_CONTENT_INFO).orEmpty() == PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE) {
181-
DonorExperienceEvent.logAction("article_return_click", "webpay_processed")
182+
if (!intent.getStringExtra(EXTRA_PAGE_CONTENT_INFO).isNullOrEmpty()) {
183+
val extraPageContentInfo = intent.getStringExtra(EXTRA_PAGE_CONTENT_INFO)
184+
when (extraPageContentInfo) {
185+
PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE -> {
186+
DonorExperienceEvent.logAction("article_return_click", "webpay_processed")
187+
}
188+
PAGE_CONTENT_SOURCE_YIR -> {
189+
YearInReviewViewModel.currentCampaignId?.let { campaignId ->
190+
YearInReviewEvent.submit(
191+
action = "article_return_click",
192+
slide = "webpay_processed",
193+
campaignId = campaignId
194+
)
195+
}
196+
}
197+
else -> { }
198+
}
182199
}
183200
pageTitleToLoadOnBackPress?.let {
184201
val entry = HistoryEntry(it, HistoryEntry.SOURCE_SINGLE_WEBVIEW)
@@ -208,6 +225,7 @@ class SingleWebViewActivity : BaseActivity() {
208225
const val EXTRA_SHOW_BACK_BUTTON = "goBack"
209226
const val EXTRA_PAGE_CONTENT_INFO = "pageContentInfo"
210227
const val PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE = "donorExperience"
228+
const val PAGE_CONTENT_SOURCE_YIR = "yearInReview"
211229
const val EXTRA_IS_WEB_FORM = "isWebForm"
212230

213231
fun newIntent(context: Context, url: String, showBackButton: Boolean = false, pageTitleToLoadOnBackPress: PageTitle? = null,
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.wikipedia.analytics.eventplatform
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
import org.wikipedia.WikipediaApp
6+
import org.wikipedia.dataclient.donate.CampaignCollection
7+
import org.wikipedia.json.JsonUtil
8+
9+
open class YearInReviewEvent {
10+
11+
companion object {
12+
fun submit(
13+
action: String,
14+
activeInterface: String = "wiki_yir",
15+
groupAssigned: String? = null,
16+
campaignId: String? = null,
17+
slide: String? = null,
18+
feedbackSelect: Int? = null,
19+
feedbackText: String? = null,
20+
wikiId: String = WikipediaApp.instance.appOrSystemLanguageCode
21+
) {
22+
EventPlatformClient.submit(
23+
AppInteractionEvent(
24+
action = action,
25+
active_interface = activeInterface,
26+
action_data = JsonUtil.encodeToString(ActionData(
27+
campaignId = campaignId?.let {
28+
CampaignCollection.getFormattedCampaignId(it)
29+
},
30+
groupAssigned = groupAssigned,
31+
slide = slide,
32+
feedbackSelect = feedbackSelect,
33+
feedbackText = feedbackText
34+
)).orEmpty(),
35+
primary_language = WikipediaApp.instance.languageState.appLanguageCode,
36+
wiki_id = wikiId,
37+
streamName = "app_donor_experience"
38+
)
39+
)
40+
}
41+
}
42+
43+
@Serializable
44+
class ActionData(
45+
val slide: String? = null,
46+
@SerialName("campaign_id") val campaignId: String? = null,
47+
@SerialName("group_assigned") val groupAssigned: String? = null,
48+
@SerialName("feedback_select") val feedbackSelect: Int? = null,
49+
@SerialName("feedback_text") val feedbackText: String? = null
50+
)
51+
}

app/src/main/java/org/wikipedia/createaccount/CreateAccountActivity.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ import org.wikipedia.R
2424
import org.wikipedia.WikipediaApp
2525
import org.wikipedia.activity.BaseActivity
2626
import org.wikipedia.analytics.eventplatform.CreateAccountEvent
27+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
2728
import org.wikipedia.auth.AccountUtil
2829
import org.wikipedia.captcha.CaptchaHandler
2930
import org.wikipedia.captcha.CaptchaResult
3031
import org.wikipedia.databinding.ActivityCreateAccountBinding
32+
import org.wikipedia.login.LoginActivity
3133
import org.wikipedia.util.DeviceUtil
3234
import org.wikipedia.util.FeedbackUtil
3335
import org.wikipedia.util.StringUtil
@@ -46,6 +48,7 @@ class CreateAccountActivity : BaseActivity() {
4648
private lateinit var createAccountEvent: CreateAccountEvent
4749
private var wiki = WikipediaApp.instance.wikiSite
4850
private var userNameTextWatcher: TextWatcher? = null
51+
private var requestSource: String = ""
4952
private val viewModel: CreateAccountActivityViewModel by viewModels()
5053

5154
public override fun onCreate(savedInstanceState: Bundle?) {
@@ -60,7 +63,8 @@ class CreateAccountActivity : BaseActivity() {
6063
// Don't allow user to continue when they're shown a captcha until they fill it in
6164
NonEmptyValidator(binding.captchaContainer.captchaSubmitButton, binding.captchaContainer.captchaText)
6265
setClickListeners()
63-
createAccountEvent = CreateAccountEvent(intent.getStringExtra(LOGIN_REQUEST_SOURCE).orEmpty())
66+
requestSource = intent.getStringExtra(LOGIN_REQUEST_SOURCE).orEmpty()
67+
createAccountEvent = CreateAccountEvent(requestSource)
6468
// Only send the editing start log event if the activity is created for the first time
6569
if (savedInstanceState == null) {
6670
createAccountEvent.logStart()
@@ -151,12 +155,18 @@ class CreateAccountActivity : BaseActivity() {
151155
}
152156
binding.viewCreateAccountError.retryClickListener = View.OnClickListener { binding.viewCreateAccountError.visibility = View.GONE }
153157
binding.createAccountSubmitButton.setOnClickListener {
158+
if (requestSource == LoginActivity.SOURCE_YEAR_IN_REVIEW) {
159+
YearInReviewEvent.submit(action = "create_account_click", slide = "explore_prompt")
160+
}
154161
validateThenCreateAccount()
155162
}
156163
binding.captchaContainer.captchaSubmitButton.setOnClickListener {
157164
validateThenCreateAccount()
158165
}
159166
binding.createAccountLoginButton.setOnClickListener {
167+
if (requestSource == LoginActivity.SOURCE_YEAR_IN_REVIEW) {
168+
YearInReviewEvent.submit(action = "login_click", slide = "explore_prompt")
169+
}
160170
// This assumes that the CreateAccount activity was launched from the Login activity
161171
// (since there's currently no other mechanism to invoke CreateAccountActivity),
162172
// so finishing this activity will implicitly go back to Login.

app/src/main/java/org/wikipedia/donate/DonateDialog.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,20 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() {
3737
_binding = DialogDonateBinding.inflate(inflater, container, false)
3838
campaignId = arguments?.getString(ARG_CAMPAIGN_ID)
3939

40+
val activeInterface = if (arguments?.getBoolean(ARG_FROM_YIR) == true) {
41+
"wiki_yir"
42+
} else {
43+
if (campaignId.isNullOrEmpty()) "setting" else "article_banner"
44+
}
45+
4046
binding.donateOtherButton.setOnClickListener {
41-
DonorExperienceEvent.logAction("webpay_click", if (campaignId.isNullOrEmpty()) "setting" else "article_banner", campaignId = campaignId)
47+
DonorExperienceEvent.logAction("webpay_click", activeInterface, campaignId = campaignId)
4248
onDonateClicked()
4349
}
4450

4551
binding.donateGooglePayButton.setOnClickListener {
4652
invalidateCampaign()
47-
DonorExperienceEvent.logAction("gpay_click", if (campaignId.isNullOrEmpty()) "setting" else "article_banner", campaignId = campaignId)
53+
DonorExperienceEvent.logAction("gpay_click", activeInterface, campaignId = campaignId)
4854
(requireActivity() as? BaseActivity)?.launchDonateActivity(
4955
GooglePayComponent.getDonateActivityIntent(requireActivity(), campaignId, arguments?.getString(ARG_DONATE_URL)))
5056
}
@@ -96,7 +102,7 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() {
96102
}
97103

98104
private fun onDonateClicked() {
99-
launchDonateLink(requireContext(), url = arguments?.getString(ARG_DONATE_URL))
105+
launchDonateLink(requireContext(), url = arguments?.getString(ARG_DONATE_URL), campaignId = campaignId)
100106
invalidateCampaign()
101107
dismiss()
102108
}
@@ -147,13 +153,15 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() {
147153
const val ARG_CAMPAIGN_ID = "campaignId"
148154
const val ARG_DONATE_URL = "donateUrl"
149155
const val ARG_FROM_DONATION_REMINDER = "fromDonationReminder"
156+
const val ARG_FROM_YIR = "fromYiR"
150157

151-
fun newInstance(campaignId: String? = null, donateUrl: String? = null, fromDonationReminder: Boolean = false): DonateDialog {
158+
fun newInstance(campaignId: String? = null, donateUrl: String? = null, fromDonationReminder: Boolean = false, fromYiR: Boolean = false): DonateDialog {
152159
return DonateDialog().apply {
153160
arguments = bundleOf(
154161
ARG_CAMPAIGN_ID to campaignId,
155162
ARG_DONATE_URL to donateUrl,
156-
ARG_FROM_DONATION_REMINDER to fromDonationReminder
163+
ARG_FROM_DONATION_REMINDER to fromDonationReminder,
164+
ARG_FROM_YIR to fromYiR,
157165
)
158166
}
159167
}

app/src/main/java/org/wikipedia/navtab/MenuNavTabDialog.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.wikipedia.analytics.eventplatform.ActivityTabEvent
1313
import org.wikipedia.analytics.eventplatform.BreadCrumbLogEvent
1414
import org.wikipedia.analytics.eventplatform.DonorExperienceEvent
1515
import org.wikipedia.analytics.eventplatform.PlacesEvent
16+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
1617
import org.wikipedia.auth.AccountUtil
1718
import org.wikipedia.databinding.ViewMainDrawerBinding
1819
import org.wikipedia.page.ExtendedBottomSheetDialogFragment
@@ -38,10 +39,16 @@ class MenuNavTabDialog : ExtendedBottomSheetDialogFragment() {
3839
private var _binding: ViewMainDrawerBinding? = null
3940
private val binding get() = _binding!!
4041

42+
private val yirEntrySlide get() = if (AccountUtil.isLoggedIn) "li_profile" else "lo_profile"
43+
private val yirEnabled get() = YearInReviewViewModel.isAccessible && Prefs.isYearInReviewEnabled
44+
4145
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
4246
_binding = ViewMainDrawerBinding.inflate(inflater, container, false)
4347

44-
binding.mainDrawerYearInReviewContainer.isVisible = YearInReviewViewModel.isAccessible && Prefs.isYearInReviewEnabled
48+
if (yirEnabled) {
49+
YearInReviewEvent.submit(action = "impression", slide = yirEntrySlide)
50+
}
51+
binding.mainDrawerYearInReviewContainer.isVisible = yirEnabled
4552

4653
binding.mainDrawerAccountContainer.setOnClickListener {
4754
BreadCrumbLogEvent.logClick(requireActivity(), binding.mainDrawerAccountContainer)
@@ -91,6 +98,7 @@ class MenuNavTabDialog : ExtendedBottomSheetDialogFragment() {
9198
}
9299

93100
binding.mainDrawerYearInReviewContainer.setOnClickListener {
101+
YearInReviewEvent.submit(action = "start_click", slide = yirEntrySlide)
94102
callback()?.yearInReviewClick()
95103
dismiss()
96104
}

app/src/main/java/org/wikipedia/page/PageActivity.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import org.wikipedia.activity.BaseActivity
4040
import org.wikipedia.activity.SingleWebViewActivity
4141
import org.wikipedia.analytics.eventplatform.BreadCrumbLogEvent
4242
import org.wikipedia.analytics.eventplatform.DonorExperienceEvent
43+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
4344
import org.wikipedia.auth.AccountUtil
4445
import org.wikipedia.commons.FilePageActivity
4546
import org.wikipedia.concurrency.FlowEventBus
@@ -87,6 +88,7 @@ import org.wikipedia.views.ObservableWebView
8788
import org.wikipedia.views.ViewUtil
8889
import org.wikipedia.watchlist.WatchlistExpiry
8990
import org.wikipedia.yearinreview.YearInReviewDialog
91+
import org.wikipedia.yearinreview.YearInReviewViewModel
9092
import java.util.Locale
9193

9294
class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.LoadPageCallback, FrameLayoutNavMenuTriggerer.Callback {
@@ -549,10 +551,17 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo
549551
// Check if the donation started from the app, but completed via web, in which case
550552
// show it in a SingleWebViewActivity.
551553
val campaign = uri.getQueryParameter("wmf_campaign")
554+
552555
if (campaign != null && campaign == "Android") {
553-
DonorExperienceEvent.logAction("impression", "webpay_processed", wiki.languageCode)
556+
var pageContentInfo = SingleWebViewActivity.PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE
557+
YearInReviewViewModel.currentCampaignId?.let { campaignId ->
558+
YearInReviewEvent.submit(action = "impression", slide = "webpay_processed", campaignId = campaignId)
559+
pageContentInfo = SingleWebViewActivity.PAGE_CONTENT_SOURCE_YIR
560+
} ?: run {
561+
DonorExperienceEvent.logAction("impression", "webpay_processed", wiki.languageCode)
562+
}
554563
startActivity(SingleWebViewActivity.newIntent(this@PageActivity, uri.toString(),
555-
true, pageFragment.title, SingleWebViewActivity.PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE))
564+
true, pageFragment.title, pageContentInfo))
556565
finish()
557566
return
558567
}

app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import org.wikipedia.R
4343
import org.wikipedia.activity.BaseActivity
4444
import org.wikipedia.analytics.eventplatform.ReadingListsAnalyticsHelper
4545
import org.wikipedia.analytics.eventplatform.RecommendedReadingListEvent
46+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
4647
import org.wikipedia.auth.AccountUtil
4748
import org.wikipedia.concurrency.FlowEventBus
4849
import org.wikipedia.databinding.FragmentReadingListBinding
@@ -530,6 +531,7 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial
530531

531532
ReadingListMode.YEAR_IN_REVIEW -> {
532533
if (readingList == null) {
534+
YearInReviewEvent.submit(action = "impression", slide = "reading_list_create")
533535
viewModel.generateYearInReviewReadingList(AccountUtil.userName)
534536
} else {
535537
update()

app/src/main/java/org/wikipedia/settings/AppIconDialog.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.google.android.flexbox.FlexDirection
1212
import com.google.android.flexbox.FlexboxLayoutManager
1313
import com.google.android.flexbox.JustifyContent
1414
import org.wikipedia.R
15+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
1516
import org.wikipedia.appshortcuts.AppShortcuts
1617
import org.wikipedia.databinding.DialogAppIconBinding
1718
import org.wikipedia.databinding.ItemAppIconBinding
@@ -33,6 +34,8 @@ class AppIconDialog : ExtendedBottomSheetDialogFragment() {
3334
}
3435
binding.appIconRecyclerView.adapter = AppIconAdapter(LauncherIcon.entries).apply {
3536
onItemClickListener = { icon ->
37+
val eventAction = if (icon == LauncherIcon.DEFAULT) "icon_deactivate_click" else "icon_activate_click"
38+
YearInReviewEvent.submit(action = eventAction, slide = "setting")
3639
Prefs.selectedAppIcon = icon.key
3740
LauncherController.setIcon(icon)
3841
AppShortcuts.setShortcuts(requireContext())

app/src/main/java/org/wikipedia/settings/SettingsPreferenceLoader.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.wikipedia.Constants
1212
import org.wikipedia.R
1313
import org.wikipedia.WikipediaApp
1414
import org.wikipedia.analytics.eventplatform.RecommendedReadingListEvent
15+
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
1516
import org.wikipedia.auth.AccountUtil
1617
import org.wikipedia.donate.DonateUtil
1718
import org.wikipedia.donate.donationreminder.DonationReminderActivity
@@ -69,21 +70,31 @@ internal class SettingsPreferenceLoader(fragment: PreferenceFragmentCompat) : Ba
6970

7071
findPreference(R.string.preference_key_year_in_review_is_enabled).let {
7172
it.isVisible = YearInReviewViewModel.isAccessible
73+
if (it.isVisible) {
74+
YearInReviewEvent.submit(action = "impression", slide = "setting")
75+
}
7276
it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, newValue ->
7377
if (newValue as Boolean) {
78+
YearInReviewEvent.submit(action = "yir_on_click", slide = "setting")
7479
return@OnPreferenceChangeListener true
7580
}
81+
YearInReviewEvent.submit(action = "yir_off_click", slide = "setting")
7682
MaterialAlertDialogBuilder(activity)
7783
.setTitle(R.string.year_in_review_disable_title)
7884
.setMessage(R.string.year_in_review_setting_subtitle)
7985
.setPositiveButton(R.string.year_in_review_disable_positive_button) { _, _ ->
86+
YearInReviewEvent.submit(action = "yir_off_confirm_click", slide = "setting")
8087
Prefs.yearInReviewModelData = emptyMap()
81-
YearInReviewViewModel.updateYearInReviewModel { it.copy(slideViewedCount = 0) }
88+
YearInReviewViewModel.updateYearInReviewModel { model ->
89+
model.copy(slideViewedCount = 0)
90+
}
8291
Prefs.yearInReviewReadingListSurveyShown = false
8392
Prefs.yearInReviewReadingListVisitCount = 0
8493
(preference as SwitchPreferenceCompat).isChecked = false
8594
}
86-
.setNegativeButton(R.string.year_in_review_disable_negative_button, null)
95+
.setNegativeButton(R.string.year_in_review_disable_negative_button) { _, _ ->
96+
YearInReviewEvent.submit(action = "yir_off_cancel_click", slide = "setting")
97+
}
8798
.show()
8899
false
89100
}

0 commit comments

Comments
 (0)