diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 81aa72d6d..87d873964 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -48,6 +48,7 @@ # Possible startup regressions *Application.kt @mozilla-mobile/Performance +*StrictMode*kt @mozilla-mobile/Performance # We want to be aware of new features behind flags as well as features # about to be enabled. diff --git a/app/build.gradle b/app/build.gradle index 56083f372..1d620d4de 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -375,6 +375,7 @@ dependencies { implementation Deps.sentry + implementation Deps.mozilla_concept_base implementation Deps.mozilla_concept_engine implementation Deps.mozilla_concept_menu implementation Deps.mozilla_concept_push diff --git a/app/metrics.yaml b/app/metrics.yaml index 11bd45857..bfe448679 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -33,6 +33,10 @@ events: app started AND HomeActivity created = warm app started AND HomeActivity started = hot app created AND HomeActivity started = error + Some applications such as gmail launches the default browser in the + background. So when we eventually click a link, browser is already + started in the background. This means that custom_tab will mostly + report `warm` startup type. source: description: | The method used to open Fenix. Possible values are `app_icon`, @@ -48,14 +52,23 @@ events: for example, when we are doing a hot start up, we cant have a savedInstanceState therefore we report only [APP_ICON, HOT] instead of [APP_ICON, HOT, false]. + first_frame_pre_draw_nanos: + description: | + the number of nanoseconds the application took to launch. This is the + time difference between application launch(user pressing app_icon, + launching a link) and until the first view is about to be drawn + on the screen. If the time is not captured, this extra key will + not be reported. bugs: - https://github.com/mozilla-mobile/fenix/issues/11830 - https://github.com/mozilla-mobile/fenix/issues/12573 - https://github.com/mozilla-mobile/fenix/pull/13494 + - https://github.com/mozilla-mobile/fenix/issues/10069 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12114#pullrequestreview-445245341 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 - https://github.com/mozilla-mobile/fenix/pull/13494#pullrequestreview-474050499 + - https://github.com/mozilla-mobile/fenix/pull/15605#issuecomment-702365594 data_sensitivity: - interaction notification_emails: @@ -215,11 +228,12 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1785 - https://github.com/mozilla-mobile/fenix/pull/8314 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" preference_toggled: type: event description: | @@ -327,12 +341,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" fxa_manual_signin: type: event description: @@ -341,12 +356,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" privacy_notice: type: event description: @@ -355,12 +371,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pref_toggled_private_browsing: type: event description: @@ -369,12 +386,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pref_toggled_toolbar_position: type: event description: @@ -388,12 +406,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pref_toggled_tracking_prot: type: event description: @@ -407,12 +426,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" whats_new: type: event description: @@ -421,12 +441,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pref_toggled_theme_picker: type: event description: @@ -440,12 +461,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" finish: type: event description: @@ -454,12 +476,13 @@ onboarding: - https://github.com/mozilla-mobile/fenix/issues/10824 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11867 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_shortcuts: selected: @@ -474,9 +497,10 @@ search_shortcuts: - https://github.com/mozilla-mobile/fenix/issues/793 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1202#issuecomment-476870449 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" toolbar_settings: changed_position: @@ -491,11 +515,12 @@ toolbar_settings: - https://github.com/mozilla-mobile/fenix/issues/6054 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6608 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" crash_reporter: opened: @@ -620,11 +645,12 @@ find_in_page: - https://github.com/mozilla-mobile/fenix/issues/1036 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed: type: event description: | @@ -633,11 +659,12 @@ find_in_page: - https://github.com/mozilla-mobile/fenix/issues/1036 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" searched_page: type: event description: | @@ -646,11 +673,12 @@ find_in_page: - https://github.com/mozilla-mobile/fenix/issues/1036 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" metrics: default_browser: @@ -664,11 +692,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/960 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" top_sites_count: type: counter lifetime: application @@ -684,11 +713,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/8125 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9556 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" has_top_sites: type: boolean lifetime: application @@ -700,11 +730,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/8125 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9556 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" recently_used_pwa_count: type: counter lifetime: application @@ -724,11 +755,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/11909 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-12-01" + expires: "2021-08-01" has_recent_pwas: type: boolean lifetime: application @@ -741,11 +773,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/11909 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-12-01" + expires: "2021-08-01" search_count: type: labeled_counter description: | @@ -768,12 +801,13 @@ metrics: - https://github.com/mozilla-mobile/fenix/pull/1677 - https://github.com/mozilla-mobile/fenix/pull/5216 - https://github.com/mozilla-mobile/fenix/pull/7310 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" mozilla_products: type: string_list lifetime: application @@ -789,12 +823,13 @@ metrics: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1953/ - https://github.com/mozilla-mobile/fenix/pull/5216 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" default_moz_browser: type: string lifetime: application @@ -808,12 +843,13 @@ metrics: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1953/ - https://github.com/mozilla-mobile/fenix/pull/5216 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" adjust_campaign: type: string lifetime: application @@ -828,11 +864,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/9136 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5579 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" adjust_ad_group: type: string lifetime: application @@ -847,11 +884,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/9136 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9253 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" adjust_creative: type: string lifetime: application @@ -866,11 +904,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/9136 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9253 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" adjust_network: type: string lifetime: application @@ -885,11 +924,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/9136 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9253 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" toolbar_position: type: string lifetime: application @@ -901,11 +941,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/6054 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6608 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_widget_installed: type: boolean lifetime: application @@ -917,11 +958,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/9488 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10958 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" tabs_open_count: type: counter lifetime: application @@ -937,11 +979,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/11479 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12024 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" has_open_tabs: type: boolean lifetime: application @@ -953,11 +996,12 @@ metrics: - https://github.com/mozilla-mobile/fenix/issues/11479 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12024 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" preferences: show_search_suggestions: @@ -971,11 +1015,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" remote_debugging: type: string_list description: > @@ -987,11 +1032,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" telemetry: type: string_list description: > @@ -1005,11 +1051,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" tracking_protection: type: string_list description: > @@ -1022,11 +1069,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_bookmarks: type: string_list description: > @@ -1038,11 +1086,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_browsing_history: type: string_list description: > @@ -1054,11 +1103,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" show_clipboard_suggestions: type: string_list description: > @@ -1070,11 +1120,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" show_search_shortcuts: type: string_list description: > @@ -1086,11 +1137,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" open_links_in_a_private_tab: type: string_list description: > @@ -1102,11 +1154,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sync: type: string_list description: > @@ -1118,11 +1171,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sync_items: type: string_list description: > @@ -1136,11 +1190,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" show_voice_search: type: string_list description: > @@ -1152,11 +1207,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_suggestions_private: type: string_list description: > @@ -1169,11 +1225,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" toolbar_position: type: string_list description: > @@ -1185,11 +1242,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" accessibility_services: type: string_list description: > @@ -1202,11 +1260,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11211 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" open_links_in_app: type: string_list description: > @@ -1218,11 +1277,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11446 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" theme: type: string_list description: > @@ -1234,11 +1294,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/11118 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11446 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search.default_engine: code: @@ -1256,12 +1317,13 @@ search.default_engine: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1606 - https://github.com/mozilla-mobile/fenix/pull/5216 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" name: type: string lifetime: application @@ -1277,12 +1339,13 @@ search.default_engine: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1606 - https://github.com/mozilla-mobile/fenix/pull/5216 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" submission_url: type: string lifetime: application @@ -1299,12 +1362,13 @@ search.default_engine: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1606 - https://github.com/mozilla-mobile/fenix/pull/5216 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" bookmarks_management: open_in_new_tab: @@ -1570,11 +1634,12 @@ qr_scanner: - https://github.com/mozilla-mobile/fenix/issues/1857 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" prompt_displayed: type: event description: | @@ -1584,11 +1649,12 @@ qr_scanner: - https://github.com/mozilla-mobile/fenix/issues/1857 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" navigation_allowed: type: event description: | @@ -1598,11 +1664,12 @@ qr_scanner: - https://github.com/mozilla-mobile/fenix/issues/1857 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" navigation_denied: type: event description: | @@ -1612,11 +1679,12 @@ qr_scanner: - https://github.com/mozilla-mobile/fenix/issues/1857 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" error_page: visited_error: @@ -1646,11 +1714,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed: type: event description: | @@ -1659,11 +1728,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" use_email: type: event description: | @@ -1673,11 +1743,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/9834 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" use_email_problem: type: event description: | @@ -1686,11 +1757,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/9834 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sign_in: type: event description: | @@ -1700,11 +1772,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sign_out: type: event description: | @@ -1714,11 +1787,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sign_up: type: event description: | @@ -1727,12 +1801,13 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/4971 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" paired: type: event description: | @@ -1742,12 +1817,13 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/4971 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" auto_login: type: event description: | @@ -1757,12 +1833,13 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/4971 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" recovered: type: event description: | @@ -1772,12 +1849,13 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/4971 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" other_external: type: event description: | @@ -1787,12 +1865,13 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/4971 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" scan_pairing: type: event description: | @@ -1801,11 +1880,12 @@ sync_auth: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sync_account: opened: @@ -1816,11 +1896,12 @@ sync_account: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed: type: event description: | @@ -1829,11 +1910,12 @@ sync_account: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sync_now: type: event description: | @@ -1842,11 +1924,12 @@ sync_account: - https://github.com/mozilla-mobile/fenix/issues/1190 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" send_tab: type: event description: | @@ -1855,11 +1938,12 @@ sync_account: - https://github.com/mozilla-mobile/fenix/issues/4908 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5106 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" sign_in_to_send_tab: type: event description: | @@ -1868,11 +1952,12 @@ sync_account: - https://github.com/mozilla-mobile/fenix/issues/4908 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5106 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" history: opened: @@ -1883,11 +1968,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/2362 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3940 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" removed: type: event description: | @@ -1896,11 +1982,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/2362 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3940 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" removed_all: type: event description: | @@ -1909,11 +1996,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/2362 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3940 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" shared: type: event description: | @@ -1922,11 +2010,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/2362 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3940 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" opened_item: type: event description: | @@ -1935,11 +2024,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/2362 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3940 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" tip: displayed: @@ -1953,11 +2043,12 @@ tip: - https://github.com/mozilla-mobile/fenix/issues/9328 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9836 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pressed: type: event description: | @@ -1969,11 +2060,12 @@ tip: - https://github.com/mozilla-mobile/fenix/issues/9328 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9836 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed: type: event description: | @@ -1985,11 +2077,12 @@ tip: - https://github.com/mozilla-mobile/fenix/issues/9328 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9836 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" reader_mode: available: @@ -2000,11 +2093,12 @@ reader_mode: - https://github.com/mozilla-mobile/fenix/issues/2267 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3941 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" opened: type: event description: | @@ -2013,11 +2107,12 @@ reader_mode: - https://github.com/mozilla-mobile/fenix/issues/2267 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3941 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed: type: event description: | @@ -2026,11 +2121,12 @@ reader_mode: - https://github.com/mozilla-mobile/fenix/issues/2267 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4328 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" appearance: type: event description: | @@ -2039,11 +2135,12 @@ reader_mode: - https://github.com/mozilla-mobile/fenix/issues/2267 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3941 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" tabs_tray: opened: @@ -2054,11 +2151,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed: type: event description: | @@ -2067,11 +2165,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" opened_existing_tab: type: event description: | @@ -2080,11 +2179,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" closed_existing_tab: type: event description: | @@ -2093,11 +2193,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" private_mode_tapped: type: event description: | @@ -2106,11 +2207,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" normal_mode_tapped: type: event description: | @@ -2119,11 +2221,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" new_tab_tapped: type: event description: | @@ -2132,11 +2235,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" new_private_tab_tapped: type: event description: | @@ -2145,11 +2249,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" menu_opened: type: event description: | @@ -2158,11 +2263,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" save_to_collection: type: event description: | @@ -2172,11 +2278,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" share_all_tabs: type: event description: | @@ -2186,11 +2293,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" close_all_tabs: type: event description: | @@ -2200,11 +2308,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/11273 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/12036 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" collections: renamed: @@ -2427,11 +2536,12 @@ search_widget: - https://github.com/mozilla-mobile/fenix/issues/4457 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4714 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" voice_button: type: event description: | @@ -2440,11 +2550,12 @@ search_widget: - https://github.com/mozilla-mobile/fenix/issues/4457 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4714 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_widget_cfr: displayed: @@ -2455,11 +2566,12 @@ search_widget_cfr: - https://github.com/mozilla-mobile/fenix/issues/9488 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10958 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" add_widget_pressed: type: event description: | @@ -2468,11 +2580,12 @@ search_widget_cfr: - https://github.com/mozilla-mobile/fenix/issues/9488 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10958 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" not_now_pressed: type: event description: | @@ -2481,11 +2594,12 @@ search_widget_cfr: - https://github.com/mozilla-mobile/fenix/issues/9488 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10958 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" canceled: type: event description: | @@ -2495,11 +2609,12 @@ search_widget_cfr: - https://github.com/mozilla-mobile/fenix/issues/9488 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10958 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" private_browsing_mode: garbage_icon: @@ -2511,11 +2626,12 @@ private_browsing_mode: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4968 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" snackbar_undo: type: event description: | @@ -2525,11 +2641,12 @@ private_browsing_mode: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4968 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" notification_tapped: type: event description: | @@ -2538,11 +2655,12 @@ private_browsing_mode: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4968 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" notification_open: type: event description: | @@ -2551,11 +2669,12 @@ private_browsing_mode: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4968 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" notification_delete: type: event description: | @@ -2565,11 +2684,12 @@ private_browsing_mode: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4968 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" contextual_hint.tracking_protection: display: @@ -2644,11 +2764,12 @@ tracking_protection: - https://github.com/mozilla-mobile/fenix/issues/5312 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" panel_settings: type: event description: | @@ -2657,11 +2778,12 @@ tracking_protection: - https://github.com/mozilla-mobile/fenix/issues/5312 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" etp_shield: type: event description: | @@ -2670,11 +2792,12 @@ tracking_protection: - https://github.com/mozilla-mobile/fenix/issues/5312 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" etp_tracker_list: type: event description: | @@ -2684,11 +2807,12 @@ tracking_protection: - https://github.com/mozilla-mobile/fenix/issues/5312 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" etp_settings: type: event description: | @@ -2697,11 +2821,12 @@ tracking_protection: - https://github.com/mozilla-mobile/fenix/issues/5312 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" etp_setting_changed: type: event description: | @@ -2716,11 +2841,12 @@ tracking_protection: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 - https://github.com/mozilla-mobile/fenix/pull/11383 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" private_browsing_shortcut: create_shortcut: @@ -2731,11 +2857,12 @@ private_browsing_shortcut: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5194 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" cfr_add_shortcut: type: event description: | @@ -2745,11 +2872,12 @@ private_browsing_shortcut: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5194 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" cfr_cancel: type: event description: | @@ -2759,11 +2887,12 @@ private_browsing_shortcut: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5194 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pinned_shortcut_priv: type: event description: | @@ -2773,11 +2902,12 @@ private_browsing_shortcut: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5194 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" static_shortcut_tab: type: event description: | @@ -2787,11 +2917,12 @@ private_browsing_shortcut: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5194 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" static_shortcut_priv: type: event description: | @@ -2801,11 +2932,12 @@ private_browsing_shortcut: - https://github.com/mozilla-mobile/fenix/issues/4658 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5194 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" tab: media_play: @@ -2816,11 +2948,12 @@ tab: - https://github.com/mozilla-mobile/fenix/issues/5197 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5266 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" no_lint: - COMMON_PREFIX media_pause: @@ -2831,11 +2964,12 @@ tab: - https://github.com/mozilla-mobile/fenix/issues/5197 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5266 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" media_notification: play: @@ -2846,11 +2980,12 @@ media_notification: - https://github.com/mozilla-mobile/fenix/issues/5197 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5520 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pause: type: event description: | @@ -2859,11 +2994,12 @@ media_notification: - https://github.com/mozilla-mobile/fenix/issues/5197 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5520 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" media_state: play: @@ -2874,11 +3010,12 @@ media_state: - https://github.com/mozilla-mobile/fenix/issues/5705 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6463 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" pause: type: event description: | @@ -2887,11 +3024,12 @@ media_state: - https://github.com/mozilla-mobile/fenix/issues/5705 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6463 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" stop: type: event description: | @@ -2900,11 +3038,12 @@ media_state: - https://github.com/mozilla-mobile/fenix/issues/5705 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6463 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" logins: open_logins: @@ -2915,11 +3054,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/5586 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6352 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" open_individual_login: type: event description: | @@ -2928,11 +3068,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/5586 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6352 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" copy_login: type: event description: | @@ -2941,11 +3082,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/5586 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6352 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" view_password_login: type: event description: | @@ -2954,11 +3096,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/5586 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6352 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" save_logins_setting_changed: type: event description: | @@ -2972,11 +3115,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/5586 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/7767 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" open_login_editor: type: event description: | @@ -2985,11 +3129,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/10173 data_reviews: - https://github.com/mozilla-mobile/fenix/issues/11208 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" delete_saved_login: type: event description: | @@ -2998,11 +3143,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/10173 data_reviews: - https://github.com/mozilla-mobile/fenix/issues/11208 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" save_edited_login: type: event description: | @@ -3011,11 +3157,12 @@ logins: - https://github.com/mozilla-mobile/fenix/issues/10173 data_reviews: - https://github.com/mozilla-mobile/fenix/issues/11208 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" download_notification: resume: @@ -3128,11 +3275,12 @@ user_specified_search_engines: - https://github.com/mozilla-mobile/fenix/issues/5884 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6918 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" no_lint: - COMMON_PREFIX custom_engine_deleted: @@ -3144,11 +3292,12 @@ user_specified_search_engines: - https://github.com/mozilla-mobile/fenix/issues/7881 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6918 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" search_suggestions: enable_in_private: @@ -3159,12 +3308,13 @@ search_suggestions: - https://github.com/mozilla-mobile/fenix/issues/6070 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6746 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" voice_search: tapped: @@ -3175,11 +3325,12 @@ voice_search: - https://github.com/mozilla-mobile/fenix/issues/10465 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10785 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" top_sites: open_default: @@ -3190,11 +3341,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/8125 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10752 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" open_frecency: type: event description: | @@ -3203,11 +3355,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/14565 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/15136 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-03-15" + expires: "2021-08-01" open_pinned: type: event description: | @@ -3216,11 +3369,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/14565 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/15136 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-03-15" + expires: "2021-08-01" swipe_carousel: type: event description: | @@ -3233,11 +3387,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/14565 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/15136 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-03-15" + expires: "2021-08-01" long_press: type: event description: | @@ -3250,11 +3405,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/14565 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/15136 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-03-15" + expires: "2021-08-01" open_in_new_tab: type: event description: | @@ -3263,11 +3419,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/6757 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/7523 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" open_in_private_tab: type: event description: | @@ -3276,11 +3433,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/6757 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/7523 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" remove: type: event description: | @@ -3289,11 +3447,12 @@ top_sites: - https://github.com/mozilla-mobile/fenix/issues/6757 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/7523 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" about_page: support_tapped: @@ -3355,11 +3514,12 @@ pocket: - https://github.com/mozilla-mobile/fenix/issues/8126 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8098 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" no_lint: - COMMON_PREFIX @@ -3371,11 +3531,12 @@ pocket: - https://github.com/mozilla-mobile/fenix/issues/8126 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8098 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" first_session: campaign: @@ -3388,12 +3549,13 @@ first_session: - https://github.com/mozilla-mobile/fenix/issues/7295 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" network: type: string send_in_pings: @@ -3404,12 +3566,13 @@ first_session: - https://github.com/mozilla-mobile/fenix/issues/7295 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" adgroup: type: string send_in_pings: @@ -3420,12 +3583,13 @@ first_session: - https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586480836 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" creative: send_in_pings: - first-session @@ -3436,12 +3600,13 @@ first_session: - https://github.com/mozilla-mobile/fenix/issues/7295 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" timestamp: send_in_pings: - first-session @@ -3454,12 +3619,13 @@ first_session: - https://github.com/mozilla-mobile/fenix/issues/7295 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" browser.search: with_ads: @@ -3473,11 +3639,12 @@ browser.search: - https://github.com/mozilla-mobile/fenix/issues/6558 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10112 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" ad_clicks: type: labeled_counter description: | @@ -3489,11 +3656,12 @@ browser.search: - https://github.com/mozilla-mobile/fenix/issues/6558 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10112 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" in_content: type: labeled_counter description: | @@ -3504,11 +3672,12 @@ browser.search: - https://github.com/mozilla-mobile/fenix/issues/6557 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10167 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" addons: open_addons_in_settings: @@ -3628,12 +3797,13 @@ startup.timeline: - https://github.com/mozilla-mobile/fenix/issues/8803 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical notification_emails: - perf-android-fe@mozilla.com - mcomella@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" framework_start_error: send_in_pings: - startup-timeline @@ -3646,12 +3816,13 @@ startup.timeline: - https://github.com/mozilla-mobile/fenix/issues/8803 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical notification_emails: - perf-android-fe@mozilla.com - mcomella@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" framework_start_read_error: send_in_pings: - startup-timeline @@ -3664,12 +3835,13 @@ startup.timeline: - https://github.com/mozilla-mobile/fenix/issues/10434 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/10481 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical notification_emails: - perf-android-fe@mozilla.com - mcomella@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" clock_ticks_per_second: send_in_pings: - startup-timeline @@ -3682,12 +3854,13 @@ startup.timeline: - https://github.com/mozilla-mobile/fenix/issues/8803 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626 + - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 data_sensitivity: - technical notification_emails: - perf-android-fe@mozilla.com - mcomella@mozilla.com - expires: "2020-11-15" + expires: "2021-08-01" perf.awesomebar: history_suggestions: diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt index 2b47a32a0..10b8b5d33 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt @@ -9,6 +9,8 @@ import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.ActivityTestRule import androidx.test.uiautomator.UiDevice import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.onboarding.FenixOnboarding +import org.mozilla.fenix.ui.robots.appContext /** * A [org.junit.Rule] to handle shared test set up for tests on [HomeActivity]. @@ -17,11 +19,16 @@ import org.mozilla.fenix.HomeActivity * @param launchActivity See [ActivityTestRule] */ -class HomeActivityTestRule(initialTouchMode: Boolean = false, launchActivity: Boolean = true) : +class HomeActivityTestRule( + initialTouchMode: Boolean = false, + launchActivity: Boolean = true, + private val skipOnboarding: Boolean = false +) : ActivityTestRule(HomeActivity::class.java, initialTouchMode, launchActivity) { override fun beforeActivityLaunched() { super.beforeActivityLaunched() setLongTapTimeout() + if (skipOnboarding) { skipOnboardingBeforeLaunch() } } } @@ -35,12 +42,14 @@ class HomeActivityTestRule(initialTouchMode: Boolean = false, launchActivity: Bo class HomeActivityIntentTestRule( initialTouchMode: Boolean = false, - launchActivity: Boolean = true + launchActivity: Boolean = true, + private val skipOnboarding: Boolean = false ) : IntentsTestRule(HomeActivity::class.java, initialTouchMode, launchActivity) { override fun beforeActivityLaunched() { super.beforeActivityLaunched() setLongTapTimeout() + if (skipOnboarding) { skipOnboardingBeforeLaunch() } } } @@ -49,3 +58,9 @@ fun setLongTapTimeout() { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mDevice.executeShellCommand("settings put secure long_press_timeout 3000") } + +private fun skipOnboardingBeforeLaunch() { + // The production code isn't aware that we're using + // this API so it can be fragile. + FenixOnboarding(appContext).finish() +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt index 19464c018..19f97ddcb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt @@ -340,14 +340,4 @@ class HistoryTest { verifyShareTabUrl() } } - - @Test - fun verifyCloseMenu() { - homeScreen { - }.openThreeDotMenu { - }.openHistory { - }.closeMenu { - verifyHomeScreen() - } - } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt index 8069ccb38..5f3baff90 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt @@ -8,6 +8,7 @@ import androidx.test.uiautomator.UiSelector import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher @@ -53,6 +54,7 @@ class MediaNotificationTest { } @Test + @Ignore("https://github.com/mozilla-mobile/fenix/issues/15754") fun videoPlaybackSystemNotificationTest() { val videoTestPage = TestAssetHelper.getVideoPageAsset(mockWebServer) @@ -86,6 +88,7 @@ class MediaNotificationTest { } @Test + @Ignore("https://github.com/mozilla-mobile/fenix/issues/15754") fun audioPlaybackSystemNotificationTest() { val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) @@ -119,6 +122,7 @@ class MediaNotificationTest { } @Test + @Ignore("https://github.com/mozilla-mobile/fenix/issues/15754") fun tabMediaControlButtonTest() { val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) @@ -137,6 +141,7 @@ class MediaNotificationTest { } @Test + @Ignore("https://github.com/mozilla-mobile/fenix/issues/15754") fun mediaSystemNotificationInPrivateModeTest() { val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt index 5e5c69a1f..3fb219518 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt @@ -69,7 +69,7 @@ class SettingsBasicsTest { verifyBasicsHeading() verifySearchEngineButton() verifyDefaultBrowserItem() - verifyCloseTabsItem() + verifyTabsItem() // drill down to submenu }.openSearchSubMenu { verifyDefaultSearchEngineHeader() @@ -85,7 +85,7 @@ class SettingsBasicsTest { verifyThemes() }.goBack { }.openAccessibilitySubMenu { - verifyAutomaticFontSizingMenuItems() + verifyMenuItems() }.goBack { // drill down to submenu } @@ -175,13 +175,13 @@ class SettingsBasicsTest { homeScreen { }.openThreeDotMenu { }.openSettings { - }.openCloseTabsSubMenu { + }.openTabsSubMenu { verifyOptions() } } @Test - fun changeAccessibiltySettings() { + fun changeAccessibilitySettings() { // Goes through the settings and changes the default text on a webpage, then verifies if the text has changed. val fenixApp = activityIntentTestRule.activity.applicationContext as FenixApplication val webpage = getLoremIpsumAsset(mockWebServer).url @@ -193,8 +193,7 @@ class SettingsBasicsTest { }.openThreeDotMenu { }.openSettings { }.openAccessibilitySubMenu { - clickFontSizingSwitch() - verifyNewMenuItems() + verifyMenuItems() changeTextSizeSlider(textSizePercentage) verifyTextSizePercentage(textSizePercentage) }.goBack { @@ -202,14 +201,6 @@ class SettingsBasicsTest { }.openNavigationToolbar { }.enterURLAndEnterToBrowser(webpage) { checkTextSizeOnWebsite(textSizePercentage, fenixApp.components) - }.openTabDrawer { - }.openNewTab { - }.dismiss { - }.openThreeDotMenu { - }.openSettings { - }.openAccessibilitySubMenu { - clickFontSizingSwitch() - verifyNewMenuItemsAreGone() } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt index a61808773..78802cda9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt @@ -119,6 +119,12 @@ class SettingsPrivacyTest { verifySitePermissionsNotificationSubMenuItems() }.goBack { + // SITE PERMISSIONS PERSISTENT STORAGE + }.openPersistentStorage { + verifyNavigationToolBarHeader("Persistent Storage") + verifySitePermissionsPersistentStorageSubMenuItems() + }.goBack { + // SITE PERMISSIONS EXCEPTIONS }.openExceptions { verifyNavigationToolBarHeader() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictModeStartupSuppressionCountTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictModeStartupSuppressionCountTest.kt new file mode 100644 index 000000000..ece75c63d --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictModeStartupSuppressionCountTest.kt @@ -0,0 +1,58 @@ +/* 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.ui + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.helpers.HomeActivityTestRule + +// PLEASE CONSULT WITH PERF TEAM BEFORE CHANGING THIS VALUE. +private const val EXPECTED_SUPPRESSION_COUNT = 11 + +private const val FAILURE_MSG = """StrictMode startup suppression count does not match expected count. + + If this PR removed code that suppressed StrictMode, great! Please decrement the suppression count. + + Did this PR add or call code that suppresses a StrictMode violation? + Did you know that suppressing a StrictMode violation can introduce performance regressions? + + If so, please do your best to implement a solution without suppressing StrictMode. + Please consult the perf team if you have questions or believe suppressing StrictMode + is the optimal solution. + +""" + +/** + * A performance test to limit the number of StrictMode suppressions on startup. + * This test was written by the perf team. + * + * StrictMode detects main thread IO, which is often indicative of a performance issue. + * It's easy to suppress StrictMode so we wrote a test to ensure we have a discussion + * if the StrictMode count changes. The perf team is code owners for this file so they + * should be notified when the count is modified. + * + * IF YOU UPDATE THE TEST NAME, UPDATE CODE OWNERS. + */ +class StrictModeStartupSuppressionCountTest { + @get:Rule + val activityTestRule = HomeActivityTestRule(skipOnboarding = true) + + private val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + + @Test + fun verifyStrictModeSuppressionCount() { + uiDevice.waitForIdle() // wait for async UI to load. + + // This might cause intermittents: at an arbitrary point after start up (such as the visual + // completeness queue), we might run code on the main thread that suppresses StrictMode, + // causing this number to fluctuate depending on device speed. We'll deal with it if it occurs. + val actual = activityTestRule.activity.components.strictMode.suppressionCount.toInt() + assertEquals(FAILURE_MSG, EXPECTED_SUPPRESSION_COUNT, actual) + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt index 72d62ec06..60a96e96d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt @@ -84,16 +84,7 @@ class HistoryRobot { fun verifyDeleteSnackbarText(text: String) = assertSnackBarText(text) class Transition { - fun closeMenu(interact: HistoryRobot.() -> Unit): Transition { - closeButton().click() - - HistoryRobot().interact() - return Transition() - } - fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { - closeButton().click() - BrowserRobot().interact() return BrowserRobot.Transition() } @@ -114,8 +105,6 @@ fun historyMenu(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { return HistoryRobot.Transition() } -private fun closeButton() = onView(withId(R.id.close_history)) - private fun testPageTitle() = onView(allOf(withId(R.id.title), withText("Test_Page_1"))) private fun pageUrl() = onView(withId(R.id.url)) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt index 5ed56bb1e..9e95e31e3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt @@ -51,7 +51,7 @@ class SettingsRobot { fun verifyAccessibilityButton() = assertAccessibilityButton() fun verifySetAsDefaultBrowserButton() = assertSetAsDefaultBrowserButton() fun verifyDefaultBrowserItem() = assertDefaultBrowserItem() - fun verifyCloseTabsItem() = assertCloseTabsItem() + fun verifyTabsItem() = assertTabsItem() fun verifyDefaultBrowserIsDisaled() = assertDefaultBrowserIsDisabled() fun clickDefaultBrowserSwitch() = toggleDefaultBrowserSwitch() fun verifyAndroidDefaultAppsMenuAppears() = assertAndroidDefaultAppsMenuAppears() @@ -135,10 +135,10 @@ class SettingsRobot { return SettingsSubMenuThemeRobot.Transition() } - fun openCloseTabsSubMenu(interact: SettingsSubMenuTabsRobot.() -> Unit): SettingsSubMenuTabsRobot.Transition { + fun openTabsSubMenu(interact: SettingsSubMenuTabsRobot.() -> Unit): SettingsSubMenuTabsRobot.Transition { - fun closeTabsButton() = onView(withText("Close tabs")) - closeTabsButton().click() + fun tabsButton() = onView(withText("Tabs")) + tabsButton().click() SettingsSubMenuTabsRobot().interact() return SettingsSubMenuTabsRobot.Transition() @@ -297,9 +297,9 @@ private fun assertDefaultBrowserItem() { .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } -private fun assertCloseTabsItem() { - mDevice.wait(Until.findObject(By.text("Close tabs")), waitingTime) - onView(withText("Close tabs")) +private fun assertTabsItem() { + mDevice.wait(Until.findObject(By.text("Tabs")), waitingTime) + onView(withText("Tabs")) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt index 9cc15d453..c02907f69 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAccessibilityRobot.kt @@ -21,7 +21,6 @@ import android.widget.TextView import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction import androidx.test.espresso.ViewAssertion -import androidx.test.espresso.assertion.ViewAssertions.doesNotExist import org.hamcrest.CoreMatchers.allOf import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withId @@ -49,13 +48,7 @@ class SettingsSubMenuAccessibilityRobot { const val TEXT_SIZE = 16f } - fun verifyAutomaticFontSizingMenuItems() = assertAutomaticFontSizingMenuItems() - - fun clickFontSizingSwitch() = toggleFontSizingSwitch() - - fun verifyNewMenuItems() = assertNewMenuItems() - - fun verifyNewMenuItemsAreGone() = assertNewMenuItemsAreGone() + fun verifyMenuItems() = assertMenuItems() fun changeTextSizeSlider(seekBarPercentage: Int) = adjustTextSizeSlider(seekBarPercentage) @@ -76,22 +69,7 @@ class SettingsSubMenuAccessibilityRobot { val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) -private fun assertAutomaticFontSizingMenuItems() { - onView(withText("Automatic font sizing")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - val strFont = "Font size will match your Android settings. Disable to manage font size here." - onView(withText(strFont)) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun toggleFontSizingSwitch() { - // Toggle font size to off - onView(withText("Automatic font sizing")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - .perform(click()) -} - -private fun assertNewMenuItems() { +private fun assertMenuItems() { assertFontSize() assertSliderBar() } @@ -125,22 +103,6 @@ private fun assertTextSizePercentage(textSize: Int) { .check(textSizePercentageEquals(textSize)) } -private fun assertNewMenuItemsAreGone() { - onView(withText("Font Size")).check(doesNotExist()) - val strFont = "Make text on websites larger or smaller" - onView(withText(strFont)) - .check(doesNotExist()) - - onView(withId(org.mozilla.fenix.R.id.sampleText)) - .check(doesNotExist()) - - onView(withId(org.mozilla.fenix.R.id.seekbar_value)) - .check(doesNotExist()) - - onView(withId(org.mozilla.fenix.R.id.seekbar)) - .check(doesNotExist()) -} - private fun goBackButton() = onView(allOf(withContentDescription("Navigate up"))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt index c6f6d039f..e88b38ba0 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt @@ -75,6 +75,12 @@ class SettingsSubMenuSitePermissionsCommonRobot { verifyCheckCommonRadioButtonDefault() } + fun verifySitePermissionsPersistentStorageSubMenuItems() { + verifyassertAskToAllowRecommended() + verifyassertBlocked() + verifyCheckCommonRadioButtonDefault() + } + class Transition { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!! diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt index da14f4c99..4c5a96629 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsRobot.kt @@ -118,6 +118,22 @@ class SettingsSubMenuSitePermissionsRobot { return SettingsSubMenuSitePermissionsCommonRobot.Transition() } + fun openPersistentStorage( + interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit + ): SettingsSubMenuSitePermissionsCommonRobot.Transition { + + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Persistent Storage")) + ) + ) + + openPersistentStorage().click() + + SettingsSubMenuSitePermissionsCommonRobot().interact() + return SettingsSubMenuSitePermissionsCommonRobot.Transition() + } + fun openExceptions( interact: SettingsSubMenuSitePermissionsExceptionsRobot.() -> Unit ): SettingsSubMenuSitePermissionsExceptionsRobot.Transition { @@ -176,8 +192,27 @@ class SettingsSubMenuSitePermissionsRobot { val notificationText = "Ask to allow" - onView(withText(notificationText)) + + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + allOf(hasDescendant(withText("Notification")), hasDescendant(withText(notificationText))) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + onView(withText("Persistent Storage")) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + + val persistentStorageText = + "Ask to allow" + + onView(withId(R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + allOf( + hasDescendant(withText("Persistent Storage")), + hasDescendant(withText(persistentStorageText)) + ) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } } @@ -199,5 +234,8 @@ private fun openMicrophone() = private fun openNotification() = onView(allOf(withText("Notification"))) +private fun openPersistentStorage() = + onView(allOf(withText("Persistent Storage"))) + private fun openExceptions() = onView(allOf(withText("Exceptions"))) diff --git a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt index eb13a10e4..f230d142a 100644 --- a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -47,7 +47,7 @@ object GeckoProvider { .build() val settings = context.components.settings - if (!settings.shouldUseAutoSize) { + if (!settings.shouldUseAutoSize()) { runtimeSettings.automaticFontSizeAdjustment = false val fontSize = settings.fontSizeFactor runtimeSettings.fontSizeFactor = fontSize diff --git a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt index 031c1c6c1..bbfd5cf41 100644 --- a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -47,7 +47,7 @@ object GeckoProvider { .build() val settings = context.components.settings - if (!settings.shouldUseAutoSize) { + if (!settings.shouldUseAutoSize()) { runtimeSettings.automaticFontSizeAdjustment = false val fontSize = settings.fontSizeFactor runtimeSettings.fontSizeFactor = fontSize diff --git a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt index a01593bb7..1740a26ef 100644 --- a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -57,7 +57,7 @@ object GeckoProvider { .build() val settings = context.components.settings - if (!settings.shouldUseAutoSize) { + if (!settings.shouldUseAutoSize()) { runtimeSettings.automaticFontSizeAdjustment = false val fontSize = settings.fontSizeFactor runtimeSettings.fontSizeFactor = fontSize diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 2b0617c7c..02060508e 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -26,6 +26,11 @@ object FeatureFlags { */ const val topFrecentSite = true + /** + * Shows the grid view settings for the tabs tray. + */ + val showGridViewInTabsSettings = Config.channel.isNightlyOrDebug + /** * Enables wait til first contentful paint */ diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index e73f6a8e5..1e99001e6 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -10,6 +10,7 @@ import android.content.res.Configuration import android.os.Build import android.os.Bundle import android.os.StrictMode +import android.os.SystemClock import android.text.format.DateUtils import android.util.AttributeSet import android.view.KeyEvent @@ -112,6 +113,11 @@ import java.lang.ref.WeakReference @OptIn(ExperimentalCoroutinesApi::class) @SuppressWarnings("TooManyFunctions", "LargeClass") open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { + // DO NOT MOVE ANYTHING ABOVE THIS, GETTING INIT TIME IS CRITICAL + // we need to store startup timestamp for warm startup. we cant directly store + // inside AppStartupTelemetry since that class lives inside components and + // components requires context to access. + protected val homeActivityInitTimeStampNanoSeconds = SystemClock.elapsedRealtimeNanos() private var webExtScope: CoroutineScope? = null lateinit var themeManager: ThemeManager @@ -235,13 +241,22 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } protected open fun startupTelemetryOnCreateCalled(safeIntent: SafeIntent, hasSavedInstanceState: Boolean) { - components.appStartupTelemetry.onHomeActivityOnCreate(safeIntent, hasSavedInstanceState) + components.appStartupTelemetry.onHomeActivityOnCreate( + safeIntent, + hasSavedInstanceState, + homeActivityInitTimeStampNanoSeconds, rootContainer + ) } override fun onRestart() { + // DO NOT MOVE ANYTHING ABOVE THIS.. + // we are measuring startup time for hot startup type + startupTelemetryOnRestartCalled() super.onRestart() + } - components.appStartupTelemetry.onHomeActivityOnRestart() + private fun startupTelemetryOnRestartCalled() { + components.appStartupTelemetry.onHomeActivityOnRestart(rootContainer) } @CallSuper @@ -254,8 +269,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { message = "onResume()" ) - components.appStartupTelemetry.onHomeActivityOnResume() - components.backgroundServices.accountManagerAvailableQueue.runIfReadyOrQueue { lifecycleScope.launch { // Make sure accountManager is initialized. @@ -304,6 +317,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { "finishing" to isFinishing.toString() ) ) + + components.appStartupTelemetry.onStop() } final override fun onPause() { @@ -740,7 +755,11 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { if (components.core.engine.profiler?.isProfilerActive() == true) { // Wrapping the `addMarker` method with `isProfilerActive` even though it's no-op when // profiler is not active. That way, `text` argument will not create a string builder all the time. - components.core.engine.profiler?.addMarker("HomeActivity.load", startTime, "newTab: $newTab") + components.core.engine.profiler?.addMarker( + "HomeActivity.load", + startTime, + "newTab: $newTab" + ) } } diff --git a/app/src/main/java/org/mozilla/fenix/StrictModeManager.kt b/app/src/main/java/org/mozilla/fenix/StrictModeManager.kt index b52faf9b3..4d48b3835 100644 --- a/app/src/main/java/org/mozilla/fenix/StrictModeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/StrictModeManager.kt @@ -2,24 +2,56 @@ * 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/. */ +// This class implements the alternative ways to suppress StrictMode with performance +// monitoring by wrapping the raw methods. This lint check tells us not to use the raw +// methods so we suppress the check. +@file:Suppress("MozillaStrictModeSuppression") + package org.mozilla.fenix import android.os.Build +import android.os.Looper import android.os.StrictMode +import androidx.annotation.VisibleForTesting +import androidx.annotation.VisibleForTesting.PRIVATE import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import mozilla.components.support.ktx.android.os.resetAfter +import org.mozilla.fenix.components.Components +import org.mozilla.fenix.perf.Performance +import org.mozilla.fenix.utils.Mockable private const val MANUFACTURE_HUAWEI: String = "HUAWEI" private const val MANUFACTURE_ONE_PLUS: String = "OnePlus" +private val logger = Performance.logger +private val mainLooper = Looper.getMainLooper() + /** * Manages strict mode settings for the application. */ -class StrictModeManager(config: Config) { +@Mockable +class StrictModeManager( + config: Config, + + // Ideally, we'd pass in a more specific value but there is a circular dependency: StrictMode + // is passed into Core but we'd need to pass in Core here. Instead, we take components and later + // fetch the value we need from it. + private val components: Components +) { - // This is public so it can be used by inline functions. - val isEnabledByBuildConfig = config.channel.isDebug + private val isEnabledByBuildConfig = config.channel.isDebug + + /** + * The number of times StrictMode has been suppressed. StrictMode can be used to prevent main + * thread IO but it's easy to suppress. We use this value, in combination with: + * - a test: that fails if the suppression count increases + * - a lint check: to ensure this value gets used instead of functions that work around it + * - code owners: to prevent modifications to these above items without perf knowing + * to make suppressions a more deliberate act. + */ + @VisibleForTesting(otherwise = PRIVATE) + var suppressionCount: Long = 0 /*** * Enables strict mode for debug purposes. meant to be run only in the main process. @@ -70,19 +102,33 @@ class StrictModeManager(config: Config) { /** * Runs the given [functionBlock] and sets the given [StrictMode.ThreadPolicy] after its * completion when in a build configuration that has StrictMode enabled. If StrictMode is - * not enabled, simply runs the [functionBlock]. - * - * This function is written in the style of [AutoCloseable.use]. + * not enabled, simply runs the [functionBlock]. This function is written in the style of + * [AutoCloseable.use]. * - * This is significantly less convenient to run than when it was written as an extension function - * on [StrictMode.ThreadPolicy] but I think this is okay: it shouldn't be easy to ignore StrictMode. + * This function contains perf improvements so it should be + * called instead of [mozilla.components.support.ktx.android.os.resetAfter] (using the wrong + * method should be prevented by a lint check). This is significantly less convenient to run than + * when it was written as an extension function on [StrictMode.ThreadPolicy] but I think this is + * okay: it shouldn't be easy to ignore StrictMode. * * @return the value returned by [functionBlock]. */ - inline fun resetAfter(policy: StrictMode.ThreadPolicy, functionBlock: () -> R): R { + fun resetAfter(policy: StrictMode.ThreadPolicy, functionBlock: () -> R): R { // Calling resetAfter takes 1-2ms (unknown device) so we only execute it if StrictMode can // actually be enabled. https://github.com/mozilla-mobile/fenix/issues/11617 return if (isEnabledByBuildConfig) { + // This can overflow and crash. However, it's unlikely we'll suppress StrictMode 9 + // quintillion times in a build config where StrictMode is enabled so we don't handle it + // because it'd increase complexity. + suppressionCount += 1 + + // We log so that devs are more likely to notice that we're suppressing StrictMode violations. + // We add profiler markers so that the perf team can easily identify IO locations in profiles. + logger.warn("StrictMode violation suppressed: #$suppressionCount") + if (Thread.currentThread() == mainLooper.thread) { // markers only supported on main thread. + components.core.engine.profiler?.addMarker("StrictMode.suppression", "Count: $suppressionCount") + } + policy.resetAfter(functionBlock) } else { functionBlock() diff --git a/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt b/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt index ba90b09bb..3503da67f 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt @@ -16,7 +16,7 @@ import androidx.core.view.updateLayoutParams import kotlinx.android.synthetic.main.mozac_ui_tabcounter_layout.view.* import kotlinx.android.synthetic.main.tab_preview.view.* import mozilla.components.browser.thumbnails.loader.ThumbnailLoader -import mozilla.components.support.images.ImageLoadRequest +import mozilla.components.concept.base.images.ImageLoadRequest import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index 6c743f86d..228865c3c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -127,7 +127,7 @@ class Components(private val context: Context) { val performance by lazy { PerformanceComponent() } val push by lazy { Push(context, analytics.crashReporter) } val wifiConnectionMonitor by lazy { WifiConnectionMonitor(context as Application) } - val strictMode by lazy { StrictModeManager(Config) } + val strictMode by lazy { StrictModeManager(Config, this) } val settings by lazy { Settings(context) } diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 4d76715be..3ce27cd47 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -95,8 +95,8 @@ class Core( trackingProtectionPolicy = trackingProtectionPolicyFactory.createTrackingProtectionPolicy(), historyTrackingDelegate = HistoryDelegate(lazyHistoryStorage), preferredColorScheme = getPreferredColorScheme(), - automaticFontSizeAdjustment = context.settings().shouldUseAutoSize, - fontInflationEnabled = context.settings().shouldUseAutoSize, + automaticFontSizeAdjustment = context.settings().shouldUseAutoSize(), + fontInflationEnabled = context.settings().shouldUseAutoSize(), suspendMediaWhenInactive = false, forceUserScalableContent = context.settings().forceEnableZoom, loginAutofillEnabled = context.settings().shouldAutofillLogins diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/AppLaunchTimeMeasurement.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/AppLaunchTimeMeasurement.kt new file mode 100644 index 000000000..548104555 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/AppLaunchTimeMeasurement.kt @@ -0,0 +1,80 @@ +/* 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 android.os.Process +import android.os.SystemClock +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.ERROR +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.WARM +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.HOT +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.COLD +import org.mozilla.fenix.perf.Stat + +/** + * Handles the logic of figuring out launch time for cold, warm and hot startup. + */ +class AppLaunchTimeMeasurement(private val stats: Stat = Stat()) { + + private var isOnPreDrawCalled = false + + private var applicationOnCreateTimeStampNanoSeconds: Long? = null + private var homeActivityInitTimeStampNanoSeconds: Long? = null + private var homeActivityOnRestartTimeStampNanoSeconds: Long? = null + // we are considering screen to be visible after the first pre draw call. + private var homeActivityOnPreDrawTimeStampNanoSeconds: Long? = null + + fun onHomeActivityOnCreate(activityInitNanos: Long) { + this.homeActivityInitTimeStampNanoSeconds = activityInitNanos + } + + fun onHomeActivityOnRestart(activityOnRestartNanos: Long = SystemClock.elapsedRealtimeNanos()) { + homeActivityOnRestartTimeStampNanoSeconds = activityOnRestartNanos + } + + fun onFirstFramePreDraw(activityOnPreDrawNanos: Long = SystemClock.elapsedRealtimeNanos()) { + isOnPreDrawCalled = true + homeActivityOnPreDrawTimeStampNanoSeconds = activityOnPreDrawNanos + } + + /** + * if we have both start and finish time for launch, return the difference otherwise return null. + */ + suspend fun getApplicationLaunchTime(startupType: Type): Long? = withContext(Dispatchers.IO) { + when { + // one use case is user launching the app and quicky pressing back button. in that case + // there will be no onPredraw call but activity will call onStop(). + !isOnPreDrawCalled -> { + null + } + else -> { + when (startupType) { + COLD -> { + applicationOnCreateTimeStampNanoSeconds = + stats.getProcessStartTimeStampNano(Process.myPid()) + homeActivityOnPreDrawTimeStampNanoSeconds!!.minus( + applicationOnCreateTimeStampNanoSeconds!! + ) + } + WARM -> { + homeActivityOnPreDrawTimeStampNanoSeconds!!.minus( + homeActivityInitTimeStampNanoSeconds!! + ) + } + HOT -> { + homeActivityOnPreDrawTimeStampNanoSeconds!!.minus( + homeActivityOnRestartTimeStampNanoSeconds!! + ) + } + ERROR -> { + null + } + } + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/AppStartupTelemetry.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/AppStartupTelemetry.kt index d5ab320cc..2c27397ed 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/AppStartupTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/AppStartupTelemetry.kt @@ -5,11 +5,14 @@ package org.mozilla.fenix.components.metrics import android.content.Intent +import android.view.View import androidx.annotation.VisibleForTesting +import androidx.core.view.doOnPreDraw import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent import androidx.lifecycle.ProcessLifecycleOwner +import kotlinx.coroutines.runBlocking import mozilla.components.support.utils.SafeIntent import org.mozilla.fenix.components.metrics.Event.AppAllStartup import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Source @@ -22,15 +25,21 @@ import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.ERROR import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.HOT import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.COLD import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.WARM +import java.lang.reflect.Modifier.PRIVATE /** - * Tracks application startup source, type, and whether or not activity has savedInstance to restore - * the activity from. Sample metric = [source = COLD, type = APP_ICON, hasSavedInstance = false] + * Tracks application startup source, type, launch time, and whether or not activity has + * savedInstance to restore the activity from. + * Sample = [source = COLD, type = APP_ICON, hasSavedInstanceState = false,launchTimeNanoSeconds = 1824000000] * The basic idea is to collect these metrics from different phases of startup through * [AppAllStartup] and finally report them on Activity's onResume() function. */ @Suppress("TooManyFunctions") -class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObserver { +class AppStartupTelemetry( + private val metrics: MetricController, + @VisibleForTesting(otherwise = PRIVATE) + var appLaunchTimeMeasurement: AppLaunchTimeMeasurement = AppLaunchTimeMeasurement() +) : LifecycleObserver { init { ProcessLifecycleOwner.get().lifecycle.addObserver(this) @@ -47,18 +56,42 @@ class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObse wasAppCreateCalledBeforeActivityCreate = true } - fun onHomeActivityOnCreate(safeIntent: SafeIntent, hasSavedInstanceState: Boolean) { - setOnCreateData(safeIntent, hasSavedInstanceState, false) + fun onHomeActivityOnCreate( + safeIntent: SafeIntent, + hasSavedInstanceState: Boolean, + homeActivityInitTimeStampNanoSeconds: Long, + rootContainer: View + ) { + setOnCreateData(safeIntent, hasSavedInstanceState, homeActivityInitTimeStampNanoSeconds, false) + rootContainer.doOnPreDraw { + onPreDraw() + } } - fun onExternalAppBrowserOnCreate(safeIntent: SafeIntent, hasSavedInstanceState: Boolean) { - setOnCreateData(safeIntent, hasSavedInstanceState, true) + fun onExternalAppBrowserOnCreate( + safeIntent: SafeIntent, + hasSavedInstanceState: Boolean, + homeActivityInitTimeStampNanoSeconds: Long, + rootContainer: View + ) { + setOnCreateData(safeIntent, hasSavedInstanceState, homeActivityInitTimeStampNanoSeconds, true) + rootContainer.doOnPreDraw { + onPreDraw() + } } - fun onHomeActivityOnRestart() { + fun onHomeActivityOnRestart(rootContainer: View) { + // DO NOT MOVE ANYTHING ABOVE THIS.. + // we are measuring startup time for hot startup type + appLaunchTimeMeasurement.onHomeActivityOnRestart() + // we are not setting [Source] in this method since source is derived from an intent. // therefore source gets set in onNewIntent(). onRestartData = Pair(HOT, null) + + rootContainer.doOnPreDraw { + onPreDraw() + } } fun onHomeActivityOnNewIntent(safeIntent: SafeIntent) { @@ -70,6 +103,7 @@ class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObse private fun setOnCreateData( safeIntent: SafeIntent, hasSavedInstanceState: Boolean, + homeActivityInitTimeStampNanoSeconds: Long, isExternalAppBrowserActivity: Boolean ) { onCreateData = AppAllStartup( @@ -77,6 +111,7 @@ class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObse getAppStartupType(), hasSavedInstanceState ) + appLaunchTimeMeasurement.onHomeActivityOnCreate(homeActivityInitTimeStampNanoSeconds) wasAppCreateCalledBeforeActivityCreate = false } @@ -101,23 +136,14 @@ class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObse } } - /** - * The reason we record metric on resume is because we need to wait for onNewIntent(), and - * we are not guaranteed that onNewIntent() will be called before or after onStart() / onRestart(). - * However we are guaranteed onResume() will be called after onNewIntent() and onStart(). Source: - * https://developer.android.com/reference/android/app/Activity#onNewIntent(android.content.Intent) - */ - fun onHomeActivityOnResume() { - recordMetric() - } - - private fun recordMetric() { + private suspend fun recordMetric() { if (!isMetricRecordedSinceAppWasForegrounded) { val appAllStartup: AppAllStartup = if (onCreateData != null) { onCreateData!! } else { mergeOnRestartAndOnNewIntentIntoStartup() } + appAllStartup.launchTime = appLaunchTimeMeasurement.getApplicationLaunchTime(appAllStartup.type) metrics.track(appAllStartup) isMetricRecordedSinceAppWasForegrounded = true } @@ -125,6 +151,7 @@ class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObse onCreateData = null onNewIntentData = null onRestartData = null + appLaunchTimeMeasurement = AppLaunchTimeMeasurement() } private fun mergeOnRestartAndOnNewIntentIntoStartup(): AppAllStartup { @@ -143,4 +170,24 @@ class AppStartupTelemetry(private val metrics: MetricController) : LifecycleObse // Therefore we set the isMetricRecorded flag to false. isMetricRecordedSinceAppWasForegrounded = false } + + /** + *record the timestamp for the first frame drawn + */ + @VisibleForTesting(otherwise = PRIVATE) + fun onPreDraw() { + // DO NOT MOVE ANYTHING ABOVE THIS.. + // we are measuring startup time here. + appLaunchTimeMeasurement.onFirstFramePreDraw() + } + + /** + * record the metrics, blocking the main thread to make sure we get our metrics recorded before + * the application potentially closes. + */ + fun onStop() { + runBlocking { + recordMetric() + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt index c01c4998b..aec8008f1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt @@ -337,7 +337,8 @@ sealed class Event { data class AppAllStartup( val source: Source, val type: Type, - val hasSavedInstanceState: Boolean? = null + val hasSavedInstanceState: Boolean? = null, + var launchTime: Long? = null ) : Event() { enum class Source { APP_ICON, LINK, CUSTOM_TAB, UNKNOWN } enum class Type { COLD, WARM, HOT, ERROR } @@ -354,6 +355,10 @@ sealed class Event { extrasMap[Events.appOpenedAllStartupKeys.hasSavedInstanceState] = hasSavedInstanceState.toString() } + if (launchTime != null) { + extrasMap[Events.appOpenedAllStartupKeys.firstFramePreDrawNanos] = + launchTime.toString() + } return extrasMap } } diff --git a/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt b/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt index 8479792cf..f6023f473 100644 --- a/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt @@ -92,7 +92,7 @@ open class FenixSearchEngineProvider( CustomSearchEngineProvider().loadSearchEngines(context) } - private var loadedSearchEngines = refreshAsync() + private var loadedSearchEngines = refreshAsync(baseSearchEngines) // https://github.com/mozilla-mobile/fenix/issues/9935 // Create new getter that will return the fallback SearchEngineList if @@ -102,7 +102,7 @@ open class FenixSearchEngineProvider( if (isRegionCachedByLocationService || shouldMockMLS) { loadedSearchEngines } else { - fallbackEngines + refreshAsync(fallbackEngines) } fun getDefaultEngine(context: Context): SearchEngine { @@ -176,7 +176,7 @@ open class FenixSearchEngineProvider( fun reload() { launch { customSearchEngines = async { CustomSearchEngineProvider().loadSearchEngines(context) } - loadedSearchEngines = refreshAsync() + loadedSearchEngines = refreshAsync(baseSearchEngines) } } @@ -188,8 +188,8 @@ open class FenixSearchEngineProvider( } } - private fun refreshAsync() = async { - val engineList = baseSearchEngines.await() + private fun refreshAsync(baseList: Deferred) = async { + val engineList = baseList.await() val bundledList = bundledSearchEngines.await().list val customList = customSearchEngines.await().list diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt index f7dc5dbc1..bd27a1898 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.customtabs import androidx.navigation.NavDestination import androidx.navigation.NavDirections +import kotlinx.android.synthetic.main.activity_home.* import mozilla.components.browser.session.runWithSession import mozilla.components.concept.engine.manifest.WebAppManifestParser import mozilla.components.feature.intent.ext.getSessionId @@ -36,7 +37,13 @@ open class ExternalAppBrowserActivity : HomeActivity() { final override fun getIntentSessionId(intent: SafeIntent) = intent.getSessionId() override fun startupTelemetryOnCreateCalled(safeIntent: SafeIntent, hasSavedInstanceState: Boolean) { - components.appStartupTelemetry.onExternalAppBrowserOnCreate(safeIntent, hasSavedInstanceState) + components.appStartupTelemetry.onExternalAppBrowserOnCreate( + safeIntent, + hasSavedInstanceState, + // HomeActivity is init before ExternalAppBrowserActivity so we use that time. + homeActivityInitTimeStampNanoSeconds, + rootContainer + ) } override fun getNavDirections( diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index b2886d6e7..0c597b684 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.top.sites.TopSite +import mozilla.components.ui.widgets.WidgetSiteItemView import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.tips.Tip import org.mozilla.fenix.home.OnboardingState @@ -164,9 +165,8 @@ class SessionControlAdapter( CollectionHeaderViewHolder.LAYOUT_ID -> CollectionHeaderViewHolder(view) CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, interactor) TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder( - view, - interactor, - differentLastItem = true + view as WidgetSiteItemView, + interactor ) OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view) OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt index 20a7665d5..75d5ae7ca 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt @@ -4,16 +4,17 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders -import android.graphics.Outline -import android.view.View -import android.view.ViewOutlineProvider +import android.os.Build +import android.os.Build.VERSION.SDK_INT import androidx.appcompat.content.res.AppCompatResources -import kotlinx.android.synthetic.main.list_element.* +import mozilla.components.browser.icons.BrowserIcons import mozilla.components.feature.tab.collections.TabCollection +import mozilla.components.lib.publicsuffixlist.PublicSuffixList import mozilla.components.support.ktx.android.content.getColorFromAttr +import mozilla.components.support.ktx.android.content.res.resolveAttribute +import mozilla.components.ui.widgets.WidgetSiteItemView import org.mozilla.fenix.R import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.ext.toShortUrl import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor @@ -21,9 +22,10 @@ import org.mozilla.fenix.utils.view.ViewHolder import mozilla.components.feature.tab.collections.Tab as ComponentTab class TabInCollectionViewHolder( - view: View, + private val view: WidgetSiteItemView, val interactor: CollectionInteractor, - private val differentLastItem: Boolean = false + private val icons: BrowserIcons = view.context.components.core.icons, + private val publicSuffixList: PublicSuffixList = view.context.components.publicSuffixList ) : ViewHolder(view) { lateinit var collection: TabCollection @@ -31,27 +33,24 @@ class TabInCollectionViewHolder( lateinit var tab: ComponentTab private set var isLastItem = false + private set init { - list_item_favicon.clipToOutline = true - list_item_favicon.outlineProvider = object : ViewOutlineProvider() { - override fun getOutline(view: View, outline: Outline?) { - outline?.setRoundRect( - 0, - 0, - view.width, - view.height, - view.resources.getDimension(R.dimen.tab_tray_favicon_border_radius) - ) - } + if (SDK_INT >= Build.VERSION_CODES.M) { + view.foreground = AppCompatResources.getDrawable( + view.context, + view.context.theme.resolveAttribute(R.attr.selectableItemBackground) + ) } - itemView.setOnClickListener { + view.setOnClickListener { interactor.onCollectionOpenTabClicked(tab) } - list_item_action_button.increaseTapArea(buttonIncreaseDps) - list_item_action_button.setOnClickListener { + view.setSecondaryButton( + icon = R.drawable.ic_close, + contentDescription = R.string.remove_tab_from_collection + ) { interactor.onCollectionRemoveTab(collection, tab, wasSwiped = false) } } @@ -64,23 +63,23 @@ class TabInCollectionViewHolder( } private fun updateTabUI() { - val context = itemView.context - list_item_url.text = tab.url.toShortUrl(context.components.publicSuffixList) + view.setText( + label = tab.title, + caption = tab.url.toShortUrl(publicSuffixList) + ) - list_element_title.text = tab.title - list_item_favicon.context.components.core.icons.loadIntoView(list_item_favicon, tab.url) + icons.loadIntoView(view.iconView, tab.url) // If last item and we want to change UI for it - if (isLastItem && differentLastItem) { - itemView.background = AppCompatResources.getDrawable(context, R.drawable.rounded_bottom_corners) + val context = view.context + if (isLastItem) { + view.background = AppCompatResources.getDrawable(context, R.drawable.rounded_bottom_corners) } else { - itemView.setBackgroundColor(context.getColorFromAttr(R.attr.above)) + view.setBackgroundColor(context.getColorFromAttr(R.attr.above)) } } companion object { - const val buttonIncreaseDps = 12 - const val LAYOUT_ID = R.layout.list_element - const val FAV_ICON_BORDER_RADIUS_IN_DP = 4 + const val LAYOUT_ID = R.layout.site_list_item } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index e7ab7ca5b..6df46b5fd 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.library.bookmarks.viewholders -import android.view.View import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView @@ -12,10 +11,11 @@ import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getDrawableWithTint import org.mozilla.fenix.R -import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.removeAndDisable import org.mozilla.fenix.ext.hideAndDisable -import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.ext.showAndEnable +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState import org.mozilla.fenix.library.bookmarks.BookmarkItemMenu @@ -64,7 +64,7 @@ class BookmarkNodeViewHolder( // Hide menu button if this item is a root folder or is selected if (item.type == BookmarkNodeType.FOLDER && item.inRoots()) { - containerView.overflowView.visibility = View.GONE + containerView.overflowView.removeAndDisable() } else if (payload.modeChanged) { if (mode is BookmarkFragmentState.Mode.Selecting) { containerView.overflowView.hideAndDisable() diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index ee4f50180..7f2d49db6 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -161,27 +161,17 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - val menuRes = when (historyStore.state.mode) { - HistoryFragmentState.Mode.Normal -> R.menu.library_menu - is HistoryFragmentState.Mode.Syncing -> R.menu.library_menu - is HistoryFragmentState.Mode.Editing -> R.menu.history_select_multi + if (historyStore.state.mode is HistoryFragmentState.Mode.Editing) { + inflater.inflate(R.menu.history_select_multi, menu) + menu.findItem(R.id.share_history_multi_select)?.isVisible = true + menu.findItem(R.id.delete_history_multi_select)?.title = + SpannableString(getString(R.string.bookmark_menu_delete_button)).apply { + setTextColor(requireContext(), R.attr.destructive) + } } - - inflater.inflate(menuRes, menu) - - menu.findItem(R.id.share_history_multi_select)?.isVisible = true - - menu.findItem(R.id.delete_history_multi_select)?.title = - SpannableString(getString(R.string.bookmark_menu_delete_button)).apply { - setTextColor(requireContext(), R.attr.destructive) - } } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { - R.id.close_history -> { - close() - true - } R.id.share_history_multi_select -> { val selectedHistory = historyStore.state.mode.selectedItems val shareTabs = selectedHistory.map { ShareData(url = it.url, title = it.title) } diff --git a/app/src/main/java/org/mozilla/fenix/perf/Stat.kt b/app/src/main/java/org/mozilla/fenix/perf/Stat.kt index ec816aedb..4205813e7 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/Stat.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/Stat.kt @@ -64,6 +64,10 @@ open class Stat { return getStatText(pid).split(' ')[FIELD_POS_STARTTIME].toLong() } + fun getProcessStartTimeStampNano(pid: Int): Long { + return convertTicksToNanos(getProcessStartTimeTicks(pid)).toLong() + } + fun convertTicksToNanos(ticks: Long): Double = ticks * nanosPerClockTick fun convertNanosToTicks(nanos: Long): Double = nanos / nanosPerClockTick } diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt index a32872f62..d607112a8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt @@ -47,33 +47,16 @@ class AccessibilityFragment : PreferenceFragmentCompat() { // Value is mapped from 0->30 in steps of 1 so let's convert to float in range 0.5->2.0 val newTextScale = ((newTextSize * STEP_SIZE) + MIN_SCALE_VALUE).toFloat() / PERCENT_TO_DECIMAL - // Save new text scale value. We assume auto sizing is off if this change listener was called. - settings.fontSizeFactor = newTextScale - components.core.engine.settings.fontSizeFactor = newTextScale - - // Reload the current session to reflect the new text scale - components.useCases.sessionUseCases.reload() - true - } - textSizePreference.isVisible = !requireContext().settings().shouldUseAutoSize - - val useAutoSizePreference = - requirePreference(R.string.pref_key_accessibility_auto_size) - useAutoSizePreference.setOnPreferenceChangeListener { preference, useAutoSize -> - val settings = preference.context.settings() - val components = preference.context.components - - // Save the new setting value - settings.shouldUseAutoSize = useAutoSize + // If scale is 100%, use the automatic font size adjustment + val useAutoSize = newTextScale == 1F components.core.engine.settings.automaticFontSizeAdjustment = useAutoSize components.core.engine.settings.fontInflationEnabled = useAutoSize - // If using manual sizing, update the engine settings with the local saved setting + // If using manual sizing, update the engine settings with the new scale if (!useAutoSize) { - components.core.engine.settings.fontSizeFactor = settings.fontSizeFactor + settings.fontSizeFactor = newTextScale + components.core.engine.settings.fontSizeFactor = newTextScale } - // Show the manual sizing controls if automatic sizing is turned off. - textSizePreference.isVisible = !useAutoSize // Reload the current session to reflect the new text scale components.useCases.sessionUseCases.reload() diff --git a/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt b/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt index 24b6670e8..b26446185 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt @@ -25,6 +25,7 @@ fun SitePermissions.get(field: PhoneFeature) = when (field) { PhoneFeature.NOTIFICATION -> notification PhoneFeature.AUTOPLAY_AUDIBLE -> autoplayAudible PhoneFeature.AUTOPLAY_INAUDIBLE -> autoplayInaudible + PhoneFeature.PERSISTENT_STORAGE -> localStorage } fun SitePermissions.update(field: PhoneFeature, value: SitePermissions.Status) = when (field) { @@ -34,6 +35,7 @@ fun SitePermissions.update(field: PhoneFeature, value: SitePermissions.Status) = PhoneFeature.NOTIFICATION -> copy(notification = value) PhoneFeature.AUTOPLAY_AUDIBLE -> copy(autoplayAudible = value) PhoneFeature.AUTOPLAY_INAUDIBLE -> copy(autoplayInaudible = value) + PhoneFeature.PERSISTENT_STORAGE -> copy(localStorage = value) } /** diff --git a/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt index 401a4e3b9..cc398781d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt @@ -37,6 +37,15 @@ class PairFragment : Fragment(R.layout.fragment_pair), UserInteractionHandler { requestPermissions(permissions, REQUEST_CODE_CAMERA_PERMISSIONS) }, onScanResult = { pairingUrl -> + // By the time we get a scan result, we may not be attached to the context anymore. + // See https://github.com/mozilla-mobile/fenix/issues/15812 + if (context == null) { + findNavController().popBackStack( + R.id.turnOnSyncFragment, + false + ) + return@QrFeature + } requireComponents.services.accountsAuthFeature.beginPairingAuthentication( requireContext(), pairingUrl @@ -53,7 +62,7 @@ class PairFragment : Fragment(R.layout.fragment_pair), UserInteractionHandler { @Suppress("Deprecation") vibrator.vibrate(VIBRATE_LENGTH) } - findNavController(this@PairFragment).popBackStack( + findNavController().popBackStack( R.id.turnOnSyncFragment, false ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/PhoneFeature.kt b/app/src/main/java/org/mozilla/fenix/settings/PhoneFeature.kt index 6031fc151..31ca24ecb 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/PhoneFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/PhoneFeature.kt @@ -30,7 +30,8 @@ enum class PhoneFeature(val androidPermissionsList: Array) : Parcelable MICROPHONE(arrayOf(RECORD_AUDIO)), NOTIFICATION(emptyArray()), AUTOPLAY_AUDIBLE(emptyArray()), - AUTOPLAY_INAUDIBLE(emptyArray()); + AUTOPLAY_INAUDIBLE(emptyArray()), + PERSISTENT_STORAGE(emptyArray()); fun isAndroidPermissionGranted(context: Context): Boolean { return context.isPermissionGranted(androidPermissionsList.asIterable()) @@ -78,6 +79,7 @@ enum class PhoneFeature(val androidPermissionsList: Array) : Parcelable LOCATION -> context.getString(R.string.preference_phone_feature_location) MICROPHONE -> context.getString(R.string.preference_phone_feature_microphone) NOTIFICATION -> context.getString(R.string.preference_phone_feature_notification) + PERSISTENT_STORAGE -> context.getString(R.string.preference_phone_feature_persistent_storage) AUTOPLAY_AUDIBLE, AUTOPLAY_INAUDIBLE -> context.getString(R.string.preference_browser_feature_autoplay) } } @@ -95,6 +97,7 @@ enum class PhoneFeature(val androidPermissionsList: Array) : Parcelable NOTIFICATION -> R.string.pref_key_phone_feature_notification AUTOPLAY_AUDIBLE -> R.string.pref_key_browser_feature_autoplay_audible AUTOPLAY_INAUDIBLE -> R.string.pref_key_browser_feature_autoplay_inaudible + PERSISTENT_STORAGE -> R.string.pref_key_browser_feature_persistent_storage } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index 4fcfa280f..3dcd31e59 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -25,6 +25,12 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.secret_settings_preferences, rootKey) + requirePreference(R.string.pref_key_show_grid_view_tabs_settings).apply { + isVisible = FeatureFlags.showGridViewInTabsSettings + isChecked = context.settings().showGridViewInTabsSettings + onPreferenceChangeListener = SharedPreferenceUpdater() + } + requirePreference(R.string.pref_key_enable_top_frecent_sites).apply { isVisible = FeatureFlags.topFrecentSite isChecked = context.settings().showTopFrecentSites diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index df29c2916..d4aa5873f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -24,7 +24,6 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.amo_collection_override_dialog.view.* -import kotlinx.android.synthetic.main.fragment_installed_add_on_details.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -187,7 +186,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } val tabSettingsPreference = - requirePreference(R.string.pref_key_close_tabs) + requirePreference(R.string.pref_key_tabs) tabSettingsPreference.summary = context?.settings()?.getTabTimeoutString() setupPreferences() @@ -212,8 +211,8 @@ class SettingsFragment : PreferenceFragmentCompat() { resources.getString(R.string.pref_key_sign_in) -> { SettingsFragmentDirections.actionSettingsFragmentToTurnOnSyncFragment() } - resources.getString(R.string.pref_key_close_tabs) -> { - SettingsFragmentDirections.actionSettingsFragmentToCloseTabsSettingsFragment() + resources.getString(R.string.pref_key_tabs) -> { + SettingsFragmentDirections.actionSettingsFragmentToTabsSettingsFragment() } resources.getString(R.string.pref_key_search_settings) -> { SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment() diff --git a/app/src/main/java/org/mozilla/fenix/settings/CloseTabsSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt similarity index 84% rename from app/src/main/java/org/mozilla/fenix/settings/CloseTabsSettingsFragment.kt rename to app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt index 9bb15f295..d27d20863 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/CloseTabsSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt @@ -5,27 +5,29 @@ package org.mozilla.fenix.settings import android.os.Bundle +import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import org.mozilla.fenix.R +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.utils.view.addToRadioGroup /** * Lets the user customize auto closing tabs. */ -class CloseTabsSettingsFragment : PreferenceFragmentCompat() { +class TabsSettingsFragment : PreferenceFragmentCompat() { private lateinit var radioManual: RadioButtonPreference private lateinit var radioOneDay: RadioButtonPreference private lateinit var radioOneWeek: RadioButtonPreference private lateinit var radioOneMonth: RadioButtonPreference override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.close_tabs_preferences, rootKey) + setPreferencesFromResource(R.xml.tabs_preferences, rootKey) } override fun onResume() { super.onResume() - showToolbar(getString(R.string.preferences_close_tabs)) + showToolbar(getString(R.string.preferences_tabs)) setupPreferences() } @@ -34,6 +36,7 @@ class CloseTabsSettingsFragment : PreferenceFragmentCompat() { radioOneDay = requirePreference(R.string.pref_key_close_tabs_after_one_day) radioOneWeek = requirePreference(R.string.pref_key_close_tabs_after_one_week) radioOneMonth = requirePreference(R.string.pref_key_close_tabs_after_one_month) + setupRadioGroups() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt index fccf33aa9..9adcee40f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt @@ -13,7 +13,6 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.appcompat.view.menu.ActionMenuItemView import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -57,7 +56,6 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { private var usernameChanged = false private var passwordChanged = false - private var saveEnabled = false private var validPassword = true private var validUsername = true @@ -90,8 +88,9 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { usernameText.text = args.savedLoginItem.username.toEditable() passwordText.text = args.savedLoginItem.password.toEditable() + clearUsernameTextButton.isEnabled = oldLogin.username.isNotEmpty() + formatEditableValues() - initSaveState() setUpClickListeners() setUpTextListeners() togglePasswordReveal(passwordText, revealPasswordButton) @@ -101,18 +100,6 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { } } - private fun initSaveState() { - saveEnabled = false // don't enable saving until something has been changed - val saveButton = - activity?.findViewById(R.id.save_login_button) - saveButton?.isEnabled = saveEnabled - - usernameChanged = false - passwordChanged = false - - clearUsernameTextButton.isEnabled = oldLogin.username.isNotEmpty() - } - private fun formatEditableValues() { hostnameText.isClickable = false hostnameText.isFocusable = false @@ -263,20 +250,20 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { } private fun setSaveButtonState() { - val saveButton = activity?.findViewById(R.id.save_login_button) - val changesMadeWithNoErrors = - validUsername && validPassword && (usernameChanged || passwordChanged) - - changesMadeWithNoErrors.let { - saveButton?.isEnabled = it - saveEnabled = it - } + activity?.invalidateOptionsMenu() } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.login_save, menu) } + override fun onPrepareOptionsMenu(menu: Menu) { + val saveButton = menu.findItem(R.id.save_login_button) + val changesMadeWithNoErrors = + validUsername && validPassword && (usernameChanged || passwordChanged) + saveButton.isEnabled = changesMadeWithNoErrors // don't enable saving until something has been changed + } + override fun onPause() { redirectToReAuth( listOf(R.id.loginDetailFragment), @@ -288,14 +275,12 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.save_login_button -> { view?.hideKeyboard() - if (saveEnabled) { - interactor.onSaveLogin( - args.savedLoginItem.guid, - usernameText.text.toString(), - passwordText.text.toString() - ) - requireComponents.analytics.metrics.track(Event.EditLoginSave) - } + interactor.onSaveLogin( + args.savedLoginItem.guid, + usernameText.text.toString(), + passwordText.text.toString() + ) + requireComponents.analytics.metrics.track(Event.EditLoginSave) true } else -> false diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt index 15a254de2..44d0f8576 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt @@ -52,12 +52,24 @@ class WebsitePermissionsView( val view: View = LayoutInflater.from(context) .inflate(R.layout.quicksettings_permissions, containerView, true) - private val permissionViews: Map = EnumMap(mapOf( - PhoneFeature.CAMERA to PermissionViewHolder(view.cameraLabel, view.cameraStatus), - PhoneFeature.LOCATION to PermissionViewHolder(view.locationLabel, view.locationStatus), - PhoneFeature.MICROPHONE to PermissionViewHolder(view.microphoneLabel, view.microphoneStatus), - PhoneFeature.NOTIFICATION to PermissionViewHolder(view.notificationLabel, view.notificationStatus) - )) + private val permissionViews: Map = EnumMap( + mapOf( + PhoneFeature.CAMERA to PermissionViewHolder(view.cameraLabel, view.cameraStatus), + PhoneFeature.LOCATION to PermissionViewHolder(view.locationLabel, view.locationStatus), + PhoneFeature.MICROPHONE to PermissionViewHolder( + view.microphoneLabel, + view.microphoneStatus + ), + PhoneFeature.NOTIFICATION to PermissionViewHolder( + view.notificationLabel, + view.notificationStatus + ), + PhoneFeature.PERSISTENT_STORAGE to PermissionViewHolder( + view.persistentStorageLabel, + view.persistentStorageStatus + ) + ) + ) /** * Allows changing what this View displays. diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt index 8e68407b2..cda13889c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt @@ -25,6 +25,7 @@ import org.mozilla.fenix.settings.PhoneFeature.CAMERA import org.mozilla.fenix.settings.PhoneFeature.LOCATION import org.mozilla.fenix.settings.PhoneFeature.MICROPHONE import org.mozilla.fenix.settings.PhoneFeature.NOTIFICATION +import org.mozilla.fenix.settings.PhoneFeature.PERSISTENT_STORAGE import org.mozilla.fenix.settings.requirePreference class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { @@ -57,6 +58,7 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { initPhoneFeature(LOCATION) initPhoneFeature(MICROPHONE) initPhoneFeature(NOTIFICATION) + initPhoneFeature(PERSISTENT_STORAGE) bindClearPermissionsButton() } diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt index 1ab54bfe3..2830886d7 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt @@ -14,7 +14,7 @@ import mozilla.components.browser.tabstray.TabViewHolder import mozilla.components.browser.tabstray.TabsAdapter import mozilla.components.concept.tabstray.Tab import mozilla.components.concept.tabstray.Tabs -import mozilla.components.support.images.loader.ImageLoader +import mozilla.components.concept.base.images.ImageLoader import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt index 41c6ddf40..b871eba3b 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt @@ -92,7 +92,7 @@ class DefaultTabTrayController( } override fun handleTabSettingsClicked() { - navController.navigate(TabTrayDialogFragmentDirections.actionGlobalCloseTabSettingsFragment()) + navController.navigate(TabTrayDialogFragmentDirections.actionGlobalTabSettingsFragment()) } override fun onTabTrayDismissed() { @@ -187,7 +187,7 @@ class DefaultTabTrayController( } override fun handleSetUpAutoCloseTabsClicked() { - val directions = TabTrayDialogFragmentDirections.actionGlobalCloseTabSettingsFragment() + val directions = TabTrayDialogFragmentDirections.actionGlobalTabSettingsFragment() navController.navigate(directions) } } diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt index 3e35f9534..24eef4135 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -142,6 +142,14 @@ class TabTrayView( private val components = container.context.components + private val checkOpenTabs = { + if (isPrivateModeSelected) { + view.context.components.core.store.state.privateTabs.isNotEmpty() + } else { + view.context.components.core.store.state.normalTabs.isNotEmpty() + } + } + init { components.analytics.metrics.track(Event.TabsTrayOpened) @@ -240,6 +248,7 @@ class TabTrayView( } updateTabsTrayLayout() + view.tabsTray.apply { adapter = concatAdapter @@ -291,14 +300,9 @@ class TabTrayView( tabTrayItemMenu = TabTrayItemMenu( context = view.context, - shouldShowSaveToCollection = { tabs.isNotEmpty() && view.tab_layout.selectedTabPosition == 0 }, - hasOpenTabs = { - if (isPrivateModeSelected) { - view.context.components.core.store.state.privateTabs.isNotEmpty() - } else { - view.context.components.core.store.state.normalTabs.isNotEmpty() - } - }) { + shouldShowSaveToCollection = { checkOpenTabs.invoke() && view.tab_layout.selectedTabPosition == 0 }, + hasOpenTabs = checkOpenTabs + ) { when (it) { is TabTrayItemMenu.Item.ShareAllTabs -> interactor.onShareTabsClicked( isPrivateModeSelected @@ -351,14 +355,6 @@ class TabTrayView( } } - private fun gridViewNumberOfCols(context: Context): Int { - val displayMetrics = context.resources.displayMetrics - val dpWidth = displayMetrics.widthPixels / displayMetrics.density - val columnWidthDp = COLUMN_WIDTH_DP - val columnCount = (dpWidth / columnWidthDp).toInt() - return if (columnCount >= 2) columnCount else 2 - } - private fun handleTabClicked(tab: SyncTab) { interactor.onSyncedTabClicked(tab) } @@ -401,7 +397,7 @@ class TabTrayView( private fun setupCompactTabsTrayLayout() { view.tabsTray.apply { - val gridLayoutManager = GridLayoutManager(container.context, gridViewNumberOfCols(container.context)) + val gridLayoutManager = GridLayoutManager(container.context, getNumberOfGridColumns(container.context)) if (useTopTabsTray) { gridLayoutManager.reverseLayout = true } @@ -411,7 +407,7 @@ class TabTrayView( return if (position < numTabs) { 1 } else { - gridViewNumberOfCols(container.context) + getNumberOfGridColumns(container.context) } } } @@ -469,6 +465,8 @@ class TabTrayView( updateUINormalMode(view.context.components.core.store.state) scrollToTab(view.context.components.core.store.state.selectedTabId) + view.tabsTray.invalidateItemDecorations() + if (isPrivateModeSelected) { components.analytics.metrics.track(Event.TabsTrayPrivateModeTapped) } else { @@ -482,6 +480,16 @@ class TabTrayView( var mode: Mode = Mode.Normal private set + /** + * Returns the number of columns that will fit in the grid layout for the current screen. + */ + private fun getNumberOfGridColumns(context: Context): Int { + val displayMetrics = context.resources.displayMetrics + val screenWidthDp = displayMetrics.widthPixels / displayMetrics.density + val columnCount = (screenWidthDp / COLUMN_WIDTH_DP).toInt() + return if (columnCount >= 2) columnCount else 2 + } + fun updateState(state: TabTrayDialogFragmentState) { val oldMode = mode diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayViewHolder.kt index eaf06e929..7f1f94322 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayViewHolder.kt @@ -20,13 +20,13 @@ import mozilla.components.browser.tabstray.TabViewHolder import mozilla.components.browser.tabstray.TabsTrayStyling import mozilla.components.browser.tabstray.thumbnail.TabThumbnailView import mozilla.components.browser.toolbar.MAX_URI_LENGTH +import mozilla.components.concept.base.images.ImageLoadRequest +import mozilla.components.concept.base.images.ImageLoader import mozilla.components.concept.tabstray.Tab import mozilla.components.concept.tabstray.TabsTray import mozilla.components.feature.media.ext.pauseIfPlaying import mozilla.components.feature.media.ext.playIfPaused import mozilla.components.support.base.observer.Observable -import mozilla.components.support.images.ImageLoadRequest -import mozilla.components.support.images.loader.ImageLoader import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController @@ -76,13 +76,10 @@ class TabTrayViewHolder( ) { this.tab = tab - // Basic text updateTitle(tab) updateUrl(tab) updateIcon(tab) updateCloseButtonDescription(tab.title) - - // Drawables and theme updateBackgroundColor(isSelected) if (tab.thumbnail != null) { diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabsTouchHelper.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabsTouchHelper.kt index b9189c555..adbec4d80 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabsTouchHelper.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabsTouchHelper.kt @@ -17,6 +17,7 @@ import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.getDrawableWithTint import mozilla.components.support.ktx.android.util.dpToPx import org.mozilla.fenix.R +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.sessioncontrol.SwipeToDeleteCallback /** diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt index 2902b2392..e3719304a 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt @@ -15,6 +15,7 @@ import android.view.View import android.widget.ImageView import androidx.core.view.isVisible import androidx.core.view.marginTop +import com.google.android.material.appbar.AppBarLayout import kotlinx.android.synthetic.main.tracking_protection_onboarding_popup.* import kotlinx.android.synthetic.main.tracking_protection_onboarding_popup.view.* import mozilla.components.browser.session.Session @@ -44,13 +45,32 @@ class TrackingProtectionOverlay( private fun shouldShowTrackingProtectionOnboarding(session: Session) = session.trackerBlockingEnabled && - session.trackersBlocked.isNotEmpty() && - settings.shouldShowTrackingProtectionCfr + session.trackersBlocked.isNotEmpty() && + settings.shouldShowTrackingProtectionCfr @Suppress("MagicNumber", "InflateParams") private fun showTrackingProtectionOnboarding() { + if (!getToolbar().hasWindowFocus()) return + val toolbarPosition = settings.toolbarPosition + + when (toolbarPosition) { + ToolbarPosition.BOTTOM -> { + if (getToolbar().translationY > 0) { + return + } + } + ToolbarPosition.TOP -> { + val appBarLayout = getToolbar().parent as? AppBarLayout + appBarLayout?.let { appBar -> + if (appBar.y != 0.toFloat()) { + return + } + } + } + } + val trackingOnboardingDialog = object : Dialog(context) { override fun onTouchEvent(event: MotionEvent): Boolean { @@ -63,7 +83,6 @@ class TrackingProtectionOverlay( val layout = LayoutInflater.from(context) .inflate(R.layout.tracking_protection_onboarding_popup, null) - val toolbarPosition = settings.toolbarPosition layout.drop_down_triangle.isVisible = toolbarPosition == ToolbarPosition.TOP layout.pop_up_triangle.isVisible = toolbarPosition == ToolbarPosition.BOTTOM diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 8adf28ae0..dfe9071f5 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -124,6 +124,12 @@ class Settings(private val appContext: Context) : PreferencesHolder { val canShowCfr: Boolean get() = (System.currentTimeMillis() - lastCfrShownTimeInMillis) > THREE_DAYS_MS + var showGridViewInTabsSettings by featureFlagPreference( + appContext.getPreferenceKey(R.string.pref_key_show_grid_view_tabs_settings), + default = false, + featureFlag = FeatureFlags.showGridViewInTabsSettings + ) + var waitToShowPageUntilFirstPaint by featureFlagPreference( appContext.getPreferenceKey(R.string.pref_key_wait_first_paint), default = false, @@ -305,16 +311,13 @@ class Settings(private val appContext: Context) : PreferencesHolder { val shouldShowSecurityPinWarning: Boolean get() = loginsSecureWarningCount.underMaxCount() + fun shouldUseAutoSize() = fontSizeFactor == 1F + var shouldUseLightTheme by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_light_theme), default = false ) - var shouldUseAutoSize by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_accessibility_auto_size), - default = true - ) - var fontSizeFactor by floatPreference( appContext.getPreferenceKey(R.string.pref_key_accessibility_font_scale), default = 1f @@ -768,7 +771,8 @@ class Settings(private val appContext: Context) : PreferencesHolder { location = getSitePermissionsPhoneFeatureAction(PhoneFeature.LOCATION), camera = getSitePermissionsPhoneFeatureAction(PhoneFeature.CAMERA), autoplayAudible = getSitePermissionsPhoneFeatureAutoplayAction(PhoneFeature.AUTOPLAY_AUDIBLE), - autoplayInaudible = getSitePermissionsPhoneFeatureAutoplayAction(PhoneFeature.AUTOPLAY_INAUDIBLE) + autoplayInaudible = getSitePermissionsPhoneFeatureAutoplayAction(PhoneFeature.AUTOPLAY_INAUDIBLE), + persistentStorage = getSitePermissionsPhoneFeatureAction(PhoneFeature.PERSISTENT_STORAGE) ) } diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml new file mode 100644 index 000000000..1934381e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_storage.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/layout/fragment_login_detail.xml b/app/src/main/res/layout/fragment_login_detail.xml index 3faa7205e..cfb6bb0da 100644 --- a/app/src/main/res/layout/fragment_login_detail.xml +++ b/app/src/main/res/layout/fragment_login_detail.xml @@ -9,8 +9,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="73dp" - android:layout_marginTop="12dp" - android:layout_marginEnd="12dp"> + android:layout_marginTop="12dp"> + + @@ -50,15 +63,15 @@ tools:visibility="visible" /> @@ -75,15 +88,15 @@ tools:visibility="visible" /> @@ -93,22 +106,35 @@ android:layout_width="wrap_content" android:layout_height="@dimen/quicksettings_item_height" android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/persistentStorageStatus" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/locationLabel" tools:text="@string/preference_option_phone_feature_blocked" tools:visibility="visible" /> + + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 67edefc7e..2fca420f1 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -111,8 +111,8 @@ android:id="@+id/action_global_tabHistoryDialogFragment" app:destination="@id/tabHistoryDialogFragment" /> + android:id="@+id/action_global_tabSettingsFragment" + app:destination="@id/tabsSettingsFragment" /> + android:id="@+id/tabsSettingsFragment" + android:name="org.mozilla.fenix.settings.TabsSettingsFragment" + android:label="@string/preferences_tabs" /> ابحث في الألسنة المُزامنة إعدادات الحساب + + أكمِل العناوين تلقائيا افتح الروابط في التطبيقات @@ -343,6 +345,17 @@ التنبيهات + + حسنا + + ألغِ + + اسم التجميعة + + مالك التجميعة (معرّف المستخدم) + + تعدّلت تجميعة الإضافات. يُنهي التطبيق لإجراء التغييرات… + زامِن الآن @@ -430,6 +443,9 @@ خدمة التموضع من Mozilla + + تقرير صحة %s + فعّل «تزامُن» @@ -442,6 +458,9 @@ أزِل الحساب + + + firefox.com/pair ضوئيا]]> افتح الكمرة @@ -502,6 +521,8 @@ ابحث الإعدادات + + عنصر قائمة في التأريخ أغلِق @@ -509,10 +530,24 @@ الألسنة المُغلقة حديثًا اعرض التأريخ كاملا + + عدد الألسنة: %d + + عدد الألسنة: %d ما من ألسنة أُغلقت حديثًا + + الألسنة + + منظور الألسنة + + قائمة + + شبكة إغلاق الألسنة @@ -553,6 +588,8 @@ لسان جديد انتقل إلى الصفحة الرئيسية + + بدّل وضع اللسان أزِل اللسان من المجموعة @@ -577,6 +614,8 @@ احفظ شارِك + + صورة الجلسة الحالية احفظ في التجميعة @@ -619,6 +658,13 @@ حدّدتَ %1$d + + احذف العناصر (عددها %1$d) + + اليوم + + الأمس آخر 24 ساعة @@ -759,6 +805,8 @@ المكان التنبيهات + + التخزين الدائم اطلب السماح @@ -776,6 +824,10 @@ اسمح بالصوت والڤِديو + + احجب الصوت والڤديو على بيانات الشبكة في المحمول فقط + + سيعمل الصوت والڤديو على الشبكة اللاسلكية احجب الصوت فقط @@ -806,6 +858,12 @@ ألغِ تحديد الكل حدّد الألسنة لحفظها + + الألسنة المحدّدة: %d + + الألسنة المحدّدة: %d حُفظت الألسنة! @@ -873,6 +931,8 @@ أغلِق الألسنة الخاصة افتح + + احذف وافتح تدعمه @@ -887,6 +947,8 @@ أُغلق اللسان أُغلقت الألسنة + + أُضيف إلى المواقع الشائعة! أُغلق اللسان الخاص @@ -939,16 +1001,26 @@ حذف بيانات التصفح الألسنة المفتوحة + + الألسنة: %d تأريخ التصفح وبيانات الموقع + + العناوين: %d التأريخ + + الصفحات: %d الكعكات ستخرج من معظم المواقع الصور والملفات المخبّأة + + يحرّر مساحة التخزين تصاريح المواقع @@ -1030,26 +1102,49 @@ تَلج الآن… لِج إلى Firefox + + لا تلج التزامن يعمل فشل الولوج + + خصوصية تلقائية + + تحجب إعدادات الخصوصية والأمان المتعقّبات والبرمجيات الخبيثة والشركات التي تحاول تعقّبك. القياسي (المبدئي) + + احجب عددًا أقل من المتعقّبات. ستُحمّل الصفحات كما الطبيعي. صارم (مستحسن) صارم + + احجب متعقّبات وإعلانات ومنبثقات أكثر. ستُحمّل الصفحات بسرعة أكبر، ولكن قد لا تعمل بعض المزايا. اختر جهةً + + جرّب التصفّح بيد واحدة باستعمال شريط الأدوات بالأسفل، أو انقله إلى أعلى. تصفّح بخصوصية + + افتح اللسان الخاص الآن فقط: انقر أيقونة %s. + + افتح الألسنة الخاصة في كل مرة: حدّث إعدادات التصفّح الخاص. افتح الإعدادات خصوصيتك + + صمّمنا لك %s لتقدر على التحكّم فيما تُشاركه عبر الشبكة، وما تُشاركه معنا. + + اقرأ تنويه الخصوصية أغلِق @@ -1060,8 +1155,12 @@ اختر السمة + + وفّر طاقة الطارية واحمِ نظرك بتفعيل الوضع الداكن. آلي + + يتأقلم حسب إعدادات الجهاز سمة داكنة @@ -1075,6 +1174,8 @@ تعذر الإرسال أعِد المحاولة + + امسح الرز ضوئيًا https://firefox.com/pair]]> @@ -1083,6 +1184,8 @@ لِج باستخدام كمرتك استعمل البريد بدل المسح + + أنشِئ واحدًا لمزامنة Firefox بين الأجهزة.]]> سيتوقف Firefox عن مزامنة حسابك، لكن لن يحذف أيًا من بيانات تصفحك على هذا الجهاز. @@ -1092,6 +1195,9 @@ ألغِ + + لا يمكنك تعديل المجلدات المبدئية + إعدادات الحماية @@ -1106,12 +1212,22 @@ اطّلع على المزيد القياسي (المبدئي) + + احجب عددًا أقل من المتعقّبات. ستُحمّل الصفحات كما الطبيعي. + + ما يحجبه أسلوب الحماية ضد التعقّب المعياري صارم + + احجب متعقّبات وإعلانات ومنبثقات أكثر. ستُحمّل الصفحات بسرعة أكبر، ولكن قد لا تعمل بعض المزايا. + + ما يحجبه أسلوب الحماية ضد التعقّب الصارم مخصّص اختر المتعقّبات والسكربتات التي تريد حجبها. + + ما يحجبه أسلوب الحماية ضد التعقّب المخصّص الكعكات @@ -1144,8 +1260,12 @@ يحدّ من قدرة الشبكات الاجتماعية على تعقب نشاط تصفحك على الإنترنت. كعكات تتعقّبك بين المواقع + + احجب الكعكات التي تستعمله شبكات الإعلانات وشركات التحليل الرقمي لجمع بيانات التصفّح من مختلف المواقع. المُعدّنات المعمّاة + + امنع السكربتات الخبيثة من الوصول إلى جهازك لتعدين العملات رقميًا. مسجّلات البصمات @@ -1158,6 +1278,8 @@ عُطّلت الحماية الموسّعة من التعقب لهذه المواقع حقوقك + + المكتبات مفتوحة المصدر التي نستخدم ما جديد %s @@ -1172,6 +1294,18 @@ معلومات الترخيص + + المكتبات التي نستعمل + + قائمة التنقيح: بقيت من النقرات %1$d لتفعيلها + فُعّلت قائمة التنقيح + + + عدد الألسنة: 1 + + عدد الألسنة: %d + انسخ @@ -1193,6 +1327,9 @@ اسم الاختصار + + يمكنك إضافة هذا الموقع إلى شاشة البداية في الجهاز لتصل إليه بسرعة وتتصفحه كأي تطبيق آخر. + جلسات الولوج وكلمات السر @@ -1216,6 +1353,8 @@ جلسات الولوج المحفوظة + + تظهر هنا جلسات الولوج التي تحفظها أو تُزامنها مع %s. اعرف المزيد عن المزامنة. @@ -1224,6 +1363,8 @@ ستظهر جلسات الولوج وكلمات السر غير المحفوظة هنا. لن تُحفظ جلسات الولوج وكلمات السر لهذه المواقع. + + احذف كل الاستثناءات ابحث في جلسات الولوج @@ -1236,6 +1377,10 @@ اسم المستخدم كلمة السر + + أعِد إدخال رمز PIN + + ألغِ القفل لعرض جلسات الولوج المحفوظة هذا الاتصال ليس آمنا. بيانات الولوج المدخلة هنا عرضة للخطر. @@ -1254,21 +1399,42 @@ نُسخ الموقع إلى الحافظة انسخ كلمة السر + + امسح كلمة السر اسنخ اسم المستخدم + + امسح اسم المستخدم انسخ الموقع + + افتح الموقع في المتصفح أظهِر كلمة السر أخفِ كلمة السر + + ألغِ القفل لعرض جلسات الولوج المحفوظة + + احمِ جلسات الولوج وكلمات السر + + اضبط نمطًا أو رمزًا أو كلمة سر لقفل الجهاز ذلك لحماية جلسات الولوج وكلمات السر المحفوظة ضد الوصول إليها ضد من يستعمل جهازك. لاحقًا + + اضبط ذلك الآن + + ألغِ قفل جهازك + + استعمل التقريب على كل المواقع الاسم (ا-ي) آخر استخدام + + افرز قائمة جلسات الولوج + أضِف محرك بحث @@ -1286,6 +1452,8 @@ أخرى الاسم + + نص البحث المستخدم اطّلع على المزيد @@ -1294,9 +1462,13 @@ أدخِل اسم محرك البحث + + يوجد بالفعل محرك بالاسم ”%s“. أدخِل نص البحث + + تحقق من أن نص البحث يطابق تنسيق المثال عُطل أثناء الاتصال بِ‍ ”%s“ @@ -1306,10 +1478,14 @@ حُذف %s + + مرحبًا بك في %s الجديد يحدّث %s… ابدأ %s + + اكتمل الترحيل كلمات السر @@ -1320,6 +1496,9 @@ الأذونات]]> + + %1$s على ”مفعّل/مفعّلة“]]> + اتصال آمن @@ -1332,6 +1511,8 @@ أمتأكد من مسح التصريح لهذا الموقع؟ ما من مواقع مستثناة + + أهم المقالات أمتأكد من حذف هذه العلامة؟ @@ -1378,13 +1559,24 @@ لِج إلى «المزامنة» + + لا ألسنة مفتوحة + + + + وصلت إلى أقصى حدّ للمواقع الشائعة حسنًا، فهمت + + أزِل + استغلّ %s إلى أقصى حد. + + اجمع ما يهمّك يمكنك إضافة هذا الموقع إلى شاشة البداية لتصل إليه بسرعة وتتصفحه كأي تطبيق آخر. diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index aada1ca02..343192130 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -322,6 +322,8 @@ Buscar llingüetes sincronizaes Axustes de la cuenta + + Autocompletar les URLs Abrir los enllaces nes aplicaciones @@ -332,6 +334,9 @@ Avisos + + Encaboxar + Sincronizar agora @@ -478,6 +483,8 @@ Llingüetes zarraes apocayá + + Amosar l\'historial completu %d llingüetes @@ -486,9 +493,15 @@ %d llingüeta - Equí nun hai llingüetes zarraes apocayá + Equí nun hai llingüetes que se zarraren apocayá + + Llingüetes + + En llista + + En rexáu Zarru de llingüetes @@ -588,6 +601,10 @@ Elementos esbillaos: %1$d + + Güei + + Ayeri Les últimes 24 hores diff --git a/app/src/main/res/values-b+sat+Olck/strings.xml b/app/src/main/res/values-b+sat+Olck/strings.xml new file mode 100644 index 000000000..68d0b50ca --- /dev/null +++ b/app/src/main/res/values-b+sat+Olck/strings.xml @@ -0,0 +1,1502 @@ + + + + %s ᱱᱤᱡᱮᱨᱟᱜ + + %s (ᱱᱤᱡᱮᱨᱟᱜ) + + + ᱰᱷᱮᱨ ᱮᱴᱟᱜᱟᱠ + + ᱱᱤᱡᱮᱨᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱦᱩᱭ ᱦᱚᱪᱚᱜ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱵᱟᱝ ᱦᱩᱭ ᱦᱚᱪᱚᱜ ᱢᱮ + + ᱥᱮᱸᱫᱽᱨᱟ ᱵᱟᱝᱠᱷᱟᱱ ᱴᱷᱤᱠᱟᱹᱬᱟ ᱟᱫᱮᱨ + + ᱟᱢᱟᱜ ᱠᱷᱩᱞᱟᱹ ᱟᱠᱟᱱ ᱴᱮᱵ ᱠᱚ ᱫᱚ ᱱᱚᱰᱮ ᱫᱮᱠᱷᱟᱣᱼᱜᱟ ᱾ + + ᱟᱢᱟᱜ ᱱᱤᱡᱚᱨᱟᱜ ᱴᱮᱵ ᱠᱚ ᱫᱚ ᱱᱚᱱᱰᱮ ᱩᱫᱩᱜ ᱦᱩᱭᱩᱜ-ᱟ ᱾ + + 1 ᱴᱮᱵ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ ᱾ ᱴᱮᱵ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱴᱤᱯᱟᱹᱣ ᱢᱮ ᱾ + + %1$s ᱴᱮᱵ ᱠᱚ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ ᱾ ᱴᱮᱵ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱴᱤᱯᱟᱹᱣ ᱢᱮ ᱾ + + %1$d ᱵᱟᱪᱷᱟᱣᱮᱱᱟ + + ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱡᱟᱣᱨᱟ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱧᱩᱛᱩᱢ + + ᱛᱩᱢᱟᱹᱞ ᱡᱟᱣᱨᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱢᱟᱹᱞᱴᱤᱥᱤᱞᱮᱠᱼᱴ ᱢᱳᱰ ᱵᱟᱹᱰ + + ᱵᱟᱪᱷᱟᱣᱠᱟᱱ ᱴᱮᱵ ᱠᱚ ᱛᱩᱢᱟᱹᱞ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱵᱟᱪᱷᱟᱣᱮᱱᱟ %1$s + + ᱵᱟᱝ ᱪᱚᱭᱚᱱᱟᱜ%1$s + + ᱵᱟᱹᱰ ᱟᱠᱟᱱᱟ ᱢᱟᱹᱴᱤᱥᱤᱞᱮᱼᱴ ᱢᱳᱰ + + ᱢᱟᱹᱞᱴᱤᱥᱤᱞᱮᱠᱼᱴ ᱢᱳᱰ ᱵᱚᱞᱚ ᱮᱱᱟᱢ, ᱛᱩᱢᱟᱹᱞ ᱥᱟᱸᱪᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱨᱮᱵ ᱠᱚ ᱪᱚᱭᱚᱱ ᱢᱮ + + ᱵᱟᱪᱷᱟᱣᱮᱱᱟ + + + %1$s ᱛᱮᱭᱟᱨ ᱦᱩᱭ ᱠᱟᱱᱟ Mozilla ᱫᱟᱨᱟᱭᱛᱮ ᱾ + + + + ᱟᱢ ᱱᱤᱡᱚᱨᱟᱜ ᱚᱠᱛᱚ ᱨᱮ ᱢᱮᱱᱟᱢ-ᱟ + + %1$s ᱟᱢᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱟᱨ ᱯᱟᱱᱛᱮᱭᱟᱜ ᱦᱤᱛᱟᱹᱞ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱠᱷᱚᱱ ᱯᱷᱟᱨᱪᱟ ᱭᱟᱭ ᱡᱚᱠᱷᱚᱱ ᱟᱢ ᱩᱱᱠᱩ ᱵᱚᱸᱫᱚ ᱠᱚᱣᱟᱢ ᱟᱨ ᱮᱯ ᱟᱲᱟᱹᱜ ᱟᱢ. ᱱᱚᱣᱟ ᱫᱚ ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱵᱟᱝ ᱵᱮᱱᱟᱣ ᱢᱤᱭᱟᱭ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱟᱨ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱮᱢᱚᱜᱤᱪ ᱠᱷᱚᱱ, ᱱᱚᱣᱟ ᱫᱚ ᱟᱞᱜᱟ ᱵᱮᱱᱟᱣ ᱟᱭ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱛ ᱪᱷᱤ ᱠᱚ ᱟᱢ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱚᱨᱟᱣ ᱫᱟᱢ ᱩᱱᱠᱩ ᱠᱷᱚᱱ ᱡᱟ ᱱᱚᱣᱟ ᱥᱟᱫᱷᱚᱱ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱚ ᱾ + ᱱᱤᱡᱚᱨᱟᱜ ᱵᱨᱟᱣᱡᱤᱝ ᱨᱮᱭᱟᱜ ᱥᱚᱢᱟᱱ ᱮᱰᱮ ᱠᱚ + + ᱚᱠᱛᱚ ᱢᱮᱴᱟᱣ ᱢᱮ + + + + ᱟᱢᱟᱜ ᱚᱲᱟᱜ ᱤᱥᱠᱨᱤᱱ ᱠᱷᱚᱱ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱡᱷᱤᱡ ᱞᱟᱹᱜᱤ ᱛᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱠᱷᱟᱴᱚᱢᱟᱪᱷᱟ ᱥᱮᱞᱮᱫ ᱛᱟᱞᱟᱝ ᱢᱮ ᱾ + + ᱠᱷᱟᱴᱚᱢᱟᱪᱷᱟ ᱥᱮᱞᱮᱫ ᱢᱮ + + + ᱵᱟᱝᱟ ᱥᱟᱨᱦᱟᱣ + + + + Firefox ᱞᱚᱜᱚᱱ ᱚᱰᱚᱠ ᱢᱮ, ᱚᱲᱟᱜ ᱥᱠᱨᱤᱤᱱ ᱨᱮ ᱣᱤᱡᱮᱴ ᱥᱮᱞᱮᱫ ᱢᱮ ᱾ + + ᱣᱤᱡᱮᱴ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱸᱝᱟ + + + + ᱟᱢ ᱮᱯᱯ ᱠᱚ ᱮᱢᱟᱱ ᱨᱮ ᱟᱡ ᱛᱮᱜᱮ ᱞᱤᱸᱠ ᱠᱚ ᱮᱢᱟᱱ ᱚᱰᱚᱠ ᱨᱮᱭᱟᱜ Firefox ᱨᱮ ᱥᱮᱴ ᱫᱟᱲᱮᱟᱜᱼᱟᱢ ᱾ + + ᱥᱟᱡᱟᱣ ᱠᱚ ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ + + + ᱵᱟᱹᱰ + + + ᱠᱚᱢᱨᱟ ᱵᱮᱵᱷᱟᱨ ᱫᱚᱨᱠᱟᱨ ᱾ ᱮᱸᱰᱨᱚᱭᱮᱰ ᱥᱟᱡᱟᱣ ᱛᱮ ᱪᱟᱹᱞᱟᱜ ᱢᱮ, ᱪᱷᱟᱹᱲ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ , ᱟᱨ ᱮᱞᱞᱟᱣ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ ᱾ + + ᱥᱟᱡᱟᱣ ᱠᱚ ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ + + + ᱵᱟᱦᱨᱮ ᱚᱰᱚᱠ + + + ᱚᱠᱟ ᱠᱚ ᱫᱚ ᱢᱟᱲᱟᱝ ᱫᱤᱱ, ᱦᱟᱴ, ᱟᱨ ᱵᱟᱝ ᱢᱟᱦᱟ ᱠᱚᱨᱮ ᱵᱟᱝ ᱧᱮᱞ ᱟᱠᱟᱱᱟ ᱚᱱᱟ ᱠᱚ ᱫᱚ ᱠᱷᱭᱞᱟᱹ ᱴᱮᱵ ᱠᱚ ᱨᱮ ᱟᱡ ᱛᱮᱜᱮ ᱵᱚᱸᱫᱚᱜ ᱢᱟ ᱾ + + ᱮᱴᱟᱜᱟ ᱚᱯᱥᱚᱱ ᱠᱚ ᱫᱮᱠᱷᱟᱣᱢᱮ + + ᱵᱟᱹᱰ + + + + ᱱᱟᱶᱟ ᱴᱮᱵ + + ᱱᱟᱶᱟ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ + + + ᱪᱮᱛᱟᱱ ᱨᱤᱱ ᱥᱟᱭᱤᱴ ᱠᱚ + + + + ᱡᱷᱤᱡ ᱴᱮᱵ ᱠᱚ + + ᱛᱟᱭᱚᱢ + + ᱞᱟᱦᱟ + + ᱨᱤᱯᱷᱨᱮᱥ + + ᱛᱤᱸᱜᱩ + + ᱵᱩᱠᱢᱟᱨᱠ + + ᱵᱩᱠᱢᱟᱨᱠ ᱥᱟᱯᱲᱟᱣ ᱢᱮ + + ᱮᱰ-ᱟᱸᱱᱥ + + ᱱᱚᱱᱰᱮ ᱮᱰ-ᱟᱸᱱᱥ ᱠᱚ ᱵᱟᱹᱱᱩᱜᱼᱟ + + ᱜᱚᱲᱚ + + ᱪᱮᱫ ᱱᱟᱶᱟ ᱢᱮᱱᱟᱜ-ᱟ + + ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱯᱩᱛᱷᱤ ᱚᱲᱟᱜ + + ᱰᱮᱥᱠᱴᱟᱹᱯ ᱥᱟᱭᱤᱴ + + ᱚᱲᱟᱜ ᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱵᱚᱦᱟᱞ ᱢᱮ + + ᱥᱤᱸᱠᱼᱰ ᱴᱮᱵ ᱠᱚ + + ᱨᱤᱥᱤᱸᱠ + + ᱥᱟᱦᱴᱟ ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱱᱤᱡᱚᱨᱟᱜ ᱴᱮᱵ + + ᱱᱟᱶᱟ ᱴᱮᱵ + + ᱛᱩᱢᱟᱹᱞ ᱡᱟᱣᱨᱟ ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱦᱟᱹᱴᱤᱧ + + ᱱᱚᱶᱟ ᱛᱮ ᱦᱟᱹᱴᱤᱧ ᱢᱮ... + + %1$s ᱨᱮ ᱡᱷᱤᱡ ᱢᱮ + + %1$s ᱫᱟᱨᱟᱭ ᱛᱮ ᱫᱟᱲᱮ ᱮᱢ + + %1$s ᱫᱟᱨᱟᱭ ᱛᱮ ᱫᱟᱲᱮ ᱮᱢ + + ᱨᱤᱰᱚᱨ ᱵᱷᱭᱩ + + ᱨᱤᱰᱚᱨ ᱵᱷᱭᱩ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱮᱯᱯ ᱨᱮ ᱡᱷᱤᱡ ᱢᱮ + + + ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ + + + ᱵᱟᱝ ᱡᱩᱲᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ ᱾ URL ᱥᱠᱤᱢ ᱵᱟᱝ ᱪᱤᱱᱦᱟᱹᱣ ᱫᱟᱲᱮᱞᱟᱱᱟ ᱾ + + + + ᱵᱟᱪᱷᱟᱣᱟᱠᱟᱱ ᱯᱟᱹᱨᱥᱤ + + ᱥᱮᱸᱫᱽᱨᱟ + + ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱯᱟᱹᱨᱥᱤ ᱯᱟᱸᱪᱟᱣ ᱢᱮ + + ᱯᱟᱹᱨᱥᱤ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + + + ᱥᱠᱮᱱ + + ᱥᱮᱸᱫᱽᱨᱟ ᱤᱱᱡᱤᱱ + + ᱥᱮᱸᱫᱽᱨᱟᱭ ᱤᱱᱡᱤᱱ ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱱᱤᱭᱟᱹ ᱫᱷᱟᱣ, ᱱᱚᱶᱟ ᱛᱮ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮᱺ + + ᱠᱞᱤᱯᱷᱵᱚᱰ ᱠᱷᱚᱱ ᱞᱤᱸᱠ ᱯᱮᱨᱮᱡ ᱢᱮ + + + ᱦᱮᱥᱟᱨᱤᱭᱟᱹ + + ᱟᱞᱚ ᱢᱟᱸᱡᱩᱨᱮᱭᱟᱢ + + ᱥᱮᱸᱫᱽᱨᱟ ᱥᱚᱞᱦᱟ ᱱᱤᱡᱮᱨᱟᱜ ᱚᱠᱛᱚ ᱨᱮ ᱵᱟᱛᱟᱣ ᱮᱢᱟᱢ ᱥᱮ? + + ᱟᱢᱟᱜ ᱢᱩᱞ ᱥᱟᱸᱽᱨᱟ ᱤᱱᱡᱤᱱ ᱨᱮᱭᱟᱜ ᱴᱷᱤᱠᱬᱟ ᱵᱟᱨ ᱨᱮ ᱡᱟᱦᱟᱸ ᱜᱮ ᱚᱞᱟᱢ ᱚᱱᱟ ᱠᱚ %s ᱡᱷᱚᱛᱚ ᱦᱟᱹᱴᱤᱧᱟᱭ ᱾ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + + + ᱥᱮᱸᱫᱽᱨᱟ + + ᱣᱮᱵ ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱨᱚᱲ ᱥᱮᱸᱫᱽᱨᱟ + + + + ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱥᱟᱫᱷᱟᱨᱚᱬ + + ᱥᱟᱫᱷᱟᱨᱚᱱ + + ᱵᱟᱵᱚᱛ + + ᱢᱩᱞ ᱥᱮᱸᱫᱽᱨᱟ ᱤᱱᱡᱤᱱ + + ᱥᱮᱸᱫᱽᱨᱟ + + ᱴᱷᱤᱠᱟᱹᱱᱟ ᱦᱩᱨᱠᱟᱹᱬ + + ᱜᱚᱲᱚ + + Google Play ᱨᱮ ᱫᱚᱨ ᱢᱮ + + ᱯᱩᱥᱴᱟᱹᱣ ᱮᱢ ᱢᱮ + + %1$s ᱨᱮᱭᱟᱜ ᱵᱟᱵᱚᱛ + + ᱟᱢᱟᱜ ᱦᱚᱠ ᱠᱚ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ + + ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱠᱚ ᱟᱨ ᱴᱷᱤᱠᱚᱬᱟᱹ ᱠᱚ + + ᱢᱩᱞ ᱵᱨᱟᱩᱡᱟᱹᱨ ᱞᱮᱠᱷᱟ ᱥᱟᱡᱟᱣ ᱢᱮᱸ + + ᱞᱟᱦᱟᱱᱛᱤ + + ᱱᱤᱥᱚᱱ + + ᱱᱤᱥᱚᱱ ᱟᱨ ᱡᱟᱹᱯᱛᱤ + + ᱥᱟᱭᱤᱴ ᱨᱮᱭᱟᱜ ᱪᱷᱟᱹᱲ ᱠᱚ + + ᱱᱤᱡᱮᱨᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ + + ᱞᱤᱸᱠ ᱠᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱨᱮ ᱡᱷᱤᱡ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱨᱮ ᱥᱠᱨᱤᱱᱥᱚᱴ ᱠᱚ ᱦᱮᱥᱟᱨᱤᱭᱟᱹ ᱢᱮ + + ᱡᱩᱫᱤ ᱢᱟᱸᱡᱩᱨ ᱮᱱᱟ, ᱯᱨᱟᱭᱣᱮᱴ ᱴᱮᱵ ᱠᱚ ᱫᱚ ᱧᱮᱞᱚᱜ ᱜᱮᱭᱟ ᱡᱩᱫᱤ ᱢᱟᱹᱞᱴᱤᱯᱟᱹᱞ ᱮᱯᱯ ᱠᱚ ᱠᱷᱩᱞᱟᱹ ᱛᱟᱦᱮᱸᱱᱟ + + ᱱᱤᱡᱮᱨᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱠᱷᱟᱴᱚᱢᱟᱪᱷᱟ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱟᱹᱛᱩᱨ ᱫᱟᱲᱮᱭᱟᱜ + + ᱠᱟᱹᱥᱴᱚᱢ Firefox ᱠᱷᱟᱛᱟ ᱥᱟᱹᱨᱣᱟᱹᱨ + + ᱠᱩᱥᱤᱭᱟᱜ ᱥᱤᱸᱠ ᱥᱟᱹᱨᱣᱟᱹᱨ + + Firefox ᱠᱷᱟᱛᱟ/ ᱥᱭᱸᱠ ᱠᱟᱹᱨᱣᱟᱹᱨ ᱵᱚᱫᱚᱞᱮᱱᱟ ᱾ ᱵᱚᱫᱚᱞ ᱠᱚ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱮᱯᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱸᱫᱚᱜ ᱠᱟᱱᱟ… + + ᱠᱷᱟᱛᱟ + + ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ + + ᱴᱩᱞᱵᱟᱨ + + ᱩᱭᱦᱟᱹᱨ + + ᱚᱲᱟᱜ + + ᱪᱤᱱᱦᱟᱹ ᱠᱚ + + ᱠᱩᱥᱤᱭᱟᱜ ᱛᱮᱭᱟᱨ + + ᱵᱩᱠᱢᱟᱨᱠ, ᱦᱤᱛᱟᱹᱞ ᱟᱨ ᱵᱟᱹᱲᱛᱤ ᱠᱚ ᱟᱢᱟᱜ Firefox ᱠᱷᱟᱛᱟ ᱥᱟᱣ ᱛᱮ ᱥᱭᱸᱠ ᱢᱮ + + Firefox ᱠᱷᱟᱛᱟ + + ᱥᱭᱸᱠ ᱠᱚ ᱪᱟᱹᱞᱩ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱫᱩᱦᱲᱟᱹ ᱡᱩᱰᱟᱹᱣ + + ᱯᱟᱹᱨᱥᱤ + + ᱥᱟᱹᱠᱷᱤᱭᱟᱹᱛ ᱠᱩᱥᱤᱭᱟᱜ ᱠᱚ + + ᱟᱸᱠᱲᱟ ᱛᱩᱢᱟᱹᱞ + + ᱱᱤᱥᱚᱱ ᱨᱮᱭᱟᱜ ᱱᱚᱴᱤᱥ + + ᱵᱟᱲᱦᱟᱣᱟᱜ ᱦᱟᱹᱛᱤᱭᱟᱹᱨ + + ᱥᱟᱸᱜᱤᱧ ᱫᱚᱥ ᱥᱟᱦᱟᱭ USB ᱥᱟᱣ ᱛᱮ + + ᱥᱮᱸᱫᱽᱨᱟ ᱤᱱᱡᱤᱱ ᱠᱚ ᱩᱫᱩᱜ ᱢᱮ + + ᱥᱮᱸᱫᱽᱨᱟ ᱦᱩᱫᱤᱥ ᱠᱚ ᱩᱫᱩᱜ + + ᱨᱚᱲ ᱥᱮᱸᱫᱽᱨᱟ ᱩᱫᱩᱜ + + ᱱᱤᱡᱮᱨᱟᱜ ᱚᱠᱛᱚ ᱨᱮ ᱩᱫᱩᱜ ᱢᱮ + + ᱨᱮᱴᱚᱯᱵᱚᱰ ᱦᱩᱫᱤᱥ ᱠᱚ ᱩᱫᱩᱜ + + ᱵᱨᱟᱩᱡᱤᱝ ᱦᱤᱛᱟᱹᱞ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱥᱭᱸᱠ ᱟᱠᱟᱱ ᱴᱮᱵ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱠᱷᱟᱛᱟ ᱨᱮᱭᱟᱜ ᱥᱟᱡᱟᱣ ᱠᱚ + + URLs ᱟᱪᱛᱮ ᱯᱩᱨᱟᱹᱣᱼᱜ ᱢᱟ + + ᱞᱤᱸᱠ ᱠᱚ ᱮᱯ ᱨᱮ ᱡᱷᱤᱡ ᱢᱮ + + + ᱵᱟᱦᱨᱮ ᱨᱮᱭᱟᱜ ᱰᱟᱣᱱᱞᱳᱰ ᱢᱮᱱᱮᱡᱟᱹᱨ + + ᱮᱰ-ᱟᱸᱱᱥ + + ᱤᱛᱞᱟᱭ ᱠᱚ + + + + ᱱᱤᱛᱚᱜ ᱥᱭᱸᱠ ᱢᱮ + + ᱚᱠᱟ ᱥᱭᱸᱠ ᱨᱮᱭᱟᱜ ᱛᱟᱦᱮᱸᱱᱟ ᱪᱚᱭᱚᱱ ᱢᱮ + + ᱦᱤᱛᱟᱹᱞ + + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ + + ᱵᱚᱞᱚᱱ ᱠᱚ + + ᱡᱷᱤᱡ ᱴᱮᱵ ᱠᱚ + + ᱵᱟᱦᱨᱮ ᱚᱰᱚᱠ + + ᱥᱟᱫᱷᱚᱱ ᱧᱩᱛᱩᱢ + + ᱥᱟᱫᱷᱚᱱ ᱧᱩᱛᱩᱢ ᱠᱷᱟᱹᱞᱤ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱰᱮᱜ-ᱟ ᱾ + + ᱥᱤᱸᱠ ᱦᱩᱭᱩ ᱠᱟᱱᱟ... + + ᱥᱭᱸᱠ ᱰᱤᱜᱟᱹᱣ ᱾ ᱢᱟᱲᱟᱝ ᱨᱟᱹᱥ ᱞᱮᱠᱟᱛᱮ ᱪᱟᱵᱟ:%s + + ᱥᱭᱸᱠ ᱰᱤᱜᱟᱹᱣ ᱾ ᱢᱟᱲᱟᱝ ᱥᱭᱸᱠᱼᱰ:ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝᱼᱟ + + ᱢᱟᱲᱟᱝ ᱥᱭᱸᱠ ᱠᱚᱺ %s + + ᱢᱟᱲᱟᱝ ᱥᱭᱸᱠ ᱠᱚᱺ ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝᱟ + + %1$s on %2$s %3$s + + + + ᱧᱟᱢᱟᱠᱟᱱ ᱴᱮᱵ ᱠᱚ + + + ᱴᱮᱵ ᱧᱟᱢᱮᱱᱟ + + ᱴᱮᱵ ᱠᱚ ᱧᱟᱢᱮᱱᱟ + + %s ᱠᱷᱚᱱ ᱴᱮᱵ + + + + ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ + + ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ + + ᱠᱚᱱᱴᱮᱸᱱᱴ ᱟᱨ ᱥᱠᱨᱭᱤᱯᱴ ᱠᱚ ᱟᱴᱠᱟᱣ ᱢᱮ ᱡᱟ ᱟᱢ ᱯᱟᱸᱡᱟ ᱢᱮᱭᱟᱹ ᱠᱚ + + ᱪᱷᱟᱰᱟ ᱠᱚ + + + ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱱᱚᱣᱟ ᱠᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ + + ᱡᱷᱚᱛᱚ ᱠᱚ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱱ ᱢᱮ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + + ᱡᱮᱜᱮᱛ ᱨᱮ ᱵᱚᱸᱫᱚ ᱦᱩᱭ ᱠᱟᱱᱟ, ᱪᱟᱹᱞᱩ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱥᱟᱡᱟᱣ ᱨᱮ ᱪᱟᱹᱞᱩᱭ ᱢᱮ ᱾ + + + ᱴᱮᱞᱭᱢᱮᱴᱨᱭ + + ᱵᱮᱵᱷᱟᱨ ᱟᱨ ᱴᱮᱠᱱᱤᱠᱚᱞ ᱰᱟᱴᱟ ᱠᱚ + + ᱢᱟᱨᱠᱮᱴᱤᱝ ᱰᱟᱴᱟ + + ᱵᱤᱰᱟᱣ + + ᱨᱟᱹᱯᱩᱫ ᱞᱟᱭ-ᱟᱜ + + Mozilla ᱨᱮᱭᱟᱜ ᱡᱟᱭᱜᱟ ᱠᱟᱹᱢᱤ + + + %s ᱦᱚᱲᱢᱚ ᱠᱷᱚᱵᱚᱨ + + + + ᱥᱭᱸᱠ ᱪᱟᱹᱞᱩᱭ ᱢᱮ + + ᱡᱚᱲᱟᱣ ᱠᱳᱰ ᱥᱠᱮᱱ ᱢᱮ ᱰᱮᱥᱠᱴᱚᱯ Firefox ᱨᱮ + + ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ + + ᱫᱩᱲᱟᱹ ᱡᱚᱲᱟᱣ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱠᱷᱟᱛᱟ ᱚᱪᱚᱜ ᱢᱮ + + + + firefox.com/pair ᱨᱮ ᱩᱫᱩᱠ ᱠᱟᱫᱟ ᱠᱚ]]> + + ᱠᱮᱢᱨᱟ ᱡᱷᱤᱜ ᱢᱮ + + ᱵᱟᱹᱲᱨᱟ + + + + ᱪᱮᱛᱟᱱ + + ᱞᱟᱛᱟᱨ + + + + ᱢᱟᱨᱥᱟᱞ + + ᱧᱩᱛ + + + ᱵᱮᱴᱨᱭ ᱥᱮᱣᱟᱹᱨ ᱛᱮ ᱥᱮᱴ ᱢᱮ + + ᱥᱟᱫᱷᱚᱱ ᱩᱭᱦᱟᱹᱨ ᱯᱟᱸᱡᱟᱭ ᱢᱮ + + + + ᱱᱟᱶᱟ ᱟᱹᱨᱩ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱨ ᱢᱮ + + ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱩᱠᱩ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱛᱚᱛᱨᱚᱭ ᱢᱮ + + + ᱴᱮᱵ ᱠᱚ ᱵᱚᱫᱚᱞ‌ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱭᱤᱰ ᱛᱮᱴᱩᱞᱵᱟᱨ ᱠᱷᱚᱥᱨᱚᱫ ᱢᱮ + + ᱴᱮᱵ ᱠᱚ ᱠᱷᱩᱞᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱴᱩᱞᱵᱟᱨ ᱥᱣᱟᱭᱤᱯ ᱢᱮ + + + + ᱚᱠᱛᱚ ᱠᱚ + + ᱤᱥᱠᱨᱤᱱᱥᱚᱴ ᱠᱚ + + ᱰᱟᱩᱱᱞᱳᱰ ᱠᱚ + + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ + + ᱰᱮᱥᱠᱴᱚᱯ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ + + ᱵᱩᱠᱢᱟᱨᱠ ᱢᱮᱱᱩ + + ᱵᱩᱠᱢᱟᱨᱠ ᱦᱚᱛᱷᱤᱭᱟᱨ + + ᱮᱴᱟᱜᱟ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ + + ᱦᱤᱛᱟᱹᱞ + + ᱥᱭᱸᱠᱼᱰ ᱴᱮᱵ ᱠᱚ + + ᱯᱟᱲᱦᱟᱣ ᱞᱤᱥᱴᱤ + + ᱥᱮᱸᱫᱽᱨᱟ + + ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱦᱤᱛᱟᱹᱞ ᱡᱤᱱᱤᱥ ᱢᱮᱱᱩ + + ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + + ᱱᱤᱛᱚᱜᱼᱟᱜ ᱵᱚᱸᱫᱚᱼᱟᱜ ᱴᱮᱵ ᱠᱚ + + ᱥᱟᱱᱟᱢ ᱦᱤᱛᱟᱹᱞ ᱫᱮᱠᱷᱟᱣᱢᱮ + + %d ᱴᱮᱵ ᱠᱚ + + %d ᱴᱮᱵ + + + ᱱᱤᱛᱚᱜᱼᱟᱜ ᱵᱚᱸᱫᱚᱼᱟᱜ ᱴᱮᱵ ᱠᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ + + + + ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱛᱤ ᱛᱮᱭᱟᱜ + + + ᱢᱤᱫ ᱢᱟᱦᱟ ᱛᱟᱭᱚᱢ + + ᱢᱤᱫ ᱦᱟᱴ ᱛᱟᱭᱚᱢ + + ᱢᱤᱫ ᱪᱟᱸᱫᱚ ᱛᱟᱭᱚᱢ + + + + ᱡᱷᱤᱜ ᱴᱮᱵ ᱠᱚ + + ᱯᱨᱭᱣᱮᱴ ᱯᱟᱲᱤ + + ᱯᱨᱭᱣᱮᱴ ᱴᱮᱵ ᱠᱚ + + ᱴᱮᱵ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱯᱨᱭᱣᱮᱴ + + ᱡᱷᱤᱜ ᱴᱮᱵ ᱠᱚ + + ᱛᱩᱢᱟᱹᱞ ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱡᱷᱚᱛᱚ ᱴᱮᱵ ᱠᱚ ᱦᱟᱹᱴᱧ ᱢᱮ + + ᱱᱤᱛᱚᱜᱼᱟᱜ ᱵᱚᱸᱫᱚᱼᱟᱜ ᱴᱮᱵ ᱠᱚ + + ᱴᱮᱵ ᱨᱮᱭᱟᱜ ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱡᱷᱚᱛᱚ ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱱᱟᱶᱟ ᱴᱮᱵ + + ᱚᱲᱟᱜ ᱪᱟᱞᱟᱜ ᱢᱮ + + ᱴᱮᱵ ᱢᱳᱰ ᱛᱚᱞᱟᱜ ᱢᱮ + + ᱴᱮᱵ ᱛᱩᱢᱟᱹᱞ ᱠᱷᱚᱱ ᱚᱪᱚᱜ ᱢᱮ + + ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + %s ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱴᱮᱵ ᱢᱮᱱᱩ ᱡᱷᱤᱜ ᱢᱮ + + ᱡᱷᱚᱛᱚ ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱴᱮᱵ ᱠᱚ ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + ᱴᱮᱵ ᱠᱚ ᱛᱩᱢᱟᱹᱞ ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱴᱮᱵ ᱢᱮᱱᱭᱩ + + ᱴᱮᱵ ᱦᱟᱹᱴᱤᱸᱧ ᱢᱮ + + ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱦᱟᱹᱴᱤᱝ ᱢᱮ + + Current session image + + ᱛᱩᱢᱟᱹᱞ ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱛᱩᱢᱟᱹᱞ ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱛᱩᱢᱟᱹᱞ ᱫᱚᱦᱲᱟ ᱧᱩᱛᱩᱢ ᱢᱮ + + ᱡᱷᱤᱜ ᱴᱮᱵ ᱠᱚ + + ᱚᱪᱚᱜ ᱢᱮ + + ᱦᱤᱛᱟᱹᱞ ᱠᱷᱚᱱ ᱢᱮᱴᱟᱣ ᱢᱮ + + %1$s (ᱯᱨᱭᱣᱮᱴ ᱢᱳᱰ) + + ᱥᱟᱸᱪᱟᱣ + + + + ᱦᱤᱛᱟᱹᱞ ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢᱼᱟ ᱟᱢᱟᱜ ᱦᱤᱛᱟᱹᱞ ᱢᱮᱴᱟᱣ ᱞᱟᱹᱜᱤᱛ ᱛᱮ? + + ᱦᱤᱛᱟᱹᱞ ᱢᱮᱴᱟᱣᱮᱱᱟ + + %1$s ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱯᱷᱟᱨᱪᱟ + + ᱱᱚᱠᱚᱞ ᱢᱮ + + ᱦᱟᱹᱴᱤᱝ ᱢᱮ + + ᱱᱟᱶᱟ ᱴᱮᱵ ᱨᱮ ᱡᱷᱤᱜ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱨᱮ ᱡᱷᱤᱜ ᱢᱮ + + ᱢᱮᱴᱟᱣ ᱢᱮ + + %1$d ᱵᱟᱪᱷᱟᱣᱮᱱᱟ + + %1$d ᱡᱤᱱᱤᱥ ᱠᱚ ᱢᱮᱴᱟᱣ + + 24 ᱴᱟᱲᱟᱝ ᱢᱟᱲᱟᱝ + + 7 ᱫᱤᱱ ᱢᱟᱲᱟᱝ + + 30 ᱫᱤᱱ ᱢᱟᱲᱟᱝ + + ᱢᱟᱨᱮᱭᱟᱜ + + ᱱᱚᱲᱮ ᱦᱤᱛᱟᱹᱞ ᱵᱚᱱᱩ-ᱟ + + + + ᱱᱚᱰᱮ ᱰᱟᱩᱱᱞᱳᱰ ᱠᱚ ᱵᱚᱱᱩᱜ-ᱟ + + %1$d ᱵᱟᱪᱷᱟᱣᱮᱱᱟ + + + + ᱤᱠᱟ. %1$s ᱚᱱᱟ ᱥᱟᱦᱴᱟ ᱵᱟᱭ ᱞᱟᱫᱮ ᱫᱟᱲᱮᱼᱜ ᱠᱟᱱᱟ ᱾ + + ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱢᱮᱱᱟᱜ ᱴᱮᱵ ᱫᱩᱦᱲᱟᱹ ᱫᱚᱦᱚ ᱟᱨ ᱵᱟᱝ ᱵᱚᱸᱫᱚᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ + + ᱨᱟᱹᱯᱩᱫ ᱨᱤᱯᱚᱴ Mozilla ᱴᱷᱮᱱ ᱠᱩᱞ ᱢᱮ + + ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + + ᱴᱮᱵ ᱫᱩᱦᱲᱟᱹ ᱡᱚᱜᱟᱣ ᱢᱮ + + + ᱚᱠᱛᱚ ᱨᱮᱭᱟᱜ ᱚᱯᱥᱚᱱ + + + ᱚᱠᱛᱚ ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + + + ᱵᱩᱠᱢᱟᱨᱠ ᱢᱮᱱᱩ + + ᱵᱩᱠᱢᱟᱨᱠ ᱥᱟᱯᱲᱣ ᱢᱮ + + ᱯᱚᱴᱚᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱯᱚᱴᱚᱢ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱛ ᱛᱮ? + + %s ᱵᱟᱪᱷᱟᱣᱠᱟᱱ ᱡᱤᱱᱤᱥ ᱠᱚ ᱢᱮᱴᱟᱣ ᱟᱭ ᱾ + + %1$s ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱯᱚᱴᱚᱢ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱵᱩᱠᱢᱟᱨᱠ ᱵᱮᱱᱟᱣᱱᱟ ᱾ + + ᱵᱩᱠᱢᱟᱨᱠ ᱥᱟᱸᱪᱟᱣᱮᱱᱟ! + + ᱥᱟᱯᱲᱣ ᱢᱮ + + ᱥᱟᱯᱲᱟᱣ + + ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱱᱚᱠᱚᱞ ᱢᱮ + + ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + ᱱᱟᱶᱟ ᱴᱮᱵ ᱨᱮ ᱡᱷᱤᱜ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱨᱮ ᱡᱷᱤᱜ ᱢᱮ + + ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + %1$d ᱵᱟᱪᱷᱟᱣᱮᱱᱟ + + ᱵᱩᱠᱢᱟᱨᱠ ᱥᱟᱯᱲᱣ ᱢᱮ + + ᱯᱚᱴᱚᱢ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱥᱭᱸᱠᱼᱰ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + URL + + ᱯᱚᱴᱚᱢ + + ᱧᱩᱛᱩᱢ + + ᱯᱚᱴᱚᱢ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱯᱚᱴᱚᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱧᱩᱛᱩᱢ ᱦᱩᱭ ᱫᱚᱨᱠᱟᱨ ᱠᱟᱱᱟ + + ᱵᱟᱝ ᱵᱟᱛᱟᱣ URL + + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱱᱚᱲᱮ ᱵᱮᱱᱩ-ᱟ + + %1$s ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱵᱟᱪᱷᱟᱣᱠᱟᱱ ᱯᱚᱴᱚᱢ ᱠᱚ ᱢᱮᱴᱟᱣ ᱦᱩᱭᱩ ᱠᱟᱱᱟ + + ᱚᱱᱰᱩ + + + + ᱪᱷᱟᱹᱲ ᱠᱚ + + ᱥᱟᱡᱟᱣ ᱠᱚ ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ + + ᱞᱚᱜᱚᱱ ᱥᱟᱡᱟᱣ ᱥᱤᱤᱴ + + ᱵᱟᱛᱟᱣᱟᱜ + + ᱥᱟᱭᱤᱴ ᱨᱮᱭᱟᱜ ᱪᱷᱟᱹᱲ ᱠᱚ ᱢᱮᱱᱮᱡ ᱢᱮ + + ᱪᱷᱟᱹᱲ ᱠᱚ ᱯᱷᱟᱨᱪᱟᱭ ᱢᱮ + + ᱪᱷᱟᱹᱲ ᱯᱷᱟᱨᱪᱟᱭ ᱢᱮ + + ᱥᱟᱱᱟᱢ ᱥᱟᱭᱤᱴ ᱨᱮ ᱪᱷᱟᱹᱲ ᱠᱚ ᱯᱷᱟᱨᱪᱟᱭ ᱢᱮ + + ᱟᱪᱛᱮ ᱮᱱᱮᱡ + + ᱠᱮᱢᱨᱟ + + ᱢᱟᱭᱠᱨᱚᱯᱷᱚᱱ + + ᱡᱟᱭᱜᱟ + + ᱤᱛᱞᱟᱭ + + ᱦᱮᱥᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱠᱩᱠᱞᱤ ᱢᱮ + + ᱟᱠᱚᱴ ᱠᱟᱱᱟ + + ᱵᱟᱛᱟᱣ ᱮᱢᱟᱠᱟᱱᱟ + + Android ᱫᱟᱨᱟᱭ ᱛᱮ ᱟᱠᱚᱴ ᱦᱩᱭ ᱟᱠᱟᱱᱟ + + ᱪᱷᱟᱰᱟ ᱠᱚ + + ᱪᱟᱹᱞᱩ + + ᱵᱚᱸᱫᱚ + + ᱟᱰᱤᱭᱳ ᱟᱨ ᱣᱤᱰᱤᱭᱳ ᱦᱮᱥᱟᱨᱤᱭᱟᱹ ᱢᱮ + + ᱥᱮᱞᱩᱞᱟᱹᱨ ᱰᱟᱴᱟ ᱨᱮᱜᱤ ᱟᱰᱤᱭᱳ ᱟᱨ ᱣᱤᱰᱤᱭᱳ ᱟᱴᱠᱟᱣ ᱢᱮ + + ᱟᱰᱤᱭᱳ ᱟᱨ ᱣᱤᱰᱤᱭᱳ Wi-Fi ᱨᱮ ᱮᱱᱮᱡᱚᱣᱟ + + ᱟᱰᱤᱭᱳ ᱜᱤ ᱟᱴᱠᱟᱣ ᱢᱮ + + ᱟᱰᱤᱭᱳ ᱟᱨ ᱣᱤᱰᱤᱭᱳ ᱟᱴᱠᱟᱣ ᱢᱮ + + ᱪᱚᱞᱩ + + + ᱵᱚᱸᱫᱚ + + + + ᱛᱩᱢᱟᱹᱞ ᱠᱚ + + ᱛᱩᱢᱟᱹᱞ ᱢᱮᱱᱭᱩ + + ᱴᱮᱵ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱛᱩᱢᱟᱹᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱛᱩᱢᱟᱹᱞ ᱧᱩᱛᱩᱢᱼᱟᱜ ᱢᱮ + + ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱡᱚᱛᱚ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱡᱚᱛᱚ ᱠᱚ ᱵᱟᱝ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱴᱮᱵ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + + %d ᱴᱮᱵ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱᱟ + + %d ᱴᱮᱵ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱᱟ + + ᱴᱮᱵ ᱠᱚ ᱥᱟᱸᱪᱟᱣᱮᱱᱟ! + + ᱛᱩᱢᱟᱹᱞ ᱥᱟᱸᱪᱟᱣᱮᱱᱟ! + + ᱴᱮᱵ ᱥᱟᱸᱪᱟᱣᱮᱱᱟ! + + ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱵᱷᱤᱭᱩ + + + %d ᱛᱩᱢᱟᱹᱞ + + + + ᱠᱩᱞᱢᱮ ᱟᱨ ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + + ᱢᱤᱫ ᱴᱟᱝ ᱞᱤᱸᱠ ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱠᱩᱞ ᱢᱮ + + ᱡᱚᱛᱚ ᱠᱟᱹᱢᱤᱠᱚ + + ᱱᱤᱛᱚᱜ ᱵᱮᱵᱷᱟᱨᱟᱜ + + ᱥᱭᱸᱠ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱡᱚᱛᱚ ᱥᱟᱫᱷᱚᱱ ᱛᱮ ᱵᱷᱮᱡᱟᱭᱢᱮ + + ᱥᱭᱸᱠ ᱞᱟᱹᱜᱤᱫ ᱫᱩᱦᱲᱟᱹ ᱡᱩᱲᱟᱹᱣ + + ᱟᱸᱯᱷᱞᱟᱭᱤᱱ + + ᱚᱞᱜᱟ ᱥᱟᱫᱷᱚᱱ ᱡᱩᱰᱟᱹᱣ ᱢᱮ + + ᱴᱮᱵ ᱵᱷᱮᱡᱟ ᱞᱟᱹᱜᱤᱫ, ᱢᱤᱫ ᱠᱷᱚᱱ ᱡᱟᱹᱥᱛᱤ ᱥᱟᱫᱷᱚᱱ ᱛᱮ Firefox ᱨᱮ ᱵᱚᱞᱚᱱ ᱢᱮ ᱾ + + ᱵᱩᱡᱷᱟᱹᱣ ᱠᱮᱫᱟ + + ᱱᱚᱣᱟ ᱮᱯᱯ ᱵᱷᱮᱡᱟ ᱵᱟᱝ ᱜᱟᱱᱚᱜᱼᱟ + + ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱠᱩᱞ ᱢᱮ + + + ᱥᱟᱫᱷᱚᱱ ᱠᱚ ᱡᱚᱲᱟᱣ ᱵᱚᱱᱩᱜ-ᱟ + + ᱴᱮᱵ ᱠᱚ ᱮᱢᱟᱱ ᱵᱷᱮᱡᱟ ᱵᱟᱵᱚᱛ ᱵᱟᱰᱟᱭ ᱢᱮ… + + ᱚᱞᱜᱟ ᱥᱟᱫᱷᱚᱱ ᱡᱩᱰᱟᱹᱣ ᱢᱮ… + + + + ᱱᱤᱡᱮᱨᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱚᱠᱛᱚ + + ᱯᱨᱭᱣᱮᱴ ᱴᱮᱵ ᱠᱚ ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱯᱨᱭᱣᱮᱴ ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + ᱡᱷᱤᱡ ᱢᱮ + + ᱢᱮᱴᱟᱣ ᱢᱮ ᱟᱨ ᱡᱷᱤᱡ ᱢᱮ + + ᱦᱚᱛᱮ ᱛᱮ ᱫᱟᱲᱮ ᱮᱢ + + ᱛᱩᱢᱟᱹᱞ ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱛᱩᱢᱟᱹᱞ ᱫᱚᱦᱲᱟ ᱧᱩᱛᱩᱢ ᱮᱢ ᱦᱩᱭᱮᱱᱟ + + ᱴᱮᱵ ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱴᱮᱵ ᱠᱚ ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭᱮᱱᱟ + + ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭᱮᱱᱟ + + ᱛᱮᱛᱟᱱ ᱥᱟᱭᱤᱴ ᱨᱮ ᱥᱮᱞᱮᱫ ᱮᱱᱥ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭᱮᱱᱟ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭᱮᱱᱟ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱠᱚ ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱚᱱᱰᱩ + + ᱥᱟᱭᱤᱴ ᱚᱪᱚᱜ ᱦᱩᱭ ᱮᱱᱟ + + ᱚᱱᱰᱩ + + ᱜᱚᱴᱟ + + %1$s ᱵᱟᱛᱟᱣ ᱮᱢᱟᱭ ᱢᱮ %2$s ᱡᱷᱤᱡ ᱞᱟᱹᱜᱤᱛ ᱛᱮ + + ᱢᱟᱹᱱᱡᱩᱨ + + ᱵᱟᱹᱰ + + %1$s ᱢᱮᱴᱟᱣ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢ-ᱟ? + + ᱱᱚᱣᱟ ᱴᱮᱵ ᱢᱮᱴᱟᱣ ᱞᱮᱠᱷᱟᱭ ᱥᱟᱱᱟᱢ ᱛᱩᱢᱟᱹᱞ ᱢᱮᱴᱟᱣ ᱪᱟᱵᱟᱜ-ᱟ ᱾ ᱚᱠᱟ ᱥᱚᱢᱚᱭ ᱨᱮ ᱦᱚᱸ ᱟᱢ ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱠᱚ ᱛᱮᱭᱟᱨ ᱫᱟᱲᱮᱼᱟᱜ ᱟᱢ ᱾ + + %1$s ᱢᱮᱴᱟᱣᱟ ᱥᱮ? + + ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱵᱟᱹᱲᱨᱟ + + + ᱯᱩᱨᱟᱹ ᱠᱨᱤᱱ ᱢᱳᱰ ᱵᱚᱞᱚᱱ ᱠᱟᱱᱟᱢ + + URL ᱱᱚᱠᱚᱞ ᱮᱱᱟ + + ᱣᱮᱵᱥᱟᱭᱤᱴ ᱨᱮ ᱚᱱᱚᱞ ᱠᱚ ᱢᱟᱨᱟᱝ ᱵᱟᱝᱠᱷᱟᱱ ᱦᱩᱰᱤᱧ ᱠᱚᱨᱟᱣ ᱢᱮ + + ᱪᱤᱠᱤ ᱨᱮᱭᱟᱜ ᱢᱟᱯ + + + ᱟᱪᱛᱮ ᱪᱤᱠᱤ ᱥᱟᱡᱟᱣ + + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ + + ᱡᱷᱤᱡ ᱴᱮᱵ ᱠᱚ + + %d ᱴᱮᱵ ᱠᱚ + + ᱵᱨᱟᱩᱡᱤᱝ ᱦᱤᱛᱟᱹᱞ ᱟᱨ ᱥᱟᱭᱤᱴ ᱰᱟᱴᱟ + + %d ᱴᱷᱤᱠᱬᱟᱹ ᱠᱚ + + ᱦᱤᱛᱟᱹᱞ + + %d ᱥᱟᱦᱴᱟ ᱠᱚ + + ᱠᱩᱠᱤᱡ ᱠᱚ + + ᱟᱢ ᱫᱚ ᱰᱷᱮᱨ ᱜᱟᱱ ᱥᱟᱭᱤᱴ ᱠᱷᱚᱱ ᱵᱟᱦᱨᱮ ᱩᱲᱩᱠ ᱢᱤᱭᱟ ᱠᱚ + + ᱥᱟᱯ ᱦᱚᱭᱠᱟᱱ ᱪᱤᱛᱟᱹᱨ ᱟᱨ ᱨᱮᱫ ᱠᱚ + + ᱡᱚᱜᱟᱣ ᱡᱟᱭᱜᱟ ᱠᱷᱚᱞᱤ ᱛᱟᱦᱮᱱ ᱟᱭ + + ᱥᱟᱭᱤᱴ ᱨᱮᱭᱟᱜ ᱪᱷᱟᱹᱲ ᱠᱚ + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱢᱮᱸ + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱢᱮ ᱟᱲᱟᱜ ᱜᱷᱚᱲᱤ + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱟᱪᱛᱮ ᱢᱮᱴᱟᱣ ᱛᱟᱦᱮᱱᱟᱭ ᱡᱚᱠᱷᱚᱱ ᱟᱢ \"ᱟᱲᱟᱹᱜ\" ᱵᱟᱪᱷᱟᱣ ᱛᱟᱦᱮᱱᱟᱢ ᱢᱩᱞ ᱢᱮᱱᱩ ᱠᱷᱚᱱ + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱟᱪᱛᱮ ᱢᱮᱴᱟᱣ ᱛᱟᱦᱮᱱᱟᱭ ᱡᱚᱠᱷᱚᱱ ᱟᱢ \"ᱟᱲᱟᱹᱜ\" ᱵᱟᱪᱷᱟᱣ ᱛᱟᱦᱮᱱᱟᱢ ᱢᱩᱞ ᱢᱮᱱᱩ ᱠᱷᱚᱱ + + ᱟᱲᱟᱹᱜ ᱢᱮ + + + ᱱᱚᱣᱟ ᱫᱚ ᱟᱢᱟᱜ ᱥᱟᱱᱟᱢ ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱛᱟᱢᱟᱭ ᱾ + + %s ᱵᱟᱪᱷᱟᱣᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱟᱭ ᱾ + + ᱵᱟᱹᱲᱨᱟ + + ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣᱮᱱᱟ + + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱦᱩᱭᱩ ᱠᱟᱱᱟ… + + + + Firefox Preview ᱱᱤᱛᱚᱜ ᱫᱚ Firefox Nightly ᱦᱩᱭ ᱮᱱᱟ + + + Firefox ᱧᱟᱢ ᱢᱮ Android Beta ᱞᱟᱹᱜᱤᱫ ᱛᱮ + + + Firefox Nightly ᱩᱪᱟᱹᱰ ᱟᱠᱟᱱᱟ + + ᱱᱟᱶᱟ Nightly ᱛᱮ ᱩᱪᱟᱹᱰᱼᱚᱜ ᱢᱮ + + + Firefox Nightly ᱩᱪᱟᱹᱰ ᱟᱠᱟᱱᱟ + + ᱱᱟᱶᱟ Nightly ᱧᱟᱢ ᱢᱮ + + + + %s ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ! + + ᱞᱟᱦᱟ ᱠᱷᱚᱱ ᱠᱷᱟᱛᱟ ᱢᱮᱱᱟᱜ ᱛᱟᱢᱟ? + + %s ᱵᱟᱵᱚᱛ ᱵᱟᱲᱟᱭ ᱢᱮ + + ᱧᱮᱞ ᱢᱮ ᱪᱮᱫ ᱱᱟᱶᱟ ᱢᱮᱱᱟᱜ-ᱟ + + ᱱᱚᱰᱮ ᱛᱮᱞᱟ ᱠᱚ ᱧᱟᱢ ᱟᱢ + + ᱵᱩᱠᱢᱟᱨᱠ, ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱟᱨ ᱵᱟᱹᱲᱛᱤ ᱠᱚ ᱞᱟᱹᱜᱤᱛ ᱟᱢᱟᱜ Firefox ᱠᱷᱟᱛᱟ ᱨᱮ ᱥᱭᱸᱠ ᱮᱦᱚᱵ ᱢᱮ ᱾ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + ᱦᱮᱸ, ᱵᱚᱞᱚ ᱪᱷᱚᱭᱤᱧ ᱢᱮ + + ᱵᱚᱞᱚᱱᱟ ᱠᱟᱹᱱᱟᱹᱧ… + + Firefox ᱨᱮ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱵᱟᱦᱨᱮ ᱨᱮᱜᱮ ᱛᱟᱦᱮᱸ ᱠᱚᱜ ᱢᱮ + + ᱥᱭᱸᱠ ᱪᱟᱹᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ + + ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱰᱤᱜᱟᱹᱣᱮᱱᱟ + + ᱟᱡ ᱛᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ + + ᱵᱮᱥᱟᱜ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) + + ᱱᱤᱦᱟᱹᱛ (ᱵᱟᱛᱟᱣᱮᱢᱠᱟᱱᱟ) + + ᱱᱤᱦᱟᱹᱛ + + ᱡᱟᱹᱥᱛᱤ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ, ᱰᱷᱟᱣᱨᱟ ᱟᱨ ᱴᱟᱴᱠᱟ ᱚᱰᱚᱠ ᱠᱚ ᱟᱴᱠᱟᱣ ᱟᱭ , ᱥᱟᱠᱟᱢ ᱞᱚᱜᱚᱱ ᱞᱚᱰᱚᱜᱼᱟ ᱦᱮᱞᱮ ᱠᱤᱪᱷᱤ ᱡᱤᱱᱤᱥ ᱴᱷᱤᱠ ᱥᱮ ᱵᱟᱭ ᱠᱟᱹᱢᱤᱟᱭ ᱾ + + ᱡᱟᱭᱜᱟ ᱦᱟᱛᱟᱣ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱨᱮ ᱵᱨᱟᱩᱡ ᱢᱮ + + ᱥᱟᱡᱟᱣ ᱠᱚ ᱡᱷᱤᱡ ᱢᱮ + + + ᱟᱢᱟᱜ ᱱᱤᱥᱚᱱ + + ᱟᱞᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ ᱱᱚᱴᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱯᱮ + + ᱵᱚᱸᱫᱚᱭ + + + ᱵᱨᱟᱩᱡᱤᱝ ᱮᱦᱚᱵ ᱢᱮ + + + + ᱩᱭᱦᱟᱹᱨ ᱪᱚᱭᱚᱱ ᱛᱟᱢ + + ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱵᱮᱴᱨᱭ ᱵᱚᱪᱚᱛ ᱢᱮ ᱟᱨ ᱟᱢᱟᱜ ᱢᱮᱫ ᱵᱟᱸᱪᱟᱣ ᱛᱟᱢ ᱧᱩᱛ ᱩᱭᱦᱟᱹᱨ ᱪᱟᱹᱞᱩ ᱠᱟᱛᱮ ᱾ + + ᱟᱪᱛᱮ + + ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱥᱟᱡᱟᱣ ᱦᱟᱛᱟᱣ ᱟᱭ + + ᱧᱩᱛ ᱩᱭᱦᱟᱹᱨ + + ᱢᱟᱨᱥᱟᱞ ᱩᱭᱦᱟᱹᱨ + + + ᱴᱮᱵ ᱠᱚ ᱠᱩᱞ ᱦᱩᱭᱮᱱᱟ! + + ᱴᱮᱵ ᱠᱩᱞ ᱦᱩᱭᱮᱱᱟ! + + ᱵᱟᱝ ᱠᱩᱞ ᱫᱟᱲᱮᱞᱟᱱᱟ + + ᱨᱤᱴᱨᱭ + + ᱠᱳᱰ ᱥᱠᱮᱱ ᱢᱮ + + https://firefox.com/pair ᱨᱮ ᱪᱟᱞᱟ ᱢᱮ]]> + + ᱥᱠᱮᱱ ᱞᱚᱜᱤᱛ ᱛᱮ ᱛᱮᱭᱟᱨ ᱢᱮᱱᱟᱢ-ᱟ + + ᱟᱢᱟᱜ ᱠᱮᱢᱨᱟ ᱛᱮ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱵᱟᱹᱫᱟᱹᱞ ᱛᱮ ᱮᱢᱮᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + + ᱡᱚᱱᱚᱲᱟᱣ ᱚᱪᱚᱜ + + ᱵᱟᱹᱲᱨᱟ + + ᱢᱩᱞ ᱯᱚᱴᱚᱢ ᱵᱟᱞᱮ ᱥᱟᱯᱲᱟᱣ ᱫᱟᱰᱮᱟ + + + + ᱨᱚᱯᱷᱟ ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱵᱟᱲᱦᱟᱣᱟᱠᱟᱱ ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ + + ᱯᱟᱸᱡᱟ ᱵᱮᱜᱚᱨ ᱵᱨᱟᱩᱡ ᱢᱮ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + ᱱᱟᱯ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) + + ᱱᱤᱦᱟᱹᱛ + + ᱡᱟᱹᱥᱛᱤ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ, ᱰᱷᱟᱣᱨᱟ ᱟᱨ ᱴᱟᱴᱠᱟ ᱚᱰᱚᱠ ᱠᱚ ᱟᱴᱠᱟᱣ ᱟᱭ , ᱥᱟᱠᱟᱢ ᱞᱚᱜᱚᱱ ᱞᱚᱰᱚᱜᱼᱟ ᱦᱮᱞᱮ ᱠᱤᱪᱷᱤ ᱡᱤᱱᱤᱥ ᱴᱷᱤᱠ ᱥᱮ ᱵᱟᱭ ᱠᱟᱹᱢᱤᱟᱭ ᱾ + + ᱠᱩᱥᱤᱭᱟᱜ + + + ᱠᱩᱠᱤᱡ ᱠᱚ + + ᱠᱨᱚᱥᱼᱥᱟᱭᱤᱴ ᱟᱨ ᱥᱳᱥᱤᱭᱟᱞ ᱢᱤᱰᱤᱭᱟ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ + + ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱡᱤᱱᱤᱥ + + ᱡᱷᱚᱛᱚ ᱛᱮᱵ ᱠᱚᱨᱮ ᱠᱚ + + ᱠᱷᱟᱹᱞᱤ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱠᱚᱨᱮ ᱜᱮ + + ᱠᱷᱟᱹᱞᱤ ᱠᱩᱥᱤᱭᱟᱜ ᱴᱮᱵ ᱠᱚᱨᱮ + + ᱠᱨᱭᱯᱴᱚᱢᱟᱭᱱᱟᱹᱨ ᱠᱚ + + ᱠᱟᱹᱴᱩᱵᱪᱷᱟᱯᱟ ᱟᱜ + ᱟᱠᱚᱴ ᱠᱟᱱᱟ + + ᱢᱟᱹᱱᱡᱩᱨ + + ᱥᱟᱸᱣᱛᱟ ᱢᱤᱰᱤᱭᱟ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ + + ᱠᱨᱚᱥᱼᱥᱟᱭᱤᱴ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱠᱩᱠᱤ ᱠᱚ + + ᱠᱨᱭᱯᱴᱚᱢᱟᱭᱱᱟᱹᱨ ᱠᱚ + + ᱠᱟᱹᱴᱩᱵᱪᱷᱟᱯᱟ ᱟᱜ ᱠᱚ + + ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱡᱤᱱᱤᱥ + + ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱠᱚ ᱪᱚᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ + + ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱠᱚ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ + + ᱱᱚᱶᱟ ᱠᱚ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱵᱟᱲᱦᱟᱣᱟᱠᱟᱱ ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟ-ᱟ + + ᱯᱟᱹᱪᱷᱞᱟᱹᱥᱮᱱ ᱪᱟᱞᱟᱜ ᱢᱮ + + ᱟᱢᱟᱜ ᱦᱚᱠ ᱠᱚ + + ᱢᱩᱞ ᱠᱷᱩᱞᱟᱹ ᱞᱟᱭᱵᱨᱮᱨᱤ ᱟᱞᱮ ᱵᱮᱵᱷᱟᱨ ᱮᱫᱟ + + %s ᱨᱮ ᱪᱮᱫ ᱱᱟᱶᱟ ᱢᱮᱱᱟ-ᱟ + + %s | OSS ᱯᱩᱛᱷᱤ ᱚᱲᱟᱜ + + + ᱨᱤᱰᱭᱨᱮᱠᱼᱴ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ + + ᱠᱩᱩᱠᱤ ᱠᱚ ᱥᱟᱯᱷᱟᱭ ᱟ ᱚᱠᱟ ᱫᱚ ᱵᱟᱰᱟᱭᱠᱟᱱ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚᱨᱮ ᱨᱤᱰᱟᱭᱨᱮᱠᱴ ᱟ ᱾ + + + ᱜᱚᱲᱚ + + ᱨᱟᱹᱯᱩᱫ ᱠᱚ + + ᱱᱤᱥᱚᱱ ᱨᱮᱭᱟᱜ ᱱᱚᱴᱤᱥ + + ᱟᱢᱟᱜ ᱦᱚᱠ ᱠᱚ ᱵᱟᱲᱟᱭ ᱛᱟᱢ + + ᱞᱟᱭᱥᱮᱸᱱᱥ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ + + ᱯᱩᱛᱷᱤ ᱚᱲᱟᱜ ᱡᱟ ᱟᱞᱮ ᱵᱮᱵᱷᱟᱨ ᱟᱞᱮ + + + ᱫᱚᱥ ᱥᱟᱦᱟ ᱢᱮᱱᱭᱩ:%1$d ᱮᱦᱚᱵ ᱞᱟᱹᱜᱤᱫ ᱞᱮᱸᱜᱟ ᱥᱮᱫ ᱚᱛᱟᱭ ᱢᱮ + ᱫᱚᱥ ᱥᱟᱦᱟ ᱢᱮᱱᱭᱩ ᱮᱢᱮᱱᱟ + + + 1 ᱴᱮᱵ + + %d ᱴᱮᱵ ᱠᱚ + + + + ᱱᱚᱠᱚᱞ ᱢᱮ + + + ᱞᱟᱴᱷᱟᱭ ᱢᱮ ᱟᱨ ᱪᱟᱞᱟᱜ ᱢᱮ + + ᱞᱟᱴᱷᱟ + + URL ᱠᱞᱤᱯᱵᱳᱰ ᱨᱮ ᱱᱚᱠᱚᱞᱮᱱᱟ + + + ᱚᱲᱟᱜ ᱤᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱵᱟᱹᱲᱨᱟ + + ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱣᱮᱵᱥᱟᱭᱤᱴ ᱛᱮ ᱞᱟᱦᱟᱜ ᱢᱮ + + ᱠᱷᱟᱴᱚᱢᱟᱪᱷᱟ ᱧᱩᱛᱩᱢ + + + ᱵᱚᱞᱚᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ + + ᱞᱚᱜᱤᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱠᱩᱠᱞᱤ + + ᱥᱟᱸᱪᱟᱣ ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝ + + ᱟᱪᱛᱮ ᱯᱮᱨᱮᱡ + + ᱞᱚᱜᱤᱱ ᱠᱚ ᱥᱤᱸᱠ ᱢᱮ + + ᱪᱚᱞᱩ + + ᱵᱚᱸᱫᱚ + + ᱨᱤᱠᱚᱱᱮᱠᱼᱴ + + ᱛᱷᱟᱨ ᱞᱟᱹᱜᱤᱛ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣᱠᱟᱱ ᱞᱚᱜᱤᱱ ᱠᱚ + + ᱞᱚᱜᱤᱱ ᱚᱠᱟ %s ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱟᱨ ᱥᱭᱸᱠ ᱥᱟᱱᱟᱢ ᱠᱟᱱᱟ ᱚᱱᱟ ᱠᱚ ᱱᱚᱰᱮ ᱫᱮᱠᱷᱟᱣᱼᱜᱟ ᱾ + + ᱥᱭᱸᱠ ᱵᱟᱵᱚᱛ ᱡᱟᱹᱥᱛᱤ ᱵᱟᱰᱟᱭ ᱢᱮ ᱾ + + ᱪᱷᱟᱰᱟ ᱠᱚ + + ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ ᱡᱟ ᱵᱟᱝ ᱥᱟᱸᱪᱟᱣ ᱠᱟᱱᱟ ᱚᱱᱟᱠᱩ ᱱᱚᱰᱮ ᱩᱫᱩᱜᱚᱣᱟ ᱾ + + ᱞᱚᱜᱤᱱᱥ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱫᱚ ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱥᱟᱸᱪᱟᱣᱜᱼᱟ ᱾ + + ᱡᱚᱛᱚ ᱪᱷᱟᱰᱟ ᱠᱚ ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱞᱚᱜᱤᱱ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱟᱠᱷᱚᱨ ᱛᱷᱟᱨ ᱞᱮᱠᱟ ᱛᱮ + + ᱱᱤᱛᱚᱜ ᱵᱮᱵᱷᱟᱨᱟᱜ + + ᱥᱟᱭᱤᱴ + + ᱵᱮᱵᱷᱟᱨᱤᱡᱟᱠ ᱭᱩᱛᱩᱢ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ + + PIN ᱫᱩᱦᱲᱟᱹ ᱟᱫᱮᱨ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣᱠᱟᱱ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱱᱞᱚᱠ ᱢᱮ + + ᱱᱚᱣᱟ ᱡᱩᱲᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠ ᱟ ᱾ ᱞᱚᱜᱤᱱ ᱨᱮ ᱚᱞ ᱮᱢ ᱡᱤᱱᱤᱥ ᱫᱚ ᱠᱚᱢᱯᱨᱚᱢᱟᱭᱤᱡ ᱫᱟᱲᱮᱟᱜᱼᱟ ᱾ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + ᱟᱢ ᱪᱮᱫ %s ᱱᱚᱶᱟ ᱞᱚᱜᱤᱱ ᱥᱟᱸᱪᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? + + ᱥᱟᱸᱪᱟᱣ + + ᱟᱞᱚᱢ ᱥᱟᱸᱪᱟᱣ-ᱟ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱨᱮᱴᱚᱵ-ᱵᱚᱰ ᱨᱮ ᱱᱚᱠᱚᱞᱮᱱᱟ + + ᱵᱮᱵᱷᱟᱨᱭᱤᱡ ᱧᱩᱛᱩᱢ ᱨᱮᱴᱚᱵᱼᱵᱚᱰ ᱨᱮ ᱱᱚᱠᱚᱞᱮᱱᱟ + + ᱥᱟᱭᱤᱴ ᱨᱮᱴᱚᱵᱼᱵᱚᱰ ᱨᱮ ᱱᱚᱠᱚᱞᱮᱱᱟ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱱᱚᱠᱚᱞ ᱢᱮ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱯᱷᱟᱨᱪᱟᱭ ᱢᱮ + + ᱵᱮᱵᱷᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱱᱚᱠᱚᱞ ᱢᱮ + + ᱵᱮᱵᱷᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱯᱷᱟᱨᱪᱟᱭ ᱢᱮ + + ᱥᱟᱭᱤᱴ ᱱᱚᱠᱚᱞ ᱢᱮ + + ᱥᱟᱭᱤᱴ ᱵᱨᱟᱩᱡᱚᱨ ᱨᱮ ᱡᱷᱤᱡ ᱢᱮ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱫᱮᱠᱷᱟᱣ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱩᱠᱩ + + ᱥᱟᱸᱪᱟᱣᱠᱟᱱ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱱᱞᱚᱠ ᱢᱮ + + ᱟᱢᱟᱜ ᱞᱚᱜᱤᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ ᱡᱟᱯᱛᱤ ᱢᱮ + + ᱥᱟᱫᱷᱚᱱ ᱠᱩᱞᱩᱯ ᱪᱤᱱᱦᱟᱹ, ᱯᱤᱱ, ᱟᱨ ᱵᱟᱝ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱞᱟᱜᱟᱣᱢᱮ ᱟᱢᱟᱜ ᱥᱟᱸᱪᱟᱣ ᱞᱚᱜᱤᱱ ᱠᱚ ᱮᱢᱟᱱ ᱨᱩᱠᱷᱭᱟ ᱞᱟᱹᱜᱤᱫ ᱡᱩᱫᱤ ᱚᱞᱜᱟ ᱦᱚᱲ ᱴᱷᱮᱱ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱾ + + ᱛᱟᱭᱚᱢ ᱛᱮ + + ᱱᱤᱛᱚᱜ ᱥᱟᱡᱟᱣ ᱢᱮ + + ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱚᱱᱞᱚᱠ ᱢᱮ + + ᱥᱟᱱᱟᱢ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱨᱮ ᱦᱩᱰᱩᱧ ᱢᱮ + + ᱧᱩᱛᱩᱢ (A-Z) + + + ᱢᱟᱲᱟᱝ ᱵᱮᱵᱷᱟᱨᱟᱜ + + ᱞᱚᱜᱤᱱ ᱢᱮᱱᱭᱩ ᱥᱟᱞᱟᱭ ᱢᱮ + + + ᱥᱮᱸᱫᱽᱨᱟ ᱤᱱᱡᱤᱱ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱥᱮᱸᱫᱽᱨᱟ ᱤᱧᱡᱤᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ + + ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱥᱟᱸᱪᱟᱣ + + ᱥᱟᱯᱲᱟᱣ + + ᱢᱮᱴᱟᱣ ᱢᱮ + + + ᱮᱴᱟᱜ-ᱟᱜ + + ᱭᱩᱛᱩᱢ + + + ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱥᱴᱨᱭᱸᱜ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + “%s” ᱥᱟᱞᱟᱜ ᱠᱣᱮᱨᱭ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ ᱡᱮᱢᱚᱱ:\nhttps://www.google.com/search?q=%s + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + ᱠᱩᱥᱤᱭᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱤᱧᱡᱤᱱ ᱨᱮᱭᱟᱜ ᱵᱤᱵᱨᱚᱬ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱨᱮᱭᱟᱜ ᱞᱤᱸᱠ + + + ᱥᱮᱸᱫᱽᱨᱟ ᱤᱧᱡᱤᱱ ᱨᱮᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱟᱫᱮᱨ ᱢᱮ + + “%s” ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱟᱲᱟᱝ ᱠᱷᱚᱱ ᱥᱮᱸᱫᱽᱨᱟ ᱤᱸᱡᱤᱱ ᱢᱮᱱᱟᱜᱼᱟ ᱾ + + ᱥᱮᱸᱫᱽᱨᱟ ᱥᱴᱨᱭᱸᱜ ᱟᱫᱮᱨ ᱢᱮ + + ᱥᱮᱸᱫᱽᱨᱟ ᱥᱴᱨᱭᱸᱜ ᱢᱮᱪ ᱠᱚ ᱨᱮᱭᱟᱜ ᱡᱮᱢᱚᱱ ᱯᱷᱚᱨᱢᱟᱴ ᱠᱚ ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ ᱢᱮ + + %s ᱨᱮ ᱡᱩᱲᱟᱹᱣ ᱛᱮ ᱵᱷᱩᱞ ᱦᱩᱭᱮᱱᱟ + + %s ᱛᱮᱭᱟᱨᱮᱱᱟ + + %s ᱥᱟᱸᱪᱟᱣᱮᱱᱟ + + %s ᱢᱮᱴᱟᱣᱮᱱᱟ + + + %s ᱡᱷᱚᱛᱚ ᱱᱟᱣᱟ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ + + ᱯᱭᱨᱟ ᱱᱟᱣᱟ ᱨᱤᱰᱤᱭᱟᱭᱤᱸᱰ ᱵᱨᱟᱩᱡᱚᱨ ᱛᱟᱸᱜᱤ ᱟᱠᱟᱫᱟᱭ, ᱵᱮᱥ ᱠᱟᱹᱢᱤ ᱟᱨ ᱯᱷᱤᱪᱚᱨ ᱠᱚ ᱥᱟᱞᱟᱜ ᱛᱮ ᱚᱠᱟ ᱫᱚ ᱟᱨᱦᱚᱸ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱟᱹᱢᱤ ᱠᱚᱨᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚ ᱢᱮᱟᱭ ᱾ \n\nᱫᱚᱭᱟᱠᱟᱛᱮ ᱛᱟᱸᱜᱤ ᱢᱮ ᱟᱢᱟᱜ %s ᱦᱟᱹᱞᱤᱭᱟᱜ ᱦᱟᱹᱵᱤᱡ + + %s ᱦᱟᱹᱞᱤᱭᱟᱼᱜ ᱠᱟᱱᱟ ... + + %s ᱮᱛᱦᱚᱵ ᱢᱮ + + ᱩᱪᱟᱹᱲ ᱪᱟᱵᱟᱭᱮᱱᱟ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ + + + ᱦᱮᱥᱟᱨᱤᱭᱟᱹ ᱮᱢ ᱞᱟᱹᱜᱤᱫ ᱛᱮ: + + ᱑. Android ᱥᱟᱡᱟᱣ ᱠᱚ ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ + + ᱪᱷᱟᱹᱲ ᱠᱚ ᱚᱛᱟᱭ ᱢᱮ]]> + + %1$s ᱪᱚᱞᱩᱤ ᱢᱮ]]> + + + ᱡᱟᱯᱛᱤ ᱡᱚᱱᱚᱲᱟᱣ + + ᱱᱤᱼᱡᱟᱯᱛᱤ ᱡᱚᱱᱚᱲᱟᱣ + + ᱟᱢ ᱪᱮᱫ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟᱛᱮ ᱡᱷᱚᱛᱚ ᱚᱱᱩᱢᱚᱛᱤ ᱡᱷᱚᱛᱚ ᱥᱟᱭᱤᱴ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? + + ᱟᱢ ᱪᱮᱫ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟᱛᱮ ᱡᱷᱚᱛᱚ ᱚᱱᱩᱢᱚᱛᱤ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? + + ᱟᱢ ᱪᱮᱫ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟᱛᱮ ᱱᱚᱶᱟ ᱚᱱᱩᱢᱚᱛᱤ ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? + + ᱥᱟᱭᱤᱴ ᱨᱮᱭᱟᱜ ᱪᱷᱟᱰᱟ ᱠᱚ ᱵᱚᱱᱩᱜ-ᱟ + + ᱵᱮᱥ ᱚᱱᱚᱞ ᱠᱚ + + ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱣᱟ ᱵᱩᱠᱢᱟᱨᱠ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ? + + ᱛᱮᱛᱟᱱ ᱥᱟᱭᱤᱴ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + + ᱯᱚᱨᱢᱟᱱᱤᱡᱺ%1$s + + ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱥᱟᱯᱲᱟᱣ + + ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱣᱟ ᱞᱚᱜᱤᱱ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ? + + ᱢᱮᱴᱟᱣ ᱢᱮ + + ᱮᱴᱟᱜᱟᱜ ᱠᱚ ᱞᱚᱜᱤᱱ + + ᱣᱤᱵ ᱴᱷᱤᱠᱬᱟᱹ ᱞᱚᱜᱤᱱ ᱵᱚᱞᱚ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾ + + ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱚᱜᱤᱱ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱞᱚᱜᱤᱱ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾ + + ᱞᱚᱜᱤᱱ ᱵᱚᱫᱚᱞ ᱠᱚ ᱥᱟᱸᱪᱟᱣ ᱢᱮ ᱾ + + ᱵᱚᱫᱚᱞ ᱩᱰᱩᱜ ᱜᱤᱰᱤ ᱢᱮ + + ᱥᱟᱯᱲᱟᱣ + + ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱨᱮᱭᱟᱜ ᱫᱚᱨᱠᱟᱨ ᱢᱮᱱᱟᱜ-ᱟ + + ᱨᱚᱲ ᱥᱮᱸᱫᱽᱨᱟ + + + ᱱᱤᱛᱚᱜ ᱨᱚᱲ ᱢᱮ + + + ᱢᱤᱫᱴᱟᱹᱝ ᱵᱚᱞᱚ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱢᱟᱲᱟᱝ ᱠᱷᱣᱱ ᱢᱮᱱᱟᱭᱟ ᱾ + + + + ᱮᱴᱟᱜᱟᱼᱜ ᱥᱟᱫᱷᱚᱱ ᱡᱩᱰᱟᱹᱣ ᱢᱮ ᱾ + + ᱫᱚᱭᱟᱠᱟᱛᱮ ᱨᱤᱼᱚᱛᱷᱮᱱᱴᱤᱠᱮᱴ ᱢᱮ ᱾ + + ᱫᱚᱭᱟᱠᱟᱛᱮ ᱴᱮᱵ ᱥᱭᱸᱠᱤᱝ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ ᱾ + + ᱟᱢ ᱴᱷᱮᱱ ᱚᱠᱟ ᱦᱚᱸ ᱴᱮᱵ ᱠᱚ ᱚᱞᱜᱟ Firefox ᱢᱮᱱᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱵᱟᱝ ᱠᱷᱩᱞᱟᱹ ᱟᱠᱟᱱᱟ ᱾ + + ᱟᱢᱟᱜ ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱴᱮᱵ ᱞᱤᱥᱴᱤ ᱫᱮᱠᱷᱟᱣ ᱢᱮ ᱾ + + ᱛᱷᱟᱨ ᱞᱟᱹᱜᱤᱛ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱵᱟᱝᱟ ᱴᱮᱵ ᱠᱚ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ + + + + ᱴᱚᱯ ᱥᱟᱭᱤᱴ ᱞᱤᱢᱤᱴ ᱥᱮᱴᱮᱨᱮᱱᱟ + + ᱱᱟᱶᱟ ᱴᱟᱹᱯ ᱥᱟᱭᱤᱴ ᱥᱮᱞᱮᱫ ᱞᱟᱹᱜᱤᱫ, ᱢᱤᱫᱴᱟᱹᱝ ᱚᱰᱚᱠ ᱢᱮ ᱾ ᱥᱟᱭᱤᱴ ᱴᱤᱯᱟᱹᱣ ᱟᱨ ᱚᱛᱟ ᱛᱷᱤᱨ ᱠᱟᱛᱮ ᱪᱚᱭᱚᱱ ᱢᱮ ᱟᱨ ᱚᱰᱚᱠ ᱢᱮ ᱾ + + ᱴᱷᱤᱠ, ᱵᱟᱰᱟᱭ ᱠᱮᱜᱼᱟᱹᱧ + + ᱡᱟᱹᱥᱛᱤ ᱦᱤᱨᱤ ᱟᱠᱟᱱ ᱥᱟᱭᱤᱴ ᱫᱮᱠᱷᱟᱣᱢᱮ + + + ᱚᱪᱟᱜ + + + %s ᱠᱷᱚᱱ ᱡᱟᱹᱥᱛᱤ ᱡᱤᱱᱤᱥ ᱵᱟᱰᱟᱭ ᱢᱮ ᱾ + + + ᱚᱱᱟ ᱡᱤᱱᱤᱥ ᱠᱚ ᱡᱟᱨᱣᱟᱭ ᱢᱮ ᱡᱟ ᱟᱢ ᱢᱮᱴᱚᱨ ᱢᱤᱭᱟ + + ᱥᱚᱢᱟᱱ ᱥᱮᱸᱫᱽᱨᱟ, ᱥᱟᱭᱤᱴ ᱟᱨ ᱴᱮᱵ ᱠᱚ ᱛᱟᱭᱚᱢ ᱛᱮ ᱞᱚᱜᱚᱱ ᱥᱮᱴᱮᱨ ᱞᱟᱹᱜᱤᱫ ᱫᱳᱞ ᱛᱮᱨᱟᱴ ᱠᱟᱜ ᱢᱮ ᱾ + + ᱟᱢ %s ᱞᱮᱠᱷᱟᱛᱮ ᱚᱞᱜᱟ Firefox ᱵᱨᱟᱩᱡᱟᱹᱨ ᱨᱮ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱮ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟᱢ ᱾ ᱟᱢ ᱪᱮᱫ ᱱᱚᱶᱟ ᱠᱷᱟᱛᱟ ᱨᱮ ᱵᱚᱞᱚ ᱥᱟᱱᱟᱢ ᱠᱟᱱᱟ? + + ᱟᱢ ᱞᱚᱜᱚᱱ ᱵᱨᱟᱩᱡ ᱟᱨ ᱮᱯᱯ ᱞᱮᱠᱷᱟᱱ ᱚᱱᱩᱵᱷᱟᱹᱵ ᱤᱫᱤ ᱞᱟᱹᱜᱤᱫ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱫᱚ ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱚᱲᱟᱜ ᱥᱠᱨᱭᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫ ᱫᱟᱲᱮᱟᱜᱼᱟᱢ ᱾ + diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index f2264b2b5..e65af94ca 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -339,6 +339,17 @@ Абвесткі + + + Уласная калекцыя дадаткаў + + Назва калекцыі + + Уладальнік калекцыі (ID карыстальніка) + + + Калекцыя дадаткаў зменена. Выхад з праграмы, каб прымяніць змены… + Сінхранізаваць @@ -391,6 +402,8 @@ Ахова ад сачэння Ахова ад сачэння + + Блакаваць змест і скрыпты, якія асочваюць вас у інтэрнэце Выключэнні @@ -413,6 +426,8 @@ Дзяліцца звесткамі пра прадукцыйнасць, выкарыстанне, апаратнае забеспячэнне і налады вашага браўзера з Mozilla, каб дапамагчы ўдасканаліць %1$s Маркетынгавыя дадзеныя + + Дзяліцца звесткамі пра магчымасці, якімі вы карыстаецеся ў %1$s, з нашым пастаўшчыком мабільнага маркетынгу Leanplum. Доследы @@ -429,6 +444,8 @@ Уключыць сінхранізацыю + + Скануйце код спалучэння ў Firefox на камп’ютары Увайсці @@ -636,6 +653,10 @@ Выдаліць %1$d элементаў + + Сёння + + Учора Апошнія 24 гадзіны @@ -743,6 +764,8 @@ %1$s выдалена Закладкі выдалены + + Выдаленне абраных папак АДМЯНІЦЬ @@ -793,6 +816,8 @@ Выключана Дазволіць гук і відэа + + Блакаваць аўдыё і відэа толькі на мабільных дадзеных Аўдыё і відэа будуць прайгравацца праз Wi-Fi @@ -1002,9 +1027,15 @@ Выдаляць звесткі аглядання пры выхадзе Аўтаматычна выдаляе дадзеныя аглядання, калі вы выбіраеце "Выйсці" ў галоўным меню + + Аўтаматычна выдаляе дадзеныя аглядання, калі вы выбіраеце \"Выйсці\" ў галоўным меню Выйсці + + Гэта выдаліць усе дадзеныя вашага аглядання. + + %s выдаліць выбраныя дадзеныя аглядання. Адмена @@ -1013,6 +1044,9 @@ Дадзеныя аглядання выдалены + + Выдаленне дадзеныя аглядання… + Firefox Preview цяпер Firefox Nightly @@ -1059,6 +1093,10 @@ Пачніце сінхранізаваць закладкі, паролі і шмат іншага праз свой уліковы запіс Firefox. Падрабязней + + Вы ўвайшлі як %s у іншым браўзеры Firefox на гэтай прыладзе. Ці хочаце аўтарызавацца з дапамогай гэтага ўліковага запісу? Так, увайсці @@ -1159,6 +1197,9 @@ Адмена + + Нельга рэдагаваць прадвызначаныя папкі + Налады аховы @@ -1216,16 +1257,24 @@ Дазволены Трэкеры сацыяльных сетак + + Абмяжоўвае мажлівасць сацыяльных сетак асочваць вашу дзейнасць у сеціве. Міжсайтавыя кукі асочвання Майнеры крыптавалют + + Не дазваляе шкодным скрыптам атрымаць доступ да Вашай прылады для здабычы крыптавалюты. Збіральнікі лічбавых адбіткаў Спыняе збор унікальнай ідэнтыфікацыйнай інфармацыі пра вашу прыладу, якая можа быць выкарыстана для сачэння. Змест з элементамі сачэння + + Спыняе загрузку вонкавай рэкламы, відэа і іншага змесціва, якое змяшчае код асочвання. Можа адбіцца на некаторых функцыях вэб-сайта. + + Фіялетавы колер шчыта азначае, што %s перапыніў асочвальнікаў на сайце. Націсніце, каб даведацца больш. Ахова ўключана на гэтым сайце @@ -1247,6 +1296,12 @@ The first parameter is the app name --> %s | Бібліятэкі OSS + + Трэкеры перанакіравання + + + Ачышчае кукі, усталяваныя шляхам перанакіравання на вядомыя асочвальныя вэб-сайты. + Падтрымка diff --git a/app/src/main/res/values-cak/strings.xml b/app/src/main/res/values-cak/strings.xml index ca83f39fc..eaa93d979 100644 --- a/app/src/main/res/values-cak/strings.xml +++ b/app/src/main/res/values-cak/strings.xml @@ -356,6 +356,14 @@ Taq rutzijol + + ÜTZ + + Tiq\'at + + + Rub\'i\' mol + Tixim wakami @@ -662,6 +670,10 @@ is a digit showing the number of items you have selected --> Keyuj %1$d ch\'akulal + + Wakami + + Iwir Ruk\'isib\'äl 24 ramaj diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 5c471e441..e11d55bed 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -345,6 +345,20 @@ Hysbysiadau + + + Casgliad Ychwanegion Cyfaddas + + Iawn + + Diddymu + + Enw’r casgliad + + Perchennog y casgliad (ID Defnyddiwr) + + Mae’r casgliad Ychwanegion wedi’i addasu. Yn gadael y rhaglen i osod y newidiadau… + Cydweddu nawr @@ -642,6 +656,10 @@ Dileu %1$d eitem + + Heddiw + + Ddoe 24 awr ddiwethaf diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6e06d58e6..36642cfef 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -351,6 +351,20 @@ Benachrichtigungen + + + Benutzerdefinierte Add-on-Sammlung + + OK + + Abbrechen + + Name der Sammlung + + Sammlungsbesitzer (Benutzer-ID) + + Add-on-Sammlung geändert. Anwendung wird beendet, um Änderungen zu übernehmen… + Jetzt synchronisieren @@ -538,6 +552,14 @@ Keine kürzlich geschlossenen Tabs vorhanden + + Tabs + + Tab-Ansicht + + Liste + + Raster Tabs schließen @@ -654,6 +676,10 @@ %1$d Elemente löschen + + Heute + + Gestern Letzte 24 Stunden @@ -797,6 +823,8 @@ Standort Benachrichtigung + + Dauerhafter Speicher Um Erlaubnis fragen diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index 7aa0153e7..88197bc91 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -345,6 +345,20 @@ Powěźeńki + + + Swójska dodankowa zběrka + + W pórěźe + + Pśetergnuś + + Mě zběrki + + Wobsejźaŕ zběrki (wužywaŕski ID) + + Dodankowa zběrka jo se změniła. Nałoženje se kóńcy, aby se změny nałožyli… + Něnto synchronizěrowaś @@ -528,6 +542,14 @@ How njejsu rowno zacynjone rejtarki + + Rejtariki + + Rejtarikowy naglěd + + Lisćina + + Kśidno Rejtariki zacyniś @@ -643,6 +665,10 @@ Zapiski za lašowanje: %1$d + + Źinsa + + Cora Zachadne 24 góźinow @@ -783,6 +809,8 @@ Stojnišćo Powěźeńka + + Trajny składowak Wó dowólnosć se pšašaś diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index b0c01c48d..dfbba88d4 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -343,6 +343,20 @@ Notifications + + + Custom Add-on collection + + OK + + Cancel + + Collection name + + Collection owner (User ID) + + Add-on collection modified. Quitting the application to apply changes… + Sync now @@ -524,6 +538,14 @@ No recently closed tabs here + + Tabs + + Tab view + + List + + Grid Close tabs @@ -639,6 +661,10 @@ Delete %1$d items + + Today + + Yesterday Last 24 hours @@ -776,6 +802,8 @@ Location Notification + + Persistent Storage Ask to allow diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index c294e27ed..8523bf116 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -144,6 +144,8 @@ Install Synchronised tabs + + Resynchronise Find in page @@ -265,6 +267,8 @@ Open links in a private tab Allow screenshots in private browsing + + If allowed, private tabs will also be visible when multiple apps are open Add private browsing shortcut @@ -286,6 +290,8 @@ Home + + Gestures Customise @@ -320,8 +326,12 @@ Search browsing history Search bookmarks + + Search synchronised tabs Account settings + + Autocomplete URLs Open links in apps @@ -333,6 +343,20 @@ Notifications + + + Custom Add-on collection + + OK + + Cancel + + Collection name + + Collection owner (User ID) + + Add-on collection modified. Quitting the application to apply changes… + Synchronise now @@ -458,6 +482,16 @@ Follow device theme + + + Pull to refresh + + Scroll to hide toolbar + + Swipe toolbar sideways to switch tabs + + Swipe toolbar up to open tabs + Sessions @@ -504,6 +538,14 @@ No recently closed tabs here + + Tabs + + Tab view + + List + + Grid Close tabs @@ -620,6 +662,10 @@ Delete %1$d items + + Today + + Yesterday Last 24 hours @@ -757,6 +803,8 @@ Location Notification + + Persistent Storage Ask to allow @@ -1045,7 +1093,7 @@ - You are signed in as %s on another Firefox browser on this phone. Would you like to sign in with this account? + You are signed in as %s on another Firefox browser on this device. Would you like to sign in with this account? Yes, sign me in @@ -1136,6 +1184,8 @@ Sign in with your camera Use email instead + + Create one to synchronise Firefox between devices.]]> Firefox will stop synchronising with your account, but won’t delete any of your browsing data on this device. @@ -1243,6 +1293,11 @@ The first parameter is the app name --> %s | OSS Libraries + + Redirect Trackers + + Clears cookies set by redirects to known tracking web sites. + Support @@ -1288,7 +1343,7 @@ Shortcut name - You can easily add this web site to your phone’s Home screen to have instant access and browse faster with an app-like experience. + You can easily add this web site to your device’s Home screen to have instant access and browse faster with an app-like experience. Logins and passwords @@ -1359,8 +1414,12 @@ Site copied to clipboard Copy password + + Clear password Copy username + + Clear username Copy site @@ -1515,7 +1574,7 @@ A login with that username already exists - + Connect another device. Please re-authenticate. @@ -1535,7 +1594,7 @@ Top site limit reached - To add a new top site, remove one. Long press the site and select remove. + To add a new top site, remove one. Touch and hold the site and select remove. OK, Got It @@ -1545,7 +1604,7 @@ Remove - Get the most out of %s. @@ -1553,4 +1612,9 @@ Collect the things that matter to you Group together similar searches, sites, and tabs for quick access later. + + You are signed in as %s on another Firefox browser on this phone. Would you like to sign in with this account? + + You can easily add this web site to your phone’s Home screen to have instant access and browse faster with an app-like experience. + diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index bafbf9d67..61fa1d942 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -343,6 +343,20 @@ Notificaciones + + + Colección de complementos personalizada + + Aceptar + + Cancelar + + Nombre de la colección + + Dueño de la colección (ID de usuario) + + Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + Sincronizar ahora @@ -642,6 +656,10 @@ is a digit showing the number of items you have selected --> Eliminar %1$d elementos + + Hoy + + Ayer Últimas 24 horas diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 07c28a644..acec5f952 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -351,6 +351,20 @@ Notificaciones + + + Colección de complementos personalizada + + OK + + Cancelar + + Nombre de la colección + + Dueño de la colección (ID de usuario) + + Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + Sincronizar ahora @@ -538,6 +552,14 @@ No hay pestañas cerradas recientemente + + Pestañas + + Vista de pestaña + + Lista + + Cuadrícula Cerrar pestañas @@ -654,6 +676,10 @@ Eliminar %1$d elementos + + Hoy + + Ayer Últimas 24 horas @@ -795,6 +821,8 @@ Ubicación Notificación + + Almacenamiento persistente Pedir permiso diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8debe1c95..898b3ee03 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -27,14 +27,31 @@ %1$s pestañas abiertas. Tocar para cambiar de pestaña. + + %1$d seleccionado + + Añadir nueva colección + + Nombre + + Seleccionar colección + + Salir del modo de selección múltiple + + Guardar pestañas seleccionadas en la colección %1$s seleccionado + + %1$s deseleccionada Has salido del modo de selección múltiple Has ingresado al modo de selección múltiple, selecciona pestañas para guardar en una colección + + Seleccionado + %1$s es producido por @fork-maintainers. @@ -67,6 +84,9 @@ Ahora no + + + Puedes configurar Firefox para que abra automáticamente enlaces en aplicaciones. Ir a ajustes @@ -332,6 +352,20 @@ Notificaciones + + + Colección de complementos personalizada + + OK + + Cancelar + + Nombre de la colección + + Dueño de la colección (ID de usuario) + + Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + Sincronizar ahora @@ -633,6 +667,10 @@ Eliminar %1$d elementos + + Hoy + + Ayer Últimas 24 horas @@ -810,6 +848,8 @@ Menú de la colección + + Recolecta las cosas que te importan.\nAgrupa las búsquedas, los sitios y las pestañas similares para acceder a ellas rápidamente. Seleccionar pestañas @@ -953,6 +993,8 @@ DENEGAR ¿Seguro que quieres eliminar %1$s? + + Eliminar esta pestaña eliminará toda la colección. Puedes crear nuevas colecciones en cualquier momento. ¿Eliminar %1$s? @@ -1074,6 +1116,10 @@ Obtén respuestas aquí Aprender más + + Te has conectado como %s en otro navegador Firefox en este dispositivo. ¿Quieres conectarte con esta cuenta? Sí, iniciar sesión @@ -1166,6 +1212,8 @@ Inicia sesión con tu cámara Usar el correo + + Crea una para sincronizar Firefox entre dispositivos.]]> Firefox dejará de sincronizar tu cuenta, pero no se eliminarán los datos de navegación en este dispositivo. @@ -1273,6 +1321,9 @@ The first parameter is the app name --> %s | Bibliotecas OSS + + Rastreadores de redirección + Ayuda diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1e0f6c3ab..c459555bf 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -350,6 +350,20 @@ Ilmoitukset + + + Mukautettu lisäosakokoelma + + OK + + Peruuta + + Kokoelman nimi + + Kokoelman omistaja (käyttäjätunniste) + + Lisäosakokoelmaa muokattu. Lopetetaan sovellus, jotta muutokset tulevat voimaan… + Synkronoi nyt @@ -535,6 +549,14 @@ Ei viimeksi suljettuja välilehtiä + + Välilehdet + + Välilehtinäkymä + + Lista + + Ruudukko Sulje välilehdet @@ -653,6 +675,10 @@ is a digit showing the number of items you have selected --> Poista %1$d tietuetta + + Tänään + + Eilen Viimeiset 24 tuntia @@ -791,6 +817,8 @@ Sijainti Ilmoitus + + Pysyvä tallennustila Kysy lupaa diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index accb6da0d..0882ab713 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -347,6 +347,20 @@ Notifikaasjes + + + Oanpaste add-onkolleksje + + OK + + Annulearje + + Namme kolleksje + + Eigener kolleksje (brûkers-ID) + + Add-onkolleksje oanpast. Tapassing wurdt ôfsluten om wizigingen ta te passen… + No syngronisearje @@ -643,6 +657,10 @@ %1$d items fuortsmite + + Hjoed + + Juster Lêste 24 oer diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index a5a52a46e..e5920f240 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -348,6 +348,21 @@ Ñemomarandu + + + Moĩmbaha aty momba’epyre + + MONEĨ + + Heja + + Ñembyatyha réra + + Ñembyatyha jára (puruhára ID) + + + Moĩmbaha aty moambuepyre. Embotyhína tembipuru’i emoambuekuaa hag̃ua… + Embojuehe ko’ág̃a @@ -651,6 +666,10 @@ Emboguete %1$d mba’epuru + + Ko’árape + + Kuehe 24 aravo ohasamóva diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 60ff5dd19..5db21d023 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -78,6 +78,12 @@ अभी नहीं + + सेटिंग पर जाएं + + + सेटिंग पर जाएं + नया टैब @@ -309,6 +315,9 @@ ऐड-ऑन + + अधिसूचनाएं + अब सिंक करें @@ -470,6 +479,27 @@ बंद करें + + हाल ही में बंद किए गए टैब + + पूरा इतिहास दिखाएं + + %d टैब + + %d टैब + + + + टैब बंद करें + + एक दिन बाद + + एक हफ्ते के बाद + + एक महीने बाद + खुले टैब @@ -489,6 +519,10 @@ संग्रहण में सहेजें सभी टैब साझा करें + + हाल ही में बंद किए गए टैब + + टैब सेटिंग सभी टैब बंद करें @@ -535,6 +569,8 @@ हटाएं + + इतिहास से मिटाएं %1$s (निजी मोड) @@ -736,10 +772,6 @@ संग्रह संग्रह मेन्यू - - जो चीजें आपके लिए मायने रखती हैं, उन्हें इकट्ठा करें - - बाद में तुरंत ऐक्सेस लिए एक जैसा खोज, साइट और टैब को एक साथ समूहित करें। टैब चुने @@ -992,13 +1024,8 @@ %s पुनर्निर्देशित के बारे में प्रश्न हैं? जानना चाहते हैं कि क्या बदला है? यहां उत्तर पाएं - - %s का अधिकतम लाभ उठाएं। - - आप इस फ़ोन पर किसी अन्य Firefox ब्राउज़र पर %s के रूप में साइन इन हैं। क्या आप इस खाते से साइन इन करना चाहेंगे? + + अधिक जानें हां, मुझे साइन इन करें @@ -1249,9 +1276,6 @@ शॉर्टकट नाम - - आप आसानी से इस वेबसाइट को अपने फ़ोन मुख्य स्क्रीन पर तुरंत ऐक्सेस के लिए जोड़ सकते हैं और ऐप जैसे अनुभव के साथ तेज़ी से ब्राउज़ कर सकते हैं। - लॉगिन और पासवर्ड @@ -1489,7 +1513,7 @@ एक लॉगिन इस उपयोगकर्ता नाम के साथ मौजूद है - + अन्य डिवाइस कनेक्ट करें कृपया पुनः प्रमाणित करें। @@ -1502,12 +1526,26 @@ सिंक करने के लिए साइन इन करें + + कोई खुला टैब नहीं + शीर्ष साइट सीमा पहुंच गई - - एक नई शीर्ष साइट जोड़ने के लिए, एक हटा दें। साइट को लंबे समय तक दबाएं और निकालें का चयन करें। ठीक है, समझ गए + + %s का अधिकतम लाभ उठाएं। + + + जो चीजें आपके लिए मायने रखती हैं, उन्हें इकट्ठा करें + + बाद में तुरंत ऐक्सेस लिए एक जैसा खोज, साइट और टैब को एक साथ समूहित करें। + + आप इस फ़ोन पर किसी अन्य Firefox ब्राउज़र पर %s के रूप में साइन इन हैं। क्या आप इस खाते से साइन इन करना चाहेंगे? + + आप आसानी से इस वेबसाइट को अपने फ़ोन मुख्य स्क्रीन पर तुरंत ऐक्सेस के लिए जोड़ सकते हैं और ऐप जैसे अनुभव के साथ तेज़ी से ब्राउज़ कर सकते हैं। + diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 5e74c0523..1a4cca9da 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -344,6 +344,20 @@ Obavijesti + + + Prilagođena kolekcija dodataka + + U redu + + Odustani + + Ime kolekcije + + Vlasnik kolekcije (ID korisnika) + + Izmijenjena je kolekcija dodataka. Napuštanje aplikacije za primjenu izmjena… + Sinkroniziraj sada @@ -530,6 +544,14 @@ Ovdje nema nedavno zatvorenih kartica + + Kartice + + Prikaz kartica + + Popis + + Mreža Zatvori kartice @@ -647,6 +669,10 @@ Izbriši %1$d stavke + + Danas + + Jučer Zadnjih 24 sata @@ -788,6 +814,8 @@ Lokacija Obavijest + + Trajna pohrana Zatraži dozvolu diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index c1867b61b..48d2310e6 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -345,6 +345,20 @@ Zdźělenki + + + Swójska přidatkowa zběrka + + W porjadku + + Přetorhnyć + + Mjeno zběrki + + Wobsedźer zběrki (wužiwarski ID) + + Přidatkowa zběrka je so změniła. Nałoženje so kónči, zo bychu so změny nałožili… + Nětko synchronizować @@ -530,6 +544,14 @@ Tu žane runje začinjene rajtarki njejsu + + Rajtarki + + Rajtarkowy napohlad + + Lisćina + + Lěsyca Rajtarki začinić @@ -646,6 +668,10 @@ Zapiski za zhašenje: %1$d + + Dźensa + + Wčera Zańdźene 24 hodźin @@ -784,6 +810,8 @@ Stejnišćo Zdźělenka + + Trajny składowak Wo dowolnosć so prašeć diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index aa8193f44..d92470f97 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -347,6 +347,20 @@ Értesítések + + + Egyéni kiegészítőgyűjtemény + + OK + + Mégse + + Gyűjtemény neve + + Gyűjtemény tulajdonosa (felhasználói azonosító) + + A kiegészítőgyűjtemény módosítva. Kilépés az alkalmazásból a változások érvényesítéséhez… + Szinkronizálás most @@ -532,6 +546,14 @@ Nincs itt nemrég bezárt lap + + Lapok + + Lapnézet + + Lista + + Rács Lapok bezárása @@ -648,6 +670,10 @@ %1$d elem törlése + + Ma + + Tegnap Elmúlt 24 óra @@ -786,6 +812,8 @@ Hely Értesítés + + Állandó tároló Kérdezzen rá diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index 0dbdac5ab..964d9fb32 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -146,6 +146,8 @@ Համաժամեցված ներդիրներ + + Կրկնահամաժամեցում Գտնել էջում @@ -327,6 +329,8 @@ Որոնել դիտարկումների պատմությունում Որոնել էջանիշեր + + Որոնել համաժամեցված ներդիրները Հաշվի կարգավորումներ @@ -1159,6 +1163,8 @@ Մուտք գործեք ձեր տեսախցիկի հետ Փոխարենը օգտ. էլ. փոստ + + Ստեղծեք նորը՝ Firefox-ը տարբեր սարքերի միջև համաժամեցնելու համար:]]> Firefox-ը կկանգնեցնի համաժամացումը ձեր հաշվի հետ, բայց չի ջնջվի այս սարքում ձեր դիտարկման որևէ տվյալ։ @@ -1268,6 +1274,11 @@ The first parameter is the app name --> %s | OSS գրադարաններ + + Վերաուղղորդել հետագծիչները + + Վերաուղղորդմամբ կայված՝ մաքրում է թխուկները հայտնի հետագծիչ կայքերից: + Աջակցում diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 1f039649a..f07e6ea13 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -277,6 +277,8 @@ שרת Firefox Account מותאם אישית שרת Sync מותאם אישית + + שרת Firefox Account/Sync השתנה. היישום ייסגר לצורך להחלת השינויים… חשבון @@ -341,6 +343,21 @@ התרעות + + + אוסף תוספות מותאם אישית + + אישור + + ביטול + + שם האוסף + + הבעלים של האוסף (מזהה משתמש) + + + אוסף התוספות השתנה. היישום ייסגר לצורך להחלת השינויים… + סנכרון כעת @@ -522,6 +539,14 @@ אין כאן לשוניות שנסגרו לאחרונה + + לשוניות + + תצוגת לשוניות + + רשימה + + רשת סגירת לשוניות @@ -635,6 +660,10 @@ מחיקת %1$d פריטים + + היום + + אתמול 24 השעות האחרונות diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6fc93f90f..0e5492d54 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1181,6 +1181,8 @@ カメラを使ってログイン 代わりにメールアドレスを使う + + アカウントを作成して Firefox を端末間で同期しましょう。]]> Firefox はアカウントとの同期を停止しますが、この端末上の閲覧データは削除されません。 @@ -1288,6 +1290,11 @@ The first parameter is the app name --> %s | OSS ライブラリー + + リダイレクトトラッカー + + 既知のトラッキングウェブサイトへのリダイレクトにより設定された Cookie を消去します。 + サポート diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index ce31fcdc9..14eee0850 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -339,6 +339,20 @@ Хабарламалар + + + Таңдауыңызша қосымшалар жинағы + + ОК + + Бас тарту + + Жинақ атауы + + Жинақ иесі (Пайдаланушы идентификаторы) + + Қосымшалар жинағы өзгертілген. Өзгерістерді іске асыру үшін қолданба жұмысын аяқтау… + Қазір синхрондау @@ -635,6 +649,10 @@ %1$d элементті өшіру + + Бүгін + + Кеше Соңғы 24 сағат diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 42114c5f5..8ed8615ef 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -356,6 +356,20 @@ 알림 + + + 사용자 지정 부가 기능 모음집 + + 확인 + + 취소 + + 모음집 이름 + + 모음집 소유자 (사용자 ID) + + 부가 기능 모음집이 변경되었습니다. 변경 사항을 적용하기 위해 응용 프로그램을 종료하는 중… + 지금 동기화 @@ -543,6 +557,14 @@ 최근에 닫은 탭 없음 + + + + 탭 보기 + + 목록 + + 그리드 탭 닫기 @@ -660,6 +682,10 @@ %1$d개 항목 삭제 + + 오늘 + + 어제 지난 24 시간 @@ -805,6 +831,8 @@ 위치 알림 + + 영구 저장소 항상 확인 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 1561b0a51..e1a945d8e 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -347,6 +347,21 @@ Varslinger + + + Tilpasset tilleggssamling + + OK + + Avbryt + + Samlingsnavn + + Samlingseier (bruker-ID) + + + Tilleggssamling endret. Avslutter applikasjonen for å bruke endringer… + Synkroniser nå @@ -534,6 +549,14 @@ Ingen nylige lukkede faner her + + Faner + + Fanevisning + + Liste + + Rutenett Lukk faner @@ -649,6 +672,10 @@ Slett %1$d elementer + + I dag + + I går Siste 24 timer @@ -790,6 +817,8 @@ Plassering Varsel + + Vedvarende lagring Be om å tillate diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ae522a192..f4daee3ff 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -352,6 +352,20 @@ Notificaties + + + Aangepaste add-oncollectie + + OK + + Annuleren + + Naam collectie + + Eigenaar collectie (gebruikers-ID) + + Add-oncollectie aangepast. Toepassing wordt afgesloten om wijzigingen toe te passen… + Nu synchroniseren @@ -536,6 +550,14 @@ Geen onlangs gesloten tabbladen hier + + Tabbladen + + Tabbladweergave + + Lijst + + Raster Tabbladen sluiten @@ -652,6 +674,10 @@ %1$d items verwijderen + + Vandaag + + Gisteren Laatste 24 uur @@ -789,6 +815,8 @@ Locatie Notificatie + + Vaste opslag Vragen om toestemming diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 1d8889c41..e54307cd0 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -348,6 +348,20 @@ Varsel + + + Tilpassa tilleggssamling + + OK + + Avbryt + + Samlingsnamn + + Samlingseigar (brukar-ID) + + Tilleggssamling endra. Avsluttar applikasjonen for å bruke endringar… + Synkroniser no @@ -650,6 +664,10 @@ Slett %1$d element + + I dag + + I går Siste 24 timar diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 9d084d56f..fb7596b20 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -267,6 +267,8 @@ Dobrir los ligams en navigacion privada Permetre las capturas d’ecran en navegacion privada + + Se permés, los onglets privats seràn tanben visibles quand mantunas aplicacions son dubèrtas Ajustar un acorchi per la navegacion privada diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 011f6c979..9deed376e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -348,6 +348,21 @@ Powiadomienia + + + Inna kolekcja dodatków + + OK + + Anuluj + + Nazwa kolekcji + + + Właściciel kolekcji (identyfikator użytkownika) + + Zmieniono kolekcję dodatków. Wyłączanie aplikacji, aby zastosować zmiany… + Synchronizuj @@ -532,6 +547,14 @@ Nie ma ostatnio zamkniętych kart + + Karty + + Wygląd kart + + Lista + + Siatka Zamykanie kart @@ -649,6 +672,10 @@ Usuń pozycje (%1$d) + + Dzisiaj + + Wczoraj Ostatnie 24 godziny @@ -786,6 +813,8 @@ Położenie Powiadomienia + + Przechowywanie danych na urządzeniu Pytanie o zezwolenie diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cf01e0e90..785c8913a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -345,6 +345,20 @@ Notificações + + + Coleção personalizada de extensões + + OK + + Cancelar + + Nome da coleção + + Proprietário da coleção (ID de usuário) + + Coleção de extensões modificada. Saindo do aplicativo para aplicar as alterações… + Sincronizar agora @@ -528,6 +542,14 @@ Nenhuma aba fechada recentemente aqui + + Abas + + Visão de abas + + Lista + + Grade Fechar abas @@ -643,6 +665,10 @@ Excluir %1$d itens + + Hoje + + Ontem Últimas 24 horas @@ -781,6 +807,8 @@ Notificações + + Armazenamento persistente Perguntar se deve permitir diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index aecebd5f2..b83374458 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -345,6 +345,20 @@ Notificações + + + Coleção personalizada de extras + + OK + + Cancelar + + Nome da coleção + + Proprietário da coleção (ID de utilizador) + + Coleção de extras modificada. A sair da aplicação para aplicar alterações… + Sincronizar agora @@ -646,6 +660,10 @@ Eliminar %1$d itens + + Hoje + + Ontem Últimas 24 horas diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ccd990fe1..19dc2e36f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -366,6 +366,20 @@ Уведомления + + + Собственная коллекция дополнений + + OK + + Отмена + + Имя коллекции + + Владелец коллекции (ID пользователя) + + Коллекция дополнений была изменена. Закрываем приложение, чтобы применить изменения… + Синхронизировать @@ -667,6 +681,10 @@ Удалить %1$d элемент(а) + + Сегодня + + Вчера Последние 24 часа diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 79619f63c..e7ca0ad79 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -328,6 +328,8 @@ Navrhovať z histórie prehliadania Navrhovať zo záložiek + + Hľadať v synchronizovaných kartách Nastavenia účtu @@ -344,6 +346,13 @@ Upozornenia + + OK + + Zrušiť + + Názov kolekcie + Synchronizovať @@ -517,7 +526,6 @@ Nemáte žiadne nedávno zatvorené karty - Zavrieť karty diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 78f407da7..6fa63a693 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -329,6 +329,8 @@ Išči po zgodovini iskanja Iskanje po zaznamkih + + Iskanje po sinhroniziranih zavihkih Nastavitve računa @@ -344,6 +346,13 @@ Obvestila + + V redu + + Prekliči + + Ime zbirke + Sinhroniziraj zdaj @@ -479,6 +488,9 @@ Povlecite za osvežitev + + Podrsaj orodno vrstico vstran za preklop med zavihki + Seje @@ -1163,6 +1175,8 @@ Prijavite se s kamero Namesto tega uporabite e-pošto + + Ustvarite ga za sinhronizacijo Firefoxa med napravami.]]> Firefox se bo prenehal sinhronizirati z vašim računom, vendar ne bo izbrisal podatkov o brskanju na tej napravi. @@ -1272,6 +1286,11 @@ The first parameter is the app name --> %s | Knjižnice OSS + + Preusmeritve sledilcev + + Počisti piškotke, ki jih nastavijo preusmeritve na znana sledilna spletna mesta. + Podpora diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 423a7a4f1..f5f2d2275 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -266,6 +266,8 @@ Buka tutumbu di tab nyamuni Ngidinan layar dina langlangan nyamuni + + Lamun diidinan, tab pribadi bakal katémbong nalika sababaraha aplikasi muka Tambahan tarabas nyungsi nyamuni @@ -325,6 +327,8 @@ Setélan akun + + Otokumplit URLs Buka tutumbu dina aplikasi @@ -463,6 +467,10 @@ Turutan téma paranti + + + Betot pikeun nyegerkeun + Sesi @@ -1056,10 +1064,6 @@ Mimitian nyingkronkeun markah, kecap konci, jeung nu lianna maké akun Firefox anjeun. Lenyepan - - Anjeun asup salaku %s dina séjén panyungsi Firefox di ieu telepon. Anjeun rék asup maké ieu akun? Enya, asupkeun @@ -1261,6 +1265,9 @@ The first parameter is the app name --> %s | Pabukon OSS + + Meresihan réréméh anu diatur ku alihan ka raramatloka palacak anu dipikawanoh. + Pangrojong @@ -1306,8 +1313,6 @@ Ngaran takulan - - Anjeun bisa kalawan gampang nambahkeun ieu raramatloka kana layar Tepas ponsél pikeun aksés instan sarta maluruh leuwih gancang kawas muka aplikasi. Login jeung kecap sandi @@ -1378,8 +1383,12 @@ Loka ditiron kana papan klip Niron sandi + + Beresihan sandi Niron sandiasma + + Beresihan sandiasma Niron loka @@ -1537,7 +1546,7 @@ Login maké éta sandiasma geus aya - + Sambungkeun séjén paranti. Mangga oténtikasi ulang. @@ -1556,8 +1565,6 @@ Wates loka top geus kahontal - - Pikeun nambah loka top anyar, piceun hiji. Pencét lila lokana sarta pilih piceun. Okéh, Ngarti @@ -1567,7 +1574,7 @@ Piceun - Maksimalkeun %s. @@ -1575,4 +1582,9 @@ Kumpulkeun hal anu penting pikeun anjeun Ngagabungkeun pamaluruhan, loka sareng tab anu sami pikeun aksés gancang engké. + + Anjeun asup salaku %s dina séjén panyungsi Firefox di ieu telepon. Anjeun rék asup maké ieu akun? + + Anjeun bisa kalawan gampang nambahkeun ieu raramatloka kana layar Tepas ponsél pikeun aksés instan sarta maluruh leuwih gancang kawas muka aplikasi. + diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 3be1e8db4..930441c13 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -350,6 +350,21 @@ Aviseringar + + + Anpassad tilläggssamling + + OK + + Avbryt + + Samlingsnamn + + Samlingsägare (användar-ID) + + + Tilläggssamling ändrad. Avslutar applikationen för att tillämpa ändringar… + Synkronisera nu @@ -537,6 +552,14 @@ Inga nyligen stängda flikar här + + Flikar + + Flikvy + + Lista + + Rutnät Stäng flikar @@ -653,6 +676,10 @@ Ta bort %1$d poster + + Idag + + Igår Senaste 24 timmarna @@ -791,6 +818,8 @@ Plats Meddelanden + + Beständig lagring Fråga för att tillåta diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 77fa83df4..f89ca5904 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -53,6 +53,13 @@ Шумо дар реҷаи махфӣ қарор доред + + + %1$s таърихи тамошокунӣ ва ҷустуҷӯи шуморо аз варақаҳои махфие, ки шумо мепӯшед ё вақте ки шумо барномаро хомӯш мекунед, пок мекунад. Ин амал шуморо аз сомонаҳо ё провайдери хизматрасонии интернет пинҳон намекунад, аммо аз корбарони дигаре, ки ин дастгоҳро истифода мебаранд, фаъолияти онлайни шуморо ба осонӣ махфӣ карда, нигоҳ медорад. + + Асотири маълум дар бораи тамошокунии махфӣ + Нест кардани ҷаласа @@ -64,22 +71,32 @@ Не, ташаккур + + + Firefox-ро зудтар кушоед. Ба экрани асосии худ виҷетеро илова намоед. Илова кардани виҷет Ҳоло не + + + Шумо метавонед Firefox-ро танзим кунед, ки он дар барномаҳо пайвандҳоро ба таври худкор кушояд. Гузариш ба танзимот Нодида гузарондан + + Дастрасии камера лозим аст. Ба «Танзимоти Android» гузаред, ба «Иҷозатҳо» зарба занед, пас ба «Иҷозат додан» зарба занед. Гузариш ба танзимот Нодида гузарондан + + Танзим кунед, ки варақаҳои кушодашудае, ки дар як рӯз, ҳафта ё моҳи охир дида нашудаанд, ба таври худкор пӯшида шаванд. Имконоти намоиш @@ -190,6 +207,10 @@ Иҷозат додан Иҷозат дода нашавад + + Ба пешниҳодҳои ҷустуҷӯ дар ҷаласаҳои махфӣ иҷозат диҳед? + + %s ба низоми ҷустуҷӯии пешфарз ҳамаи он чизеро, ки шумо ба навори нишонӣ ворид мекунед, мефиристонад. Маълумоти бештар @@ -246,6 +267,10 @@ Баррасии махфӣ Кушодани пайвандҳо дар варақаи махфӣ + + Иҷозат додани аксҳои экран ҳангоми тамошокунии махфӣ + + Агар иҷозат дода шавад, варақаҳои махфӣ низ ҳангоми кушода будани якчанд барнома намоён мешаванд Илова кардани миёнбури тамошои махфӣ @@ -254,6 +279,8 @@ Сервери ҳисоби фармоишии Firefox Сервери ҳамоҳангсозии фармоишӣ + + Сервери ҳисоб/ҳамоҳангсозии Firefox тағйир ёфт. Барои татбиқ кардани тағйирот барнома бояд хомӯш карда шавад… Ҳисоб @@ -268,6 +295,8 @@ Ишораҳо Фармоишдиҳӣ + + Ба воситаи ҳисоби Firefox-и худ хатбаракҳо, таърих ва чизҳои дигарро ҳамоҳанг кунед. Ҳисоби Firefox @@ -313,6 +342,20 @@ Огоҳиномаҳо + + + Маҷмӯаи ҷузъҳои иловагии фармоишӣ + + ХУБ + + Бекор кардан + + Номи маҷмӯа + + Соҳиби маҷмӯа (ID-и корбар) + + Маҷмӯаи ҷузъҳои иловагӣ тағйир ёфт. Барои татбиқ кардани тағйирот барнома бояд хомӯш карда шавад… + Ҳозир ҳамоҳанг кунед @@ -336,6 +379,14 @@ Ҳамоҳангсозӣ… + + Ҳамоҳангсозӣ иҷро нашуд. Иҷрои охирин: %s + + Ҳамоҳангсозӣ иҷро нашуд. Ҳамоҳангсозии охирин: ҳеҷ гоҳ + + Ҳамоҳангсозии охирин: %s + + Ҳамоҳангсозии охирин: ҳеҷ гоҳ @@ -378,10 +429,18 @@ Телеметрия Истифодабарӣ ва маълумоти техникӣ + + Барои беҳтар кардани %1$s маълумоти самаранокӣ, истифодабарӣ, сахтафзор ва танзимоти фармоишӣ дар бораи браузери шумо бо Mozilla мубодила карда шавад Маълумоти маркетингӣ + + Маълумот дар бораи хусусиятҳое, ки шумо дар %1$s истифода мебаред бо Leanplum, яъне фурӯшандаи маркетинги мобилии мо, мубодила карда шавад Таҷрибаҳо + + Ба Mozilla имкон медиҳад, ки барои хусусиятҳои таҷрибавӣ маълумотро насб ва ҷамъ кунад + + Гузориш дар бораи садама Хадамоти ҷойгиршавии Mozilla @@ -390,6 +449,8 @@ Фаъол кардани ҳамоҳангсозӣ + + Рамзи ҷуфтро дар версияи Firefox-и мизи корӣ скан кунед Ворид шудан @@ -397,6 +458,9 @@ Барҳам додани ҳисоб + + + firefox.com/pair нишон дода шудааст, скан кунед]]> Кушодани камера @@ -424,6 +488,11 @@ Барои пинҳон кардани навори абзорҳо ҳаракат кунед + + Барои иваз кардани варақаҳо аз болои навори абзорҳо ба тарафи лозимӣ бо ангуш молед + + Барои кушодани варақаҳо аз болои навори абзорҳо ба боло бо ангуш молед + Ҷаласаҳо @@ -456,6 +525,8 @@ Пӯшидан + + Варақаҳои ба наздикӣ пӯшидашуда Намоиш додани таърихи пурра %d варақа + + Ягон варақаи ба наздикӣ пӯшидашуда нест + + + Варақаҳо + + Намоиши варақаҳо + + Рӯйхат + + Тӯр Пӯшидани варақаҳо @@ -497,6 +579,8 @@ Нигоҳ доштан дар маҷмӯа Мубодила кардани ҳамаи варақаҳо + + Варақаҳои ба наздикӣ пӯшидашуда Танзимоти варақа @@ -505,6 +589,10 @@ Варақаи нав Гузариш ба саҳифаи асосӣ + + Гузариш ба реҷаи варақзанӣ + + Тоза кардани варақаҳо аз маҷмӯа Пӯшидани варақа @@ -573,6 +661,10 @@ Нест кардани %1$d ҷузъ + + Имрӯз + + Дирӯз 24 соати охир @@ -678,11 +770,21 @@ Хатбаракҳо нест карда шуданд + + Несткунии ҷузвадонҳои интихобшуда + + + БОТИЛ КАРДАН + Иҷозатҳо Гузариш ба Танзимот + + Лавҳаи танзимоти зуд Тавсияшуда @@ -704,6 +806,8 @@ Огоҳинома + + Захирагоҳи доимӣ Дархости иҷозат @@ -721,6 +825,14 @@ Иҷозат додани аудио ва видео + + Бастани аудио ва видео танҳо дар шабакаи маълумоти мобилӣ + + Аудио ва видео дар шабакаи Wi-Fi пахш мешаванд + + Бастани танҳои аудио + + Бастани аудио ва видео Фаъол @@ -731,6 +843,8 @@ Маҷмӯаҳо Менюи маҷмӯаҳо + + Чизҳоеро, ки ба шумо муҳиманд, ҷамъ кунед\nҶустуҷӯҳо, сомонаҳо ва варақаҳои монандро барои дастрасии фаврӣ дар оянда якҷоя кунед. Варақаҳоро интихоб намоед @@ -741,6 +855,8 @@ Илова кардани маҷмӯаи нав Ҳамаро интихоб кардан + + Бекор кардани интихоб Варақаҳоро барои нигоҳ доштан интихоб намоед Ҳамаи амалҳо + + Истифодашудаи охирин Барои ҳамоҳангсозӣ ворид шавед @@ -789,14 +907,23 @@ Офлайн Пайваст кардани дастгоҳи дигар + + Барои фиристодани варақа, ақаллан дар дастгоҳи дигар ба Firefox ворид шавед. Фаҳмо + + Ба ин барнома мубодила карда намешавад Фиристодан ба дастгоҳ Ягон дастгоҳ пайваст нашуд + + Маълумоти бештар дар бораи фиристодани варақаҳо… + + Пайваст кардани дастгоҳи дигар… + Ҷаласаи баррасии махфӣ @@ -830,8 +957,12 @@ Варақаҳои махфӣ пӯшида шуданд Варақаҳои махфӣ нест карда шуданд + + БОТИЛ КАРДАН Сомона хориҷ карда шуд + + Ботил кардан Тасдиқ кардан Шумо мутмаин ҳастед, ки мехоҳед %1$s-ро нест намоед? + + Агар шумо ин варақаро нест кунед, тамоми маҷмӯа нест карда мешавад. Шумо метавонед маҷмӯаҳои навро дар вақти дилхоҳ эҷод намоед. %1$s-ро нест мекунед? @@ -853,18 +986,30 @@ Ба реҷаи экрани пурра ворид шуда истодааст URL нусха бардошта шуд + + Ин матни намунавӣ мебошад. Дар ин ҷо матни намунавӣ нишон медиҳад, ки чӣ тавр он ҳангоми калон ва хурд кардани андозаи ҳуруф бо танзими ҷорӣ нишон дода мешавад. + + Калонтар ё хурдтар кардани матн дар сомонаҳо Андозаи ҳуруф Андозагирии худкори ҳуруф + + Андозаи ҳарф ба танзимоти Android-и шумо мувофиқат мекунад. Барои идора кардани андозаи ҳарфҳо дар ин ҷо, имкони ҷориро хомӯш кунед. + - Нест кардани маълумоти баррасӣ + Нест кардани маълумоти тамошокунӣ Варақаҳои кушодашуда %d варақа + + Таърихи тамошокунӣ ва маълумоти сомонаҳо + + %d нишонӣ Таърих Кукиҳо + + Шумо аз аксари сомонаҳо мебароед + + Тасвирҳо ва файлҳои нигоҳдошташуда + + Фазои захирагоҳро озод намоед + + Иҷозатҳои сомона + + Нест кардани маълумоти тамошокунӣ - Нест кардани маълумоти баррасӣ ҳангоми баромад + Нест кардани маълумоти тамошокунӣ ҳангоми баромад + + Вақте ки шумо аз менюи асосӣ имкони "Хомӯш кардан"-ро интихоб мекунед, маълумоти тамошокунӣ ба таври худкор нест карда мешавад + + Вақте ки шумо аз менюи асосӣ имкони \"Хомӯш кардан\"-ро интихоб мекунед, маълумоти тамошокунӣ ба таври худкор нест карда мешавад Баромадан + + Ин амал маълумоти тамошокуниро нест мекунад. + + %s маълумоти тамошокунии интихобшударо нест мекунад. Бекор кардан Нест кардан + + Маълумоти тамошокунӣ нест карда шуд + + Несткунии маълумоти тамошокунӣ… + + + + Нашри Firefox-и «Пешнамоиш» акнун Firefox-и «Ҳаршабона» шуд + + + + Firefox-и «Ҳаршабона» ҳар шаб навсозӣ мешавад ва хусусиятҳои нави таҷрибавиро дар бар мегирад. + Аммо, он метавонад ноустувор бошад. Барои ба даст овардани таҷрибаи устувор, браузери «бета»-ро боргирӣ намоед. + + «Firefox»-ро барои «Android Beta» ба даст оред + + + Нашри Firefox-и «Ҳаршабона» интиқол дода шуд + + + Ин барнома дигар навсозиҳои амниятиро қабул намекунад. Истифодаи ин барномаро қатъ кунед ва ба нашри нави «Ҳаршабона» гузаред. + \n\nБарои интиқол додани хатбаракҳо, воридшавиҳо ва таърихи худ ба барномаи дигар, ҳисоби Firefox-ро эҷод намоед. + + Ба нашри нави «Ҳаршабона» гузаред + + + Нашри Firefox-и «Ҳаршабона» интиқол дода шуд + + + Ин барнома дигар навсозиҳои амниятиро қабул намекунад. Нашри нави «Ҳаршабона»-ро ба даст оред ва истифодаи ин барномаро қатъ кунед. + \n\nБарои интиқол додани хатбаракҳо, воридшавиҳо ва таърихи худ ба барномаи дигар, ҳисоби Firefox-ро эҷод намоед. + + Нашри «Ҳаршабона»-и навро ба даст оред + Хуш омадед ба %s! + + Аллакай ҳисобе доред? Бо %s шинос шавед Бинед, ки чӣ нав аст + + Оид ба тарҳи нави %s савол доред? Мехоҳед донед, ки чӣ тағйир ёфтааст? + + Ҷавобҳоро дар ин ҷо гиред + + Ба воситаи ҳисоби Firefox-и худ ҳамоҳангсозии хатбаракҳо, ниҳонвожаҳо ва чизҳои дигарро оғоз кунед. Маълумоти бештар + + Шумо ҳамчун %s тавассути браузери дигари Firefox дар ин дастгоҳ ворид шудаед. Шумо мехоҳед, ки бо ин ҳисоб ворид шавед? Ҳа, маро ворид кунед Ворид шуда истодааст… Ба Firefox ворид шавед + + Вориднашуда истад Ҳамоҳангсозӣ фаъол аст Воридшавӣ иҷро нашуд Махфияти худкор + + Танзимоти махфият ва амният васоити пайгирӣ, барномаҳои зараровар ва ширкатҳоеро, ки шуморо пайгирӣ мекунанд, маҳдуд мекунад. Стандартӣ (пешфарз) + + Баъзеи васоити пайгириро маҳдуд мекунад. Саҳифаҳо ба таври муқаррар бор карда мешаванд. + + Ҷиддӣ (тавсия дода мешавад) + + Ҷиддӣ + + Васоити пайгирӣ, реклама ва равзанаҳои зоҳиршавандаи бештарро маҳдуд мекунад. Саҳифаҳо зудтар бор мешаванд, аммо баъзеи функсияҳо метавонанд кор накунанд. + + Интихоб кунед + + Тамошокуниро бо як даст тавассути навори абзорҳои поён кӯшиш кунед ё ин ки наворро ба боло гузоред. Реҷаи тамошои махфӣ + + Варақаи махфиро як бор кушоед: Ба нишонии %s зарба занед. + + Варақаҳои махфиро ҳар вақт кушоед: Танзимоти тамошокунии махфии худро навсозӣ кунед. Кушодани танзимот Махфияти шумо + + Мо %s-ро ҳамин тавр тарҳрезӣ кардаем, ки шумо тавонед он чизҳоеро, ки дар онлайн + ва бо мо мубодила мекунед, идора намоед. + Огоҳиномаи махфияти моро хонед @@ -926,6 +1165,8 @@ Мавзӯи худро интихоб кунед + + Бо фаъол кардани реҷаи торик барқи батареяро сарфа кунед ва биноии худро ҳифз намоед. Худкор @@ -943,8 +1184,22 @@ Ирсол ғайриимкон аст АЗ НАВ КӮШИШ КАРДАН + + Рамзро скан кунед + + https://firefox.com/pair гузаред]]> + + Барои сканкунӣ омода аст Ворид шудан ба воситаи камера + + Ба ҷояш почтаи электрониро истифода баред + + Барои танзими ҳамоҳангсозӣ байни дастгоҳҳо ҳисоберо эҷод намоед]]> + + Firefox ҳамоҳангсозиро бо ҳисоби шумо қатъ мекунад, аммо ягон маълумоти тамошокунии шуморо дар ин дастгоҳ нест намекунад. + + %s ҳамоҳангсозиро бо ҳисоби шумо қатъ мекунад, аммо ягон маълумоти тамошокунии шуморо дар ин дастгоҳ нест намекунад. Қатъ кардани пайваст @@ -957,15 +1212,41 @@ Танзимоти муҳофизат Муҳофизати такмилёфта аз пайгирӣ + + Тамошокунӣ бе пайгирӣ + + Маълумоти худро бо худ нигоҳ доред. %s шуморо аз бисёр васоити пайгирие, ки фаъолияти шуморо дар онлайн пайгирӣ мекунанд, муҳофизат менамояд. Маълумоти бештар Стандартӣ (пешфарз) + + Баъзеи васоити пайгириро маҳдуд мекунад. Саҳифаҳо ба таври муқаррар бор карда мешаванд. + + Ба воситаи муҳофизати стандартӣ аз пайгирӣ чӣ баста шудааст + + Ҷиддӣ + + Васоити пайгирӣ, реклама ва равзанаҳои зоҳиршавандаи бештарро маҳдуд мекунад. Саҳифаҳо зудтар бор мешаванд, аммо баъзеи функсияҳо метавонанд кор накунанд. + + Ба воситаи муҳофизати ҷиддӣ аз пайгирӣ чӣ баста шудааст Фармоишӣ + + Интихоб кунед, ки кадом васоити пайгирӣ ва скриптҳо бояд баста шаванд. + + Ба воситаи муҳофизати фармоишӣ аз пайгирӣ чӣ баста шудааст Кукиҳо + + Васоити пайгирии шабакаҳои иҷтимоӣ ва байни сомонаҳо + + Кукиҳо аз сомонаҳои боқимонда + + Ҳамаи кукиҳои тарафҳои сеюм (метавонанд фаъолияти сомонаҳоро вайрон кунанд) + + Ҳамаи кукиҳо (метавонанд фаъолияти сомонаҳоро вайрон кунанд) Муҳтавои пайгирикунанда @@ -981,16 +1262,37 @@ Манъ карда мешавад Иҷозат дода мешавад + + Васоити пайгирии шабакаҳои иҷтимоӣ + + Имконияти шабакаҳои иҷтимоиро барои пайгирии фаъолияти тамошокунии шумо дар Интернет маҳдуд мекунад. + + Кукиҳои васоити пайгирӣ байни сомонаҳо + + Кукиҳоеро, ки шабакаҳои рекламавӣ ва ширкатҳои таҳлилӣ барои ҷамъоварии маълумоти тамошокунии шумо дар бисёр сомонаҳо истифода мебаранд, манъ мекунад. Криптомайнерҳо + + Скриптҳои зараровареро, ки дастгоҳи шуморо барои истеҳсоли пули рақамӣ дастрас мекунанд, пешгирӣ менамояд. Хонандаи изи ангушт + + Ҷамъкунии маълумоти нодири муайяншавандаеро дар бораи дастгоҳи шумо, ки метавонад бо мақсадҳои пайгирӣ истифода шавад, манъ мекунад. Муҳтавои пайгирикунанда + + Боркунии рекламаҳои хориҷӣ, видеоҳо ва маводҳои дигареро, ки метавонанд рамзи пайгириро дар бар гиранд, манъ мекунад. Метавонад ба кори баъзеи сомонаҳо таъсир расонад. + + Сипар бо ранги лоҷувард маънои онро дорад, ки %s дар сомона васоити пайгириро манъ кард. Барои маълумоти бештар, зер кунед. Муҳофизат барои ин сомона фаъол аст Муҳофизат барои ин сомона ғайрифаъол аст + + Муҳофизати такмилёфта аз пайгирӣ барои сомонаҳои зерин ғайрифаъол аст + + Ба қафо гузаштан Ҳуқуқҳои шумо @@ -1001,6 +1303,12 @@ The first parameter is the app name --> %s | Китобхонаҳои OSS + + Васоити пайгирии интиқолдиҳӣ + + + Кукиҳоеро, ки тавассути восоити интиқолдиҳӣ ба сомонаҳои пайгирикунандаи маъруф насб шудаанд, тоза мекунад. + Дастгирӣ @@ -1014,6 +1322,11 @@ Китобхонаҳое, ки мо истифода мебарем + + Менюи ислоҳкунии хатоҳо: барои фаъолсозӣ %1$d зеркунӣ боқӣ монд + Менюи ислоҳкунии хатоҳо фаъол аст + 1 варақа @@ -1040,10 +1353,15 @@ Номи миёнбур + + Шумо метавонед ин сомонаро ба экрани асосии дастгоҳи худ ба осонӣ илова кунед, то ки ба он дастрасии фаврӣ дошта бошед ва бо таҷрибаи ба барнома монанд зудтар паймоиш кунед. + Воридшавиҳо ва ниҳонвожаҳо Нигоҳ доштани воридшавиҳо ва ниҳонвожаҳо + + Бо пешниҳоди нигоҳдорӣ Ҳеҷ гоҳ нигоҳ дошта нашавад @@ -1060,16 +1378,24 @@ Барои ҳамоҳангсозӣ ворид шавед Воридшавиҳои нигоҳдошташуда + + Воридшавиҳое, ки шумо дар %s нигоҳ медоред ё ҳамоҳанг мекунед, дар ин ҷо нишон дода мешаванд. Маълумоти бештар дар бораи ҳамоҳангсозӣ Истисноҳо + + Воридшавиҳо ва ниҳонвожаҳое, ки нигоҳ дошта нашудаанд, дар ин ҷо нишон дошта мешаванд. + + Воридшавиҳо ва ниҳонвожаҳо барои сомонаҳои зерин нигоҳ дошта намешаванд. Нест кардани ҳамаи истисноҳо Ҷустуҷӯи воридшавиҳо Аз рӯи алифбо + + Истифодашудаи охирин Сомона @@ -1078,6 +1404,10 @@ Ниҳонвожа PIN-и худро такроран ворид намоед + + Барои дидани воридшавиҳои нигоҳдошташуда, қулфро кушоед + + Ин пайвастшавӣ бехатар нест. Воридшавиҳое, ки дар ин ҷо ворид карда мешаванд, метавонанд ошкор шаванд. Маълумоти бештар @@ -1108,6 +1438,12 @@ Нишон додани ниҳонвожа Пинҳон кардани ниҳонвожа + + Барои дидани воридшавиҳои нигоҳдошташуда, қулфро кушоед + + Воридшавиҳо ва ниҳонвожаҳои худро муҳофизат намоед + + Барои муҳофизат кардани воридшавиҳо ва ниҳонвожаҳои худ аз дастрасии озод, агар касе дигар аз дастгоҳи шумо истифода барад, шаклвораи қулфи экран, рамзи PIN ё ниҳонвожаеро барои дастгоҳи худ танзим намоед. Дертар @@ -1116,12 +1452,17 @@ Қулфи дастгоҳи худро кушоед Тағйири андоза дар ҳамаи сомонаҳо + + Фаъол кардани имкони хурдкунӣ ва калонкунии намоиш, ҳатто дар сомонаҳое, ки ин ишораро манъ мекунанд. Ном (А-Я) Истифодашудаи охирин + + Мураттаб кардани менюи воридшавиҳо + Илова кардани низоми ҷустуҷӯӣ @@ -1139,13 +1480,27 @@ Дигар Ном + + Сатри ҷустуҷӯ барои истифода + + Сатри дархостро бо “%s” иваз намоед. Масалан:\nhttps://www.google.com/search?q=%s Маълумоти бештар + + Тафсилот дар бораи низоми ҷустуҷӯии фармоишӣ Пайванди «Маълумоти бештар» + + Номи низоми ҷустуҷӯиро ворид намоед + + Низоми ҷустуҷӯӣ бо номи “%s” аллакай вуҷуд дорад. Сатри ҷустуҷӯро ворид кунед + + Тафтиш кунед, ки сатри ҷустуҷӯ ба шакли намунавӣ мувофиқат мекунад + + Хатои пайвастшавӣ ба “%s” %s эҷод карда шуд @@ -1153,6 +1508,8 @@ %s нест карда шуд + + Хуш омадед ба барномаи комилан нави %s %s нав шуда истодааст... @@ -1181,6 +1538,8 @@ Шумо мутмаин ҳастед, ки мехоҳед ҳамаи иҷозатҳоро барои сомонаи ҷорӣ тоза намоед? Шумо мутмаин ҳастед, ки мехоҳед ин иҷозатҳоро барои сомонаи ҷорӣ тоза намоед? + + Ягон истиснои сомона нест Мақолаҳои беҳтарин @@ -1200,6 +1559,12 @@ Нест кардан Имконоти воридшавӣ + + Майдони матни таҳриршаванда барои нишонии сомонаи воридшавӣ. + + Майдони матни таҳриршаванда барои номи корбарии воридшавӣ. + + Майдони матни таҳриршаванда барои ниҳонвожаи воридшавӣ. Нигоҳ доштани тағйирот барои воридшавӣ @@ -1225,15 +1590,39 @@ Лутфан, санҷиши ҳаққониятро аз нав такрор кунед Лутфан ҳамоҳангсозии варақаҳоро фаъол кунед. + + Шумо дар дастгоҳҳои дигари худ дар Firefox ягон варақаи кушодашуда надоред. + + Дидани рӯйхати варақаҳо аз дастгоҳҳои дигар. Барои ҳамоҳангсозӣ ворид шавед Ягон варақаи кушодашуда нест + + + Ба ҳудуди шумораи сомонаҳои беҳтарин расид + + Барои илова кардани сомонаи роиҷи нав, сомонаи дигареро тоза намоед. Сомонаро ламс карда, доред ва "Тоза кардан"-ро интихоб намоед. Хуб, фаҳмидам + + Намоиш додани сомонаҳои роиҷ + Тоза кардан - + + Аз %s баштар истифода баред. + + + Чизҳоеро, ки ба шумо муҳиманд, ҷамъ кунед + + Ҷустуҷӯҳо, сомонаҳо ва варақаҳои монандро барои дастрасии фаврӣ дар оянда якҷоя кунед. + + Шумо ҳамчун %s тавассути браузери дигари Firefox дар ин телефон ворид шудаед. Шумо мехоҳед, ки бо ин ҳисоб ворид шавед? + + Шумо метавонед ин сомонаро ба экрани асосии телефони худ ба осонӣ илова кунед, то ки ба он дастрасии фаврӣ дошта бошед ва бо таҷрибаи ба барнома монанд зудтар паймоиш кунед. + diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 70755ca4f..1ae8191e7 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -1160,6 +1160,8 @@ ลงชื่อเข้าด้วยกล้องของคุณ ใช้อีเมลแทน + + สร้างบัญชีเพื่อซิงค์ Firefox ระหว่างอุปกรณ์]]> Firefox จะหยุดการซิงค์กับบัญชีของคุณ แต่จะไม่ลบข้อมูลการเรียกดูใด ๆ ของคุณบนอุปกรณ์นี้ @@ -1268,6 +1270,11 @@ The first parameter is the app name --> %s | ไลบรารี OSS + + ตัวติดตามการเปลี่ยนเส้นทาง + + ล้างคุกกี้ที่ตั้งโดยการเปลี่ยนเส้นทางไปยังเว็บไซต์ติดตามที่รู้จัก + การสนับสนุน diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c80ec3e5c..3a3962636 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -722,7 +722,7 @@ The first parameter is the number of bookmarks selected --> %1$d yer imi seçildi - Yer imini düzenle + Yer imi düzenle Klasörü düzenle diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0ace60b00..0a980ae28 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -350,6 +350,20 @@ Сповіщення + + + Власна збірка додатків + + OK + + Скасувати + + Назва збірки + + Власник збірки (ID користувача) + + Збірку додатків змінено. Вихід з програми для застосування змін… + Синхронізувати @@ -535,6 +549,14 @@ Немає нещодавно закритих вкладок + + Вкладки + + Подання вкладки + + Перелік + + Сітка Закрити вкладки @@ -651,6 +673,10 @@ Видалити %1$d елементів + + Сьогодні + + Вчора Останні 24 години @@ -789,6 +815,8 @@ Розташування Сповіщення + + Постійне сховище Запитувати дозвіл diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 7579c6547..2abebfca1 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -202,7 +202,7 @@ Lần này, tìm kiếm với: - Điền liên kết từ bộ nhớ tạm + Điền liên kết từ khay nhớ tạm Cho phép @@ -316,13 +316,13 @@ Hiển thị công cụ tìm kiếm - Hiển thị gợi ý tìm kiếm + Hiển thị đề xuất tìm kiếm Hiển thị tìm kiếm bằng giọng nói Hiển thị trong phiên riêng tư - Hiển thị đề xuất bộ nhớ tạm + Hiển thị đề xuất khay nhớ tạm Tìm kiếm lịch sử duyệt web @@ -1320,7 +1320,7 @@ Bạn có thể dễ dàng thêm trang web vào màn hình chính thiết bị của bạn để có thể truy cập và duyệt web nhanh hơn với trải nghiệm giống như trên ứng dụng. - Đăng nhập và mật khẩu + Thông tin đăng nhập và mật khẩu Lưu thông tin đăng nhập và mật khẩu @@ -1330,7 +1330,7 @@ Tự động điền - Đồng bộ hóa đăng nhập + Đồng bộ hóa thông tin đăng nhập Bật @@ -1340,7 +1340,7 @@ Đăng nhập vào đồng bộ hóa - Đăng nhập đã lưu + Thông tin đăng nhập đã lưu Thông tin đăng nhập bạn lưu hoặc đồng bộ hóa với %s sẽ hiển thị tại đây. @@ -1348,9 +1348,9 @@ Ngoại trừ - Đăng nhập và mật khẩu không được lưu sẽ được hiển thị ở đây. + Thông tin đăng nhập và mật khẩu không được lưu sẽ được hiển thị ở đây. - Đăng nhập và mật khẩu sẽ không được lưu cho các trang web này. + Thông tin đăng nhập và mật khẩu sẽ không được lưu cho các trang web này. Xóa tất cả các ngoại lệ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5bb4a79be..618770a57 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -355,6 +355,20 @@ 通知 + + + 自定义附加组件收藏集 + + 确定 + + 取消 + + 收藏集名称 + + 收藏集所有者(用户 ID) + + 已更改附加组件收藏集设置。退出应用程序以应用更改… + 立即同步 @@ -544,6 +558,14 @@ 暂无最近关闭的标签页 + + 标签页 + + 标签页视图 + + 列表 + + 网格 关闭标签页 @@ -660,6 +682,10 @@ 删除 %1$d 个项目 + + 本日 + + 昨日 过去 24 小时 @@ -803,6 +829,8 @@ 位置 通知 + + 持久存储 始终询问 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 911a04098..b04464e0e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -351,6 +351,20 @@ 通知 + + + 自訂附加元件收藏集 + + 確定 + + 取消 + + 收藏集名稱 + + 收藏集擁有者(使用者 ID) + + 已更改收藏集內容。將結束應用程式讓變更生效… + 立即同步 @@ -537,6 +551,14 @@ 目前還沒有最近關閉的分頁 + + 分頁 + + 分頁檢視 + + 清單 + + 格線 自動關閉分頁 @@ -653,6 +675,10 @@ 刪除 %1$d 個項目 + + 今天 + + 昨天 24 小時以內 @@ -794,6 +820,8 @@ 位置 通知 + + 持續性儲存空間 總是詢問 diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index efbceadc1..22b0851ea 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -11,7 +11,6 @@ pref_key_site_permissions pref_key_add_private_browsing_shortcut pref_key_accessibility - pref_key_accessibility_auto_size pref_key_accessibility_font_scale pref_key_accessibility_force_enable_zoom pref_key_advanced @@ -110,6 +109,7 @@ pref_key_custom_settings pref_key_browser_feature_autoplay pref_key_browser_feature_autoplay_inaudible + pref_key_browser_feature_persistent_storage pref_key_phone_feature_camera pref_key_phone_feature_location pref_key_phone_feature_microphone @@ -130,8 +130,6 @@ pref_home_category - - pref_key_website_pull_to_refresh pref_key_dynamic_toolbar pref_key_swipe_toolbar_switch_tabs @@ -248,11 +246,16 @@ pref_key_show_collections_home - pref_key_close_tabs + + pref_key_tab_view_category + pref_key_tab_view_list + pref_key_tab_view_grid + pref_key_tabs pref_key_close_tabs_manually pref_key_close_tabs_after_one_day pref_key_close_tabs_after_one_week pref_key_close_tabs_after_one_month + pref_key_show_grid_view_tabs_settings pref_key_camera_permissions_needed diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 45c865fd9..87e68df1d 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -32,6 +32,8 @@ Secret Settings + + Show Grid View in Tabs Settings Show Top Frequently Visited Sites diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 344d7a3a2..715fda5a4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -541,6 +541,14 @@ No recently closed tabs here + + Tabs + + Tab view + + List + + Grid Close tabs @@ -794,6 +802,8 @@ Location Notification + + Persistent Storage Ask to allow diff --git a/app/src/main/res/xml/accessibility_preferences.xml b/app/src/main/res/xml/accessibility_preferences.xml index 125d2f147..4d8b897bd 100644 --- a/app/src/main/res/xml/accessibility_preferences.xml +++ b/app/src/main/res/xml/accessibility_preferences.xml @@ -4,11 +4,6 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - diff --git a/app/src/main/res/xml/close_tabs_preferences.xml b/app/src/main/res/xml/close_tabs_preferences.xml deleted file mode 100644 index c6d5f962b..000000000 --- a/app/src/main/res/xml/close_tabs_preferences.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 8a99bb133..e6f94e259 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -53,6 +53,11 @@ android:key="@string/pref_key_search_settings" android:title="@string/preferences_search" /> + + - - + + + diff --git a/app/src/main/res/xml/site_permissions_preferences.xml b/app/src/main/res/xml/site_permissions_preferences.xml index d91fb3bd7..85e822944 100644 --- a/app/src/main/res/xml/site_permissions_preferences.xml +++ b/app/src/main/res/xml/site_permissions_preferences.xml @@ -36,6 +36,13 @@ android:summary="@string/preference_option_phone_feature_ask_to_allow" app:allowDividerBelow="true"/> + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt b/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt index a94d79414..271736386 100644 --- a/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt +++ b/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt @@ -17,6 +17,7 @@ import io.mockk.verify import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runBlockingTest import mozilla.components.feature.intent.processing.IntentProcessor +import mozilla.components.support.test.robolectric.testContext import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -202,7 +203,10 @@ class IntentReceiverActivityTest { every { activity.settings() } returns settings every { activity.components.analytics } returns mockk(relaxed = true) every { activity.components.intentProcessors } returns intentProcessors - every { activity.components.strictMode } returns mockk(relaxed = true) + + // For some reason, activity.components doesn't return application.components, which is the + // globally defined TestComponents, so we redirect it. + every { activity.components.strictMode } returns testContext.components.strictMode } private inline fun mockIntentProcessor(): T { diff --git a/app/src/test/java/org/mozilla/fenix/StrictModeManagerTest.kt b/app/src/test/java/org/mozilla/fenix/StrictModeManagerTest.kt index f4f3e21a8..49ad3e280 100644 --- a/app/src/test/java/org/mozilla/fenix/StrictModeManagerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/StrictModeManagerTest.kt @@ -21,6 +21,7 @@ import org.junit.Assert.fail import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.components.Components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @RunWith(FenixRobolectricTestRunner::class) @@ -36,13 +37,15 @@ class StrictModeManagerTest { MockKAnnotations.init(this) mockkStatic(StrictMode::class) + val components: Components = mockk(relaxed = true) + // These tests log a warning that mockk couldn't set the backing field of Config.channel // but it doesn't seem to impact their correctness so I'm ignoring it. val debugConfig: Config = mockk { every { channel } returns ReleaseChannel.Debug } - debugManager = StrictModeManager(debugConfig) + debugManager = StrictModeManager(debugConfig, components) val releaseConfig: Config = mockk { every { channel } returns ReleaseChannel.Release } - releaseManager = StrictModeManager(releaseConfig) + releaseManager = StrictModeManager(releaseConfig, components) } @After @@ -113,4 +116,11 @@ class StrictModeManagerTest { verify { StrictMode.setThreadPolicy(expectedPolicy) } } + + @Test + fun `GIVEN we're in debug mode WHEN we suppress StrictMode THEN the suppressed count increases`() { + assertEquals(0, debugManager.suppressionCount) + debugManager.resetAfter(StrictMode.allowThreadDiskReads()) { "" } + assertEquals(1, debugManager.suppressionCount) + } } diff --git a/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt b/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt index c69007c10..224496fd0 100644 --- a/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt @@ -17,6 +17,9 @@ import org.junit.Assert.assertEquals import org.junit.Assert.fail import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.StrictModeManager +import org.mozilla.fenix.helpers.TestStrictModeManager +import kotlin.coroutines.CoroutineContext @RunWith(FenixRobolectricTestRunner::class) class AccountAbnormalitiesTest { @@ -25,7 +28,7 @@ class AccountAbnormalitiesTest { val crashReporter: CrashReporter = mockk() // no account present - val accountAbnormalities = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true)) + val accountAbnormalities = newAccountAbnormalities(crashReporter) try { accountAbnormalities.userRequestedLogout() @@ -52,7 +55,7 @@ class AccountAbnormalitiesTest { val crashReporter: CrashReporter = mockk(relaxed = true) val accountManager: FxaAccountManager = mockk(relaxed = true) - val accountAbnormalities = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true), this.coroutineContext) + val accountAbnormalities = newAccountAbnormalities(crashReporter, this.coroutineContext) accountAbnormalities.accountManagerStarted(accountManager) // Logout action must be preceded by auth. @@ -65,7 +68,7 @@ class AccountAbnormalitiesTest { val crashReporter: CrashReporter = mockk(relaxed = true) val accountManager: FxaAccountManager = mockk(relaxed = true) - val accountAbnormalities = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true), this.coroutineContext) + val accountAbnormalities = newAccountAbnormalities(crashReporter, this.coroutineContext) accountAbnormalities.accountManagerStarted(accountManager) accountAbnormalities.onAuthenticated(mockk(), mockk()) @@ -83,7 +86,7 @@ class AccountAbnormalitiesTest { val crashReporter: CrashReporter = mockk(relaxed = true) val accountManager: FxaAccountManager = mockk(relaxed = true) - val accountAbnormalities = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true), this.coroutineContext) + val accountAbnormalities = newAccountAbnormalities(crashReporter, this.coroutineContext) accountAbnormalities.accountManagerStarted(accountManager) // User didn't request this logout. @@ -96,7 +99,7 @@ class AccountAbnormalitiesTest { val crashReporter: CrashReporter = mockk(relaxed = true) val accountManager: FxaAccountManager = mockk(relaxed = true) - val accountAbnormalities = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true), this.coroutineContext) + val accountAbnormalities = newAccountAbnormalities(crashReporter, this.coroutineContext) accountAbnormalities.accountManagerStarted(accountManager) accountAbnormalities.onAuthenticated(mockk(), mockk()) @@ -104,7 +107,7 @@ class AccountAbnormalitiesTest { every { accountManager.authenticatedAccount() } returns null // Pretend we restart, and instantiate a new middleware instance. - val accountAbnormalities2 = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true), this.coroutineContext) + val accountAbnormalities2 = newAccountAbnormalities(crashReporter, this.coroutineContext) // mock accountManager doesn't have an account, but we expect it to have one since we // were authenticated before our "restart". accountAbnormalities2.accountManagerStarted(accountManager) @@ -117,7 +120,7 @@ class AccountAbnormalitiesTest { val crashReporter: CrashReporter = mockk() val accountManager: FxaAccountManager = mockk(relaxed = true) - val accountAbnormalities = AccountAbnormalities(testContext, crashReporter, mockk(relaxed = true), this.coroutineContext) + val accountAbnormalities = newAccountAbnormalities(crashReporter, coroutineContext) accountAbnormalities.accountManagerStarted(accountManager) // We saw an auth event, then user requested a logout. @@ -131,4 +134,13 @@ class AccountAbnormalitiesTest { crashReporter.submitCaughtException(any()) } } + + private fun newAccountAbnormalities( + crashReporter: CrashReporter, + coroutineContext: CoroutineContext? = null + ): AccountAbnormalities = if (coroutineContext != null) { + AccountAbnormalities(testContext, crashReporter, TestStrictModeManager() as StrictModeManager, coroutineContext) + } else { + AccountAbnormalities(testContext, crashReporter, TestStrictModeManager() as StrictModeManager) + } } diff --git a/app/src/test/java/org/mozilla/fenix/components/TestComponents.kt b/app/src/test/java/org/mozilla/fenix/components/TestComponents.kt index 1d31eaf56..a37c30071 100644 --- a/app/src/test/java/org/mozilla/fenix/components/TestComponents.kt +++ b/app/src/test/java/org/mozilla/fenix/components/TestComponents.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.components import android.content.Context import io.mockk.mockk +import org.mozilla.fenix.helpers.TestStrictModeManager import org.mozilla.fenix.utils.ClipboardHandler import org.mozilla.fenix.utils.Settings @@ -33,4 +34,6 @@ class TestComponents(private val context: Context) : Components(context) { override val clipboardHandler by lazy { ClipboardHandler(context) } override val settings by lazy { mockk(relaxed = true) } + + override val strictMode by lazy { TestStrictModeManager() } } diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/AppLaunchTimeMeasurementTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/AppLaunchTimeMeasurementTest.kt new file mode 100644 index 000000000..e22aaac9a --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/AppLaunchTimeMeasurementTest.kt @@ -0,0 +1,79 @@ +/* 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 android.os.SystemClock +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.HOT +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.COLD +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.ERROR +import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.WARM +import org.mozilla.fenix.perf.Stat + +class AppLaunchTimeMeasurementTest { + + @MockK + private lateinit var statMock: Stat + + private lateinit var appLaunchTimeMeasurement: AppLaunchTimeMeasurement + private val startTime = SystemClock.elapsedRealtimeNanos() + private val endTime = SystemClock.elapsedRealtimeNanos() + 1 + + @Before + fun setUp() { + MockKAnnotations.init(this) + appLaunchTimeMeasurement = AppLaunchTimeMeasurement(statMock) + + every { statMock.getProcessStartTimeStampNano(any()) } returns startTime + } + + @Test + fun `WHEN application is launched with cold startup THEN report the correct value`() { + runBlocking { + appLaunchTimeMeasurement.onFirstFramePreDraw(endTime) + + val actualResult = endTime.minus(startTime) + assertTrue(appLaunchTimeMeasurement.getApplicationLaunchTime(COLD) == actualResult) + } + } + + @Test + fun `WHEN application is launch with warm startup THEN report the correct value`() { + appLaunchTimeMeasurement.onHomeActivityOnCreate(startTime) + appLaunchTimeMeasurement.onFirstFramePreDraw(endTime) + + val actualResult = endTime.minus(startTime) + runBlocking { + assertTrue(appLaunchTimeMeasurement.getApplicationLaunchTime(WARM) == actualResult) + } + } + + @Test + fun `WHEN application is launch with hot startup THEN report the correct value`() { + appLaunchTimeMeasurement.onHomeActivityOnRestart(startTime) + appLaunchTimeMeasurement.onFirstFramePreDraw(endTime) + + val actualResult = endTime.minus(startTime) + runBlocking { + assertTrue(appLaunchTimeMeasurement.getApplicationLaunchTime(HOT) == actualResult) + } + } + + @Test + fun `WHEN getting launch time before onDraw() is called THEN report the correct value`() { + appLaunchTimeMeasurement.onHomeActivityOnCreate(startTime) + + val actualResult = null + runBlocking { + assertTrue(appLaunchTimeMeasurement.getApplicationLaunchTime(ERROR) == actualResult) + } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/AppStartupTelemetryTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/AppStartupTelemetryTest.kt index 540fa7402..41449a310 100644 --- a/app/src/test/java/org/mozilla/fenix/components/metrics/AppStartupTelemetryTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/AppStartupTelemetryTest.kt @@ -5,16 +5,21 @@ package org.mozilla.fenix.components.metrics import android.content.Intent -import io.mockk.MockKAnnotations -import io.mockk.clearMocks -import io.mockk.every +import android.os.SystemClock +import android.view.View import io.mockk.impl.annotations.MockK +import io.mockk.impl.annotations.RelaxedMockK import io.mockk.verify +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.every +import io.mockk.clearMocks import mozilla.components.support.utils.toSafeIntent import org.junit.Before import org.junit.Test import org.junit.Assert.assertTrue import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.GleanMetrics.Events.appOpenedAllStartupKeys.firstFramePreDrawNanos import org.mozilla.fenix.GleanMetrics.Events.appOpenedAllStartupKeys.hasSavedInstanceState import org.mozilla.fenix.GleanMetrics.Events.appOpenedAllStartupKeys.source import org.mozilla.fenix.GleanMetrics.Events.appOpenedAllStartupKeys.type @@ -32,17 +37,26 @@ import org.mozilla.fenix.components.metrics.Event.AppAllStartup.Type.ERROR class AppStartupTelemetryTest { @MockK - private lateinit var metricController: MetricController + private lateinit var metricControllerMock: MetricController @MockK - private lateinit var intent: Intent + private lateinit var intentMock: Intent + @RelaxedMockK + private lateinit var appLaunchTimeMeasurementMock: AppLaunchTimeMeasurement + @RelaxedMockK + private lateinit var rootContainerMock: View private lateinit var appStartupTelemetry: AppStartupTelemetry + private val homeActivityInitTime = SystemClock.elapsedRealtimeNanos() + private val onPreDrawTime = SystemClock.elapsedRealtimeNanos() + 1 + @Before fun setup() { MockKAnnotations.init(this) - appStartupTelemetry = AppStartupTelemetry(metricController) - every { metricController.track(any()) } returns Unit + appStartupTelemetry = AppStartupTelemetry(metricControllerMock, appLaunchTimeMeasurementMock) + + coEvery { appLaunchTimeMeasurementMock.getApplicationLaunchTime(any()) } returns onPreDrawTime.minus(homeActivityInitTime) + every { metricControllerMock.track(any()) } returns Unit } @Test @@ -50,11 +64,12 @@ class AppStartupTelemetryTest { setupIntentMock(APP_ICON) appStartupTelemetry.onFenixApplicationOnCreate() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(APP_ICON, COLD, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(APP_ICON, COLD, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -62,11 +77,12 @@ class AppStartupTelemetryTest { setupIntentMock(LINK) appStartupTelemetry.onFenixApplicationOnCreate() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(LINK, COLD, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(LINK, COLD, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -74,11 +90,12 @@ class AppStartupTelemetryTest { setupIntentMock(CUSTOM_TAB) appStartupTelemetry.onFenixApplicationOnCreate() - appStartupTelemetry.onExternalAppBrowserOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onExternalAppBrowserOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(CUSTOM_TAB, COLD, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(CUSTOM_TAB, COLD, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -86,11 +103,12 @@ class AppStartupTelemetryTest { setupIntentMock(APP_ICON) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(APP_ICON, WARM, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(APP_ICON, WARM, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -98,11 +116,12 @@ class AppStartupTelemetryTest { setupIntentMock(LINK) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(LINK, WARM, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(LINK, WARM, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -110,11 +129,12 @@ class AppStartupTelemetryTest { setupIntentMock(CUSTOM_TAB) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onExternalAppBrowserOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onExternalAppBrowserOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(CUSTOM_TAB, WARM, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(CUSTOM_TAB, WARM, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -122,12 +142,13 @@ class AppStartupTelemetryTest { setupIntentMock(APP_ICON) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnRestart() - appStartupTelemetry.onHomeActivityOnNewIntent(intent.toSafeIntent()) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnRestart(rootContainerMock) + appStartupTelemetry.onHomeActivityOnNewIntent(intentMock.toSafeIntent()) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(APP_ICON, HOT) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(APP_ICON, HOT, launchTime = onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -135,23 +156,25 @@ class AppStartupTelemetryTest { setupIntentMock(LINK) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnRestart() - appStartupTelemetry.onHomeActivityOnNewIntent(intent.toSafeIntent()) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnRestart(rootContainerMock) + appStartupTelemetry.onHomeActivityOnNewIntent(intentMock.toSafeIntent()) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(LINK, HOT) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(LINK, HOT, launchTime = onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test - fun `WHEN application is launched and onResume() is called twice THEN metric is reported only once`() { + fun `WHEN application is launched and onStop() is called twice THEN metric is reported only once`() { setupIntentMock(LINK) - appStartupTelemetry.onExternalAppBrowserOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onExternalAppBrowserOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onStop() - verify(exactly = 1) { metricController.track(any()) } + verify(exactly = 1) { metricControllerMock.track(any()) } } @Test @@ -159,11 +182,12 @@ class AppStartupTelemetryTest { setupIntentMock(UNKNOWN) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(UNKNOWN, WARM, false) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(UNKNOWN, WARM, false, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -171,20 +195,23 @@ class AppStartupTelemetryTest { setupIntentMock(APP_ICON) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), true) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), true, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(APP_ICON, WARM, true) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(APP_ICON, WARM, true, onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } private fun launchApplicationAndPutApplicationInBackground() { appStartupTelemetry.onFenixApplicationOnCreate() - appStartupTelemetry.onHomeActivityOnCreate(intent.toSafeIntent(), false) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() + appStartupTelemetry.appLaunchTimeMeasurement = appLaunchTimeMeasurementMock // have to clear the mock function calls so it doesnt interfere with tests - clearMocks(metricController, answers = false) + clearMocks(metricControllerMock, answers = false) appStartupTelemetry.onApplicationOnStop() } @@ -194,10 +221,11 @@ class AppStartupTelemetryTest { setupIntentMock(UNKNOWN) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(UNKNOWN, ERROR) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(UNKNOWN, ERROR, launchTime = onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -205,11 +233,25 @@ class AppStartupTelemetryTest { setupIntentMock(APP_ICON) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnRestart() - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnRestart(rootContainerMock) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(UNKNOWN, HOT) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(UNKNOWN, HOT, launchTime = onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } + } + + @Test + fun `WHEN application is launched and onStop is called before onPreDraw THEN records the correct values`() { + setupIntentMock(APP_ICON) + coEvery { appLaunchTimeMeasurementMock.getApplicationLaunchTime(any()) } returns null + + appStartupTelemetry.onFenixApplicationOnCreate() + appStartupTelemetry.onHomeActivityOnCreate(intentMock.toSafeIntent(), false, homeActivityInitTime, rootContainerMock) + appStartupTelemetry.onStop() + + val validMetric = AppAllStartup(APP_ICON, COLD, false) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test @@ -217,20 +259,22 @@ class AppStartupTelemetryTest { setupIntentMock(APP_ICON) launchApplicationAndPutApplicationInBackground() - appStartupTelemetry.onHomeActivityOnNewIntent(intent.toSafeIntent()) - appStartupTelemetry.onHomeActivityOnResume() + appStartupTelemetry.onHomeActivityOnNewIntent(intentMock.toSafeIntent()) + appStartupTelemetry.onPreDraw() + appStartupTelemetry.onStop() - val validMetric = AppAllStartup(APP_ICON, ERROR) - verify(exactly = 1) { metricController.track(validMetric) } + val validMetric = AppAllStartup(APP_ICON, ERROR, launchTime = onPreDrawTime.minus(homeActivityInitTime)) + verify(exactly = 1) { metricControllerMock.track(validMetric) } } @Test fun `WHEN AppAllStartup does not have savedInstanceState THEN do not return savedInstanceState`() { val expectedExtra: Map? = hashMapOf( source to APP_ICON.toString(), - type to HOT.toString()) + type to HOT.toString(), + firstFramePreDrawNanos to onPreDrawTime.minus(homeActivityInitTime).toString()) - val appAllStartup = AppAllStartup(APP_ICON, HOT) + val appAllStartup = AppAllStartup(APP_ICON, HOT, launchTime = onPreDrawTime.minus(homeActivityInitTime)) assertTrue(appAllStartup.extras!! == expectedExtra) } @@ -240,9 +284,10 @@ class AppStartupTelemetryTest { val expectedExtra: Map? = hashMapOf( source to APP_ICON.toString(), type to COLD.toString(), - hasSavedInstanceState to true.toString()) + hasSavedInstanceState to true.toString(), + firstFramePreDrawNanos to onPreDrawTime.minus(homeActivityInitTime).toString()) - val appAllStartup = AppAllStartup(APP_ICON, COLD, true) + val appAllStartup = AppAllStartup(APP_ICON, COLD, true, onPreDrawTime.minus(homeActivityInitTime)) assertTrue(appAllStartup.extras!! == expectedExtra) } @@ -250,16 +295,16 @@ class AppStartupTelemetryTest { private fun setupIntentMock(source: Source) { when (source) { APP_ICON -> { - every { intent.action } returns Intent.ACTION_MAIN - every { intent.categories } returns setOf(Intent.CATEGORY_LAUNCHER) + every { intentMock.action } returns Intent.ACTION_MAIN + every { intentMock.categories } returns setOf(Intent.CATEGORY_LAUNCHER) } LINK, CUSTOM_TAB -> { - every { intent.action } returns Intent.ACTION_VIEW - every { intent.categories } returns emptySet() + every { intentMock.action } returns Intent.ACTION_VIEW + every { intentMock.categories } returns emptySet() } UNKNOWN -> { - every { intent.action } returns Intent.ACTION_MAIN - every { intent.categories } returns emptySet() + every { intentMock.action } returns Intent.ACTION_MAIN + every { intentMock.categories } returns emptySet() } } } diff --git a/app/src/test/java/org/mozilla/fenix/helpers/TestStrictModeManager.kt b/app/src/test/java/org/mozilla/fenix/helpers/TestStrictModeManager.kt new file mode 100644 index 000000000..3f8d5f233 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/helpers/TestStrictModeManager.kt @@ -0,0 +1,22 @@ +/* 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.helpers + +import android.os.StrictMode +import io.mockk.mockk +import org.mozilla.fenix.StrictModeManager + +/** + * A test version of [StrictModeManager]. This class is difficult to mock because of [resetAfter] + * so we provide a test implementation. + */ +class TestStrictModeManager : StrictModeManager(mockk(relaxed = true), mockk(relaxed = true)) { + + // This method is hard to mock because this method needs to return the return value of the + // function passed in. + override fun resetAfter(policy: StrictMode.ThreadPolicy, functionBlock: () -> R): R { + return functionBlock() + } +} diff --git a/app/src/test/java/org/mozilla/fenix/settings/ExtensionsTest.kt b/app/src/test/java/org/mozilla/fenix/settings/ExtensionsTest.kt index 3df70af7f..5eb7ef369 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/ExtensionsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/ExtensionsTest.kt @@ -43,9 +43,6 @@ class ExtensionsTest { every { fragment.getString(R.string.pref_key_accessibility_force_enable_zoom) } returns "pref_key_accessibility_force_enable_zoom" - every { - fragment.getString(R.string.pref_key_accessibility_auto_size) - } returns "pref_key_accessibility_auto_size" } @Test @@ -78,11 +75,6 @@ class ExtensionsTest { every { fragment.findPreference("pref_key_accessibility_auto_size") } returns switchPreference - - assertEquals( - switchPreference, - fragment.requirePreference(R.string.pref_key_accessibility_auto_size) - ) } @Test diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsFragmentStoreTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsFragmentStoreTest.kt index c7a775531..8b69a28c4 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsFragmentStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsFragmentStoreTest.kt @@ -94,6 +94,7 @@ class QuickSettingsFragmentStoreTest { every { permissions.microphone } returns SitePermissions.Status.NO_DECISION every { permissions.notification } returns SitePermissions.Status.BLOCKED every { permissions.location } returns SitePermissions.Status.ALLOWED + every { permissions.localStorage } returns SitePermissions.Status.ALLOWED every { permissions.autoplayAudible } returns SitePermissions.Status.BLOCKED every { permissions.autoplayInaudible } returns SitePermissions.Status.BLOCKED every { appSettings.getAutoplayUserSetting(any()) } returns AUTOPLAY_BLOCK_ALL @@ -111,6 +112,7 @@ class QuickSettingsFragmentStoreTest { assertNotNull(state[PhoneFeature.LOCATION]) assertNotNull(state[PhoneFeature.AUTOPLAY_AUDIBLE]) assertNotNull(state[PhoneFeature.AUTOPLAY_INAUDIBLE]) + assertNotNull(state[PhoneFeature.PERSISTENT_STORAGE]) } @Test diff --git a/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt b/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt index c484c82a2..1d4ade685 100644 --- a/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt @@ -106,7 +106,7 @@ class DefaultTabTrayControllerTest { verify { navController.navigate( - TabTrayDialogFragmentDirections.actionGlobalCloseTabSettingsFragment() + TabTrayDialogFragmentDirections.actionGlobalTabSettingsFragment() ) } } @@ -252,7 +252,7 @@ class DefaultTabTrayControllerTest { @Test fun handleSetUpAutoCloseTabsClicked() { controller.handleSetUpAutoCloseTabsClicked() - val directions = TabTrayDialogFragmentDirections.actionGlobalCloseTabSettingsFragment() + val directions = TabTrayDialogFragmentDirections.actionGlobalTabSettingsFragment() verify { navController.navigate(directions) diff --git a/app/src/test/java/org/mozilla/fenix/tabtray/TabTrayViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/tabtray/TabTrayViewHolderTest.kt index 4c3a9e9c9..7a8a9b448 100644 --- a/app/src/test/java/org/mozilla/fenix/tabtray/TabTrayViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabtray/TabTrayViewHolderTest.kt @@ -19,8 +19,8 @@ import mozilla.components.browser.state.state.MediaState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.toolbar.MAX_URI_LENGTH import mozilla.components.concept.tabstray.Tab -import mozilla.components.support.images.ImageLoadRequest -import mozilla.components.support.images.loader.ImageLoader +import mozilla.components.concept.base.images.ImageLoadRequest +import mozilla.components.concept.base.images.ImageLoader import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals import org.junit.Before diff --git a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt index d05850b70..960216bbc 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt @@ -31,7 +31,8 @@ class SettingsTest { microphone = ASK_TO_ALLOW, notification = ASK_TO_ALLOW, autoplayAudible = AutoplayAction.BLOCKED, - autoplayInaudible = AutoplayAction.BLOCKED + autoplayInaudible = AutoplayAction.BLOCKED, + persistentStorage = ASK_TO_ALLOW ) @Before @@ -244,19 +245,6 @@ class SettingsTest { assertEquals(settings.getTabTimeout(), Settings.ONE_MONTH_MS) } - @Test - fun shouldUseAutoSize() { - // When just created - // Then - assertTrue(settings.shouldUseAutoSize) - - // When - settings.shouldUseAutoSize = false - - // Then - assertFalse(settings.shouldUseAutoSize) - } - @Test fun shouldAutofill() { // When just created @@ -577,6 +565,23 @@ class SettingsTest { ) } + @Test + fun getSitePermissionsCustomSettingsRules_persistentStorage() { + settings.setSitePermissionsPhoneFeatureAction(PhoneFeature.PERSISTENT_STORAGE, ALLOWED) + + assertEquals( + defaultPermissions.copy(persistentStorage = ALLOWED), + settings.getSitePermissionsCustomSettingsRules() + ) + + settings.setSitePermissionsPhoneFeatureAction(PhoneFeature.PERSISTENT_STORAGE, BLOCKED) + + assertEquals( + defaultPermissions.copy(persistentStorage = BLOCKED), + settings.getSitePermissionsCustomSettingsRules() + ) + } + @Test fun overrideAmoCollection() { // When just created diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index f1fa81fce..1da5df7ea 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "62.0.20201002143132" + const val VERSION = "63.0.20201010143128" } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 286107756..51e396937 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -54,6 +54,7 @@ object Deps { const val allopen = "org.jetbrains.kotlin:kotlin-allopen:${Versions.kotlin}" const val osslicenses_plugin = "com.google.android.gms:oss-licenses-plugin:${Versions.osslicenses_plugin}" + const val mozilla_concept_base = "org.mozilla.components:concept-base:${Versions.mozilla_android_components}" const val mozilla_concept_engine = "org.mozilla.components:concept-engine:${Versions.mozilla_android_components}" const val mozilla_concept_menu = "org.mozilla.components:concept-menu:${Versions.mozilla_android_components}" const val mozilla_concept_push = "org.mozilla.components:concept-push:${Versions.mozilla_android_components}" diff --git a/config/detekt.yml b/config/detekt.yml index 180847b99..9e5d45ee9 100644 --- a/config/detekt.yml +++ b/config/detekt.yml @@ -112,6 +112,9 @@ mozilla-detekt-rules: # with the debuggable flag or not. Use a check for different build variants, # instead. bannedProperties: "BuildConfig.DEBUG" + MozillaStrictModeSuppression: + active: true + excludes: "**/*Test.kt, **/*Spec.kt, **/test/**, **/androidTest/**" MozillaCorrectUnitTestRunner: active: true diff --git a/docs/metrics.md b/docs/metrics.md index 845a399b9..0614a699c 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -99,7 +99,7 @@ The following metrics are added to the ping: | download_notification.try_again |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped on try again when a download fails in the download notification |[1](https://github.com/mozilla-mobile/fenix/pull/6554), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | error_page.visited_error |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user encountered an error page |[1](https://github.com/mozilla-mobile/fenix/pull/2491#issuecomment-492414486), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • error_type: The error type of the error page encountered
|2021-04-01 |2 | | events.app_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the app (from cold start, to the homescreen or browser) |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: The method used to open Fenix. Possible values are: `app_icon`, `custom_tab` or `link`
|2021-04-01 |2 | -| events.app_opened_all_startup |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the app to the HomeActivity. The HomeActivity encompasses the home screen, browser screen, settings screen, collections and other screens in the nav_graph. This differs from the app_opened probe because it measures all startups, not just cold startup. Note: There is a short gap between the time application goes into background and the time android reports the application going into the background. Note: This metric does not record souce when app opened from task switcher: open application -> press home button -> open recent tasks -> choose fenix. In this case will report [source = unknown, type = hot, has_saved_instance_state = false]. |[1](https://github.com/mozilla-mobile/fenix/pull/12114#pullrequestreview-445245341), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [3](https://github.com/mozilla-mobile/fenix/pull/13494#pullrequestreview-474050499)|
  • has_saved_instance_state: boolean value whether or not startup type has a savedInstance. using savedInstance, HomeActivity's previous state can be restored. This is an optional key since it is not applicable to all the cases. for example, when we are doing a hot start up, we cant have a savedInstanceState therefore we report only [APP_ICON, HOT] instead of [APP_ICON, HOT, false].
  • source: The method used to open Fenix. Possible values are `app_icon`, `custom_tab`, `link` or `unknown`. unknown is for startup sources where we can't pinpoint the cause. One UNKNOWN case is the app switcher where we don't know what variables to check to ensure this startup wasn't caused by something else.
  • type: the startup type for opening fenix. the application and HomeActivity either needs to be created or started again. possible values are `cold`, `warm`, `hot` or `error`. Error is for impossible cases. Please file a bug if you see the error case. app created AND HomeActivity created = cold app started AND HomeActivity created = warm app started AND HomeActivity started = hot app created AND HomeActivity started = error
|2021-06-01 |2 | +| events.app_opened_all_startup |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the app to the HomeActivity. The HomeActivity encompasses the home screen, browser screen, settings screen, collections and other screens in the nav_graph. This differs from the app_opened probe because it measures all startups, not just cold startup. Note: There is a short gap between the time application goes into background and the time android reports the application going into the background. Note: This metric does not record souce when app opened from task switcher: open application -> press home button -> open recent tasks -> choose fenix. In this case will report [source = unknown, type = hot, has_saved_instance_state = false]. |[1](https://github.com/mozilla-mobile/fenix/pull/12114#pullrequestreview-445245341), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [3](https://github.com/mozilla-mobile/fenix/pull/13494#pullrequestreview-474050499), [4](https://github.com/mozilla-mobile/fenix/pull/15605#issuecomment-702365594)|
  • first_frame_pre_draw_nanos: the number of nanoseconds the application took to launch. This is the time difference between application launch(user pressing app_icon, launching a link) and until the first view is about to be drawn on the screen. If the time is not captured, this extra key will not be reported.
  • has_saved_instance_state: boolean value whether or not startup type has a savedInstance. using savedInstance, HomeActivity's previous state can be restored. This is an optional key since it is not applicable to all the cases. for example, when we are doing a hot start up, we cant have a savedInstanceState therefore we report only [APP_ICON, HOT] instead of [APP_ICON, HOT, false].
  • source: The method used to open Fenix. Possible values are `app_icon`, `custom_tab`, `link` or `unknown`. unknown is for startup sources where we can't pinpoint the cause. One UNKNOWN case is the app switcher where we don't know what variables to check to ensure this startup wasn't caused by something else.
  • type: the startup type for opening fenix. the application and HomeActivity either needs to be created or started again. possible values are `cold`, `warm`, `hot` or `error`. Error is for impossible cases. Please file a bug if you see the error case. app created AND HomeActivity created = cold app started AND HomeActivity created = warm app started AND HomeActivity started = hot app created AND HomeActivity started = error Some applications such as gmail launches the default browser in the background. So when we eventually click a link, browser is already started in the background. This means that custom_tab will mostly report `warm` startup type.
|2021-06-01 |2 | | events.app_received_intent |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The system received an Intent for the HomeActivity. An intent is received an external entity wants to the app to display content. Intents can be received when the app is closed – at which point the app will be opened – or when the app is already opened – at which point the already open app will make changes such as loading a url. This can be used loosely as a heuristic for when the user requested to open the app. The HomeActivity encompasses the home screen and browser screen but may include other screens. This differs from the app_opened probe because it measures all startups, not just cold startup. |[1](https://github.com/mozilla-mobile/fenix/pull/11940/), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: The method used to open Fenix. Possible values are `app_icon`, `custom_tab`, `link` or `unknown`
|2021-06-01 | | | events.browser_menu_action |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A browser menu item was tapped |[1](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [2](https://github.com/mozilla-mobile/fenix/pull/5098#issuecomment-529658996), [3](https://github.com/mozilla-mobile/fenix/pull/6310), [4](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • item: A string containing the name of the item the user tapped. These items include: Settings, Help, Desktop Site toggle on/off, Find in Page, New Tab, Private Tab, Share, Report Site Issue, Back/Forward button, Reload Button, Quit, Reader Mode On, Reader Mode Off, Open In app, Add To Top Sites, Add-ons Manager, Bookmarks, History
|2021-04-01 |2 | | events.entered_url |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user entered a url |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • autocomplete: A boolean that tells us whether the URL was autofilled by an Autocomplete suggestion
|2021-04-01 |2 | @@ -109,127 +109,127 @@ The following metrics are added to the ping: | events.search_bar_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the search bar |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: The view the user was on when they initiated the search (For example: `Home` or `Browser`)
|2021-04-01 |2 | | events.tab_counter_menu_action |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A tab counter menu item was tapped |[1](https://github.com/mozilla-mobile/fenix/pull/11533), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • item: A string containing the name of the item the user tapped. These items are: New tab, New private tab, Close tab
|2021-04-01 |2 | | events.whats_new_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the "what's new" page button |[1](https://github.com/mozilla-mobile/fenix/pull/5090), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| find_in_page.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the find in page UI |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010)||2020-11-15 |2 | -| find_in_page.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the find in page UI |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010)||2020-11-15 |2 | -| find_in_page.searched_page |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user searched the page |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010)||2020-11-15 |2 | -| history.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the history screen |[1](https://github.com/mozilla-mobile/fenix/pull/3940)||2020-11-15 |2 | -| history.opened_item |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940)||2020-11-15 |2 | -| history.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940)||2020-11-15 |2 | -| history.removed_all |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed all history items |[1](https://github.com/mozilla-mobile/fenix/pull/3940)||2020-11-15 |2 | -| history.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user shared a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940)||2020-11-15 |2 | +| find_in_page.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the find in page UI |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| find_in_page.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the find in page UI |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| find_in_page.searched_page |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user searched the page |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| history.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the history screen |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| history.opened_item |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| history.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| history.removed_all |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed all history items |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| history.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user shared a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | login_dialog.cancelled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was cancelled |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 | | login_dialog.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 | | login_dialog.never_save |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "never save" button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 | | login_dialog.saved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "save" button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 | -| logins.copy_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user copied a piece of a login in saved logins |[1](https://github.com/mozilla-mobile/fenix/pull/6352)||2020-11-15 |2 | -| logins.delete_saved_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user confirms delete of a saved login |[1](https://github.com/mozilla-mobile/fenix/issues/11208)||2020-11-15 |2 | -| logins.open_individual_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed an individual login in saved logins |[1](https://github.com/mozilla-mobile/fenix/pull/6352)||2020-11-15 |2 | -| logins.open_login_editor |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user entered the edit screen for an individual saved login |[1](https://github.com/mozilla-mobile/fenix/issues/11208)||2020-11-15 |2 | -| logins.open_logins |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed Logins in Settings |[1](https://github.com/mozilla-mobile/fenix/pull/6352)||2020-11-15 |2 | -| logins.save_edited_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user saves changes made to an individual login |[1](https://github.com/mozilla-mobile/fenix/issues/11208)||2020-11-15 |2 | -| logins.save_logins_setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their setting for asking to save logins |[1](https://github.com/mozilla-mobile/fenix/pull/7767)|
  • setting: The new setting for saving logins the user selected. Either `ask_to_save` or `never_save`
|2020-11-15 |2 | -| logins.view_password_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user viewed a password in an individual saved login |[1](https://github.com/mozilla-mobile/fenix/pull/6352)||2020-11-15 |2 | +| logins.copy_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user copied a piece of a login in saved logins |[1](https://github.com/mozilla-mobile/fenix/pull/6352), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| logins.delete_saved_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user confirms delete of a saved login |[1](https://github.com/mozilla-mobile/fenix/issues/11208), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| logins.open_individual_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed an individual login in saved logins |[1](https://github.com/mozilla-mobile/fenix/pull/6352), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| logins.open_login_editor |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user entered the edit screen for an individual saved login |[1](https://github.com/mozilla-mobile/fenix/issues/11208), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| logins.open_logins |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed Logins in Settings |[1](https://github.com/mozilla-mobile/fenix/pull/6352), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| logins.save_edited_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user saves changes made to an individual login |[1](https://github.com/mozilla-mobile/fenix/issues/11208), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| logins.save_logins_setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their setting for asking to save logins |[1](https://github.com/mozilla-mobile/fenix/pull/7767), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • setting: The new setting for saving logins the user selected. Either `ask_to_save` or `never_save`
|2021-08-01 |2 | +| logins.view_password_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user viewed a password in an individual saved login |[1](https://github.com/mozilla-mobile/fenix/pull/6352), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | master_password.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The master password migration dialog was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534)||2021-03-01 |2 | | master_password.migration |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Logins were successfully migrated using a master password. |[1](https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534)||2021-03-01 |2 | -| media_notification.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pause icon on the media notification |[1](https://github.com/mozilla-mobile/fenix/pull/5520)||2020-11-15 |2 | -| media_notification.play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the play icon on the media notification |[1](https://github.com/mozilla-mobile/fenix/pull/5520)||2020-11-15 |2 | -| media_state.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback was paused. |[1](https://github.com/mozilla-mobile/fenix/pull/6463)||2020-11-15 |2 | -| media_state.play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media started playing. |[1](https://github.com/mozilla-mobile/fenix/pull/6463)||2020-11-15 |2 | -| media_state.stop |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback has ended. |[1](https://github.com/mozilla-mobile/fenix/pull/6463)||2020-11-15 |2 | -| onboarding.finish |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user taps starts browsing and ends the onboarding experience. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)||2020-11-15 |2 | -| onboarding.fxa_auto_signin |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding automatic sign in card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)||2020-11-15 |2 | -| onboarding.fxa_manual_signin |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding manual sign in card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)||2020-11-15 |2 | -| onboarding.pref_toggled_private_browsing |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The private browsing preference was selected from the onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)||2020-11-15 |2 | -| onboarding.pref_toggled_theme_picker |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The device theme was chosen using the theme picker onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)|
  • theme: A string that indicates the theme LIGHT, DARK, or FOLLOW DEVICE. Default: FOLLOW DEVICE
|2020-11-15 |2 | -| onboarding.pref_toggled_toolbar_position |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The toolbar position preference was chosen from the onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)|
  • position: A string that indicates the position of the toolbar TOP or BOTTOM. Default: BOTTOM
|2020-11-15 |2 | -| onboarding.pref_toggled_tracking_prot |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tracking protection preference was chosen from the onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)|
  • setting: A string that indicates the Tracking Protection policy STANDARD or STRICT. Default: Toggle ON, STANDARD
|2020-11-15 |2 | -| onboarding.privacy_notice |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding privacy notice card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)||2020-11-15 |2 | -| onboarding.whats_new |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding What\'s New card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867)||2020-11-15 |2 | -| pocket.pocket_top_site_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user clicked on the trending Pocket top site |[1](https://github.com/mozilla-mobile/fenix/pull/8098)||2020-11-15 |2 | -| pocket.pocket_top_site_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed the trending Pocket top site |[1](https://github.com/mozilla-mobile/fenix/pull/8098)||2020-11-15 |2 | -| private_browsing_mode.garbage_icon |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the garbage can icon on the private browsing home page, deleting all private tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-11-15 |2 | -| private_browsing_mode.notification_delete |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification's "Delete and Open" button. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-11-15 |2 | -| private_browsing_mode.notification_open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification's "Open" button. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-11-15 |2 | -| private_browsing_mode.notification_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification itself. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-11-15 |2 | -| private_browsing_mode.snackbar_undo |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "undo" button in the snackbar that is shown when the garbage icon is tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-11-15 |2 | -| private_browsing_shortcut.cfr_add_shortcut |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "Add shortcut" button when the contextual feature recommender appeared. |[1](https://github.com/mozilla-mobile/fenix/pull/5194)||2020-11-15 |2 | -| private_browsing_shortcut.cfr_cancel |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "No thanks" button when the contextual feature recommender appeared. |[1](https://github.com/mozilla-mobile/fenix/pull/5194)||2020-11-15 |2 | -| private_browsing_shortcut.create_shortcut |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "Add private browsing shortcut" button in settings. |[1](https://github.com/mozilla-mobile/fenix/pull/5194)||2020-11-15 |2 | -| private_browsing_shortcut.pinned_shortcut_priv |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pinned private shortcut in Android home screen, opening up a new private search. |[1](https://github.com/mozilla-mobile/fenix/pull/5194)||2020-11-15 |2 | -| private_browsing_shortcut.static_shortcut_priv |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the long-press shortcut "Open new private tab", opening up a new private search. |[1](https://github.com/mozilla-mobile/fenix/pull/5194)||2020-11-15 |2 | -| private_browsing_shortcut.static_shortcut_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the long-press shortcut "Open new tab", opening up a new search. |[1](https://github.com/mozilla-mobile/fenix/pull/5194)||2020-11-15 |2 | +| media_notification.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pause icon on the media notification |[1](https://github.com/mozilla-mobile/fenix/pull/5520), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| media_notification.play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the play icon on the media notification |[1](https://github.com/mozilla-mobile/fenix/pull/5520), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| media_state.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback was paused. |[1](https://github.com/mozilla-mobile/fenix/pull/6463), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| media_state.play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media started playing. |[1](https://github.com/mozilla-mobile/fenix/pull/6463), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| media_state.stop |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback has ended. |[1](https://github.com/mozilla-mobile/fenix/pull/6463), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| onboarding.finish |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user taps starts browsing and ends the onboarding experience. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| onboarding.fxa_auto_signin |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding automatic sign in card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| onboarding.fxa_manual_signin |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding manual sign in card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| onboarding.pref_toggled_private_browsing |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The private browsing preference was selected from the onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| onboarding.pref_toggled_theme_picker |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The device theme was chosen using the theme picker onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • theme: A string that indicates the theme LIGHT, DARK, or FOLLOW DEVICE. Default: FOLLOW DEVICE
|2021-08-01 |2 | +| onboarding.pref_toggled_toolbar_position |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The toolbar position preference was chosen from the onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • position: A string that indicates the position of the toolbar TOP or BOTTOM. Default: BOTTOM
|2021-08-01 |2 | +| onboarding.pref_toggled_tracking_prot |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tracking protection preference was chosen from the onboarding card. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • setting: A string that indicates the Tracking Protection policy STANDARD or STRICT. Default: Toggle ON, STANDARD
|2021-08-01 |2 | +| onboarding.privacy_notice |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding privacy notice card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| onboarding.whats_new |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The onboarding What\'s New card was tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/11867), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| pocket.pocket_top_site_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user clicked on the trending Pocket top site |[1](https://github.com/mozilla-mobile/fenix/pull/8098), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| pocket.pocket_top_site_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed the trending Pocket top site |[1](https://github.com/mozilla-mobile/fenix/pull/8098), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_mode.garbage_icon |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the garbage can icon on the private browsing home page, deleting all private tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/4968), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_mode.notification_delete |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification's "Delete and Open" button. |[1](https://github.com/mozilla-mobile/fenix/pull/4968), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_mode.notification_open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification's "Open" button. |[1](https://github.com/mozilla-mobile/fenix/pull/4968), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_mode.notification_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification itself. |[1](https://github.com/mozilla-mobile/fenix/pull/4968), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_mode.snackbar_undo |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "undo" button in the snackbar that is shown when the garbage icon is tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/4968), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_shortcut.cfr_add_shortcut |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "Add shortcut" button when the contextual feature recommender appeared. |[1](https://github.com/mozilla-mobile/fenix/pull/5194), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_shortcut.cfr_cancel |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "No thanks" button when the contextual feature recommender appeared. |[1](https://github.com/mozilla-mobile/fenix/pull/5194), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_shortcut.create_shortcut |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "Add private browsing shortcut" button in settings. |[1](https://github.com/mozilla-mobile/fenix/pull/5194), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_shortcut.pinned_shortcut_priv |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pinned private shortcut in Android home screen, opening up a new private search. |[1](https://github.com/mozilla-mobile/fenix/pull/5194), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_shortcut.static_shortcut_priv |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the long-press shortcut "Open new private tab", opening up a new private search. |[1](https://github.com/mozilla-mobile/fenix/pull/5194), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| private_browsing_shortcut.static_shortcut_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the long-press shortcut "Open new tab", opening up a new search. |[1](https://github.com/mozilla-mobile/fenix/pull/5194), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | progressive_web_app.background |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user puts the PWA into the background. |[1](https://github.com/mozilla-mobile/fenix/pull/11859)|
  • time_ms: The current time in ms when the PWA was backgrounded.
|2021-03-01 |2 | | progressive_web_app.foreground |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user brings the PWA into the foreground. |[1](https://github.com/mozilla-mobile/fenix/pull/11859)|
  • time_ms: The current time in ms when the PWA was brought to the foreground.
|2021-03-01 |2 | | progressive_web_app.homescreen_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user taps on PWA homescreen icon |[1](https://github.com/mozilla-mobile/fenix/pull/11859)||2021-03-01 |2 | | progressive_web_app.install_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user installs a PWA. Could be a shortcut or added to homescreen. |[1](https://github.com/mozilla-mobile/fenix/pull/11859)||2021-03-01 |2 | -| qr_scanner.navigation_allowed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped "allow" on the prompt, directing the user to the website scanned |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967)||2020-11-15 |2 | -| qr_scanner.navigation_denied |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped "deny" on the prompt, putting the user back to the scanning view |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967)||2020-11-15 |2 | -| qr_scanner.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the QR scanner |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967)||2020-11-15 |2 | -| qr_scanner.prompt_displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user scanned a QR code, causing a confirmation prompt to display asking if they want to navigate to the page |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967)||2020-11-15 |2 | -| reader_mode.appearance |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the appearance button |[1](https://github.com/mozilla-mobile/fenix/pull/3941)||2020-11-15 |2 | -| reader_mode.available |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Reader mode is available for the current page |[1](https://github.com/mozilla-mobile/fenix/pull/3941)||2020-11-15 |2 | -| reader_mode.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed reader mode |[1](https://github.com/mozilla-mobile/fenix/pull/4328)||2020-11-15 |2 | -| reader_mode.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened reader mode |[1](https://github.com/mozilla-mobile/fenix/pull/3941)||2020-11-15 |2 | -| search_shortcuts.selected |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected a search shortcut engine to use |[1](https://github.com/mozilla-mobile/fenix/pull/1202#issuecomment-476870449)|
  • engine: The name of the built-in search engine the user selected as a string
|2020-11-15 | | -| search_suggestions.enable_in_private |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user enabled receiving search suggestions in private sessions |[1](https://github.com/mozilla-mobile/fenix/pull/6746)||2020-11-15 |1, 2 | -| search_widget.new_tab_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed anywhere from the Firefox logo until the start of the microphone icon, opening a new tab search screen. |[1](https://github.com/mozilla-mobile/fenix/pull/4714)||2020-11-15 |2 | -| search_widget.voice_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the microphone icon, opening a new voice search screen. |[1](https://github.com/mozilla-mobile/fenix/pull/4714)||2020-11-15 |2 | -| search_widget_cfr.add_widget_pressed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user pressed the "add widget" button. |[1](https://github.com/mozilla-mobile/fenix/pull/10958)||2020-11-15 |2 | -| search_widget_cfr.canceled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user dismissed the search widget cfr by tapping outside of the prompt |[1](https://github.com/mozilla-mobile/fenix/pull/10958)||2020-11-15 |2 | -| search_widget_cfr.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The search widget cfr was displayed. |[1](https://github.com/mozilla-mobile/fenix/pull/10958)||2020-11-15 |2 | -| search_widget_cfr.not_now_pressed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user pressed the "not now" button. |[1](https://github.com/mozilla-mobile/fenix/pull/10958)||2020-11-15 |2 | -| sync_account.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the sync account page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_account.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the sync account page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_account.send_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user sent the current tab to another FxA device |[1](https://github.com/mozilla-mobile/fenix/pull/5106)||2020-11-15 |2 | -| sync_account.sign_in_to_send_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "sign in to send tab" button inside the share tab menu |[1](https://github.com/mozilla-mobile/fenix/pull/5106)||2020-11-15 |2 | -| sync_account.sync_now |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the sync now button on the sync account page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_auth.auto_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User signed into FxA via an account shared from another locally installed Mozilla application (e.g. Fennec) |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300)||2020-11-15 |1, 2 | -| sync_auth.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the sync page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_auth.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the sync authentication page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_auth.other_external |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User authenticated via FxA using an unknown mechanism. "Known" mechanisms are currently sign-in, sign-up and pairing |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300)||2020-11-15 |1, 2 | -| sync_auth.paired |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User signed into FxA by pairing with a different Firefox browser, using a QR code |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300)||2020-11-15 |1, 2 | -| sync_auth.recovered |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Account manager automatically recovered FxA authentication state without direct user involvement |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300)||2020-11-15 |1, 2 | -| sync_auth.scan_pairing |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the scan pairing button on the sync authentication page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_auth.sign_in |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the sign in button on the sync authentication page and was successfully signed in to FxA |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_auth.sign_out |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the sign out button on the sync account page and was successfully signed out of FxA |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532)||2020-11-15 |2 | -| sync_auth.sign_up |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User registered a new Firefox Account, and was signed into it |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300)||2020-11-15 |1, 2 | -| sync_auth.use_email |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user chose to use their email to sign in instead of scanning a QR code, counterpart to "scan_pairing" |[1](https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844)||2020-11-15 |2 | -| sync_auth.use_email_problem |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user chose to use their email to sign in after an account problem |[1](https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844)||2020-11-15 |2 | -| tab.media_pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pause icon on a tab from the home screen |[1](https://github.com/mozilla-mobile/fenix/pull/5266)||2020-11-15 |2 | -| tab.media_play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the play icon on a tab from the home screen |[1](https://github.com/mozilla-mobile/fenix/pull/5266)||2020-11-15 |2 | -| tabs_tray.close_all_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the close all tabs button in the three dot menu within the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.closed_existing_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed an existing tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.menu_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened three three dot menu in the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.new_private_tab_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a new private tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.new_tab_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a new tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.normal_mode_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user switched to normal mode |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.opened_existing_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened an existing tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.private_mode_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user switched to private mode |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.save_to_collection |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the save to collection button in the three dot menu within the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tabs_tray.share_all_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the share all tabs button in the three dot menu within the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036)||2020-11-15 |2 | -| tip.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tip was closed |[1](https://github.com/mozilla-mobile/fenix/pull/9836)|
  • identifier: The identifier of the tip closed
|2020-11-15 |2 | -| tip.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tip was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/9836)|
  • identifier: The identifier of the tip displayed
|2020-11-15 |2 | -| tip.pressed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tip's button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/9836)|
  • identifier: The identifier of the tip the action was taken on
|2020-11-15 |2 | -| toolbar_settings.changed_position |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user selected a new position for the toolbar |[1](https://github.com/mozilla-mobile/fenix/pull/6608)|
  • position: A string that indicates the new position of the toolbar TOP or BOTTOM
|2020-11-15 |2 | -| top_sites.long_press |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user long pressed on a top site |[1](https://github.com/mozilla-mobile/fenix/pull/15136)|
  • type: The type of top site. Options are: "FRECENCY," "DEFAULT," or "PINNED."
|2021-03-15 |2 | -| top_sites.open_default |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a default top site |[1](https://github.com/mozilla-mobile/fenix/pull/10752)||2020-11-15 |2 | -| top_sites.open_frecency |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a frecency top site |[1](https://github.com/mozilla-mobile/fenix/pull/15136)||2021-03-15 |2 | -| top_sites.open_in_new_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opens a new tab based on a top site item |[1](https://github.com/mozilla-mobile/fenix/pull/7523)||2020-11-15 |2 | -| top_sites.open_in_private_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opens a new private tab based on a top site item |[1](https://github.com/mozilla-mobile/fenix/pull/7523)||2020-11-15 |2 | -| top_sites.open_pinned |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a pinned top site |[1](https://github.com/mozilla-mobile/fenix/pull/15136)||2021-03-15 |2 | -| top_sites.remove |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removes a top site item |[1](https://github.com/mozilla-mobile/fenix/pull/7523)||2020-11-15 |2 | -| top_sites.swipe_carousel |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user swiped to change the page of the top sites carousel |[1](https://github.com/mozilla-mobile/fenix/pull/15136)|
  • page: The page number the carousel is now on
|2021-03-15 |2 | -| tracking_protection.etp_setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their tracking protection level setting to either strict, standard, or custom. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/11383)|
  • etp_setting: The new setting for ETP: strict, standard, custom
|2020-11-15 |2 | -| tracking_protection.etp_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened tracking protection settings through settings. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-11-15 |2 | -| tracking_protection.etp_shield |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the tracking protection shield icon in toolbar. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-11-15 |2 | -| tracking_protection.etp_tracker_list |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed into a list of categorized trackers in tracking protection panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-11-15 |2 | -| tracking_protection.exception_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a tracking protection exception through the TP toggle in the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-11-15 |2 | -| tracking_protection.panel_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened tracking protection settings from the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-11-15 |2 | -| user_specified_search_engines.custom_engine_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a new custom search engine |[1](https://github.com/mozilla-mobile/fenix/pull/6918)||2020-11-15 |2 | -| user_specified_search_engines.custom_engine_deleted |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user deleted a custom search engine |[1](https://github.com/mozilla-mobile/fenix/pull/6918)||2020-11-15 |2 | -| voice_search.tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected the voice search button on the search screen. |[1](https://github.com/mozilla-mobile/fenix/pull/10785)||2020-11-15 |2 | +| qr_scanner.navigation_allowed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped "allow" on the prompt, directing the user to the website scanned |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| qr_scanner.navigation_denied |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped "deny" on the prompt, putting the user back to the scanning view |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| qr_scanner.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the QR scanner |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| qr_scanner.prompt_displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user scanned a QR code, causing a confirmation prompt to display asking if they want to navigate to the page |[1](https://github.com/mozilla-mobile/fenix/pull/2524#issuecomment-492739967), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| reader_mode.appearance |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the appearance button |[1](https://github.com/mozilla-mobile/fenix/pull/3941), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| reader_mode.available |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Reader mode is available for the current page |[1](https://github.com/mozilla-mobile/fenix/pull/3941), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| reader_mode.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed reader mode |[1](https://github.com/mozilla-mobile/fenix/pull/4328), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| reader_mode.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened reader mode |[1](https://github.com/mozilla-mobile/fenix/pull/3941), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search_shortcuts.selected |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected a search shortcut engine to use |[1](https://github.com/mozilla-mobile/fenix/pull/1202#issuecomment-476870449), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • engine: The name of the built-in search engine the user selected as a string
|2021-08-01 | | +| search_suggestions.enable_in_private |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user enabled receiving search suggestions in private sessions |[1](https://github.com/mozilla-mobile/fenix/pull/6746), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| search_widget.new_tab_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed anywhere from the Firefox logo until the start of the microphone icon, opening a new tab search screen. |[1](https://github.com/mozilla-mobile/fenix/pull/4714), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search_widget.voice_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the microphone icon, opening a new voice search screen. |[1](https://github.com/mozilla-mobile/fenix/pull/4714), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search_widget_cfr.add_widget_pressed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user pressed the "add widget" button. |[1](https://github.com/mozilla-mobile/fenix/pull/10958), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search_widget_cfr.canceled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user dismissed the search widget cfr by tapping outside of the prompt |[1](https://github.com/mozilla-mobile/fenix/pull/10958), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search_widget_cfr.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The search widget cfr was displayed. |[1](https://github.com/mozilla-mobile/fenix/pull/10958), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search_widget_cfr.not_now_pressed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user pressed the "not now" button. |[1](https://github.com/mozilla-mobile/fenix/pull/10958), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_account.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the sync account page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_account.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the sync account page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_account.send_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user sent the current tab to another FxA device |[1](https://github.com/mozilla-mobile/fenix/pull/5106), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_account.sign_in_to_send_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "sign in to send tab" button inside the share tab menu |[1](https://github.com/mozilla-mobile/fenix/pull/5106), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_account.sync_now |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the sync now button on the sync account page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.auto_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User signed into FxA via an account shared from another locally installed Mozilla application (e.g. Fennec) |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| sync_auth.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the sync page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the sync authentication page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.other_external |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User authenticated via FxA using an unknown mechanism. "Known" mechanisms are currently sign-in, sign-up and pairing |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| sync_auth.paired |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User signed into FxA by pairing with a different Firefox browser, using a QR code |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| sync_auth.recovered |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Account manager automatically recovered FxA authentication state without direct user involvement |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| sync_auth.scan_pairing |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the scan pairing button on the sync authentication page |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.sign_in |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the sign in button on the sync authentication page and was successfully signed in to FxA |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.sign_out |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the sign out button on the sync account page and was successfully signed out of FxA |[1](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.sign_up |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User registered a new Firefox Account, and was signed into it |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| sync_auth.use_email |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user chose to use their email to sign in instead of scanning a QR code, counterpart to "scan_pairing" |[1](https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.use_email_problem |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user chose to use their email to sign in after an account problem |[1](https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tab.media_pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pause icon on a tab from the home screen |[1](https://github.com/mozilla-mobile/fenix/pull/5266), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tab.media_play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the play icon on a tab from the home screen |[1](https://github.com/mozilla-mobile/fenix/pull/5266), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.close_all_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the close all tabs button in the three dot menu within the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.closed_existing_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed an existing tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.menu_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened three three dot menu in the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.new_private_tab_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a new private tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.new_tab_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a new tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.normal_mode_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user switched to normal mode |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.opened_existing_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened an existing tab |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.private_mode_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user switched to private mode |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.save_to_collection |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the save to collection button in the three dot menu within the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs_tray.share_all_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the share all tabs button in the three dot menu within the tabs tray |[1](https://github.com/mozilla-mobile/fenix/pull/12036), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tip.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tip was closed |[1](https://github.com/mozilla-mobile/fenix/pull/9836), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • identifier: The identifier of the tip closed
|2021-08-01 |2 | +| tip.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tip was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/9836), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • identifier: The identifier of the tip displayed
|2021-08-01 |2 | +| tip.pressed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tip's button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/9836), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • identifier: The identifier of the tip the action was taken on
|2021-08-01 |2 | +| toolbar_settings.changed_position |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user selected a new position for the toolbar |[1](https://github.com/mozilla-mobile/fenix/pull/6608), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • position: A string that indicates the new position of the toolbar TOP or BOTTOM
|2021-08-01 |2 | +| top_sites.long_press |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user long pressed on a top site |[1](https://github.com/mozilla-mobile/fenix/pull/15136), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • type: The type of top site. Options are: "FRECENCY," "DEFAULT," or "PINNED."
|2021-08-01 |2 | +| top_sites.open_default |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a default top site |[1](https://github.com/mozilla-mobile/fenix/pull/10752), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.open_frecency |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a frecency top site |[1](https://github.com/mozilla-mobile/fenix/pull/15136), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.open_in_new_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opens a new tab based on a top site item |[1](https://github.com/mozilla-mobile/fenix/pull/7523), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.open_in_private_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opens a new private tab based on a top site item |[1](https://github.com/mozilla-mobile/fenix/pull/7523), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.open_pinned |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a pinned top site |[1](https://github.com/mozilla-mobile/fenix/pull/15136), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.remove |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removes a top site item |[1](https://github.com/mozilla-mobile/fenix/pull/7523), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.swipe_carousel |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user swiped to change the page of the top sites carousel |[1](https://github.com/mozilla-mobile/fenix/pull/15136), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • page: The page number the carousel is now on
|2021-08-01 |2 | +| tracking_protection.etp_setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their tracking protection level setting to either strict, standard, or custom. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/11383), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)|
  • etp_setting: The new setting for ETP: strict, standard, custom
|2021-08-01 |2 | +| tracking_protection.etp_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened tracking protection settings through settings. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tracking_protection.etp_shield |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the tracking protection shield icon in toolbar. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tracking_protection.etp_tracker_list |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed into a list of categorized trackers in tracking protection panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tracking_protection.exception_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a tracking protection exception through the TP toggle in the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tracking_protection.panel_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened tracking protection settings from the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| user_specified_search_engines.custom_engine_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a new custom search engine |[1](https://github.com/mozilla-mobile/fenix/pull/6918), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| user_specified_search_engines.custom_engine_deleted |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user deleted a custom search engine |[1](https://github.com/mozilla-mobile/fenix/pull/6918), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| voice_search.tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected the voice search button on the search screen. |[1](https://github.com/mozilla-mobile/fenix/pull/10785), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | ## first-session @@ -251,11 +251,11 @@ The following metrics are added to the ping: | Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) | | --- | --- | --- | --- | --- | --- | --- | -| first_session.adgroup |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the AdGroup that was used to source this installation. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586480836)||2020-11-15 |1, 2 | -| first_session.campaign |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the campaign that is responsible for this installation. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202)||2020-11-15 |1, 2 | -| first_session.creative |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The identifier of the creative material that the user interacted with. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202)||2020-11-15 |1, 2 | -| first_session.network |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the Network that sourced this installation. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202)||2020-11-15 |1, 2 | -| first_session.timestamp |[datetime](https://mozilla.github.io/glean/book/user/metrics/datetime.html) |The Glean generated date and time of the installation. This is unique per app install, though the rest of the data in this ping is from Adjust and will remain static across installs. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202)||2020-11-15 |1, 2 | +| first_session.adgroup |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the AdGroup that was used to source this installation. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586480836), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| first_session.campaign |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the campaign that is responsible for this installation. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| first_session.creative |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The identifier of the creative material that the user interacted with. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| first_session.network |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the Network that sourced this installation. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| first_session.timestamp |[datetime](https://mozilla.github.io/glean/book/user/metrics/datetime.html) |The Glean generated date and time of the installation. This is unique per app install, though the rest of the data in this ping is from Adjust and will remain static across installs. |[1](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | ## metrics @@ -271,26 +271,26 @@ The following metrics are added to the ping: | addons.has_enabled_addons |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Whether or not the user has enabled add-ons on the device. |[1](https://github.com/mozilla-mobile/fenix/pull/8318), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | addons.has_installed_addons |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Whether or not the user has installed add-ons on the device. |[1](https://github.com/mozilla-mobile/fenix/pull/8318), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | addons.installed_addons |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |A list of all installed add-ons on the device. |[1](https://github.com/mozilla-mobile/fenix/pull/11080), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| browser.search.ad_clicks |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records clicks of adverts on SERP pages. The key format is ‘’. |[1](https://github.com/mozilla-mobile/fenix/pull/10112)||2020-11-15 |2 | -| browser.search.in_content |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records the type of interaction a user has on SERP pages. |[1](https://github.com/mozilla-mobile/fenix/pull/10167)||2020-11-15 |2 | -| browser.search.with_ads |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records counts of SERP pages with adverts displayed. The key format is ‘’. |[1](https://github.com/mozilla-mobile/fenix/pull/10112)||2020-11-15 |2 | -| events.total_uri_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter of URIs visited by the user in the current session, including page reloads. This does not include background page requests and URIs from embedded pages or private browsing but may be incremented without user interaction by website scripts that programmatically redirect to a new location. |[1](https://github.com/mozilla-mobile/fenix/pull/1785), [2](https://github.com/mozilla-mobile/fenix/pull/8314)||2020-11-15 |2 | -| metrics.adjust_ad_group |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust ad group ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253)||2020-11-15 |2 | -| metrics.adjust_campaign |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust campaign ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/5579)||2020-11-15 |1 | -| metrics.adjust_creative |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust creative ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253)||2020-11-15 |2 | -| metrics.adjust_network |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust network ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253)||2020-11-15 |2 | -| metrics.default_browser |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Is Fenix the default browser? |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673)||2020-11-15 |2 | -| metrics.default_moz_browser |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the default browser on device if and only if it's a Mozilla owned product |[1](https://github.com/mozilla-mobile/fenix/pull/1953/), [2](https://github.com/mozilla-mobile/fenix/pull/5216)||2020-11-15 |1, 2 | -| metrics.has_open_tabs |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has any open NORMAL tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/12024)||2020-11-15 |2 | -| metrics.has_recent_pwas |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has recently used PWAs. See recently_used_pwa_count for the actual count. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817)||2020-12-01 |2 | -| metrics.has_top_sites |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has top sites |[1](https://github.com/mozilla-mobile/fenix/pull/9556)||2020-11-15 |2 | -| metrics.mozilla_products |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |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, Fenix, Focus, and Lockwise. |[1](https://github.com/mozilla-mobile/fenix/pull/1953/), [2](https://github.com/mozilla-mobile/fenix/pull/5216)||2020-11-15 |1, 2 | -| metrics.recently_used_pwa_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many PWAs a user has recently used. Threshold for "recency" set in HomeActivity#PWA_RECENTLY_USED_THRESHOLD. Currently we are not told by the OS when a PWA is removed by the user, so we use the "recently used" heuristic to judge how many PWAs are still active, as a proxy for "installed". This value will only be set if the user has at least *one* recently used PWA. If they have 0, this metric will not be sent, resulting in a null value during analysis on the server-side. To disambiguate between a failed `recently_used_pwa_count` metric and 0 recent PWAs, please see `has_recent_pwas`. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817)||2020-12-01 |2 | -| metrics.search_count |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |The labels for this counter are `.`. If the search engine is bundled with Fenix `search-engine-name` will be the name of the search engine. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be `custom`. `source` will be: `action`, `suggestion`, `widget` or `shortcut` (depending on the source from which the search started). Also added the `other` option for the source but it should never enter on this case. |[1](https://github.com/mozilla-mobile/fenix/pull/1677), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/7310)||2020-11-15 |1, 2 | -| metrics.search_widget_installed |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Whether or not the search widget is installed |[1](https://github.com/mozilla-mobile/fenix/pull/10958)||2020-11-15 |2 | -| metrics.tabs_open_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many NORMAL tabs a user has open. This value will only be set if the user has at least *one* open tab. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `tabs_open_count` ping and 0 open tabs, please see `has_open_tabs`. |[1](https://github.com/mozilla-mobile/fenix/pull/12024)||2020-11-15 |2 | -| metrics.toolbar_position |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the new position of the toolbar TOP or BOTTOM |[1](https://github.com/mozilla-mobile/fenix/pull/6608)||2020-11-15 |2 | -| metrics.top_sites_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many top sites a user has. This value will only be set if the user has at least *one* top site. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `top_sites_count` ping and 0 top sites, please see `has_top_sites`. |[1](https://github.com/mozilla-mobile/fenix/pull/9556)||2020-11-15 |2 | +| browser.search.ad_clicks |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records clicks of adverts on SERP pages. The key format is ‘’. |[1](https://github.com/mozilla-mobile/fenix/pull/10112), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| browser.search.in_content |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records the type of interaction a user has on SERP pages. |[1](https://github.com/mozilla-mobile/fenix/pull/10167), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| browser.search.with_ads |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records counts of SERP pages with adverts displayed. The key format is ‘’. |[1](https://github.com/mozilla-mobile/fenix/pull/10112), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| events.total_uri_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter of URIs visited by the user in the current session, including page reloads. This does not include background page requests and URIs from embedded pages or private browsing but may be incremented without user interaction by website scripts that programmatically redirect to a new location. |[1](https://github.com/mozilla-mobile/fenix/pull/1785), [2](https://github.com/mozilla-mobile/fenix/pull/8314), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.adjust_ad_group |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust ad group ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.adjust_campaign |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust campaign ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/5579), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | +| metrics.adjust_creative |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust creative ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.adjust_network |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust network ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.default_browser |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Is Fenix the default browser? |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.default_moz_browser |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the default browser on device if and only if it's a Mozilla owned product |[1](https://github.com/mozilla-mobile/fenix/pull/1953/), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| metrics.has_open_tabs |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has any open NORMAL tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/12024), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.has_recent_pwas |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has recently used PWAs. See recently_used_pwa_count for the actual count. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.has_top_sites |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has top sites |[1](https://github.com/mozilla-mobile/fenix/pull/9556), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.mozilla_products |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |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, Fenix, Focus, and Lockwise. |[1](https://github.com/mozilla-mobile/fenix/pull/1953/), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| metrics.recently_used_pwa_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many PWAs a user has recently used. Threshold for "recency" set in HomeActivity#PWA_RECENTLY_USED_THRESHOLD. Currently we are not told by the OS when a PWA is removed by the user, so we use the "recently used" heuristic to judge how many PWAs are still active, as a proxy for "installed". This value will only be set if the user has at least *one* recently used PWA. If they have 0, this metric will not be sent, resulting in a null value during analysis on the server-side. To disambiguate between a failed `recently_used_pwa_count` metric and 0 recent PWAs, please see `has_recent_pwas`. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.search_count |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |The labels for this counter are `.`. If the search engine is bundled with Fenix `search-engine-name` will be the name of the search engine. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be `custom`. `source` will be: `action`, `suggestion`, `widget` or `shortcut` (depending on the source from which the search started). Also added the `other` option for the source but it should never enter on this case. |[1](https://github.com/mozilla-mobile/fenix/pull/1677), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/7310), [4](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| metrics.search_widget_installed |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Whether or not the search widget is installed |[1](https://github.com/mozilla-mobile/fenix/pull/10958), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.tabs_open_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many NORMAL tabs a user has open. This value will only be set if the user has at least *one* open tab. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `tabs_open_count` ping and 0 open tabs, please see `has_open_tabs`. |[1](https://github.com/mozilla-mobile/fenix/pull/12024), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.toolbar_position |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the new position of the toolbar TOP or BOTTOM |[1](https://github.com/mozilla-mobile/fenix/pull/6608), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.top_sites_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many top sites a user has. This value will only be set if the user has at least *one* top site. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `top_sites_count` ping and 0 top sites, please see `has_top_sites`. |[1](https://github.com/mozilla-mobile/fenix/pull/9556), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | perf.awesomebar.bookmark_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a bookmarks awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | | perf.awesomebar.clipboard_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a clipboard awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | | perf.awesomebar.history_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a history awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | @@ -298,26 +298,26 @@ The following metrics are added to the ping: | perf.awesomebar.session_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a session awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | | perf.awesomebar.shortcuts_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a shortcuts awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | | perf.awesomebar.synced_tabs_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a synced tabs awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | -| preferences.accessibility_services |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has touch exploration or switch services enabled. These are built into the Android OS, not Fenix prefs. default: "" |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.open_links_in_a_private_tab |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled open links in a private tab. default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.open_links_in_app |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has the open links in apps feature enabled. default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11446)||2020-11-15 |2 | -| preferences.remote_debugging |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has remote debugging enabled default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.search_bookmarks |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled bookmark search suggestions default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.search_browsing_history |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled browsing history suggestions. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.search_suggestions_private |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled showing search suggestions in private mode. default: false (we prompt the user, asking them to make a selection) |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.show_clipboard_suggestions |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled clipboard search suggestions. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.show_search_shortcuts |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled search shortcuts. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.show_search_suggestions |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has search suggestions enabled default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.show_voice_search |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled the voice search button. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.sync |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user is signed into FxA default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.sync_items |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |The list of items the user has chosen to sync with FxA. default: "" if the user is signed out. Otherwise defaults to whatever is set in their FxA account. New accounts set: [bookmarks, history, passwords, tabs] |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.telemetry |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has telemetry enabled. Note we should never receive a "false" value for this since telemetry would not send in that case. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.theme |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |The theme the user has enabled. "light," "dark," "system," or "battery" default: "system" for API 28+, else "light" |[1](https://github.com/mozilla-mobile/fenix/pull/11446)||2020-11-15 |2 | -| preferences.toolbar_position |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |The position of the toolbar default: bottom (defaults to top if the user has accessibility services) |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| preferences.tracking_protection |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |What type of enhanced tracking protection the user has enabled. "standard," "strict," "custom," or "" (if disabled) default: "standard" |[1](https://github.com/mozilla-mobile/fenix/pull/11211)||2020-11-15 |2 | -| search.default_engine.code |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be the search engine identifier. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216)||2020-11-15 |1, 2 | -| search.default_engine.name |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be the search engine name. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216)||2020-11-15 |1, 2 | -| search.default_engine.submission_url |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |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. For example: https://mysearchengine.com/?query=%s. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216)||2020-11-15 |1, 2 | +| preferences.accessibility_services |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has touch exploration or switch services enabled. These are built into the Android OS, not Fenix prefs. default: "" |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.open_links_in_a_private_tab |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled open links in a private tab. default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.open_links_in_app |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has the open links in apps feature enabled. default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11446), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.remote_debugging |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has remote debugging enabled default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.search_bookmarks |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled bookmark search suggestions default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.search_browsing_history |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled browsing history suggestions. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.search_suggestions_private |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled showing search suggestions in private mode. default: false (we prompt the user, asking them to make a selection) |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.show_clipboard_suggestions |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled clipboard search suggestions. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.show_search_shortcuts |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled search shortcuts. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.show_search_suggestions |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has search suggestions enabled default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.show_voice_search |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has enabled the voice search button. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.sync |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user is signed into FxA default: false |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.sync_items |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |The list of items the user has chosen to sync with FxA. default: "" if the user is signed out. Otherwise defaults to whatever is set in their FxA account. New accounts set: [bookmarks, history, passwords, tabs] |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.telemetry |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |Whether or not the user has telemetry enabled. Note we should never receive a "false" value for this since telemetry would not send in that case. default: true |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.theme |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |The theme the user has enabled. "light," "dark," "system," or "battery" default: "system" for API 28+, else "light" |[1](https://github.com/mozilla-mobile/fenix/pull/11446), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.toolbar_position |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |The position of the toolbar default: bottom (defaults to top if the user has accessibility services) |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| preferences.tracking_protection |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |What type of enhanced tracking protection the user has enabled. "standard," "strict," "custom," or "" (if disabled) default: "standard" |[1](https://github.com/mozilla-mobile/fenix/pull/11211), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| search.default_engine.code |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be the search engine identifier. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| search.default_engine.name |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be the search engine name. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| search.default_engine.submission_url |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |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. For example: https://mysearchengine.com/?query=%s. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | | storage.stats.app_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of the app's APK and related files as installed: this is expected to be larger than download size. This is the output of [StorageStats.getAppBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getAppBytes()) so see that for details. This value is only available on Android 8+. A similar value may be available on the Google Play dashboard: we can use this value to see if that value is reliable enough. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 | | storage.stats.cache_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of all cached data in the app. This is the output of [StorageStats.getCacheBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getCacheBytes()) so see that for details. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 | | storage.stats.data_dir_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of all data minus `cache_bytes`. This is the output of [StorageStats.getDataBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getDataBytes()) except we subtract the value of `cache_bytes` so the cache is not measured redundantly; see that method for details. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 | @@ -344,10 +344,10 @@ The following metrics are added to the ping: | Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) | | --- | --- | --- | --- | --- | --- | --- | -| startup.timeline.clock_ticks_per_second |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |The number of clock tick time units that occur in one second on this particular device. This value is expected to be used in conjunction with the `framework_start` metric. |[1](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626)||2020-11-15 |1 | -| startup.timeline.framework_start |[timespan](https://mozilla.github.io/glean/book/user/metrics/timespan.html) |The duration the Android framework takes to start before letting us run code in `*Application.init`. This is calculated from `appInitTimestamp - processStartTimestamp`. `processStartTimestamp` is derived from the clock tick time unit, which is expected to be less granular than nanoseconds. Therefore, we convert and round our timestamps to clock ticks before computing the difference and convert back to nanoseconds to report. For debugging purposes, `clock_ticks_per_second`, which may vary between devices, is also reported as a metric |[1](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626)||2020-11-15 |1 | -| startup.timeline.framework_start_error |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |An error when attempting to record `framework_start` - the application init timestamp returned a negative value - which is likely indicative of a bug in the implementation. |[1](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626)||2020-11-15 |1 | -| startup.timeline.framework_start_read_error |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |An error when attempting to read stats from /proc pseudo-filesystem - privacy managers can block access to reading these files - the application will catch a file reading exception. |[1](https://github.com/mozilla-mobile/fenix/pull/10481)||2020-11-15 |1 | +| startup.timeline.clock_ticks_per_second |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |The number of clock tick time units that occur in one second on this particular device. This value is expected to be used in conjunction with the `framework_start` metric. |[1](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | +| startup.timeline.framework_start |[timespan](https://mozilla.github.io/glean/book/user/metrics/timespan.html) |The duration the Android framework takes to start before letting us run code in `*Application.init`. This is calculated from `appInitTimestamp - processStartTimestamp`. `processStartTimestamp` is derived from the clock tick time unit, which is expected to be less granular than nanoseconds. Therefore, we convert and round our timestamps to clock ticks before computing the difference and convert back to nanoseconds to report. For debugging purposes, `clock_ticks_per_second`, which may vary between devices, is also reported as a metric |[1](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | +| startup.timeline.framework_start_error |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |An error when attempting to record `framework_start` - the application init timestamp returned a negative value - which is likely indicative of a bug in the implementation. |[1](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | +| startup.timeline.framework_start_read_error |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |An error when attempting to read stats from /proc pseudo-filesystem - privacy managers can block access to reading these files - the application will catch a file reading exception. |[1](https://github.com/mozilla-mobile/fenix/pull/10481), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | Data categories are [defined here](https://wiki.mozilla.org/Firefox/Data_Collection). diff --git a/l10n.toml b/l10n.toml index cb946c589..6c3cd22a4 100644 --- a/l10n.toml +++ b/l10n.toml @@ -86,6 +86,7 @@ locales = [ "te", "tg", "th", + "tl", "tr", "trs", "uk", diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetConsoleReport.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetConsoleReport.kt index 8bd04971b..8266688bf 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetConsoleReport.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetConsoleReport.kt @@ -1,13 +1,21 @@ +/* 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.detektrules import io.gitlab.arturbosch.detekt.api.ConsoleReport import io.gitlab.arturbosch.detekt.api.Detektion +/** + * A reporter that custom formats violations of our custom lint rules. + */ class CustomRulesetConsoleReport : ConsoleReport() { - @Suppress("DEPRECATION") + @Suppress("DEPRECATION") // locationAsString override fun render(detektion: Detektion): String? { - return detektion.findings["mozilla-detekt-rules"]?.fold("") { output, finding -> - output + finding.locationAsString + ": " + finding.messageOrDescription() + return detektion.findings["mozilla-detekt-rules"]?.fold("") { accumulator, finding -> + accumulator + "${finding.id}:\n ${finding.locationAsString}\n ${finding.messageOrDescription()}\n\n" + // This creates an extra newline at the very end but it's not worth fixing. } } } \ No newline at end of file diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt index 1a4c0f67e..509b4efe8 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt @@ -15,6 +15,7 @@ class CustomRulesetProvider : RuleSetProvider { ruleSetId, listOf( MozillaBannedPropertyAccess(config), + MozillaStrictModeSuppression(config), MozillaCorrectUnitTestRunner(config) ) ) diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaStrictModeSuppression.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaStrictModeSuppression.kt new file mode 100644 index 000000000..d2e89a335 --- /dev/null +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaStrictModeSuppression.kt @@ -0,0 +1,71 @@ +/* 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.detektrules + +import io.gitlab.arturbosch.detekt.api.CodeSmell +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.Debt +import io.gitlab.arturbosch.detekt.api.Entity +import io.gitlab.arturbosch.detekt.api.Issue +import io.gitlab.arturbosch.detekt.api.Rule +import io.gitlab.arturbosch.detekt.api.Severity +import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtImportDirective + +private const val VIOLATION_MSG = "Please use `components.strictMode.resetAfter` instead because it has " + + "performance improvements and additional code to monitor for performance regressions." + +/** + * A check to prevent us from working around mechanisms we implemented to prevent suppressing StrictMode. + * + * IF YOU UPDATE THIS FILE NAME, UPDATE CODE OWNERS. + */ +class MozillaStrictModeSuppression(config: Config) : Rule(config) { + override val issue = Issue( + "MozillaStrictModeSuppression", + Severity.Performance, + "Prevents us from working around mechanisms we implemented to prevent suppressing StrictMode", + Debt.TEN_MINS + ) + + override fun visitImportDirective(importDirective: KtImportDirective) { + super.visitImportDirective(importDirective) + reportIfImportAcResetAfter(importDirective) + } + + override fun visitCallExpression(expression: KtCallExpression) { + super.visitCallExpression(expression) + reportIfCallStrictModeSetPolicy(expression) + } + + private fun reportIfImportAcResetAfter(importDirective: KtImportDirective) { + if (importDirective.importPath?.toString() == "mozilla.components.support.ktx.android.os.resetAfter") { + report(CodeSmell(issue, Entity.from(importDirective), VIOLATION_MSG)) + } + } + + private fun reportIfCallStrictModeSetPolicy(expression: KtCallExpression) { + // There is probably a more correct way of doing this but this API is not well documented + // so it's not worth our time, I think. + val receiver = expression.parent?.firstChild?.node?.chars + val calledMethod = expression.calleeExpression?.firstChild?.node?.chars + + // This won't catch if setVmPolicy is imported directly. However, this is unlikely so let's + // not handle it now. Maybe we can add it when we add tests for this file. + if (receiver == "StrictMode") { + val violationMsg = when (calledMethod) { + "setThreadPolicy" -> VIOLATION_MSG + "setVmPolicy" -> "NOT YET IMPLEMENTED: please consult the perf team about implementing" + + "`StrictModeManager.resetAfter`: we want to understand the performance implications " + + "of suppressing setVmPolicy before allowing it." + else -> null + } + + violationMsg?.let { msg -> + report(CodeSmell(issue, Entity.from(expression), msg)) + } + } + } +} diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt index c96f3a8e9..2af4dedb0 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt @@ -58,7 +58,7 @@ class ButtonStyleXmlDetector : ResourceXmlDetector() { context.report( issue = ISSUE_XML_STYLE, scope = element, - location = context.getLocation(element), + location = context.getElementLocation(element), message = ERROR_MESSAGE ) } diff --git a/taskcluster/ci/browsertime/kind.yml b/taskcluster/ci/browsertime/kind.yml index 6eeab0fa8..a9fc5191e 100644 --- a/taskcluster/ci/browsertime/kind.yml +++ b/taskcluster/ci/browsertime/kind.yml @@ -244,3 +244,24 @@ jobs: armeabi-v7a: - '--test-url-params=exclude=1,2,9,10,17,18,21,22,26,28,30,32,39,40,47,48,55,56,63,64,71,72,79,80,83,84,89,90,95,96' default: [] + + youtube-playback-av1-sfr: + description: "Raptor YouTube Playback AV1 SFR on Fenix" + test-name: youtube-playback-av1-sfr + run-visual-metrics: False + treeherder: + symbol: 'Btime(ytp-av1-sfr)' + + youtube-playback-h264-sfr: + description: "Raptor YouTube Playback H264 SFR on Fenix" + test-name: youtube-playback-h264-sfr + run-visual-metrics: False + treeherder: + symbol: Btime(ytp-h264-sfr) + + youtube-playback-vp9-sfr: + description: "Raptor YouTube Playback VP9 SFR on Fenix" + run-visual-metrics: False + test-name: youtube-playback-vp9-sfr + treeherder: + symbol: Btime(ytp-vp9-sfr) diff --git a/taskcluster/ci/github-release/kind.yml b/taskcluster/ci/github-release/kind.yml index 262061c66..8d7df3941 100644 --- a/taskcluster/ci/github-release/kind.yml +++ b/taskcluster/ci/github-release/kind.yml @@ -10,9 +10,6 @@ transforms: - taskgraph.transforms.task:transforms kind-dependencies: - # To work around a race condition where if this runs before - # push-apk, push-apk fails to verify chain of trust - - push-apk - signing primary-dependency: signing