You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
11 KiB
Kotlin
273 lines
11 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.components.metrics
|
|
|
|
import mozilla.components.browser.state.search.SearchEngine
|
|
import org.mozilla.fenix.GleanMetrics.Autoplay
|
|
import org.mozilla.fenix.GleanMetrics.ContextMenu
|
|
import org.mozilla.fenix.GleanMetrics.Events
|
|
import org.mozilla.fenix.GleanMetrics.Pocket
|
|
import org.mozilla.fenix.GleanMetrics.SearchTerms
|
|
import java.util.Locale
|
|
|
|
sealed class Event {
|
|
|
|
// Interaction Events
|
|
object OpenedAppFirstRun : Event()
|
|
object InteractWithSearchURLArea : Event()
|
|
object DismissedOnboarding : Event()
|
|
object ClearedPrivateData : Event()
|
|
object AddBookmark : Event()
|
|
object HistoryHighlightOpened : Event()
|
|
object HistorySearchGroupOpened : Event()
|
|
object PocketTopSiteClicked : Event()
|
|
object PocketTopSiteRemoved : Event()
|
|
object PocketHomeRecsShown : Event()
|
|
object PocketHomeRecsDiscoverMoreClicked : Event()
|
|
object PocketHomeRecsLearnMoreClicked : Event()
|
|
data class PocketHomeRecsStoryClicked(
|
|
val timesShown: Long,
|
|
val storyPosition: Pair<Int, Int>,
|
|
) : Event() {
|
|
override val extras: Map<Pocket.homeRecsStoryClickedKeys, String>
|
|
get() = mapOf(
|
|
Pocket.homeRecsStoryClickedKeys.timesShown to timesShown.toString(),
|
|
Pocket.homeRecsStoryClickedKeys.position to "${storyPosition.first}x${storyPosition.second}"
|
|
)
|
|
}
|
|
|
|
data class PocketHomeRecsCategoryClicked(
|
|
val categoryname: String,
|
|
val previousSelectedCategoriesTotal: Int,
|
|
val isSelectedNextState: Boolean
|
|
) : Event() {
|
|
override val extras: Map<Pocket.homeRecsCategoryClickedKeys, String>
|
|
get() = mapOf(
|
|
Pocket.homeRecsCategoryClickedKeys.categoryName to categoryname,
|
|
Pocket.homeRecsCategoryClickedKeys.selectedTotal to previousSelectedCategoriesTotal.toString(),
|
|
Pocket.homeRecsCategoryClickedKeys.newState to when (isSelectedNextState) {
|
|
true -> "selected"
|
|
false -> "deselected"
|
|
}
|
|
)
|
|
}
|
|
object SearchWidgetInstalled : Event()
|
|
|
|
object ProgressiveWebAppOpenFromHomescreenTap : Event()
|
|
object ProgressiveWebAppInstallAsShortcut : Event()
|
|
|
|
object TabSettingsOpened : Event()
|
|
|
|
object HaveOpenTabs : Event()
|
|
object HaveNoOpenTabs : Event()
|
|
|
|
object ContextMenuCopyTapped : Event()
|
|
object ContextMenuSearchTapped : Event()
|
|
object ContextMenuSelectAllTapped : Event()
|
|
object ContextMenuShareTapped : Event()
|
|
|
|
object SyncedTabSuggestionClicked : Event()
|
|
object BookmarkSuggestionClicked : Event()
|
|
object ClipboardSuggestionClicked : Event()
|
|
object HistorySuggestionClicked : Event()
|
|
object SearchActionClicked : Event()
|
|
object SearchSuggestionClicked : Event()
|
|
object OpenedTabSuggestionClicked : Event()
|
|
|
|
// Home menu interaction
|
|
object HomeMenuSettingsItemClicked : Event()
|
|
object HomeScreenDisplayed : Event()
|
|
object HomeScreenViewCount : Event()
|
|
object HomeScreenCustomizedHomeClicked : Event()
|
|
|
|
// Start on Home
|
|
object StartOnHomeEnterHomeScreen : Event()
|
|
object StartOnHomeOpenTabsTray : Event()
|
|
|
|
// Recent tabs
|
|
object ShowAllRecentTabs : Event()
|
|
object OpenRecentTab : Event()
|
|
object OpenInProgressMediaTab : Event()
|
|
object RecentTabsSectionIsVisible : Event()
|
|
object RecentTabsSectionIsNotVisible : Event()
|
|
|
|
// Recent bookmarks
|
|
object BookmarkClicked : Event()
|
|
object ShowAllBookmarks : Event()
|
|
object RecentBookmarksShown : Event()
|
|
data class RecentBookmarkCount(val count: Int) : Event()
|
|
|
|
// Recently visited/Recent searches
|
|
object RecentSearchesGroupDeleted : Event()
|
|
|
|
// Android Autofill
|
|
object AndroidAutofillUnlockSuccessful : Event()
|
|
object AndroidAutofillUnlockCanceled : Event()
|
|
object AndroidAutofillSearchDisplayed : Event()
|
|
object AndroidAutofillSearchItemSelected : Event()
|
|
object AndroidAutofillConfirmationSuccessful : Event()
|
|
object AndroidAutofillConfirmationCanceled : Event()
|
|
object AndroidAutofillRequestWithLogins : Event()
|
|
object AndroidAutofillRequestWithoutLogins : Event()
|
|
|
|
// Credit cards
|
|
object CreditCardSaved : Event()
|
|
object CreditCardDeleted : Event()
|
|
object CreditCardModified : Event()
|
|
object CreditCardFormDetected : Event()
|
|
object CreditCardAutofilled : Event()
|
|
object CreditCardAutofillPromptShown : Event()
|
|
object CreditCardAutofillPromptExpanded : Event()
|
|
object CreditCardAutofillPromptDismissed : Event()
|
|
object CreditCardManagementAddTapped : Event()
|
|
object CreditCardManagementCardTapped : Event()
|
|
|
|
// Interaction events with extras
|
|
|
|
data class PerformedSearch(val eventSource: EventSource) : Event() {
|
|
sealed class EngineSource {
|
|
abstract val engine: SearchEngine
|
|
abstract val isCustom: Boolean
|
|
|
|
data class Default(override val engine: SearchEngine, override val isCustom: Boolean) :
|
|
EngineSource()
|
|
|
|
data class Shortcut(override val engine: SearchEngine, override val isCustom: Boolean) :
|
|
EngineSource()
|
|
|
|
// https://github.com/mozilla-mobile/fenix/issues/1607
|
|
// Sanitize identifiers for custom search engines.
|
|
val identifier: String
|
|
get() = if (isCustom) "custom" else engine.id
|
|
|
|
val searchEngine: SearchEngine
|
|
get() = when (this) {
|
|
is Default -> engine
|
|
is Shortcut -> engine
|
|
}
|
|
|
|
val descriptor: String
|
|
get() = when (this) {
|
|
is Default -> "default"
|
|
is Shortcut -> "shortcut"
|
|
}
|
|
}
|
|
|
|
sealed class EventSource(open val engineSource: EngineSource) {
|
|
data class Suggestion(override val engineSource: EngineSource) :
|
|
EventSource(engineSource)
|
|
|
|
data class Action(override val engineSource: EngineSource) : EventSource(engineSource)
|
|
data class Widget(override val engineSource: EngineSource) : EventSource(engineSource)
|
|
data class Shortcut(override val engineSource: EngineSource) : EventSource(engineSource)
|
|
data class TopSite(override val engineSource: EngineSource) : EventSource(engineSource)
|
|
data class Other(override val engineSource: EngineSource) : EventSource(engineSource)
|
|
|
|
private val label: String
|
|
get() = when (this) {
|
|
is Suggestion -> "suggestion"
|
|
is Action -> "action"
|
|
is Widget -> "widget"
|
|
is Shortcut -> "shortcut"
|
|
is TopSite -> "topsite"
|
|
is Other -> "other"
|
|
}
|
|
|
|
val countLabel: String
|
|
get() = "${engineSource.identifier.lowercase(Locale.getDefault())}.$label"
|
|
|
|
val sourceLabel: String
|
|
get() = "${engineSource.descriptor}.$label"
|
|
}
|
|
|
|
enum class SearchAccessPoint {
|
|
SUGGESTION, ACTION, WIDGET, SHORTCUT, TOPSITE, NONE
|
|
}
|
|
|
|
override val extras: Map<Events.performedSearchKeys, String>?
|
|
get() = mapOf(Events.performedSearchKeys.source to eventSource.sourceLabel)
|
|
}
|
|
|
|
data class SearchWithAds(val providerName: String) : Event() {
|
|
val label: String
|
|
get() = providerName
|
|
}
|
|
|
|
data class SearchAdClicked(val keyName: String) : Event() {
|
|
val label: String
|
|
get() = keyName
|
|
}
|
|
|
|
data class SearchInContent(val keyName: String) : Event() {
|
|
val label: String
|
|
get() = keyName
|
|
}
|
|
|
|
class ContextMenuItemTapped private constructor(val item: String) : Event() {
|
|
override val extras: Map<ContextMenu.itemTappedKeys, String>?
|
|
get() = mapOf(ContextMenu.itemTappedKeys.named to item)
|
|
|
|
companion object {
|
|
fun create(context_item: String) =
|
|
allowList[context_item]?.let { ContextMenuItemTapped(it) }
|
|
|
|
private val allowList = mapOf(
|
|
"mozac.feature.contextmenu.open_in_new_tab" to "open_in_new_tab",
|
|
"mozac.feature.contextmenu.open_in_private_tab" to "open_in_private_tab",
|
|
"mozac.feature.contextmenu.open_image_in_new_tab" to "open_image_in_new_tab",
|
|
"mozac.feature.contextmenu.save_image" to "save_image",
|
|
"mozac.feature.contextmenu.share_link" to "share_link",
|
|
"mozac.feature.contextmenu.copy_link" to "copy_link",
|
|
"mozac.feature.contextmenu.copy_image_location" to "copy_image_location",
|
|
"mozac.feature.contextmenu.share_image" to "share_image"
|
|
)
|
|
}
|
|
}
|
|
|
|
object AutoPlaySettingVisited : Event()
|
|
|
|
data class AutoPlaySettingChanged(val setting: AutoplaySetting) : Event() {
|
|
enum class AutoplaySetting {
|
|
BLOCK_CELLULAR, BLOCK_AUDIO, BLOCK_ALL, ALLOW_ALL
|
|
}
|
|
|
|
override val extras: Map<Autoplay.settingChangedKeys, String>?
|
|
get() = mapOf(Autoplay.settingChangedKeys.autoplaySetting to setting.toString().lowercase(Locale.ROOT))
|
|
}
|
|
|
|
data class SearchTermGroupCount(val count: Int) : Event() {
|
|
override val extras: Map<SearchTerms.numberOfSearchTermGroupKeys, String>
|
|
get() = hashMapOf(SearchTerms.numberOfSearchTermGroupKeys.count to count.toString())
|
|
}
|
|
|
|
data class AverageTabsPerSearchTermGroup(val averageSize: Double) : Event() {
|
|
override val extras: Map<SearchTerms.averageTabsPerGroupKeys, String>
|
|
get() = hashMapOf(SearchTerms.averageTabsPerGroupKeys.count to averageSize.toString())
|
|
}
|
|
|
|
data class SearchTermGroupSizeDistribution(val groupSizes: List<Long>) : Event()
|
|
|
|
object JumpBackInGroupTapped : Event()
|
|
|
|
sealed class Search
|
|
|
|
object WallpaperSettingsOpened : Event()
|
|
data class WallpaperSelected(val wallpaper: org.mozilla.fenix.wallpapers.Wallpaper) : Event()
|
|
data class WallpaperSwitched(val wallpaper: org.mozilla.fenix.wallpapers.Wallpaper) : Event()
|
|
data class ChangeWallpaperWithLogoToggled(val checked: Boolean) : Event()
|
|
|
|
sealed class Messaging(open val messageId: String) : Event() {
|
|
data class MessageShown(override val messageId: String) : Messaging(messageId)
|
|
data class MessageDismissed(override val messageId: String) : Messaging(messageId)
|
|
data class MessageClicked(override val messageId: String, val uuid: String?) :
|
|
Messaging(messageId)
|
|
data class MessageMalformed(override val messageId: String) : Messaging(messageId)
|
|
data class MessageExpired(override val messageId: String) : Messaging(messageId)
|
|
}
|
|
|
|
internal open val extras: Map<*, String>?
|
|
get() = null
|
|
}
|