Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import org.wikipedia.Constants
import org.wikipedia.R
import org.wikipedia.WikipediaApp
import org.wikipedia.analytics.eventplatform.DonorExperienceEvent
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.bridge.JavaScriptActionHandler
import org.wikipedia.databinding.ActivitySingleWebViewBinding
import org.wikipedia.dataclient.SharedPreferenceCookieManager
Expand All @@ -36,6 +37,7 @@ import org.wikipedia.page.PageViewModel
import org.wikipedia.staticdata.MainPageNameData
import org.wikipedia.util.StringUtil
import org.wikipedia.util.UriUtil
import org.wikipedia.yearinreview.YearInReviewViewModel

class SingleWebViewActivity : BaseActivity() {
private lateinit var binding: ActivitySingleWebViewBinding
Expand Down Expand Up @@ -177,8 +179,23 @@ class SingleWebViewActivity : BaseActivity() {
}

private fun goBack() {
if (intent.getStringExtra(EXTRA_PAGE_CONTENT_INFO).orEmpty() == PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE) {
DonorExperienceEvent.logAction("article_return_click", "webpay_processed")
if (!intent.getStringExtra(EXTRA_PAGE_CONTENT_INFO).isNullOrEmpty()) {
val extraPageContentInfo = intent.getStringExtra(EXTRA_PAGE_CONTENT_INFO)
when (extraPageContentInfo) {
PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE -> {
DonorExperienceEvent.logAction("article_return_click", "webpay_processed")
}
PAGE_CONTENT_SOURCE_YIR -> {
YearInReviewViewModel.currentCampaignId?.let { campaignId ->
YearInReviewEvent.submit(
action = "article_return_click",
slide = "webpay_processed",
campaignId = campaignId
)
}
}
else -> { }
}
}
pageTitleToLoadOnBackPress?.let {
val entry = HistoryEntry(it, HistoryEntry.SOURCE_SINGLE_WEBVIEW)
Expand Down Expand Up @@ -208,6 +225,7 @@ class SingleWebViewActivity : BaseActivity() {
const val EXTRA_SHOW_BACK_BUTTON = "goBack"
const val EXTRA_PAGE_CONTENT_INFO = "pageContentInfo"
const val PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE = "donorExperience"
const val PAGE_CONTENT_SOURCE_YIR = "yearInReview"
const val EXTRA_IS_WEB_FORM = "isWebForm"

fun newIntent(context: Context, url: String, showBackButton: Boolean = false, pageTitleToLoadOnBackPress: PageTitle? = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.wikipedia.analytics.eventplatform

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import org.wikipedia.WikipediaApp
import org.wikipedia.dataclient.donate.CampaignCollection
import org.wikipedia.json.JsonUtil

open class YearInReviewEvent {

companion object {
fun submit(
action: String,
activeInterface: String = "wiki_yir",
groupAssigned: String? = null,
campaignId: String? = null,
slide: String? = null,
feedbackSelect: Int? = null,
feedbackText: String? = null,
wikiId: String = WikipediaApp.instance.appOrSystemLanguageCode
) {
EventPlatformClient.submit(
AppInteractionEvent(
action = action,
active_interface = activeInterface,
action_data = JsonUtil.encodeToString(ActionData(
campaignId = campaignId?.let {
CampaignCollection.getFormattedCampaignId(it)
},
groupAssigned = groupAssigned,
slide = slide,
feedbackSelect = feedbackSelect,
feedbackText = feedbackText
)).orEmpty(),
primary_language = WikipediaApp.instance.languageState.appLanguageCode,
wiki_id = wikiId,
streamName = "app_donor_experience"
)
)
}
}

@Serializable
class ActionData(
val slide: String? = null,
@SerialName("campaign_id") val campaignId: String? = null,
@SerialName("group_assigned") val groupAssigned: String? = null,
@SerialName("feedback_select") val feedbackSelect: Int? = null,
@SerialName("feedback_text") val feedbackText: String? = null
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ import org.wikipedia.R
import org.wikipedia.WikipediaApp
import org.wikipedia.activity.BaseActivity
import org.wikipedia.analytics.eventplatform.CreateAccountEvent
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.auth.AccountUtil
import org.wikipedia.captcha.CaptchaHandler
import org.wikipedia.captcha.CaptchaResult
import org.wikipedia.databinding.ActivityCreateAccountBinding
import org.wikipedia.login.LoginActivity
import org.wikipedia.util.DeviceUtil
import org.wikipedia.util.FeedbackUtil
import org.wikipedia.util.StringUtil
Expand All @@ -46,6 +48,7 @@ class CreateAccountActivity : BaseActivity() {
private lateinit var createAccountEvent: CreateAccountEvent
private var wiki = WikipediaApp.instance.wikiSite
private var userNameTextWatcher: TextWatcher? = null
private var requestSource: String = ""
private val viewModel: CreateAccountActivityViewModel by viewModels()

public override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -60,7 +63,8 @@ class CreateAccountActivity : BaseActivity() {
// Don't allow user to continue when they're shown a captcha until they fill it in
NonEmptyValidator(binding.captchaContainer.captchaSubmitButton, binding.captchaContainer.captchaText)
setClickListeners()
createAccountEvent = CreateAccountEvent(intent.getStringExtra(LOGIN_REQUEST_SOURCE).orEmpty())
requestSource = intent.getStringExtra(LOGIN_REQUEST_SOURCE).orEmpty()
createAccountEvent = CreateAccountEvent(requestSource)
// Only send the editing start log event if the activity is created for the first time
if (savedInstanceState == null) {
createAccountEvent.logStart()
Expand Down Expand Up @@ -151,12 +155,18 @@ class CreateAccountActivity : BaseActivity() {
}
binding.viewCreateAccountError.retryClickListener = View.OnClickListener { binding.viewCreateAccountError.visibility = View.GONE }
binding.createAccountSubmitButton.setOnClickListener {
if (requestSource == LoginActivity.SOURCE_YEAR_IN_REVIEW) {
YearInReviewEvent.submit(action = "create_account_click", slide = "explore_prompt")
}
validateThenCreateAccount()
}
binding.captchaContainer.captchaSubmitButton.setOnClickListener {
validateThenCreateAccount()
}
binding.createAccountLoginButton.setOnClickListener {
if (requestSource == LoginActivity.SOURCE_YEAR_IN_REVIEW) {
YearInReviewEvent.submit(action = "login_click", slide = "explore_prompt")
}
// This assumes that the CreateAccount activity was launched from the Login activity
// (since there's currently no other mechanism to invoke CreateAccountActivity),
// so finishing this activity will implicitly go back to Login.
Expand Down
18 changes: 13 additions & 5 deletions app/src/main/java/org/wikipedia/donate/DonateDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,20 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() {
_binding = DialogDonateBinding.inflate(inflater, container, false)
campaignId = arguments?.getString(ARG_CAMPAIGN_ID)

val activeInterface = if (arguments?.getBoolean(ARG_FROM_YIR) == true) {
"wiki_yir"
} else {
if (campaignId.isNullOrEmpty()) "setting" else "article_banner"
}

binding.donateOtherButton.setOnClickListener {
DonorExperienceEvent.logAction("webpay_click", if (campaignId.isNullOrEmpty()) "setting" else "article_banner", campaignId = campaignId)
DonorExperienceEvent.logAction("webpay_click", activeInterface, campaignId = campaignId)
onDonateClicked()
}

binding.donateGooglePayButton.setOnClickListener {
invalidateCampaign()
DonorExperienceEvent.logAction("gpay_click", if (campaignId.isNullOrEmpty()) "setting" else "article_banner", campaignId = campaignId)
DonorExperienceEvent.logAction("gpay_click", activeInterface, campaignId = campaignId)
(requireActivity() as? BaseActivity)?.launchDonateActivity(
GooglePayComponent.getDonateActivityIntent(requireActivity(), campaignId, arguments?.getString(ARG_DONATE_URL)))
}
Expand Down Expand Up @@ -96,7 +102,7 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() {
}

private fun onDonateClicked() {
launchDonateLink(requireContext(), url = arguments?.getString(ARG_DONATE_URL))
launchDonateLink(requireContext(), url = arguments?.getString(ARG_DONATE_URL), campaignId = campaignId)
invalidateCampaign()
dismiss()
}
Expand Down Expand Up @@ -147,13 +153,15 @@ class DonateDialog : ExtendedBottomSheetDialogFragment() {
const val ARG_CAMPAIGN_ID = "campaignId"
const val ARG_DONATE_URL = "donateUrl"
const val ARG_FROM_DONATION_REMINDER = "fromDonationReminder"
const val ARG_FROM_YIR = "fromYiR"

fun newInstance(campaignId: String? = null, donateUrl: String? = null, fromDonationReminder: Boolean = false): DonateDialog {
fun newInstance(campaignId: String? = null, donateUrl: String? = null, fromDonationReminder: Boolean = false, fromYiR: Boolean = false): DonateDialog {
return DonateDialog().apply {
arguments = bundleOf(
ARG_CAMPAIGN_ID to campaignId,
ARG_DONATE_URL to donateUrl,
ARG_FROM_DONATION_REMINDER to fromDonationReminder
ARG_FROM_DONATION_REMINDER to fromDonationReminder,
ARG_FROM_YIR to fromYiR,
)
}
}
Expand Down
10 changes: 9 additions & 1 deletion app/src/main/java/org/wikipedia/navtab/MenuNavTabDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import org.wikipedia.analytics.eventplatform.ActivityTabEvent
import org.wikipedia.analytics.eventplatform.BreadCrumbLogEvent
import org.wikipedia.analytics.eventplatform.DonorExperienceEvent
import org.wikipedia.analytics.eventplatform.PlacesEvent
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.auth.AccountUtil
import org.wikipedia.databinding.ViewMainDrawerBinding
import org.wikipedia.page.ExtendedBottomSheetDialogFragment
Expand All @@ -38,10 +39,16 @@ class MenuNavTabDialog : ExtendedBottomSheetDialogFragment() {
private var _binding: ViewMainDrawerBinding? = null
private val binding get() = _binding!!

private val yirEntrySlide get() = if (AccountUtil.isLoggedIn) "li_profile" else "lo_profile"
private val yirEnabled get() = YearInReviewViewModel.isAccessible && Prefs.isYearInReviewEnabled

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = ViewMainDrawerBinding.inflate(inflater, container, false)

binding.mainDrawerYearInReviewContainer.isVisible = YearInReviewViewModel.isAccessible && Prefs.isYearInReviewEnabled
if (yirEnabled) {
YearInReviewEvent.submit(action = "impression", slide = yirEntrySlide)
}
binding.mainDrawerYearInReviewContainer.isVisible = yirEnabled

binding.mainDrawerAccountContainer.setOnClickListener {
BreadCrumbLogEvent.logClick(requireActivity(), binding.mainDrawerAccountContainer)
Expand Down Expand Up @@ -91,6 +98,7 @@ class MenuNavTabDialog : ExtendedBottomSheetDialogFragment() {
}

binding.mainDrawerYearInReviewContainer.setOnClickListener {
YearInReviewEvent.submit(action = "start_click", slide = yirEntrySlide)
callback()?.yearInReviewClick()
dismiss()
}
Expand Down
13 changes: 11 additions & 2 deletions app/src/main/java/org/wikipedia/page/PageActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import org.wikipedia.activity.BaseActivity
import org.wikipedia.activity.SingleWebViewActivity
import org.wikipedia.analytics.eventplatform.BreadCrumbLogEvent
import org.wikipedia.analytics.eventplatform.DonorExperienceEvent
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.auth.AccountUtil
import org.wikipedia.commons.FilePageActivity
import org.wikipedia.concurrency.FlowEventBus
Expand Down Expand Up @@ -87,6 +88,7 @@ import org.wikipedia.views.ObservableWebView
import org.wikipedia.views.ViewUtil
import org.wikipedia.watchlist.WatchlistExpiry
import org.wikipedia.yearinreview.YearInReviewDialog
import org.wikipedia.yearinreview.YearInReviewViewModel
import java.util.Locale

class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.LoadPageCallback, FrameLayoutNavMenuTriggerer.Callback {
Expand Down Expand Up @@ -549,10 +551,17 @@ class PageActivity : BaseActivity(), PageFragment.Callback, LinkPreviewDialog.Lo
// Check if the donation started from the app, but completed via web, in which case
// show it in a SingleWebViewActivity.
val campaign = uri.getQueryParameter("wmf_campaign")

if (campaign != null && campaign == "Android") {
DonorExperienceEvent.logAction("impression", "webpay_processed", wiki.languageCode)
var pageContentInfo = SingleWebViewActivity.PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE
YearInReviewViewModel.currentCampaignId?.let { campaignId ->
YearInReviewEvent.submit(action = "impression", slide = "webpay_processed", campaignId = campaignId)
pageContentInfo = SingleWebViewActivity.PAGE_CONTENT_SOURCE_YIR
} ?: run {
DonorExperienceEvent.logAction("impression", "webpay_processed", wiki.languageCode)
}
startActivity(SingleWebViewActivity.newIntent(this@PageActivity, uri.toString(),
true, pageFragment.title, SingleWebViewActivity.PAGE_CONTENT_SOURCE_DONOR_EXPERIENCE))
true, pageFragment.title, pageContentInfo))
finish()
return
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import org.wikipedia.R
import org.wikipedia.activity.BaseActivity
import org.wikipedia.analytics.eventplatform.ReadingListsAnalyticsHelper
import org.wikipedia.analytics.eventplatform.RecommendedReadingListEvent
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.auth.AccountUtil
import org.wikipedia.concurrency.FlowEventBus
import org.wikipedia.databinding.FragmentReadingListBinding
Expand Down Expand Up @@ -530,6 +531,7 @@ class ReadingListFragment : Fragment(), MenuProvider, ReadingListItemActionsDial

ReadingListMode.YEAR_IN_REVIEW -> {
if (readingList == null) {
YearInReviewEvent.submit(action = "impression", slide = "reading_list_create")
viewModel.generateYearInReviewReadingList(AccountUtil.userName)
} else {
update()
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/org/wikipedia/settings/AppIconDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.google.android.flexbox.FlexDirection
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
import org.wikipedia.R
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.appshortcuts.AppShortcuts
import org.wikipedia.databinding.DialogAppIconBinding
import org.wikipedia.databinding.ItemAppIconBinding
Expand All @@ -33,6 +34,8 @@ class AppIconDialog : ExtendedBottomSheetDialogFragment() {
}
binding.appIconRecyclerView.adapter = AppIconAdapter(LauncherIcon.entries).apply {
onItemClickListener = { icon ->
val eventAction = if (icon == LauncherIcon.DEFAULT) "icon_deactivate_click" else "icon_activate_click"
YearInReviewEvent.submit(action = eventAction, slide = "setting")
Prefs.selectedAppIcon = icon.key
LauncherController.setIcon(icon)
AppShortcuts.setShortcuts(requireContext())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.wikipedia.Constants
import org.wikipedia.R
import org.wikipedia.WikipediaApp
import org.wikipedia.analytics.eventplatform.RecommendedReadingListEvent
import org.wikipedia.analytics.eventplatform.YearInReviewEvent
import org.wikipedia.auth.AccountUtil
import org.wikipedia.donate.DonateUtil
import org.wikipedia.donate.donationreminder.DonationReminderActivity
Expand Down Expand Up @@ -69,21 +70,31 @@ internal class SettingsPreferenceLoader(fragment: PreferenceFragmentCompat) : Ba

findPreference(R.string.preference_key_year_in_review_is_enabled).let {
it.isVisible = YearInReviewViewModel.isAccessible
if (it.isVisible) {
YearInReviewEvent.submit(action = "impression", slide = "setting")
}
it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, newValue ->
if (newValue as Boolean) {
YearInReviewEvent.submit(action = "yir_on_click", slide = "setting")
return@OnPreferenceChangeListener true
}
YearInReviewEvent.submit(action = "yir_off_click", slide = "setting")
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.year_in_review_disable_title)
.setMessage(R.string.year_in_review_setting_subtitle)
.setPositiveButton(R.string.year_in_review_disable_positive_button) { _, _ ->
YearInReviewEvent.submit(action = "yir_off_confirm_click", slide = "setting")
Prefs.yearInReviewModelData = emptyMap()
YearInReviewViewModel.updateYearInReviewModel { it.copy(slideViewedCount = 0) }
YearInReviewViewModel.updateYearInReviewModel { model ->
model.copy(slideViewedCount = 0)
}
Prefs.yearInReviewReadingListSurveyShown = false
Prefs.yearInReviewReadingListVisitCount = 0
(preference as SwitchPreferenceCompat).isChecked = false
}
.setNegativeButton(R.string.year_in_review_disable_negative_button, null)
.setNegativeButton(R.string.year_in_review_disable_negative_button) { _, _ ->
YearInReviewEvent.submit(action = "yir_off_cancel_click", slide = "setting")
}
.show()
false
}
Expand Down
Loading
Loading