Compare commits

...

7 Commits

Author SHA1 Message Date
Axel Hecht 054a2c24db Import strings from android-l10n (#4110)
State: mozilla-l10n/android-l10n@e521a2aab2
5 years ago
Sawyer Blatz 9331b45933 For #969: Adds telemetry for collections (#3935) 5 years ago
Sawyer Blatz d33c3f8bc4 For #2267: Adds telemetry for reader mode (#3941) 5 years ago
Jeff Boek 727c6bb181 Fix search metrics (#4150)
* For #4082 - Changes lifecycles for metrics

* For #4082 - Replaces the SearchEngine name with the identifier for
countLabel
5 years ago
Sebastian Kaspari 6ed167c9ff Update to use Mozilla Android Components 4.0.1. (#4146) 5 years ago
Christian Sadilek 1e2d82dd1a Closes #4096: IllegalStateException in SearchFragment (#4131) 5 years ago
Colin Lee a54cbb27b3
Revert "For #3615: Long pressing the address bar should not copy link (#4083)" (#4136)
This reverts commit 8855af2234.
5 years ago

@ -329,6 +329,7 @@ quick_action_sheet:
metrics:
default_browser:
type: boolean
lifetime: application
description: >
Is Fenix the default browser?
send_in_pings:
@ -361,6 +362,7 @@ metrics:
expires: "2019-09-01"
mozilla_products:
type: string_list
lifetime: application
description: >
A list of all the Mozilla products installed on device. We currently scan for: Firefox, Firefox Beta,
Firefox Aurora, Firefox Nightly, Firefox Fdroid, Firefox Lite, Reference Browser, Reference Browser Debug,
@ -376,8 +378,9 @@ metrics:
expires: "2019-09-01"
default_moz_browser:
type: string
lifetime: application
description: >
The name of the default browser on device if and only if it's a Mozilla owned product, otherwise empty string
The name of the default browser on device if and only if it's a Mozilla owned product
send_in_pings:
- metrics
bugs:
@ -391,6 +394,7 @@ metrics:
search.default_engine:
code:
type: string
lifetime: application
description: >
If the search engine is pre-loaded with Fenix this value
will be the search engine identifier. If it's a custom search engine
@ -407,6 +411,7 @@ search.default_engine:
expires: "2019-09-01"
name:
type: string
lifetime: application
description: >
If the search engine is pre-loaded with Fenix this value
will be the search engine name. If it's a custom search engine
@ -423,6 +428,7 @@ search.default_engine:
expires: "2019-09-01"
submission_url:
type: string
lifetime: application
description: >
If the search engine is pre-loaded with Fenix this value
will be he base URL we use to build the search query for the search engine.
@ -900,4 +906,149 @@ history:
- https://github.com/mozilla-mobile/fenix/pull/3940
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
reader_mode:
available:
type: event
description: >
Reader mode is available for the current page
bugs:
- 2267
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3941
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
opened:
type: event
description: >
A user opened reader mode
bugs:
- 2267
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3941
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
appearance:
type: event
description: >
A user tapped the appearance button
bugs:
- 2267
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3941
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
collections:
renamed:
type: event
description: >
A user renamed a collection
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
tab_restored:
type: event
description: >
A user restored a tab from collection tab list
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
all_tabs_restored:
type: event
description: >
A user tapped "open tabs" from collection menu
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
tab_removed:
type: event
description: >
A user tapped remove tab from collection tab list
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
shared:
type: event
description: >
A user tapped share collection
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
removed:
type: event
description: >
A user tapped delete collection from collection menu
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
saved:
type: event
description: >
A user saved a list of tabs to a new collection
extra_keys:
tabs_open:
description: "The number of tabs open in the current session"
tabs_selected:
description: "The number of tabs added to the collection"
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
tabs_added:
type: event
description: >
A user saved a list of tabs to an existing collection
extra_keys:
tabs_open:
description: "The number of tabs open in the current session"
tabs_selected:
description: "The number of tabs added to the collection"
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"
tab_select_opened:
type: event
description: >
A user opened the select tabs screen (the first step of the collection creation flow)
bugs:
- 969
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/3935
notification_emails:
- fenix-core@mozilla.com
expires: "2020-03-01"

@ -374,6 +374,10 @@ class BrowserFragment : Fragment(), BackHandler {
view.readerViewControlsBar
) {
getManagedEmitter<QuickActionChange>().apply {
if (it) {
requireComponents.analytics.metrics.track(Event.ReaderModeAvailable)
}
onNext(QuickActionChange.ReadableStateChange(it))
onNext(
QuickActionChange.ReaderActiveStateChange(
@ -489,6 +493,21 @@ class BrowserFragment : Fragment(), BackHandler {
trackToolbarItemInteraction(it)
handleToolbarItemInteraction(it)
}
is SearchAction.ToolbarLongClicked -> {
getSessionById()?.let { session ->
session.copyUrl(requireContext())
view?.let {
val snackbar = FenixSnackbar.make(it, Snackbar.LENGTH_LONG)
.setText(resources.getString(R.string.url_copied))
if (!session.isCustomTabSession()) {
snackbar.anchorView = nestedScrollQuickAction
}
snackbar.show()
}
}
}
}
}
@ -526,11 +545,12 @@ class BrowserFragment : Fragment(), BackHandler {
} else {
feature.showReaderView()
actionEmitter.onNext(QuickActionChange.ReaderActiveStateChange(true))
requireComponents.analytics.metrics.track(Event.ReaderModeOpened)
}
}
}
is QuickActionAction.ReadAppearancePressed -> {
// TODO telemetry: https://github.com/mozilla-mobile/fenix/issues/2267
requireComponents.analytics.metrics.track(Event.ReaderModeAppearanceOpened)
readerViewFeature.withFeature { feature ->
feature.showControls()
}

@ -29,6 +29,8 @@ import kotlinx.coroutines.Job
import mozilla.components.support.ktx.android.view.hideKeyboard
import mozilla.components.support.ktx.android.view.showKeyboard
import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.ext.urlToTrimmedHost
import org.mozilla.fenix.home.sessioncontrol.Tab
@ -124,6 +126,8 @@ class CollectionCreationUIView(
when (it.saveCollectionStep) {
is SaveCollectionStep.SelectTabs -> {
view.context.components.analytics.metrics.track(Event.CollectionTabSelectOpened)
view.tab_list.isClickable = true
back_button.setOnClickListener {

@ -17,6 +17,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.mozilla.fenix.FenixViewModelProvider
import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.home.sessioncontrol.Tab
@ -122,6 +123,11 @@ class CreateCollectionFragment : DialogFragment() {
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
context.components.core.tabCollectionStorage.createCollection(it.name, sessionBundle)
}
context.components.analytics.metrics.track(
Event.CollectionSaved(context.components.core.sessionManager.size, sessionBundle.size)
)
closeTabsIfNecessary(it.tabs)
}
}
@ -133,6 +139,11 @@ class CreateCollectionFragment : DialogFragment() {
context.components.core.tabCollectionStorage
.addTabsToCollection(it.collection, sessionBundle)
}
context.components.analytics.metrics.track(
Event.CollectionTabsAdded(context.components.core.sessionManager.size, sessionBundle.size)
)
closeTabsIfNecessary(it.tabs)
}
}
@ -140,6 +151,7 @@ class CreateCollectionFragment : DialogFragment() {
dismiss()
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
requireComponents.core.tabCollectionStorage.renameCollection(it.collection, it.name)
requireComponents.analytics.metrics.track(Event.CollectionRenamed)
}
}
}

@ -29,9 +29,10 @@ import org.mozilla.fenix.GleanMetrics.Pings
import org.mozilla.fenix.GleanMetrics.QrScanner
import org.mozilla.fenix.GleanMetrics.QuickActionSheet
import org.mozilla.fenix.GleanMetrics.SearchDefaultEngine
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.GleanMetrics.Collections
import org.mozilla.fenix.GleanMetrics.SyncAccount
import org.mozilla.fenix.GleanMetrics.SyncAuth
import org.mozilla.fenix.ext.components
private class EventWrapper<T : Enum<T>>(
private val recorder: ((Map<T, String>?) -> Unit),
@ -243,6 +244,27 @@ private val Event.wrapper
is Event.HistoryAllItemsRemoved -> EventWrapper<NoExtraKeys>(
{ History.removedAll.record(it) }
)
is Event.CollectionRenamed -> EventWrapper<NoExtraKeys>(
{ Collections.renamed.record(it) }
)
is Event.CollectionTabRestored -> EventWrapper<NoExtraKeys>(
{ Collections.tabRestored.record(it) }
)
is Event.CollectionAllTabsRestored -> EventWrapper<NoExtraKeys>(
{ Collections.allTabsRestored.record(it) }
)
is Event.CollectionTabRemoved -> EventWrapper<NoExtraKeys>(
{ Collections.tabRemoved.record(it) }
)
is Event.CollectionShared -> EventWrapper<NoExtraKeys>(
{ Collections.shared.record(it) }
)
is Event.CollectionRemoved -> EventWrapper<NoExtraKeys>(
{ Collections.removed.record(it) }
)
is Event.CollectionTabSelectOpened -> EventWrapper<NoExtraKeys>(
{ Collections.tabSelectOpened.record(it) }
)
// Don't track other events with Glean
else -> null
@ -270,7 +292,9 @@ class GleanMetricsService(private val context: Context) : MetricsService {
Metrics.apply {
defaultBrowser.set(Browsers.all(context).isDefaultBrowser)
defaultMozBrowser.set(MozillaProductDetector.getMozillaBrowserDefault(context) ?: "")
MozillaProductDetector.getMozillaBrowserDefault(context)?.also {
defaultMozBrowser.set(it)
}
mozillaProducts.set(MozillaProductDetector.getInstalledMozillaProducts(context))
}

@ -98,6 +98,16 @@ sealed class Event {
object HistoryItemOpened : Event()
object HistoryItemRemoved : Event()
object HistoryAllItemsRemoved : Event()
object ReaderModeAvailable : Event()
object ReaderModeOpened : Event()
object ReaderModeAppearanceOpened : Event()
object CollectionRenamed : Event()
object CollectionTabRestored : Event()
object CollectionAllTabsRestored : Event()
object CollectionTabRemoved : Event()
object CollectionShared : Event()
object CollectionRemoved : Event()
object CollectionTabSelectOpened : Event()
data class PreferenceToggled(val preferenceKey: String, val enabled: Boolean, val context: Context) : Event() {
private val switchPreferenceTelemetryAllowList = listOf(
@ -121,6 +131,22 @@ sealed class Event {
}
// Interaction Events
data class CollectionSaved(val tabsOpenCount: Int, val tabsSelectedCount: Int) : Event() {
override val extras: Map<String, String>?
get() = mapOf(
"tabs_open" to tabsOpenCount.toString(),
"tabs_selected" to tabsSelectedCount.toString()
)
}
data class CollectionTabsAdded(val tabsOpenCount: Int, val tabsSelectedCount: Int) : Event() {
override val extras: Map<String, String>?
get() = mapOf(
"tabs_open" to tabsOpenCount.toString(),
"tabs_selected" to tabsSelectedCount.toString()
)
}
data class LibrarySelectedItem(val item: String) : Event() {
override val extras: Map<String, String>?
get() = mapOf("item" to item)
@ -177,7 +203,7 @@ sealed class Event {
}
val countLabel: String
get() = "${source.searchEngine.name.toLowerCase(Locale.ROOT)}.$label"
get() = "${source.searchEngine.identifier.toLowerCase(Locale.ROOT)}.$label"
val sourceLabel: String
get() = "${source.descriptor}.$label"

@ -82,6 +82,7 @@ sealed class SearchAction : Action {
data class UrlCommitted(val url: String, val session: String?, val engine: SearchEngine? = null) : SearchAction()
data class TextChanged(val query: String) : SearchAction()
object ToolbarClicked : SearchAction()
object ToolbarLongClicked : SearchAction()
data class ToolbarMenuItemTapped(val item: ToolbarMenu.Item) : SearchAction()
object EditingCanceled : SearchAction()
}

@ -86,6 +86,11 @@ class ToolbarUIView(
actionEmitter.onNext(SearchAction.TextChanged(text))
}
})
setOnUrlLongClickListener {
actionEmitter.onNext(SearchAction.ToolbarLongClicked)
true
}
}
with(view.context) {

@ -460,6 +460,7 @@ class HomeFragment : Fragment(), AccountObserver {
setPositiveButton(R.string.tab_collection_dialog_positive) { dialog: DialogInterface, _ ->
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
requireComponents.core.tabCollectionStorage.removeCollection(tabCollection)
requireComponents.analytics.metrics.track(Event.CollectionRemoved)
}.invokeOnCompletion {
dialog.dismiss()
}
@ -516,6 +517,7 @@ class HomeFragment : Fragment(), AccountObserver {
)
(activity as HomeActivity).openToBrowser(BrowserDirection.FromHome)
}
requireComponents.analytics.metrics.track(Event.CollectionTabRestored)
}
is CollectionAction.OpenTabs -> {
invokePendingDeleteJobs()
@ -540,15 +542,18 @@ class HomeFragment : Fragment(), AccountObserver {
delay(ANIM_SCROLL_DELAY)
sessionControlComponent.view.smoothScrollToPosition(0)
}
requireComponents.analytics.metrics.track(Event.CollectionAllTabsRestored)
}
is CollectionAction.ShareTabs -> {
val shareTabs = action.collection.tabs.map { ShareTab(it.url, it.title) }
share(tabs = shareTabs)
requireComponents.analytics.metrics.track(Event.CollectionShared)
}
is CollectionAction.RemoveTab -> {
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
requireComponents.core.tabCollectionStorage.removeTabFromCollection(action.collection, action.tab)
}
requireComponents.analytics.metrics.track(Event.CollectionTabRemoved)
}
}
}

@ -19,14 +19,14 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.whenStarted
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.fragment_search.*
import kotlinx.android.synthetic.main.fragment_search.view.*
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import mozilla.components.concept.storage.HistoryStorage
import mozilla.components.feature.qr.QrFeature
import mozilla.components.lib.state.Store
import mozilla.components.lib.state.ext.observe
import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
@ -74,7 +74,7 @@ class SearchFragment : Fragment(), BackHandler {
searchStore = StoreProvider.get(
this,
Store(
SearchStore(
SearchState(
query = url,
showShortcutEnginePicker = false,
@ -83,8 +83,7 @@ class SearchFragment : Fragment(), BackHandler {
),
showSuggestions = Settings.getInstance(requireContext()).showSearchSuggestions,
showVisitedSitesBookmarks = Settings.getInstance(requireContext()).shouldShowVisitedSitesBookmarks,
session = session),
::searchStateReducer
session = session)
)
)
@ -168,12 +167,14 @@ class SearchFragment : Fragment(), BackHandler {
}
searchStore.observe(view) {
MainScope().launch {
awesomeBarView.update(it)
toolbarView.update(it)
updateSearchEngineIcon(it)
updateSearchShortuctsIcon(it)
updateSearchWithLabel(it)
viewLifecycleOwner.lifecycleScope.launch {
whenStarted {
awesomeBarView.update(it)
toolbarView.update(it)
updateSearchEngineIcon(it)
updateSearchShortuctsIcon(it)
updateSearchWithLabel(it)
}
}
}

@ -11,9 +11,14 @@ import mozilla.components.lib.state.State
import mozilla.components.lib.state.Store
/**
* An alias to make it easier to work with `Store<SearchState, SearchAction>`
* The [Store] for holding the [SearchState] and applying [SearchAction]s.
*/
typealias SearchStore = Store<SearchState, SearchAction>
class SearchStore(
initialState: SearchState
) : Store<SearchState, SearchAction>(
initialState,
::searchStateReducer
)
/**
* Wraps a `SearchEngine` to give consumers the context that it was selected as a shortcut

@ -334,6 +334,11 @@
<string name="collection_rename">Sammlung umbenennen</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Tabs öffnen</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Löschen</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">%1$d Websites…</string>
<!-- History -->

@ -23,9 +23,9 @@
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_explanation">%1$s borra tus búsquedas e historial de navegación cuando cierras una sesión privada
Aunque no te hace anónimo para los sitios web o proveedor de servicios de Internet,
Aunque no te hace anónimo para los sitios web o proveedor de servicios de Internet,
te ayuda a mantener en privado lo que haces en línea frente a cualquier otra persona que use este dispositivo. \n\nMitos comunes sobre la navegación privada
</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Eliminar sesión</string>
@ -331,6 +331,12 @@
<string name="collection_rename">Cambiar nombre a colección</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Abrir pestañas</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Eliminar</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">Sitios %1$d…</string>
<!-- History -->

@ -23,7 +23,7 @@
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_explanation">%1$s borra tus búsquedas e historial de navegación cuando cierras una sesión privada
        Aunque no te hace anónimo para los sitios web o proveedor de servicios de Internet,
        Aunque no te hace anónimo para los sitios web o proveedor de servicios de Internet,
        te ayuda a mantener en privado lo que haces en línea frente a cualquier otra persona que use este dispositivo. \n\nMitos comunes sobre la navegación privada
        
    </string>
@ -337,6 +337,11 @@
<string name="collection_rename">Cambiar el nombre a la colección</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Abrir pestañas</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Eliminar</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more"> Sitios %1$d…</string>
<!-- History -->

@ -338,6 +338,11 @@
<string name="collection_rename">Renommer la collection</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Ouvrir les onglets</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Supprimer</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">%1$d sites…</string>
<!-- History -->

@ -340,6 +340,12 @@
<string name="collection_rename">Rinomina raccolta</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Apri schede</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Elimina</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">%1$d siti...</string>
<!-- History -->

@ -327,6 +327,11 @@
<string name="collection_rename">コレクションの名前を変更</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">タブを開く</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">削除</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">%1$d サイト…</string>
<!-- History -->

@ -330,6 +330,11 @@
<string name="collection_rename">모음집 이름 변경</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">열린 탭</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">삭제</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">사이트 %1$d개…</string>
<!-- History -->
@ -677,9 +682,9 @@
<string name="onboarding_privacy_notice_header">개인 정보 보호</string>
<!-- text for the privacy notice onboarding card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_privacy_notice_description">우리는 %s가 무엇을 온라인에서 공유하고 우리와 공유할지
<string name="onboarding_privacy_notice_description">우리는 %s가 무엇을 온라인에서 공유하고 우리와 공유할지
사용자가 제어할 수 있게 만들었습니다.
    </string>
<!-- Text for the button to read the privacy notice -->
<string name="onboarding_privacy_notice_read_button">개인 정보 보호 정책 읽기</string>

@ -338,6 +338,11 @@
<string name="collection_rename">Переименовать коллекцию</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Открытые вкладки</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Удалить</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">%1$d сайт(а)…</string>
<!-- History -->

@ -0,0 +1,339 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Sök eller ange adress</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header">Inga flikar öppnade</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Dina öppna flikar visas här.</string>
<!-- Private Browsing -->
<!-- Title for private session option -->
<string name="private_browsing_title">Du är i en privat session</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Ta bort session</string>
<!-- Browser Fragment -->
<!-- Content description (not visible, for screen readers etc.): Navigate to open tabs -->
<string name="browser_tabs_button">Öppna flikar</string>
<!-- Content description (not visible, for screen readers etc.): Stop loading current website -->
<string name="browser_menu_stop">Stopp</string>
<!-- Browser menu button that sends a user to help articles -->
<string name="browser_menu_help">Hjälp</string>
<!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">Inställningar</string>
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_your_library">Ditt bibliotek</string>
<!-- Browser menu button that creates a private tab -->
<string name="browser_menu_private_tab">Privat flik</string>
<!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">Ny flik</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Dela</string>
<!-- Browser menu button shown in custom tabs that opens the current tab in Fenix
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_open_in_fenix">Öppna i %1$s</string>
<!-- Preferences -->
<!-- Title for the settings page-->
<string name="settings">Inställningar</string>
<!-- Preference category for all links about Fenix -->
<string name="preferences_category_about">Om</string>
<!-- Preference for settings related to changing the default search engine -->
<string name="preferences_search_engine">Sökmotor</string>
<!-- Preference linking to help about Fenix -->
<string name="preferences_help">Hjälp</string>
<!-- Preference link to rating Fenix on the Play Store -->
<string name="preferences_rate">Betygsätt på Google Play</string>
<!-- Preference linking to about page for Fenix
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="preferences_about">Om %1$s</string>
<!-- Preference linking to the your rights SUMO page -->
<string name="preferences_your_rights">Dina rättigheter</string>
<!-- Preference for settings related to saved passwords -->
<string name="preferences_passwords">Lösenord</string>
<!-- Preference for settings related to saved credit cards and addresses -->
<string name="preferences_credit_cards_addresses">Kreditkort och adresser</string>
<!-- Preference category for advanced settings -->
<string name="preferences_category_advanced">Avancerat</string>
<!-- Preference category for privacy settings -->
<string name="preferences_category_privacy">Integritet</string>
<!-- Preference category for account information -->
<string name="preferences_category_account">Konto</string>
<!-- Preference shown on banner to sign into account -->
<string name="preferences_sign_in">Logga in</string>
<!-- Preference for changing default theme to dark or light mode -->
<string name="preferences_theme">Tema</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Firefox konto</string>
<!-- Preference for language -->
<string name="preferences_language">Språk</string>
<!-- Preference category for developer tools -->
<string name="developer_tools_category">Utvecklarverktyg</string>
<!-- Preference for account settings -->
<string name="preferences_account_settings">Kontoinställningar</string>
<!-- Preference for syncing history -->
<string name="preferences_sync_history">Historik</string>
<!-- Preference for syncing bookmarks -->
<string name="preferences_sync_bookmarks">Bokmärken</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Logga ut</string>
<!-- %s is the device name -->
<string name="fxa_tab_received_from_notification_name">Flik från %s</string>
<!-- Advanced Preferences -->
<!-- Preference for tracking protection settings -->
<string name="preferences_tracking_protection_settings">Spårningsskydd</string>
<!-- Preference switch for tracking protection -->
<string name="preferences_tracking_protection">Spårningsskydd</string>
<!-- Preference for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions">Undantag</string>
<!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">Telemetri</string>
<!-- Preference for account login -->
<string name="preferences_sync_sign_in">Logga in</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">Ta bort konto</string>
<!-- Button to cancel pairing -->
<string name="pair_cancel">Avbryt</string>
<!-- Theme Preferences -->
<!-- Preference for using light theme -->
<string name="preference_light_theme">Ljust</string>
<!-- Preference for using dark theme -->
<string name="preference_dark_theme">Mörkt</string>
<!-- Quick Action Sheet -->
<!-- Button in the browser chrome to share the current page -->
<string name="quick_action_share">Dela</string>
<!-- Button in the browser chrome in the browser to bookmark the current page -->
<string name="quick_action_bookmark">Bokmärk</string>
<!-- Button in the browser chrome in the browser to edit the bookmark of the current page -->
<string name="quick_action_bookmark_edit">Redigera bokmärke</string>
<!-- Button in the browser chrome in the browser to put the the current page in reader mode -->
<string name="quick_action_read">Läs</string>
<!-- Button in the browser chrome to exit reader mode -->
<string name="quick_action_read_close">Stäng</string>
<!-- Button in the browser chrome to configure reader mode appearance e.g. the used font type and size -->
<string name="quick_action_read_appearance">Utseende</string>
<!-- Library -->
<!-- Option in Library to open Sessions page -->
<string name="library_sessions">Sessioner</string>
<!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">Bokmärken</string>
<!-- Option in library to open Desktop Bookmarks "unfiled" page -->
<string name="library_desktop_bookmarks_unfiled">Andra bokmärken</string>
<!-- Option in Library to open History page -->
<string name="library_history">Historik</string>
<!-- Option in Library to open Reading List -->
<string name="library_reading_list">Läslista</string>
<!-- Menu Item Label for Search in Library -->
<string name="library_search">Sök</string>
<!-- Library Page Title -->
<string name="library_title">Bibliotek</string>
<!-- Settings Page Title -->
<string name="settings_title">Inställningar</string>
<!-- Content description (not visible, for screen readers etc.): "Close button for library settings" -->
<string name="content_description_close_button">Stäng</string>
<!-- Sessions -->
<!-- Title for the list of tabs -->
<string name="tab_header_label">Öppna flikar</string>
<!-- Title for the list of tabs in the current private session -->
<string name="tabs_header_private_title">Privat session</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
<string name="close_tab">Stäng flik</string>
<!-- Content description (not visible, for screen readers etc.): Opens the open tabs menu when pressed -->
<string name="open_tabs_menu">Öppna flikmenyn</string>
<!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">Stäng alla flikar</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Dela flikar</string>
<!-- Tab menu item to share the tab -->
<string name="tab_share">Dela flik</string>
<!-- Button in the current session menu. Deletes the session when pressed -->
<string name="current_session_delete">Ta bort</string>
<!-- Button in the current session menu. Saves the session when pressed -->
<string name="current_session_save">Spara</string>
<!-- Button in the current session menu. Opens the share menu when pressed -->
<string name="current_session_share">Dela</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">Öppna flikar</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">Ta bort</string>
<!-- History -->
<!-- Text for the button to clear all history -->
<string name="history_delete_all">Rensa historik</string>
<!-- Text for the button to delete a single history item -->
<string name="history_delete_item">Ta bort</string>
<!-- Text for the header that groups the history for Today -->
<string name="history_today">Idag</string>
<!-- Text for the header that groups the history the past week -->
<string name="history_this_week">Denna vecka</string>
<!-- Text for the header that groups the history the past month -->
<string name="history_this_month">Denna månad</string>
<!-- Text for the header that groups the history older than the last month -->
<string name="history_older">Äldre</string>
<!-- Close tab button text on the tab crash page -->
<string name="tab_crash_close">Stäng flik</string>
<!-- Restore tab button text on the tab crash page -->
<string name="tab_crash_restore">Återställ flik</string>
<!-- Content Description for session item share button -->
<string name="content_description_session_share">Dela session</string>
<!-- Screen title for editing bookmarks -->
<string name="bookmark_edit">Redigera bokmärke</string>
<!-- Screen title for selecting a bookmarks folder -->
<string name="bookmark_select_folder">Välj mapp</string>
<!-- Snackbar edit button shown after a bookmark has been created. -->
<string name="edit_bookmark_snackbar_action">EDIT</string>
<!-- Bookmark overflow menu edit button -->
<string name="bookmark_menu_edit_button">Redigera</string>
<!-- Bookmark overflow menu select button -->
<string name="bookmark_menu_select_button">Välj</string>
<!-- Bookmark overflow menu copy button -->
<string name="bookmark_menu_copy_button">Kopiera</string>
<!-- Bookmark overflow menu share button -->
<string name="bookmark_menu_share_button">Dela</string>
<!-- Bookmark overflow menu open in new tab button -->
<string name="bookmark_menu_open_in_new_tab_button">Öppna i ny flik</string>
<!-- Bookmark overflow menu open in private tab button -->
<string name="bookmark_menu_open_in_private_tab_button">Öppna i privat flik</string>
<!-- Bookmark overflow menu delete button -->
<string name="bookmark_menu_delete_button">Ta bort</string>
<!-- Bookmark editing screen title -->
<string name="edit_bookmark_fragment_title">Redigera bokmärke</string>
<!-- Bookmark folder editing screen title -->
<string name="edit_bookmark_folder_fragment_title">Redigera mapp</string>
<!-- Bookmark sign in button message -->
<string name="bookmark_sign_in_button">Logga in för att se synkroniserade bokmärken</string>
<!-- Bookmark URL editing field label -->
<string name="bookmark_url_label">URL</string>
<!-- Bookmark FOLDER editing field label -->
<string name="bookmark_folder_label">FOLDER</string>
<!-- Bookmark NAME editing field label -->
<string name="bookmark_name_label">NAME</string>
<!-- Bookmark editing error missing title -->
<string name="bookmark_empty_title_error">Måste ha en titel</string>
<!-- Bookmark editing error missing or improper URL -->
<string name="bookmark_invalid_url_error">Ogiltig URL</string>
<!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">UNDO</string>
<!-- Site Permissions -->
<!-- Site permissions preferences header -->
<string name="permissions_header">Behörigheter</string>
<!-- Button label that take the user to the Android App setting -->
<string name="phone_feature_go_to_settings">Gå till inställningar</string>
<!-- Label that indicates that this option it the recommended one -->
<string name="phone_feature_recommended">Rekommenderad</string>
<!-- Preference for altering the camera access for all websites -->
<string name="preference_phone_feature_camera">Kamera</string>
<!-- Preference for altering the microphone access for all websites -->
<string name="preference_phone_feature_microphone">Mikrofon</string>
<!-- Preference for altering the location access for all websites -->
<string name="preference_phone_feature_location">Plats</string>
<!-- Label that indicates that a permission must be blocked -->
<string name="preference_option_phone_feature_blocked">Blockerad</string>
<!-- Label that indicates that a permission must be allowed -->
<string name="preference_option_phone_feature_allowed">Tillåten</string>
<!--Label that indicates a permission is by the Android OS-->
<string name="phone_feature_blocked_by_android">Blockerad av Android</string>
<!-- Preference for showing a list of websites that the default configurations won't apply to them -->
<string name="preference_exceptions">Undantag</string>
<!-- Summary of tracking protection preference if tracking protection is set to on -->
<string name="tracking_protection_on"></string>
<!-- Summary of tracking protection preference if tracking protection is set to off -->
<string name="tracking_protection_off">Av</string>
<!-- Collections -->
<!-- Collections header on home fragment -->
<string name="collections_header">Samlingar</string>
<!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">Välj flikar</string>
<!-- Button to select all tabs in the "select tabs" step of the collection creator -->
<string name="create_collection_select_all">Välj alla</string>
<!-- Text to prompt users to select the tabs to save in the "select tabs" step of the collection creator -->
<string name="create_collection_save_to_collection_empty">Välj flikar att spara</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection -->
<string name="create_collection_tabs_saved">Flikar sparade!</string>
<!-- Text shown in snackbar when one tab has been saved in a collection -->
<string name="create_collection_tab_saved">Flik sparad!</string>
<!-- Content description (not visible, for screen readers etc.): button to close the collection creator -->
<string name="create_collection_close">Stäng</string>
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Spara</string>
<!-- Share -->
<!-- Share screen header -->
<string name="share_header">Skicka och dela</string>
<!-- Sub-header in the dialog to share a link to another app -->
<string name="share_link_subheader">Dela en länk</string>
<!-- Sub-header in the dialog to share a link to another sync device -->
<string name="share_device_subheader">Skicka till enhet</string>
<!-- An option from the share dialog to send link to all other sync devices -->
<string name="sync_send_to_all">Skicka till alla enheter</string>
<!-- An option to connect additional devices -->
<string name="sync_connect_device">Anslut en annan enhet</string>
<!-- Text for action to undo deleting a tab or collection shown in snackbar -->
<string name="snackbar_deleted_undo">UNDO</string>
<!-- QR code scanner prompt dialog positive option to allow navigation to scanned link -->
<string name="qr_scanner_dialog_positive">ALLOW</string>
<!-- QR code scanner prompt dialog positive option to deny navigation to scanned link -->
<string name="qr_scanner_dialog_negative">DENY</string>
<!-- Tab collection deletion prompt dialog message. Placeholder will be replaced with the collection name -->
<string name="tab_collection_dialog_message">Är du säker att du vill ta bort %1$s?</string>
<!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">Ta bort</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
<string name="tab_collection_dialog_negative">Avbryt</string>
<!-- Message for copying the URL via long press on the toolbar -->
<string name="url_copied">URL kopierad</string>
<!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">Teckenstorlek</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title">Öppna flikar</string>
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
<string name="preferences_delete_browsing_data_tabs_subtitle">%d flikar</string>
<!-- Subtitle for the data and history items in delete browsing data, parameter will be replaced with the
number of history items the user has -->
<string name="preferences_delete_browsing_data_browsing_data_subtitle">%d adresser</string>
<!-- Title for the collections item in Delete browsing data -->
<string name="preferences_delete_browsing_data_collections_title">Samlingar</string>
<!-- Subtitle for the collections item in Delete browsing data, parameter will be replaced with the
number of collections that will be deleted -->
<string name="preferences_delete_browsing_data_collections_subtitle">%d samlingar</string>
<!-- Text for the cancel button for the data deletion dialog -->
<string name="preferences_delete_browsing_data_prompt_cancel">Tillåt inte</string>
<!-- Text for the allow button for the data deletion dialog -->
<string name="preferences_delete_browsing_data_prompt_allow">Tillåt</string>
<!-- Onboarding -->
<!-- Text for onboarding welcome message
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_header">Välkommen till %s!</string>
<!-- text for the Firefox Accounts section header -->
<string name="onboarding_fxa_section_header">Har du redan ett konto?</string>
<!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header">Välj ditt tema</string>
<!-- text for the button to sign into your Firefox account. The word "Firefox" should not be translated -->
<string name="onboarding_firefox_account_sign_in">Logga in till Firefox</string>
<!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sync_sent_tabs_snackbar">Flikar skickade!</string>
<!-- Text shown in snackbar when one tab has been sent to device -->
<string name="sync_sent_tab_snackbar">Flik skickad!</string>
</resources>

@ -341,6 +341,12 @@
<string name="collection_rename">重命名收藏集</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">打开标签页</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">删除</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">还有 %1$d 个网站…</string>
<!-- History -->
@ -605,7 +611,7 @@
<!-- Sample text for accessibility font size -->
<string name="accessibility_text_size_sample_text">The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.
<string name="accessibility_text_size_sample_text">The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.
中文字体测试:天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。</string>
<!-- Summary for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_text_size_summary">放大或缩小网站上的文字</string>

@ -336,6 +336,11 @@
<string name="collection_rename">更名收藏集</string>
<!-- Text for the button to open tabs of the selected collection -->
<string name="collection_open_tabs">開啟分頁</string>
<!-- Text for the button to delete a single session -->
<string name="session_item_delete">刪除</string>
<!-- Text to tell the user how many more tabs this session has.
The first parameter is a digit that shows the cardinal number of how many additional tabs the session has. -->
<string name="session_items_more">還有 %1$d 個網站…</string>
<!-- History -->
@ -597,7 +602,7 @@
<!-- Sample text for accessibility font size -->
<string name="accessibility_text_size_sample_text">The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.
<string name="accessibility_text_size_sample_text">The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.
中文字型測試:「永東國酬,愛鬱。靈鷹袋!」</string>
<!-- Summary for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_text_size_summary">放大或縮小網站上的文字</string>

@ -0,0 +1,210 @@
/* 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.search.SearchEngine
import mozilla.components.browser.search.SearchEngineManager
import mozilla.components.browser.search.provider.AssetsSearchEngineProvider
import mozilla.components.support.test.robolectric.testContext
import org.junit.Before
import org.mozilla.fenix.components.metrics.Event.PerformedSearch
import org.mozilla.fenix.components.metrics.Event.PerformedSearch.EngineSource
import org.mozilla.fenix.components.metrics.Event.PerformedSearch.EventSource
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.TestApplication
import org.mozilla.fenix.components.FenixLocaleSearchLocalizationProvider
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
@Config(application = TestApplication::class)
class PerformedSearchTest {
private lateinit var searchEngines: List<SearchEngine>
// Match against the Regex defined at
// https://github.com/mozilla-mobile/android-components/blob/master/components/service/glean/src/main/java/mozilla/components/service/glean/private/LabeledMetricType.kt#L43
// We're temporarily using it until better Glean testing APIs are available.
private val countLabelRegex = Regex("^[a-z_][a-z0-9_-]{0,29}(\\.[a-z0-9_-]{0,29})*$")
@Before
fun setUp() {
searchEngines = SearchEngineManager(listOf(provider)).getSearchEngines(testContext)
}
@Test
fun testThatCountLabelIsValid() {
val labels = searchEngines.map {
PerformedSearch(EventSource.Action(EngineSource.Shortcut(it))).eventSource.countLabel
}
labels.forEach {
assertTrue("$it does not match!", it.matches(countLabelRegex))
}
}
private val provider = AssetsSearchEngineProvider(
localizationProvider = FenixLocaleSearchLocalizationProvider(),
additionalIdentifiers = listOf(
"amazon-au",
"amazon-br",
"amazon-ca",
"amazon-co-uk",
"amazon-de",
"amazon-fr",
"amazon-in",
"amazon-it",
"amazon-jp",
"amazon-mx",
"amazon-nl",
"amazondotcom",
"azerdict",
"azet-sk",
"baidu",
"bing",
"bolcom-fy-NL",
"bolcom-nl",
"ceneje",
"coccoc",
"danawa-kr",
"daum-kr",
"ddg",
"diec2",
"drae",
"duckduckgo",
"elebila",
"faclair-beag",
"google-2018",
"google-b-1-m",
"google-b-m",
"google",
"gulesider-mobile-NO",
"heureka-cz",
"hotline-ua",
"leit-is",
"leo_ende_de",
"list-am",
"mapy-cz",
"mercadolibre-ar",
"mercadolibre-cl",
"mercadolibre-mx",
"naver-kr",
"odpiralni",
"pazaruvaj",
"pledarigrond",
"prisjakt-sv-SE",
"qwant",
"rediff",
"reta-vortaro",
"salidzinilv",
"seznam-cz",
"skroutz",
"slovnik-sk",
"sslv",
"sztaki-en-hu",
"taobao",
"tearma",
"twitter-ja",
"twitter",
"vatera",
"wikipedia-NN",
"wikipedia-NO",
"wikipedia-an",
"wikipedia-ar",
"wikipedia-as",
"wikipedia-ast",
"wikipedia-az",
"wikipedia-be",
"wikipedia-bg",
"wikipedia-bn",
"wikipedia-br",
"wikipedia-bs",
"wikipedia-ca",
"wikipedia-cy",
"wikipedia-cz",
"wikipedia-da",
"wikipedia-de",
"wikipedia-dsb",
"wikipedia-el",
"wikipedia-eo",
"wikipedia-es",
"wikipedia-et",
"wikipedia-eu",
"wikipedia-fa",
"wikipedia-fi",
"wikipedia-fr",
"wikipedia-fy-NL",
"wikipedia-ga-IE",
"wikipedia-gd",
"wikipedia-gl",
"wikipedia-gn",
"wikipedia-gu",
"wikipedia-he",
"wikipedia-hi",
"wikipedia-hr",
"wikipedia-hsb",
"wikipedia-hu",
"wikipedia-hy-AM",
"wikipedia-ia",
"wikipedia-id",
"wikipedia-is",
"wikipedia-it",
"wikipedia-ja",
"wikipedia-ka",
"wikipedia-kab",
"wikipedia-kk",
"wikipedia-km",
"wikipedia-kn",
"wikipedia-lij",
"wikipedia-lo",
"wikipedia-lt",
"wikipedia-ltg",
"wikipedia-lv",
"wikipedia-ml",
"wikipedia-mr",
"wikipedia-ms",
"wikipedia-my",
"wikipedia-ne",
"wikipedia-nl",
"wikipedia-oc",
"wikipedia-or",
"wikipedia-pa",
"wikipedia-pl",
"wikipedia-pt",
"wikipedia-rm",
"wikipedia-ro",
"wikipedia-ru",
"wikipedia-sk",
"wikipedia-sl",
"wikipedia-sq",
"wikipedia-sr",
"wikipedia-sv-SE",
"wikipedia-ta",
"wikipedia-te",
"wikipedia-th",
"wikipedia-tr",
"wikipedia-uk",
"wikipedia-ur",
"wikipedia-uz",
"wikipedia-vi",
"wikipedia-wo",
"wikipedia-zh-CN",
"wikipedia-zh-TW",
"wikipedia",
"wiktionary-kn",
"wiktionary-oc",
"wiktionary-or",
"wiktionary-ta",
"wiktionary-te",
"yahoo-jp",
"yandex-en",
"yandex-ru",
"yandex-tr",
"yandex.by",
"yandex"
)
)
}

@ -16,7 +16,7 @@ class SearchStoreTest {
@Test
fun updateQuery() = runBlocking {
val initialState = emptyDefaultState()
val store = SearchStore(initialState, ::searchStateReducer)
val store = SearchStore(initialState)
val query = "test query"
store.dispatch(SearchAction.UpdateQuery(query)).join()
@ -27,7 +27,7 @@ class SearchStoreTest {
@Test
fun selectSearchShortcutEngine() = runBlocking {
val initialState = emptyDefaultState()
val store = SearchStore(initialState, ::searchStateReducer)
val store = SearchStore(initialState)
val searchEngine: SearchEngine = mockk()
store.dispatch(SearchAction.SearchShortcutEngineSelected(searchEngine)).join()
@ -38,7 +38,7 @@ class SearchStoreTest {
@Test
fun showSearchShortcutEnginePicker() = runBlocking {
val initialState = emptyDefaultState()
val store = SearchStore(initialState, ::searchStateReducer)
val store = SearchStore(initialState)
store.dispatch(SearchAction.ShowSearchShortcutEnginePicker(true)).join()
assertNotSame(initialState, store.state)

@ -33,7 +33,7 @@ object Versions {
const val androidx_work = "2.0.1"
const val google_material = "1.1.0-alpha07"
const val mozilla_android_components = "4.0.0"
const val mozilla_android_components = "4.0.1"
// Note that android-components also depends on application-services,
// and in fact is our main source of appservices-related functionality.
// The version number below tracks the application-services version

@ -705,7 +705,6 @@ tracking_protection</td>
</table>
</pre>
## history
<pre>
@ -762,6 +761,137 @@ tracking_protection</td>
</pre>
## reader_mode
<pre>
<table style="width: 100%">
<tr>
<th>key</th>
<th>type</th>
<th>description</th>
<th>data deview</th>
<th>extras</th>
<th>expires</th>
</tr>
<tr>
<td>available</td>
<td>event</td>
<td>Reader mode is available for the current page</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3941">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>opened</td>
<td>event</td>
<td>A user opened reader mode</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3941">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>appearance</td>
<td>event</td>
<td>A user tapped the appearance button</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3941">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
</table>
</pre>
## collections
<pre>
<table style="width: 100%">
<tr>
<th>key</th>
<th>type</th>
<th>description</th>
<th>data deview</th>
<th>extras</th>
<th>expires</th>
</tr>
<tr>
<td>renamed</td>
<td>event</td>
<td>A user renamed a collection</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>tab_restored</td>
<td>event</td>
<td>A user restored a tab from collection tab list</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>all_tabs_restored</td>
<td>event</td>
<td>A user tapped "open tabs" from collection menu</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>tab_removed</td>
<td>event</td>
<td>A user tapped remove tab from collection tab list</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>shared</td>
<td>event</td>
<td>A user tapped share collection</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>removed</td>
<td>event</td>
<td>A user tapped delete collection from collection menu</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
<tr>
<td>saved</td>
<td>event</td>
<td>A user saved a list of tabs to a new collection</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td>tabs_open: The number of tabs open in the current session
tabs_selected: The number of tabs added to the collection
</td>
<td>2020-03-01</td>
</tr>
<tr>
<td>tabs_added</td>
<td>event</td>
<td>A user saved a list of tabs to an existing collection</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td>tabs_open: The number of tabs open in the current session
tabs_selected: The number of tabs added to the collection
</td>
<td>2020-03-01</td>
</tr>
<tr>
<td>tab_select_opened</td>
<td>event</td>
<td>A user opened the select tabs screen (the first step of the collection creation flow)</td>
<td><a href="https://github.com/mozilla-mobile/fenix/pull/3935">link</a></td>
<td></td>
<td>2020-03-01</td>
</tr>
</table>
</pre>
## Metrics
Items that are added to the metrics ping

@ -5,11 +5,19 @@ locales = [
"de",
"es",
"es-ES",
"et",
"eu",
"fr",
"gd",
"id",
"it",
"ja",
"ko",
"nl",
"pl",
"ru",
"sk",
"sv-SE",
"zh-CN",
"zh-TW",
]

Loading…
Cancel
Save