Skip to content

Commit 58b1ca1

Browse files
sharvaniharanSharvani Haran
andauthored
Data wiring updates: (#3923)
* Data wiring added for api and display orders and time spent on edit * Minor changes * Reset timer when user navigates back * Hide suggestedEditButton on api response error (#3922) Co-authored-by: Sharvani Haran <[email protected]> --------- Co-authored-by: Sharvani Haran <[email protected]>
1 parent 03b0e4d commit 58b1ca1

File tree

3 files changed

+58
-27
lines changed

3 files changed

+58
-27
lines changed

app/src/main/java/org/wikipedia/analytics/eventplatform/MachineGeneratedArticleDescriptionsAnalyticsHelper.kt

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,44 +6,60 @@ import kotlinx.coroutines.withContext
66
import org.wikipedia.WikipediaApp
77
import org.wikipedia.auth.AccountUtil
88
import org.wikipedia.dataclient.ServiceFactory
9+
import org.wikipedia.dataclient.okhttp.HttpStatusException
910
import org.wikipedia.page.PageTitle
1011

1112
object MachineGeneratedArticleDescriptionsAnalyticsHelper {
1213

1314
private const val MACHINE_GEN_DESC_SUGGESTIONS = "machineSuggestions"
15+
private var apiFailed = false
1416
val machineGeneratedDescriptionsABTest = MachineGeneratedArticleDescriptionABCTest()
15-
17+
var apiOrderList = emptyList<String>()
18+
var displayOrderList = emptyList<String>()
19+
var chosenSuggestion = ""
1620
var isUserExperienced = false
1721
var isUserInExperiment = false
22+
private var startTime = 0L
1823

1924
fun articleDescriptionEditingStart(context: Context) {
2025
log(context, "ArticleDescriptionEditing.start")
26+
startTime = System.currentTimeMillis()
27+
}
28+
29+
fun resetTimer() {
30+
startTime = System.currentTimeMillis()
2131
}
2232

2333
fun articleDescriptionEditingEnd(context: Context) {
24-
log(context, "ArticleDescriptionEditing.end")
34+
log(context, "ArticleDescriptionEditing.end.timeSpentMs.${System.currentTimeMillis() - startTime}")
2535
}
2636

27-
fun logAttempt(context: Context, finalDescription: String, wasSuggestionModified: Boolean, title: PageTitle) {
28-
log(context, composeLogString(title) + ".attempt:$finalDescription.modified:$wasSuggestionModified")
37+
fun logAttempt(context: Context, finalDescription: String, wasChosen: Boolean, wasModified: Boolean, title: PageTitle) {
38+
log(
39+
context, composeLogString(title) + ".attempt:$finalDescription.suggestionChosen:${if (!wasChosen) -1 else displayOrderList.indexOf(chosenSuggestion) + 1}" +
40+
".api.${apiOrderList.indexOf(chosenSuggestion) + 1}.modified:$wasModified"
41+
)
2942
}
3043

3144
fun logSuccess(context: Context, finalDescription: String, wasChosen: Boolean, wasModified: Boolean, title: PageTitle, revId: Long) {
32-
log(context, composeLogString(title) + ".success:$finalDescription.suggestionChosen:$wasChosen.modified:$wasModified.revId:$revId")
45+
log(context, composeLogString(title) + ".success:$finalDescription.suggestionChosen:${if (!wasChosen) -1 else displayOrderList.indexOf(
46+
chosenSuggestion) + 1}.api.${apiOrderList.indexOf(chosenSuggestion) + 1}.modified:$wasModified.revId:$revId")
3347
}
3448

35-
fun logSuggestionsReceived(context: Context, suggestionsList: List<String>, isBlp: Boolean, title: PageTitle) {
36-
val suggestions = suggestionsList.joinToString("|")
37-
log(context, composeLogString(title) + ".blp:$isBlp.count:${suggestionsList.size}.suggestions:$suggestions")
49+
fun logSuggestionsReceived(context: Context, isBlp: Boolean, title: PageTitle) {
50+
apiFailed = false
51+
log(context, composeLogString(title) + ".blp:$isBlp.count:${apiOrderList.size}.api1:${apiOrderList.first()}" +
52+
if (apiOrderList.size > 1) ".api2.${apiOrderList.last()}" else "")
3853
}
3954

40-
fun logSuggestionsShown(context: Context, suggestionsList: List<String>, title: PageTitle) {
41-
val suggestions = suggestionsList.joinToString("|")
42-
log(context, composeLogString(title) + ".count:${suggestionsList.size}.displayOrder:$suggestions")
55+
fun logSuggestionsShown(context: Context, title: PageTitle) {
56+
log(context, composeLogString(title) + ".count:${displayOrderList.size}.display1:${displayOrderList.first()} " +
57+
if (displayOrderList.size > 1) ".display2.${displayOrderList.last()}" else "")
4358
}
4459

45-
fun logSuggestionSelected(context: Context, suggestion: String, title: PageTitle) {
46-
log(context, composeLogString(title) + ".selected:$suggestion")
60+
fun logSuggestionChosen(context: Context, suggestion: String, title: PageTitle) {
61+
chosenSuggestion = suggestion
62+
log(context, composeLogString(title) + ".selected:$suggestion.${getOrderString()}")
4763
}
4864

4965
fun logSuggestionsDismissed(context: Context, title: PageTitle) {
@@ -52,7 +68,7 @@ object MachineGeneratedArticleDescriptionsAnalyticsHelper {
5268

5369
fun logSuggestionReported(context: Context, suggestion: String, reportReasonsList: List<String>, title: PageTitle) {
5470
val reportReasons = reportReasonsList.joinToString("|")
55-
log(context, composeLogString(title) + ".reportDialog.$suggestion.reasons:$reportReasons.reported")
71+
log(context, composeLogString(title) + ".reportDialog.$suggestion.${getOrderString()}.reasons:$reportReasons.reported")
5672
}
5773

5874
fun logReportDialogDismissed(context: Context) {
@@ -67,13 +83,24 @@ object MachineGeneratedArticleDescriptionsAnalyticsHelper {
6783
log(context, "$MACHINE_GEN_DESC_SUGGESTIONS.groupAssigned:$testGroup")
6884
}
6985

86+
fun logApiFailed(context: Context, throwable: Throwable, title: PageTitle) {
87+
if (throwable is HttpStatusException) {
88+
log(context, "Api failed with response code ${throwable.code} for : ${composeLogString(title)} ")
89+
}
90+
apiFailed = true
91+
}
92+
7093
private fun log(context: Context, logString: String) {
71-
if (!isUserInExperiment) {
94+
if (!isUserInExperiment || apiFailed) {
7295
return
7396
}
7497
EventPlatformClient.submit(BreadCrumbLogEvent(BreadCrumbViewUtil.getReadableScreenName(context), logString))
7598
}
7699

100+
private fun getOrderString(): String {
101+
return "api.${apiOrderList.indexOf(chosenSuggestion) + 1}.display.${displayOrderList.indexOf(chosenSuggestion) + 1}"
102+
}
103+
77104
private fun composeLogString(title: PageTitle): String {
78105
return "${composeGroupString()}.lang:${title.wikiSite.languageCode}.title:${title.prefixedText}"
79106
}

app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,9 @@ class DescriptionEditFragment : Fragment() {
221221

222222
private fun requestSuggestion() {
223223
lifecycleScope.launch(CoroutineExceptionHandler { _, throwable ->
224+
binding.fragmentDescriptionEditView.isSuggestionButtonEnabled = false
224225
L.e(throwable)
226+
MachineGeneratedArticleDescriptionsAnalyticsHelper.logApiFailed(requireContext(), throwable, pageTitle)
225227
}) {
226228
withContext(Dispatchers.IO) {
227229
val response = ServiceFactory[pageTitle.wikiSite, DescriptionSuggestionService.API_URL, DescriptionSuggestionService::class.java]
@@ -233,7 +235,8 @@ class DescriptionEditFragment : Fragment() {
233235
val list = (if (pageTitle.wikiSite.languageCode == "en") {
234236
response.prediction.map { StringUtil.capitalize(it)!! }
235237
} else response.prediction).distinct()
236-
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuggestionsReceived(requireContext(), list, response.blp, pageTitle)
238+
MachineGeneratedArticleDescriptionsAnalyticsHelper.apiOrderList = list
239+
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuggestionsReceived(requireContext(), response.blp, pageTitle)
237240
L.d("Received suggestion: " + list.first())
238241
L.d("And is it a BLP? " + response.blp)
239242

@@ -242,9 +245,9 @@ class DescriptionEditFragment : Fragment() {
242245
val randomizedListIndex = (0 until 2).random()
243246
val firstSuggestion = if (list.size == 2) list[randomizedListIndex] else list.first()
244247
val secondSuggestion = if (list.size == 2) { if (randomizedListIndex == 0) list.last() else list.first() } else null
248+
MachineGeneratedArticleDescriptionsAnalyticsHelper.displayOrderList = listOfNotNull(firstSuggestion, secondSuggestion)
245249
binding.fragmentDescriptionEditView.showSuggestedDescriptionsButton(firstSuggestion, secondSuggestion)
246-
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuggestionsShown(requireContext(),
247-
listOfNotNull(firstSuggestion, secondSuggestion), pageTitle)
250+
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuggestionsShown(requireContext(), pageTitle)
248251
}
249252
}
250253
}
@@ -273,8 +276,8 @@ class DescriptionEditFragment : Fragment() {
273276
cancelCalls()
274277
if (action == DescriptionEditActivity.Action.ADD_DESCRIPTION) {
275278
MachineGeneratedArticleDescriptionsAnalyticsHelper.logAttempt(requireContext(),
276-
binding.fragmentDescriptionEditView.description.orEmpty(), binding.fragmentDescriptionEditView.wasSuggestionModified,
277-
pageTitle
279+
binding.fragmentDescriptionEditView.description.orEmpty(), binding.fragmentDescriptionEditView.wasSuggestionChosen,
280+
binding.fragmentDescriptionEditView.wasSuggestionModified, pageTitle
278281
)
279282
}
280283
getEditTokenThenSave()
@@ -332,7 +335,7 @@ class DescriptionEditFragment : Fragment() {
332335
EditAttemptStepEvent.logSaveSuccess(pageTitle, EditAttemptStepEvent.INTERFACE_OTHER)
333336
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuccess(requireContext(),
334337
binding.fragmentDescriptionEditView.description.orEmpty(),
335-
binding.fragmentDescriptionEditView.wasSuggestionAccepted,
338+
binding.fragmentDescriptionEditView.wasSuggestionChosen,
336339
binding.fragmentDescriptionEditView.wasSuggestionModified,
337340
pageTitle, newRevId
338341
)
@@ -381,7 +384,7 @@ class DescriptionEditFragment : Fragment() {
381384
requireView().postDelayed(successRunnable, TimeUnit.SECONDS.toMillis(4))
382385
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuccess(requireContext(),
383386
binding.fragmentDescriptionEditView.description.orEmpty(),
384-
binding.fragmentDescriptionEditView.wasSuggestionAccepted,
387+
binding.fragmentDescriptionEditView.wasSuggestionChosen,
385388
binding.fragmentDescriptionEditView.wasSuggestionModified,
386389
pageTitle, response.entity?.lastRevId ?: 0
387390
)
@@ -438,7 +441,7 @@ class DescriptionEditFragment : Fragment() {
438441
}
439442

440443
private fun getEditComment(): String? {
441-
if (action == DescriptionEditActivity.Action.ADD_DESCRIPTION && binding.fragmentDescriptionEditView.wasSuggestionAccepted) {
444+
if (action == DescriptionEditActivity.Action.ADD_DESCRIPTION && binding.fragmentDescriptionEditView.wasSuggestionChosen) {
442445
return if (binding.fragmentDescriptionEditView.wasSuggestionModified) MACHINE_SUGGESTION_MODIFIED else MACHINE_SUGGESTION
443446
} else if (invokeSource == InvokeSource.SUGGESTED_EDITS || invokeSource == InvokeSource.FEED) {
444447
return when (action) {
@@ -464,6 +467,7 @@ class DescriptionEditFragment : Fragment() {
464467
override fun onCancelClick() {
465468
if (binding.fragmentDescriptionEditView.showingReviewContent()) {
466469
binding.fragmentDescriptionEditView.loadReviewContent(false)
470+
MachineGeneratedArticleDescriptionsAnalyticsHelper.resetTimer()
467471
} else {
468472
DeviceUtil.hideSoftKeyboard(requireActivity())
469473
requireActivity().onBackPressed()

app/src/main/java/org/wikipedia/descriptions/DescriptionEditView.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class DescriptionEditView : LinearLayout, MlKitLanguageDetector.Callback {
5353
var callback: Callback? = null
5454

5555
var isSuggestionButtonEnabled = false
56-
var wasSuggestionAccepted = false
56+
var wasSuggestionChosen = false
5757
var wasSuggestionModified = false
5858

5959
var description: String?
@@ -83,7 +83,7 @@ class DescriptionEditView : LinearLayout, MlKitLanguageDetector.Callback {
8383
}
8484

8585
binding.viewDescriptionEditText.addTextChangedListener {
86-
if (wasSuggestionAccepted) {
86+
if (wasSuggestionChosen) {
8787
wasSuggestionModified = true
8888
}
8989
enqueueValidateText()
@@ -426,8 +426,8 @@ class DescriptionEditView : LinearLayout, MlKitLanguageDetector.Callback {
426426
SuggestedArticleDescriptionsDialog(context, firstSuggestion, secondSuggestion, pageTitle) { suggestion ->
427427
binding.viewDescriptionEditText.setText(suggestion)
428428
binding.viewDescriptionEditText.setSelection(binding.viewDescriptionEditText.text?.length ?: 0)
429-
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuggestionSelected(context, suggestion, pageTitle)
430-
wasSuggestionAccepted = true
429+
MachineGeneratedArticleDescriptionsAnalyticsHelper.logSuggestionChosen(context, suggestion, pageTitle)
430+
wasSuggestionChosen = true
431431
wasSuggestionModified = false
432432
}.show()
433433
}

0 commit comments

Comments
 (0)