diff --git a/.github/workflows/build-contributor-pr.yml b/.github/workflows/build-contributor-pr.yml index b966cb796..e890fa5bc 100644 --- a/.github/workflows/build-contributor-pr.yml +++ b/.github/workflows/build-contributor-pr.yml @@ -3,7 +3,7 @@ on: [pull_request] jobs: run-build: runs-on: ubuntu-20.04 - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz' steps: - name: Checkout repository uses: actions/checkout@v2 @@ -21,7 +21,8 @@ jobs: run-testDebugUnitTest: runs-on: ubuntu-20.04 - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz' + steps: - name: Checkout repository uses: actions/checkout@v2 @@ -39,7 +40,8 @@ jobs: run-detekt: runs-on: ubuntu-20.04 - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz' + steps: - name: Checkout repository uses: actions/checkout@v2 @@ -62,7 +64,8 @@ jobs: run-ktlint: runs-on: ubuntu-20.04 - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz' + steps: - name: Checkout repository uses: actions/checkout@v2 @@ -80,7 +83,8 @@ jobs: run-lintDebug: runs-on: ubuntu-20.04 - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz' + steps: - name: Checkout repository uses: actions/checkout@v2 diff --git a/app/build.gradle b/app/build.gradle index 13507c0b3..635073f9a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -513,6 +513,7 @@ dependencies { implementation Deps.mozilla_feature_accounts implementation Deps.mozilla_feature_app_links + implementation Deps.mozilla_feature_autofill implementation Deps.mozilla_feature_awesomebar implementation Deps.mozilla_feature_contextmenu implementation Deps.mozilla_feature_customtabs @@ -544,6 +545,7 @@ dependencies { implementation Deps.mozilla_feature_webcompat_reporter implementation Deps.mozilla_service_digitalassetlinks + implementation Deps.mozilla_service_sync_autofill implementation Deps.mozilla_service_sync_logins implementation Deps.mozilla_service_firefox_accounts implementation Deps.mozilla_service_glean diff --git a/app/metrics.yaml b/app/metrics.yaml index d2c763aca..2e311c746 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -117,12 +117,13 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - telemetry-client-dev@mozilla.com - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" search_bar_tapped: type: event description: | @@ -137,11 +138,12 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" entered_url: type: event description: | @@ -156,11 +158,12 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" performed_search: type: event description: | @@ -181,11 +184,12 @@ events: - https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673 - https://github.com/mozilla-mobile/fenix/pull/1677 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" browser_menu_action: type: event description: | @@ -207,11 +211,12 @@ events: - https://github.com/mozilla-mobile/fenix/pull/5098#issuecomment-529658996 - https://github.com/mozilla-mobile/fenix/pull/6310 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" total_uri_count: type: counter description: | @@ -304,11 +309,12 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5090 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" opened_link: type: event description: | @@ -324,11 +330,12 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/5975 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" tab_counter_menu_action: type: event description: @@ -345,11 +352,12 @@ events: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11533 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" synced_tab_opened: type: event description: > @@ -577,11 +585,12 @@ crash_reporter: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" closed: type: event description: | @@ -596,11 +605,12 @@ crash_reporter: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" context_menu: item_tapped: @@ -623,11 +633,12 @@ context_menu: - https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 - https://github.com/mozilla-mobile/fenix/issues/16076#issuecomment-726216734 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" login_dialog: displayed: @@ -1545,6 +1556,19 @@ search.default_engine: expires: "2021-08-01" bookmarks_management: + open: + type: event + description: | + A user opened a bookmark. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18173 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18174 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2022-08-01" open_in_new_tab: type: event description: | @@ -1554,11 +1578,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" open_in_new_tabs: type: event description: | @@ -1568,11 +1593,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" open_in_private_tab: type: event description: | @@ -1582,11 +1608,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" open_in_private_tabs: type: event description: | @@ -1596,11 +1623,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" edited: type: event description: | @@ -1610,11 +1638,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" moved: type: event description: | @@ -1624,11 +1653,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" removed: type: event description: | @@ -1638,11 +1668,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" multi_removed: type: event description: | @@ -1652,11 +1683,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" shared: type: event description: | @@ -1666,11 +1698,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" copied: type: event description: | @@ -1680,11 +1713,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" folder_add: type: event description: | @@ -1694,11 +1728,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1708 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" folder_remove: type: event description: | @@ -1708,11 +1743,12 @@ bookmarks_management: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3724 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" custom_tab: closed: @@ -1724,11 +1760,12 @@ custom_tab: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1697 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" action_button: type: event description: | @@ -1738,11 +1775,12 @@ custom_tab: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1697 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" menu: type: event description: | @@ -1752,11 +1790,12 @@ custom_tab: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1697 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" activation: identifier: @@ -1773,11 +1812,12 @@ activation: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - highly_sensitive notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" activation_id: type: uuid lifetime: user @@ -1791,11 +1831,12 @@ activation: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - highly_sensitive notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" no_lint: - USER_LIFETIME_EXPIRATION @@ -1812,11 +1853,12 @@ error_page: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/2491#issuecomment-492414486 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" sync_auth: opened: @@ -2104,15 +2146,66 @@ history: description: | A user opened a history item bugs: - - https://github.com/mozilla-mobile/fenix/issues/2362 + - https://github.com/mozilla-mobile/fenix/issues/18178 data_reviews: - - https://github.com/mozilla-mobile/fenix/pull/3940 - - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 + - https://github.com/mozilla-mobile/fenix/pull/18261 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-08-01" + expires: "2022-08-01" + opened_item_in_new_tab: + type: event + description: | + A user opened a history item in a new tab + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18178 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18261 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2022-08-01" + opened_items_in_new_tabs: + type: event + description: | + A user opened multiple history items in new tabs + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18178 + data_reviews: + - https://gith ub.com/mozilla-mobile/fenix/pull/18261 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2022-08-01" + opened_item_in_private_tab: + type: event + description: | + A user opened a history item in a private tab + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18178 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18261 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2022-08-01" + opened_items_in_private_tabs: + type: event + description: | + A user opened multiple history items in private tabs + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18178 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18261 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2022-08-01" tip: displayed: @@ -2437,12 +2530,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" tab_restored: type: event description: | @@ -2452,12 +2546,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" all_tabs_restored: type: event description: | @@ -2467,12 +2562,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" tab_removed: type: event description: | @@ -2482,12 +2578,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" shared: type: event description: | @@ -2497,12 +2594,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" removed: type: event description: | @@ -2512,12 +2610,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" saved: type: event description: | @@ -2532,12 +2631,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" tabs_added: type: event description: | @@ -2552,12 +2652,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" tab_select_opened: type: event description: | @@ -2568,12 +2669,13 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/3935 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - technical - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" add_tab_button: type: event description: | @@ -2583,11 +2685,12 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4358 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" long_press: type: event description: | @@ -2597,11 +2700,12 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4358 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" save_button: type: event description: | @@ -2613,11 +2717,12 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4358 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" extra_keys: from_screen: description: | @@ -2632,11 +2737,12 @@ collections: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/4539 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" search_widget: new_tab_button: @@ -2711,11 +2817,12 @@ contextual_hint.tracking_protection: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11923 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" dismiss: type: event description: | @@ -2727,11 +2834,12 @@ contextual_hint.tracking_protection: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11923 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" outside_tap: type: event description: | @@ -2742,11 +2850,12 @@ contextual_hint.tracking_protection: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11923 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" inside_tap: type: event description: | @@ -2757,11 +2866,12 @@ contextual_hint.tracking_protection: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11923 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" tracking_protection: exception_added: @@ -3209,11 +3319,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" pause: type: event description: | @@ -3223,11 +3334,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" cancel: type: event description: | @@ -3237,11 +3349,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" try_again: type: event description: | @@ -3252,11 +3365,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" open: type: event description: | @@ -3266,11 +3380,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" in_app_open: type: event description: | @@ -3280,11 +3395,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" in_app_try_again: type: event description: | @@ -3295,11 +3411,12 @@ download_notification: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/6554 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" downloads_misc: download_added: @@ -3310,9 +3427,10 @@ downloads_misc: - https://github.com/mozilla-mobile/fenix/issues/11578 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/16730 + - https://github.com/mozilla-mobile/fenix/pull/18143 notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" downloads_management: downloads_screen_opened: @@ -3324,9 +3442,10 @@ downloads_management: - https://github.com/mozilla-mobile/fenix/issues/15367 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/16728 + - https://github.com/mozilla-mobile/fenix/pull/18143 notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" item_opened: type: event @@ -3337,9 +3456,10 @@ downloads_management: - https://github.com/mozilla-mobile/fenix/issues/15367 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/16728 + - https://github.com/mozilla-mobile/fenix/pull/18143 notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" item_deleted: type: event @@ -3349,9 +3469,10 @@ downloads_management: - https://github.com/mozilla-mobile/fenix/issues/15367 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/16728 + - https://github.com/mozilla-mobile/fenix/pull/18143 notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" user_specified_search_engines: custom_engine_added: @@ -3564,11 +3685,12 @@ about_page: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8047 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" privacy_notice_tapped: type: event description: | @@ -3578,11 +3700,12 @@ about_page: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8047 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" app_theme: dark_theme_selected: @@ -3599,11 +3722,12 @@ app_theme: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/7968 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" pocket: pocket_top_site_clicked: @@ -3789,11 +3913,12 @@ addons: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8318 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" open_addon_in_toolbar_menu: type: event description: | @@ -3807,11 +3932,12 @@ addons: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8318 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" has_installed_addons: type: boolean description: | @@ -3823,11 +3949,12 @@ addons: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8318 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" has_enabled_addons: type: boolean description: | @@ -3839,11 +3966,12 @@ addons: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/8318 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" installed_addons: type: string_list description: | @@ -3855,11 +3983,12 @@ addons: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11080 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" enabled_addons: type: string_list description: | @@ -3871,11 +4000,12 @@ addons: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11080 - https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877 + - https://github.com/mozilla-mobile/fenix/pull/18143 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-04-01" + expires: "2021-07-01" startup.timeline: framework_primary: @@ -3885,12 +4015,13 @@ startup.timeline: time_unit: millisecond description: | The duration the Android framework takes to start before letting us run - code in `*Application.init` when this device has `clock_ticks_per_second` - equal to 100: if it's not equal to 100, then this value is captured in - `framework_secondary`. We split this into two metrics to make it easier - to analyze in GLAM. We split on 100 because when we did our initial brief - analysis - https://sql.telemetry.mozilla.org/queries/75591 - the results - for clocks ticks were overwhelmingly 100. + code in `*Application.init` when this device has + `clock_ticks_per_second_v2` equal to 100: if it's not equal to 100, then + this value is captured in `framework_secondary`. We split this into two + metrics to make it easier to analyze in GLAM. We split on 100 because + when we did our initial brief analysis - + https://sql.telemetry.mozilla.org/queries/75591 - the results for clocks + ticks were overwhelmingly 100. The duration is calculated from `appInitTimestamp - processStartTimestamp`. `processStartTimestamp` is derived from the clock @@ -3898,8 +4029,8 @@ startup.timeline: 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 + For debugging purposes, `clock_ticks_per_second_v2`, which may vary + between devices, is also reported as a metric bugs: - https://github.com/mozilla-mobile/fenix/issues/8803 - https://github.com/mozilla-mobile/fenix/issues/17972 @@ -3920,8 +4051,9 @@ startup.timeline: time_unit: millisecond description: | The duration the Android framework takes to start before letting us run - code in `*Application.init` when this device has `clock_ticks_per_second` - not equal to 100. For more details on this metric, see `framework_primary` + code in `*Application.init` when this device has + `clock_ticks_per_second_v2` not equal to 100. For more details on this + metric, see `framework_primary` bugs: - https://github.com/mozilla-mobile/fenix/issues/17972 data_reviews: @@ -3970,19 +4102,22 @@ startup.timeline: - perf-android-fe@mozilla.com - mcomella@mozilla.com expires: "2021-08-01" - clock_ticks_per_second: + clock_ticks_per_second_v2: send_in_pings: - startup-timeline - type: counter + type: quantity + unit: clock ticks per second description: | 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. + the `framework_primary/secondary` metrics. bugs: - https://github.com/mozilla-mobile/fenix/issues/8803 + - https://github.com/mozilla-mobile/fenix/issues/18157 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626 - https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068 + - https://github.com/mozilla-mobile/fenix/pull/18158#issue-579593943 data_sensitivity: - technical notification_emails: @@ -3995,7 +4130,9 @@ perf.startup: type: timing_distribution time_unit: millisecond description: | - The duration of `FenixApplication.onCreate` in the main process. + The duration of `FenixApplication.onCreate` in the main process. This does + not measure the duration of migration code (via + `MigratingFenixApplication` included in the Beta and Release channels. bugs: - https://github.com/mozilla-mobile/fenix/issues/17969 data_reviews: @@ -4006,6 +4143,61 @@ perf.startup: - perf-android-fe@mozilla.com - mcomella@mozilla.com expires: "2021-08-11" + app_on_create_to_glean_init: + type: timing_distribution + time_unit: millisecond + description: | + A subsection of the duration of `FenixApplication.onCreate` and thus the + `application_on_create` probe from the start of the method through when + `initializeGlean` is called. Note: `initializeGlean` is a no-op for Beta + and Release builds which instead initialize it during + `MigratingFenixApplication`, which we don't currently measure. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18525#issue-594961170 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" + app_on_create_to_megazord_init: + type: timing_distribution + time_unit: millisecond + description: | + A subsection of the duration of `FenixApplication.onCreate` and thus the + `application_on_create` probe from after the `app_on_create_to_glean_init` + probe until we block for the megazord to complete set up. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18525#issue-594961170 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" + app_on_create_to_setup_in_main: + type: timing_distribution + time_unit: millisecond + description: | + A subsection of the duration of `FenixApplication.onCreate` and thus the + `application_on_create` probe from after the + `app_on_create_to_megazord_init` probe until the end of + `setupInMainProcessOnly`, which is expected to be the end of the + `onCreate` call (unless the implementation later changes). + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18525#issue-594961170 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" home_activity_on_create: type: timing_distribution time_unit: millisecond @@ -4021,6 +4213,86 @@ perf.startup: - perf-android-fe@mozilla.com - mcomella@mozilla.com expires: "2021-08-11" + home_activity_on_start: + type: timing_distribution + time_unit: millisecond + description: | + The duration of `HomeActivity.onStart`. This may encapsulate + `HomeFragment` or `BrowserFragment` creation, depending on the code path, + so we expect this to take varying amounts of time. As such, this probe may + not be easy to interpret directly but we believe collecting it may give us + more information about different patterns we might see in performance + data. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" + home_fragment_on_create_view: + type: timing_distribution + time_unit: millisecond + description: | + The duration of `HomeFragment.onCreateView`. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" + home_fragment_on_view_created: + type: timing_distribution + time_unit: millisecond + description: | + The duration of `HomeFragment.onViewCreated`. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" + base_bfragment_on_create_view: + type: timing_distribution + time_unit: millisecond + description: | + The duration of `BaseBrowserFragment.onCreateView`. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" + base_bfragment_on_view_created: + type: timing_distribution + time_unit: millisecond + description: | + The duration of `BaseBrowserFragment.onViewCreated`. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18426 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848 + data_sensitivity: + - technical + notification_emails: + - perf-android-fe@mozilla.com + - mcomella@mozilla.com + expires: "2021-08-11" perf.awesomebar: history_suggestions: @@ -4287,12 +4559,13 @@ progressive_web_app: - https://github.com/mozilla-mobile/fenix/issues/10261 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11859 + - https://github.com/mozilla-mobile/fenix/pull/18071 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2021-03-01" + expires: "2021-09-01" install_tap: type: event description: | @@ -4301,12 +4574,13 @@ progressive_web_app: - https://github.com/mozilla-mobile/fenix/issues/10261 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11859 + - https://github.com/mozilla-mobile/fenix/pull/18071 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2021-03-01" + expires: "2021-09-01" foreground: type: event description: | @@ -4319,12 +4593,13 @@ progressive_web_app: - https://github.com/mozilla-mobile/fenix/issues/10261 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11859 + - https://github.com/mozilla-mobile/fenix/pull/18071 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2021-03-01" + expires: "2021-09-01" background: type: event description: | @@ -4337,12 +4612,13 @@ progressive_web_app: - https://github.com/mozilla-mobile/fenix/issues/10261 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/11859 + - https://github.com/mozilla-mobile/fenix/pull/18071 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - erichards@mozilla.com - expires: "2021-03-01" + expires: "2021-09-01" master_password: displayed: @@ -4353,11 +4629,12 @@ master_password: - https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534 + - https://github.com/mozilla-mobile/fenix/pull/18071 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-03-01" + expires: "2021-09-01" migration: type: event description: | @@ -4366,11 +4643,12 @@ master_password: - https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534 + - https://github.com/mozilla-mobile/fenix/pull/18071 data_sensitivity: - interaction notification_emails: - fenix-core@mozilla.com - expires: "2021-03-01" + expires: "2021-09-01" tabs: setting_opened: @@ -4482,8 +4760,8 @@ contextual_menu: - fenix-core@mozilla.com expires: "2021-06-01" -engine: - tab_kills: +engine_tab: + kills: type: labeled_counter labels: - foreground @@ -4502,7 +4780,7 @@ engine: - skaspari@mozilla.com expires: "2021-12-31" kill_foreground_age: - type: timespan + type: timing_distribution time_unit: millisecond description: | Measures the age of the engine session of a foreground (selected) tab @@ -4510,7 +4788,7 @@ engine: bugs: - https://github.com/mozilla-mobile/android-components/issues/9366 data_reviews: - - TBD + - https://github.com/mozilla-mobile/fenix/pull/17864 data_sensitivity: - technical notification_emails: @@ -4518,7 +4796,7 @@ engine: - skaspari@mozilla.com expires: "2021-12-31" kill_background_age: - type: timespan + type: timing_distribution time_unit: millisecond description: | Measures the age of the engine session of a background tab at the @@ -4534,6 +4812,101 @@ engine: - skaspari@mozilla.com expires: "2021-12-31" +synced_tabs: + synced_tabs_suggestion_clicked: + type: event + description: | + The synced tab suggestion in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18163 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18172 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + +awesomebar: + bookmark_suggestion_clicked: + type: event + description: | + The bookmark suggestion in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18068 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18090 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + clipboard_suggestion_clicked: + type: event + description: | + The clipboard suggestion in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18068 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18090 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + history_suggestion_clicked: + type: event + description: | + The history suggestion in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18068 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18090 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + search_action_clicked: + type: event + description: | + The search action in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18068 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18090 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + search_suggestion_clicked: + type: event + description: | + The search suggestion in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18068 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18090 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + opened_tab_suggestion_clicked: + type: event + description: | + The opened tab suggestion in awesomebar was clicked. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/18068 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/18090 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + android_keystore_experiment: experiment_failure: type: event diff --git a/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt index c3a26ae21..fe941a86e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt @@ -27,6 +27,7 @@ import org.junit.BeforeClass import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.GleanBuildInfo import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.helpers.HomeActivityTestRule @@ -85,9 +86,10 @@ class BaselinePingTest { // we need to do this on the main thread, as the Glean SDK requires it. GlobalScope.launch(Dispatchers.Main.immediate) { Glean.initialize( - ApplicationProvider.getApplicationContext(), - true, - Configuration(httpClient = httpClient) + applicationContext = ApplicationProvider.getApplicationContext(), + uploadEnabled = true, + configuration = Configuration(httpClient = httpClient), + buildInfo = GleanBuildInfo.buildInfo ) } } 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 a3f049647..70247901f 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,7 @@ import androidx.test.espresso.intent.rule.IntentsTestRule import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.ActivityTestRule import androidx.test.uiautomator.UiDevice +import androidx.test.uiautomator.UiSelector import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.onboarding.FenixOnboarding import org.mozilla.fenix.ui.robots.appContext @@ -37,6 +38,7 @@ class HomeActivityTestRule( override fun afterActivityFinished() { super.afterActivityFinished() setLongTapTimeout(longTapUserPreference) + closeNotificationShade() } } @@ -65,6 +67,7 @@ class HomeActivityIntentTestRule( override fun afterActivityFinished() { super.afterActivityFinished() setLongTapTimeout(longTapUserPreference) + closeNotificationShade() } } @@ -79,3 +82,13 @@ private fun skipOnboardingBeforeLaunch() { // this API so it can be fragile. FenixOnboarding(appContext).finish() } + +private fun closeNotificationShade() { + val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + if (mDevice.findObject( + UiSelector().resourceId("com.android.systemui:id/notification_stack_scroller") + ).exists() + ) { + mDevice.pressHome() + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt index 9dffa1728..ec9b3d70e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -11,13 +11,16 @@ import android.net.Uri import android.os.Build import android.os.Environment import androidx.preference.PreferenceManager +import androidx.test.espresso.Espresso import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.IdlingRegistry import androidx.test.espresso.action.ViewActions.longClick import androidx.test.espresso.assertion.ViewAssertions import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until @@ -25,7 +28,9 @@ import kotlinx.coroutines.runBlocking import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers.allOf import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.ext.waitNotNull +import org.mozilla.fenix.helpers.idlingresource.NetworkConnectionIdlingResource import org.mozilla.fenix.ui.robots.mDevice import java.io.File @@ -84,6 +89,7 @@ object TestHelper { fun verifyUrl(urlSubstring: String, resourceName: String, resId: Int) { waitUntilObjectIsFound(resourceName) + mDevice.findObject(UiSelector().text(urlSubstring)).waitForExists(waitingTime) onView(withId(resId)).check(ViewAssertions.matches(withText(CoreMatchers.containsString(urlSubstring)))) } @@ -117,4 +123,34 @@ object TestHelper { } } } + + fun setNetworkEnabled(enabled: Boolean) { + val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + val networkDisconnectedIdlingResource = NetworkConnectionIdlingResource(false) + val networkConnectedIdlingResource = NetworkConnectionIdlingResource(true) + + when (enabled) { + true -> { + mDevice.executeShellCommand("svc data enable") + mDevice.executeShellCommand("svc wifi enable") + + // Wait for network connection to be completely enabled + IdlingRegistry.getInstance().register(networkConnectedIdlingResource) + Espresso.onIdle { + IdlingRegistry.getInstance().unregister(networkConnectedIdlingResource) + } + } + + false -> { + mDevice.executeShellCommand("svc data disable") + mDevice.executeShellCommand("svc wifi disable") + + // Wait for network connection to be completely disabled + IdlingRegistry.getInstance().register(networkDisconnectedIdlingResource) + Espresso.onIdle { + IdlingRegistry.getInstance().unregister(networkDisconnectedIdlingResource) + } + } + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/idlingresource/NetworkConnectionIdlingResource.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/idlingresource/NetworkConnectionIdlingResource.kt new file mode 100644 index 000000000..f5b3b4364 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/idlingresource/NetworkConnectionIdlingResource.kt @@ -0,0 +1,48 @@ +/* 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.idlingresource + +import android.net.ConnectivityManager +import androidx.core.content.getSystemService +import androidx.test.espresso.IdlingResource +import androidx.test.platform.app.InstrumentationRegistry +import org.mozilla.fenix.ext.isOnline + +/** + * An IdlingResource implementation that waits until the network connection is online or offline. + * The networkConnected parameter sets the expected connection status. + * Only after connecting/disconnecting has completed further actions will be performed. + */ + +class NetworkConnectionIdlingResource(private val networkConnected: Boolean) : IdlingResource { + private var resourceCallback: IdlingResource.ResourceCallback? = null + private val connectionManager = + InstrumentationRegistry.getInstrumentation().context.getSystemService() + + override fun getName(): String { + return this::javaClass.name + } + + override fun isIdleNow(): Boolean { + val idle = + if (networkConnected) { + isOnline() + } else { + !isOnline() + } + if (idle) + resourceCallback?.onTransitionToIdle() + return idle + } + + override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) { + if (callback != null) + resourceCallback = callback + } + + private fun isOnline(): Boolean { + return connectionManager!!.isOnline() + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock index f621829f5..35ec0b509 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock @@ -18,17 +18,25 @@ "default": { "atomicwrites": { "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" + "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197", + "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a" ], - "version": "==1.3.0" + "version": "==1.4.0" }, "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", + "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" + ], + "version": "==20.3.0" + }, + "backports.functools-lru-cache": { + "hashes": [ + "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848", + "sha256:8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a" ], - "version": "==19.3.0" + "markers": "python_version < '3.2'", + "version": "==1.6.1" }, "blessings": { "hashes": [ @@ -40,43 +48,51 @@ }, "certifi": { "hashes": [ - "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", - "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" + "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", + "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" ], - "version": "==2019.11.28" + "version": "==2020.12.5" }, "cffi": { "hashes": [ - "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", - "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", - "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", - "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", - "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", - "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", - "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", - "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", - "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", - "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", - "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", - "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", - "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", - "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", - "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", - "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", - "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", - "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", - "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", - "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", - "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", - "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", - "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", - "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", - "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", - "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", - "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", - "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" - ], - "version": "==1.14.0" + "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", + "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", + "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", + "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", + "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", + "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", + "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", + "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", + "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", + "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", + "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", + "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", + "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", + "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", + "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", + "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", + "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", + "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", + "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", + "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", + "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", + "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", + "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", + "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", + "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", + "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", + "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", + "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", + "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", + "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", + "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", + "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", + "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", + "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", + "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", + "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" + ], + "version": "==1.14.4" }, "chardet": { "hashes": [ @@ -103,36 +119,38 @@ }, "cryptography": { "hashes": [ - "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", - "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595", - "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad", - "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651", - "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2", - "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff", - "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d", - "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42", - "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d", - "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e", - "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912", - "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793", - "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13", - "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7", - "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0", - "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879", - "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f", - "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9", - "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2", - "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf", - "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8" - ], - "version": "==2.8" + "sha256:22f8251f68953553af4f9c11ec5f191198bc96cff9f0ac5dd5ff94daede0ee6d", + "sha256:284e275e3c099a80831f9898fb5c9559120d27675c3521278faba54e584a7832", + "sha256:3e17d02941c0f169c5b877597ca8be895fca0e5e3eb882526a74aa4804380a98", + "sha256:52a47e60953679eea0b4d490ca3c241fb1b166a7b161847ef4667dfd49e7699d", + "sha256:57b8c1ed13b8aa386cabbfde3be175d7b155682470b0e259fecfe53850967f8a", + "sha256:6a8f64ed096d13f92d1f601a92d9fd1f1025dc73a2ca1ced46dcf5e0d4930943", + "sha256:6e8a3c7c45101a7eeee93102500e1b08f2307c717ff553fcb3c1127efc9b6917", + "sha256:7ef41304bf978f33cfb6f43ca13bb0faac0c99cda33693aa20ad4f5e34e8cb8f", + "sha256:87c2fffd61e934bc0e2c927c3764c20b22d7f5f7f812ee1a477de4c89b044ca6", + "sha256:88069392cd9a1e68d2cfd5c3a2b0d72a44ef3b24b8977a4f7956e9e3c4c9477a", + "sha256:8a0866891326d3badb17c5fd3e02c926b635e8923fa271b4813cd4d972a57ff3", + "sha256:8f0fd8b0751d75c4483c534b209e39e918f0d14232c0d8a2a76e687f64ced831", + "sha256:9a07e6d255053674506091d63ab4270a119e9fc83462c7ab1dbcb495b76307af", + "sha256:9a8580c9afcdcddabbd064c0a74f337af74ff4529cdf3a12fa2e9782d677a2e5", + "sha256:bd80bc156d3729b38cb227a5a76532aef693b7ac9e395eea8063ee50ceed46a5", + "sha256:d1cbc3426e6150583b22b517ef3720036d7e3152d428c864ff0f3fcad2b97591", + "sha256:e15ac84dcdb89f92424cbaca4b0b34e211e7ce3ee7b0ec0e4f3c55cee65fae5a", + "sha256:e4789b84f8dedf190148441f7c5bfe7244782d9cbb194a36e17b91e7d3e1cca9", + "sha256:f01c9116bfb3ad2831e125a73dcd957d173d6ddca7701528eff1e7d97972872c", + "sha256:f0e3986f6cce007216b23c490f093f35ce2068f3c244051e559f647f6731b7ae", + "sha256:f2aa3f8ba9e2e3fd49bd3de743b976ab192fbf0eb0348cebde5d2a9de0090a9f", + "sha256:fb70a4cedd69dc52396ee114416a3656e011fb0311fca55eb55c7be6ed9c8aef" + ], + "index": "pypi", + "version": "==3.2" }, "distro": { "hashes": [ - "sha256:362dde65d846d23baee4b5c058c8586f219b5a54be1cf5fc6ff55c4578392f57", - "sha256:eedf82a470ebe7d010f1872c17237c79ab04097948800029994fa458e52fb4b4" + "sha256:0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92", + "sha256:df74eed763e18d10d0da624258524ae80486432cd17392d9c3d96f5e83cd2799" ], - "version": "==1.4.0" + "version": "==1.5.0" }, "enum34": { "hashes": [ @@ -168,18 +186,18 @@ }, "idna": { "hashes": [ - "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", - "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "version": "==2.9" + "version": "==2.10" }, "importlib-metadata": { "hashes": [ - "sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302", - "sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b" + "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd", + "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4" ], "markers": "python_version < '3.8'", - "version": "==1.5.0" + "version": "==2.1.1" }, "ipaddress": { "hashes": [ @@ -200,10 +218,10 @@ }, "mozdevice": { "hashes": [ - "sha256:3f19640478fae47c5dfed998da42f86aef39d9ba03222e99d19ff488e2f78184", - "sha256:e6f7a679ef9a40e6db8e1d47d611b8d9997f03d345953570cbdf34d7cde79b6e" + "sha256:074ba1ff99b18ccc1931538a161be2410d0f9cee122df852b3bc73e1000fbcad", + "sha256:a5a1e882a72df71165f6322def9b5e1d677d39d25f62157f3e0dc554b5ae04dc" ], - "version": "==3.1.0" + "version": "==4.0.3" }, "mozdownload": { "hashes": [ @@ -221,30 +239,31 @@ }, "mozinfo": { "hashes": [ - "sha256:41220573ea1e0e90d38d393f2848b470aeea68c1863eef0d578eb44c70a2f817", - "sha256:65e158464e09ba759f21526c14bef2f8c0ae5b424f14f23e7d863048e16a402a" + "sha256:4961ebef3c5474b9ca470142f88b5de774a069f4e105663a5152b0ef4659785a" ], - "version": "==1.2.1" + "version": "==1.2.2" }, "mozinstall": { "hashes": [ - "sha256:219ba7c51308433487b4f30a2615cb9b3ecd40a76b9faf41cf1b1b005bb5dda7" + "sha256:219ba7c51308433487b4f30a2615cb9b3ecd40a76b9faf41cf1b1b005bb5dda7", + "sha256:bbc31a18ee8a1fbec74b67b99c6c0289ffc7daf39eb5b5ff7dc99f1be687eb08" ], "index": "pypi", "version": "==2.0.0" }, "mozlog": { "hashes": [ - "sha256:4eb8b781525a1433f05239583051dfe19927036b0c1f450ef0ad33882284a13b", - "sha256:50608bd9f58461dc266be0e3663b6f97934b02a12bb403f2ccf09728e36f4898" + "sha256:4719d3d00bf1a0b77285d306eb3180f9c1311fffae9640a423fad9d80170e43d", + "sha256:d035f722c15d700e4a7b48b90bdda0a6ad83e25482760949d1abd73468bad07f" ], - "version": "==6.0" + "version": "==7.0.1" }, "mozprocess": { "hashes": [ - "sha256:949fe2c96c866b3bd89011441b85dbe0477d1a2d3dde5030a35cf51f28db793d" + "sha256:08e1036b53819fd144331f6dfbbb17fc8ca782bbed2e28b4aa771b8b91f7dffb", + "sha256:54dc59e7f5a9c2c2930bffb7935f36dddd1d94c9fc6ed179e893d2dff353995a" ], - "version": "==1.1.0" + "version": "==1.2.1" }, "mozprofile": { "hashes": [ @@ -279,17 +298,17 @@ }, "packaging": { "hashes": [ - "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", - "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" + "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236", + "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376" ], - "version": "==20.3" + "version": "==20.7" }, "pathlib2": { "hashes": [ "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db", "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868" ], - "markers": "python_version < '3'", + "markers": "python_version < '3.6'", "version": "==2.3.5" }, "pluggy": { @@ -301,17 +320,17 @@ }, "progressbar2": { "hashes": [ - "sha256:489cc619276505504cb3e6230e05465480f7b748515a2c1374f82115bcae561c", - "sha256:e5dcded3957b40eab6ba23962d25618a7709971b5413078a5905a93e84345e92" + "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", + "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" ], - "version": "==3.50.0" + "version": "==3.53.1" }, "py": { "hashes": [ - "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", - "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" + "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", + "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" ], - "version": "==1.8.1" + "version": "==1.9.0" }, "pybrowserid": { "hashes": [ @@ -329,16 +348,23 @@ }, "pyfxa": { "hashes": [ - "sha256:f47f4285629fa6c033c79adc3fb90926c0818a42cfddb04d32818547362f1627" + "sha256:6c85cd08cf05f7138dee1cf2a8a1d68fd428b7b5ad488917c70a2a763d651cdb" + ], + "version": "==0.7.7" + }, + "pyjwt": { + "hashes": [ + "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e", + "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96" ], - "version": "==0.7.3" + "version": "==1.7.1" }, "pyparsing": { "hashes": [ - "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", - "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "version": "==2.4.6" + "version": "==2.4.7" }, "pypom": { "hashes": [ @@ -427,10 +453,10 @@ }, "six": { "hashes": [ - "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", - "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" ], - "version": "==1.14.0" + "version": "==1.15.0" }, "treeherder-client": { "hashes": [ @@ -441,17 +467,17 @@ }, "urllib3": { "hashes": [ - "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", - "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" + "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", + "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" ], - "version": "==1.25.8" + "version": "==1.25.11" }, "wcwidth": { "hashes": [ - "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", - "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" + "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", + "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" ], - "version": "==0.1.8" + "version": "==0.2.5" }, "webob": { "hashes": [ @@ -469,9 +495,10 @@ }, "zope.component": { "hashes": [ - "sha256:ec2afc5bbe611dcace98bb39822c122d44743d635dafc7315b9aef25097db9e6" + "sha256:607628e4c84f7887a69a958542b5c304663e726b73aba0882e3a3f059bff14f3", + "sha256:91628918218b3e6f6323de2a7b845e09ddc5cae131c034896c051b084bba3c92" ], - "version": "==4.6" + "version": "==4.6.2" }, "zope.deferredimport": { "hashes": [ @@ -489,10 +516,10 @@ }, "zope.event": { "hashes": [ - "sha256:69c27debad9bdacd9ce9b735dad382142281ac770c4a432b533d6d65c4614bcf", - "sha256:d8e97d165fd5a0997b45f5303ae11ea3338becfe68c401dd88ffd2113fe5cae7" + "sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42", + "sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330" ], - "version": "==4.4" + "version": "==4.5.0" }, "zope.hookable": { "hashes": [ @@ -541,91 +568,105 @@ }, "zope.interface": { "hashes": [ - "sha256:02339c53bbf7e438dec371af1f401e4843f9dc5765b3b032032b195dd72b47f2", - "sha256:0616040d5a18786aff5d25ef6e1fa0f875b7ba5b6f1a923c1153be81dd9c65ad", - "sha256:07a8bb9110854c0ab9329adbbec7050af242a78a62e226ab49e9c2182090f501", - "sha256:07de051fac6dedc6c659034f80bc46623edc776c757fa26f3f467954b12d2403", - "sha256:08ae0a88ac29b92faff069e0511ad27197b3274bdf67ebd8c75aaeb05823c7af", - "sha256:1033e7bb858c398580ca7cbb50f15b715e6031d5772f8a1bde4042c12300a52a", - "sha256:11db683f49652b34aa87904b27d00f9032fa2db7f1f9676c05b13361a3c7547c", - "sha256:23c4a70a9abb8faa35e2967e2e7cbd9225512b706b6eb96b01eb1ccbb2b632c3", - "sha256:2690fd5b042062d866017db11ce1e12d4862df28614cc2915dc57e52b46a8594", - "sha256:31fdcc9eaf2c379e8b416184a0749ce3f95fdaf206b092b63bdc065aecca6a95", - "sha256:34381fcecc6e6f57d72bc2fab6175976eeacdd61dbb34427a37b260238278199", - "sha256:36e7438d2f71153cea6b119ddd2648bc010cec4368fd8e7170e50090c0d7ed19", - "sha256:3b6a2ef2c6b4e9786939bd9861e7b98bc01cb3024f87c8cf4b78872f2afcf584", - "sha256:4855384c27fe7e31efbee32f74659421d64e5bfa8b7df2ec08d306d0f3d4cee6", - "sha256:4d0830e1d544b2c303064ec01923de2b9d6f5b5d0d78608a91d758b0f469361c", - "sha256:61b95dbfd03ce2a55c38da711cba7130605dbef4839ca12b53c46827826c5c5b", - "sha256:64446f9baa2c51f47b0e272939c583ffd220e67f5bcbc2f18dd244c5a46a7018", - "sha256:65cef4766be4be9372621cd17773424302c21785dfaf6e9bd5b64b1f1264f9cc", - "sha256:6f1e8914eee2e3a0bcf435d963ca5cf3a3df89a47cbd3e2b16343bc875194fed", - "sha256:6f2bf246ee9350f428860c37db6158cfb27a7e585d60b2bb3b88864810875835", - "sha256:73a618e734803ded8b8d8f14f9a6371c6a1acc445840cf6ae57733041e796671", - "sha256:7d3c4f10b7a8502a68a8eadcd57e86a35e3948af3edee7bd49a21b225361b0da", - "sha256:98a21acc7d1e45fcb700831b66ec6c84a3c2a5a94868d72ef83565966adc474f", - "sha256:993051db4278f9ec3b191ae823a7bb32b6a91fed6e960d43500fc4ce64cdb4e0", - "sha256:9e67e9fa7dc43210ad766cd6eef133d9d256a530fe07e5585685cdc742170d10", - "sha256:a36e7e1972109504dfa0995a89b6c24a990113eb4cedef93d0eaf1452901b6ac", - "sha256:a41a34c55887743ee124e8f696217dec1a7eead1164d27ef27dfae528c396a23", - "sha256:a7b50fa86c1bd863ef3b3314da62928c015a732bb0aef220852b9606104f0df5", - "sha256:a82d36ecc28e72904388f72f57f3c04aee7c43a019e302d61944b3886c261be3", - "sha256:a9fce290a6ba88e5e6e81dd1e800c045212df69ab69d1de0d303b1af9cec692f", - "sha256:ae6c4a1fa696c12c3b654fa0d160f3781271f0edbbb0ae50f285a91f2a272a09", - "sha256:b0029f193d91a1e0085e4a99dd71e4c63a3e7826ec4a8d2ea457f02e1b6b0bb4", - "sha256:b12241fac561b635329c3275e911a53e104b43875b99d31332d006d52e180912", - "sha256:b906dda76ab70b6905ef3014260e7f1c861a0c4841e29826eb34a6187255504b", - "sha256:d79da12a15edd6d7c366766954c4b6de0247e85ba35ee2ad9f37f972e7080f8a", - "sha256:d8a0cb84de725ccd6abd9b5bd32cb94a11db336076fb6d459f1fed23d0719e0c", - "sha256:eb92c733be08c6e2b8dfd4613d1b3c2f345ca4f83219d40fda4680333d3a0dc4", - "sha256:f044fec9c7e1b0ec6fdf0d3abc648c2f3b9128933051a9a73af52dbdd9e6d6e9", - "sha256:fd1101bd3fcb4f4cf3485bb20d6cb0b56909b94d3bd2a53a6cb9d381c3da3365" - ], - "version": "==4.7.2" + "sha256:05a97ba92c1c7c26f25c9f671aa1ef85ffead6cdad13770e5b689cf983adc7e1", + "sha256:07d61722dd7d85547b7c6b0f5486b4338001fab349f2ac5cabc0b7182eb3425d", + "sha256:0a990dcc97806e5980bbb54b2e46b9cde9e48932d8e6984daf71ef1745516123", + "sha256:150e8bcb7253a34a4535aeea3de36c0bb3b1a6a47a183a95d65a194b3e07f232", + "sha256:1743bcfe45af8846b775086471c28258f4c6e9ee8ef37484de4495f15a98b549", + "sha256:1b5f6c8fff4ed32aa2dd43e84061bc8346f32d3ba6ad6e58f088fe109608f102", + "sha256:21e49123f375703cf824214939d39df0af62c47d122d955b2a8d9153ea08cfd5", + "sha256:21f579134a47083ffb5ddd1307f0405c91aa8b61ad4be6fd5af0171474fe0c45", + "sha256:27c267dc38a0f0079e96a2945ee65786d38ef111e413c702fbaaacbab6361d00", + "sha256:299bde0ab9e5c4a92f01a152b7fbabb460f31343f1416f9b7b983167ab1e33bc", + "sha256:2ab88d8f228f803fcb8cb7d222c579d13dab2d3622c51e8cf321280da01102a7", + "sha256:2ced4c35061eea623bc84c7711eedce8ecc3c2c51cd9c6afa6290df3bae9e104", + "sha256:2dcab01c660983ba5e5a612e0c935141ccbee67d2e2e14b833e01c2354bd8034", + "sha256:32546af61a9a9b141ca38d971aa6eb9800450fa6620ce6323cc30eec447861f3", + "sha256:32b40a4c46d199827d79c86bb8cb88b1bbb764f127876f2cb6f3a47f63dbada3", + "sha256:3cc94c69f6bd48ed86e8e24f358cb75095c8129827df1298518ab860115269a4", + "sha256:42b278ac0989d6f5cf58d7e0828ea6b5951464e3cf2ff229dd09a96cb6ba0c86", + "sha256:495b63fd0302f282ee6c1e6ea0f1c12cb3d1a49c8292d27287f01845ff252a96", + "sha256:4af87cdc0d4b14e600e6d3d09793dce3b7171348a094ba818e2a68ae7ee67546", + "sha256:4b94df9f2fdde7b9314321bab8448e6ad5a23b80542dcab53e329527d4099dcb", + "sha256:4c48ddb63e2b20fba4c6a2bf81b4d49e99b6d4587fb67a6cd33a2c1f003af3e3", + "sha256:4df9afd17bd5477e9f8c8b6bb8507e18dd0f8b4efe73bb99729ff203279e9e3b", + "sha256:518950fe6a5d56f94ba125107895f938a4f34f704c658986eae8255edb41163b", + "sha256:538298e4e113ccb8b41658d5a4b605bebe75e46a30ceca22a5a289cf02c80bec", + "sha256:55465121e72e208a7b69b53de791402affe6165083b2ea71b892728bd19ba9ae", + "sha256:588384d70a0f19b47409cfdb10e0c27c20e4293b74fc891df3d8eb47782b8b3e", + "sha256:6278c080d4afffc9016e14325f8734456831124e8c12caa754fd544435c08386", + "sha256:64ea6c221aeee4796860405e1aedec63424cda4202a7ad27a5066876db5b0fd2", + "sha256:681dbb33e2b40262b33fd383bae63c36d33fd79fa1a8e4092945430744ffd34a", + "sha256:6936aa9da390402d646a32a6a38d5409c2d2afb2950f045a7d02ab25a4e7d08d", + "sha256:778d0ec38bbd288b150a3ae363c8ffd88d2207a756842495e9bffd8a8afbc89a", + "sha256:8251f06a77985a2729a8bdbefbae79ee78567dddc3acbd499b87e705ca59fe24", + "sha256:83b4aa5344cce005a9cff5d0321b2e318e871cc1dfc793b66c32dd4f59e9770d", + "sha256:844fad925ac5c2ad4faaceb3b2520ad016b5280105c6e16e79838cf951903a7b", + "sha256:8ceb3667dd13b8133f2e4d637b5b00f240f066448e2aa89a41f4c2d78a26ce50", + "sha256:92dc0fb79675882d0b6138be4bf0cec7ea7c7eede60aaca78303d8e8dbdaa523", + "sha256:9789bd945e9f5bd026ed3f5b453d640befb8b1fc33a779c1fe8d3eb21fe3fb4a", + "sha256:a2b6d6eb693bc2fc6c484f2e5d93bd0b0da803fa77bf974f160533e555e4d095", + "sha256:aab9f1e34d810feb00bf841993552b8fcc6ae71d473c505381627143d0018a6a", + "sha256:abb61afd84f23099ac6099d804cdba9bd3b902aaaded3ffff47e490b0a495520", + "sha256:adf9ee115ae8ff8b6da4b854b4152f253b390ba64407a22d75456fe07dcbda65", + "sha256:aedc6c672b351afe6dfe17ff83ee5e7eb6ed44718f879a9328a68bdb20b57e11", + "sha256:b7a00ecb1434f8183395fac5366a21ee73d14900082ca37cf74993cf46baa56c", + "sha256:ba32f4a91c1cb7314c429b03afbf87b1fff4fb1c8db32260e7310104bd77f0c7", + "sha256:cbd0f2cbd8689861209cd89141371d3a22a11613304d1f0736492590aa0ab332", + "sha256:e4bc372b953bf6cec65a8d48482ba574f6e051621d157cf224227dbb55486b1e", + "sha256:eccac3d9aadc68e994b6d228cb0c8919fc47a5350d85a1b4d3d81d1e98baf40c", + "sha256:efd550b3da28195746bb43bd1d815058181a7ca6d9d6aa89dd37f5eefe2cacb7", + "sha256:efef581c8ba4d990770875e1a2218e856849d32ada2680e53aebc5d154a17e20", + "sha256:f057897711a630a0b7a6a03f1acf379b6ba25d37dc5dc217a97191984ba7f2fc", + "sha256:f37d45fab14ffef9d33a0dc3bc59ce0c5313e2253323312d47739192da94f5fd", + "sha256:f44906f70205d456d503105023041f1e63aece7623b31c390a0103db4de17537" + ], + "version": "==5.2.0" }, "zope.proxy": { "hashes": [ - "sha256:04646ac04ffa9c8e32fb2b5c3cd42995b2548ea14251f3c21ca704afae88e42c", - "sha256:07b6bceea232559d24358832f1cd2ed344bbf05ca83855a5b9698b5f23c5ed60", - "sha256:1ef452cc02e0e2f8e3c917b1a5b936ef3280f2c2ca854ee70ac2164d1655f7e6", - "sha256:22bf61857c5977f34d4e391476d40f9a3b8c6ab24fb0cac448d42d8f8b9bf7b2", - "sha256:299870e3428cbff1cd9f9b34144e76ecdc1d9e3192a8cf5f1b0258f47a239f58", - "sha256:2bfc36bfccbe047671170ea5677efd3d5ab730a55d7e45611d76d495e5b96766", - "sha256:32e82d5a640febc688c0789e15ea875bf696a10cf358f049e1ed841f01710a9b", - "sha256:3b2051bdc4bc3f02fa52483f6381cf40d4d48167645241993f9d7ebbd142ed9b", - "sha256:3f734bd8a08f5185a64fb6abb8f14dc97ec27a689ca808fb7a83cdd38d745e4f", - "sha256:3f78dd8de3112df8bbd970f0916ac876dc3fbe63810bd1cf7cc5eec4cbac4f04", - "sha256:4eabeb48508953ba1f3590ad0773b8daea9e104eec66d661917e9bbcd7125a67", - "sha256:4f05ecc33808187f430f249cb1ccab35c38f570b181f2d380fbe253da94b18d8", - "sha256:4f4f4cbf23d3afc1526294a31e7b3eaa0f682cc28ac5366065dc1d6bb18bd7be", - "sha256:5483d5e70aacd06f0aa3effec9fed597c0b50f45060956eeeb1203c44d4338c3", - "sha256:56a5f9b46892b115a75d0a1f2292431ad5988461175826600acc69a24cb3edee", - "sha256:64bb63af8a06f736927d260efdd4dfc5253d42244f281a8063e4b9eea2ddcbc5", - "sha256:653f8cbefcf7c6ac4cece2cdef367c4faa2b7c19795d52bd7cbec11a8739a7c1", - "sha256:664211d63306e4bd4eec35bf2b4bd9db61c394037911cf2d1804c43b511a49f1", - "sha256:6651e6caed66a8fff0fef1a3e81c0ed2253bf361c0fdc834500488732c5d16e9", - "sha256:6c1fba6cdfdf105739d3069cf7b07664f2944d82a8098218ab2300a82d8f40fc", - "sha256:6e64246e6e9044a4534a69dca1283c6ddab6e757be5e6874f69024329b3aa61f", - "sha256:838390245c7ec137af4993c0c8052f49d5ec79e422b4451bfa37fee9b9ccaa01", - "sha256:856b410a14793069d8ba35f33fff667213ea66f2df25a0024cc72a7493c56d4c", - "sha256:8b932c364c1d1605a91907a41128ed0ee8a2d326fc0fafb2c55cd46f545f4599", - "sha256:9086cf6d20f08dae7f296a78f6c77d1f8d24079d448f023ee0eb329078dd35e1", - "sha256:9698533c14afa0548188de4968a7932d1f3f965f3f5ba1474de673596bb875af", - "sha256:9b12b05dd7c28f5068387c1afee8cb94f9d02501e7ef495a7c5c7e27139b96ad", - "sha256:a884c7426a5bc6fb7fc71a55ad14e66818e13f05b78b20a6f37175f324b7acb8", - "sha256:abe9e7f1a3e76286c5f5baf2bf5162d41dc0310da493b34a2c36555f38d928f7", - "sha256:bd6fde63b015a27262be06bd6bbdd895273cc2bdf2d4c7e1c83711d26a8fbace", - "sha256:bda7c62c954f47b87ed9a89f525eee1b318ec7c2162dfdba76c2ccfa334e0caa", - "sha256:be8a4908dd3f6e965993c0068b006bdbd0474fbcbd1da4893b49356e73fc1557", - "sha256:ced65fc3c7d7205267506d854bb1815bb445899cca9d21d1d4b949070a635546", - "sha256:dac4279aa05055d3897ab5e5ee5a7b39db121f91df65a530f8b1ac7f9bd93119", - "sha256:e4f1863056e3e4f399c285b67fa816f411a7bfa1c81ef50e186126164e396e59", - "sha256:ecd85f68b8cd9ab78a0141e87ea9a53b2f31fd9b1350a1c44da1f7481b5363ef", - "sha256:ed269b83750413e8fc5c96276372f49ee3fcb7ed61c49fe8e5a67f54459a5a4a", - "sha256:f19b0b80cba73b204dee68501870b11067711d21d243fb6774256d3ca2e5391f", - "sha256:ffdafb98db7574f9da84c489a10a5d582079a888cb43c64e9e6b0e3fe1034685" - ], - "version": "==4.3.3" + "sha256:00573dfa755d0703ab84bb23cb6ecf97bb683c34b340d4df76651f97b0bab068", + "sha256:092049280f2848d2ba1b57b71fe04881762a220a97b65288bcb0968bb199ec30", + "sha256:0cbd27b4d3718b5ec74fc65ffa53c78d34c65c6fd9411b8352d2a4f855220cf1", + "sha256:17fc7e16d0c81f833a138818a30f366696653d521febc8e892858041c4d88785", + "sha256:19577dfeb70e8a67249ba92c8ad20589a1a2d86a8d693647fa8385408a4c17b0", + "sha256:207aa914576b1181597a1516e1b90599dc690c095343ae281b0772e44945e6a4", + "sha256:219a7db5ed53e523eb4a4769f13105118b6d5b04ed169a283c9775af221e231f", + "sha256:2b50ea79849e46b5f4f2b0247a3687505d32d161eeb16a75f6f7e6cd81936e43", + "sha256:5903d38362b6c716e66bbe470f190579c530a5baf03dbc8500e5c2357aa569a5", + "sha256:5c24903675e271bd688c6e9e7df5775ac6b168feb87dbe0e4bcc90805f21b28f", + "sha256:5ef6bc5ed98139e084f4e91100f2b098a0cd3493d4e76f9d6b3f7b95d7ad0f06", + "sha256:61b55ae3c23a126a788b33ffb18f37d6668e79a05e756588d9e4d4be7246ab1c", + "sha256:63ddb992931a5e616c87d3d89f5a58db086e617548005c7f9059fac68c03a5cc", + "sha256:6943da9c09870490dcfd50c4909c0cc19f434fa6948f61282dc9cb07bcf08160", + "sha256:6ad40f85c1207803d581d5d75e9ea25327cd524925699a83dfc03bf8e4ba72b7", + "sha256:6b44433a79bdd7af0e3337bd7bbcf53dd1f9b0fa66bf21bcb756060ce32a96c1", + "sha256:6bbaa245015d933a4172395baad7874373f162955d73612f0b66b6c2c33b6366", + "sha256:7007227f4ea85b40a2f5e5a244479f6a6dfcf906db9b55e812a814a8f0e2c28d", + "sha256:74884a0aec1f1609190ec8b34b5d58fb3b5353cf22b96161e13e0e835f13518f", + "sha256:7d25fe5571ddb16369054f54cdd883f23de9941476d97f2b92eb6d7d83afe22d", + "sha256:7e162bdc5e3baad26b2262240be7d2bab36991d85a6a556e48b9dfb402370261", + "sha256:814d62678dc3a30f4aa081982d830b7c342cf230ffc9d030b020cb154eeebf9e", + "sha256:8878a34c5313ee52e20aa50b03138af8d472bae465710fb954d133a9bfd3c38d", + "sha256:a66a0d94e5b081d5d695e66d6667e91e74d79e273eee95c1747717ba9cb70792", + "sha256:a69f5cbf4addcfdf03dda564a671040127a6b7c34cf9fe4973582e68441b63fa", + "sha256:b00f9f0c334d07709d3f73a7cb8ae63c6ca1a90c790a63b5e7effa666ef96021", + "sha256:b6ed71e4a7b4690447b626f499d978aa13197a0e592950e5d7020308f6054698", + "sha256:bdf5041e5851526e885af579d2f455348dba68d74f14a32781933569a327fddf", + "sha256:be034360dd34e62608419f86e799c97d389c10a0e677a25f236a971b2f40dac9", + "sha256:cc8f590a5eed30b314ae6b0232d925519ade433f663de79cc3783e4b10d662ba", + "sha256:cd7a318a15fe6cc4584bf3c4426f092ed08c0fd012cf2a9173114234fe193e11", + "sha256:cf19b5f63a59c20306e034e691402b02055c8f4e38bf6792c23cad489162a642", + "sha256:cfc781ce442ec407c841e9aa51d0e1024f72b6ec34caa8fdb6ef9576d549acf2", + "sha256:dea9f6f8633571e18bc20cad83603072e697103a567f4b0738d52dd0211b4527", + "sha256:e4a86a1d5eb2cce83c5972b3930c7c1eac81ab3508464345e2b8e54f119d5505", + "sha256:e7106374d4a74ed9ff00c46cc00f0a9f06a0775f8868e423f85d4464d2333679", + "sha256:e98a8a585b5668aa9e34d10f7785abf9545fe72663b4bfc16c99a115185ae6a5", + "sha256:f64840e68483316eb58d82c376ad3585ca995e69e33b230436de0cdddf7363f9", + "sha256:f8f4b0a9e6683e43889852130595c8854d8ae237f2324a053cdd884de936aa9b", + "sha256:fc45a53219ed30a7f670a6d8c98527af0020e6fd4ee4c0a8fb59f147f06d816c" + ], + "version": "==4.3.5" } }, "develop": {} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 3b50a489f..e4893305b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -12,6 +12,7 @@ import mozilla.appservices.places.BookmarkRoot 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.R @@ -31,6 +32,7 @@ import org.mozilla.fenix.ui.robots.navigationToolbar /** * Tests for verifying basic functionality of bookmarks */ +@Ignore("To be re-implemented in https://github.com/mozilla-mobile/fenix/issues/17979") class BookmarksTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt new file mode 100644 index 000000000..c1c2d582e --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt @@ -0,0 +1,102 @@ +/* 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.core.net.toUri +import org.junit.After +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.TestHelper.packageName +import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled +import org.mozilla.fenix.helpers.TestHelper.verifyUrl +import org.mozilla.fenix.ui.robots.browserScreen +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests to verify some main UI flows with Network connection off + * + */ + +class NoNetworkAccessStartupTests { + + @get:Rule + val activityTestRule = HomeActivityTestRule(launchActivity = false) + + @After + fun tearDown() { + // Restoring network connection + setNetworkEnabled(true) + } + + @Test + // Based on STR from https://github.com/mozilla-mobile/fenix/issues/16886 + fun noNetworkConnectionStartupTest() { + setNetworkEnabled(false) + + activityTestRule.launchActivity(null) + + homeScreen { + }.dismissOnboarding() + homeScreen { + verifyHomeScreen() + } + } + + @Test + // Based on STR from https://github.com/mozilla-mobile/fenix/issues/16886 + fun networkInterruptedFromBrowserToHomeTest() { + val url = "example.com" + + activityTestRule.launchActivity(null) + + navigationToolbar { + }.enterURLAndEnterToBrowser(url.toUri()) {} + + setNetworkEnabled(false) + + browserScreen { + }.goToHomescreen { + verifyHomeScreen() + } + } + + @Test + fun testPageReloadAfterNetworkInterrupted() { + val url = "example.com" + + activityTestRule.launchActivity(null) + + navigationToolbar { + }.enterURLAndEnterToBrowser(url.toUri()) {} + + setNetworkEnabled(false) + + browserScreen { + }.openThreeDotMenu { + }.refreshPage {} + } + + @Test + fun testSignInPageWithNoNetworkConnection() { + setNetworkEnabled(false) + + activityTestRule.launchActivity(null) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openTurnOnSyncMenu { + tapOnUseEmailToSignIn() + verifyUrl( + "firefox.com", + "$packageName:id/mozac_browser_toolbar_url_view", + R.id.mozac_browser_toolbar_url_view + ) + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt index 3d37cf44e..e4b9ca94d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt @@ -5,22 +5,22 @@ package org.mozilla.fenix.ui import android.view.View +import androidx.test.espresso.IdlingRegistry 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.ui.robots.navigationToolbar -import androidx.test.espresso.IdlingRegistry -import org.junit.Ignore import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.mDevice +import org.mozilla.fenix.ui.robots.navigationToolbar /** * Tests for verifying basic functionality of content context menus @@ -125,6 +125,15 @@ class ReaderViewTest { toggleReaderView() mDevice.waitForIdle() } + browserScreen { + verifyPageContent(estimatedReadingTime) + } + navigationToolbar { + verifyCloseReaderViewDetected(true) + toggleReaderView() + mDevice.waitForIdle() + verifyReaderViewDetected(true) + } if (!FeatureFlags.toolbarMenuFeature) { browserScreen { @@ -134,12 +143,14 @@ class ReaderViewTest { }.closeBrowserMenuToBrowser { } } - navigationToolbar { - toggleReaderView() - mDevice.waitForIdle() - }.openThreeDotMenu { - verifyReaderViewAppearance(false) - }.close { } + if (!FeatureFlags.toolbarMenuFeature) { + navigationToolbar { + toggleReaderView() + mDevice.waitForIdle() + }.openThreeDotMenu { + verifyReaderViewAppearance(false) + }.close { } + } } @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt index ba101f0c9..8ef45be4b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.ui import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice +import androidx.test.uiautomator.UiSelector import okhttp3.mockwebserver.MockWebServer import org.junit.Rule import org.junit.Before @@ -15,6 +16,7 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.ui.robots.clickRateButtonGooglePlay import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.mDevice /** * Tests for verifying the main three dot menu options @@ -65,8 +67,10 @@ class SettingsAboutTest { }.openSettings { clickRateButtonGooglePlay() verifyGooglePlayRedirect() + // press back to return to the app, or accept ToS if still visible + mDevice.pressBack() + dismissGooglePlayToS() } - } @Test @@ -79,3 +83,9 @@ class SettingsAboutTest { } } } + +private fun dismissGooglePlayToS() { + if (mDevice.findObject(UiSelector().textContains("Terms of Service")).exists()) { + mDevice.findObject(UiSelector().textContains("ACCEPT")).click() + } +} 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 14d03757a..a20877bd3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt @@ -10,6 +10,7 @@ import androidx.test.uiautomator.UiDevice 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.FenixApplication @@ -105,6 +106,7 @@ class SettingsBasicsTest { } @Test + @Ignore("To be re-implemented in https://github.com/mozilla-mobile/fenix/issues/17979") fun toggleShowVisitedSitesAndBookmarks() { // Bookmarks a few websites, toggles the history and bookmarks setting to off, then verifies if the visited and bookmarked websites do not show in the suggestions. val page1 = getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 6cc2b33d8..3a5cd31ca 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -322,6 +322,7 @@ class SmokeTest { @Test // Verifies the Bookmark button in a tab's 3 dot menu + @Ignore("To be re-implemented in https://github.com/mozilla-mobile/fenix/issues/17979") fun mainMenuBookmarkButtonTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -405,7 +406,7 @@ class SmokeTest { }.goBackToHomeScreen {} navigationToolbar { - }.enterURLAndEnterToBrowser(trackingPage.url) {} + }.openTrackingProtectionTestPage(trackingPage.url, true) {} enhancedTrackingProtection { dismissTrackingOnboarding() @@ -630,7 +631,7 @@ class SmokeTest { IdlingRegistry.getInstance().unregister(addonsListIdlingResource!!) }.goBack { }.openNavigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionPage.url) {} + }.openTrackingProtectionTestPage(trackingProtectionPage.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() }.closeNotificationPopup {} @@ -980,6 +981,7 @@ class SmokeTest { @Test // Verifies that deleting a Bookmarks folder also removes the item from inside it. + @Ignore("To be re-implemented in https://github.com/mozilla-mobile/fenix/issues/17799") fun deleteNonEmptyBookmarkFolderTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -1056,6 +1058,33 @@ class SmokeTest { } } + @Test + fun selectTabsButtonVisibilityTest() { + homeScreen { + }.dismissOnboarding() + + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + mDevice.waitForIdle() + }.openTabDrawer { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + mDevice.waitForIdle() + }.openTabDrawer { + }.toggleToPrivateTabs { + }.openNewTab { + }.dismissSearchBar { } + + homeScreen { + }.openTabDrawer { + }.toggleToNormalTabs { + verifySelectTabsButton() + } + } + @Test fun privateTabsTrayWithOpenedTabTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt index c3583b70d..9e7494152 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt @@ -83,7 +83,7 @@ class StrictEnhancedTrackingProtectionTest { TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) navigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionTest.url) {} + }.openTrackingProtectionTestPage(trackingProtectionTest.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() @@ -96,7 +96,7 @@ class StrictEnhancedTrackingProtectionTest { TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) navigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionTest.url) {} + }.openTrackingProtectionTestPage(trackingProtectionTest.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() @@ -113,7 +113,7 @@ class StrictEnhancedTrackingProtectionTest { TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) navigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionTest.url) {} + }.openTrackingProtectionTestPage(trackingProtectionTest.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() @@ -133,7 +133,7 @@ class StrictEnhancedTrackingProtectionTest { TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) navigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionTest.url) {} + }.openTrackingProtectionTestPage(trackingProtectionTest.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() @@ -164,7 +164,7 @@ class StrictEnhancedTrackingProtectionTest { TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) navigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionTest.url) {} + }.openTrackingProtectionTestPage(trackingProtectionTest.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() @@ -196,7 +196,7 @@ class StrictEnhancedTrackingProtectionTest { TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) navigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionTest.url) {} + }.openTrackingProtectionTestPage(trackingProtectionTest.url, true) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index 0d29f036e..2db81496c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -150,7 +150,7 @@ class HomeScreenRobot { fun confirmDeleteCollection() { onView(allOf(withText("DELETE"))).click() mDevice.waitNotNull( - findObject(By.res("org.mozilla.fenix.debug:id/no_collections_header")), + findObject(By.res("$packageName:id/no_collections_header")), waitingTime ) } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt index 1a0ad0075..e6c3d13d2 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt @@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.IdlingRegistry import androidx.test.espresso.IdlingResource -import androidx.test.espresso.ViewInteraction +import androidx.test.espresso.IdlingResourceTimeoutException import androidx.test.espresso.action.ViewActions import androidx.test.espresso.action.ViewActions.pressImeActionButton import androidx.test.espresso.action.ViewActions.replaceText @@ -21,6 +21,7 @@ import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId @@ -60,12 +61,21 @@ class NavigationToolbarRobot { fun verifyTabButtonShortcutMenuItems() = assertTabButtonShortcutMenuItems() - fun verifyReaderViewDetected(visible: Boolean = false): ViewInteraction = + fun verifyReaderViewDetected(visible: Boolean = false) = assertReaderViewDetected(visible) + fun verifyCloseReaderViewDetected(visible: Boolean = false) = + assertCloseReaderViewDetected(visible) + fun typeSearchTerm(searchTerm: String) = awesomeBar().perform(typeText(searchTerm)) - fun toggleReaderView() = readerViewToggle().click() + fun toggleReaderView() { + mDevice.findObject(UiSelector() + .resourceId("$packageName:id/mozac_browser_toolbar_page_actions")) + .waitForExists(waitingTime) + + readerViewToggle().click() + } class Transition { @@ -73,15 +83,7 @@ class NavigationToolbarRobot { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) fun goBackToWebsite(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { - mDevice.waitNotNull( - Until.findObject(By.res("$packageName:id/toolbar")), - waitingTime - ) - urlBar().click() - mDevice.waitNotNull( - Until.findObject(By.res("$packageName:id/mozac_browser_toolbar_edit_url_view")), - waitingTime - ) + openEditURLView() clearAddressBar().click() awesomeBar().check((matches(withText(containsString(""))))) goBackButton() @@ -96,14 +98,7 @@ class NavigationToolbarRobot { ): BrowserRobot.Transition { sessionLoadedIdlingResource = SessionLoadedIdlingResource() - mDevice.waitNotNull(Until.findObject(By.res("$packageName:id/toolbar")), - waitingTime - ) - urlBar().click() - mDevice.waitNotNull( - Until.findObject(By.res("$packageName:id/mozac_browser_toolbar_edit_url_view")), - waitingTime - ) + openEditURLView() awesomeBar().perform(replaceText(url.toString()), pressImeActionButton()) @@ -122,19 +117,55 @@ class NavigationToolbarRobot { return BrowserRobot.Transition() } + fun openTrackingProtectionTestPage(url: Uri, etpEnabled: Boolean, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + sessionLoadedIdlingResource = SessionLoadedIdlingResource() + + openEditURLView() + + awesomeBar().perform(replaceText(url.toString()), pressImeActionButton()) + + runWithIdleRes(sessionLoadedIdlingResource) { + when (etpEnabled) { + true -> + try { + onView(withId(R.id.onboarding_message)) + .check(matches(isDisplayed())) + } catch (e: IdlingResourceTimeoutException) { + openThreeDotMenu { + }.stopPageLoad { + val onboardingDisplayed = + mDevice.findObject(UiSelector().resourceId("$packageName:id/onboarding_message")) + .waitForExists(waitingTime) + + if (!onboardingDisplayed) { + openThreeDotMenu { + }.refreshPage {} + } + } + } + + false -> + try { + onView(withResourceName("browserLayout")).check(matches(isDisplayed())) + } catch (e: IdlingResourceTimeoutException) { + openThreeDotMenu { + }.stopPageLoad { + }.openThreeDotMenu { + }.refreshPage {} + } + } + } + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openTabCrashReporter(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { val crashUrl = "about:crashcontent" sessionLoadedIdlingResource = SessionLoadedIdlingResource() - mDevice.waitNotNull(Until.findObject(By.res("$packageName:id/toolbar")), - waitingTime - ) - urlBar().click() - mDevice.waitNotNull( - Until.findObject(By.res("$packageName:id/mozac_browser_toolbar_edit_url_view")), - waitingTime - ) + openEditURLView() awesomeBar().perform(replaceText(crashUrl), pressImeActionButton()) @@ -277,6 +308,18 @@ fun clickUrlbar(interact: SearchRobot.() -> Unit): SearchRobot.Transition { return SearchRobot.Transition() } +fun openEditURLView() { + mDevice.waitNotNull( + Until.findObject(By.res("$packageName:id/toolbar")), + waitingTime + ) + urlBar().click() + mDevice.waitNotNull( + Until.findObject(By.res("$packageName:id/mozac_browser_toolbar_edit_url_view")), + waitingTime + ) +} + private fun assertSuggestionsAreEqualTo(suggestionSize: Int) { mDevice.waitForIdle() onView(withId(R.id.awesome_bar)).check(suggestionsAreEqualTo(suggestionSize)) @@ -312,7 +355,11 @@ private fun goBackButton() = mDevice.pressBack() private fun readerViewToggle() = onView(withParent(withId(R.id.mozac_browser_toolbar_page_actions))) -private fun assertReaderViewDetected(visible: Boolean) = +private fun assertReaderViewDetected(visible: Boolean) { + mDevice.findObject(UiSelector() + .description("Reader view")) + .waitForExists(waitingTime) + onView( allOf( withParent(withId(R.id.mozac_browser_toolbar_page_actions)), @@ -322,6 +369,23 @@ private fun assertReaderViewDetected(visible: Boolean) = if (visible) matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)) else ViewAssertions.doesNotExist() ) +} + +private fun assertCloseReaderViewDetected(visible: Boolean) { + mDevice.findObject(UiSelector() + .description("Close reader view")) + .waitForExists(waitingTime) + + onView( + allOf( + withParent(withId(R.id.mozac_browser_toolbar_page_actions)), + withContentDescription("Close reader view") + ) + ).check( + if (visible) matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)) + else ViewAssertions.doesNotExist() + ) +} inline fun runWithIdleRes(ir: IdlingResource?, pendingCheck: () -> Unit) { try { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt index 2c7ffe6ac..7ebbb0528 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt @@ -13,27 +13,23 @@ import org.mozilla.fenix.helpers.ext.waitNotNull class NotificationRobot { fun verifySystemNotificationExists(notificationMessage: String) { - fun notificationTray() = UiScrollable( UiSelector().resourceId("com.android.systemui:id/notification_stack_scroller") ) - val notificationFound: Boolean - - notificationFound = try { - notificationTray().getChildByText( - UiSelector().text(notificationMessage), notificationMessage, true - ).exists() - } catch (e: UiObjectNotFoundException) { - false - } - - if (!notificationFound) { - // swipe 2 times to expand the silent notifications on API 28 and higher, single-swipe doesn't do it - notificationTray().swipeUp(2) - val notification = mDevice.findObject(UiSelector().textContains(notificationMessage)) - assertTrue(notification.exists()) - } + var notificationFound = false + + do { + try { + notificationFound = notificationTray().getChildByText( + UiSelector().text(notificationMessage), notificationMessage, true + ).waitForExists(waitingTime) + assertTrue(notificationFound) + } catch (e: UiObjectNotFoundException) { + notificationTray().scrollForward() + mDevice.waitForIdle() + } + } while (!notificationFound) } fun verifySystemNotificationGone(notificationMessage: String) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt index 0f84a9ef0..b1f2f647a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt @@ -77,6 +77,7 @@ class TabDrawerRobot { fun verifyPrivateModeSelected() = assertPrivateModeSelected() fun verifyNormalModeSelected() = assertNormalModeSelected() fun verifyNewTabButton() = assertNewTabButton() + fun verifySelectTabsButton() = assertSelectTabsButton() fun verifyTabTrayOverflowMenu(visibility: Boolean) = assertTabTrayOverflowButton(visibility) fun verifyTabTrayIsClosed() = assertTabTrayDoesNotExist() @@ -137,7 +138,7 @@ class TabDrawerRobot { fun snackBarButtonClick(expectedText: String) { mDevice.findObject( - UiSelector().resourceId("org.mozilla.fenix.debug:id/snackbar_btn") + UiSelector().resourceId("$packageName:id/snackbar_btn") ).waitForExists(waitingTime) onView(allOf(withId(R.id.snackbar_btn), withText(expectedText))).check( matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)) @@ -391,6 +392,10 @@ private fun assertNewTabButton() = onView(withId(R.id.new_tab_button)) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) +private fun assertSelectTabsButton() = + onView(withText("Select tabs")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertNormalModeSelected() = normalBrowsingButton() .check(matches(ViewMatchers.isSelected())) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index cc2304f33..71d03cbc5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -280,6 +280,14 @@ class ThreeDotMenuMainRobot { return BrowserRobot.Transition() } + fun stopPageLoad(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.desc("Stop")), waitingTime) + stopLoadingButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun closeAllTabs(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { closeAllTabsButton().click() @@ -444,6 +452,8 @@ private fun refreshButton() = onView(ViewMatchers.withContentDescription("Refres private fun assertRefreshButton() = refreshButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun stopLoadingButton() = onView(ViewMatchers.withContentDescription("Stop")) + private fun closeAllTabsButton() = onView(allOf(withText("Close all tabs"))).inRoot(RootMatchers.isPlatformPopup()) private fun assertCloseAllTabsButton() = closeAllTabsButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml index 3d25c0db6..0b66b4956 100644 --- a/app/src/debug/AndroidManifest.xml +++ b/app/src/debug/AndroidManifest.xml @@ -18,6 +18,25 @@ + android:name="org.mozilla.fenix.DebugFenixApplication"> + + + + + + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b1b84e842..b13db0148 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,10 @@ + + + + + + + + + + diff --git a/app/src/main/assets/extensions/ads/ads.js b/app/src/main/assets/extensions/ads/ads.js index 152994f93..356bda2d2 100644 --- a/app/src/main/assets/extensions/ads/ads.js +++ b/app/src/main/assets/extensions/ads/ads.js @@ -14,28 +14,39 @@ function collectLinks(urls) { } } -function sendLinks() { +function sendLinks(cookies) { let urls = []; collectLinks(urls); let message = { 'url': document.location.href, - 'urls': urls + 'urls': urls, + 'cookies': cookies }; browser.runtime.sendNativeMessage("MozacBrowserAds", message); } +function notify(message) { + sendLinks(message.cookies); +} + +browser.runtime.onMessage.addListener(notify); + const events = ["pageshow", "load", "unload"]; var timeout; const eventLogger = event => { switch (event.type) { case "load": - timeout = setTimeout(sendLinks, ADLINK_CHECK_TIMEOUT_MS); + timeout = setTimeout(() => { + browser.runtime.sendMessage({ "checkCookies": true }); + }, ADLINK_CHECK_TIMEOUT_MS) break; case "pageshow": if (event.persisted) { - timeout = setTimeout(sendLinks, ADLINK_CHECK_TIMEOUT_MS); + timeout = setTimeout(() => { + browser.runtime.sendMessage({ "checkCookies": true }); + }, ADLINK_CHECK_TIMEOUT_MS) } break; case "unload": diff --git a/app/src/main/assets/extensions/ads/adsBackground.js b/app/src/main/assets/extensions/ads/adsBackground.js new file mode 100644 index 000000000..63b6f0fb9 --- /dev/null +++ b/app/src/main/assets/extensions/ads/adsBackground.js @@ -0,0 +1,28 @@ +/* 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/. */ + +browser.runtime.onMessage.addListener(notify); + +function sendMessageToTabs(tabs, cookies) { + for (let tab of tabs) { + browser.tabs.sendMessage( + tab.id, + { cookies } + ); + } +} + +function notify(message) { + if (message.checkCookies) { + browser.cookies.getAll({}) + .then(cookies => { + browser.tabs.query({ + currentWindow: true, + active: true + }).then(tabs => { + sendMessageToTabs(tabs, cookies); + }); + }); + } +} diff --git a/app/src/main/assets/extensions/ads/manifest.template.json b/app/src/main/assets/extensions/ads/manifest.template.json index 41d9e9bd1..8f4ef48f6 100644 --- a/app/src/main/assets/extensions/ads/manifest.template.json +++ b/app/src/main/assets/extensions/ads/manifest.template.json @@ -19,9 +19,20 @@ "run_at": "document_end" } ], + "background": { + "scripts": ["adsBackground.js"] + }, "permissions": [ "geckoViewAddons", "nativeMessaging", - "nativeMessagingFromContent" + "nativeMessagingFromContent", + "geckoViewAddons", + "nativeMessaging", + "nativeMessagingFromContent", + "webNavigation", + "webRequest", + "webRequestBlocking", + "cookies", + "*://*/*" ] } diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index ef345a982..2afaad067 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -19,6 +19,16 @@ object FeatureFlags { */ const val nimbusExperiments = false + /** + * Enables the Addresses autofill feature. + */ + val addressesFeature = true + + /** + * Enables the Credit Cards autofill feature. + */ + val creditCardsFeature = true + /** * Enables WebAuthn support. */ @@ -28,4 +38,14 @@ object FeatureFlags { * Shows new three-dot toolbar menu design. */ val toolbarMenuFeature = Config.channel.isDebug + + /** + * Enables the tabs tray re-write with Synced Tabs. + */ + val tabsTrayRewrite = Config.channel.isDebug + + /** + * Enables the updated icon set look and feel. + */ + val newIconSet = Config.channel.isNightlyOrDebug } diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 0731fbb72..837ccbf95 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -10,6 +10,7 @@ import android.os.Build.VERSION.SDK_INT import android.os.StrictMode import android.util.Log.INFO import androidx.annotation.CallSuper +import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.getSystemService import androidx.work.Configuration.Builder @@ -23,7 +24,10 @@ import mozilla.appservices.Megazord import mozilla.components.browser.state.action.SystemAction import mozilla.components.browser.state.selector.selectedTab import mozilla.components.concept.base.crash.Breadcrumb +import mozilla.components.concept.engine.webextension.WebExtension +import mozilla.components.concept.engine.webextension.isUnsupported import mozilla.components.concept.push.PushProcessor +import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker import mozilla.components.feature.addons.update.GlobalAddonDependencyProvider import mozilla.components.lib.crash.CrashReporter import mozilla.components.service.glean.Glean @@ -39,10 +43,13 @@ import mozilla.components.support.rusthttp.RustHttpConfig import mozilla.components.support.rustlog.RustLog import mozilla.components.support.utils.logElapsedTime import mozilla.components.support.webextensions.WebExtensionSupport +import org.mozilla.fenix.GleanMetrics.GleanBuildInfo +import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.PerfStartup import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.metrics.MetricServiceType import org.mozilla.fenix.components.metrics.SecurePrefsTelemetry +import org.mozilla.fenix.ext.measureNoInline import org.mozilla.fenix.ext.settings import org.mozilla.fenix.perf.ProfilerMarkerFactProcessor import org.mozilla.fenix.perf.StartupTimeline @@ -73,7 +80,10 @@ open class FenixApplication : LocaleAwareApplication(), Provider { private set override fun onCreate() { - val methodDurationTimerId = PerfStartup.applicationOnCreate.start() // DO NOT MOVE ANYTHING ABOVE HERE. + // We use start/stop instead of measure so we don't measure outside the main process. + val completeMethodDurationTimerId = PerfStartup.applicationOnCreate.start() // DO NOT MOVE ANYTHING ABOVE HERE. + val subsectionThroughGleanTimerId = PerfStartup.appOnCreateToGleanInit.start() + super.onCreate() setupInAllProcesses() @@ -94,10 +104,12 @@ open class FenixApplication : LocaleAwareApplication(), Provider { initializeGlean() } + PerfStartup.appOnCreateToGleanInit.stopAndAccumulate(subsectionThroughGleanTimerId) + setupInMainProcessOnly() - // We use start/stop instead of measure so we don't measure outside the main process. - PerfStartup.applicationOnCreate.stopAndAccumulate(methodDurationTimerId) // DO NOT MOVE ANYTHING BELOW HERE. + // DO NOT MOVE ANYTHING BELOW THIS stop CALL. + PerfStartup.applicationOnCreate.stopAndAccumulate(completeMethodDurationTimerId) } protected open fun initializeGlean() { @@ -112,7 +124,16 @@ open class FenixApplication : LocaleAwareApplication(), Provider { httpClient = ConceptFetchHttpUploader( lazy(LazyThreadSafetyMode.NONE) { components.core.client } )), - uploadEnabled = telemetryEnabled + uploadEnabled = telemetryEnabled, + buildInfo = GleanBuildInfo.buildInfo + ) + + // Set this early to guarantee it's in every ping from here on. + Metrics.distributionId.set( + when (Config.channel.isMozillaOnline) { + true -> "MozillaOnline" + false -> "Mozilla" + } ) } @@ -126,48 +147,53 @@ open class FenixApplication : LocaleAwareApplication(), Provider { @CallSuper open fun setupInMainProcessOnly() { - ProfilerMarkerFactProcessor.create { components.core.engine.profiler }.register() + PerfStartup.appOnCreateToMegazordInit.measureNoInline { + ProfilerMarkerFactProcessor.create { components.core.engine.profiler }.register() - run { - // Attention: Do not invoke any code from a-s in this scope. - val megazordSetup = setupMegazord() + run { + // Attention: Do not invoke any code from a-s in this scope. + val megazordSetup = setupMegazord() - setDayNightTheme() - components.strictMode.enableStrictMode(true) - warmBrowsersCache() + setDayNightTheme() + components.strictMode.enableStrictMode(true) + warmBrowsersCache() - // Make sure the engine is initialized and ready to use. - components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { - components.core.engine.warmUp() - } - initializeWebExtensionSupport() - restoreBrowserState() - restoreDownloads() - - // Just to make sure it is impossible for any application-services pieces - // to invoke parts of itself that require complete megazord initialization - // before that process completes, we wait here, if necessary. - if (!megazordSetup.isCompleted) { - runBlockingIncrement { megazordSetup.await() } + // Make sure the engine is initialized and ready to use. + components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { + components.core.engine.warmUp() + } + initializeWebExtensionSupport() + restoreBrowserState() + restoreDownloads() + restoreLocale() + + // Just to make sure it is impossible for any application-services pieces + // to invoke parts of itself that require complete megazord initialization + // before that process completes, we wait here, if necessary. + if (!megazordSetup.isCompleted) { + runBlockingIncrement { megazordSetup.await() } + } } } - setupLeakCanary() - startMetricsIfEnabled() - setupPush() + PerfStartup.appOnCreateToSetupInMain.measureNoInline { + setupLeakCanary() + startMetricsIfEnabled() + setupPush() - visibilityLifecycleCallback = VisibilityLifecycleCallback(getSystemService()) - registerActivityLifecycleCallbacks(visibilityLifecycleCallback) + visibilityLifecycleCallback = VisibilityLifecycleCallback(getSystemService()) + registerActivityLifecycleCallbacks(visibilityLifecycleCallback) - // Storage maintenance disabled, for now, as it was interfering with background migrations. - // See https://github.com/mozilla-mobile/fenix/issues/7227 for context. - // if ((System.currentTimeMillis() - settings().lastPlacesStorageMaintenance) > ONE_DAY_MILLIS) { - // runStorageMaintenance() - // } + // Storage maintenance disabled, for now, as it was interfering with background migrations. + // See https://github.com/mozilla-mobile/fenix/issues/7227 for context. + // if ((System.currentTimeMillis() - settings().lastPlacesStorageMaintenance) > ONE_DAY_MILLIS) { + // runStorageMaintenance() + // } - initVisualCompletenessQueueAndQueueTasks() + initVisualCompletenessQueueAndQueueTasks() - components.appStartupTelemetry.onFenixApplicationOnCreate() + components.appStartupTelemetry.onFenixApplicationOnCreate() + } } private fun restoreBrowserState() = GlobalScope.launch(Dispatchers.Main) { @@ -188,6 +214,10 @@ open class FenixApplication : LocaleAwareApplication(), Provider { components.useCases.downloadUseCases.restoreDownloads() } + private fun restoreLocale() { + components.useCases.localeUseCases.restore() + } + private fun initVisualCompletenessQueueAndQueueTasks() { val queue = components.performance.visualCompletenessQueue.queue @@ -454,7 +484,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { }, onExtensionsLoaded = { extensions -> components.addonUpdater.registerForFutureUpdates(extensions) - components.supportedAddonsChecker.registerForChecks() + subscribeForNewAddonsIfNeeded(components.supportedAddonsChecker, extensions) }, onUpdatePermissionRequest = components.addonUpdater::onUpdatePermissionRequest ) @@ -463,6 +493,21 @@ open class FenixApplication : LocaleAwareApplication(), Provider { } } + @VisibleForTesting + internal fun subscribeForNewAddonsIfNeeded( + checker: DefaultSupportedAddonsChecker, + installedExtensions: List + ) { + val hasUnsupportedAddons = installedExtensions.any { it.isUnsupported() } + if (hasUnsupportedAddons) { + checker.registerForChecks() + } else { + // As checks are a persistent subscriptions, we have to make sure + // we remove any previous subscriptions. + checker.unregisterForChecks() + } + } + protected fun recordOnInit() { // This gets called by more than one process. Ideally we'd only run this in the main process // but the code to check which process we're in crashes because the Context isn't valid yet. diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index a648c64a7..c85a39d76 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -77,6 +77,7 @@ import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExcepti import org.mozilla.fenix.ext.alreadyOnDestination import org.mozilla.fenix.ext.breadcrumb import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.measureNoInline import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.settings @@ -164,7 +165,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { private lateinit var navigationToolbar: Toolbar - final override fun onCreate(savedInstanceState: Bundle?): Unit = PerfStartup.homeActivityOnCreate.measure { + final override fun onCreate(savedInstanceState: Bundle?): Unit = PerfStartup.homeActivityOnCreate.measureNoInline { // DO NOT MOVE ANYTHING ABOVE THIS addMarker CALL. components.core.engine.profiler?.addMarker("Activity.onCreate", "HomeActivity") @@ -321,7 +322,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } } - override fun onStart() { + override fun onStart() = PerfStartup.homeActivityOnStart.measureNoInline { super.onStart() // Diagnostic breadcrumb for "Display already aquired" crash: @@ -359,10 +360,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { window.addFlags(FLAG_SECURE) } - // We will remove this when AC code lands to emit a fact on getTopSites in DefaultTopSitesStorage - // https://github.com/mozilla-mobile/android-components/issues/8679 - settings().topSitesSize = components.core.topSitesStorage.cachedTopSites.size - lifecycleScope.launch(IO) { components.core.bookmarksStorage.getTree(BookmarkRoot.Root.id, true)?.let { val desktopRootNode = DesktopFolders( diff --git a/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt b/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt index 53a55bdfd..d4dad123e 100644 --- a/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt @@ -24,7 +24,7 @@ import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry import org.mozilla.fenix.utils.Settings -import org.mozilla.fenix.GleanMetrics.Engine as EngineMetrics +import org.mozilla.fenix.GleanMetrics.EngineTab as EngineMetrics /** * [Middleware] to record telemetry in response to [BrowserAction]s. @@ -138,24 +138,24 @@ class TelemetryMiddleware( } val isSelected = tab.id == state.selectedTabId - val ageNanos = tab.engineState.ageNanos() + val age = tab.engineState.age() // Increment the counter of killed foreground/background tabs val tabKillLabel = if (isSelected) { "foreground" } else { "background" } - EngineMetrics.tabKills[tabKillLabel].add() + EngineMetrics.kills[tabKillLabel].add() // Record the age of the engine session of the killed foreground/background tab. - if (isSelected && ageNanos != null) { - EngineMetrics.killForegroundAge.setRawNanos(ageNanos) - } else if (ageNanos != null) { - EngineMetrics.killBackgroundAge.setRawNanos(ageNanos) + if (isSelected && age != null) { + EngineMetrics.killForegroundAge.accumulateSamples(listOf(age).toLongArray()) + } else if (age != null) { + EngineMetrics.killBackgroundAge.accumulateSamples(listOf(age).toLongArray()) } } } @Suppress("MagicNumber") -private fun EngineState.ageNanos(): Long? { +private fun EngineState.age(): Long? { val timestamp = (timestamp ?: return null) val now = Clock.elapsedRealtime() - return (now - timestamp) * 1_000_000 + return (now - timestamp) } diff --git a/app/src/main/java/org/mozilla/fenix/autofill/AutofillConfirmActivity.kt b/app/src/main/java/org/mozilla/fenix/autofill/AutofillConfirmActivity.kt new file mode 100644 index 000000000..219fe95c8 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/autofill/AutofillConfirmActivity.kt @@ -0,0 +1,19 @@ +/* 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.autofill + +import android.os.Build +import androidx.annotation.RequiresApi +import mozilla.components.feature.autofill.AutofillConfiguration +import mozilla.components.feature.autofill.ui.AbstractAutofillConfirmActivity +import org.mozilla.fenix.ext.components + +/** + * Activity responsible for asking the user to confirm before auto-filling a third-party app. + */ +@RequiresApi(Build.VERSION_CODES.O) +class AutofillConfirmActivity : AbstractAutofillConfirmActivity() { + override val configuration: AutofillConfiguration by lazy { components.autofillConfiguration } +} diff --git a/app/src/main/java/org/mozilla/fenix/autofill/AutofillService.kt b/app/src/main/java/org/mozilla/fenix/autofill/AutofillService.kt new file mode 100644 index 000000000..9ec8acf5e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/autofill/AutofillService.kt @@ -0,0 +1,19 @@ +/* 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.autofill + +import android.os.Build +import androidx.annotation.RequiresApi +import mozilla.components.feature.autofill.AbstractAutofillService +import mozilla.components.feature.autofill.AutofillConfiguration +import org.mozilla.fenix.ext.components + +/** + * Service responsible for implementing Android's Autofill framework. + */ +@RequiresApi(Build.VERSION_CODES.O) +class AutofillService : AbstractAutofillService() { + override val configuration: AutofillConfiguration by lazy { components.autofillConfiguration } +} diff --git a/app/src/main/java/org/mozilla/fenix/autofill/AutofillUnlockActivity.kt b/app/src/main/java/org/mozilla/fenix/autofill/AutofillUnlockActivity.kt new file mode 100644 index 000000000..2e3a1a389 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/autofill/AutofillUnlockActivity.kt @@ -0,0 +1,19 @@ +/* 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.autofill + +import android.os.Build +import androidx.annotation.RequiresApi +import mozilla.components.feature.autofill.AutofillConfiguration +import mozilla.components.feature.autofill.ui.AbstractAutofillUnlockActivity +import org.mozilla.fenix.ext.components + +/** + * Activity responsible for unlocking the autofill service by asking the user to verify. + */ +@RequiresApi(Build.VERSION_CODES.O) +class AutofillUnlockActivity : AbstractAutofillUnlockActivity() { + override val configuration: AutofillConfiguration by lazy { components.autofillConfiguration } +} diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index ecc49681e..29b2ec9af 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -80,7 +80,6 @@ import mozilla.components.service.sync.logins.DefaultLoginValidationDelegate import mozilla.components.support.base.feature.PermissionsFeature import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper -import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged @@ -110,7 +109,6 @@ import org.mozilla.fenix.downloads.DynamicDownloadDialog import org.mozilla.fenix.ext.accessibilityManager import org.mozilla.fenix.ext.breadcrumb import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.enterToImmersiveMode import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.hideToolbar import org.mozilla.fenix.ext.metrics @@ -129,6 +127,10 @@ import java.lang.ref.WeakReference import mozilla.components.feature.session.behavior.EngineViewBrowserToolbarBehavior import mozilla.components.feature.webauthn.WebAuthnFeature import mozilla.components.support.base.feature.ActivityResultHandler +import org.mozilla.fenix.GleanMetrics.PerfStartup +import org.mozilla.fenix.ext.enterToImmersiveMode +import org.mozilla.fenix.ext.exitImmersiveModeIfNeeded +import org.mozilla.fenix.ext.measureNoInline import mozilla.components.feature.session.behavior.ToolbarPosition as MozacToolbarPosition /** @@ -197,7 +199,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { + ): View = PerfStartup.baseBfragmentOnCreateView.measureNoInline { customTabSessionId = requireArguments().getString(EXTRA_SESSION_ID) // Diagnostic breadcrumb for "Display already aquired" crash: @@ -220,10 +222,11 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit ) } - return view + view } - final override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + final override fun onViewCreated(view: View, savedInstanceState: Bundle?) = + PerfStartup.baseBfragmentOnViewCreated.measureNoInline { // weird indentation to avoid breaking blame. initializeUI(view) if (customTabSessionId == null) { @@ -240,6 +243,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit } requireContext().accessibilityManager.addAccessibilityStateChangeListener(this) + Unit } private fun initializeUI(view: View) { @@ -294,7 +298,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit thumbnailsFeature.get()?.requestScreenshot() findNavController().nav( R.id.browserFragment, - BrowserFragmentDirections.actionGlobalTabTrayDialogFragment() + getTrayDirection(context) ) }, onCloseTab = { closedSession -> @@ -474,13 +478,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit didFail = downloadJobStatus == DownloadState.Status.FAILED, tryAgain = downloadFeature::tryAgain, onCannotOpenFile = { - FenixSnackbar.make( - view = view.browserLayout, - duration = Snackbar.LENGTH_SHORT, - isDisplayedWithBrowserToolbar = true - ) - .setText(context.getString(R.string.mozac_feature_downloads_could_not_open_file)) - .show() + showCannotOpenFileError(view.browserLayout, context, it) }, view = view.viewDynamicDownloadDialog, toolbarHeight = toolbarHeight, @@ -783,16 +781,6 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit } } - val onCannotOpenFile = { - FenixSnackbar.make( - view = view.browserLayout, - duration = Snackbar.LENGTH_SHORT, - isDisplayedWithBrowserToolbar = true - ) - .setText(context.getString(R.string.mozac_feature_downloads_could_not_open_file)) - .show() - } - val onDismiss: () -> Unit = { sharedViewModel.downloadDialogState.remove(sessionId) } @@ -802,7 +790,9 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit metrics = requireComponents.analytics.metrics, didFail = savedDownloadState.second, tryAgain = onTryAgain, - onCannotOpenFile = onCannotOpenFile, + onCannotOpenFile = { + showCannotOpenFileError(view.browserLayout, context, it) + }, view = view.viewDynamicDownloadDialog, toolbarHeight = toolbarHeight, onDismiss = onDismiss @@ -1280,6 +1270,30 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit ) } + private fun showCannotOpenFileError( + view: View, + context: Context, + downloadState: DownloadState + ) { + FenixSnackbar.make( + view = view, + duration = Snackbar.LENGTH_SHORT, + isDisplayedWithBrowserToolbar = true + ).setText(DynamicDownloadDialog.getCannotOpenFileErrorMessage(context, downloadState)) + .show() + } + + /** + * Retrieves the correct tray direction while using a feature flag. + * + * Remove this when [FeatureFlags.tabsTrayRewrite] is removed. + */ + private fun getTrayDirection(context: Context) = if (context.settings().tabsTrayRewrite) { + BrowserFragmentDirections.actionGlobalTabsTrayFragment() + } else { + BrowserFragmentDirections.actionGlobalTabTrayDialogFragment() + } + companion object { private const val KEY_CUSTOM_TAB_SESSION_ID = "custom_tab_session_id" private const val REQUEST_CODE_DOWNLOAD_PERMISSIONS = 1 diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt index e0d49dd17..109083de1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt @@ -98,7 +98,8 @@ class Analytics( AdjustMetricsService(context as Application) ), isDataTelemetryEnabled = { context.settings().isTelemetryEnabled }, - isMarketingDataTelemetryEnabled = { context.settings().isMarketingTelemetryEnabled } + isMarketingDataTelemetryEnabled = { context.settings().isMarketingTelemetryEnabled }, + context.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 52ba15e31..6522fed85 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -8,11 +8,13 @@ import android.app.Application import android.content.Context import android.content.Intent import androidx.core.net.toUri +import com.google.android.play.core.review.ReviewManagerFactory import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker import mozilla.components.feature.addons.migration.SupportedAddonsChecker import mozilla.components.feature.addons.update.AddonUpdater import mozilla.components.feature.addons.update.DefaultAddonUpdater +import mozilla.components.feature.autofill.AutofillConfiguration import mozilla.components.feature.sitepermissions.SitePermissionsStorage import mozilla.components.lib.publicsuffixlist.PublicSuffixList import mozilla.components.support.migration.state.MigrationStore @@ -20,6 +22,8 @@ import io.github.forkmaintainers.iceraven.components.PagedAddonCollectionProvide import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R +import org.mozilla.fenix.autofill.AutofillUnlockActivity import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.components.metrics.AppStartupTelemetry import org.mozilla.fenix.ext.components @@ -67,11 +71,10 @@ class Components(private val context: Context) { core.topSitesStorage ) } - @Suppress("Deprecation") + val intentProcessors by lazyMonitored { IntentProcessors( context, - core.sessionManager, core.store, useCases.sessionUseCases, useCases.tabsUseCases, @@ -155,8 +158,19 @@ class Components(private val context: Context) { val reviewPromptController by lazyMonitored { ReviewPromptController( - context, - FenixReviewSettings(settings) + manager = ReviewManagerFactory.create(context), + reviewSettings = FenixReviewSettings(settings) + ) + } + + val autofillConfiguration by lazyMonitored { + AutofillConfiguration( + storage = core.passwordsStorage, + publicSuffixList = publicSuffixList, + unlockActivity = AutofillUnlockActivity::class.java, + confirmActivity = AutofillConfiguration::class.java, + applicationName = context.getString(R.string.app_name), + httpClient = core.client ) } } 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 41dfa2543..a560f1288 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -56,6 +56,7 @@ import mozilla.components.service.digitalassetlinks.local.StatementApi import mozilla.components.service.digitalassetlinks.local.StatementRelationChecker import mozilla.components.service.location.LocationService import mozilla.components.service.location.MozillaLocationService +import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage import mozilla.components.service.sync.logins.SyncableLoginsStorage import mozilla.components.support.locale.LocaleManager import org.mozilla.fenix.AppRequestInterceptor @@ -288,6 +289,7 @@ class Core( val lazyHistoryStorage = lazyMonitored { PlacesHistoryStorage(context, crashReporter) } val lazyBookmarksStorage = lazyMonitored { PlacesBookmarksStorage(context) } val lazyPasswordsStorage = lazyMonitored { SyncableLoginsStorage(context, passwordsEncryptionKey) } + val lazyAutofillStorage = lazyMonitored { AutofillCreditCardsAddressesStorage(context) } /** * The storage component to sync and persist tabs in a Firefox Sync account. @@ -298,6 +300,7 @@ class Core( val historyStorage: PlacesHistoryStorage get() = lazyHistoryStorage.value val bookmarksStorage: PlacesBookmarksStorage get() = lazyBookmarksStorage.value val passwordsStorage: SyncableLoginsStorage get() = lazyPasswordsStorage.value + val autofillStorage: AutofillCreditCardsAddressesStorage get() = lazyAutofillStorage.value val tabCollectionStorage by lazyMonitored { TabCollectionStorage( diff --git a/app/src/main/java/org/mozilla/fenix/components/IntentProcessors.kt b/app/src/main/java/org/mozilla/fenix/components/IntentProcessors.kt index a2d35af89..cf80fb2b0 100644 --- a/app/src/main/java/org/mozilla/fenix/components/IntentProcessors.kt +++ b/app/src/main/java/org/mozilla/fenix/components/IntentProcessors.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.components import android.content.Context -import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.customtabs.CustomTabIntentProcessor import mozilla.components.feature.customtabs.store.CustomTabsServiceStore @@ -32,7 +31,6 @@ import org.mozilla.fenix.utils.Mockable @Suppress("LongParameterList") class IntentProcessors( private val context: Context, - private val sessionManager: SessionManager, private val store: BrowserStore, private val sessionUseCases: SessionUseCases, private val tabsUseCases: TabsUseCases, @@ -74,12 +72,12 @@ class IntentProcessors( store = customTabsStore ), WebAppIntentProcessor(store, tabsUseCases.addTab, sessionUseCases.loadUrl, manifestStorage), - FennecWebAppIntentProcessor(context, sessionManager, sessionUseCases.loadUrl, manifestStorage) + FennecWebAppIntentProcessor(context, tabsUseCases.addTab, manifestStorage) ) } val fennecPageShortcutIntentProcessor by lazyMonitored { - FennecBookmarkShortcutsIntentProcessor(sessionManager, sessionUseCases.loadUrl) + FennecBookmarkShortcutsIntentProcessor(tabsUseCases.addTab) } val migrationIntentProcessor by lazyMonitored { diff --git a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt index 43784b44d..2e8c185be 100644 --- a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt @@ -5,8 +5,10 @@ package org.mozilla.fenix.components import android.app.Activity -import android.content.Context import androidx.annotation.VisibleForTesting +import com.google.android.play.core.review.ReviewManager +import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.withContext import org.mozilla.fenix.utils.Settings /** @@ -38,10 +40,19 @@ class FenixReviewSettings( * Controls the Review Prompt behavior. */ class ReviewPromptController( - private val context: Context, + private val manager: ReviewManager, private val reviewSettings: ReviewSettings, private val timeNowInMillis: () -> Long = { System.currentTimeMillis() }, - private val tryPromptReview: suspend (Activity) -> Unit = { _ -> + private val tryPromptReview: suspend (Activity) -> Unit = { activity -> + val flow = manager.requestReviewFlow() + + withContext(Main) { + flow.addOnCompleteListener { + if (it.isSuccessful) { + manager.launchReviewFlow(activity, it.result) + } + } + } } ) { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) diff --git a/app/src/main/java/org/mozilla/fenix/components/UseCases.kt b/app/src/main/java/org/mozilla/fenix/components/UseCases.kt index 956cda377..9249c8ab8 100644 --- a/app/src/main/java/org/mozilla/fenix/components/UseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/components/UseCases.kt @@ -22,6 +22,7 @@ import mozilla.components.feature.tabs.CustomTabsUseCases import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.top.sites.TopSitesStorage import mozilla.components.feature.top.sites.TopSitesUseCases +import mozilla.components.support.locale.LocaleUseCases import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.utils.Mockable @@ -88,4 +89,9 @@ class UseCases( * Use cases that provide top sites management. */ val topSitesUseCase by lazyMonitored { TopSitesUseCases(topSitesStorage) } + + /** + * Use cases that handle locale management. + */ + val localeUseCases by lazyMonitored { LocaleUseCases(store) } } 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 1f0b41d4c..c6d17dfed 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 @@ -74,6 +74,10 @@ sealed class Event { object HistoryOpened : Event() object HistoryItemShared : Event() object HistoryItemOpened : Event() + object HistoryOpenedInNewTab : Event() + object HistoryOpenedInNewTabs : Event() + object HistoryOpenedInPrivateTab : Event() + object HistoryOpenedInPrivateTabs : Event() object HistoryItemRemoved : Event() object HistoryAllItemsRemoved : Event() object ReaderModeAvailable : Event() @@ -212,8 +216,13 @@ sealed class Event { object ContextMenuSelectAllTapped : Event() object ContextMenuShareTapped : Event() - object HaveTopSites : Event() - object HaveNoTopSites : Event() + object SyncedTabSuggestionClicked : Event() + object BookmarkSuggestionClicked : Event() + object ClipboardSuggestionClicked : Event() + object HistorySuggestionClicked : Event() + object SearchActionClicked : Event() + object SearchSuggestionClicked : Event() + object OpenedTabSuggestionClicked : Event() // Interaction events with extras @@ -523,9 +532,9 @@ sealed class Event { get() = providerName } - data class SearchAdClicked(val providerName: String) : Event() { + data class SearchAdClicked(val keyName: String) : Event() { val label: String - get() = providerName + get() = keyName } data class SearchInContent(val keyName: String) : Event() { diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt index d28e40d21..48f582f7d 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -12,12 +12,12 @@ import mozilla.components.service.fxa.manager.SyncEnginesStorage import mozilla.components.service.glean.Glean import mozilla.components.service.glean.private.NoExtraKeys import mozilla.components.support.base.log.logger.Logger -import org.mozilla.fenix.Config import org.mozilla.fenix.GleanMetrics.AboutPage import org.mozilla.fenix.GleanMetrics.Addons import org.mozilla.fenix.GleanMetrics.AndroidKeystoreExperiment import org.mozilla.fenix.GleanMetrics.AppTheme import org.mozilla.fenix.GleanMetrics.Autoplay +import org.mozilla.fenix.GleanMetrics.Awesomebar import org.mozilla.fenix.GleanMetrics.BannerOpenInApp import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.GleanMetrics.BrowserSearch @@ -54,6 +54,7 @@ import org.mozilla.fenix.GleanMetrics.SearchSuggestions import org.mozilla.fenix.GleanMetrics.SearchWidget import org.mozilla.fenix.GleanMetrics.SyncAccount import org.mozilla.fenix.GleanMetrics.SyncAuth +import org.mozilla.fenix.GleanMetrics.SyncedTabs import org.mozilla.fenix.GleanMetrics.Tab import org.mozilla.fenix.GleanMetrics.Tabs import org.mozilla.fenix.GleanMetrics.TabsTray @@ -68,6 +69,7 @@ import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.BrowsersCache +import org.mozilla.fenix.utils.Settings private class EventWrapper>( private val recorder: ((Map?) -> Unit), @@ -190,6 +192,9 @@ private val Event.wrapper: EventWrapper<*>? { Events.browserMenuAction.record(it) }, { Events.browserMenuActionKeys.valueOf(it) } ) + is Event.OpenedBookmark -> EventWrapper( + { BookmarksManagement.open.record(it) } + ) is Event.OpenedBookmarkInNewTab -> EventWrapper( { BookmarksManagement.openInNewTab.record(it) } ) @@ -303,6 +308,18 @@ private val Event.wrapper: EventWrapper<*>? is Event.HistoryItemOpened -> EventWrapper( { History.openedItem.record(it) } ) + is Event.HistoryOpenedInNewTab -> EventWrapper( + { History.openedItemInNewTab.record(it) } + ) + is Event.HistoryOpenedInNewTabs -> EventWrapper( + { History.openedItemsInNewTabs.record(it) } + ) + is Event.HistoryOpenedInPrivateTab -> EventWrapper( + { History.openedItemInPrivateTab.record(it) } + ) + is Event.HistoryOpenedInPrivateTabs -> EventWrapper( + { History.openedItemsInPrivateTabs.record(it) } + ) is Event.HistoryItemRemoved -> EventWrapper( { History.removed.record(it) } ) @@ -734,13 +751,6 @@ private val Event.wrapper: EventWrapper<*>? Event.HaveNoOpenTabs -> EventWrapper( { Metrics.hasOpenTabs.set(false) } ) - Event.HaveTopSites -> EventWrapper( - { Metrics.hasTopSites.set(true) } - ) - Event.HaveNoTopSites -> EventWrapper( - { Metrics.hasTopSites.set(false) } - ) - is Event.BannerOpenInAppDisplayed -> EventWrapper( { BannerOpenInApp.displayed.record(it) } ) @@ -750,6 +760,51 @@ private val Event.wrapper: EventWrapper<*>? is Event.BannerOpenInAppGoToSettings -> EventWrapper( { BannerOpenInApp.goToSettings.record(it) } ) + is Event.SyncedTabSuggestionClicked -> EventWrapper( + { SyncedTabs.syncedTabsSuggestionClicked.record(it) } + ) + + is Event.BookmarkSuggestionClicked -> EventWrapper( + { Awesomebar.bookmarkSuggestionClicked.record(it) } + ) + is Event.ClipboardSuggestionClicked -> EventWrapper( + { Awesomebar.clipboardSuggestionClicked.record(it) } + ) + is Event.HistorySuggestionClicked -> EventWrapper( + { Awesomebar.historySuggestionClicked.record(it) } + ) + is Event.SearchActionClicked -> EventWrapper( + { Awesomebar.searchActionClicked.record(it) } + ) + is Event.SearchSuggestionClicked -> EventWrapper( + { Awesomebar.searchSuggestionClicked.record(it) } + ) + is Event.OpenedTabSuggestionClicked -> EventWrapper( + { Awesomebar.openedTabSuggestionClicked.record(it) } + ) + + is Event.SecurePrefsExperimentFailure -> EventWrapper( + { AndroidKeystoreExperiment.experimentFailure.record(it) }, + { AndroidKeystoreExperiment.experimentFailureKeys.valueOf(it) } + ) + is Event.SecurePrefsGetFailure -> EventWrapper( + { AndroidKeystoreExperiment.getFailure.record(it) }, + { AndroidKeystoreExperiment.getFailureKeys.valueOf(it) } + ) + is Event.SecurePrefsGetSuccess -> EventWrapper( + { AndroidKeystoreExperiment.getResult.record(it) }, + { AndroidKeystoreExperiment.getResultKeys.valueOf(it) } + ) + is Event.SecurePrefsWriteFailure -> EventWrapper( + { AndroidKeystoreExperiment.writeFailure.record(it) }, + { AndroidKeystoreExperiment.writeFailureKeys.valueOf(it) } + ) + is Event.SecurePrefsWriteSuccess -> EventWrapper( + { AndroidKeystoreExperiment.writeSuccess.record(it) } + ) + is Event.SecurePrefsReset -> EventWrapper( + { AndroidKeystoreExperiment.reset.record(it) } + ) is Event.SecurePrefsExperimentFailure -> EventWrapper( { AndroidKeystoreExperiment.experimentFailure.record(it) }, @@ -776,7 +831,6 @@ private val Event.wrapper: EventWrapper<*>? // Don't record other events in Glean: is Event.AddBookmark -> null - is Event.OpenedBookmark -> null is Event.OpenedAppFirstRun -> null is Event.InteractWithSearchURLArea -> null is Event.ClearedPrivateData -> null @@ -822,11 +876,20 @@ class GleanMetricsService( // setStartupMetrics is not a fast function. It does not need to be done before we can consider // ourselves initialized. So, let's do it, well, later. - setStartupMetrics() + setStartupMetrics(context.settings()) } } - internal fun setStartupMetrics() { + /** + * This function is called before the metrics ping is sent. Part of this function depends on + * shared preferences to be updated so the correct value is sent with the metrics ping. + * + * The reason we're using shared preferences to track some of these values is due to the + * limitations of the metrics ping. Events are only sent in a metrics ping if the user have made + * changes between each ping. However, in some cases we want current values to be sent even if + * the user have not changed anything between pings. + */ + internal fun setStartupMetrics(settings: Settings) { setPreferenceMetrics() with(Metrics) { defaultBrowser.set(browsersCache.all(context).isDefaultBrowser) @@ -834,55 +897,60 @@ class GleanMetricsService( defaultMozBrowser.set(it) } - distributionId.set( - when (Config.channel.isMozillaOnline) { - true -> "MozillaOnline" - false -> "Mozilla" - } - ) - mozillaProducts.set(mozillaProductDetector.getInstalledMozillaProducts(context)) - adjustCampaign.set(context.settings().adjustCampaignId) - adjustAdGroup.set(context.settings().adjustAdGroup) - adjustCreative.set(context.settings().adjustCreative) - adjustNetwork.set(context.settings().adjustNetwork) + adjustCampaign.set(settings.adjustCampaignId) + adjustAdGroup.set(settings.adjustAdGroup) + adjustCreative.set(settings.adjustCreative) + adjustNetwork.set(settings.adjustNetwork) - searchWidgetInstalled.set(context.settings().searchWidgetInstalled) + searchWidgetInstalled.set(settings.searchWidgetInstalled) - val openTabsCount = context.settings().openTabsCount + val openTabsCount = settings.openTabsCount hasOpenTabs.set(openTabsCount > 0) if (openTabsCount > 0) { tabsOpenCount.add(openTabsCount) } - val topSitesSize = context.settings().topSitesSize + val topSitesSize = settings.topSitesSize hasTopSites.set(topSitesSize > 0) if (topSitesSize > 0) { topSitesCount.add(topSitesSize) } - val desktopBookmarksSize = context.settings().desktopBookmarksSize + val installedAddonSize = settings.installedAddonsCount + Addons.hasInstalledAddons.set(installedAddonSize > 0) + if (installedAddonSize > 0) { + Addons.installedAddons.set(settings.installedAddonsList.split(',')) + } + + val enabledAddonSize = settings.enabledAddonsCount + Addons.hasEnabledAddons.set(enabledAddonSize > 0) + if (enabledAddonSize > 0) { + Addons.enabledAddons.set(settings.enabledAddonsList.split(',')) + } + + val desktopBookmarksSize = settings.desktopBookmarksSize hasDesktopBookmarks.set(desktopBookmarksSize > 0) if (desktopBookmarksSize > 0) { desktopBookmarksCount.add(desktopBookmarksSize) } - val mobileBookmarksSize = context.settings().mobileBookmarksSize + val mobileBookmarksSize = settings.mobileBookmarksSize hasMobileBookmarks.set(mobileBookmarksSize > 0) if (mobileBookmarksSize > 0) { mobileBookmarksCount.add(mobileBookmarksSize) } toolbarPosition.set( - when (context.settings().toolbarPosition) { + when (settings.toolbarPosition) { ToolbarPosition.BOTTOM -> Event.ToolbarPositionChanged.Position.BOTTOM.name ToolbarPosition.TOP -> Event.ToolbarPositionChanged.Position.TOP.name } ) - tabViewSetting.set(context.settings().getTabViewPingString()) - closeTabSetting.set(context.settings().getTabTimeoutPingString()) + tabViewSetting.set(settings.getTabViewPingString()) + closeTabSetting.set(settings.getTabTimeoutPingString()) } store.value.waitForSelectedOrDefaultSearchEngine { searchEngine -> diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt index 7f9aed10a..181ff4ea2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt @@ -10,6 +10,7 @@ import mozilla.components.browser.awesomebar.facts.BrowserAwesomeBarFacts import mozilla.components.browser.menu.facts.BrowserMenuFacts import mozilla.components.browser.toolbar.facts.ToolbarFacts import mozilla.components.concept.awesomebar.AwesomeBar +import mozilla.components.feature.awesomebar.facts.AwesomeBarFacts import mozilla.components.feature.awesomebar.provider.BookmarksStorageSuggestionProvider import mozilla.components.feature.awesomebar.provider.ClipboardSuggestionProvider import mozilla.components.feature.awesomebar.provider.HistoryStorageSuggestionProvider @@ -22,6 +23,7 @@ import mozilla.components.feature.findinpage.facts.FindInPageFacts import mozilla.components.feature.media.facts.MediaFacts import mozilla.components.feature.prompts.dialog.LoginDialogFacts import mozilla.components.feature.pwa.ProgressiveWebAppFacts +import mozilla.components.feature.syncedtabs.facts.SyncedTabsFacts import mozilla.components.feature.top.sites.facts.TopSitesFacts import mozilla.components.lib.dataprotect.SecurePrefsReliabilityExperiment import mozilla.components.support.base.Component @@ -32,9 +34,9 @@ import mozilla.components.support.base.facts.Facts import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.webextensions.facts.WebExtensionFacts import org.mozilla.fenix.BuildConfig -import org.mozilla.fenix.GleanMetrics.Addons import org.mozilla.fenix.GleanMetrics.PerfAwesomebar import org.mozilla.fenix.search.awesomebar.ShortcutsSuggestionProvider +import org.mozilla.fenix.utils.Settings interface MetricController { fun start(type: MetricServiceType) @@ -45,13 +47,15 @@ interface MetricController { fun create( services: List, isDataTelemetryEnabled: () -> Boolean, - isMarketingDataTelemetryEnabled: () -> Boolean + isMarketingDataTelemetryEnabled: () -> Boolean, + settings: Settings ): MetricController { return if (BuildConfig.TELEMETRY) { ReleaseMetricController( services, isDataTelemetryEnabled, - isMarketingDataTelemetryEnabled + isMarketingDataTelemetryEnabled, + settings ) } else DebugMetricController() } @@ -81,7 +85,8 @@ internal class DebugMetricController( internal class ReleaseMetricController( private val services: List, private val isDataTelemetryEnabled: () -> Boolean, - private val isMarketingDataTelemetryEnabled: () -> Boolean + private val isMarketingDataTelemetryEnabled: () -> Boolean, + private val settings: Settings ) : MetricController { private var initialized = mutableSetOf() @@ -211,16 +216,16 @@ internal class ReleaseMetricController( Component.SUPPORT_WEBEXTENSIONS to WebExtensionFacts.Items.WEB_EXTENSIONS_INITIALIZED -> { metadata?.get("installed")?.let { installedAddons -> if (installedAddons is List<*>) { - Addons.installedAddons.set(installedAddons.map { it.toString() }) - Addons.hasInstalledAddons.set(installedAddons.size > 0) + settings.installedAddonsCount = installedAddons.size + settings.installedAddonsList = installedAddons.joinToString(",") Leanplum.setUserAttributes(mapOf("installed_addons" to installedAddons.size)) } } metadata?.get("enabled")?.let { enabledAddons -> if (enabledAddons is List<*>) { - Addons.enabledAddons.set(enabledAddons.map { it.toString() }) - Addons.hasEnabledAddons.set(enabledAddons.size > 0) + settings.enabledAddonsCount = enabledAddons.size + settings.enabledAddonsList = enabledAddons.joinToString() Leanplum.setUserAttributes(mapOf("enabled_addons" to enabledAddons.size)) } } @@ -261,14 +266,32 @@ internal class ReleaseMetricController( // Do nothing } - return if (count > 0) { - Event.HaveTopSites - } else { - Event.HaveNoTopSites - } + settings.topSitesSize = count } null } + Component.FEATURE_SYNCEDTABS to SyncedTabsFacts.Items.SYNCED_TABS_SUGGESTION_CLICKED -> { + Event.SyncedTabSuggestionClicked + } + Component.FEATURE_AWESOMEBAR to AwesomeBarFacts.Items.BOOKMARK_SUGGESTION_CLICKED -> { + Event.BookmarkSuggestionClicked + } + Component.FEATURE_AWESOMEBAR to AwesomeBarFacts.Items.CLIPBOARD_SUGGESTION_CLICKED -> { + Event.ClipboardSuggestionClicked + } + Component.FEATURE_AWESOMEBAR to AwesomeBarFacts.Items.HISTORY_SUGGESTION_CLICKED -> { + Event.HistorySuggestionClicked + } + Component.FEATURE_AWESOMEBAR to AwesomeBarFacts.Items.SEARCH_ACTION_CLICKED -> { + Event.SearchActionClicked + } + Component.FEATURE_AWESOMEBAR to AwesomeBarFacts.Items.SEARCH_SUGGESTION_CLICKED -> { + Event.SearchSuggestionClicked + } + Component.FEATURE_AWESOMEBAR to AwesomeBarFacts.Items.OPENED_TAB_SUGGESTION_CLICKED -> { + Event.OpenedTabSuggestionClicked + } + Component.LIB_DATAPROTECT to SecurePrefsReliabilityExperiment.Companion.Actions.EXPERIMENT -> { Event.SecurePrefsExperimentFailure(metadata?.get("javaClass") as String? ?: "null") } @@ -289,6 +312,7 @@ internal class ReleaseMetricController( Component.LIB_DATAPROTECT to SecurePrefsReliabilityExperiment.Companion.Actions.RESET -> { Event.SecurePrefsReset } + else -> null } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt index d72f9b133..e5bc0f71e 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt @@ -143,7 +143,7 @@ class DefaultBrowserToolbarMenuController( deleteAndQuit(activity, scope, snackbar) } - is ToolbarMenu.Item.ReaderModeAppearance -> { + is ToolbarMenu.Item.CustomizeReaderView -> { readerModeController.showControls() metrics.track(Event.ReaderModeAppearanceOpened) } @@ -361,7 +361,7 @@ class DefaultBrowserToolbarMenuController( is ToolbarMenu.Item.OpenInFenix -> Event.BrowserMenuItemTapped.Item.OPEN_IN_FENIX is ToolbarMenu.Item.InstallToHomeScreen -> Event.BrowserMenuItemTapped.Item.ADD_TO_HOMESCREEN is ToolbarMenu.Item.Quit -> Event.BrowserMenuItemTapped.Item.QUIT - is ToolbarMenu.Item.ReaderModeAppearance -> + is ToolbarMenu.Item.CustomizeReaderView -> Event.BrowserMenuItemTapped.Item.READER_MODE_APPEARANCE is ToolbarMenu.Item.OpenInApp -> Event.BrowserMenuItemTapped.Item.OPEN_IN_APP // todo === End === diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt index f50a9595f..a5d666f21 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt @@ -87,7 +87,7 @@ class BrowserToolbarView( view.display.setOnUrlLongClickListener { ToolbarPopupWindow.show( WeakReference(view), - customTabSession, + customTabSession?.id, interactor::onBrowserToolbarPasteAndGo, interactor::onBrowserToolbarPaste ) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 10018c227..38ac495d2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -63,10 +63,11 @@ class DefaultToolbarMenu( val isPinningSupported: Boolean ) : ToolbarMenu { - private var currentUrlIsBookmarked = false + private var isCurrentUrlBookmarked = false private var isBookmarkedJob: Job? = null - - private val selectedSession: TabSessionState? get() = store.state.selectedTab + private val isTopToolbarSelected = shouldReverseItems + private val selectedSession: TabSessionState? + get() = store.state.selectedTab override val menuBuilder by lazy { WebExtensionBrowserMenuBuilder( @@ -146,24 +147,28 @@ class DefaultToolbarMenu( registerForIsBookmarkedUpdates() - val bookmark = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = R.drawable.ic_bookmark_filled, - primaryContentDescription = context.getString(R.string.browser_menu_edit_bookmark), - primaryImageTintResource = primaryTextColor(), - // TwoStateButton.isInPrimaryState must be synchronous, and checking bookmark state is - // relatively slow. The best we can do here is periodically compute and cache a new "is - // bookmarked" state, and use that whenever the menu has been opened. - isInPrimaryState = { currentUrlIsBookmarked }, - secondaryImageResource = R.drawable.ic_bookmark_outline, - secondaryContentDescription = context.getString(R.string.browser_menu_bookmark), - secondaryImageTintResource = primaryTextColor(), - disableInSecondaryState = false - ) { - if (!currentUrlIsBookmarked) currentUrlIsBookmarked = true - onItemTapped.invoke(ToolbarMenu.Item.Bookmark) - } + if (FeatureFlags.toolbarMenuFeature) { + BrowserMenuItemToolbar(listOf(back, forward, share, refresh)) + } else { + val bookmark = BrowserMenuItemToolbar.TwoStateButton( + primaryImageResource = R.drawable.ic_bookmark_filled, + primaryContentDescription = context.getString(R.string.browser_menu_edit_bookmark), + primaryImageTintResource = primaryTextColor(), + // TwoStateButton.isInPrimaryState must be synchronous, and checking bookmark state is + // relatively slow. The best we can do here is periodically compute and cache a new "is + // bookmarked" state, and use that whenever the menu has been opened. + isInPrimaryState = { isCurrentUrlBookmarked }, + secondaryImageResource = R.drawable.ic_bookmark_outline, + secondaryContentDescription = context.getString(R.string.browser_menu_bookmark), + secondaryImageTintResource = primaryTextColor(), + disableInSecondaryState = false + ) { + if (!isCurrentUrlBookmarked) isCurrentUrlBookmarked = true + onItemTapped.invoke(ToolbarMenu.Item.Bookmark) + } - BrowserMenuItemToolbar(listOf(back, forward, bookmark, share, refresh)) + BrowserMenuItemToolbar(listOf(back, forward, bookmark, share, refresh)) + } } // Predicates that need to be repeatedly called as the session changes @@ -180,7 +185,7 @@ class DefaultToolbarMenu( appLink(session.content.url).hasExternalApp() } ?: false - private fun shouldShowReaderAppearance(): Boolean = selectedSession?.let { + private fun shouldShowReaderViewCustomization(): Boolean = selectedSession?.let { store.state.findTab(it.id)?.readerState?.active } ?: false // End of predicates // @@ -287,7 +292,7 @@ class DefaultToolbarMenu( imageResource = R.drawable.ic_readermode_appearance, iconTintColorResource = primaryTextColor() ) { - onItemTapped.invoke(ToolbarMenu.Item.ReaderModeAppearance) + onItemTapped.invoke(ToolbarMenu.Item.CustomizeReaderView) } val openInApp = BrowserMenuHighlightableItem( @@ -349,7 +354,7 @@ class DefaultToolbarMenu( if (shouldShowSaveToCollection) saveToCollection else null, desktopMode, openInApp.apply { visible = ::shouldShowOpenInApp }, - readerAppearance.apply { visible = ::shouldShowReaderAppearance }, + readerAppearance.apply { visible = ::shouldShowReaderViewCustomization }, BrowserMenuDivider(), menuToolbar ) @@ -364,8 +369,8 @@ class DefaultToolbarMenu( private val newCoreMenuItems by lazy { val newTabItem = BrowserMenuImageText( context.getString(R.string.library_new_tab), - R.drawable.ic_bookmark_filled, - disabledTextColor() + R.drawable.ic_new, + primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.NewTab) } @@ -373,7 +378,7 @@ class DefaultToolbarMenu( val bookmarksItem = BrowserMenuImageText( context.getString(R.string.library_bookmarks), R.drawable.ic_bookmark_filled, - disabledTextColor() + primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.Bookmarks) } @@ -381,7 +386,7 @@ class DefaultToolbarMenu( val historyItem = BrowserMenuImageText( context.getString(R.string.library_history), R.drawable.ic_history, - disabledTextColor() + primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.History) } @@ -389,7 +394,7 @@ class DefaultToolbarMenu( val downloadsItem = BrowserMenuImageText( context.getString(R.string.library_downloads), R.drawable.ic_download, - disabledTextColor() + primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.Downloads) } @@ -397,15 +402,15 @@ class DefaultToolbarMenu( val extensionsItem = BrowserMenuImageText( context.getString(R.string.browser_menu_extensions), R.drawable.ic_addons_extensions, - disabledTextColor() + primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.AddonsManager) } - val syncedTabsItem = BrowserMenuImageText( - context.getString(R.string.library_synced_tabs), - R.drawable.ic_synced_tabs, - disabledTextColor() + val syncedTabs = BrowserMenuImageText( + label = context.getString(R.string.synced_tabs), + imageResource = R.drawable.ic_synced_tabs, + iconTintColorResource = primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.SyncedTabs) } @@ -413,7 +418,7 @@ class DefaultToolbarMenu( val findInPageItem = BrowserMenuImageText( label = context.getString(R.string.browser_menu_find_in_page), imageResource = R.drawable.mozac_ic_search, - iconTintColorResource = disabledTextColor() + iconTintColorResource = primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.FindInPage) } @@ -428,10 +433,35 @@ class DefaultToolbarMenu( onItemTapped.invoke(ToolbarMenu.Item.RequestDesktop(checked)) } + val customizeReaderView = BrowserMenuImageText( + label = context.getString(R.string.browser_menu_customize_reader_view), + imageResource = R.drawable.ic_readermode_appearance, + iconTintColorResource = primaryTextColor() + ) { + onItemTapped.invoke(ToolbarMenu.Item.CustomizeReaderView) + } + + val openInApp = BrowserMenuHighlightableItem( + label = context.getString(R.string.browser_menu_open_app_link), + startImageResource = R.drawable.ic_open_in_app, + iconTintColorResource = primaryTextColor(), + highlight = BrowserMenuHighlight.LowPriority( + label = context.getString(R.string.browser_menu_open_app_link), + notificationTint = getColor(context, R.color.whats_new_notification_color) + ), + isHighlighted = { !context.settings().openInAppOpened } + ) { + onItemTapped.invoke(ToolbarMenu.Item.OpenInApp) + } + + val reportSiteIssuePlaceholder = WebExtensionPlaceholderMenuItem( + id = WebCompatReporterFeature.WEBCOMPAT_REPORTER_EXTENSION_ID + ) + val addToHomeScreenItem = BrowserMenuImageText( label = context.getString(R.string.browser_menu_add_to_homescreen), imageResource = R.drawable.ic_add_to_homescreen, - iconTintColorResource = disabledTextColor() + iconTintColorResource = primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.AddToHomeScreen) } @@ -439,7 +469,7 @@ class DefaultToolbarMenu( val addToTopSitesItem = BrowserMenuImageText( label = context.getString(R.string.browser_menu_add_to_top_sites), imageResource = R.drawable.ic_top_sites, - iconTintColorResource = disabledTextColor() + iconTintColorResource = primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.AddToTopSites) } @@ -447,7 +477,7 @@ class DefaultToolbarMenu( val saveToCollectionItem = BrowserMenuImageText( label = context.getString(R.string.browser_menu_save_to_collection_2), imageResource = R.drawable.ic_tab_collection, - iconTintColorResource = disabledTextColor() + iconTintColorResource = primaryTextColor() ) { onItemTapped.invoke(ToolbarMenu.Item.SaveToCollection) } @@ -455,7 +485,7 @@ class DefaultToolbarMenu( val settingsItem = BrowserMenuHighlightableItem( label = context.getString(R.string.browser_menu_settings), startImageResource = R.drawable.ic_settings, - iconTintColorResource = disabledTextColor(), + iconTintColorResource = primaryTextColor(), textColorResource = if (hasAccountProblem) ThemeManager.resolveAttribute(R.attr.primaryText, context) else primaryTextColor(), @@ -469,26 +499,31 @@ class DefaultToolbarMenu( onItemTapped.invoke(ToolbarMenu.Item.Settings) } - val menuItems = listOfNotNull( - newTabItem, - BrowserMenuDivider(), - bookmarksItem, - historyItem, - downloadsItem, - extensionsItem, - syncedTabsItem, - BrowserMenuDivider(), - findInPageItem, - desktopSiteItem, - BrowserMenuDivider(), - addToHomeScreenItem.apply { visible = ::canAddToHomescreen }, - addToTopSitesItem, - saveToCollectionItem, - BrowserMenuDivider(), - settingsItem, - BrowserMenuDivider(), - menuToolbar - ) + val menuItems = + listOfNotNull( + if (isTopToolbarSelected) menuToolbar else null, + newTabItem, + BrowserMenuDivider(), + bookmarksItem, + historyItem, + downloadsItem, + extensionsItem, + syncedTabs, + BrowserMenuDivider(), + findInPageItem, + desktopSiteItem, + customizeReaderView.apply { visible = ::shouldShowReaderViewCustomization }, + openInApp.apply { visible = ::shouldShowOpenInApp }, + reportSiteIssuePlaceholder, + BrowserMenuDivider(), + addToHomeScreenItem.apply { visible = ::canAddToHomescreen }, + addToTopSitesItem, + saveToCollectionItem, + BrowserMenuDivider(), + settingsItem, + if (isTopToolbarSelected) null else BrowserMenuDivider(), + if (isTopToolbarSelected) null else menuToolbar + ) menuItems } @@ -497,10 +532,6 @@ class DefaultToolbarMenu( @VisibleForTesting internal fun primaryTextColor() = ThemeManager.resolveAttribute(R.attr.primaryText, context) - @ColorRes - @VisibleForTesting - internal fun disabledTextColor() = R.color.toolbar_menu_transparent - @VisibleForTesting internal fun registerForIsBookmarkedUpdates() { store.flowScoped(lifecycleOwner) { flow -> @@ -512,7 +543,7 @@ class DefaultToolbarMenu( ) } .collect { - currentUrlIsBookmarked = false + isCurrentUrlBookmarked = false updateCurrentUrlIsBookmarked(it.content.url) } } @@ -522,7 +553,7 @@ class DefaultToolbarMenu( internal fun updateCurrentUrlIsBookmarked(newUrl: String) { isBookmarkedJob?.cancel() isBookmarkedJob = lifecycleOwner.lifecycleScope.launch { - currentUrlIsBookmarked = bookmarksStorage + isCurrentUrlBookmarked = bookmarksStorage .getBookmarksWithUrl(newUrl) .any { it.url == newUrl } } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt index fca3accc6..aaa867144 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt @@ -19,6 +19,7 @@ import mozilla.components.concept.engine.Engine import mozilla.components.concept.storage.HistoryStorage import mozilla.components.feature.tabs.toolbar.TabCounterToolbarButton import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature +import mozilla.components.feature.toolbar.ToolbarBehaviorController import mozilla.components.feature.toolbar.ToolbarFeature import mozilla.components.feature.toolbar.ToolbarPresenter import mozilla.components.support.base.feature.LifecycleAwareFeature @@ -53,6 +54,8 @@ abstract class ToolbarIntegration( private val menuPresenter = MenuPresenter(toolbar, context.components.core.store, sessionId) + private val toolbarController = ToolbarBehaviorController(toolbar, store, sessionId) + init { toolbar.display.menuBuilder = toolbarMenu.menuBuilder toolbar.private = isPrivate @@ -61,11 +64,13 @@ abstract class ToolbarIntegration( override fun start() { menuPresenter.start() toolbarPresenter.start() + toolbarController.start() } override fun stop() { menuPresenter.stop() toolbarPresenter.stop() + toolbarController.stop() } fun invalidateMenu() { diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt index 87cb80ae3..126a949e1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt @@ -27,7 +27,7 @@ interface ToolbarMenu { object Quit : Item() object OpenInApp : Item() object Bookmark : Item() - object ReaderModeAppearance : Item() + object CustomizeReaderView : Item() object Bookmarks : Item() object History : Item() object Downloads : Item() diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessor.kt b/app/src/main/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessor.kt index 1eee927a2..68fbfe249 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessor.kt @@ -9,8 +9,6 @@ import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.state.CustomTabConfig import mozilla.components.browser.state.state.SessionState import mozilla.components.concept.engine.EngineSession @@ -22,7 +20,7 @@ import mozilla.components.feature.intent.processing.IntentProcessor import mozilla.components.feature.pwa.ManifestStorage import mozilla.components.feature.pwa.ext.putWebAppManifest import mozilla.components.feature.pwa.ext.toCustomTabConfig -import mozilla.components.feature.session.SessionUseCases +import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.utils.SafeIntent import mozilla.components.support.utils.toSafeIntent @@ -38,8 +36,7 @@ import java.io.IOException */ class FennecWebAppIntentProcessor( private val context: Context, - private val sessionManager: SessionManager, - private val loadUrlUseCase: SessionUseCases.DefaultLoadUrlUseCase, + private val addNewTabUseCase: TabsUseCases.AddNewTabUseCase, private val storage: ManifestStorage ) : IntentProcessor { val logger = Logger("FennecWebAppIntentProcessor") @@ -62,16 +59,14 @@ class FennecWebAppIntentProcessor( return if (!url.isNullOrEmpty() && matches(intent)) { val webAppManifest = runBlockingIncrement { loadManifest(safeIntent, url) } - - val session = Session(url, private = false, source = SessionState.Source.HOME_SCREEN) - session.webAppManifest = webAppManifest - session.customTabConfig = - webAppManifest?.toCustomTabConfig() ?: createFallbackCustomTabConfig() - - sessionManager.add(session) - loadUrlUseCase(url, session.id, EngineSession.LoadUrlFlags.external()) - - intent.putSessionId(session.id) + val sessionId = addNewTabUseCase( + url = url, + source = SessionState.Source.HOME_SCREEN, + flags = EngineSession.LoadUrlFlags.external(), + webAppManifest = webAppManifest, + customTabConfig = webAppManifest?.toCustomTabConfig() ?: createFallbackCustomTabConfig() + ) + intent.putSessionId(sessionId) if (webAppManifest != null) { intent.flags = FLAG_ACTIVITY_NEW_DOCUMENT diff --git a/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt b/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt index db524f182..8f2b4fa39 100644 --- a/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt +++ b/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt @@ -4,8 +4,10 @@ package org.mozilla.fenix.downloads +import android.content.Context import android.view.View import android.view.ViewGroup +import android.webkit.MimeTypeMap import androidx.coordinatorlayout.widget.CoordinatorLayout import kotlinx.android.extensions.LayoutContainer import kotlinx.android.synthetic.main.download_dialog_layout.view.* @@ -30,7 +32,7 @@ class DynamicDownloadDialog( private val metrics: MetricController, private val didFail: Boolean, private val tryAgain: (String) -> Unit, - private val onCannotOpenFile: () -> Unit, + private val onCannotOpenFile: (DownloadState) -> Unit, private val view: View, private val toolbarHeight: Int, private val onDismiss: () -> Unit @@ -110,7 +112,7 @@ class DynamicDownloadDialog( ) if (!fileWasOpened) { - onCannotOpenFile() + onCannotOpenFile(downloadState) } context.metrics.track(Event.InAppNotificationDownloadOpen) @@ -138,4 +140,15 @@ class DynamicDownloadDialog( view.visibility = View.GONE onDismiss() } + + companion object { + fun getCannotOpenFileErrorMessage(context: Context, download: DownloadState): String { + val fileExt = MimeTypeMap.getFileExtensionFromUrl( + download.filePath + ) + return context.getString( + R.string.mozac_feature_downloads_open_not_supported1, fileExt + ) + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt index 1622e79da..4362056cc 100644 --- a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt +++ b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt @@ -10,9 +10,11 @@ import android.os.StrictMode import io.sentry.Sentry import mozilla.components.service.nimbus.NimbusApi import mozilla.components.service.nimbus.Nimbus +import mozilla.components.service.nimbus.NimbusAppInfo import mozilla.components.service.nimbus.NimbusDisabled import mozilla.components.service.nimbus.NimbusServerSettings import mozilla.components.support.base.log.logger.Logger +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.components.isSentryEnabled import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings @@ -37,7 +39,20 @@ fun createNimbus(context: Context, url: String?): NimbusApi = context.settings().isExperimentationEnabled } - Nimbus(context, serverSettings).apply { + // The name "fenix" here corresponds to the app_name defined for the family of apps + // that encompasses all of the channels for the Fenix app. This is defined upstream in + // the telemetry system. For more context on where the app_name come from see: + // https://probeinfo.telemetry.mozilla.org/v2/glean/app-listings + // and + // https://github.com/mozilla/probe-scraper/blob/master/repositories.yaml + val appInfo = NimbusAppInfo( + appName = "fenix", + // Note: Using BuildConfig.BUILD_TYPE is important here so that it matches the value + // passed into Glean. `Config.channel.toString()` turned out to be non-deterministic + // and would mostly produce the value `Beta` and rarely would produce `beta`. + channel = BuildConfig.BUILD_TYPE + ) + Nimbus(context, appInfo, serverSettings).apply { // This performs the minimal amount of work required to load branch and enrolment data // into memory. If `getExperimentBranch` is called from another thread between here // and the next nimbus disk write (setting `globalUserParticipation` or diff --git a/app/src/main/java/org/mozilla/fenix/ext/Activity.kt b/app/src/main/java/org/mozilla/fenix/ext/Activity.kt index 0ab6efec0..db5feca2b 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/Activity.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/Activity.kt @@ -24,6 +24,19 @@ fun Activity.enterToImmersiveMode() { or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) } +/** + * Attempts to come out from immersive mode using the View. + */ +fun Activity.exitImmersiveModeIfNeeded() { + if (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON and window.attributes.flags == 0) { + // We left immersive mode already. + return + } + + window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE +} + fun Activity.breadcrumb( message: String, data: Map = emptyMap() diff --git a/app/src/main/java/org/mozilla/fenix/ext/Glean.kt b/app/src/main/java/org/mozilla/fenix/ext/Glean.kt new file mode 100644 index 000000000..9964aec42 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/ext/Glean.kt @@ -0,0 +1,31 @@ +/* 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.ext + +import mozilla.telemetry.glean.private.TimingDistributionMetricType + +/** + * A reimplementation of [TimingDistributionMetricType.measure] that address unintuitive + * issues around non-local returns: see https://bugzilla.mozilla.org/show_bug.cgi?id=1699505. + * This should be removed once that bug is resolved. That method's kdoc is as follows: + * + * Convenience method to simplify measuring a function or block of code. + * + * If the measured function throws, the measurement is canceled and the exception rethrown. + */ +@Suppress("TooGenericExceptionCaught") +fun TimingDistributionMetricType.measureNoInline(funcToMeasure: () -> U): U { + val timerId = start() + + val returnValue = try { + funcToMeasure() + } catch (e: Exception) { + cancel(timerId) + throw e + } + + stopAndAccumulate(timerId) + return returnValue +} diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 52d7389bc..d909c8779 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -85,6 +85,7 @@ import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import mozilla.components.ui.tabcounter.TabCounterMenu import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.Config +import org.mozilla.fenix.GleanMetrics.PerfStartup import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.BrowserAnimator.Companion.getToolbarNavOptions @@ -101,6 +102,7 @@ import org.mozilla.fenix.components.toolbar.FenixTabCounterMenu import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.hideToolbar +import org.mozilla.fenix.ext.measureNoInline import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents @@ -193,7 +195,7 @@ class HomeFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View? = PerfStartup.homeFragmentOnCreateView.measureNoInline { val view = inflater.inflate(R.layout.fragment_home, container, false) val activity = activity as HomeActivity val components = requireComponents @@ -274,7 +276,7 @@ class HomeFragment : Fragment() { appBarLayout = view.homeAppBar activity.themeManager.applyStatusBarTheme(activity) - return view + view } override fun onConfigurationChanged(newConfig: Configuration) { @@ -356,7 +358,8 @@ class HomeFragment : Fragment() { } @Suppress("LongMethod", "ComplexMethod") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) = + PerfStartup.homeFragmentOnViewCreated.measureNoInline { // weird indent so we don't have to break blame. super.onViewCreated(view, savedInstanceState) observeSearchEngineChanges() @@ -1013,9 +1016,14 @@ class HomeFragment : Fragment() { } private fun openTabTray() { + val direction = if (requireContext().settings().tabsTrayRewrite) { + HomeFragmentDirections.actionGlobalTabsTrayFragment() + } else { + HomeFragmentDirections.actionGlobalTabTrayDialogFragment() + } findNavController().nav( R.id.homeFragment, - HomeFragmentDirections.actionGlobalTabTrayDialogFragment() + direction ) } diff --git a/app/src/main/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessor.kt b/app/src/main/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessor.kt index cf37943e9..b66650310 100644 --- a/app/src/main/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessor.kt @@ -7,13 +7,11 @@ package org.mozilla.fenix.home.intent import android.content.Intent import android.content.Intent.ACTION_VIEW import androidx.annotation.VisibleForTesting -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.state.SessionState import mozilla.components.concept.engine.EngineSession import mozilla.components.feature.intent.ext.putSessionId import mozilla.components.feature.intent.processing.IntentProcessor -import mozilla.components.feature.session.SessionUseCases +import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.utils.toSafeIntent /** @@ -21,8 +19,7 @@ import mozilla.components.support.utils.toSafeIntent * https://developer.android.com/guide/topics/ui/shortcuts/creating-shortcuts#pinned */ class FennecBookmarkShortcutsIntentProcessor( - private val sessionManager: SessionManager, - private val loadUrlUseCase: SessionUseCases.DefaultLoadUrlUseCase + private val addNewTabUseCase: TabsUseCases.AddNewTabUseCase ) : IntentProcessor { /** @@ -41,13 +38,15 @@ class FennecBookmarkShortcutsIntentProcessor( val url = safeIntent.dataString return if (!url.isNullOrEmpty() && matches(intent)) { - val session = Session(url, private = false, source = SessionState.Source.HOME_SCREEN) - - sessionManager.add(session, selected = true) - loadUrlUseCase(url, session.id, EngineSession.LoadUrlFlags.external()) + val sessionId = addNewTabUseCase( + url = url, + flags = EngineSession.LoadUrlFlags.external(), + source = SessionState.Source.HOME_SCREEN, + selectTab = true, + startLoading = true + ) intent.action = ACTION_VIEW - intent.putSessionId(session.id) - + intent.putSessionId(sessionId) true } else { false diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 1fa618487..8339d8c87 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.browser.state.selector.getNormalOrPrivateTabs +import mozilla.components.browser.state.state.availableSearchEngines import mozilla.components.browser.state.state.searchEngines import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine import mozilla.components.browser.state.store.BrowserStore @@ -325,7 +326,11 @@ class DefaultSessionControlController( setPositiveButton(R.string.top_sites_rename_dialog_ok) { dialog, _ -> viewLifecycleScope.launch(Dispatchers.IO) { with(activity.components.useCases.topSitesUseCase) { - renameTopSites(topSite, topSiteLabelEditText.text.toString()) + updateTopSites( + topSite, + topSiteLabelEditText.text.toString(), + topSite.url + ) } } dialog.dismiss() @@ -380,19 +385,18 @@ class DefaultSessionControlController( metrics.track(Event.PocketTopSiteClicked) } - if (SupportUtils.GOOGLE_URL.equals(url, true)) { - val availableEngines = getAvailableSearchEngines() + val availableEngines = getAvailableSearchEngines() - val searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.TOPSITE - val event = - availableEngines.firstOrNull { engine -> engine.suggestUrl?.contains(url) == true } - ?.let { searchEngine -> - searchAccessPoint.let { sap -> - MetricsUtils.createSearchEvent(searchEngine, store, sap) - } - } - event?.let { activity.metrics.track(it) } - } + val searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.TOPSITE + val event = + availableEngines.firstOrNull { + engine -> engine.resultUrls.firstOrNull { it.contains(url) } != null + }?.let { + searchEngine -> searchAccessPoint.let { sap -> + MetricsUtils.createSearchEvent(searchEngine, store, sap) + } + } + event?.let { activity.metrics.track(it) } addTabUseCase.invoke( url = appendSearchAttributionToUrlIfNeeded(url), @@ -403,13 +407,9 @@ class DefaultSessionControlController( } @VisibleForTesting - internal fun getAvailableSearchEngines() = activity - .components - .core - .store - .state - .search - .searchEngines + internal fun getAvailableSearchEngines() = + activity.components.core.store.state.search.searchEngines + + activity.components.core.store.state.search.availableSearchEngines /** * Append a search attribution query to any provided search engine URL based on the diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt index 7f1d9b91e..8dae73310 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolder.kt @@ -11,6 +11,7 @@ import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.home.sessioncontrol.viewholders.topsites.TopSitesAdapter +import org.mozilla.fenix.utils.AccessibilityGridLayoutManager class TopSiteViewHolder( view: View, @@ -20,8 +21,12 @@ class TopSiteViewHolder( private val topSitesAdapter = TopSitesAdapter(interactor) init { + val gridLayoutManager = + AccessibilityGridLayoutManager(view.context, SPAN_COUNT) + view.top_sites_list.apply { adapter = topSitesAdapter + layoutManager = gridLayoutManager } } @@ -31,5 +36,6 @@ class TopSiteViewHolder( companion object { const val LAYOUT_ID = R.layout.component_top_sites + const val SPAN_COUNT = 4 } } 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 259d7ce11..e3a826621 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 @@ -188,7 +188,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl } R.id.open_history_in_new_tabs_multi_select -> { openItemsInNewTab { selectedItem -> - requireComponents.analytics.metrics.track(Event.HistoryItemOpened) + requireComponents.analytics.metrics.track(Event.HistoryOpenedInNewTabs) selectedItem.url } @@ -197,7 +197,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl } R.id.open_history_in_private_tabs_multi_select -> { openItemsInNewTab(private = true) { selectedItem -> - requireComponents.analytics.metrics.track(Event.HistoryItemOpened) + requireComponents.analytics.metrics.track(Event.HistoryOpenedInPrivateTabs) selectedItem.url } @@ -248,7 +248,11 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl } private fun openItem(item: HistoryItem, mode: BrowsingMode? = null) { - requireComponents.analytics.metrics.track(Event.HistoryItemOpened) + when (mode?.isPrivate) { + true -> requireComponents.analytics.metrics.track(Event.HistoryOpenedInPrivateTab) + false -> requireComponents.analytics.metrics.track(Event.HistoryOpenedInNewTab) + null -> requireComponents.analytics.metrics.track(Event.HistoryItemOpened) + } mode?.let { (activity as HomeActivity).browsingModeManager.mode = it } diff --git a/app/src/main/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurement.kt b/app/src/main/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurement.kt index 47953d9b7..a63f0bb61 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurement.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurement.kt @@ -57,7 +57,7 @@ internal class StartupFrameworkStartMeasurement( val clockTicksPerSecond = stat.clockTicksPerSecond.also { // framework* is derived from the number of clock ticks per second. To ensure this // value does not throw off our result, we capture it too. - telemetry.clockTicksPerSecond.add(it.toInt()) + telemetry.clockTicksPerSecondV2.set(it) } // In our brief analysis, clock ticks per second was overwhelmingly equal to 100. To make diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt index 6e87cf2cc..4a4fe9c4f 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt @@ -42,6 +42,7 @@ interface SearchController { fun handleExistingSessionSelected(tabId: String) fun handleSearchShortcutsButtonClicked() fun handleCameraPermissionsNeeded() + fun handleSearchEngineSuggestionClicked(searchEngine: SearchEngine) } @Suppress("TooManyFunctions", "LongParameterList") @@ -55,7 +56,8 @@ class SearchDialogController( private val metrics: MetricController, private val dismissDialog: () -> Unit, private val clearToolbarFocus: () -> Unit, - private val focusToolbar: () -> Unit + private val focusToolbar: () -> Unit, + private val clearToolbar: () -> Unit ) : SearchController { override fun handleUrlCommitted(url: String) { @@ -221,6 +223,11 @@ class SearchDialogController( dialog.show() } + override fun handleSearchEngineSuggestionClicked(searchEngine: SearchEngine) { + clearToolbar() + handleSearchShortcutEngineSelected(searchEngine) + } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun buildDialog(): AlertDialog.Builder { return AlertDialog.Builder(activity).apply { diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index f1b5adcdb..780724462 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -100,6 +100,8 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { super.onStop() // https://github.com/mozilla-mobile/fenix/issues/14279 // Let's reset back to the default behavior after we're done searching + // This will be addressed on https://github.com/mozilla-mobile/fenix/issues/17805 + @Suppress("DEPRECATION") requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) } @@ -157,7 +159,12 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { toolbarView.view.hideKeyboard() toolbarView.view.clearFocus() }, - focusToolbar = { toolbarView.view.edit.focus() } + focusToolbar = { toolbarView.view.edit.focus() }, + clearToolbar = { + toolbarView.view + .findViewById(R.id.mozac_browser_toolbar_edit_url_view) + ?.setText("") + } ) ) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogInteractor.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogInteractor.kt index 9f82379d9..93d1068ba 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogInteractor.kt @@ -37,6 +37,10 @@ class SearchDialogInteractor( searchController.handleSearchTermsTapped(searchTerms) } + override fun onSearchEngineSuggestionSelected(searchEngine: SearchEngine) { + searchController.handleSearchEngineSuggestionClicked(searchEngine) + } + override fun onSearchShortcutEngineSelected(searchEngine: SearchEngine) { searchController.handleSearchShortcutEngineSelected(searchEngine) } diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarInteractor.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarInteractor.kt index bb0c62a62..75738eb79 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarInteractor.kt @@ -44,4 +44,9 @@ interface AwesomeBarInteractor { * Called whenever the Shortcuts button is clicked */ fun onSearchShortcutsButtonClicked() + + /** + * Called whenever search engine suggestion is tapped + */ + fun onSearchEngineSuggestionSelected(searchEngine: SearchEngine) } diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt index cd9fa8c8b..da4cc0612 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt @@ -11,11 +11,13 @@ import androidx.core.graphics.drawable.toBitmap import mozilla.components.browser.awesomebar.BrowserAwesomeBar import mozilla.components.browser.search.DefaultSearchEngineProvider import mozilla.components.browser.state.search.SearchEngine +import mozilla.components.browser.state.state.searchEngines import mozilla.components.concept.awesomebar.AwesomeBar import mozilla.components.concept.engine.EngineSession import mozilla.components.feature.awesomebar.provider.BookmarksStorageSuggestionProvider import mozilla.components.feature.awesomebar.provider.HistoryStorageSuggestionProvider import mozilla.components.feature.awesomebar.provider.SearchActionProvider +import mozilla.components.feature.awesomebar.provider.SearchEngineSuggestionProvider import mozilla.components.feature.awesomebar.provider.SearchSuggestionProvider import mozilla.components.feature.awesomebar.provider.SessionSuggestionProvider import mozilla.components.feature.search.SearchUseCases @@ -51,6 +53,7 @@ class AwesomeBarView( private val syncedTabsStorageSuggestionProvider: SyncedTabsStorageSuggestionProvider private val defaultSearchSuggestionProvider: SearchSuggestionProvider private val defaultSearchActionProvider: SearchActionProvider + private val searchEngineSuggestionProvider: SearchEngineSuggestionProvider private val searchSuggestionProviderMap: MutableMap> private var providersInUse = mutableSetOf() @@ -143,6 +146,8 @@ class AwesomeBarView( colorFilter = createBlendModeColorFilterCompat(primaryTextColor, SRC_IN) }.toBitmap() + val searchWithBitmap = getDrawable(activity, R.drawable.ic_search_with)?.toBitmap() + defaultSearchSuggestionProvider = SearchSuggestionProvider( context = activity, @@ -173,6 +178,16 @@ class AwesomeBarView( selectShortcutEngineSettings = interactor::onClickSearchEngineSettings ) + searchEngineSuggestionProvider = + SearchEngineSuggestionProvider( + context = activity, + searchEnginesList = components.core.store.state.search.searchEngines, + selectShortcutEngine = interactor::onSearchEngineSuggestionSelected, + title = R.string.search_engine_suggestions_title, + description = activity.getString(R.string.search_engine_suggestions_description), + searchIcon = searchWithBitmap + ) + searchSuggestionProviderMap = HashMap() } @@ -242,6 +257,8 @@ class AwesomeBarView( providersToAdd.add(sessionProvider) } + providersToAdd.add(searchEngineSuggestionProvider) + return providersToAdd } diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/SearchProviderModel.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/SearchProviderModel.kt index ff8f64d00..3017804f6 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/SearchProviderModel.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/SearchProviderModel.kt @@ -39,7 +39,7 @@ data class SearchProviderModel( * Checks if any of the given URLs represent an ad from the search engine. * Used to check if a clicked link was for an ad. */ - fun containsAds(urlList: List) = urlList.any { url -> isAd(url) } + fun containsAdLinks(urlList: List) = urlList.any { url -> isAd(url) } private fun isAd(url: String) = extraAdServersRegexps.any { adsRegex -> adsRegex.containsMatchIn(url) } diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/TrackKeyInfo.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/TrackKeyInfo.kt new file mode 100644 index 000000000..725e3ec55 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/TrackKeyInfo.kt @@ -0,0 +1,36 @@ +/* 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.search.telemetry + +import java.util.Locale + +/** + * A data class that tracks key information about a Search Engine Result Page (SERP). + * + * @property provider The name of the search provider. + * @property type The search access point type (SAP). This is either "organic", "sap" or + * "sap-follow-on". + * @property code The search URL's `code` query parameter. + * @property channel The search URL's `channel` query parameter. + */ +internal data class TrackKeyInfo( + var provider: String, + var type: String, + var code: String?, + var channel: String? = null +) { + /** + * Returns the track key information into the following string format: + * `.in-content.[sap|sap-follow-on|organic].[code|none](.[channel])?`. + */ + fun createTrackKey(): String { + return "${provider.toLowerCase(Locale.ROOT)}.in-content" + + ".${type.toLowerCase(Locale.ROOT)}" + + ".${code?.toLowerCase(Locale.ROOT) ?: "none"}" + + if (!channel?.toLowerCase(Locale.ROOT).isNullOrBlank()) + ".${channel?.toLowerCase(Locale.ROOT)}" + else "" + } +} diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/Utils.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/Utils.kt new file mode 100644 index 000000000..38bf1179c --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/Utils.kt @@ -0,0 +1,96 @@ +/* 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.search.telemetry + +import android.net.Uri +import org.json.JSONObject + +private const val SEARCH_TYPE_SAP_FOLLOW_ON = "sap-follow-on" +private const val SEARCH_TYPE_SAP = "sap" +private const val SEARCH_TYPE_ORGANIC = "organic" +private const val CHANNEL_KEY = "channel" + +internal fun getTrackKey( + provider: SearchProviderModel, + uri: Uri, + cookies: List +): String { + val paramSet = uri.queryParameterNames + var code: String? = null + + if (provider.codeParam.isNotEmpty()) { + code = uri.getQueryParameter(provider.codeParam) + + // Try cookies first because Bing has followOnCookies and valid code, but no + // followOnParams => would tracks organic instead of sap-follow-on + if (provider.followOnCookies.isNotEmpty()) { + // Checks if engine contains a valid follow-on cookie, otherwise return default + getTrackKeyFromCookies(provider, uri, cookies)?.let { + return it.createTrackKey() + } + } + + // For Bing if it didn't have a valid cookie and for all the other search engines + if (hasValidCode(code, provider)) { + val channel = uri.getQueryParameter(CHANNEL_KEY) + val type = getSapType(provider.followOnParams, paramSet) + return TrackKeyInfo(provider.name, type, code, channel).createTrackKey() + } + } + + // Default to organic search type if no code parameter was found. + return TrackKeyInfo(provider.name, SEARCH_TYPE_ORGANIC, code).createTrackKey() +} + +private fun getTrackKeyFromCookies( + provider: SearchProviderModel, + uri: Uri, + cookies: List +): TrackKeyInfo? { + // Especially Bing requires lots of extra work related to cookies. + for (followOnCookie in provider.followOnCookies) { + val eCode = uri.getQueryParameter(followOnCookie.extraCodeParam) + if (eCode == null || !followOnCookie.extraCodePrefixes.any { prefix -> + eCode.startsWith(prefix) + }) { + continue + } + + // If this cookie is present, it's probably an SAP follow-on. + // This might be an organic follow-on in the same session, but there + // is no way to tell the difference. + for (cookie in cookies) { + if (cookie.getString("name") != followOnCookie.name) { + continue + } + val valueList = cookie.getString("value") + .split("=") + .map { item -> item.trim() } + + if (valueList.size == 2 && valueList[0] == followOnCookie.codeParam && + followOnCookie.codePrefixes.any { prefix -> + valueList[1].startsWith( + prefix + ) + } + ) { + return TrackKeyInfo(provider.name, SEARCH_TYPE_SAP_FOLLOW_ON, valueList[1]) + } + } + } + + return null +} + +private fun getSapType(followOnParams: List, paramSet: Set): String { + return if (followOnParams.any { param -> paramSet.contains(param) }) { + SEARCH_TYPE_SAP_FOLLOW_ON + } else { + SEARCH_TYPE_SAP + } +} + +private fun hasValidCode(code: String?, provider: SearchProviderModel): Boolean = + code != null && provider.codePrefixes.any { prefix -> code.startsWith(prefix) } diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt index 7044af09b..055c9a77e 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.search.telemetry.ads import androidx.annotation.VisibleForTesting +import androidx.core.net.toUri import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.Engine import org.json.JSONObject @@ -12,9 +13,14 @@ import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.search.telemetry.BaseSearchTelemetry import org.mozilla.fenix.search.telemetry.ExtensionInfo +import org.mozilla.fenix.search.telemetry.getTrackKey class AdsTelemetry(private val metrics: MetricController) : BaseSearchTelemetry() { + // Cache the cookies provided by the ADS_EXTENSION_ID extension to be used when tracking + // the Ads clicked telemetry. + var cachedCookies = listOf() + override fun install( engine: Engine, store: BrowserStore @@ -27,38 +33,64 @@ class AdsTelemetry(private val metrics: MetricController) : BaseSearchTelemetry( installWebExtension(engine, store, info) } - fun trackAdClickedMetric(sessionUrl: String?, urlPath: List) { - if (sessionUrl == null) { - return - } - val provider = getProviderForUrl(sessionUrl) - provider?.let { - if (it.containsAds(urlPath)) { - metrics.track(Event.SearchAdClicked(it.name)) - } - } - } - override fun processMessage(message: JSONObject) { + // Cache the cookies list when the extension sends a message. + cachedCookies = getMessageList( + message, + ADS_MESSAGE_COOKIES_KEY + ) + val urls = getMessageList(message, ADS_MESSAGE_DOCUMENT_URLS_KEY) val provider = getProviderForUrl(message.getString(ADS_MESSAGE_SESSION_URL_KEY)) + provider?.let { - if (it.containsAds(urls)) { + if (it.containsAdLinks(urls)) { metrics.track(Event.SearchWithAds(it.name)) } } } + /** + * If a search ad is clicked, record the search ad that was clicked. This method is called + * when the browser is navigating to a new URL, which may be a search ad. + * + * @param url The URL of the page before the search ad was clicked. This is used to determine + * the originating search provider. + * @param urlPath A list of the URLs and load requests collected in between location changes. + * Clicking on a search ad generates a list of redirects from the originating search provider + * to the ad source. This is used to determine if there was an ad click. + */ + fun trackAdClickedMetric(url: String?, urlPath: List) { + val uri = url?.toUri() ?: return + val provider = getProviderForUrl(url) ?: return + val paramSet = uri.queryParameterNames + + if (!paramSet.contains(provider.queryParam) || !provider.containsAdLinks(urlPath)) { + // Do nothing if the URL does not have the search provider's query parameter or + // there were no ad clicks. + return + } + + metrics.track(Event.SearchAdClicked(getTrackKey(provider, uri, cachedCookies))) + } + companion object { @VisibleForTesting internal const val ADS_EXTENSION_ID = "ads@mozac.org" + @VisibleForTesting internal const val ADS_EXTENSION_RESOURCE_URL = "resource://android/assets/extensions/ads/" + @VisibleForTesting internal const val ADS_MESSAGE_SESSION_URL_KEY = "url" + @VisibleForTesting internal const val ADS_MESSAGE_DOCUMENT_URLS_KEY = "urls" + @VisibleForTesting internal const val ADS_MESSAGE_ID = "MozacBrowserAds" + + @VisibleForTesting + internal const val ADS_MESSAGE_COOKIES_KEY = "cookies" } } diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt index f2ad23fea..2891dda0d 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.search.telemetry.incontent -import android.net.Uri import androidx.annotation.VisibleForTesting import androidx.core.net.toUri import mozilla.components.browser.state.store.BrowserStore @@ -14,7 +13,7 @@ import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.search.telemetry.BaseSearchTelemetry import org.mozilla.fenix.search.telemetry.ExtensionInfo -import org.mozilla.fenix.search.telemetry.SearchProviderModel +import org.mozilla.fenix.search.telemetry.getTrackKey class InContentTelemetry(private val metrics: MetricController) : BaseSearchTelemetry() { @@ -37,116 +36,32 @@ class InContentTelemetry(private val metrics: MetricController) : BaseSearchTele @VisibleForTesting internal fun trackPartnerUrlTypeMetric(url: String, cookies: List) { - val provider = getProviderForUrl(url) - var trackKey: TrackKeyInfo? = null + val provider = getProviderForUrl(url) ?: return + val uri = url.toUri() + val paramSet = uri.queryParameterNames - provider?.let { - val uri = url.toUri() - val paramSet = uri.queryParameterNames - if (!paramSet.contains(provider.queryParam)) { - return - } - var code: String? = null - - if (provider.codeParam.isNotEmpty()) { - code = uri.getQueryParameter(provider.codeParam) - // Try cookies first because Bing has followOnCookies and valid code, but no - // followOnParams => would tracks organic instead of sap-follow-on - if (provider.followOnCookies.isNotEmpty()) { - // Checks if engine contains a valid follow-on cookie, otherwise return default - trackKey = getTrackKeyFromCookies(provider, uri, cookies, code) - } - - // For Bing if it didn't have a valid cookie and for all the other search engines - if (resultNotComputedFromCookies(trackKey) && hasValidCode(code, provider)) { - val channel = uri.getQueryParameter(CHANNEL_KEY) - val type = getSapType(provider.followOnParams, paramSet) - trackKey = TrackKeyInfo(provider.name, type, code, channel) - } - } - - // Go default if no codeParam was found - if (trackKey == null) { - trackKey = TrackKeyInfo(provider.name, SEARCH_TYPE_ORGANIC, code) - } - - trackKey?.let { - metrics.track(Event.SearchInContent(it.createTrackKey())) - } + if (!paramSet.contains(provider.queryParam)) { + return } - } - private fun resultNotComputedFromCookies(trackKey: TrackKeyInfo?): Boolean = - trackKey == null || trackKey.type == SEARCH_TYPE_ORGANIC - - private fun hasValidCode(code: String?, provider: SearchProviderModel): Boolean = - code != null && provider.codePrefixes.any { prefix -> code.startsWith(prefix) } - - private fun getSapType(followOnParams: List, paramSet: Set): String { - return if (followOnParams.any { param -> paramSet.contains(param) }) { - SEARCH_TYPE_SAP_FOLLOW_ON - } else { - SEARCH_TYPE_SAP - } - } - - private fun getTrackKeyFromCookies( - provider: SearchProviderModel, - uri: Uri, - cookies: List, - code: String? - ): TrackKeyInfo { - // Especially Bing requires lots of extra work related to cookies. - for (followOnCookie in provider.followOnCookies) { - val eCode = uri.getQueryParameter(followOnCookie.extraCodeParam) - if (eCode == null || !followOnCookie.extraCodePrefixes.any { prefix -> - eCode.startsWith(prefix) - }) { - continue - } - - // If this cookie is present, it's probably an SAP follow-on. - // This might be an organic follow-on in the same session, but there - // is no way to tell the difference. - for (cookie in cookies) { - if (cookie.getString("name") != followOnCookie.name) { - continue - } - val valueList = cookie.getString("value") - .split("=") - .map { item -> item.trim() } - - if (valueList.size == 2 && valueList[0] == followOnCookie.codeParam && - followOnCookie.codePrefixes.any { prefix -> - valueList[1].startsWith( - prefix - ) - } - ) { - return TrackKeyInfo(provider.name, SEARCH_TYPE_SAP_FOLLOW_ON, valueList[1]) - } - } - } - return TrackKeyInfo(provider.name, SEARCH_TYPE_ORGANIC, code) + metrics.track(Event.SearchInContent(getTrackKey(provider, uri, cookies))) } companion object { @VisibleForTesting internal const val COOKIES_EXTENSION_ID = "cookies@mozac.org" + @VisibleForTesting internal const val COOKIES_EXTENSION_RESOURCE_URL = "resource://android/assets/extensions/cookies/" + @VisibleForTesting internal const val COOKIES_MESSAGE_SESSION_URL_KEY = "url" + @VisibleForTesting internal const val COOKIES_MESSAGE_LIST_KEY = "cookies" + @VisibleForTesting internal const val COOKIES_MESSAGE_ID = "BrowserCookiesMessage" - - private const val SEARCH_TYPE_ORGANIC = "organic" - private const val SEARCH_TYPE_SAP = "sap" - private const val SEARCH_TYPE_SAP_FOLLOW_ON = "sap-follow-on" - - private const val CHANNEL_KEY = "channel" } } diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/TrackKeyInfo.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/TrackKeyInfo.kt deleted file mode 100644 index b67ec1522..000000000 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/TrackKeyInfo.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* 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.search.telemetry.incontent - -import java.util.Locale - -internal data class TrackKeyInfo( - var providerName: String, - var type: String, - var code: String?, - var channel: String? = null -) { - fun createTrackKey(): String { - return "${providerName.toLowerCase(Locale.ROOT)}.in-content" + - ".${type.toLowerCase(Locale.ROOT)}" + - ".${code?.toLowerCase(Locale.ROOT) ?: "none"}" + - if (!channel?.toLowerCase(Locale.ROOT).isNullOrBlank()) - ".${channel?.toLowerCase(Locale.ROOT)}" - else "" - } -} diff --git a/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt b/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt index 94f21a60a..2e0b47b03 100644 --- a/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt +++ b/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt @@ -16,6 +16,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.metrics +import java.util.Locale /** * Manages notifications for private tabs. @@ -33,9 +34,28 @@ class PrivateNotificationService : AbstractPrivateNotificationService() { override fun NotificationCompat.Builder.buildNotification() { setSmallIcon(R.drawable.ic_private_browsing) - setContentTitle(applicationContext.getString(R.string.app_name_private_4, getString(R.string.app_name))) - setContentText(applicationContext.getString(R.string.notification_pbm_delete_text_2)) - color = ContextCompat.getColor(this@PrivateNotificationService, R.color.pbm_notification_color) + setContentTitle( + applicationContext.getString( + R.string.app_name_private_4, + getString(R.string.app_name) + ) + ) + setContentText( + applicationContext.getString( + R.string.notification_pbm_delete_text_2 + ) + ) + color = ContextCompat.getColor( + this@PrivateNotificationService, + R.color.pbm_notification_color + ) + } + + /** + * Update the existing notification when the [Locale] has been changed. + */ + override fun notifyLocaleChanged() { + super.refreshNotification() } @SuppressLint("MissingSuperCall") 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 54c91d802..4b965904b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -6,7 +6,10 @@ package org.mozilla.fenix.settings import android.os.Bundle import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar class SecretSettingsFragment : PreferenceFragmentCompat() { @@ -18,5 +21,23 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.secret_settings_preferences, rootKey) + + requirePreference(R.string.pref_key_show_address_feature).apply { + isVisible = FeatureFlags.addressesFeature + isChecked = context.settings().addressFeature + onPreferenceChangeListener = SharedPreferenceUpdater() + } + + requirePreference(R.string.pref_key_show_credit_cards_feature).apply { + isVisible = FeatureFlags.creditCardsFeature + isChecked = context.settings().creditCardsFeature + onPreferenceChangeListener = SharedPreferenceUpdater() + } + + requirePreference(R.string.pref_key_new_tabs_tray).apply { + isVisible = FeatureFlags.tabsTrayRewrite + isChecked = context.settings().tabsTrayRewrite + onPreferenceChangeListener = SharedPreferenceUpdater() + } } } 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 ea8fd5753..161e45295 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -40,6 +40,7 @@ import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.Config import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components @@ -132,7 +133,12 @@ class SettingsFragment : PreferenceFragmentCompat() { } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.preferences, rootKey) + val preferencesId = if (FeatureFlags.newIconSet) { + R.xml.preferences_without_icons + } else { + R.xml.preferences + } + setPreferencesFromResource(preferencesId, rootKey) updateMakeDefaultBrowserPreference() } @@ -368,8 +374,10 @@ class SettingsFragment : PreferenceFragmentCompat() { val preferenceOpenLinksInExternalApp = findPreference(getPreferenceKey(R.string.pref_key_open_links_in_external_app)) - preferencePrivateBrowsing.icon.mutate().apply { - setTint(requireContext().getColorFromAttr(R.attr.primaryText)) + if (!FeatureFlags.newIconSet) { + preferencePrivateBrowsing.icon.mutate().apply { + setTint(requireContext().getColorFromAttr(R.attr.primaryText)) + } } if (!Config.channel.isReleased) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt index 03b873a99..0c356cc84 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.settings import android.content.Context import android.content.Intent +import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent import androidx.core.net.toUri import mozilla.components.support.ktx.android.content.appVersionName @@ -99,7 +100,9 @@ object SupportUtils { fun createCustomTabIntent(context: Context, url: String): Intent = CustomTabsIntent.Builder() .setInstantAppsEnabled(false) - .setToolbarColor(context.getColorFromAttr(R.attr.foundation)) + .setDefaultColorSchemeParams( + CustomTabColorSchemeParams.Builder().setToolbarColor(context.getColorFromAttr(R.attr.foundation)).build() + ) .build() .intent .setData(url.toUri()) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SyncLoginsPreferenceView.kt b/app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt similarity index 57% rename from app/src/main/java/org/mozilla/fenix/settings/logins/SyncLoginsPreferenceView.kt rename to app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt index c8106882b..578d1eea3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SyncLoginsPreferenceView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt @@ -2,10 +2,9 @@ * 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.settings.logins +package org.mozilla.fenix.settings import androidx.lifecycle.LifecycleOwner -import androidx.navigation.NavController import androidx.preference.Preference import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch @@ -16,16 +15,33 @@ import mozilla.components.service.fxa.SyncEngine import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.service.fxa.manager.SyncEnginesStorage import org.mozilla.fenix.R -import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections /** - * Helper to manage the [R.string.pref_key_password_sync_logins] preference. + * A view to help manage the sync preference in the "Logins and passwords" and "Credit cards" + * settings. The provided [syncPreference] is used to navigate to the different fragments + * that manages the sync account authentication. A summary status will be also added + * depending on the sync account status. + * + * @param syncPreference The sync [Preference] to update and handle navigation. + * @param lifecycleOwner View lifecycle owner used to determine when to cancel UI jobs. + * @param accountManager An instance of [FxaAccountManager]. + * @param syncEngine The sync engine that will be used for the sync status lookup. + * @param onSignInToSyncClicked A callback executed when the [syncPreference] is clicked with a + * preference status of "Sign in to Sync". + * @param onSyncStatusClicked A callback executed when the [syncPreference] is clicked with a + * preference status of "On" or "Off". + * @param onReconnectClicked A callback executed when the [syncPreference] is clicked with a + * preference status of "Reconnect". */ -class SyncLoginsPreferenceView( - private val syncLoginsPreference: Preference, +@Suppress("LongParameterList") +class SyncPreferenceView( + private val syncPreference: Preference, lifecycleOwner: LifecycleOwner, accountManager: FxaAccountManager, - private val navController: NavController + private val syncEngine: SyncEngine, + private val onSignInToSyncClicked: () -> Unit = {}, + private val onSyncStatusClicked: () -> Unit = {}, + private val onReconnectClicked: () -> Unit = {} ) { init { @@ -33,9 +49,11 @@ class SyncLoginsPreferenceView( override fun onAuthenticated(account: OAuthAccount, authType: AuthType) { MainScope().launch { updateSyncPreferenceStatus() } } + override fun onLoggedOut() { MainScope().launch { updateSyncPreferenceNeedsLogin() } } + override fun onAuthenticationProblems() { MainScope().launch { updateSyncPreferenceNeedsReauth() } } @@ -43,6 +61,7 @@ class SyncLoginsPreferenceView( val accountExists = accountManager.authenticatedAccount() != null val needsReauth = accountManager.accountNeedsReauth() + when { needsReauth -> updateSyncPreferenceNeedsReauth() accountExists -> updateSyncPreferenceStatus() @@ -51,62 +70,50 @@ class SyncLoginsPreferenceView( } /** - * Show the current status of the sync preference (on/off) for the logged in user. + * Shows the current status of the sync preference ("On"/"Off") for the logged in user. */ private fun updateSyncPreferenceStatus() { - syncLoginsPreference.apply { + syncPreference.apply { val syncEnginesStatus = SyncEnginesStorage(context).getStatus() - val loginsSyncStatus = syncEnginesStatus.getOrElse(SyncEngine.Passwords) { false } + val loginsSyncStatus = syncEnginesStatus.getOrElse(syncEngine) { false } + summary = context.getString( if (loginsSyncStatus) R.string.preferences_passwords_sync_logins_on else R.string.preferences_passwords_sync_logins_off ) + setOnPreferenceClickListener { - navigateToAccountSettingsFragment() + onSyncStatusClicked() true } } } /** - * Indicate that the user can sign in to turn on sync. + * Display that the user can "Sign in to Sync" when the user is logged off. */ private fun updateSyncPreferenceNeedsLogin() { - syncLoginsPreference.apply { + syncPreference.apply { summary = context.getString(R.string.preferences_passwords_sync_logins_sign_in) + setOnPreferenceClickListener { - navigateToTurnOnSyncFragment() + onSignInToSyncClicked() true } } } /** - * Indicate that the user can fix their account problems to turn on sync. + * Displays that the user needs to "Reconnect" to fix their account problems with sync. */ private fun updateSyncPreferenceNeedsReauth() { - syncLoginsPreference.apply { + syncPreference.apply { summary = context.getString(R.string.preferences_passwords_sync_logins_reconnect) + setOnPreferenceClickListener { - navigateToAccountProblemFragment() + onReconnectClicked() true } } } - - private fun navigateToAccountSettingsFragment() { - val directions = - SavedLoginsAuthFragmentDirections.actionGlobalAccountSettingsFragment() - navController.navigate(directions) - } - - private fun navigateToAccountProblemFragment() { - val directions = SavedLoginsAuthFragmentDirections.actionGlobalAccountProblemFragment() - navController.navigate(directions) - } - - private fun navigateToTurnOnSyncFragment() { - val directions = SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment() - navController.navigate(directions) - } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt index 46f30d451..8b78c7592 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.settings.advanced import android.app.Activity import android.content.Context import mozilla.components.support.locale.LocaleManager +import mozilla.components.support.locale.LocaleUseCases import java.util.Locale interface LocaleSettingsController { @@ -17,7 +18,8 @@ interface LocaleSettingsController { class DefaultLocaleSettingsController( private val activity: Activity, - private val localeSettingsStore: LocaleSettingsStore + private val localeSettingsStore: LocaleSettingsStore, + private val localeUseCase: LocaleUseCases ) : LocaleSettingsController { override fun handleLocaleSelected(locale: Locale) { @@ -26,7 +28,7 @@ class DefaultLocaleSettingsController( return } localeSettingsStore.dispatch(LocaleSettingsAction.Select(locale)) - LocaleManager.setNewLocale(activity, locale.toLanguageTag()) + LocaleManager.setNewLocale(activity, localeUseCase, locale) LocaleManager.updateBaseConfiguration(activity, locale) activity.recreate() } @@ -36,7 +38,7 @@ class DefaultLocaleSettingsController( return } localeSettingsStore.dispatch(LocaleSettingsAction.Select(localeSettingsStore.state.localeList[0])) - LocaleManager.resetToSystemDefault(activity) + LocaleManager.resetToSystemDefault(activity, localeUseCase) LocaleManager.updateBaseConfiguration(activity, localeSettingsStore.state.localeList[0]) activity.recreate() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt index 4a307d29d..a2ee4533f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt @@ -17,13 +17,15 @@ import kotlinx.android.synthetic.main.fragment_locale_settings.view.* import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.ktx.android.view.hideKeyboard +import mozilla.components.support.locale.LocaleUseCases import org.mozilla.fenix.R import org.mozilla.fenix.components.StoreProvider +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.showToolbar class LocaleSettingsFragment : Fragment() { - private lateinit var store: LocaleSettingsStore + private lateinit var localeSettingsStore: LocaleSettingsStore private lateinit var interactor: LocaleSettingsInteractor private lateinit var localeView: LocaleSettingsView @@ -39,7 +41,10 @@ class LocaleSettingsFragment : Fragment() { ): View? { val view = inflater.inflate(R.layout.fragment_locale_settings, container, false) - store = StoreProvider.get(this) { + val browserStore = requireContext().components.core.store + val localeUseCase = LocaleUseCases(browserStore) + + localeSettingsStore = StoreProvider.get(this) { LocaleSettingsStore( createInitialLocaleSettingsState(requireContext()) ) @@ -47,7 +52,8 @@ class LocaleSettingsFragment : Fragment() { interactor = LocaleSettingsInteractor( controller = DefaultLocaleSettingsController( activity = requireActivity(), - localeSettingsStore = store + localeSettingsStore = localeSettingsStore, + localeUseCase = localeUseCase ) ) localeView = LocaleSettingsView(view.locale_container, interactor) @@ -87,7 +93,7 @@ class LocaleSettingsFragment : Fragment() { @ExperimentalCoroutinesApi override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - consumeFrom(store) { + consumeFrom(localeSettingsStore) { localeView.update(it) } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt index 2a2fb431b..2421d45d9 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt @@ -20,16 +20,231 @@ class LocaleViewHolder( ) : BaseLocaleViewHolder(view, selectedLocale) { override fun bind(locale: Locale) { + if (locale.toString().equals("vec", ignoreCase = true)) { + locale.toString() + } // Capitalisation is done using the rules of the appropriate locale (endonym and exonym). - locale_title_text.text = locale.getDisplayName(locale).capitalize(locale) + locale_title_text.text = getDisplayName(locale) // Show the given locale using the device locale for the subtitle. - locale_subtitle_text.text = locale.displayName.capitalize(Locale.getDefault()) + locale_subtitle_text.text = locale.getProperDisplayName() locale_selected_icon.isVisible = isCurrentLocaleSelected(locale, isDefault = false) itemView.setOnClickListener { interactor.onLocaleSelected(locale) } } + + private fun getDisplayName(locale: Locale): String { + val displayName = locale.getDisplayName(locale).capitalize(locale) + if (displayName.equals(locale.toString(), ignoreCase = true)) { + return LOCALE_TO_DISPLAY_NATIVE_NAME_MAP[locale.toString()] ?: displayName + } + return displayName + } + + @SuppressWarnings("LargeClass") + companion object { + val LOCALE_TO_DISPLAY_NATIVE_NAME_MAP: Map = mapOf( + "an" to "Aragonés", + "anp" to "अंगिका", + "ar" to "العربية", + "ast" to "Asturianu", + "ay" to "Aimara", + "az" to "Azərbaycan dili", + "be" to "беларуская мова", + "bg" to "български език", + "bn" to "বাংলা", + "br" to "Brezhoneg", + "bs" to "Bosanski jezik", + "ca" to "Català", + "cak" to "Kaqchikel", + "ceb" to "Cebuano", + "co" to "Corsu, ", + "cs" to "čeština", + "cy" to "Cymraeg", + "da" to "dansk", + "de" to "Deutsch", + "dsb" to "dolnoserbski", + "el" to "ελληνικά", + "eo" to "Esperanto", + "es" to "Español", + "et" to "Eesti", + "eu" to "Euskara", + "fa" to "فارسی", + "ff" to "Fulfulde", + "fi" to "Suomi", + "fr" to "Français", + "fy-NL" to "Frisian", + "ga-IE" to "Gaeilge", + "gd" to "Gàidhlig", + "gl" to "Galego", + "gn" to "Avañe'ẽ", + "gu-IN" to "ગુજરાતી", + "he" to "עברית", + "hi-IN" to "हिन्दी ", + "hil" to "Ilonggo", + "hr" to "hrvatski jezik", + "hsb" to "Hornjoserbsce", + "hu" to "Magyar", + "hus" to "Tének", + "hy-AM" to "հայերեն", + "ia" to "Interlingua", + "id" to "Bahasa Indonesia", + "is" to "Íslenska", + "it" to "Italiano", + "ixl" to "Ixil", + "ja" to "日本語 (にほんご)", + "jv" to "Basa Jawa", + "ka" to "ქართული", + "kab" to "Taqbaylit", + "kk" to "қазақ тілі", + "kmr" to "Kurmancî", + "kn" to "ಕನ್ನಡ", + "ko" to "한국어", + "lij" to "Ligure", + "lo" to "ພາສາລາວ", + "lt" to "lietuvių kalba", + "mix" to "Tu'un savi", + "ml" to "മലയാളം", + "mr" to "मराठी", + "ms" to "Bahasa Melayu ملايو‎", + "my" to "ဗမာစာ", + "meh" to "Tu´un savi ñuu Yasi'í Yuku Iti", + "nb-NO" to "Bokmål", + "ne-NP" to "नेपाली", + "nl" to "Nederlands", + "nn-NO" to "Nynorsk", + "nv" to "Diné bizaad", + "oc" to "Occitan", + "pa-IN" to "Panjābī", + "pl" to "Polszczyzna", + "pt" to "Português", + "pai" to "Paa ipai", + "ppl" to "Náhuat Pipil", + "quy" to "Chanka Qhichwa", + "quc" to "K'iche'", + "rm" to "Rumantsch Grischun", + "ro" to "Română", + "ru" to "русский", + "sat" to "ᱥᱟᱱᱛᱟᱲᱤ", + "sk" to "Slovak", + "sl" to "Slovenian", + "sn" to "ChiShona", + "sq" to "Shqip", + "sr" to "српски језик", + "su" to "Basa Sunda", + "sv-SE" to "Svenska", + "ta" to "தமிழ்", + "te" to "తెలుగు", + "tg" to "тоҷикӣ, toçikī, تاجیکی‎", + "th" to "ไทย", + "tl" to "Wikang Tagalog", + "tr" to "Türkçe", + "trs" to "Triqui", + "tt" to "татарча", + "tsz" to "P'urhepecha", + "uk" to "Українська", + "ur" to "اردو", + "uz" to "Oʻzbek", + "vec" to "Vèneto", + "vi" to "Tiếng Việt", + "wo" to "Wolof", + "zam" to "DíɁztè" + ) + + val LOCALE_TO_DISPLAY_ENGLISH_NAME_MAP: Map = mapOf( + "an" to "Aragonese", + "ar" to "Arabic", + "ast" to "Asturianu", + "az" to "Azerbaijani", + "be" to "Belarusian", + "bg" to "Bulgarian", + "bn" to "Bengali", + "br" to "Breton", + "bs" to "Bosnian", + "ca" to "Catalan", + "cak" to "Kaqchikel", + "ceb" to "Cebuano", + "co" to "Corsican", + "cs" to "Czech", + "cy" to "Welsh", + "da" to "Danish", + "de" to "German", + "dsb" to "Sorbian, Lower", + "el" to "Greek", + "eo" to "Esperanto", + "es" to "Spanish", + "et" to "Estonian", + "eu" to "Basque", + "fa" to "Persian", + "ff" to "Fulah", + "fi" to "Finnish", + "fr" to "French", + "fy-NL" to "Frisian", + "ga-IE" to "Irish", + "gd" to "Gaelic", + "gl" to "Galician", + "gn" to "Guarani", + "gu-IN" to "Gujarati", + "he" to "Hebrew", + "hi-IN" to "Hindi", + "hil" to "Hiligaynon", + "hr" to "Croatian", + "hsb" to "Sorbian, Upper", + "hu" to "Hungarian", + "hy-AM" to "Armenian", + "id" to "Indonesian", + "is" to "Icelandic", + "it" to "Italian", + "ja" to "Japanese", + "ka" to "Georgian", + "kab" to "Kabyle ", + "kk" to "Kazakh", + "kmr" to "Kurmanji Kurdish", + "kn" to "Kannada", + "ko" to "Korean", + "lij" to "Ligurian", + "lo" to "Lao", + "lt" to "Lithuanian", + "mix" to "Mixtepec Mixtec", + "ml" to "Malayalam", + "mr" to "Marathi", + "ms" to "Malay", + "my" to "Burmese", + "nb-NO" to "Norwegian Bokmål", + "ne-NP" to "Nepali ", + "nl" to "Dutch, Flemish", + "nn-NO" to "Norwegian Nynorsk", + "nv" to "Navajo, Navaho", + "oc" to "Occitan", + "pa-IN" to "Punjabi", + "pl" to "Polish", + "pt-BR" to "", + "pt-PT" to "", + "rm" to "Romansh", + "ro" to "Română", + "ru" to "Russian", + "sat" to "Santali", + "sk" to "Slovak", + "sl" to "Slovenian", + "sq" to "Albanian", + "sr" to "Serbian", + "su" to "Sundanese", + "sv-SE" to "Swedish", + "ta" to "Tamil", + "te" to "Telugu", + "tg" to "Tajik", + "th" to "Thai", + "tl" to "Tagalog", + "tr" to "Turkish", + "trs" to "Triqui", + "uk" to "Ukrainian", + "ur" to "Urdu", + "uz" to "Uzbek", + "vec" to "Venitian", + "vi" to "Vietnamese" + ) + } } class SystemLocaleViewHolder( @@ -72,3 +287,14 @@ abstract class BaseLocaleViewHolder( private fun String.capitalize(locale: Locale): String { return substring(0, 1).toUpperCase(locale) + substring(1) } + +/** + * Returns the locale in the selected language, with fallback to English name + */ +private fun Locale.getProperDisplayName(): String { + val displayName = this.displayName.capitalize(Locale.getDefault()) + if (displayName.equals(this.toString(), ignoreCase = true)) { + return LocaleViewHolder.LOCALE_TO_DISPLAY_ENGLISH_NAME_MAP[this.toString()] ?: displayName + } + return displayName +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/biometric/BiometricPromptFeature.kt b/app/src/main/java/org/mozilla/fenix/settings/biometric/BiometricPromptFeature.kt similarity index 94% rename from app/src/main/java/org/mozilla/fenix/settings/logins/biometric/BiometricPromptFeature.kt rename to app/src/main/java/org/mozilla/fenix/settings/biometric/BiometricPromptFeature.kt index 05ef9e3ae..5380fb73e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/biometric/BiometricPromptFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/biometric/BiometricPromptFeature.kt @@ -2,7 +2,7 @@ * 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.settings.logins.biometric +package org.mozilla.fenix.settings.biometric import android.content.Context import android.os.Build.VERSION.SDK_INT @@ -16,8 +16,8 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.log.logger.Logger -import org.mozilla.fenix.settings.logins.biometric.ext.isEnrolled -import org.mozilla.fenix.settings.logins.biometric.ext.isHardwareAvailable +import org.mozilla.fenix.settings.biometric.ext.isEnrolled +import org.mozilla.fenix.settings.biometric.ext.isHardwareAvailable /** * A [LifecycleAwareFeature] for the Android Biometric API to prompt for user authentication. diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/biometric/ext/BiometricManager.kt b/app/src/main/java/org/mozilla/fenix/settings/biometric/ext/BiometricManager.kt similarity index 94% rename from app/src/main/java/org/mozilla/fenix/settings/logins/biometric/ext/BiometricManager.kt rename to app/src/main/java/org/mozilla/fenix/settings/biometric/ext/BiometricManager.kt index 323925d7d..7b3788d97 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/biometric/ext/BiometricManager.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/biometric/ext/BiometricManager.kt @@ -2,7 +2,7 @@ * 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.settings.logins.biometric.ext +package org.mozilla.fenix.settings.biometric.ext import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_WEAK diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt index 570d92392..021ef626d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt @@ -22,18 +22,19 @@ import androidx.preference.SwitchPreference import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import mozilla.components.service.fxa.SyncEngine import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.secure import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar -import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.settings.SharedPreferenceUpdater -import org.mozilla.fenix.settings.logins.biometric.BiometricPromptFeature -import org.mozilla.fenix.settings.logins.SyncLoginsPreferenceView +import org.mozilla.fenix.settings.SyncPreferenceView +import org.mozilla.fenix.settings.biometric.BiometricPromptFeature import org.mozilla.fenix.settings.requirePreference @Suppress("TooManyFunctions") @@ -121,11 +122,26 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { true } - SyncLoginsPreferenceView( - requirePreference(R.string.pref_key_password_sync_logins), + SyncPreferenceView( + syncPreference = requirePreference(R.string.pref_key_password_sync_logins), lifecycleOwner = viewLifecycleOwner, accountManager = requireComponents.backgroundServices.accountManager, - navController = findNavController() + syncEngine = SyncEngine.Passwords, + onSignInToSyncClicked = { + val directions = + SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment() + findNavController().navigate(directions) + }, + onSyncStatusClicked = { + val directions = + SavedLoginsAuthFragmentDirections.actionGlobalAccountSettingsFragment() + findNavController().navigate(directions) + }, + onReconnectClicked = { + val directions = + SavedLoginsAuthFragmentDirections.actionGlobalAccountProblemFragment() + findNavController().navigate(directions) + } ) togglePrefsEnabledWhileAuthenticating(true) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt index 9339dcdbe..5cc4fbce1 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt @@ -64,11 +64,6 @@ class SavedLoginsFragment : Fragment() { initToolbar() } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -164,6 +159,7 @@ class SavedLoginsFragment : Fragment() { ) = (activity as HomeActivity).openToBrowserAndLoad(searchTermOrURL, newTab, from) private fun initToolbar() { + setHasOptionsMenu(true) showToolbar(getString(R.string.preferences_passwords_saved_logins)) (activity as HomeActivity).getSupportActionBarAndInflateIfNecessary() .setDisplayShowTitleEnabled(false) diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt index bc70833fe..b4fd0687b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import mozilla.components.browser.icons.IconRequest import mozilla.components.browser.state.search.SearchEngine import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity @@ -118,7 +119,8 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng SearchStringValidator.Result.Success -> { val update = searchEngine.copy( name = name, - resultUrls = listOf(searchString.toSearchUrl()) + resultUrls = listOf(searchString.toSearchUrl()), + icon = requireComponents.core.icons.loadIcon(IconRequest(searchString)).await().bitmap ) requireComponents.useCases.searchUseCases.addSearchEngine(update) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt new file mode 100644 index 000000000..b0a0fc12a --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -0,0 +1,96 @@ +/* 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.tabstray + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatDialogFragment +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.navigation.fragment.findNavController +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.tabs.TabLayout +import kotlinx.android.synthetic.main.component_tabstray2.* +import kotlinx.android.synthetic.main.component_tabstray2.view.* +import org.mozilla.fenix.R + +class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor { + + lateinit var behavior: BottomSheetBehavior + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, R.style.TabTrayDialogStyle) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val containerView = inflater.inflate(R.layout.fragment_tab_tray_dialog, container, false) + val view: View = LayoutInflater.from(containerView.context) + .inflate(R.layout.component_tabstray2, containerView as ViewGroup, true) + + behavior = BottomSheetBehavior.from(view.tab_wrapper) + + return containerView + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupPager(view.context, this) + } + + override fun setCurrentTrayPosition(position: Int) { + tabsTray.currentItem = position + } + + override fun navigateToBrowser() { + dismissAllowingStateLoss() + + val navController = findNavController() + + if (navController.currentDestination?.id == R.id.browserFragment) { + return + } + + if (!navController.popBackStack(R.id.browserFragment, false)) { + navController.navigate(R.id.browserFragment) + } + } + + override fun tabRemoved(sessionId: String) { + // TODO re-implement these methods + // showUndoSnackbarForTab(sessionId) + // removeIfNotLastTab(sessionId) + } + + private fun setupPager(context: Context, interactor: TabsTrayInteractor) { + tabsTray.apply { + adapter = TrayPagerAdapter(context, interactor) + isUserInputEnabled = false + } + + tab_layout.addOnTabSelectedListener(TabLayoutObserver(interactor)) + } +} + +/** + * An observer for the [TabLayout] used for the Tabs Tray. + */ +internal class TabLayoutObserver( + private val interactor: TabsTrayInteractor +) : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + interactor.setCurrentTrayPosition(tab.position) + } + + override fun onTabUnselected(tab: TabLayout.Tab) = Unit + override fun onTabReselected(tab: TabLayout.Tab) = Unit +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt new file mode 100644 index 000000000..6c479aad3 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.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.tabstray + +interface TabsTrayInteractor { + /** + * Set the current tray item to the clamped [position]. + */ + fun setCurrentTrayPosition(position: Int) + + /** + * Dismisses the tabs tray and navigates to the browser. + */ + fun navigateToBrowser() + + /** + * Invoked when a tab is removed from the tabs tray with the given [sessionId]. + */ + fun tabRemoved(sessionId: String) +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TrayItem.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TrayItem.kt new file mode 100644 index 000000000..032a63492 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TrayItem.kt @@ -0,0 +1,13 @@ +/* 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.tabstray + +import android.view.View +import android.view.ViewGroup + +/** + * A [View] or [ViewGroup] that can be add in the Tabs Tray. + */ +interface TrayItem diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt new file mode 100644 index 000000000..c4ea545ae --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt @@ -0,0 +1,59 @@ +/* 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.tabstray + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.mozilla.fenix.tabstray.BrowserTabViewHolder.Companion.LAYOUT_ID_NORMAL_TAB +import org.mozilla.fenix.tabstray.BrowserTabViewHolder.Companion.LAYOUT_ID_PRIVATE_TAB +import org.mozilla.fenix.tabtray.FenixTabsAdapter + +class TrayPagerAdapter( + context: Context, + val interactor: TabsTrayInteractor +) : RecyclerView.Adapter() { + + private val normalAdapter by lazy { FenixTabsAdapter(context) } + private val privateAdapter by lazy { FenixTabsAdapter(context) } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrayViewHolder { + val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false) + + return when (viewType) { + LAYOUT_ID_NORMAL_TAB -> BrowserTabViewHolder(itemView, interactor) + LAYOUT_ID_PRIVATE_TAB -> BrowserTabViewHolder(itemView, interactor) + else -> throw IllegalStateException("Unknown viewType.") + } + } + + override fun onBindViewHolder(viewHolder: TrayViewHolder, position: Int) { + val adapter = when (position) { + POSITION_NORMAL_TABS -> normalAdapter + POSITION_PRIVATE_TABS -> privateAdapter + else -> throw IllegalStateException("View type does not exist.") + } + + viewHolder.bind(adapter) + } + + override fun getItemViewType(position: Int): Int { + return when (position) { + POSITION_NORMAL_TABS -> LAYOUT_ID_NORMAL_TAB + POSITION_PRIVATE_TABS -> LAYOUT_ID_PRIVATE_TAB + else -> throw IllegalStateException("Unknown position.") + } + } + + override fun getItemCount(): Int = TRAY_TABS_COUNT + + companion object { + const val TRAY_TABS_COUNT = 2 + + const val POSITION_NORMAL_TABS = 0 + const val POSITION_PRIVATE_TABS = 1 + } +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TrayViewHolders.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TrayViewHolders.kt new file mode 100644 index 000000000..e94226c8b --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TrayViewHolders.kt @@ -0,0 +1,41 @@ +/* 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.tabstray + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.extensions.LayoutContainer +import org.mozilla.fenix.R +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList + +sealed class TrayViewHolder constructor( + override val containerView: View +) : RecyclerView.ViewHolder(containerView), LayoutContainer { + + abstract fun bind(adapter: RecyclerView.Adapter) +} + +class BrowserTabViewHolder( + containerView: View, + interactor: TabsTrayInteractor +) : TrayViewHolder(containerView) { + + private val trayList: BaseBrowserTrayList = itemView.findViewById(R.id.tray_list_item) + + init { + trayList.interactor = interactor + } + + override fun bind(adapter: RecyclerView.Adapter) { + trayList.layoutManager = LinearLayoutManager(itemView.context) + trayList.adapter = adapter + } + + companion object { + const val LAYOUT_ID_NORMAL_TAB = R.layout.normal_browser_tray_list + const val LAYOUT_ID_PRIVATE_TAB = R.layout.private_browser_tray_list + } +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/BaseBrowserTrayList.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/BaseBrowserTrayList.kt new file mode 100644 index 000000000..caaa51108 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/BaseBrowserTrayList.kt @@ -0,0 +1,95 @@ +/* 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.tabstray.browser + +import android.content.Context +import android.util.AttributeSet +import androidx.recyclerview.widget.RecyclerView +import mozilla.components.browser.tabstray.TabsAdapter +import mozilla.components.feature.tabs.TabsUseCases +import mozilla.components.feature.tabs.tabstray.TabsFeature +import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.components.metrics.MetricController +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.tabstray.TabsTrayInteractor +import org.mozilla.fenix.tabstray.TrayItem +import org.mozilla.fenix.tabstray.ext.filterFromConfig +import org.mozilla.fenix.utils.view.LifecycleViewProvider + +abstract class BaseBrowserTrayList @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RecyclerView(context, attrs, defStyleAttr), TrayItem { + + enum class BrowserTabType { NORMAL, PRIVATE } + data class Configuration(val browserTabType: BrowserTabType) + + abstract val configuration: Configuration + + var interactor: TabsTrayInteractor? = null + + private val lifecycleProvider = LifecycleViewProvider(this) + + private val selectTabUseCase = SelectTabUseCaseWrapper( + context.components.analytics.metrics, + context.components.useCases.tabsUseCases.selectTab + ) { + interactor?.navigateToBrowser() + } + + private val removeTabUseCase = RemoveTabUseCaseWrapper( + context.components.analytics.metrics + ) { sessionId -> + interactor?.tabRemoved(sessionId) + } + + private val tabsFeature by lazy { + ViewBoundFeatureWrapper( + feature = TabsFeature( + adapter as TabsAdapter, + context.components.core.store, + selectTabUseCase, + removeTabUseCase, + { it.filterFromConfig(configuration) }, + { } + ), + owner = lifecycleProvider, + view = this + ) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + // This is weird, but I don't have a better solution right now: We need to keep a + // lazy reference to the feature/adapter so that we do not re-create + // it every time it's attached. This reference is our way to init. + tabsFeature + } +} + +internal class SelectTabUseCaseWrapper( + private val metrics: MetricController, + private val selectTab: TabsUseCases.SelectTabUseCase, + private val onSelect: (String) -> Unit +) : TabsUseCases.SelectTabUseCase { + override fun invoke(tabId: String) { + metrics.track(Event.OpenedExistingTab) + selectTab(tabId) + onSelect(tabId) + } +} + +internal class RemoveTabUseCaseWrapper( + private val metrics: MetricController, + private val onRemove: (String) -> Unit +) : TabsUseCases.RemoveTabUseCase { + override fun invoke(sessionId: String) { + metrics.track(Event.ClosedExistingTab) + onRemove(sessionId) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/NormalBrowserTrayList.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/NormalBrowserTrayList.kt new file mode 100644 index 000000000..eed7f8586 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/NormalBrowserTrayList.kt @@ -0,0 +1,19 @@ +/* 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.tabstray.browser + +import android.content.Context +import android.util.AttributeSet + +/** + * A browser tabs list that displays normal tabs. + */ +class NormalBrowserTrayList @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseBrowserTrayList(context, attrs, defStyleAttr) { + override val configuration: Configuration = Configuration(BrowserTabType.NORMAL) +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt new file mode 100644 index 000000000..0b8f73e72 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt @@ -0,0 +1,19 @@ +/* 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.tabstray.browser + +import android.content.Context +import android.util.AttributeSet + +/** + * A browser tabs list that displays private tabs. + */ +class PrivateBrowserTrayList @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseBrowserTrayList(context, attrs, defStyleAttr) { + override val configuration: Configuration = Configuration(BrowserTabType.PRIVATE) +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt b/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt new file mode 100644 index 000000000..cf11c8c39 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt @@ -0,0 +1,15 @@ +/* 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.tabstray.ext + +import mozilla.components.browser.state.state.TabSessionState +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList.BrowserTabType.PRIVATE +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList.Configuration + +fun TabSessionState.filterFromConfig(configuration: Configuration): Boolean { + val isPrivate = configuration.browserTabType == PRIVATE + + return content.private == isPrivate +} 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 eece24425..777770165 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/FenixTabsAdapter.kt @@ -15,6 +15,7 @@ import kotlinx.android.synthetic.main.tab_tray_item.view.* import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.tabstray.TabViewHolder import mozilla.components.browser.tabstray.TabsAdapter +import mozilla.components.browser.thumbnails.loader.ThumbnailLoader import mozilla.components.concept.base.images.ImageLoader import mozilla.components.concept.tabstray.Tab import mozilla.components.concept.tabstray.Tabs @@ -27,7 +28,7 @@ import org.mozilla.fenix.ext.updateAccessibilityCollectionItemInfo class FenixTabsAdapter( private val context: Context, - imageLoader: ImageLoader + imageLoader: ImageLoader = ThumbnailLoader(context.components.core.thumbnailStorage) ) : TabsAdapter( viewHolderProvider = { parentView -> TabTrayViewHolder( diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt index 39dc062b6..19ea89a2a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/SaveToCollectionsButtonAdapter.kt @@ -23,7 +23,7 @@ import org.mozilla.fenix.tabtray.SaveToCollectionsButtonAdapter.ViewHolder */ class SaveToCollectionsButtonAdapter( private val interactor: TabTrayInteractor, - private val isPrivate: Boolean = false + private val isPrivate: () -> Boolean = { false } ) : ListAdapter(DiffCallback) { init { @@ -66,7 +66,7 @@ class SaveToCollectionsButtonAdapter( } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.itemView.isVisible = !isPrivate && + holder.itemView.isVisible = !isPrivate() && interactor.onModeRequested() is TabTrayDialogFragmentState.Mode.Normal } 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 db3768a32..acb200a65 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -92,7 +92,8 @@ class TabTrayView( private var multiselectMenu: BrowserMenu? = null private var tabsTouchHelper: TabsTouchHelper - private val collectionsButtonAdapter = SaveToCollectionsButtonAdapter(interactor, isPrivate) + private val collectionsButtonAdapter = + SaveToCollectionsButtonAdapter(interactor) { isPrivateModeSelected } private var hasLoaded = false @@ -700,7 +701,6 @@ class TabTrayView( fun scrollToSelectedBrowserTab(selectedTabId: String? = null) { view.tabsTray.apply { val recyclerViewIndex = getSelectedBrowserTabViewIndex(selectedTabId) - layoutManager?.scrollToPosition(recyclerViewIndex) smoothScrollBy( 0, diff --git a/app/src/main/java/org/mozilla/fenix/utils/AccessibilityGridLayoutManager.kt b/app/src/main/java/org/mozilla/fenix/utils/AccessibilityGridLayoutManager.kt new file mode 100644 index 000000000..0e8aea036 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/utils/AccessibilityGridLayoutManager.kt @@ -0,0 +1,32 @@ +/* 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.utils + +import android.content.Context +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView + +/** + * A GridLayoutManager that can be used to override methods in Android implementation + * to improve ayy1 or fix a11y issues. + */ +class AccessibilityGridLayoutManager( + context: Context, + spanCount: Int +) : GridLayoutManager( + context, + spanCount +) { + override fun getColumnCountForAccessibility( + recycler: RecyclerView.Recycler, + state: RecyclerView.State + ): Int { + return if (itemCount < spanCount) { + itemCount + } else { + super.getColumnCountForAccessibility(recycler, state) + } + } +} 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 156dc89a3..6c4801216 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -26,10 +26,12 @@ import mozilla.components.support.ktx.android.content.longPreference import mozilla.components.support.ktx.android.content.stringPreference import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.components.settings.counterPreference +import org.mozilla.fenix.components.settings.featureFlagPreference import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey @@ -319,6 +321,12 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = false ) + var tabsTrayRewrite by featureFlagPreference( + appContext.getPreferenceKey(R.string.pref_key_new_tabs_tray), + default = false, + featureFlag = FeatureFlags.tabsTrayRewrite + ) + fun getTabTimeout(): Long = when { closeTabsAfterOneDay -> ONE_DAY_MS closeTabsAfterOneWeek -> ONE_WEEK_MS @@ -949,6 +957,38 @@ class Settings(private val appContext: Context) : PreferencesHolder { 0 ) + /** + * Storing number of installed add-ons for telemetry purposes + */ + var installedAddonsCount by intPreference( + appContext.getPreferenceKey(R.string.pref_key_installed_addons_count), + 0 + ) + + /** + * Storing the list of installed add-ons for telemetry purposes + */ + var installedAddonsList by stringPreference( + appContext.getPreferenceKey(R.string.pref_key_installed_addons_list), + default = "" + ) + + /** + * Storing number of enabled add-ons for telemetry purposes + */ + var enabledAddonsCount by intPreference( + appContext.getPreferenceKey(R.string.pref_key_enabled_addons_count), + 0 + ) + + /** + * Storing the list of enabled add-ons for telemetry purposes + */ + var enabledAddonsList by stringPreference( + appContext.getPreferenceKey(R.string.pref_key_enabled_addons_list), + default = "" + ) + private var savedLoginsSortingStrategyString by stringPreference( appContext.getPreferenceKey(R.string.pref_key_saved_logins_sorting_strategy), default = SavedLoginsSortingStrategyMenu.Item.AlphabeticallySort.strategyString @@ -988,4 +1028,16 @@ class Settings(private val appContext: Context) : PreferencesHolder { appContext.getPreferenceKey(R.string.pref_key_swipe_toolbar_switch_tabs), default = true ) + + var creditCardsFeature by featureFlagPreference( + appContext.getPreferenceKey(R.string.pref_key_show_credit_cards_feature), + default = false, + featureFlag = FeatureFlags.creditCardsFeature + ) + + var addressFeature by featureFlagPreference( + appContext.getPreferenceKey(R.string.pref_key_show_address_feature), + default = false, + featureFlag = FeatureFlags.addressesFeature + ) } diff --git a/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt b/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt index f9b349fce..db2d0b5a9 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt @@ -16,18 +16,18 @@ import androidx.core.view.isVisible import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.browser_toolbar_popup_window.view.* import mozilla.components.browser.state.selector.selectedTab -import mozilla.components.browser.state.state.CustomTabSessionState import mozilla.components.browser.state.store.BrowserStore import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components import java.lang.ref.WeakReference +import mozilla.components.browser.state.selector.findCustomTab object ToolbarPopupWindow { fun show( view: WeakReference, - customTabSession: CustomTabSessionState? = null, + customTabId: String? = null, handlePasteAndGo: (String) -> Unit, handlePaste: (String) -> Unit, copyVisible: Boolean = true @@ -36,7 +36,7 @@ object ToolbarPopupWindow { val clipboard = context.components.clipboardHandler if (!copyVisible && clipboard.text.isNullOrEmpty()) return - val isCustomTabSession = customTabSession != null + val isCustomTabSession = customTabId != null val customView = LayoutInflater.from(context) .inflate(R.layout.browser_toolbar_popup_window, null) @@ -63,7 +63,7 @@ object ToolbarPopupWindow { popupWindow.dismiss() clipboard.text = getUrlForClipboard( it.context.components.core.store, - customTabSession + customTabId ) view.get()?.let { @@ -101,10 +101,11 @@ object ToolbarPopupWindow { @VisibleForTesting internal fun getUrlForClipboard( store: BrowserStore, - customTabSession: CustomTabSessionState? = null + customTabId: String? = null ): String? { - return if (customTabSession != null) { - customTabSession.content.url + return if (customTabId != null) { + val customTab = store.state.findCustomTab(customTabId) + customTab?.content?.url } else { val selectedTab = store.state.selectedTab selectedTab?.readerState?.activeUrl ?: selectedTab?.content?.url diff --git a/app/src/main/java/org/mozilla/fenix/utils/view/LifecycleViewProvider.kt b/app/src/main/java/org/mozilla/fenix/utils/view/LifecycleViewProvider.kt new file mode 100644 index 000000000..010f82b6f --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/utils/view/LifecycleViewProvider.kt @@ -0,0 +1,45 @@ +/* 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.utils.view + +import android.view.View +import androidx.annotation.VisibleForTesting +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.Lifecycle.State +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry + +/** + * Provides a [LifecycleOwner] on a given [View] for features that function on lifecycle events. + * + * When the [View] is attached to the window, observers will receive the [Lifecycle.Event.ON_START] event. + * When the [View] is detached to the window, observers will receive the [Lifecycle.Event.ON_STOP] event. + * + * @param view The [View] that will be observed. + */ +class LifecycleViewProvider(view: View) : LifecycleOwner { + private val registry = LifecycleRegistry(this) + + init { + registry.currentState = State.INITIALIZED + + view.addOnAttachStateChangeListener(ViewBinding(registry)) + } + + override fun getLifecycle(): Lifecycle = registry +} + +@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) +internal class ViewBinding( + private val registry: LifecycleRegistry +) : View.OnAttachStateChangeListener { + override fun onViewAttachedToWindow(v: View?) { + registry.currentState = State.STARTED + } + + override fun onViewDetachedFromWindow(v: View?) { + registry.currentState = State.DESTROYED + } +} diff --git a/app/src/main/res/drawable/ic_search_with.xml b/app/src/main/res/drawable/ic_search_with.xml new file mode 100644 index 000000000..8ffacd9b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_search_with.xml @@ -0,0 +1,16 @@ + + + + diff --git a/app/src/main/res/layout/component_tabstray2.xml b/app/src/main/res/layout/component_tabstray2.xml new file mode 100644 index 000000000..6bcbe4e4f --- /dev/null +++ b/app/src/main/res/layout/component_tabstray2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/component_top_sites.xml b/app/src/main/res/layout/component_top_sites.xml index 41f5a29b7..74a5bae39 100644 --- a/app/src/main/res/layout/component_top_sites.xml +++ b/app/src/main/res/layout/component_top_sites.xml @@ -24,7 +24,7 @@ to keep layout_width="match_parent"--> android:clipToPadding="false" android:overScrollMode="never" android:nestedScrollingEnabled="false" - app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" - app:spanCount="4" + tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + tools:spanCount="4" tools:listitem="@layout/top_site_item" /> diff --git a/app/src/main/res/layout/normal_browser_tray_list.xml b/app/src/main/res/layout/normal_browser_tray_list.xml new file mode 100644 index 000000000..4e243c9d7 --- /dev/null +++ b/app/src/main/res/layout/normal_browser_tray_list.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/layout/preference_category_no_icon_style.xml b/app/src/main/res/layout/preference_category_no_icon_style.xml new file mode 100644 index 000000000..b5f7df4ab --- /dev/null +++ b/app/src/main/res/layout/preference_category_no_icon_style.xml @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/private_browser_tray_list.xml b/app/src/main/res/layout/private_browser_tray_list.xml new file mode 100644 index 000000000..bd746632a --- /dev/null +++ b/app/src/main/res/layout/private_browser_tray_list.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/layout/synced_tabs_tray_list.xml b/app/src/main/res/layout/synced_tabs_tray_list.xml new file mode 100644 index 000000000..d7a224408 --- /dev/null +++ b/app/src/main/res/layout/synced_tabs_tray_list.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index d3a9c5efb..23f548ae9 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -118,6 +118,11 @@ app:destination="@id/tabTrayDialogFragment" app:popUpTo="@id/tabTrayDialogFragment" app:popUpToInclusive="true"/> + @@ -128,6 +133,15 @@ android:id="@+id/action_global_tabSettingsFragment" app:destination="@id/tabsSettingsFragment" /> + + + + حرّر العلامة الإضافات + + الامتدادات ما من إضافات هنا @@ -180,6 +182,8 @@ المظهر + + خصّص منظور القارئ تعذّر الاتصال، لم أتعرّف على مخطّط المسار. @@ -218,6 +222,11 @@ اطّلع على المزيد + + ابحث عن %s + + ابحث مباشرة من شريط العنوان + افتح في لسان Firefox جديد @@ -532,6 +541,10 @@ العلامات الأخرى التأريخ + + لسان جديد + + ابحث في الصفحة الألسنة المُزامنة @@ -884,17 +897,23 @@ مفعّل معطّل - + اسمح بالصوت والڤِديو + + اسمح بالصوت والڤِديو احجب الصوت والڤديو على بيانات الشبكة في المحمول فقط سيعمل الصوت والڤديو على الشبكة اللاسلكية - + احجب الصوت فقط - + + احجب الصوت فقط + احجب الصوت والڤِديو + + احجب الصوت والڤِديو مفعّل @@ -1339,8 +1358,12 @@ امنع السكربتات الخبيثة من الوصول إلى جهازك لتعدين العملات رقميًا. مسجّلات البصمات + + يُوقف جمع البيانات الفريدة التي تُحدّد جهازك عن غيره والتي يمكن استعمالها لأغراض التعقّب. المحتوى الذي يتعقّبك + + يُوقف تحميل الإعلانات والڤِديوهات وغيرها من محتويات خارجية تحتوي على برمجيات تعقّب. قد يؤثّر هذا على سلوك بعض المواقع. متى ما رأيت الدرع بنفسجيًا اعرف أنّ %s حجب المتعقّبات في أحد المواقع. اضغط لتفاصيل أكثر. @@ -1522,6 +1545,18 @@ افرز قائمة جلسات الولوج + + + بطاقات الائتمان + + احفظ البطاقات واملأها تلقائيًا + + البيانات معماة + + زامِن البطاقات بين الأجهزة + + أضِف بطاقة ائتمان + أضِف محرك بحث diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 54b3faa96..1e9019fd1 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -20,10 +20,6 @@ Equí van amosase les llingüetes privaes abiertes. - - Baidu - - JD 1 llingüeta abierta. Toca pa cambiar a otra. @@ -707,6 +703,8 @@ Los últimos 30 díes + + D\'hai más 30 díes Nun hai nada @@ -1146,9 +1144,6 @@ ¡Afáyate en %s! ¿Yá tienes una cuenta? - - Conoz %s Novedaes Consigui les rempuestes equí - - Comienza a sincronizar los marcadores, les contraseñes y muncho más cola to cuenta de Firefox. - - Deprender más @@ -1168,8 +1159,6 @@ Sí, aniciar sesión Aniciando sesión… - - Aniciar sesión en Firefox Siguir ensin aniciar sesión @@ -1177,27 +1166,12 @@ Hebo un fallu al aniciar sesión - - Privacidá automática - - Los axustes de privacidá y seguranza bloquien rastrexadores, malware y compañes que te siguen. Estándar (por defeutu) - - Bloquia dalgunos rastrexadores. Les páxines van cargar de mou normal. Estricta (aconséyase) Estricta - - Bloquia más rastrexadores, anuncios y ventanos emerxentes. Les páxines van cargar más rápido mas dalgunes funcionalidaes quiciabes nun funcionen. - - Posición - - Prueba\'l restolar con una mano cola barra de ferramientes no baxero o móvila a lo cimero. Restolar en privao + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Diseñemos %s pa date\'l control tocante a los que compartes en llinia y con nós. @@ -1226,8 +1200,6 @@ en llinia y con nós. Escoyeta d\'un estilu - - Aforra daqué de batería y curia los güeyos activando\'l mou escuru. Siguir l\'estilu del sistema @@ -1284,14 +1256,10 @@ en llinia y con nós. Deprender más Estándar (por defeutu) - - Bloquia dalgunos rastrexadores. Les páxines van cargar de mou normal. Qué se bloquia coles proteición estándar escontra\'l rastrexu Estricta - - Bloquia más rastrexadores, anuncios y ventanos emerxentes. Les páxines van cargar más rápido mas dalgunes funcionalidaes quiciabes nun funcionen. Lo que la proteición estricta escontra\'l rastrexu bloquia @@ -1535,6 +1503,29 @@ en llinia y con nós. Menú pa ordenar los anicios sesión + + + Tarxetes de creitu + + Los datos tán cifraos + + + Númberu de la tarxeta + + Data de caducidá + + Titular de la tarxeta + + Nomatu de la tarxeta + + Desaniciar la tarxeta + + Guardar + + Guardar + + Encaboxar + Amestar un motor de busca diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 5cd09eab8..819bf3b10 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -20,10 +20,6 @@ Тут будуць паказаны вашы прыватныя карткі. - - Baidu - - JD 1 адкрытая картка. Націсніце, каб пераключыць карткі. @@ -180,6 +176,11 @@ Выгляд + + Уладкаваць рэжым чытання + + Дадаць + Немагчыма злучыцца. Невядомая схема URL. @@ -1178,9 +1179,6 @@ Вітаем у %s! Ужо маеце ўліковы запіс? - - Пазнаёмцеся з %s Паглядзіце, што новага Адказы тут - - Пачніце сінхранізаваць закладкі, паролі і шмат іншага праз свой уліковы запіс Firefox. - - Падрабязней + + Сінхранізуйце Firefox паміж прыладамі @@ -1200,35 +1196,20 @@ Так, увайсці Уваход… - - Увайсці ў Firefox + + Зарэгістравацца Не ўваходзіць Сінхранізацыя ўключана Няўдача ўваходу - - Аўтаматычная прыватнасць - - Налады прыватнасці і бяспекі блакуюць трэкеры, шкоднасныя праграмы і кампаніі, што ідуць за вамі. Стандартная (прадвызначана) - - Блакуе менш трэкераў. Старонкі загружаюцца нармальна. Строгая (рэкамендуецца) Строгая - - Блакуе больш трэкераў, рэкламы і выплыўных вокнаў. Старонкі загружаюцца хутчэй, але некаторыя функцыі могуць не працаваць. - - Выберыце становішча - - Паспрабуйце навігацыю адной рукой на паліцы прылад унізе або перамясціце яе ўверх. Аглядайце прыватна Ваша прыватнасць + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Мы распрацавалі %s, каб даць вам кантроль над тым, чым дзяліцца ў Інтэрнэце, і тым, чым вы падзеліцеся з намі. Паведамленне аб прыватнасці @@ -1254,8 +1235,6 @@ Выберыце тэму - - Зберажыце зарад батарэі і зрок, уключыўшы цёмны рэжым. Аўтаматычна @@ -1311,14 +1290,10 @@ Даведацца больш Стандартная (прадвызначана) - - Блакуе менш трэкераў. Старонкі загружаюцца нармальна. Што блакуецца стандартнай аховай ад сачэння Строгая - - Блакуе больш трэкераў, рэкламы і выплыўных вокнаў. Старонкі загружаюцца хутчэй, але некаторыя функцыі могуць не працаваць. Што блакуецца строгай аховай ад сачэння diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index c40f2a58a..de52886fd 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -617,8 +617,12 @@ Затваряне Споделяне на избраните раздели + + Меню избрани раздели Премахване на раздела от спъсъка + + Избиране на раздели Затваряне на раздел @@ -652,7 +656,9 @@ Преименуване на списък Отваряне на раздели - + + Наименование на списък + Преименуване Премахване @@ -860,7 +866,7 @@ Включено Изключено - + Разрешаване на звук и видео @@ -960,10 +966,36 @@ Отваряне Изчистване и отваряне + + С подкрепата на + + Разделът е изтрит + + Разделите са изтрити + + Разделът е затворен + + Разделите са затворени + + Разделите са затворени! + + Поверителният раздел е затворен + + Поверителните раздели са затворени + + Поверителните раздели са затворени + + ОТМЕНЯНЕ + + Отменяне + + Потвърждаване Разрешете %1$s да отвори %2$s + + Наистина ли искате да изтриете %1$s? Изтриване на %1$s? @@ -981,10 +1013,14 @@ Размер на шрифт + + Изтриване на данни от разглеждане Отворени раздели %d раздела + + История на разглеждане и данни от страници %d адреса @@ -995,22 +1031,39 @@ %d страници Бисквитки + + Ще бъдете отписани от повечето страници Буферирани изображения и файлове Освобождава място за съхранение Права на страницата + + Изтегляния + + Изтриване на данни от разглеждане - Изтриване на история на разглеждане и изход + Изтриване на история при изход + + Автоматично изтрива историята на разглеждане, при избор на „Изход“ от главното меню + + Автоматично изтрива историята на разглеждане, при избор на \"Изход\" от главното меню Изход + + Това ще изтрие цялата история на разглеждане. + + %s ще изтрие избраните данни от историята на разглеждане. Отказ Изтриване + + Историята е изчистена + Преминете към новият Nightly @@ -1103,6 +1156,8 @@ Сканиране на код + + Изключване Отказ @@ -1187,12 +1242,23 @@ back from ETP details (Ex: Tracking content) --> Връщане назад + + Вашите права + + Използвани библиотеки с отворен код + + Какво е новото във %s %s | библиотеки с отворен код + + Пренасочващи проследявания + Поддръжка + + Сривове Политика на поверителност @@ -1283,6 +1349,28 @@ Научете повече + + Запазване + + Без запазване + + Паролата е копирана в системния буфер + + Потребителското име е копирано в системния буфер + + Копиране на парола + + Копиране на потребителско име + + Отваряне препратката в четеца + + Показване на парола + + Скриване на парола + + Отключете, за да видите запазените регистрации + + Защитете вашите данни за вход Меню за сортиране на регистрации @@ -1343,6 +1431,10 @@ Пароли + + Изтриване + + Изтриване Редактиране diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ff2514abc..b298019b5 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -180,6 +180,8 @@ Aparença + + Personalitza la vista de lectura No s’ha pogut connectar. No es reconeix l’esquema d’URL. diff --git a/app/src/main/res/values-cak/strings.xml b/app/src/main/res/values-cak/strings.xml index 1cea4e24a..5eefaee35 100644 --- a/app/src/main/res/values-cak/strings.xml +++ b/app/src/main/res/values-cak/strings.xml @@ -1586,6 +1586,19 @@ Ticholajïx ruk\'utsamaj rutikirib\'al molojri\'ïl + + + Rutarjeta\' kre\'ito\' + + Keyak chuqa\' ruyon kenojisäx ri tarjeta\' + + + Ewan kisik\'ixik ri taq tzij + + Sync tarjeta\' chi kikojol okisab\'äl + + Titz\'aqatisäx rutarjeta\' kre\'ito\' + Titz\'aqatisäx kanob\'äl diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6b80e461f..f3adf80b1 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -21,10 +21,6 @@ Tady se zobrazí vaše anonymní panely. - - Baidu - - JD Jeden otevřený panel. Klepnutím panely přepnete. @@ -184,6 +180,13 @@ Vzhled + + Přizpůsobit zobrazení čtečky + + Přidat + + Upravit + Nelze se připojit. Schéma URL nebylo rozpoznáno. @@ -216,7 +219,7 @@ Nepovolit - Chcete našeptávat vyhledávání také v anonymním prohlížení? + Chcete našeptávat dotazy pro vyhledávač také v anonymním prohlížení? %s bude sdílet text zadávaný do adresního řádku s vaším výchozím vyhledávačem. @@ -331,7 +334,7 @@ Zobrazovat vyhledávače - Našeptávat vyhledávání + Našeptávat dotazy pro vyhledávač Zobrazit hlasové vyhledávání @@ -991,6 +994,10 @@ Všechny akce Naposledy použité + + Jste přihlášeni jako %1$s + + Přihlásit se k synchronizaci Přihlásit ke službě Sync @@ -1184,9 +1191,6 @@ Vítá vás %s Už máte účet? - - Poznejte aplikaci %s Co je nového Zde najdete všechny odpovědi - - S účtem Firefoxu můžete synchronizovat záložky, hesla i další svá data. + + Synchronizace Firefoxu mezi zařízeními - Zjistit více + Přeneste si své záložky, historii a hesla do Firefoxu i na toto zařízení. @@ -1206,8 +1210,8 @@ Ano, přihlásit Přihlašování… - - Přihlásit se do Firefoxu + + Přihlásit se Nepřihlašovat @@ -1215,26 +1219,23 @@ Přihlášení selhalo - Automatické soukromí - - Nastavení soukromí a zabezpečení blokuje sledovací prvky, malware a společnosti, které vás sledují. + Soukromí pro vás a napořád + + Firefox automaticky zabrání společnostem v tajném sledování vašeho prohlížení webu. Standardní (výchozí) - Blokuje méně sledovacích prvků. Stránky se načítají běžným způsobem. + Vyvážené soukromí a výkon. Neovlivní správné načítání webových stránek. Přísná (doporučeno) Přísná - Blokuje více sledovacích prvků, reklam a vyskakovacích oken. Zrychlí i načítání stránek, ale může omezit jejich fungování. - - Vyberte si svou stranu + Blokuje více sledovacích prvků. Zrychlí i načítání stránek, ale může omezit jejich fungování. + + Vyberte si umístění nástrojové lišty - Zkuste po webu brouzdat jednou rukou s adresním řádkem vespod obrazovky, nebo ho přesuňte nahoru. + Nastavte si umístění nástrojové lišty na obrazovce dole nebo nahoře, ať na ni dosáhnete. Prohlížejte v soukromí Vaše soukromí + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s vám dává kontrolu nad tím, co sdílíte online a co sdílíte s námi. Přečíst zásady ochrany osobních údajů @@ -1262,7 +1263,7 @@ Vyberte si vzhled - Šetřete baterku i své oči povolením tmavého režimu. + Šetřete baterku i své oči povolením tmavého režimu. Automatický @@ -1317,13 +1318,13 @@ Standardní (výchozí) - Blokuje méně sledovacích prvků. Stránky se načítají běžným způsobem. + Vyvážené soukromí a výkon. Neovlivní správné načítání webových stránek. Co blokuje běžné nastavení ochrany proti sledování Přísná - Blokuje více sledovacích prvků, reklam a vyskakovacích oken. Zrychlí i načítání stránek, ale může omezit jejich fungování. + Blokuje více sledovacích prvků. Zrychlí i načítání stránek, ale může omezit jejich fungování. Co blokuje přísné nastavení ochrany proti sledování @@ -1560,6 +1561,37 @@ Seřadit podle + + + Platební karty + + Ukládat a automaticky vyplňovat karty + + Data jsou šifrována + + Synchronizovat karty napříč zařízeními + + Přidat platební kartu + + + Přidat kartu + + Číslo karty + + Datum platnosti + + Jméno na kartě + + Vaše označení karty + + Odstranit kartu + + Uložit + + Uložit + + Zrušit + Přidat vyhledávač diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 336188a71..ee2968e06 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -19,10 +19,6 @@ Bydd eich tabiau preifat i’w gweld yma. - - Baidu - - JD 1 tab agored. Tapio i newid tabiau. @@ -53,7 +49,7 @@ Dewiswyd - Mae %1$s yn cael ei greu gan @fork-maintainers. + Mae %1$s yn cael ei greu gan Mozilla. @@ -182,6 +178,11 @@ Cyfaddasu’r golwg defnyddiwr + + Ychwanegu + + Golygu + Methu cysylltu. Cynllun URL anadnabyddadwy. @@ -974,6 +975,10 @@ Pob gweithred Defnyddiwyd yn ddiweddar + + Mewngofnodwyd fel %1$s + + Mewngofnodi i gydweddu Mewngofnodi i Sync @@ -1165,9 +1170,6 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Croeso i %s! A oes gennych chi gyfrif yn barod? - - Dod i adnabod %s Beth sy’n newydd Cewch atebion yma - - Cychwynnwch gydweddu nodau tudalen, cyfrineiriau, a rhagor gyda’ch cyfrif Firefox. + + Cydweddu Firefox rhwng dyfeisiau - Dysgu rhagor + Dewch â nodau tudalen, hanes, a chyfrineiriau i Firefox ar y ddyfais hon. @@ -1187,8 +1189,8 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Iawn, mewngofnodwch fi Yn mewngofnodi… - - Mewngofnodi i Firefox + + Ymuno Cadw wedi allgofnodi @@ -1197,26 +1199,23 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Wedi methu mewngofnodi - Preifatrwydd awtomatig - - Mae gosodiadau preifatrwydd a diogelwch yn rhwystro tracwyr, meddalwedd faleisus, a chwmnïau sy’n eich dilyn. + Preifatrwydd bob amser + + Mae Firefox yn atal cwmnïau rhag eich dilyn yn gyfrinachol o amgylch y we, yn awtomatig. Safonol (rhagosodedig) - Yn rhwystro llai o dracwyr. Bydd tudalennau’n llwytho’n arferol. + Cydbwysedd rhwng diogelwch a pherfformiad. Bydd tudalennau’n llwytho fel arfer. Llym (argymell) Llym - Yn rhwystro rhagor o dracwyr, hysbysebion, a llamlenni. Mae tudalennau’n llwytho’n gyflymach, ond efallai na fydd rhywfaint o’u hymarferoldeb yn gweithio. - - Gwneud safiad + Yn rhwystro mwy o dracwyr fel bod tudalennau’n llwytho’n gyflymach, ond gall dorri rhai swyddogaethau ar y dudalen. + + Dewiswch leoliad eich bar offer - Rhowch gynnig ar bori un llaw gyda’r bar offer gwaelod neu ei symud i’r brig. + Rhowch y bar offer o fewn cyrraedd hawdd. Cadwch ef ar y gwaelod, neu ei symud i’r brig. Pori’n breifat Eich preifatrwydd + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Rydym wedi cynllunio %s i roi rheolaeth i chi dros yr hyn rydych chi’n ei rannu ar-lein a’r hyn rydych chi’n ei rannu gyda ni.      @@ -1245,7 +1244,7 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Dewis eich thema - Arbedwch ychydig o fatri a’ch golwg trwy alluogi’r modd tywyll. + Arbedwch ychydig o fatri a’ch golwg trwy alluogi’r modd tywyll. Awtomatig @@ -1300,13 +1299,13 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Safonol (rhagosodedig) - Yn rhwystro llai o dracwyr. Bydd tudalennau’n llwytho’n arferol. + Cydbwysedd rhwng diogelwch a pherfformiad. Bydd tudalennau’n llwytho fel arfer. Beth sydd wedi’i rwystro gan ddiogelu tracio safonol Llym - Yn rhwystro rhagor o dracwyr, hysbysebion, a llamlenni. Mae tudalennau’n llwytho’n gyflymach, ond efallai na fydd rhywfaint o’u hymarferoldeb yn gweithio. + Yn rhwystro mwy o dracwyr fel bod tudalennau’n llwytho’n gyflymach, ond gall dorri rhai swyddogaethau ar y dudalen. Beth sydd wedi’i rwystro gan ddiogelu tracio llym @@ -1542,6 +1541,37 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Trefnu dewislen mewngofnodi + + + Cardiau Credyd + + Cadw a awtolanw cardiau + + Mae data wedi’i amgryptio + + Cydweddu cardiau ar draws dyfeisiau + + Ychwanegu cerdyn credyd + + + Ychwanegu cerdyn + + Rhif y Cerdyn + + Dyddiad Dod i Ben + + Enw ar y Cerdyn + + Llysenw Cerdyn + + Dileu cerdyn + + Cadw + + Cadw + + Diddymu + Ychwanegu peiriant chwilio diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index b662bf04c..0a9c77933 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -19,10 +19,6 @@ Dine private faneblade vil blive vist her. - - Baidu - - JD 1 åbent faneblad. Tryk for at skifte faneblade. @@ -180,6 +176,13 @@ Udseende + + Tilpas læsevisning + + Tilføj + + Rediger + Ude af stand til at oprette forbindelse. Ikke-genkendelig URL-skema. @@ -216,6 +219,11 @@ Læs mere + + Søg med %s + + Søg direkte fra adressefeltet + Åbn et nyt Firefox-faneblad @@ -1150,9 +1158,6 @@ Velkommen til %s! Har du allerede en konto? - - Lær %s at kende Se nyhederne @@ -1161,10 +1166,10 @@ Har du spørgsmål om den nye version af %s? Vil du vide, hvad der er ændret? Få svar her - - Begynd at synkronisere bogmærker, adgangskoder m.m. med din Firefox-konto. + + Synkroniser Firefox mellem enheder - Læs mere + Synkroniser bogmærker, historik og adgangskoder med Firefox på denne enhed. @@ -1173,35 +1178,26 @@ Ja, log mig ind Logger ind… - - Log in på Firefox + + Tilmeld dig Forbliv udlogget Synkronisering er slået til Kunne ikke logge ind - - Automatisk privatlivsbeskyttelse - - Indstillinger for privatlivsbeskyttelse og sikkerhed blokerer sporings-mekanismer, skadelig software og virksomheder, der følger dig på nettet. + + Firefox forhindrer automatisk virksomheder i at følge dig i smug på nettet. Standard - Blokerer færre sporings-mekanismer. Sider indlæses som normalt. + Balanceret mellem privatliv og ydelse. Sider indlæses som normalt. Striks (anbefalet) Striks - Blokerer flere sporings-mekanismer, reklamer og pop ups. Sider indlæses hurtigere, men noget funktionalitet virker måske ikke. - - Vælg side - - Brug værktøjslinjen nederst til at browse med én hånd. Værktøjslinjen kan flyttes til toppen. + Blokerer flere sporings-mekanismer. Sider indlæses hurtigere, men noget funktionalitet virker måske ikke. Privat browsing Bedre beskyttelse af dit privatliv + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Vi har designet %s til at give dig kontrol over, hvad du deler på nettet - og hvad du deler med os. Læs vores privatlivspolitik @@ -1229,7 +1225,7 @@ Vælg tema - Skån dit batteri og dine øjne ved at aktivere mørkt tema. + Skån dit batteri og dine øjne med et mørkt tema. Automatisk @@ -1284,13 +1280,13 @@ Standard - Blokerer færre sporings-mekanismer. Sider indlæses som normalt. + Balanceret mellem privatliv og ydelse. Sider indlæses som normalt. Hvad der bliver blokeret af standard-opsætningen af beskyttelse mod sporing Striks - Blokerer flere sporings-mekanismer, reklamer og pop ups. Sider indlæses hurtigere, men noget funktionalitet virker måske ikke. + Blokerer flere sporings-mekanismer. Sider indlæses hurtigere, men noget funktionalitet virker måske ikke. Hvad der bliver blokeret af striks beskyttelse mod sporing @@ -1526,6 +1522,34 @@ Sortér menuen logins + + + Betalingskort + + Gem og autofyld betalingskort + + Data er krypteret + + Synkroniser kort på tværs af enheder + + Tilføj betalingskort + + Tilføj kort + + Kortnummer + + Udløbsdato + + Navn på kort + + Slet kort + + Gem + + Gem + + Annuller + Tilføj søgetjeneste diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 69ab06941..f75945da7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -22,10 +22,6 @@ Ihre privaten Tabs werden hier angezeigt. - - Baidu - - JD 1 offener Tab. Antippen, um Tabs zu wechseln. @@ -187,6 +183,11 @@ Leseansicht anpassen + + Hinzufügen + + Bearbeiten + Verbindung nicht möglich. Nicht erkennbares URL-Schema. @@ -1001,6 +1002,10 @@ Alle Aktionen Kürzlich verwendet + + Angemeldet als %1$s + + Zum Synchronisieren anmelden Bei Sync anmelden @@ -1200,9 +1205,6 @@ Willkommen bei %s! Haben Sie schon ein Konto? - - %s kennenlernen Sehen Sie sich an, was es Neues gibt Hier erhalten Sie Antworten - - Beginnen Sie mit dem Synchronisieren von Lesezeichen, Passwörtern und mehr mittels Ihres Firefox-Kontos. + + Synchronisieren Sie Firefox zwischen Geräten - Weitere Informationen + Übertragen Sie Lesezeichen, Chronik und Passwörter zu Firefox auf diesem Gerät. @@ -1222,8 +1224,8 @@ Ja, anmelden Anmeldung läuft… - - Bei Firefox anmelden + + Registrieren Abgemeldet bleiben @@ -1231,26 +1233,23 @@ Anmeldung fehlgeschlagen - Automatischer Datenschutz - - Datenschutz- und Sicherheitseinstellungen blockieren Tracker, Schadsoftware und Unternehmen, die Sie verfolgen. + Privatsphäre ab Werk + + Firefox verhindert automatisch, dass Unternehmen heimlich Ihre Aktivitäten im Internet verfolgen. Standard - Blockiert weniger Tracker. Seiten werden normal geladen. + Ausgewogen zwischen Datenschutz und Leistung. Seiten laden normal. Streng (empfohlen) Streng - Blockiert mehr Tracker, Anzeigen und Pop-ups. Seiten werden schneller geladen, aber einige Funktionen funktionieren möglicherweise nicht. - - Entscheiden Sie sich + Blockiert weitere Elemente zur Aktivitätenverfolgung, sodass Seiten schneller geladen werden, aber einige Seiten funktionieren dann eventuell nicht richtig. + + Wählen Sie die Position für Ihre Symbolleiste - Versuchen Sie, mit der unteren Symbolleiste mit einer Hand zu surfen, oder verschieben Sie sie nach oben. + Platzieren Sie die Symbolleiste in Reichweite. Behalten Sie sie unten oder verschieben Sie sie nach oben. Privat surfen Ihre Privatsphäre + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Wir haben %s so konzipiert, dass Sie die Kontrolle darüber haben, was Sie im Internet und was Sie mit uns teilen. Lesen Sie unseren Datenschutzhinweis @@ -1278,7 +1277,7 @@ Wählen Sie Ihr Theme - Schonen Sie die Batterie und Ihre Augen, indem Sie den Dunkelmodus aktivieren. + Schonen Sie die Batterie und Ihre Augen mit dem Dunkelmodus. Automatisch @@ -1333,13 +1332,13 @@ Standard - Blockiert weniger Tracker. Seiten werden normal geladen. + Ausgewogen zwischen Datenschutz und Leistung. Seiten laden normal. Was wird durch den Standard-Tracking-Schutz blockiert? Streng - Blockiert mehr Tracker, Anzeigen und Pop-ups. Seiten werden schneller geladen, aber einige Funktionen funktionieren möglicherweise nicht. + Blockiert weitere Elemente zur Aktivitätenverfolgung, sodass Seiten schneller geladen werden, aber einige Seiten funktionieren dann eventuell nicht richtig. Was wird durch den strengen Tracking-Schutz blockiert? @@ -1575,6 +1574,37 @@ Menü mit Zugangsdaten sortieren + + + Kreditkarten + + Autovervollständigung für Kreditkartendaten + + Daten sind verschlüsselt + + Karten zwischen Geräten synchronisieren + + Kreditkarte hinzufügen + + + Karte hinzufügen + + Kartennummer + + Ablaufdatum + + Name auf Karte + + Interner Name für die Karte + + Karte löschen + + Speichern + + Speichern + + Abbrechen + Suchmaschine hinzufügen diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index 589dc5bdb..9d75892ec 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -19,10 +19,6 @@ Waše priwatne rejtariki se how wócyniju. - - Baidu - - JD Wócynjone rejtariki: %1$s. Pótusniśo, aby rejtariki pśešaltował. @@ -52,7 +48,7 @@ Wubrany - %1$s se pśez @fork-maintainers zgótujo. + %1$s se pśez Mozilla zgótujo. @@ -182,6 +178,11 @@ Cytański naglěd pśiměriś + + Pśidaś + + Wobźěłaś + Zwisk njejo móžny. Njespóznawajobna URL-šema. @@ -974,6 +975,10 @@ Wšykne akcije Njedawno wužyte + + Pśizjawjony ako %1$s + + Pla Sync pśizjawiś Pla Sync pśizjawiś @@ -1165,9 +1170,6 @@ Maśo južo konto? - - %s póznaś Cytajśo, což jo nowe How dostanjośo wótegrona - - Synchronizěrujśo něnto cytańske znamjenja, gronidła a wěcej ze swójim kontom Firefox. + + Firefox mjazy rědami synchronizěrowaś - Dalšne informacije + Pśinjasćo cytańske znamjenja, historiju a gronidła k Firefox na toś tom rěźe. @@ -1187,8 +1189,8 @@ Jo, pśizjawiś Pśizjawja se… - - Pla Firefox pśizjawiś + + Registrěrowaś Wótzjawjony wóstaś @@ -1196,26 +1198,23 @@ Pśizjawjenje njejo se raźiło - Awtomatiska priwatnosć - - Nastajenja priwatnosći a wěstoty pśeslědowaki, škódnu softwaru a pśedewześa blokěruju, kótarež wam slěduju. + Priwatnosć pśecej aktiwna + + Firefox awtomatiski pśedewześam zawoborujo, wam kšajźu pó webje slědowaś. Standard - Blokěrujo mjenjej pśeslědowakow. Boki se normalnje zacytaju. + Wuwažony za priwatnosć a wugbaśe. Boki se normalnje zacytaju. Striktny (dopórucony) Striktny - Blokěrujo wěcej pśeslědowakow, wabjenja a wuskokujucych woknow. Boki se malsnjej spěšnje zacytaju, ale někotare funkcije snaź njefunkcioněruju. - - Rozsuźćo se + Blokěrujo dalšne pśeslědowaki, aby se boki malsnjej zacytali, ale někotare boki snaź korektnje njefunkcioněruju. + + Wubjeŕśo poziciju za swóju symbolowu rědku - Woytajśo z dolneju symboloweju rědku z jadneju ruku pśeglědowaś abo pśesuńśo ju górjej. + Pozicioněrujśo symbolowu rědku w swójej bliskosći. Wobchowajśo ju dołojce abo pśesuńśo ju górjej. Priwatnje pśeglědowaś @@ -1229,7 +1228,7 @@ Waša priwatnosć + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Smy %s wuwili, aby wam kontrolu wó tom dali, co online źěliśo a co z nami. Cytajśo našu powěźeńku priwatnosći @@ -1244,7 +1243,7 @@ Wubjeŕśo swóju drastwu - Zmóžniśo śamny modus, aby šonował swóju bateriju a swóje wócy. + Zmóžniśo śamny modus, aby šonował swóju bateriju a swóje wócy. Awtomatiski @@ -1299,13 +1298,13 @@ Standard - Blokěrujo mjenjej pśeslědowakow. Boki se normalnje zacytaju. + Wuwažony za priwatnosć a wugbaśe. Boki se normalnje zacytaju. Co se pśez standardny slědowański šćit blokěrujo? Striktny - Blokěrujo wěcej pśeslědowakow, wabjenja a wuskokujucych woknow. Boki se malsnjej spěšnje zacytaju, ale někotare funkcije snaź njefunkcioněruju. + Blokěrujo dalšne pśeslědowaki, aby se boki malsnjej zacytali, ale někotare boki snaź korektnje njefunkcioněruju. Co se pśez striktny slědowański šćit blokěrujo? @@ -1544,6 +1543,37 @@ Meni pśizjawjeńskich datow sortěrowaś + + + Kreditowe kórty + + Kórty składowaś a awtomatiski wupołniś + + Daty su skoděrowane + + Kórty pśez rědy synchronizěrowaś + + Kreditowu kórtu pśidaś + + + Kórtu pśidaś + + Kórtowy numer + + Datum płaśiwosći + + Mě na kórśe + + Kórtowe pśimě + + Kórtu wulašowaś + + Składowaś + + Składowaś + + Pśetergnuś + Pytnicu pśidaś diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1d72264bd..ce37d7ebf 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -22,10 +22,6 @@ Οι ιδιωτικές καρτέλες σας θα εμφανίζονται εδώ. - - Baidu - - JD 1 ανοικτή καρτέλα. Πατήστε για εναλλαγή καρτελών. @@ -59,7 +55,7 @@ Επιλέχθηκε - Το %1$s αναπτύσσεται από τη @fork-maintainers. + Το %1$s αναπτύσσεται από τη Mozilla. @@ -188,6 +184,11 @@ Προσαρμογή προβολής ανάγνωσης + + Προσθήκη + + Επεξεργασία + Αδυναμία σύνδεσης. Μη αναγνωρίσιμο σχήμα URL. @@ -984,6 +985,8 @@ Όλες οι ενέργειες Πρόσφατη χρήση + + Σύνδεση για συγχρονισμό Σύνδεση στο Sync @@ -1182,9 +1185,6 @@ Καλώς ορίσατε στο %s! Έχετε ήδη λογαριασμό; - - Γνωρίστε το %s Δείτε τι νέο υπάρχει Λάβετε απαντήσεις εδώ - - Ξεκινήστε το συγχρονισμό σελιδοδεικτών, κωδικών πρόσβασης και άλλων δεδομένων με το λογαριασμό Firefox σας. - - Μάθετε περισσότερα @@ -1204,8 +1200,8 @@ Ναι, σύνδεση Σύνδεση… - - Σύνδεση στο Firefox + + Εγγραφή Παραμονή εκτός σύνδεσης @@ -1213,27 +1209,14 @@ Αποτυχία σύνδεσης - - Αυτόματο απόρρητο - - Οι ρυθμίσεις απορρήτου και ασφάλειας αποκλείουν ιχνηλάτες, κακόβουλο λογισμικό και εταιρείες που σας ακολουθούν. + + Το Firefox εμποδίζει την καταγραφή της διαδικτυακής δραστηριότητάς σας από εταιρείες. Τυπική (προεπιλογή) - - Φραγή λιγότερων ιχνηλατών. Οι σελίδες θα φορτώνονται κανονικά. Αυστηρή (προτείνεται) Αυστηρή - - Φραγή περισσότερων ιχνηλατών, διαφημίσεων και αναδυόμενων παραθύρων. Οι σελίδες φορτώνονται ταχύτερα, αλλά ορισμένα χαρακτηριστικά ενδέχεται να μην λειτουργούν. - - Πάρτε θέση - - Δοκιμάστε την περιήγηση με ένα χέρι με την κάτω γραμμή εργαλείων ή μετακινήστε την στο πάνω μέρος. Ιδιωτική περιήγηση Το απόρρητό σας + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Έχουμε σχεδιάσει το %s έτσι, ώστε να ελέγχετε τι κοινοποιείτε στο διαδίκτυο και σε εμάς. Διαβάστε τη σημείωση απορρήτου μας @@ -1259,8 +1242,6 @@ Επιλογή θέματος - - Εξοικονόμηση μπαταρίας και προστασία ματιών με τη σκοτεινή λειτουργία. Αυτόματο @@ -1316,14 +1297,10 @@ Μάθετε περισσότερα Τυπική (προεπιλογή) - - Φραγή λιγότερων ιχνηλατών. Οι σελίδες θα φορτώνονται κανονικά. Τι αποκλείει η τυπική προστασία από καταγραφή Αυστηρή - - Φραγή περισσότερων ιχνηλατών, διαφημίσεων και αναδυόμενων παραθύρων. Οι σελίδες φορτώνονται ταχύτερα, αλλά ορισμένα μέρη ενδέχεται να μην λειτουργούν. Τι αποκλείει η αυστηρή προστασία από καταγραφή @@ -1562,6 +1539,37 @@ Ταξινόμηση μενού σύνδεσης + + + Πιστωτικές κάρτες + + Αποθήκευση και αυτόματη συμπλήρωση στοιχείων καρτών + + Τα δεδομένα είναι κρυπτογραφημένα + + Συγχρονισμός καρτών μεταξύ των συσκευών + + Προσθήκη πιστωτικής κάρτας + + + Προσθήκη κάρτας + + Αριθμός κάρτας + + Ημερομηνία λήξης + + Όνομα στην κάρτα + + Ψευδώνυμο κάρτας + + Διαγραφή κάρτας + + Αποθήκευση + + Αποθήκευση + + Ακύρωση + Προσθήκη μηχανής αναζήτησης diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 146c1e22b..113fc0b19 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -20,10 +20,6 @@ Your private tabs will be shown here. - - Baidu - - JD 1 open tab. Tap to switch tabs. @@ -53,7 +49,7 @@ Selected - %1$s is produced by @fork-maintainers. + %1$s is produced by Mozilla. @@ -182,6 +178,11 @@ Customize reader view + + Add + + Edit + Unable to connect. Unrecognizable URL scheme. @@ -1157,9 +1158,6 @@ Welcome to %s! Already have an account? - - Get to know %s See what’s new Get answers here - - Start syncing bookmarks, passwords, and more with your Firefox account. + + Sync Firefox between devices - Learn more + Bring bookmarks, history, and passwords to Firefox on this device. @@ -1179,8 +1177,8 @@ Yes, sign me in Signing in… - - Sign in to Firefox + + Sign up Stay signed out @@ -1188,26 +1186,23 @@ Failed to sign-in - Automatic privacy - - Privacy and security settings block trackers, malware, and companies that follow you. + Always-on privacy + + Firefox automatically stops companies from secretly following you around the web. Standard (default) - Blocks fewer trackers. Pages will load normally. + Balanced for privacy and performance. Pages load normally. Strict (recommended) Strict - Blocks more trackers, ads, and popups. Pages load faster, but some functionality might not work. - - Take a position + Blocks more trackers so pages load faster, but some on-page functionally may break. + + Pick your toolbar placement - Try one-handed browsing with the bottom toolbar or move it to the top. + Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. Browse privately Your privacy + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> We’ve designed %s to give you control over what you share online and what you share with us. Read our privacy notice @@ -1235,7 +1230,7 @@ Choose your theme - Save some battery and your eyesight by enabling dark mode. + Save some battery and your eyesight with dark mode. Automatic @@ -1290,13 +1285,13 @@ Standard (default) - Blocks fewer trackers. Pages will load normally. + balanced for privacy and performance. Pages load normally. What’s blocked by standard tracking protection Strict - Blocks more trackers, ads, and popups. Pages load faster, but some functionality might not work. + Blocks more trackers so pages load faster, but some on-page functionality may break. What’s blocked by strict tracking protection @@ -1530,6 +1525,37 @@ Sort logins menu + + + Credit cards + + Save and autofill cards + + Data is encrypted + + Sync cards across devices + + Add credit card + + + Add card + + Card Number + + Expiration Date + + Name on Card + + Card Nickname + + Delete card + + Save + + Save + + Cancel + Add search engine diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 9516a3abc..fb84b3f96 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -19,10 +19,6 @@ Your private tabs will be shown here. - - Baidu - - JD 1 open tab. Tap to switch tabs. @@ -52,7 +48,7 @@ Selected - %1$s is produced by @fork-maintainers. + %1$s is produced by Mozilla. @@ -181,6 +177,11 @@ Customise reader view + + Add + + Edit + Unable to connect. Unrecognisable URL scheme. @@ -970,6 +971,10 @@ All actions Recently used + + Signed in as %1$s + + Sign in to synchronise Sign in to Sync @@ -1159,9 +1164,6 @@ Welcome to %s! Already have an account? - - Get to know %s See what’s new Get answers here - - Start synchronising bookmarks, passwords, and more with your Firefox account. + + Synchronise Firefox between devices - Learn more + Bring bookmarks, history, and passwords to Firefox on this device. @@ -1181,8 +1183,8 @@ Yes, sign me in Signing in… - - Sign in to Firefox + + Sign up Stay signed out @@ -1190,26 +1192,23 @@ Failed to sign-in - Automatic privacy - - Privacy and security settings block trackers, malware, and companies that follow you. + Always-on privacy + + Firefox automatically stops companies from secretly following you around the web. Standard (default) - Blocks fewer trackers. Pages will load normally. + Balanced for privacy and performance. Pages load normally. Strict (recommended) Strict - Blocks more trackers, ads, and popups. Pages load faster, but some functionality might not work. - - Take a position + Blocks more trackers so pages load faster, but some on-page functionally may break. + + Pick your toolbar placement - Try one-handed browsing with the bottom toolbar or move it to the top. + Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. Browse privately Your privacy + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> We’ve designed %s to give you control over what you share online and what you share with us. Read our privacy notice @@ -1237,7 +1236,7 @@ Choose your theme - Save some battery and your eyesight by enabling dark mode. + Save some battery and your eyesight with dark mode. Automatic @@ -1292,13 +1291,13 @@ Standard (default) - Blocks fewer trackers. Pages will load normally. + Balanced for privacy and performance. Pages load normally. What’s blocked by standard tracking protection Strict - Blocks more trackers, ads, and popups. Pages load faster, but some functionality might not work. + Blocks more trackers so pages load faster, but some on-page functionality may break. What’s blocked by strict tracking protection @@ -1533,6 +1532,37 @@ Sort logins menu + + + Credit cards + + Save and autofill cards + + Data is encrypted + + Synchronise cards across devices + + Add credit card + + + Add card + + Card Number + + Expiration Date + + Name on Card + + Card Nickname + + Delete card + + Save + + Save + + Cancel + Add search engine diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 13986308f..f0bde9b86 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -179,6 +179,8 @@ Aspekto + + Personecigi legilan vidon Konekto neebla. Nerekonita skemo de URL. @@ -215,6 +217,11 @@ Pli da informo + + Serĉi %s + + Serĉi rekte el la adresa strio + Malfermi novan langeton de Firefox @@ -892,6 +899,8 @@ Malŝaltita Permesi sonon kaj videon + + Permesi sonon kaj videon Bloki sonon kaj videon nur dum konekto al poŝaparataj retoj diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 01f219fe1..f7a76fe30 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -20,10 +20,6 @@ Sus pestañas privadas se van a mostrar aquí. - - Baidu - - JD 1 abrir pestaña. Tocá para cambiar de pestaña. @@ -53,7 +49,7 @@ Seleccionadas - %1$s es producido por @fork-maintainers. + %1$s es producido por Mozilla. @@ -185,6 +181,11 @@ Personalizar vista de lectura + + Agregar + + Editar + No se puede conectar. Esquema de URL irreconocible. @@ -994,6 +995,10 @@ Todas las acciones Usado recientemente + + Iniciaste sesión como %1$s + + Iniciá sesión para sincronizar Iniciar sesión en Sync @@ -1185,9 +1190,6 @@ ¡Bienvenido a %s! ¿Ya tenés una cuenta? - - Conocé %s Mirá las novedades Las respuestas están aquí - - Empezá a sincronizar marcadores, contraseñas y más con tu Cuenta de Firefox. + + Sincronizar Firefox entre dispositivos - Conocer más + Traer marcadores, historial y contraseñas a Firefox a este dispositivo. @@ -1207,8 +1209,8 @@ Sí, iniciá mi sesión Iniciando sesión… - - Iniciar sesión en Firefox + + Registrate Mantenete desconectado @@ -1216,26 +1218,23 @@ Falló el inicio de sesión - Privacidad automática - - La configuración de privacidad y seguridad bloquea los rastreadores, los programas malignos y las compañías que te siguen. + Privacidad siempre activada + + Firefox impide automáticamente que las compañías te sigan en secreto por la web. Estándar (predeterminado) - Bloquea menos rastreadores. Las páginas se van a cargar normalmente. + Equilibrado para protección y rendimiento. Las páginas se van a cargar normalmente. Estricta (recomendada) Estricta - Bloquea más rastreadores, anuncios y ventanas emergentes. Las páginas se cargan más rápido, pero podés perder cierta funcionalidad. - - Tomá una posición + Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. + + Elegí la ubicación de la barra de herramientas - Probá la navegación con una sola mano con la barra de herramientas inferior o movela hacia arriba. + Poné la barra de herramientas a tu alcance. Mantenela abajo, o movela hacia arriba. Navegá en privado + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Diseñamos %s para que puedas controlar lo que compartís en línea y lo que compartís con nosotros. Leé nuestra política de privacidad @@ -1265,7 +1264,7 @@ Elegí tu tema - Ahorrá un poco de batería y protegé tu vista: habilitá el modo oscuro. + Ahorrá un poco de batería y protegé tu vista: habilitá el modo oscuro. Automático @@ -1321,13 +1320,13 @@ Estándar (predeterminado) - Bloquea menos rastreadores. Las páginas se van a cargar normalmente. + Equilibrado para privacidad y rendimiento. Las páginas se cargan normalmente. Qué es lo que está bloqueado por la protección de rastreo estándar Estricta - Bloquea más rastreadores, anuncios y ventanas emergentes. Las páginas se cargan más rápido, pero podés perder cierta funcionalidad. + Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. Qué es lo que está bloqueado por la protección de rastreo estricta @@ -1562,6 +1561,37 @@ Ordenar menú de inicio de sesión + + + Tarjetas de crédito + + Guardar y autocompletar tarjetas + + Los datos están cifrados + + Sincronizar tarjetas entre dispositivos + + Agregar tarjeta de crédito + + + Agregar tarjeta + + Número de tarjeta + + Fecha de vencimiento + + Nombre en la tarjeta + + Apodo de la tarjeta + + Eliminar tarjeta + + Guardar + + Guardar + + Cancelar + Agregar buscador diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index 55e449df7..3f432d5d7 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -179,6 +179,8 @@ Apariencia + + Personalizar la vista del lector No se puede conectar. Esquema de URL irreconocible. @@ -1538,6 +1540,18 @@ Menú para ordenar credenciales + + + Tarjetas de crédito + + Guardar y autocompletar tarjetas + + Los datos están encriptados + + Sincronizar tarjetas entre dispositivos + + Añadir tarjeta de crédito + Añadir motor de búsqueda diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 41c69bdc0..f32b5c700 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -22,10 +22,6 @@ Tus pestañas privadas se mostrarán aquí. - - Baidu - - JD 1 pestaña abierta. Toca para cambiar de pestaña. @@ -56,7 +52,7 @@ Seleccionada - %1$s es producido por @fork-maintainers. + %1$s es producido por Mozilla. @@ -186,6 +182,11 @@ Personalizar vista de lectura + + Añadir + + Editar + No se puede conectar. Esquema de URL irreconocible. @@ -1200,9 +1201,6 @@ ¿Ya tienes una cuenta? - - Conoce a %s Ver las novedades Obtén respuestas aquí - - Empieza a sincronizar marcadores, contraseñas y más con tu cuenta de Firefox. + + Sincronizar Firefox entre dispositivos - Saber más + Traer marcadores, historial y contraseñas a Firefox en este dispositivo. @@ -1222,8 +1220,8 @@ Sí, iniciar sesión Iniciando sesión… - - Iniciar sesión en Firefox + + Registrarse Mantenerme desconectado @@ -1231,26 +1229,23 @@ Error al iniciar sesión - Privacidad automática - - La configuración de privacidad y seguridad bloquea los rastreadores, los programas maliciosos y las compañías que te siguen. + Privacidad siempre activada + + Firefox bloquea automáticamente a las compañías que te siguen en secreto por la web. Estándar (predeterminado) - Bloquea menos rastreadores. Las páginas se cargarán con normalidad. + Equilibrado para privacidad y rendimiento. Las páginas se cargarán normalmente. Estricta (recomendada) Estricto - Bloquea más rastreadores, anuncios y ventanas emergentes. Las páginas se cargan más rápido, pero se puede perder cierta funcionalidad. - - Toma una posición + Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. + + Escoge la posición de la barra de herramientas - Prueba la navegación con una sola mano con la barra de herramientas inferior o muévela a la parte superior. + Pon la barra de herramientas a tu alcance. Mantenla abajo, o muévela hacia arriba. Navega de forma privada Tu privacidad + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. Lee nuestro aviso de privacidad @@ -1278,7 +1273,7 @@ Elige tu tema - Ahorra un poco de batería y descansa la vista activando el modo oscuro. + Ahorra un poco de batería y descansa la vista con el modo oscuro. Automático @@ -1334,13 +1329,13 @@ Estándar (predeterminado) - Bloquea menos rastreadores. Las páginas se cargarán con normalidad. + Equilibrado para privacidad y rendimiento. Las páginas se cargarán normalmente. Qué es lo que está bloqueado por la protección estándar contra el rastreo Estricto - Bloquea más rastreadores, anuncios y ventanas emergentes. Las páginas se cargan más rápido, pero se puede perder cierta funcionalidad. + Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. Qué es lo que está bloqueado por la protección estricta contra el rastreo @@ -1578,6 +1573,38 @@ Ordenar menú de inicio de sesión + + + Tarjetas de crédito + + Guardar y autocompletar tarjetas + + Los datos están cifrados + + + Sincronizar tarjetas entre dispositivos + + Añadir tarjeta de crédito + + + Añadir tarjeta + + Número de tarjeta + + Fecha de caducidad + + Nombre en la tarjeta + + Descripción de la tarjeta + + Eliminar tarjeta + + Guardar + + Guardar + + Cancelar + Añadir buscador diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 4529d97c8..b44aff9e5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -187,6 +187,8 @@ Apariencia + + Personalizar vista de lectura No se puede conectar. Esquema de URL irreconocible. @@ -227,6 +229,9 @@ Buscar %1$s + + Busca directamente desde la barra de direcciones + Abrir una nueva pestaña de Firefox diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 7dd70b032..0c88ba6aa 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -1557,6 +1557,18 @@ Ordenatu saio-hasieren menua + + + Kreditu-txartelak + + Gorde eta osatu automatikoki kreditu-txartelak + + Datuak zifratuta daude + + Sinkronizatu txartelak gailuen artean + + Gehitu kreditu-txartela + Gehitu bilaketa-motorra diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 2fd2f384c..b156328d1 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -21,10 +21,6 @@ Yksityiset välilehdet näkyvät tässä. - - Baidu - - JD 1 avoin välilehti. Napauta vaihtaaksesi. @@ -54,7 +50,7 @@ Valittu - %1$s on @fork-maintainersn tuote. + %1$s on Mozillan tuote. @@ -185,6 +181,12 @@ Mukauta lukunäkymää + + + Lisää + + Muokkaa + Yhteyden muodostaminen epäonnistui. URL-skeeman tunnistaminen ei onnistu. @@ -222,6 +224,11 @@ Lue lisää + + Hae hakukoneella %s + + Hae suoraan osoitepalkista + Avaa uusi Firefox-välilehti @@ -980,6 +987,10 @@ Kaikki toiminnot Äskettäin käytetty + + Kirjautuneena tilillä %1$s + + Kirjaudu Sync-palveluun Kirjaudu sisään Synciin @@ -1176,9 +1187,6 @@ Tervetuloa %siin! Onko sinulla jo tili? - - Opi tuntemaan %s Katso, mikä on uutta Vastauksia on tarjolla täällä - - Aloita kirjanmerkkien, salasanojen ja paljon muun synkronointi Firefox-tilillä. + + Synkronoi Firefox laitteidesi välillä - Lue lisää + Tuo kirjanmerkit, historia ja salasanat Firefoxiin tässä laitteessa. @@ -1198,8 +1206,8 @@ Kyllä, kirjaa minut sisään Kirjaudutaan sisään… - - Kirjaudu sisään Firefoxiin + + Rekisteröidy Pysy uloskirjautuneena @@ -1207,26 +1215,21 @@ Sisäänkirjautuminen epäonnistui - Automaattinen yksityisyys - - Tietosuoja- ja suojausasetukset estävät seuraimia, haittaohjelmia ja sinua seuraavia yrityksiä. + Yksityisyys aina päällä + + Firefox estää automaattisesti yrityksiä seuraamasta sinua salaa ympäri verkkoa. Tavallinen (oletus) - Estää vähemmän seuraimia. Sivut latautuvat normaalisti. + Tasapainotettu yksityisyyden ja suorituskyvyn välillä. Sivut latautuvat normaalisti. Tiukka (suositeltu) Tiukka - - Estää enemmän seuraimia, mainoksia ja ponnahdusikkunoita. Sivut latautuvat nopeammin, mutta osa toiminnoista ei välttämättä toimi. - - Valitse puolesi + + Valitse työkalupalkin sijoitus - Kokeile selaamista yhdellä kädellä pitämällä työkalupalkki alhaalla tai siirrä se ylös. + Sijoita työkalupalkki helposti ulottuville. Pidä se alhaalla tai siirrä se ylös. Selaa yksityisesti Yksityisyytesi + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Olemme suunnitelleet %sin siten, että voit hallita mitä jaat verkossa ja mitä jaat kanssamme. Lue yksityisyyskäytäntömme @@ -1254,7 +1257,7 @@ Valitse teema - Säästä hieman akkua ja silmiäsi ottamalla tumma tila käyttöön. + Säästä hieman akkua ja silmiäsi ottamalla tumma tila käyttöön. Automaattinen @@ -1310,13 +1313,13 @@ Tavallinen (oletus) - Estää vähemmän seuraimia. Sivut latautuvat normaalisti. + Tasapainotettu yksityisyyden ja suorituskyvyn välillä. Sivut latautuvat normaalisti. Mitä tavallinen seurannan suojaus estää Tiukka - Estää enemmän seuraimia, mainoksia ja ponnahdusikkunoita. Sivut latautuvat nopeammin, mutta osa toiminnoista ei välttämättä toimi. + Estää enemmän seuraimia, joten sivut latautuvat nopeammin, mutta jotkin sivujen toiminnot saattavat rikkoutua. Mitä tiukka seurannan suojaus estää @@ -1553,6 +1556,37 @@ Järjestä kirjautumistietojen valikko + + + Luottokortit + + Tallenna ja täytä kortit automaattisesti + + Tiedot on salattu + + Synkronoi kortit laitteiden välillä + + Lisää luottokortti + + + Lisää kortti + + Kortin numero + + Vanhenemispäivä + + Nimi kortissa + + Kortin kutsumanimi + + Poista kortti + + Tallenna + + Tallenna + + Peruuta + Lisää hakukone diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c8ed1d932..5543359c7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -22,10 +22,6 @@ Les onglets privés sont affichés ici. - - Baidu - - JD 1 onglet ouvert. Appuyez pour changer d’onglet. @@ -55,7 +51,7 @@ Sélectionné - %1$s est réalisé par @fork-maintainers. + %1$s est réalisé par Mozilla. @@ -185,6 +181,11 @@ Personnaliser le mode lecture + + Ajouter + + Modifier + Impossible de se connecter. Schéma d’URL inconnu. @@ -1200,9 +1201,6 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Bienvenue dans %s ! Vous avez déjà un compte ? - - Découvrez %s Nouveautés Trouvez des réponses ici - - Synchronisez les marque-pages, mots de passe et plus encore avec votre compte Firefox. + + Synchronisez Firefox entre vos appareils - En savoir plus + Importez vos marque-pages, votre historique et vos mots de passe dans Firefox sur cet appareil. @@ -1223,9 +1221,9 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Oui, connectez-moi Connexion en cours… - - Connectez-vous à votre compte Firefox + + Se connecter Rester déconnecté·e @@ -1233,26 +1231,23 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Échec de connexion - Respect automatique de la vie privée - - Les paramètres de confidentialité et de sécurité bloquent les traqueurs, les logiciels malveillants et les entreprises qui vous pistent. + Confidentialité toujours assurée + + Firefox empêche automatiquement les entreprises de vous suivre secrètement sur le Web. Standard (par défaut) - Bloque moins de traqueurs. Les pages se chargent normalement. + Équilibré entre protection et performances. Les pages se chargent normalement. Strict (recommandé) Strict - Bloque davantage de traqueurs, de publicités et de popups. Les pages se chargent plus rapidement, mais certaines fonctionnalités pourraient ne pas être opérantes. - - Prenez position + Bloque davantage de traqueurs, accélérant le chargement des pages, mais quelques dysfonctionnements peuvent s’ensuivre. + + Choisissez l’emplacement de votre barre d’outils - Essayez la navigation à une main avec la barre d’outils inférieure ou déplacez-la vers le haut. + Placez la barre d’outils à portée de main. Laissez-la en bas ou déplacez-la en haut. Navigation privée Votre vie privée + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Nous avons conçu %s pour vous donner le contrôle de ce que vous partagez en ligne et de ce que vous partagez avec nous. Consulter notre politique de confidentialité @@ -1280,7 +1275,7 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Choisissez votre thème - Économisez de la batterie et votre vue en activant le mode sombre. + Économisez la batterie et votre vue grâce au mode sombre. Automatique @@ -1335,13 +1330,13 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Standard (par défaut) - Bloque moins de traqueurs. Les pages se chargent normalement. + Équilibré entre protection et performances. Les pages se chargent normalement. Ce qui est bloqué par la protection standard contre le pistage Stricte - Bloque davantage de traqueurs, de publicités et de popups. Les pages se chargent plus rapidement, mais certaines fonctionnalités pourraient ne pas être opérantes. + Bloque davantage de traqueurs, accélérant le chargement des pages, mais quelques dysfonctionnements peuvent s’ensuivre. Ce qui est bloqué par la protection stricte contre le pistage @@ -1576,6 +1571,37 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Menu de tri des identifiants + + + Cartes de paiement + + Enregistrer et remplir automatiquement les cartes + + Les données sont chiffrées + + Synchroniser les cartes entre vos appareils + + Ajouter une carte de paiement + + + Ajouter une carte + + Numéro de carte + + Date d’expiration + + Nom du titulaire + + Nom de cette carte + + Supprimer la carte + + Enregistrer + + Enregistrer + + Annuler + Ajouter un moteur de recherche diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 928a8da77..a96cab8ee 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -1542,6 +1542,18 @@ Menu Oanmeldingen sortearje + + + Creditcards + + Kaarten bewarje en automatysk ynfolje + + Gegevens binne fersifere + + Kaarten syngronisearje tusken apparaten + + Creditcard tafoegje + Sykmasine tafoegje diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 875f0fe2a..a1fb66b33 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -177,6 +177,8 @@ Abrir cunha aplicación Aparencia + + Personalizar da vista de lectura Non foi posíbel conectar. Non se recoñece este esquema de URL. @@ -214,6 +216,11 @@ Máis información + + Buscar %s + + Busca directamente desde a barra de enderezos + Abrir unha nova lapela de Firefox diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index f4f1a7c0a..fb8261c77 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -21,10 +21,6 @@ Ne rendaykekuéra ñemiguáva ojehecháta ápe. - - Baidu - - JD 1 embojuruja tendayke. Eikutu emoambue hag̃ua tendayke. @@ -54,7 +50,7 @@ Poravopyre - %1$s ojapókuri @fork-maintainers. + %1$s ojapókuri Mozilla. @@ -186,6 +182,11 @@ Emboava moñe’ẽhára rechaha + + Mbojuaju + + Mbosako’i + Ndaikatúi eike. URL reko ojekuaa’ỹva. @@ -992,6 +993,10 @@ Opaite tembiaporã Ojepururamovéva + + Eike %1$s-ramo + + Eike embojuehe hag̃ua Eñepyrũ tembiapo Sync-pe @@ -1187,9 +1192,6 @@ ¡Eg̃uahẽporãite %s-pe! ¿Eguerekóma peteĩ mba’ete? - - Ehecha %s Ema’ẽ mba’epyahúre Umi ñembohovái oĩ ápe - - Embojuehe techaukaha, ñe’ẽñemi ha hetave ne mba’ete Firefox pegua ndive. - - Eikuaave @@ -1209,8 +1207,8 @@ Héẽ, eñepyrũ tembiapo Eñepyrũhína tembiapo… - - Eñepyrũ tembiapo Firefox-pe + + Eñemboheraguapy Aiméta juaju’ỹre @@ -1218,26 +1216,13 @@ Tembiapo ñepyrũ ojavy - Ñemigua ijeheguíva - - Ñemboheko ñemigua ha tekorosã ojoko tapykuehoha, rembiaporapevai ha atyguasu nderapykuehóva. + Tekoñemi hendymeme Ypyguaite (ijypygua) - - Ojoko’ive tapykuehohápe. Umi kuatiarogue henyhẽporãta. Mbaretépe (jeroviaháva) Mbaretépe - - Ojokove tapykuehoha, ñemurã ha ovetã apysẽ. Kuatiarogue henyhẽpya’evéta, hákatu tembiapoite sa’ivekuaa. - - Ejapyhy nerendaite - - Eipuru kundahára nde po peteĩme tembipuru renda karapevegua térã ehupi yvate. Eikundaha ñemi + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Rojapo %s eñangareko hag̃ua emoherakuãva ñandutípe rehe ha emoherakuãva orendive avei. Emoñe’ẽ ore marandu’i ñemigua @@ -1265,8 +1250,6 @@ Eiporavo ne téma - - Eipuruporã batería ha emo’ã nde resa: embojuruja ayvu ypytũ. ijeheguietéva @@ -1322,14 +1305,10 @@ Ypyguaite (ijypygua) - - Ojoko’ive tapykuehohápe. Umi kuatiarogue henyhẽporãta. Mba’e umi ojokóva tapykuehoha moãha ypyguáva renondépe Mbaretépe - - Ojokove tapykuehoha, ñemurã ha ovetã apysẽ. Kuatiarogue henyhẽpya’evéta, hákatu tembiapoite sa’ivekuaa. Mba’e umi ojokóva tapykuehoha mo’ãha imbaretéva @@ -1572,6 +1551,30 @@ Emoĩporã poravorã tembiapo ñepyrũgua + + + Kuatia’atã ñemurã + + Eñongatu ha emyanyhẽ kuatia’atã + + + Mba’ekuaarã ipapapypa + + Embojuehe kuatia’atã mba’e’oka pa’ũme + + Embojuaju kuatia’atã ñemurã + + + Embojuaju kuatia’atã + + Kuatia’atã papy + + Ñongatu + + Ñongatu + + Heja + Embojuaju hekaha diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index b3c1d73b7..9218f5bb1 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -20,10 +20,6 @@ Ovdje će se prikazati tvoje privatne kartice. - - Baidu - - JD 1 otvorena kartica. Dodirni za prebacivanje kartica. @@ -54,7 +50,7 @@ Odabrano - %1$s proizvodi @fork-maintainers. + %1$s proizvodi Mozilla. @@ -181,6 +177,11 @@ Prilagodi prikaz za čitanje + + Dodaj + + Uredi + Nije se moguće povezati. Neprepoznatljiva URL shema. @@ -981,6 +982,10 @@ Sve radnje Nedavno korišteni + + Prijavljeni kao %1$s + + Prijavi se za sinkronizaciju Prijavi se za sinkronizaciju @@ -1172,9 +1177,6 @@ Dobro došao, dobro došla u %s! Već imaš račun? - - Upoznaj %s Pogledaj što je novo Potraži odgovore ovdje - - Počni sinkronizirati zabilješke, lozinke i ostalo sa svojim Firefox računom. + + Sinkroniziraj Firefox između uređaja - Saznaj više + Prenesi zabilješke, povijest i lozinke u Firefox na ovom uređaju. @@ -1194,8 +1196,8 @@ Da, prijavi me Prijava … - - Prijavi se na Firefox + + Registriraj se Ostani odjavljen/a @@ -1204,26 +1206,23 @@ Neuspjela prijava - Automatska privatnost - - Postavke za privatnost i sigurnost blokiraju softver za praćenje, zlonamjerni softver i tvrtke koje te prate. + Uvijek uključena privatnost + + Firefox automatski sprječava tvrtke da te potajno prate širom weba. Standardno (zadano) - Blokira manje softvera za praćenje. Stranice se učitavaju normalno. + Uravnotežena privatnost i performanse. Stranice se normalno učitavaju. Strogo (preporučeno) Strogo - Blokira više softvera za praćenje, oglasa i skočnih prozora. Stranice se brže učitavaju, ali neke značajke možda neće raditi. - - Odluči se + Blokira više programa za praćenje pa se stranice učitavaju brže, ali neke funkcionalnosti stranica možda će se slomiti. + + Odaberi položaj alatne trake - Pokušaj pregledavati jednom rukom s donjom alatnom trakom ili je pomakni na vrh. + Stavi alatnu traku na dohvat ruke. Zadrži ju na dnu ili premjesti na vrh. Pregledaj privatno + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s smo stvorili za jednostavno upravljanje podacima koje dijeliš na mreži i koje dijeliš s nama. Pročitaj naša pravila privatnosti @@ -1251,9 +1250,9 @@ Odaberi modus - - Štedi energiju i zaštiti oči pomoću tamne teme. + + Štedi bateriju i zaštiti oči pomoću tamne teme. Automatski @@ -1308,13 +1307,13 @@ Standardno (zadano) - Blokira manje softvera za praćenje. Stranice se učitavaju normalno. + Uravnotežena privatnost i performanse. Stranice se normalno učitavaju. Što se blokira standardnom zaštitom od praćenja Strogo - Blokira više softvera za praćenje, oglasa i skočnih prozora. Stranice se brže učitavaju, ali neke značajke možda neće raditi. + Blokira više programa za praćenje pa se stranice učitavaju brže, ali neke funkcionalnosti stranica možda će se slomiti. Što se blokira strogom zaštitom od praćenja @@ -1554,6 +1553,37 @@ Izbornik sortiranja prijava + + + Kreditne kartice + + Spremi i automatski ispuni polja kartice + + Podaci su šifrirani + + Sinkroniziraj kartice na uređajima + + Dodaj kreditnu karticu + + + Dodaj karticu + + Broj kartice + + Datum valjanosti + + Ime na kartici + + Naziv kartice + + Izbriši karticu + + Spremi + + Spremi + + Odustani + Dodaj tražilicu diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index b64c370ca..48f3776b4 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -19,10 +19,6 @@ Waše priwatne rajtarki so tu wočinja. - - Baidu - - JD Wočinjene rajtarki: %1$s. Podótkńće so, zo byšće rajtarki přepinał. @@ -52,7 +48,7 @@ Wubrany - %1$s so přez @fork-maintainers zhotowja. + %1$s so přez Mozilla zhotowja. @@ -70,9 +66,9 @@ - Přidajće skrótšenku, zo byšće priwatne rajtarki ze swojeje startoweje wobrazowki wočinił. + Přidajće zwjazanje, zo byšće priwatne rajtarki ze swojeje startoweje wobrazowki wočinił. - Skrótšenku přidać + Zwjazanje přidać Ně, dźakuju so @@ -183,6 +179,11 @@ Čitanski napohlad přiměrić + + Přidać + + Wobdźěłać + Zwisk móžny njeje. Njespóznawajomna URL-šema. @@ -285,7 +286,7 @@ Jeli dowolene, budu priwatne rajtarki tež widźomne, hdyž wjacore nałoženja su wočinjene - Skrótšenku za priwatny modus přidać + Zwjazanje za priwatny modus přidać Bjezbarjernosć @@ -331,7 +332,7 @@ Pytanske namjety pokazać - Hłosowe pytanje pokazać + Rěčenske pytanje pokazać W priwatnych posedźenjach pokazać @@ -977,6 +978,10 @@ Wšě akcije Njedawno wužite + + Přizjewjeny jako %1$s + + Pola Sync přizjewić Pola Sync přizjewić @@ -1035,7 +1040,7 @@ Pokazać - Woblubowanym sydłam přidate! + Wažnym sydłam přidate! Priwatny rajtark je so začinił @@ -1169,9 +1174,6 @@ Maće hižo konto? - - %s zeznać Čitajće, štož je nowe Tu dóstanjeće wotmołwy - - Synchronizujće nětko zapołožki, hesła a wjace ze swojim kontom Firefox. + + Firefox mjez gratami synchronizować - Dalše informacije + Přinjesće zapołožki, historiju a hesła k Firefox na tutym graće. @@ -1191,8 +1193,8 @@ Haj, přizjewić Přizjewja so… - - Pola Firefox přizjewić + + Registrować Wotzjewjeny wostać @@ -1200,26 +1202,23 @@ Přizjewjenje njeje so poradźiło - Awtomatiska priwatnosć - - Nastajenja priwatnosće a wěstoty přesćěhowaki, škódnu softwaru a předewzaća blokuja, kotrež wam slěduja. + Priwatnosć přeco aktiwna + + Firefox awtomatisce zadźěwa tomu, zo předewzaća wam skradźu po webje slěduja. Standard - Blokuje mjenje přesćěhowakow. Strony so normalnje začitaja. + Wuwaženy za priwatnosć a wukon. Strony so normalnje začitaja. Striktny (doporučeny) Striktny - Blokuje wjace přesćěhowakow, wabjenja a wuskakowacych woknow. Strony so spěšnišo začitaja, ale někotre funkcije snano njefunguja. - - Rozsudźće so + Blokuje dalše přesćěhowaki, zo bychu so strony spěšnišo začitali, ale někotre strony snano korektnje njefunguja. + + Wubjerće poziciju za swoju symbolowu lajstu - Spytajće z delnjej symbolowej lajstu z jednej ruku přehladować abo přesuńće ju horje. + Pozicioněrujće symbolowu lajstu, zo móžeće ju lochko dosahnyć. Wobchowajće ju deleka abo přesuńće ju horje. Priwatnje přehladować Waša priwatnosć + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Sym %s wuwili, zo bychmy wam kontrolu wo tym dali, što online dźěliće a što z nami. Čitajće naš zdźělenku priwatnosće @@ -1247,7 +1246,7 @@ Wubjerće swoju drastu - Zmóžńće ćmowy modus, zo byšće swoju bateriju a swoje woči šonował. + Zmóžńće ćmowy modus, zo byšće swoju bateriju a swoje woči šonował. Awtomatiski @@ -1303,13 +1302,13 @@ Standard - Blokuje mjenje přesćěhowakow. Strony so normalnje začitaja. + Wuwaženy za priwatnosć a wukon. Strony so normalnje začitaja. Što so přez standardny slědowanski škit blokuje? Striktny - Blokuje wjace přesćěhowakow, wabjenja a wuskakowacych woknow. Strony so spěšnišo začitaja, ale někotre funkcije snano njefunguja. + Blokuje dalše přesćěhowaki, zo bych so strony spěšnišo začitali, ale někotre strony snano korektnje njefunguja. Što so přez striktny slědowanski škit blokuje? @@ -1433,7 +1432,7 @@ Dale k websydłu - Mjeno skrótšenki + Mjeno zwjazanja Móžeće startowej wobrazowce swojeho grata tute websydło lochko přidać, zo byšće direktny přistup měł a spěšnišo z dožiwjenjom nałoženja přehladował. @@ -1546,6 +1545,37 @@ Meni přizjewjenskich datow sortěrować + + + Kreditne karty + + Karty składować a awtomatisce wupjelnić + + Daty su zaklučowane + + Karty přez graty synchronizować + + Kreditnu kartu přidać + + + Kartu přidać + + Kartowe čisło + + Datum płaćiwosće + + Mjeno na karće + + Kartowe přimjeno + + Kartu zhašeć + + Składować + + Składować + + Přetorhnyć + Pytawu přidać @@ -1632,7 +1662,7 @@ Chceće woprawdźe tutu zapołožku zhašeć? - Woblubowanym sydłam přidać + Wažnym sydłam přidać Přepruwowany wot: %1$s @@ -1661,7 +1691,7 @@ Hesło trěbne - Hłosowe pytanje + Rěčenske pytanje Nětko rěčeć @@ -1694,7 +1724,7 @@ W porjadku, sym zrozumił - Najhusćišo wopytowane sydła pokazać + Najhusćišo wopytane sydła pokazać Mjeno diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6470877a1..51600037a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -20,10 +20,6 @@ A privát lapjai itt fognak megjelenni. - - Baidu - - JD 1 nyitott lap. Koppintson a lapváltáshoz. @@ -53,7 +49,7 @@ Kiválasztva - A %1$s a @fork-maintainers terméke. + A %1$s a Mozilla terméke. @@ -184,6 +180,11 @@ Olvasó nézet testreszabása + + Hozzáadás + + Szerkesztés + Nem tud csatlakozni. Felismerhetetlen URL-séma. @@ -1176,9 +1177,6 @@ Üdvözli a %s! Van felhasználói fiókja? - - Ismerje meg a %s böngészőt Nézze meg az újdonságokat Itt kaphat válaszokat - - Kezdje el szinkronizálni a könyvjelzőit, jelszavait és még többet a Firefox-fiókjával. + + A Firefox szinkronizálása az eszközök közt - További tudnivalók + Adjon hozzá könyvjelzőket, előzményeket és jelszavakat a Firefoxhoz ezen az eszközön. @@ -1198,8 +1196,8 @@ Igen, jelentkeztessen be Bejelentkezés… - - Bejelentkezés a Firefoxba + + Regisztráció Maradjon kijelentkezve @@ -1207,26 +1205,23 @@ Sikertelen bejelentkezés - Automatikus adatvédelem - - Az adatvédelmi és biztonsági beállítások blokkolják a követőket, kártékony programokat és az Önt követő vállalatokat. + Mindig bekapcsolt adatvédelem + + A Firefox automatikusan megakadályozza, hogy a cégek titokban kövessék Önt a weben. Normál (alapértelmezett) - Kevesebb nyomkövetőt blokkol. Az oldalak normálisan lesznek betöltve. + Kiegyensúlyozott adatvédelem és teljesítmény. Az oldalak normálisan fognak betölteni. Szigorú (ajánlott) Szigorú - Több nyomkövetőt, reklámot és felugró ablakot blokkol. Az oldalak gyorsabban töltődnek be, de egyes funkciók lehet, hogy nem fognak működni. - - Foglaljon állást + Több nyomkövetőt blokkol, így az oldalak gyorsabban töltenek be, de egyes oldalfunkciók meghibásodhatnak. + + Válassza ki az eszköztár elhelyezését - Próbálja ki az egykezes böngészést a lenti eszköztárral, vagy mozgassa fentre. + Helyezze az eszköztárat könnyen elérhető helyre. Tartsa az alján, vagy mozgassa a tetejére. Böngésszen privát módon Adatvédelem + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Úgy terveztük a %s böngészőt, hogy irányítást adjunk afelett, hogy mit oszt meg online, és mit oszt meg velünk. @@ -1255,7 +1250,7 @@ Válassza ki a témát - Spóroljon az akkumulátorral és kímélje a szemét a sötét mód bekapcsolásával. + Spóroljon az akkumulátorral és kímélje a szemét a sötét móddal. Automatikus @@ -1312,13 +1307,13 @@ Normál (alapértelmezett) - Kevesebb nyomkövetőt blokkol. Az oldalak normálisan lesznek betöltve. + Kiegyensúlyozott adatvédelem és teljesítmény. Az oldalak normálisan fognak betölteni. Mit blokkol a szokásos követésvédelem Szigorú - Több nyomkövetőt, reklámot és felugró ablakot blokkol. Az oldalak gyorsabban töltődnek be, de egyes funkciók lehet, hogy nem fognak működni. + Több nyomkövetőt blokkol, így az oldalak gyorsabban töltenek be, de egyes oldalfunkciók meghibásodhatnak. Mit blokkol a szigorú követésvédelem @@ -1554,6 +1549,37 @@ Bejelentkezések menü rendezése + + + Bankkártyák + + Kártyák mentése és automatikus kitöltése + + Az adatok titkosítottak + + Kártyák szinkronizálása az eszközök közt + + Bankkártya hozzáadása + + + Kártya hozzáadása + + Kártyaszám + + Lejárati dátum + + Kártyán szereplő név + + Kártya beceneve + + Kártya törlése + + Mentés + + Mentés + + Mégse + Keresőszolgáltatás hozzáadása diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index a0a291e3b..1998ab469 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -20,10 +20,6 @@ Ձեր գաղտնի ներդիրները կցուցադրվեն այստեղ: - - Baidu - - JD 1 բաց ներդիր: Հպեք՝ փոխարկելու համար: @@ -97,7 +93,7 @@ Բաց թողնել - Փոխել բաց ներդիրների դասավորությունը: Գնացեք կարգավորումներ և ընտրեք ցանցը՝ ներդիրի տեսքի ներքո: + Փոխեք բացված ներդիրների դասավորությունը: Գնացեք կարգավորումներ և ընտրեք Ցանց՝ ներդիրի տեսքի ներքո: Անցնել Կարգավորումներին @@ -130,6 +126,8 @@ Խմբագրել Էջանիշը Հավելումներ + + Ընդլայնումներ Հավելումներ չկան @@ -179,6 +177,13 @@ Տեսք + + Հարմարեցնել ընթերցման դիտումը + + Ավելացնել + + Խմբագրել + Հնարավոր չէ կապակցվել: Անճանաչելի URL ուրվակազմ: @@ -215,6 +220,11 @@ Իմանալ ավելին + + Որոնել %s + + Որոնել ուղղակիրոեն հասցեագոտուց + Բացել Firefox-ի նոր ներդիր @@ -527,6 +537,10 @@ Այլ էջանիշեր Պատմություն + + Նոր ներդիր + + Գտնել էջում Համաժամեցված ներդիրներ @@ -879,16 +893,22 @@ Անջ. - + Թույլատրել ձայնանյութը և տեսանյութը + + Թույլատրել ձայնանյութը և տեսանյութը Արգելափակել ձայնանյութը և տեսանյութը միայն բջջային տվյալներում Ձայնանյութը և տեսանյութը կնվագարկվեն միայն Wi-Fi-ով - + Արգելափակել միայն ձայնանյութը - + + Արգելափակել միայն ձայնանյութը + Արգելափակել ձայնանյութը և տեսանյութը + + Արգելափակել ձայնանյութը և տեսանյութը Միաց. @@ -1146,9 +1166,6 @@ Բարի գալուստ %s: Արդեն ունե՞ք հաշիվ - - Ծանոթացեք %s-ին Տեսեք, թե ինչն է նոր Ստացեք պատասխանները այստեղ - - Համաժամեցրեք էջանիշերը, գաղտնաբառերը և ավելին՝ ձեր Firefox հաշվով: + + Համաժամեցնել Firefox-ը - Իմանալ ավելին + Բերեք էջանիշերը, պատմությունը և գաղտնաբառերը Firefox՝ այս սարքում: @@ -1169,8 +1186,8 @@ Այո, գրանցեք ինձ Մուտք է գործում... - - Մուտք գործեք Firefox + + Գրանցվել Մնացեք դուրս գրված @@ -1178,26 +1195,23 @@ Չհաջողվեց մուտք գործել - Ինքնաշխատ գաղտնիություն - - Գաղտնիության և անվտանգության կարգավորումները արգելափակում են հետագծումները, վնասագրերը և Ձեզ հետևող ընկերություններին: + Միշտ գաղտնիություն + + Firefox-ը ինքնաշխատ կանգնեցնում է ընկերությունների՝ հետևելու Ձեզ առցանց: Ստանդարտ (սկզբնադիր) - Արգելափակում է ավելի քիչ հետագծիչներ: Էջերը նորմալ կբեռնվեն: + Հավասարակշռված է գաղտնիության և արտադրողականության միջև: Էջերը նորմալ են բեռնվում: Խիստ (հանձնարարելի) Խիստ - Արգելափակում է ավելի շատ հետագծիչներ, գովազդ և թռուցիկներ: Էջերը բեռնում են ավելի արագ, բայց որոշ գործառույթներ կարող են չաշխատել: - - Դիրքորոշել + Արգելափակում է ավելի շատ հետագծիչներ, որ էջերը արագ բեռնվեն, բայց էջի որոշ գործույթներ կարող են ընդհատվեն: + + Ընտրեք գործիքագոտու տեղը - Փորձեք մի ձեռքով դիտարկումը գործիքագոտու ներքևում կամ այն տեղափոխեք վերև: + Գործիքագոտին դրեք հեշտ հասանելի տեղ: Պահեք այն ներքևում կամ տեղափոխեք վերև: Դիտարկել գաղտնի + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Մենք պատրաստել ենք %s-ը, որպեսզի դուք կառավարեք այն, ինչ համօգտագործում եք առցանց և թե ինչով եք կիսվում մեզ հետ: Կարդացեք մեր գաղտնիության ծանուցումը @@ -1226,7 +1240,7 @@ Ընտրեք ձեր ոճը - Խնայեք մարտկոցի լիցքը և ձեր տեսողությունը`միացնելով մուգ կերպը: + Խնայեք մարտկոցը և ձեր տեսողությունը մուգ կերպում: Ինքնաշխատ @@ -1281,14 +1295,14 @@ Ստանդարտ (սկզբնադիր) - Արգելափակում է ավելի քիչ հետագծիչներ: Էջերը նորմալ կբեռնվեն: + Հավասարակշռված է գաղտնիության և արտադրողականության միջև: Էջերը նորմալ են բեռնվում: Ինչն է արգելափակված հետագծման ստանդարտ պաշտպանությամբ Խիստ - Արգելափակում է ավելի շատ հետագծիչներ, գովազդ և թռուցիկներ: Էջերը բեռնում են ավելի արագ, բայց որոշ գործառույթներ կարող են չաշխատել: + Արգելափակում է ավելի շատ հետագծիչներ, որ էջերը արագ բեռնվեն, բայց էջի որոշ գործույթներ կարող են ընդհատվեն: Ինչն է արգելափակված խիստ հետագծման պաշտպանությամբ @@ -1525,6 +1539,36 @@ Տեսակավորել մուտագրումների ցանկը + + + Բանկային քարտեր + + Պահել և ինքնալրացնել քարտերը + + Տվյալները գաղտնագրված են + + Համաժամեցնել քարտերը սարքերի միջև + + Ավելացնել բանկային քարտ + + Ավելացնել քարտ + + Քարտի համարը + + Քարտի ժամկետը + + Քարտի վրա ձեր անունը + + Քարտի անունը + + Ջնջել քարտը + + Պահպանել + + Պահպանել + + Չեղարկել + Ավելացնել որոնիչ diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index e62ef605e..19121aa02 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -801,8 +801,6 @@ Markah berhasil disimpan! EDIT - - Edit Pilih diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4192e89a7..169677b29 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -22,10 +22,6 @@ Le schede anonime verranno mostrate qui. - - Baidu - - JD Aperta 1 scheda. Tocca per cambiare scheda. @@ -55,7 +51,7 @@ Selezionata - %1$s è sviluppato da @fork-maintainers. + %1$s è sviluppato da Mozilla. @@ -185,6 +181,11 @@ Personalizza modalità lettura + + Aggiungi + + Modifica + Connessione non riuscita. Schema URL non riconoscibile. @@ -1203,9 +1204,6 @@ Benvenuto in %s. Hai già un account? - - Alla scoperta di %s Scopri le novità Trova tutte le risposte qui - - Inizia a sincronizzare segnalibri, password e molto altro ancora con il tuo account Firefox. + + Sincronizza Firefox tra vari dispositivi - Ulteriori informazioni + Porta segnalibri, cronologia e password di Firefox su questo dispositivo. @@ -1225,8 +1223,8 @@ Sì, accedi Accesso in corso… - - Accedi a Firefox + + Registrati Rimani disconnesso @@ -1235,26 +1233,23 @@ Accesso non riuscito - Privacy predefinita - - Le impostazioni relative a privacy e sicurezza bloccano elementi traccianti, malware e aziende che seguono le tue attività online. + Privacy sempre attiva + + Firefox blocca automaticamente le società che, di nascosto, cercano di seguire le tue attività sul Web. Normale (predefinita) - Blocca meno elementi traccianti. Le pagine verranno caricate normalmente. + Equilibrio tra privacy e prestazioni. Le pagine verranno caricate normalmente. Restrittiva (consigliata) Restrittiva - Blocca più elementi traccianti, annunci pubblicitari e pop-up. Le pagine verranno caricate più velocemente, ma alcuni elementi potrebbero non funzionare correttamente. - - Prendi posizione + Blocca più elementi traccianti. Le pagine verranno caricate più velocemente, ma alcune caratteristiche della pagina potrebbero non funzionare correttamente. + + Scegli la posizione della barra degli strumenti - Prova la barra degli strumenti in basso per navigare con una sola mano, o spostala in alto. + Metti la barra degli strumenti a portata di mano. Tienila in basso o spostala in alto. Naviga in modo riservato La tua privacy + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s è progettato per darti il pieno controllo sulle informazioni che condividi online e con noi. Leggi la nostra informativa sulla privacy @@ -1282,7 +1277,7 @@ Scegli il tuo tema - Risparmia batteria e proteggi i tuoi occhi attivando la modalità scura. + Risparmia batteria e proteggi i tuoi occhi con la modalità scura. Automatico @@ -1337,13 +1332,13 @@ Normale (predefinita) - Blocca meno elementi traccianti. Le pagine verranno caricate normalmente. + Equilibrio tra privacy e prestazioni. Le pagine verranno caricate normalmente. Elementi bloccati nella protezione antitracciamento normale Restrittiva - Blocca più elementi traccianti, annunci pubblicitari e pop-up. Le pagine verranno caricate più velocemente, ma alcuni elementi potrebbero non funzionare correttamente. + Blocca più elementi traccianti. Le pagine verranno caricate più velocemente, ma alcune caratteristiche della pagina potrebbero non funzionare correttamente. Elementi bloccati nella protezione antitracciamento restrittiva @@ -1580,6 +1575,38 @@ Ordina il menu delle credenziali di accesso + + + Carte di credito + + Salvare e compilare automaticamente le carte + + I dati sono crittati + + Sincronizza le carte tra più dispositivi + + Aggiungi una carta di credito + + + Aggiungi carta + + Numero carta + + Data di scadenza + + Nome sulla carta + + + Nickname della carta + + Elimina carta + + Salva + + Salva + + Annulla + Aggiungi motore di ricerca diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index d59d78e2d..9d0818fc7 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -19,10 +19,6 @@ הלשוניות הפרטיות שלך יופיעו כאן. - - Baidu - - JD לשונית אחת פתוחה. יש להקיש כדי להחליף לשוניות. @@ -54,7 +50,7 @@ נבחר - ‏%1$s נוצר על־ידי @fork-maintainers. + ‏%1$s נוצר על־ידי Mozilla. @@ -182,6 +178,11 @@ התאמה אישית של תצוגת קריאה + + הוספה + + עריכה + לא ניתן להתחבר. מבנה הכתובת אינו ברור. @@ -975,6 +976,10 @@ כל הפעולות בשימוש לאחרונה + + מחובר בתור %1$s + + כניסה כדי לסנכרן התחברות אל Sync @@ -1168,9 +1173,6 @@ ברוכים הבאים אל %s! כבר יש לך חשבון? - - היכרות עם %s מה חדש התשובות כאן - - סנכרון סימניות, ססמאות ועוד עם חשבון ה־Firefox שלך. + + סנכרון Firefox בין מכשירים - מידע נוסף + משיכת הסימניות, ההיסטוריה והססמאות ל־Firefox במכשיר הזה. @@ -1190,8 +1192,8 @@ כן, תחברו אותי בתהליך התחברות… - - התחברות אל Firefox + + הרשמה להישאר מנותק @@ -1199,26 +1201,23 @@ ההתחברות נכשלה - פרטיות אוטומטית - - הגדרות פרטיות ואבטחה חוסמות רכיבי מעקב, תוכנות זדוניות וחברות העוקבות אחריך. + פרטיות תמיד מופעלת + + ‏Firefox מונע באופן אוטומטי מחברות לעקוב אחריך בסתר ברחבי הרשת. רגיל (ברירת מחדל) - חוסם פחות רכיבי מעקב. דפים ייטענו כרגיל. + מאוזן בין פרטיות לביצועים. דפים ייטענו כרגיל. מחמיר (מומלץ) מחמיר - חוסם יותר רכיבי מעקב, פרסומות וחלונות קופצים. דפים ייטענו מהר יותר, אך ייתכן שפונקציונליות מסוימת לא תעבוד. - - נקיטת עמדה + חוסם יותר רכיבי מעקב כדי שדפים ייטענו מהר יותר, אך ייתכן שפונקציונליות בדפים מסויימים לא תעבוד. + + בחירת מיקום סרגל הכלים שלך - אפשר להתנסות בגלישה ביד אחת עם סרגל כלים בתחתית או להעביר אותו לראש המסך. + לשים את סרגל הכלים בהישג יד. ניתן להשאיר אותו בתחתית, או להעביר אותו למעלה. גלישה בפרטיות + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> עיצבנו את %s כדי להעניק לך שליטה במה שמעניין אותך לשתף ברשת ומה שמעניין אותך לשתף איתנו. קריאת הצהרת הפרטיות שלנו @@ -1247,7 +1246,7 @@ בחירת ערכת הנושא שלך - חסכו בסוללה ושמרו על העיניים באמצעות הפעלת מצב כהה. + ניתן לחסוך בסוללה ולשמור על העיניים באמצעות הפעלת מצב כהה. אוטומטי @@ -1302,13 +1301,13 @@ רגיל (ברירת מחדל) - חוסם פחות רכיבי מעקב. דפים ייטענו כרגיל. + מאוזן בין פרטיות לביצועים. דפים ייטענו כרגיל. מה נחסם על־ידי הגנת מעקב רגילה מחמיר - חוסם יותר רכיבי מעקב, פרסומות וחלונות קופצים. דפים ייטענו מהר יותר, אך ייתכן שפונקציונליות מסוימת לא תעבוד. + חוסם יותר רכיבי מעקב כדי שדפים ייטענו מהר יותר, אך ייתכן שפונקציונליות בדפים מסויימים לא תעבוד. מה נחסם על־ידי הגנת מעקב מחמירה @@ -1545,6 +1544,37 @@ תפריט מיון כניסות + + + כרטיסי אשראי + + שמירה ומילוי אוטומטי של כרטיסים + + הנתונים מוצפנים + + סנכרון כרטיסים בין מכשירים + + הוספת כרטיס אשראי + + + הוספת כרטיס + + מספר כרטיס + + תאריך תפוגה + + שם שעל הכרטיס + + כינוי עבור הכרטיס + + מחיקת כרטיס + + שמירה + + שמירה + + ביטול + הוספת מנוע חיפוש diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 06a2c93e2..fa2a9f24a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -22,10 +22,6 @@ プライベートタブがここに表示されます。 - - Baidu - - JD 開いているタブ 1 個。タップしてタブを切り替えます。 @@ -56,7 +52,7 @@ 選択 - %1$s は @fork-maintainers の製品です。 + %1$s は Mozilla の製品です。 @@ -187,6 +183,11 @@ リーダービューをカスタマイズ + + 追加 + + 編集 + 接続できません。認識できない URL スキームです。 @@ -990,6 +991,10 @@ すべての操作 最近使用 + + %1$s としてログイン + + ログインして同期 Sync にログイン @@ -1186,9 +1191,6 @@ %s へようこそ! アカウントをお持ちですか? - - %s を知ろう 新機能の紹介 その答えはこちらにあります - - Firefox アカウントでブックマークやパスワード、他の設定を同期しましょう。 + + 端末間で Firefox を同期 - 詳細情報 + この端末の Firefox とブックマーク、履歴、パスワードを同期します @@ -1208,8 +1210,8 @@ はい、ログインします ログイン中... - - Firefox にログイン + + アカウント登録 ログアウトする @@ -1217,26 +1219,23 @@ ログインに失敗しました - 自動プライバシー保護 - - プライバシーとセキュリティの設定で、あなたを追跡するトラッカー、マルウェア、企業をブロックします。 + プライバシー重視 + + Firefox はウェブ上であなたを密かに追跡する組織を自動的に遮断します。 標準 (既定) - トラッカーのブロックを少なくします。ページが正常に読み込まれます。 + プライバシーと性能をバランスよく。ページが正しく読み込まれます。 厳格 (推奨) 厳格 - より多くのトラッカー、広告、ポップアップをブロックします。ページの読み込みが速くなりますが、一部の機能が動作しない場合があります。 - - ツールバーをお好みの配置に + より多くのトラッカーをブロックするとページの読み込みが速くなりますが、一部のページは正しく機能しなくなる可能性があります。 + + ツールバーの配置を選べます - ツールバーを下部に置いて片手での操作をお試しください。上部にも移動できます。 + ツールバーを簡単に手の届く位置に置きましょう。画面下または上に移動できます。 プライベートなブラウジング あなたのプライバシー + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s は、あなたがオンラインで共有するものと、私たちと共有するものをコントロールできるように設計されています。 個人情報保護方針を読む @@ -1264,7 +1263,7 @@ テーマを選んでください - ダークモードによって、バッテリーを節約し、目にも優しい配色にします。 + ダークモードでバッテリーを節約し、目に優しい配色にします。 自動設定 @@ -1319,13 +1318,13 @@ 標準 (既定) - トラッカーのブロックを少なくします。ページが正常に読み込まれます。 + プライバシーと性能をバランスよく。ページが正しく読み込まれます。 標準のトラッキング防止でブロックされるもの 厳格 - より多くのトラッカー、広告、ポップアップをブロックします。ページの読み込みが速くなりますが、一部の機能が動作しない場合があります。 + より多くのトラッカーをブロックするとページの読み込みが速くなりますが、一部のページは正しく機能しなくなる可能性があります。 厳格なトラッキング防止でブロックされるもの @@ -1562,6 +1561,38 @@ ログイン情報メニューの並べ替え + + + クレジットカード + + + カード情報を保存して自動入力する + + データは暗号化されています + + 端末間でカード情報を同期する + + クレジットカードを追加 + + カードの追加 + + + カード番号 + + 有効期限 + + カード名義 + + カードのニックネーム + + カードを削除 + + 保存 + + 保存 + + キャンセル + 検索エンジンの追加 diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 572aa547f..a0b13a824 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -19,10 +19,6 @@ თქვენი პირადი ჩანართები გამოჩნდება აქ. - - Baidu - - JD 1 გახსნილი ჩანართი. შეეხეთ ჩანართების გადასართველად. @@ -52,7 +48,7 @@ მონიშნულია - %1$s შემქმნელი @fork-maintainers. + %1$s შემქმნელი Mozilla. @@ -179,6 +175,11 @@ კითხვის რეჟიმის მორგება + + დამატება + + ჩასწორება + ვერ დაუკავშირდა. გაურკვეველი URL-სქემა. @@ -899,7 +900,7 @@ ხმისა და ვიდეოს შეზღუდვა, მხოლოდ ფიჭურ ინტერნეტზე - ხმისა და ვიდეოს დაშვება Wi-Fi-ზე + ხმისა და ვიდეოს დაშვება WiFi-ზე მხოლოდ ხმის შეზღუდვა @@ -1164,9 +1165,6 @@ მოგესალმებათ %s! უკვე გაქვთ ანგარიში? - - გაიცანით %s იხილეთ სიახლეები მიიღეთ პასუხები აქ - - დაიწყეთ დასინქრონება სანიშნების, პაროლებისა და სხვა მონაცემების, თქვენი Firefox-ანგარიშის მეშვეობით. + + დაასინქრონეთ Firefox მოწყობილობებს შორის - ვრცლად + გადმოიტანს სანიშნებს, ისტორიასა და პაროლებს, ამ მოწყობილობის Firefox-ზე. @@ -1186,8 +1184,8 @@ დიახ, შევალ შესვლა… - - შესვლა Firefox-ში + + ანგარიშის შექმნა შესვლის გარეშე @@ -1196,26 +1194,23 @@ შესვლა ვერ მოხერხდა - თავისთავადი პირადულობა - - პირადულობისა და უსაფრთხოების პარამეტრები უზღუდავს მეთვალყურეებს, მავნებლებს და კომპანიებს, თქვენზე თვალის დევნებას. + ყოველთვის პირადული + + Firefox ავტომატურად უზღუდავს კომპანიებს, თქვენს მოქმედებებზე ფარულად თვალის მიდევნების საშუალებას ვებსივრცეში. ჩვეულებრივი (ნაგულისხმევი) - ზღუდავს ნაკლებ მეთვალყურეს. გვერდები ჩვეულებრივ გაიხსნება. + წონასწორული უსაფრთხოებასა და წარმადობას შორის. გვერდები ჩაიტვირთება ჩვეულებრივ. მკაცრი (სასურველი) მკაცრი - ზღუდავს მეტ მეთვალყურეს, ამომხტომს, რეკლამას. გვერდები უფრო სწრაფად გაიხსნება, მაგრამ შესაძლოა, ოდნავ გაუმართავი იყოს. - - გააკეთეთ არჩევანი + ზღუდავს მეტ მეთვალყურეს, გვერდის ჩატვირთვა ასწრაფდება, თუმცა გამართულად შეიძლება ვერ იმუშაოს. + + აირჩიეთ ხელსაწყოთა ზოლის მდებარეობა - სცადეთ ცალი ხელით დათვალიერება ქვედა ხელსაწყოთა ზოლით ან გადაიტანეთ ზემოთ. + განათავსეთ ხელსაწყოები ხელმისაწვდომ ადგილას. დატოვეთ ქვემოთ ან გადაიტანეთ ზემოთ. პირადული ინტერნეტი თქვენი პირადულობა + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s შექმნილია ისე, რომ თავად წყვეტდეთ რას გააზიარებთ ინტერნეტში და რას გაგვიზიარებთ ჩვენ. გაეცანით პირადულობის განაცხადს @@ -1244,7 +1239,7 @@ შეარჩიეთ თქვენი გაფორმება - დაზოგეთ ბატარეა და საკუთარი მხედველობა, მუქი რეჟიმით. + დაზოგეთ ბატარეა და საკუთარი მხედველობა, მუქი რეჟიმით. თვითშერჩევა @@ -1300,13 +1295,13 @@ ჩვეულებრივი (ნაგულისხმევი) - ზღუდავს ნაკლებ მეთვალყურეს. გვერდები ჩვეულებრივ გაიხსნება. + წონასწორული უსაფრთხოებასა და წარმადობას შორის. გვერდები ჩაიტვირთება ჩვეულებრივ. რა იზღუდება თვალთვალისგან ჩვეულებრივი დაცვით მკაცრი - ზღუდავს მეტ მეთვალყურეს, ამომხტომს, რეკლამას. გვერდები უფრო სწრაფად გაიხსნება, მაგრამ შესაძლოა, ოდნავ გაუმართავი იყოს. + ზღუდავს მეტ მეთვალყურეს, გვერდის ჩატვირთვა ასწრაფდება, თუმცა გამართულად შეიძლება ვერ იმუშაოს. რა იზღუდება თვალთვალისგან მკაცრი დაცვით @@ -1544,6 +1539,38 @@ ანგარიშების მენიუს დალაგება + + + საკრედიტო ბარათები + + ბარათების შენახვა და თვითშევსება + + მონაცემები დაშიფრულია + + + დაასინქრონეთ ბარათები სხვადასხვა მოწყობილობაზე + + საკრედიტო ბარათის დამატება + + + ბარათის დამატება + + ბარათის ნომერი + + ვადის გასვლის თარიღი + + მფლობელის სახელი + + ბარათის ზედმეტსახელი + + ბარათის წაშლა + + შენახვა + + შენახვა + + გაუქმება + საძიებო სისტემის დამატება diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 98598bd12..98ef02e1d 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -20,10 +20,6 @@ Accaren-ik n tbaḍnit ad d-ttwaseknen dagi. - - Baidu - - JD 1 yiccer i yeldin. Sit akken ad tbeddleḍ iccer. @@ -56,7 +52,7 @@ Iţufren - %1$s d afares n @fork-maintainers. + %1$s d afares n Mozilla. @@ -185,6 +181,12 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Sagen timeẓri n tɣuri + + Rnu + + + Ẓreg + Ur izmir ara ad yeqqen. Azenziɣ n tensa URL ur yettwassen ara. @@ -1179,9 +1181,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ansuf ɣer %s! Tesεiḍ yakan amiḍan? - - Wali %s Wali amaynut Awi-d tiririyen da - - Bdu amtawi n ticraḍ, awalen uffiren, akked waṭas-nniḍen s umiḍan n Firefox. + + Mtawi Firefox gar yibenkan - Issin ugar + Awi-d ticraḍ n yisebtar, amazray, d wawalen uffiren ɣer Firefox deg yibenk-a. @@ -1201,8 +1200,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ih, qqen-iyi Tuqqna tetteddu… - - Kcem ɣer Firefox + + Jerred Qqim beṛṛa n tuqqna @@ -1210,26 +1209,13 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Tuccḍa n tuqqna - Tabaḍnit tawurmant - - Iɣewwaren n tbaḍnit d tɣellist sewḥalen imekaren, yir azeɣzan d tkebbaniyin ara ak-yeṭṭaferen. + Tabaḍnit tezga tettwaḍmen Alugan (amezwer) - - Drus n yimakaren i isewḥal. Isebtar ad d-alin s wudem amagnu. Uḥriṣ (yelha) Uḥris - - Ad isewḥel ugar n yineḍfaren, n udellel d yisfuyla udhimen. Isebtar ad d-ttalin s zzreb, maca kra n tmahilin zemrent ur teddunt ara. - - Ddem ṛṛay - - Ɛreḍ tunigin s yiwen ufus s useqdec n ufeggag n ddaw neɣ err-it d asawen. Tunigin tusligin + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Nfeṣṣel %si w akken ad nerr gar ifassen-ik·im ayen i tbeṭṭuḍ srid aked wayen tbeṭṭuḍ yid-neɣ. Ɣer tasertit-nneɣ n tbaḍnit @@ -1257,8 +1243,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Fren asentel - - Ḥreze tabatrit d wallen-ik s usermed n usentel aberkan. Awurman @@ -1313,14 +1297,10 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Issin ugar Alugan (amezwer) - - gDrus n yimakaren i isewḥal. Isebtar ad d-alin s wudem amahnu. Ayen iweḥlen s ummeten n tizeɣt mgal aḍfaṛ Uḥriṣ - - Ad isewḥel ugar n yineḍfaren, n udellel d yisfuyla udhimen. Isebtar ad d-ttalin s zzreb, maca kra n tmahilin zemrent ur teddunt ara. Ayen iweḥlen s ummeten n uḥriṣ mgal aḍfaṛ diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index a51ebc93b..7f0800f86 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -1537,6 +1537,18 @@ Логиндерді сұрыптау мәзірі + + + Несиелік карталар + + Карталарды сақтау және автотолтыру + + Деректер шифрленген + + Карталарды құрылғылар арасында синхрондау + + Несиелік картаны қосу + Іздеу жүйесін қосу diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index d7908dd91..10e034fd7 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -450,6 +450,8 @@ Performans, bikaranîn, reqalav û daneyên taybetkirinê yên têkildarî geroka te bi Mozillayê re parve dike, ji bo ku em karibin pê %1$s’ê baştir bikin Daneyên bazarkirinê + + Daneyên têkildarî taybetiyên %1$sê ku tu bi kar tînî bi Leanpluma em xizmeta bazara mobîl jê dikirin re parve dike. Lêkolîn diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 2f9430747..f2aa7372f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -22,10 +22,6 @@ 사생활 보호 탭이 여기에 표시됩니다. - - Baidu - - JD 열린 탭 1개. 탭을 전환하려면 누르세요. @@ -58,7 +54,7 @@ 선택됨 - %1$s는 @fork-maintainers에서 제작했습니다. + %1$s는 Mozilla에서 제작했습니다. @@ -192,6 +188,11 @@ 리더뷰 사용자 지정 + + 추가 + + 편집 + 연결할 수 없음. 인식할 수 없는 URL 구성표. @@ -303,7 +304,7 @@ 사용자 지정 동기화 서버 - Firefox 계정/동기화 서버가 변경되었습니다. 변경 사항을 적용하기 위해 응용 프로그램을 종료하는 중… + Firefox 계정/동기화 서버가 변경되었습니다. 변경 사항을 적용하기 위해 애플리케이션을 종료하는 중… 계정 @@ -380,7 +381,7 @@ 모음집 소유자 (사용자 ID) - 부가 기능 모음집이 변경되었습니다. 변경 사항을 적용하기 위해 응용 프로그램을 종료하는 중… + 부가 기능 모음집이 변경되었습니다. 변경 사항을 적용하기 위해 애플리케이션을 종료하는 중… @@ -548,7 +549,7 @@ 북마크 도구모음 - 다른 북마크 + 기타 북마크 기록 @@ -1010,6 +1011,10 @@ 모든 동작 최근 사용 + + %1$s(으)로 로그인됨 + + Sync에 로그인 Sync에 로그인 @@ -1212,9 +1217,6 @@ %s에 오신걸 환영합니다! 계정이 이미 있으신가요? - - %s에 대해 알기 새 기능 살펴보기 여기서 답을 얻으세요 - - Firefox 계정으로 북마크, 비밀번호 등을 동기화하세요. + + 기기 간에 Firefox 동기화 - 더 알아보기 + 이 기기의 Firefox에 북마크, 기록 및 비밀번호를 가져오세요. @@ -1234,8 +1236,8 @@ 예, 로그인함 로그인 중… - - Firefox에 로그인 + + 가입하기 로그아웃 유지 @@ -1244,26 +1246,23 @@ 로그인 실패 - 자동 개인정보 보호 - - 개인 정보 및 보안 설정은 추적기, 악성 코드 및 사용자를 따라다니는 회사를 차단합니다. + 상시 개인 정보 보호 + + Firefox는 회사가 웹에서 사용자를 몰래 따라 다니는 것을 자동으로 중지합니다. 표준 (기본값) - 더 적은 추적기를 차단합니다. 페이지가 정상적으로 로드됩니다. + 개인 정보 보호와 성능사이의 균형이 잡혀 있습니다. 페이지가 정상적으로 로드됩니다. 엄격 (권장) 엄격 - 더 많은 추적기, 광고 및 팝업을 차단합니다. 페이지가 더 빨리 로드되지만, 일부 기능이 작동하지 않을 수 있습니다. - - 위치를 잡으세요 + 더 많은 추적기를 차단하여 페이지가 더 빨리 로드되지만, 일부 페이지의 기능이 손상될 수 있습니다. + + 도구 모음 위치 선택 - 하단 도구 모음을 사용하여 한 손으로 탐색하시거나, 상단으로 이동하세요. + 도구 모음을 쉽게 접근할 수 있는 곳에 놓으세요. 하단에 두거나 상단으로 옮기세요. 사생활 보호 모드 개인 정보 보호 + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> 우리는 %s가 무엇을 온라인에서 공유하고 우리와 공유할지 사용자가 제어할 수 있게 만들었습니다. 개인정보처리방침 읽기 @@ -1291,7 +1290,7 @@ 테마 선택 - 어두운 모드를 활성화하여 배터리를 절약하고 시력을 보호하세요. + 어두운 모드를 활성화하여 배터리를 절약하고 시력을 보호하세요. 자동 @@ -1347,13 +1346,13 @@ 표준 (기본값) - 더 적은 추적기를 차단합니다. 페이지가 정상적으로 로드됩니다. + 개인 정보 보호와 성능사이의 균형이 잡혀 있습니다. 페이지가 정상적으로 로드됩니다. 표준 추적 방지 기능에 의해 차단된 것 엄격 - 더 많은 추적기, 광고 및 팝업을 차단합니다. 페이지가 더 빨리 로드되지만, 일부 기능이 작동하지 않을 수 있습니다. + 더 많은 추적기를 차단하여 페이지가 더 빨리 로드되지만, 일부 페이지의 기능이 손상될 수 있습니다. 엄격 추적 방지 기능에 의해 차단된 것 @@ -1591,6 +1590,38 @@ 로그인 정렬 메뉴 + + + 신용 카드 + + 카드 저장 및 자동 채우기 + + 데이터가 암호화됨 + + 기기 간에 카드 동기화 + + 신용 카드 추가 + + + 카드 추가 + + 카드 번호 + + 유효 기간 + + + 카드상의 이름 + + 카드 별명 + + 카드 삭제 + + 저장 + + 저장 + + 취소 + 검색 엔진 추가 diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index f70ff136f..e7ae2df0a 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -19,11 +19,38 @@ ແທັບສ່ວນຕົວຂອງທ່ານຈະຖືກສະແດງຢູ່ບ່ອນນີ້. + + Baidu + + JD ເປີດ 1 ແຖບ. ແຕະເພື່ອປ່ຽນແທັບ. ເປີດ %1$s ແຖບ. ແຕະເພື່ອປ່ຽນແທັບ. + + ເລືອກ %1$d ແລ້ວ + + ເພີ່ມການເກັບສະສົມໃຫມ່ + + ຊື່ + + ເລືອກການເກັບສະສົມ + + ອອກຈາກໂຫມດ multiselect + + ບັນທຶກແທັບທີ່ເລືອກແລ້ວໄປໄວ້ທີ່ການເກັບສະສົມ + + ເລືອກ %1$s ແລ້ວ + + ບໍ່ເລືອກ %1$s + + ອອກຈາກໂຫມດ multiselect + + ເຂົ້າສູ່ໂຫມດ multiselect ແລ້ວ, ເລືອກແທັບເພື່ອບັນທຶກໄປໄວ້ທີ່ການເກັບສະສົມ + + ເລືອກແລ້ວ + %1$s ແມ່ນຜະລິດຂື້ນໂດຍ @fork-maintainers. @@ -42,13 +69,30 @@ ບໍ່, ຂອບໃຈ - - - ເຂົ້າ Firefox ໄດ້ໄວຂຶ້ນ. ເພີ່ມ widget ໃສ່ໜ້າຈໍຫລັກຂອງທ່ານ. - - ເພີ່ມ widget - - ບໍ່ແມ່ນຕອນນີ້ + + + ທ່ານສາມາດຕັ້ງໃຫ້ Firefox ເປີດລີ້ງນີ້ໃນແອັບໂດຍອັດຕະໂນມັດ. + + ໄປທີ່ການຕັ້ງຄ່າ + + ຍົກເລີກ + + + ຕ້ອງການເຂົ້ານຳໃຊ້ກ້ອງ. ໄປທີ່ການຕັ້ງຄ່າ Android ແຕະໃສ່ ສິດ ແລະ ແຕະໃສ່ ອະນຸຍາດ + + ໄປທີ່ການຕັ້ງຄ່າ + + ຍົກເລີກ + + + ເບິງການຕັ້ງຄ່າ + + ຍົກເລີກ + + + ໄປທີ່ການຕັ້ງຄ່າ + + ຍົກເລີກ @@ -77,6 +121,8 @@ ແກ້ໄຂບຸກມາກ Add-ons + + ເອັກສເທນຊັນສ ບໍ່ມີ add-ons ຢູ່ທີ່ນີ້ @@ -95,12 +141,12 @@ ຕິດຕັ້ງ ແທັບທີ່ Sync ແລ້ວ + + Resync ຄົ້ນຫາໃນຫນ້ານີ້ ແທັບສ່ວນຕົວ - - ແທັບໃຫມ່ ບັນທຶກໄປໄວ້ບ່ອນເກັບສະສົມ @@ -125,6 +171,8 @@ ຮູບ​ຮ່າງ + + ແກ້ໄຂມຸມມອງຜູ້ອ່ານ ບໍ່​ສາ​ມາດ​​ເຊື່ອມ​ຕໍ່ໄດ້ ເນື່ອງຈາກບໍ່ຮູ້ຈັກຮູບແບບ URL @@ -142,8 +190,12 @@ ສະແກນ + + ເຄື່ອງມືການຄົ້ນຫາ ການຕັ້ງຄ່າຂອງເຄື່ອງມືຄົ້ນຫາ + + ຄັ້ງນີ້ ຄົ້ນຫາດ້ວຍ: ເຕີມລີ້ງຈາກຄິບບອດ @@ -157,7 +209,14 @@ ຮຽນຮູ້ເພີ່ມເຕີມ + + ຄົ້ນຫາ %s + + ຄົ້ນຫາໂດຍກົງຈາກແທັບທີ່ຢູ່ + + + ເປີດແທັບ Firefox ໃໝ່ ຄົ້ນຫາ @@ -212,6 +271,8 @@ ເປີດລີ້ງໃນແທັບສ່ວນຕົວ ອະນຸຍາດໃຫ້ຖ່າຍຫນ້າຈໍໃນໂຫມດການທ່ອງເວັບແບບສ່ວນຕົວ + + ຖ້າຫາກວ່າໄດ້ອະນຸຍາດແລ້ວ, ແທັບສ່ວນໂຕຈະສະແດງໃຫ້ເຫັນເມື່ອເປີດຫລາຍແອັບ ເພີ່ມທາງລັດການທ່ອງເວັບແບບສ່ວນຕົວ @@ -230,6 +291,8 @@ ແຖບເຄື່ອງມື ຊຸດປັບແຕ່ງ + + ຫນ້າທຳອິດ ການປັບແຕ່ງ @@ -252,6 +315,8 @@ ການດີບັກທາງໄກຜ່ານທາງ USB + + ສະແດງເຄື່ອງມືການຄົ້ນຫາ ສະແດງຜົນການແນະນຳການຄົ້ນຫາ @@ -264,6 +329,8 @@ ຄົ້ນຫາປະຫວັດການທ່ອງເວັບ ຄົ້ນຫາບຸກມາກ + + ຄົ້ນຫາແທັບທີ່ sync ແລ້ວ ການຕັ້ງ​ຄ່າ​ບັນ​ຊີ @@ -271,6 +338,16 @@ Add-ons + + ການແຈ້ງເຕືອນ + + + ໂອເຄ + + ຍົກເລີກ + + ຊື່ການເກັບສະສົມ + Sync ຕອນນີ້ @@ -352,6 +429,8 @@ ຂໍ້ມູນດ້ານການຕະຫຼາດ ແບ່ງປັນຂໍ້ມູນກ່ຽວກັບຟິວເຈີທີ່ທ່ານໃຊ້ຢູ່ໃນ %1$s ກັບ Leanplum ຊຶ່ງເປັນຜູ້ໃຫ້ບໍລິການດ້ານການຕະລາດມືຖືຂອງພວກເຮົາ. + + ການສຶກສາ ການທົດລອງ @@ -422,6 +501,10 @@ ບຸກມາກອື່ນໆ ປະຫວັດການໃຊ້ງານ + + ແທັບໃຫມ່ + + ຄົ້ນຫາໃນຫນ້ານີ້ ແທັບ Synced @@ -435,6 +518,46 @@ ປິດ + + ແທັບທີ່ຫາກໍ່ປິດໄປມື້ກີ້ນີ້ + + ສະແດງປະຫວັດການໃຊ້ງານທັງຫມົດ + + ແທັບ %d + + ແທັບ %d + + ບໍ່ມີແທັບທີ່ຫາກໍ່ປິດໄປມື້ກີ້ນີ້ + + + + ແທັບ + + ເບິງແທັບ + + ລາຍການ + + ປິດແທັບ + + ດ້ວຍ​ຕົນ​ເອງ + + ຫຼັງຈາກມື້ໜຶ່ງ + + ຫຼັງຈາກໜຶ່ງອາທິດ + + ຫຼັງຈາກໜຶ່ງເດືອນ + + + ປິດດ້ວຍຕົນເອງ + + ປິດຫຼັງຈາກມື້ໜຶ່ງ + + ປິດຫຼັງຈາກໜຶ່ງອາທິດ + + ປິດຫຼັງຈາກໜຶ່ງເດືອນ + ເປີດແທັບ @@ -452,8 +575,14 @@ ເປີດແທັບ ບັນທຶກໄປໄວ້ບ່ອນເກັບສະສົມ + + ເລືອກ ແບ່ງປັນແທັບທັງໝົດ + + ແທັບທີ່ຫາກໍ່ປິດໄປມື້ກີ້ນີ້ + + ການຕັ້ງຄ່າແທັບ ປິດແທັບທັງຫມົດ @@ -462,8 +591,18 @@ ໄປຫນ້າທຳອິດ ຮູບແບບການສະຫຼັບແທັບ + + ບຸກມາກ + + ປິດ + + ແບ່ງປັນແທັບທີ່ເລືອກໄວ້ + + ເລືອກເມນູແທັບແລ້ວ ລຶບແຖບອອກຈາກບ່ອນເກັບສະສົມ + + ເລືອກແທັບ ປິດແທັບ @@ -497,12 +636,21 @@ ປ່ຽນຊື່ບ່ອນເກັບສະສົມ ເປີດແທັບ - - ລຶບ - + + ຊື່ການເກັບສະສົມ + + ປ່ຽນ​ຊື່ + + ລຶບ + + + ລຶບອອກຈາກປະຫວັດການນຳໃຊ້ %1$s (ໂຫມດສ່ວນຕົວ) + + ບັນທຶກ + ລຶບປະຫວັດການໃຊ້ງານ @@ -532,6 +680,10 @@ ລຶບໄອເທັມ %1$d + + ມື້ນີ້ + + ມື້ວານ 24 ຊົ່ວໂມງທີ່ຜ່ານມາ @@ -543,6 +695,25 @@ ບໍ່ມີປະຫວັດການໃຊ້ງານຢູ່ນີ້ + + + + ລົບການດາວໂຫລດ + + ລຶບການດາວໂຫລດແລ້ວ + + ລຶບ %1$s ແລ້ວ + + ບໍ່ມີໄຟລທີ່ໄດ້ດາວໂຫລດມາ + + ເລືອກ %1$d ແລ້ວ + + ເປີດ + + ລຶບ + + ຂໍ​ອະໄພ. %1$s ບໍ່ສາມາດໂຫລດໜ້າເວັບນັ້ນໄດ້. @@ -675,16 +846,16 @@ ເປີດ ປິດ - + ອະນຸຍາດໃຫ້ເປີດສຽງ ແລະ ວີດີໂອ ບັອກສຽງ ແລະ ວິດີໂອໃນການນໍາໃຊ້ຂໍ້ມູນອິນເຕີເນັດໃນໂທລະສັບມືຖືເທົ່ານັ້ນ ສຽງ ແລະ ວິດີໂອຈະເປີດໃນ Wi-Fi - + ບັອກສຽງເທົ່ານັ້ນ - + ບັອກສຽງ ແລະ ວີດີໂອ ເປີດ @@ -696,10 +867,6 @@ ການສະສົມ ເມນູການສະສົມ - - ເກັບກຳສິ່ງທີ່ສຳຄັນສຳລັບທ່ານ - - ເອົາການຄົ້ນຫາ, ເວັບໄຊທ ແລະ ແທັບທີ່ຄ້າຍຄືກັນມາໄວ້ໃນກຸ່ມດຽວກັນ ເພື່ອເຮັດໃຫ້ສາມາດເຂົ້າໄດ້ງ່າຍໃນພາຍຫລັງ. ເລືອກແທັບ @@ -938,15 +1105,6 @@ ມີຄຳຖາມກ່ຽວກັບການອອກແບບ %s ຄືນໃຫມ່ບໍ່? ຕ້ອງການຢາກຮູ້ຈັກວ່າມີຫຍັງປ່ຽນແປງແດ່ບໍ່? ພົບຄຳຕອບໄດ້ທີ່ນີ້ - - ຮັບຜົນປະໂຫຍດສູງສຸດຈາກ %s. - - - ທ່ານໄດ້ລົງຊື່ເຂົ້າໃຊ້ດ້ວຍຖານະ %s ໃນ Firefox ໃນໂທລະສັບເຄື່ອງນີ້. ທ່ານຕ້ອງການຈະລົງຊື່ເຂົ້າໃຊ້ດ້ວຍບັນຊີນີ້ບໍ່? - ກຳລັງລົງຊື່ເຂົ້າໃຊ້… @@ -1135,13 +1293,15 @@ ບັກທຶກການລັອກອິນໄວ້ - - - ທາງລັດ - - ຄົ້ນຫາດ້ວຍ - - ຄັ້ງນີ້ ຄົ້ນຫາດ້ວຍ: - - ສະແດງທາງລັດການຄົ້ນຫາ + + ຮັບຜົນປະໂຫຍດສູງສຸດຈາກ %s. + + + ເກັບກຳສິ່ງທີ່ສຳຄັນສຳລັບທ່ານ + + ເອົາການຄົ້ນຫາ, ເວັບໄຊທ ແລະ ແທັບທີ່ຄ້າຍຄືກັນມາໄວ້ໃນກຸ່ມດຽວກັນ ເພື່ອເຮັດໃຫ້ສາມາດເຂົ້າໄດ້ງ່າຍໃນພາຍຫລັງ. + + ທ່ານໄດ້ລົງຊື່ເຂົ້າໃຊ້ດ້ວຍຖານະ %s ໃນ Firefox ໃນໂທລະສັບເຄື່ອງນີ້. ທ່ານຕ້ອງການຈະລົງຊື່ເຂົ້າໃຊ້ດ້ວຍບັນຊີນີ້ບໍ່? + diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 5b547d35e..34e8fd736 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -20,10 +20,6 @@ Čia bus rodomos jūsų privačiosios kortelės. - - Baidu - - JD 1 atverta kortelė. Bakstelėkite, norėdami pereiti tarp kortelių. @@ -182,6 +178,11 @@ Tinkinti skaitymo rodinį + + Įtraukti + + Keisti + Nepavyko prisijungti. Neatpažįstama URL schema. @@ -1171,9 +1172,6 @@ Sveiki, čia „%s“! Jau turite paskyrą? - - Susipažinkite su „%s“ Susipažinkite su naujovėmis @@ -1182,10 +1180,10 @@ Turite klausimų apie naująją „%s“? Norite sužinoti, kas pasikeitė? Atsakymus rasite čia - - Pradėkite sinchronizuoti adresyną, slaptažodžius, ir daugiau su savo „Firefox“ paskyra. + + Sinchronizuokite „Firefox“ duomenis tarp įrenginių - Sužinoti daugiau + Turėkite savo „Firefox“ adresyną, žurnalą, ir slaptažodžius šiame įrenginyje. @@ -1194,8 +1192,8 @@ Taip, prisijungti Prisijungiama… - - Prisijungti prie „Firefox“ + + Kurti paskyrą Likti neprisijungus @@ -1204,27 +1202,24 @@ Nepavyko prisijungti - Automatinis privatumas - - Privatumo ir saugumo nuostatos blokuoja stebėjimo elementus, kenkėjiškas programas, ir jus sekančias kompanijas. + Visada veikiantis privatumas + + „Firefox“ automatiškai blokuoja kompanijų bandymus sekti jūsų veiklą internete. Standartinė (numatytoji) - Blokuoja mažiau stebėjimo elementų. Tinklalapiai bus įkeliami įprastai. + Subalansuota privatumui ir našumui. Tinklalapiai įkeliami įprastai. Griežta (rekomenduojama) Griežta - - Blokuoja daugiau stebėjimo elementų, reklamų, ir iššokančių langų. Tinklalapiai bus įkeliami sparčiau, tačiau gali sutrikti jų veikimas. - - Pasirinkite poziciją + + Blokuojama daugiau stebėjimų elementų, tad tinklalapiai įkeliami sparčiau, tačiau gali sutrikti dalis funkcionalumo. + + Pasirinkite priemonių juostos vietą - Išbandykite naršymą viena ranka, kai priemonių juosta apačioje, arba perkelkite ją į viršų. + Pasidėkite priemonių juostą patogiai. Palikite ją apačioje, arba perkelkite į viršų. Naršykite privačiai Jūsų privatumas + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Mes sukūrėme „%s“ siekdami jums suteikti pasirinkimą, kuo dalinatės internete, ir kuo su mumis. Mūsų privatumo pranešimas @@ -1251,9 +1246,9 @@ Pasirinkite apvalkalą - - Pataupykite bateriją ir savo regėjimą, įjungdami tamsią veikseną. + + Pataupykite bateriją ir savo regėjimą su tamsia veiksena. Automatinis @@ -1309,13 +1304,13 @@ Standartinė (numatytoji) - Blokuoja mažiau stebėjimo elementų. Tinklalapiai bus įkeliami įprastai. + Subalansuota privatumui ir našumui. Tinklalapiai įkeliami įprastai. Ką blokuoja numatytoji apsauga nuo stebėjimo Griežta - Blokuoja daugiau stebėjimo elementų, reklamų, ir iššokančių langų. Tinklalapiai bus įkeliami sparčiau, tačiau gali sutrikti jų veikimas. + Blokuojama daugiau stebėjimų elementų, tad tinklalapiai įkeliami sparčiau, tačiau gali sutrikti dalis funkcionalumo. Ką blokuoja griežta apsauga nuo stebėjimo @@ -1555,6 +1550,38 @@ Prisijungimų rūšiavimo meniu + + + Mokėjimo kortelės + + Įrašyti ir automatiškai užpildyti kortelių duomenis + + Duomenys yra užšifruoti + + Sinchronizuoti korteles tarp įrenginių + + + Pridėti mokėjimo kortelę + + + Pridėti kortelę + + Kortelės numeris + + Galiojimo data + + Vardas ant kortelės + + Kortelės pavadinimas + + Pašalinti kortelę + + Įrašyti + + Įrašyti + + Atsisakyti + Pridėti ieškyklę diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index dd3a094e1..7e38f2d39 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -19,10 +19,6 @@ Dine private faner vil vises her. - - Baidu - - JD 1 åpen fane. Trykk for å bytte fane. @@ -53,7 +49,7 @@ Valgt - %1$s er produsert av @fork-maintainers. + %1$s er produsert av Mozilla. @@ -185,6 +181,11 @@ Tilpass lesevisning + + Legg til + + Rediger + Kan ikke koble til. Ugjenkjennelig URL-skjema. @@ -984,6 +985,10 @@ Alle handlinger Nylig brukt + + Logget inn som %1$s + + Logg inn for å synkronisere Logg inn på Sync @@ -1177,9 +1182,6 @@ Velkommen til %s! Har du allerede en konto? - - Bli kjent med %s Se hva som er nytt Få svar her - - Begynn å synkronisere bokmerker, passord og mer med Firefox-kontoen din. + + Synkroniser Firefox mellom enheter - Les mer + Ta med bokmerker, historikk og passord til Firefox på denne enheten. @@ -1200,8 +1202,8 @@ Ja, logg meg inn Logger inn… - - Logg inn på Firefox + + Registrer deg Forbli utlogget @@ -1209,29 +1211,14 @@ Kunne ikke logge inn - - Automatisk personvern - - Innstillinger for personvern og sikkerhet blokkerer sporere, skadelig kode og selskaper som følger deg. Standard (standard) - - Blokkerer færre sporere. Sider lastes normalt. Streng (anbefales) Streng - - Blokkerer flere sporere, reklamer og sprettoppvindu. Sider lastes raskere, men noen funksjoner fungerer kanskje ikke. - - Velg side - - - Bruk verktøylinjen nederst til å surfe med en hånd, eller flytt den til toppen. + Surf privat @@ -1246,7 +1233,7 @@ Ditt personvern + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Vi har utviklet %s for å gi deg kontroll over det du deler på nettet og hva du deler med oss. Les personvernmerknaden vår @@ -1260,8 +1247,6 @@ Velg tema - - Spar litt batteri og dine øyne ved å aktivere mørkt tema. Automatisk @@ -1316,15 +1301,11 @@ Les mer Standard (standard) - - Blokkerer færre sporere. Sider lastes normalt. Hva er blokkert av standard sporingsbeskyttelse Streng - - Blokkerer flere sporere, reklamer og sprettoppvindu. Sider lastes raskere, men noen funksjoner fungerer kanskje ikke. Hva er blokkert av streng sporingsbeskyttelse @@ -1566,6 +1547,18 @@ Sorter innlogginger-meny + + + Betalingskort + + Lagre og fyll ut kort automatisk + + Data er kryptert + + Synkroniser kort på tvers av enheter + + Legg til betalingskort + Legg til søkemotor diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c9a743d91..1237fc622 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -22,10 +22,6 @@ Uw privétabbladen worden hier weergegeven. - - Baidu - - JD 1 open tabblad. Tik om tussen tabbladen te wisselen. @@ -56,7 +52,7 @@ Geselecteerd - %1$s is gemaakt door @fork-maintainers. + %1$s is gemaakt door Mozilla. @@ -189,6 +185,11 @@ Lezerweergave aanpassen + + Toevoegen + + Bewerken + Kan niet verbinden. Onherkenbaar URL-schema. @@ -982,6 +983,10 @@ Alle acties Onlangs gebruikt + + Aangemeld als %1$s + + Aanmelden om te synchroniseren Aanmelden bij Sync @@ -1177,9 +1182,6 @@ Welkom bij %s! Hebt u al een account? - - Maak kennis met %s Bekijk wat er nieuw is Hier vindt u antwoorden - - Start met synchroniseren van bladwijzers, wachtwoorden en meer met uw Firefox-account. + + Synchroniseer Firefox tussen apparaten - Meer info + Breng bladwijzers, geschiedenis en wachtwoorden naar Firefox op dit apparaat. @@ -1199,8 +1201,8 @@ Ja, mij aanmelden Aanmelden… - - Aanmelden bij Firefox + + Registreren Afgemeld blijven @@ -1208,26 +1210,23 @@ Aanmelden mislukt - Automatische privacy - - Privacy- en beveiligingsinstellingen blokkeren trackers, malware en bedrijven die u volgen. + Privacy die altijd aan staat + + Firefox zorgt er automatisch voor dat bedrijven u niet stiekem volgen op internet. Standaard (standaard) - Blokkeert minder trackers. Pagina’s worden normaal geladen. + Gebalanceerd voor privacy en prestaties. Pagina’s laden normaal. Streng (aanbevolen) Streng - Blokkeert meer trackers, advertenties en pop-ups. Pagina’s worden sneller geladen, maar sommige functies werken mogelijk niet. - - Neem stelling + Blokkeert meer trackers, zodat pagina’s sneller worden geladen, maar sommige functionaliteit op een pagina werkt mogelijk niet. + + Kies uw werkbalkplaatsing - Probeer surfen met één hand met de werkbalk onderin, of verplaats deze naar boven. + Plaats de werkbalk binnen handbereik. Houd hem onderaan of verplaats hem naar boven. Surf privé Uw privacy + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> We hebben %s ontworpen om u controle te geven over wat u online deelt en wat u met ons deelt. Lees onze privacyverklaring @@ -1255,7 +1254,7 @@ Kies uw thema - Spaar uw batterij en uw ogen door de donkere modus in te schakelen. + Spaar uw batterij en uw ogen met de donkere modus. Automatisch @@ -1310,13 +1309,13 @@ Standaard (standaard) - Blokkeert minder trackers. Pagina’s worden normaal geladen. + Gebalanceerd voor privacy en prestaties. Pagina’s laden normaal. Wat wordt geblokkeerd door standaard bescherming tegen volgen Streng - Blokkeert meer trackers, advertenties en pop-ups. Pagina’s worden sneller geladen, maar sommige functies werken mogelijk niet. + Blokkeert meer trackers, zodat pagina’s sneller worden geladen, maar sommige functionaliteit op een pagina werkt mogelijk niet. Wat wordt geblokkeerd door strenge bescherming tegen volgen @@ -1552,6 +1551,37 @@ Menu Aanmeldingen sorteren + + + Creditcards + + Kaarten opslaan en automatisch invullen + + Gegevens zijn versleuteld + + Kaarten synchroniseren tussen apparaten + + Creditcard toevoegen + + + Kaart toevoegen + + Kaartnummer + + Vervaldatum + + Naam op kaart + + Kaart-nickname + + Kaart verwijderen + + Opslaan + + Opslaan + + Annuleren + Zoekmachine toevoegen diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index c5f993168..10ee09d6a 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -22,10 +22,6 @@ Dine private faner vil visast her. - - Baidu - - JD 1 open fane. Trykk for å byte fane. @@ -185,6 +181,11 @@ Tilpass lesevising + + Legg til + + Rediger + Klarte ikkje å kople til. Ukjenneleg URL-skjema. @@ -986,6 +987,10 @@ Alle handlingar Nyleg brukt + + Logga inn som %1$s + + Logg inn for å synkronisere Logg inn på Sync @@ -1179,9 +1184,6 @@ Velkomen til %s! Har du allereie ein konto? - - Bli kjent med %s Sjå kva som er nytt Få svar her - - Begynn å synkronisere bokmerke, passord og meir med Firefox-kontoen din. + + Synkroniser Firefox mellom einingar - Les meir + Ta med bokmerke, historikk og passord til Firefox på denne eininga. @@ -1202,9 +1204,9 @@ Ja, logg meg inn Loggar inn… - - Logg inn på Firefox + + Registrer deg Bli verande utlogga @@ -1213,26 +1215,23 @@ Klarte ikkje å logge inn - Automatisk personvern - - Innstillingar for personvern og sikkerheit blokkerer sporarar, skadeleg kode og selskap som følgjer deg. + Alltid med personvern + + Firefox hindrar automatisk verksemder i å følgje deg i løynd på nettet. Standard (standard) - Blokkerer færre sporarar. Sider vert lasta normalt. + Balansert mellom privatliv og yting. Sider vert lasta inn normalt. Streng (tilrådd) Streng - Blokkerer fleire sporarar, reklamer og sprettoppvindauge. Sider vert lasta raskere, men nokre funksjonar fungerer kanskje ikkje. - - Vel side + Blokkerer fleire sporings-mekanismar. Sider vert leste inn raskare, men enkelte sider fungerer kanskje ikkje. + + Vel plassering for verktøylinja - Bruk verktøylinja nedst til å surfe med ei hand, eller flytt henne til toppen. + Plassere verktøylinja innanfor rekkjevidde. Ha henne i botn eller topp. Surf privat Ditt personvern + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Vi har utvikla %s for å gi deg kontroll over det du deler på nettet og kva du deler med oss. Les personvernmerknaden vår @@ -1260,7 +1259,7 @@ Vel tema - Spar litt batteri og synet ditt ved å aktivere mørkt tema. + Skån batteriet og augene dine med eit mørkt tema. Automatisk @@ -1316,13 +1315,13 @@ Standard (standard) - Blokkerer færre sporarar. Sider vert lasta normalt. + Balansert mellom privatliv og yting. Sider vil laste normalt. Kva er blokkert av standard sporingsvern Streng - Blokkerer fleire sporarar, reklamer og sprettoppvindauge. Sider vert lasta raskere, men nokre funksjonar fungerer kanskje ikkje. + Blokkerer fleire sporings-mekanismar. Sider vert lasta inn raskare, men enkelte sider fungerer kanskje ikkje skikkeleg. Kva er blokkert av strengt sporingsvern? @@ -1559,6 +1558,37 @@ Sorter inloggningsmenyen + + + Betalingskort + + Lagre og fyll ut kort automatisk + + Data er kryptert + + Synkroniser kort på tvers av einingar + + Legg til betalingskort + + + Legg til betalingskort + + Kortnummer + + Går ut-dato + + Namn på kort + + Kallenamn på kort + + Slett kort + + Lagre + + Lagre + + Avbryt + Legg til søkjemotor diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index cbe0452dd..54d5e38f5 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -19,10 +19,6 @@ Los onglets privats se mostraràn aquí. - - Baidu - - JD 1 onglet dobèrt. Tocatz per i bascular. @@ -180,6 +176,13 @@ Aparéncia + + Personalizar la vista lectura + + Apondre + + Modificar + Connexion impossibla. Esquèma d’URL desconegut. @@ -216,6 +219,11 @@ Ne saber mai + + Cercar %s + + Recèrcas dirèctament dins la barra d’adreça + Dobrir dins un onglet Firefox novèl @@ -896,17 +904,23 @@ Activada Desactivada - + Autorizar l’àudio e la vidèo + + Autorizar l’àudio e la vidèo Blocar solament l’àudio e la vidèo amb una connexion mobil L’àudio e la vidèo seràn legits amb una connexion Wi-Fi - + Blocar sonque l’àudio - + + Blocar sonque l’àudio + Blocar l’àudio e la vidèo + + Blocar l’àudio e la vidèo Activat @@ -1159,55 +1173,47 @@ La benvenguda a %s ! Avètz ja un compte ? - - Descobrissètz %s Descobrissètz las novetats + + Avètz de question tocant lo nòu %s ? Volètz saber çò que cambièt ? Trobatz de responsas aquí - - Ne saber mai + + Sètz connectat coma %s sus un autre navegador Firefox amb aqueste periferic. Volètz vos connectar amb aqueste compte ? Òc, connectatz-me Connexion… - - Se connectar a Firefox Demorar desconnectat Sincro. activada Fracàs de connexion - - Confidencialitat automatica - - Los paramètres de confidencialitat e de seguretat blocan los traçadors, los logicials malvolents e las entrepresas que vos pistan. Estandard (per defaut) - - Bloca mens de traçadors. Las paginas se cargan normalament. Estricte (recomandat) Estricte - - Bloca mai d’elements de seguiment, publicitats e fenèstras sorgissentas. Las paginas se cargament rapidament, mas pòt arribar que d’unas foncionalitats sián copadas. - - Prenètz posicion Navegatz d’un biais privat Dobrir un sol onglet privat : tocatz l’icòna %s. + + Dobrir d’onglets privats cada còp : definissètz vòstres paramètres de navigacion privada. Dobrir los paramètres Vòstra vida privada + + Concebèrem %s per vos donar lo contraròtle de çò que partejatz en linha e çò que partejatz amb nosautres. Legissètz nòstra politica de confidencialitat @@ -1219,8 +1225,6 @@ Causissètz vòstre tèma - - Estalviatz la batariá e vòstra vista en activant lo mòde fosc. Automatic @@ -1275,14 +1279,10 @@ Ne saber mai Estandarda (per defaut) - - Bloca mens de traçadors. Las paginas se cargan normalament. Çò que la proteccion contra lo seguiment estandarda bloca Estricte - - Bloca mai d’elements de seguiment, publicitats e fenèstras sorgissentas. Las paginas se cargament rapidament, mas pòt arribar que d’unas foncionalitats sián copadas. Çò que la proteccion contra lo seguiment estricta bloca @@ -1324,13 +1324,21 @@ Limita la capacitat dels malhums socials de seguir vòstra activitat en linha. Cookies de seguiment entre sites + + Bloca los cookies que los malhums publicitaris e las societats d’analisi de donadas utilizan per compilar vòstras donadas de navegacion sus mantun site. Minaires de criptomonedas + + Empacha los scripts malvolents d’accedir a vòstre periferic per minar de moneda numerica. Generadors d’emprentas numericas + + Empacha la culhida de donadas unicas identificables quant a vòstre periferic que pòdon èsser utilizadas pel seguiment. Contengut utilizat pel seguiment + + Empacha lo cargament de publicitats, vidèos e autre contengut que contenon de còdi de seguiment. Pòt afectar d’unas foncionalitats de sites web. Quand l’escut es violet, %s a blocat de traçadors sus aqueste site. Tocatz aquí per ne saber mai. @@ -1374,6 +1382,9 @@ Bibliotècas qu’utilizam + + Menú de desbugatge : %1$d clic(s) restant(s) per l’activar Menú de desbugatge activat @@ -1404,6 +1415,9 @@ Nom de l’acorchi + + Podètz facilament apondre aqueste site a l’ecran d’acuèlh de vòstre periferic per i accedir dirèctament e i navegar coma se foguèsse una aplicacion. + Identificants e senhals @@ -1491,6 +1505,8 @@ Desblocatz per veire los identificants enregistrats Protegissètz vòstres identificants e senhals + + Configuratz un esquèma de verrolhatge, un còdi PIN o un senhal per protegir vòstres identificants de connexion e senhals enregistrats se per cas qualqu’un accedisca a vòstre periferic. Mai tard @@ -1499,6 +1515,8 @@ Desverrolhatz lo periferic Zoom per totes los sites + + Activar per permetre de zoomar amb dos dets encara que lo site empache aquò. Nom (A-Z) @@ -1507,6 +1525,31 @@ Menú per triar los identificants + + + Cartas de crèdit + + Salvar e completar automaticament las cartas + + Donadas chifradas + + Sincronizar las cartas entre los periferics + + Apondre una cartas de crèdit + + + Numèro de carta + + Data d’expiracion + + Titular + + Enregistrar + + Enregistrar + + Anullar + Apondre un motor de recèrca @@ -1683,4 +1726,6 @@ Agropatz de recèrcas, de sites e d’onglets similaris per i accedir rapidament mai tard. Sètz connectat coma %s sus un autre navegador Firefox sus aqueste telefòn. Volètz vos connectar amb aqueste compte ? - + + Podètz facilament apondre aqueste site a vòstre ecran d’acuèlh de telefòn per i accedir e navigar mai rapidament coma se foguèssetz dins l’aplicacion. + diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 2c8bebf6a..826662ea9 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -20,10 +20,6 @@ ਤੁਹਾਡੀਆਂ ਪ੍ਰਾਈਵੇਟ ਟੈਬਾਂ ਨੂੰ ਇੱਥੇ ਵਿਖਾਇਆ ਜਾਵੇਗਾ। - - ਬਾਈਡੂ - - ਜੇਡੀ 1 ਟੈਬ ਖੁੱਲ੍ਹੀ। ਟੈਬਾਂ ਲਈ ਸਵਿੱਚ ਕਰਨ ਵਾਸਤੇ ਟੈਪ ਕਰੋ। @@ -189,6 +185,11 @@ ਪੜ੍ਹਨ ਝਲਕ ਨੂੰ ਕਸਟਮਾਈਜ਼ ਕਰੋ + + ਜੋੜੋ + + ਸੋਧੋ + ਕਨੈਕਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ। ਬੇਪਛਾਣ URL ਸਕੀਮ। @@ -991,6 +992,10 @@ ਸਾਰੀਆਂ ਕਾਰਵਾਈਆਂ ਤਾਜ਼ਾ ਵਰਤੇ + + %1$s ਵਜੋਂ ਸਾਈਨ ਇਨ ਕੀਤਾ + + ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ @@ -1187,9 +1192,6 @@ %s ਵਲੋਂ ਜੀ ਆਇਆਂ ਨੂੰ! ਪਹਿਲਾਂ ਹੀ ਖਾਤਾ ਹੈ? - - %s ਬਾਰੇ ਜਾਣੋ ਵੇਖੋ ਕਿ ਨਵਾਂ ਕੀ ਹੈ ਜਵਾਬ ਇੱਥੇ ਲਵੋ - - ਆਪਣੇ Firefox ਖਾਤੇ ਨਾਲ ਬੁੱਕਮਾਰਕ, ਪਾਸਵਰਡ ਤੇ ਹੋਰਾਂ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰੋ। + + ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ Firefox ਸਿੰਕ ਕਰੋ - ਹੋਰ ਜਾਣੋ + ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ Firefox ਲਈ ਬੁੱਕਮਾਰਕ, ਅਤੀਤ ਅਤੇ ਪਾਸਵਰਡ ਲਿਆਓ। @@ -1209,9 +1211,9 @@ ਹਾਂ, ਮੈਨੂੰ ਸਾਈਨ ਇਨ ਕਰੋ …ਸਾਇਨ ਇਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ - - ਫਾਇਰਫਾਕਸ ‘ਚ ਸਾਇਨ ਇਨ ਕਰੋ + + ਸਾਈਨ ਅੱਪ ਕਰੋ ਸਾਈਨ ਆਉਟ ਰਹੋ @@ -1219,26 +1221,23 @@ ਸਾਈਨ-ਇਨ ਲਈ ਅਸਫ਼ਲ - ਆਪਣੇ-ਆਪ ਪਰਦੇਦਾਰੀ - - ਪਰਦੇਦਾਰੀ ਅਤੇ ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ ਟਰੈਕਾਂ, ਮਾਲਵੇਅਰ ਅਤੇ ਤੁਹਾਡਾ ਪਿੱਛਾ ਕਰਨ ਵਾਲੀਆਂ ਕਾਪੀਆਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਉਂਦੀਆਂ ਹਨ। + ਪਰਦੇਦਾਰੀ ਹਮੇਸ਼ਾਂ ਚਾਲੂ + + ਕੰਪਨੀਆਂ ਨੂੰ ਚੋਰੀ ਚੋਰੀ ਵੈੱਬ ਉੱਤੇ ਤੁਹਾਡਾ ਪਿੱਛਾ ਕਰਨ ਤੋਂ Firefox ਆਪਣੇ-ਆਪ ਹੀ ਰੋਕਦਾ ਹੈ। ਸਟੈਂਡਰਡ (ਮੂਲ) - ਕੁਝ ਕੁ ਟਰੈਕਰਾਂ ਉੱਤੇ ਰੋਕ ਲਾਉਂਦਾ ਹੈ। ਸਫ਼ੇ ਆਮ ਵਾਂਗ ਲੋਡ ਹੋਣਗੇ। + ਪਰਦੇਦਾਰੀ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿਚਾਲੇ ਸੰਤੁਲਨ ਹੈ। ਸਫ਼ੇ ਆਮ ਨਾਲੋਂ ਤੇਜ਼ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ। ਸਖ਼ਤ (ਸਿਫਾਰਸ਼ੀ) ਸਖ਼ਤ - ਬਹੁਤੇ ਟਰੈਕਰਾਂ, ਇਸ਼ਤਿਹਾਰ ਤੇ ਪੋਪਅੱਪ ਉੱਤੇ ਰੋਕ ਲਗਾਉਂਦਾ ਹੈ। ਸਫ਼ੇ ਵੱਧ ਤੇਜ਼ੀ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ, ਪਰ ਕੁਝ ਚੀਜ਼ਾਂ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ ਹਨ। - - ਪੱਖ ਲਵੋ + ਹੋਰ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਉਂਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਸਫ਼ੇ ਤੇਜ਼ੀ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ, ਪਰ ਕੁਝ ਸਫ਼ੇ ਸ਼ਾਇਦ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰਨ। + + ਆਪਣੇ ਟੂਲਬਾਰ ਦੀ ਥਾਂ ਚੁਣੋ - ਹੇਠਲੀ ਟੂਲਬਾਰ ਨਾਲ ਇੱਕ-ਹੱਥ ਰਾਹੀਂ ਬਰਾਊਜ਼ ਕਰਕੇ ਵੇਖੋ ਜਾਂ ਇਸ ਨੂੰ ਉੱਤੇ ਲੈ ਜਾਓ। + ਸੌਖੀ ਪਹੁੰਚ ਲਈ ਟੂਲਬਾਰ ਨੂੰ ਰੱਖੋ। ਹੇਠਾਂ ਰੱਖੋ ਜਾਂ ਇਸ ਨੂੰ ਉੱਤੇ ਰੱਖੋ। ਪ੍ਰਾਈਵੇਟ ਢੰਗ ਨਾਲ ਬਰਾਊਜ਼ ਕਰੋ ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> ਅਸੀਂ %s ਨੂੰ ਇੰਝ ਬਣਾਇਆ ਹੈ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਪੂਰਾ ਕੰਟਰੋਲ ਹੋਵੇ ਕਿ ਤੁਸੀਂ ਆਨਲਾਈਨ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ ਅਤੇ ਸਾਡੇ ਨਾਲ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ। @@ -1267,7 +1266,7 @@ ਆਪਣਾ ਸਰੂਪ ਚੁਣੋ - ਗੂੜ੍ਹਾ ਮੋਡ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਕੁਝ ਬੈਟਰੀ ਅਤੇ ਆਪਣੀਆਂ ਅੱਖਾਂ ਨੂੰ ਬਚਾਓ। + ਗੂੜ੍ਹੇ ਢੰਗ ਨਾਲ ਕੁਝ ਬੈਟਰੀ ਅਤੇ ਤੁਹਾਡੀ ਨਿਗ੍ਹਾ ਬਚਦੀ ਹੈ। ਆਪਣੇ-ਆਪ @@ -1322,13 +1321,13 @@ ਸਟੈਂਡਰਡ (ਮੂਲ) - ਕੁਝ ਕੁ ਟਰੈਕਰਾਂ ਉੱਤੇ ਰੋਕ ਲਾਉਂਦਾ ਹੈ। ਸਫ਼ੇ ਆਮ ਵਾਂਗ ਲੋਡ ਹੋਣਗੇ। + ਪਰਦੇਦਾਰੀ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿਚਾਲੇ ਸੰਤੁਲਨ ਹੈ। ਸਫ਼ੇ ਆਮ ਨਾਲੋਂ ਤੇਜ਼ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ। ਮਿਆਰੀ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਰਾਹੀਂ ਕਿਸ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਈ ਜਾਂਦੀ ਹੈ ਸਖ਼ਤ - ਬਹੁਤੇ ਟਰੈਕਰਾਂ, ਇਸ਼ਤਿਹਾਰ ਤੇ ਪੋਪਅੱਪ ਉੱਤੇ ਰੋਕ ਲਗਾਉਂਦਾ ਹੈ। ਸਫ਼ੇ ਵੱਧ ਤੇਜ਼ੀ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ, ਪਰ ਕੁਝ ਚੀਜ਼ਾਂ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ ਹਨ। + ਹੋਰ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਉਂਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਸਫ਼ੇ ਤੇਜ਼ੀ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ, ਪਰ ਕੁਝ ਸਫ਼ੇ ਸ਼ਾਇਦ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰਨ। ਸਖ਼ਤ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਰਾਹੀਂ ਕਿਸ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਈ ਜਾਂਦੀ ਹੈ @@ -1565,6 +1564,36 @@ ਲਾਗਇਨ ਲੜੀਬਧ ਮੇਨੂ + + + ਕਰੈਡਿਟ ਕਾਰਡ + + ਕਾਰਡ ਸੰਭਾਲੋ ਅਤੇ ਆਪਣੇ-ਆਪ ਭਰੋ + + ਡਾਟਾ ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਹੈ + + ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਕਾਰਡਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ + + ਕਰੈਡਿਟ ਕਾਰਡ ਜੋੜੋ + + ਕਾਰਡ ਜੋੜੋ + + ਕਾਰਡ ਦਾ ਨੰਬਰ + + ਮਿਆਦ + + ਕਾਰਡ ਉੱਤੇ ਨਾਂ + + ਕਾਰਡ ਦਾ ਆਮ ਨਾਂ + + ਕਾਰਡ ਨੂੰ ਹਟਾਓ + + ਸੰਭਾਲੋ + + ਸੰਭਾਲੋ + + ਰੱਦ ਕਰੋ + ਖੋਜ ਇੰਜਣ ਜੋੜੋ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 5fe83ac0e..1d146cc41 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1550,6 +1550,19 @@ Menu sortowania danych logowania + + + Karty płatnicze + + + Zachowywanie i automatyczne wypełnianie kart + + Dane są zaszyfrowane + + Synchronizuj karty między urządzeniami + + Dodaj kartę płatniczą + Dodaj wyszukiwarkę diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9c3cb4a26..86aad5ae3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -19,10 +19,6 @@ Suas abas privativas são mostradas aqui. - - Baidu - - JD 1 aba aberta. Toque para alternar abas. @@ -52,7 +48,7 @@ Selecionada - O %1$s é produzido pela @fork-maintainers. + O %1$s é produzido pela Mozilla. @@ -183,6 +179,11 @@ Personalizar leitor + + Adicionar + + Editar + Não foi possível conectar. Esquema de URL não reconhecível. @@ -510,13 +511,13 @@ - Puxar para atualizar + Atualizar página ao deslizar para baixo desde o topo - Deslizar para ocultar a barra de ferramentas + Ocultar barra de ferramentas ao deslizar para cima - Deslizar a barra de ferramentas para o lado para mudar de aba + Mudar de aba ao deslizar a barra de ferramentas para o lado - Deslizar a barra de ferramentas para cima para abrir abas + Abrir abas ao deslizar a barra de ferramentas para cima @@ -974,6 +975,10 @@ Todas as ações Usado recentemente + + Conectado como %1$s + + Entrar para sincronizar Entrar no Sync @@ -1166,9 +1171,6 @@ Boas-vindas ao %s! Já tem uma conta? - - Conheça o %s Veja as novidades Obtenha respostas aqui - - Comece a sincronizar favoritos, senhas e muito mais com sua Conta Firefox. + + Sincronize o Firefox entre dispositivos - Saiba mais + Traga favoritos, histórico e senhas para o Firefox deste dispositivo. @@ -1188,8 +1190,8 @@ Sim, entrar Entrando… - - Entrar no Firefox + + Criar uma conta Permanecer desconectado @@ -1197,26 +1199,23 @@ Falha ao entrar - Privacidade automática - - As configurações de privacidade e segurança bloqueiam rastreadores, código malicioso (malware) e empresas que seguem você. + Privacidade sempre ativa + + O Firefox impede automaticamente que empresas sigam você secretamente pela web. Normal (padrão) - Bloqueia menos rastreadores. As páginas são carregadas normalmente. + Balanceado entre privacidade e desempenho. Páginas são carregadas normalmente. Rigoroso (recomendado) Rigoroso - Bloqueia mais rastreadores, anúncios e notificações. As páginas são carregadas mais rápido, mas algumas coisas podem não funcionar. - - Escolha uma posição + Bloqueia mais rastreadores, assim as páginas carregam mais rápido, mas pode atrapalhar algumas funcionalidades de páginas. + + Escolha a posição da barra de ferramentas - Experimente navegar usando apenas uma mão com a barra de ferramentas embaixo, ou a mova para o alto. + Facilite o alcance à barra de ferramentas. Mantenha embaixo, ou mova para cima. Navegue com privacidade Sua privacidade + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Projetamos o %s para te dar controle sobre o que você compartilha online e o que você compartilha conosco. Leia nosso aviso de privacidade @@ -1245,7 +1244,7 @@ Escolha um tema - Se quiser poupar sua vista e economizar bateria, use o modo escuro. + Poupe sua vista e economize bateria com o modo escuro. Automático @@ -1304,13 +1303,13 @@ Normal (padrão) - Bloqueia menos rastreadores. As páginas são carregadas normalmente. + Balanceado entre privacidade e desempenho. Páginas são carregadas normalmente. O que é bloqueado pela proteção normal contra rastreamento Rigoroso - Bloqueia mais rastreadores, anúncios e notificações. As páginas são carregadas mais rápido, mas algumas coisas podem não funcionar. + Bloqueia mais rastreadores, assim as páginas carregam mais rápido, mas pode atrapalhar algumas funcionalidades de páginas. O que é bloqueado pela proteção rigorosa contra rastreamento @@ -1546,6 +1545,37 @@ Menu de ordenação de contas + + + Cartões de crédito + + Salvar e preencher cartões automaticamente + + Os dados são criptografados + + Sincronizar cartões entre dispositivos + + Adicionar cartão de crédito + + + Adicionar cartão + + Número do cartão + + Data de validade + + Nome no cartão + + Apelido do cartão + + Excluir cartão + + Salvar + + Salvar + + Cancelar + Adicionar mecanismo de pesquisa diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 882fd490d..39d57f717 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -20,10 +20,6 @@ Os seus separadores privados serão mostrados aqui. - - Baidu - - JD 1 separador aberto. Toque para mudar de separador. @@ -183,6 +179,11 @@ Personalizar a vista de leitura + + Adicionar + + Editar + Não foi possível ligar. Esquema do endereço não reconhecido. @@ -1168,9 +1169,6 @@ Bem-vindo ao %s! Já tem uma conta? - - Conheça o %s Veja as novidades Obtenha respostas aqui - - Comece a sincronizar os marcadores, palavras-passe e muito mais com a sua conta Firefox. + + Sincronizar o Firefox entre dispositivos - Saber mais + Traga os marcadores, histórico e palavras-passe para o Firefox neste dispositivo. @@ -1191,8 +1189,8 @@ Sim, iniciar sessão A iniciar a sessão… - - Iniciar sessão no Firefox + + Registar Permanecer sem sessão iniciada @@ -1201,26 +1199,23 @@ Falha ao iniciar sessão - Privacidade automática - - As configurações de privacidade e de segurança bloqueiam rastreadores, software malicioso e empresas que o monitorizam. + Privacidade sempre ativa + + O Firefox impede automaticamente que as empresas o sigam secretamente pela Internet. Padrão (predefinição) - Bloqueia menos rastreadores. As páginas serão carregadas normalmente. + Equilibrado para privacidade e desempenho. As páginas serão carregadas normalmente. Rigorosa (recomendado) Rigoroso - Bloqueia mais rastreadores, anúncios e pop-ups. As páginas são carregadas mais rapidamente, mas algumas funcionalidades poderão não funcionar. - - Escolha uma posição + Bloqueia mais rastreadores para que as páginas carreguem mais rapidamente, mas algumas funcionalidades das páginas podem ser perdidas. + + Escolha o posicionamento da barra de ferramentas - Experimente navegar com uma mão com a barra de ferramentas em baixo ou mova-a para o topo. + Facilite o acesso à barra de ferramentas. Mantenha a mesma na parte inferior ou mova-a para cima. Navegue em privado A sua privacidade + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Nós desenhámos o %s para lhe dar mais controlo sobre o que partilha online e o que partilha connosco. Leia a nossa política de privacidade @@ -1248,7 +1243,7 @@ Escolha o seu tema - Economize bateria e a sua visão ativando o modo escuro. + Economize bateria e a sua visão com o modo escuro. Automático @@ -1305,13 +1300,13 @@ Padrão (predefinição) - Bloqueia menos rastreadores. As páginas serão carregadas normalmente. + Equilibrado para privacidade e desempenho. As páginas serão carregadas normalmente. O que é bloqueado pela proteção padrão contra a monitorização Rigorosa - Bloqueia mais rastreadores, anúncios e pop-ups. As páginas são carregadas mais rapidamente, mas algumas funcionalidades poderão não funcionar. + Bloqueia mais rastreadores para que as páginas carreguem mais rapidamente, mas algumas funcionalidades das páginas podem ser perdidas. O que é bloqueado pela proteção rigorosa contra a monitorização @@ -1550,6 +1545,37 @@ Menu de ordenação de credenciais + + + Cartões de crédito + + Guardar e preencher automaticamente cartões + + Os dados são encriptados + + Sincronizar cartões entre dispositivos + + Adicionar cartão de crédito + + + Adicionar cartão + + Número do cartão + + Data de expiração + + Nome no cartão + + Nome alternativo do cartão + + Eliminar cartão + + Guardar + + Guardar + + Cancelar + Adicionar motor de pesquisa diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index c996dbdcb..14fb6397b 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -1547,6 +1547,18 @@ Zavrar il menu da las datas d\'annunzia + + + Cartas da credit + + Emplenir automaticamain las datas da la carta da credit + + Las datas èn criptadas + + Sincronisar las cartas tranter ils apparats + + Agiuntar ina carta da credit + Agiuntar ina maschina da tschertgar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index be9d8929f..0c1e83349 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1602,6 +1602,18 @@ Меню сортировки логинов + + + Банковские карты + + Сохранять и автоматически заполнять данные карт + + Данные зашифрованы + + Синхронизировать карты между различными устройствами + + Добавить банковскую карту + Добавление поисковой системы diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 5a6d40324..5e7cc4db1 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -183,6 +183,8 @@ Vzhľad + + Prispôsobiť zobrazenie čítačky Nedá sa pripojiť. Nerozpoznaná forma URL. @@ -265,7 +267,7 @@ Heslá - Kreditné karty a adresy + Platobné karty a adresy Nastaviť ako predvolený prehliadač @@ -1549,6 +1551,18 @@ Zoradiť ponuku prihlasovacích údajov + + + Platobné karty + + Ukladať a automaticky dopĺňať údaje o platobných kartách + + Údaje sú šifrované + + Synchronizovať karty naprieč zariadeniami + + Pridať platobnú kartu + Pridať vyhľadávací modul diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 7bcfaa4dc..265b360a2 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -20,10 +20,6 @@ Tu bodo prikazani vaši zasebni zavihki. - - Baidu - - JD 1 odprt zavihek. Tapnite za preklop zavihkov. @@ -183,6 +179,11 @@ Prilagodi bralni pogled + + Dodaj + + Uredi + Povezava ni mogoča. Neprepoznavna URL shema. @@ -1178,9 +1179,6 @@ Dobrodošli v %s! Že imate račun? - - Spoznajte %s Kaj je novega Tukaj poiščite odgovore - - Začnite sinhronizirati zaznamke, gesla in ostalo s Firefox Računom. - - Več o tem @@ -1200,35 +1194,18 @@ Da, prijavi me Prijavljanje … - - Prijavite se v Firefox Ostanite odjavljeni Sync je vklopljen Prijava ni uspela - - Samodejna zasebnost - - Nastavitve zasebnosti in varnosti zavračajo sledilce, zlonamerno programsko opremo in podjetja, ki vam sledijo. Običajno (privzeto) - - Zavrača manj sledilcev. Strani se bodo normalno nalagale. Strogo (priporočljivo) Strogo - - Zavrača več sledilcev, oglasov in pojavnih oken. Strani se nalagajo hitreje, vendar nekatere možnosti morda ne bodo delovale. - - Zavzemite položaj - - Poskusite enoročno brskanje z orodno vrstico spodaj ali pa jo premaknite na vrh. Brskajte zasebno + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s smo zasnovali tako, da vam omogočimo nadzor nad tem, kaj delite na spletu in kaj delite z nami. Preberite naše obvestilo o zasebnosti @@ -1255,8 +1232,6 @@ Izberite si temo - - Prihranite nekaj baterije in ne obremenjujte oči s temnim načinom. Samodejno @@ -1311,14 +1286,10 @@ Več o tem Običajno (privzeto) - - Zavrača manj sledilcev. Strani se bodo normalno nalagale. Kaj je zavrnjeno s standardno zaščito pred sledenjem Strogo - - Zavrača več sledilcev, oglasov in pojavnih oken. Strani se nalagajo hitreje, vendar nekatere možnosti morda ne bodo delovale. Kaj je zavrnjeno s strogo zaščito pred sledenjem @@ -1559,6 +1530,33 @@ Meni razvrščanja prijav + + + Kreditne kartice + + Podatki so šifrirani + + Sinhroniziraj kartice med napravami + + Dodaj kreditno kartico + + + Dodaj kartico + + Številka kartice + + Datum poteka + + Ime na kartici + + Izbriši kartico + + Shrani + + Shrani + + Prekliči + Dodaj iskalnik diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 8df0287d8..17143694e 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -18,10 +18,6 @@ Skedat tuaja private do të shfaqen këtu. - - Baidu - - JD 1 skedë e hapur. Prekeni që të ndërroni skeda. @@ -179,6 +175,13 @@ Dukje + + Përshtatni pamjen e Lexuesit + + Shtoni + + Përpunoni + S’arrihet të lidhet. Skemë URL jo e pranuar. @@ -215,6 +218,11 @@ Mësoni më tepër + + Kërko me %s + + Kërkoni drejt e nga shtylla e adresave + Hapni një skedë të re Firefox @@ -883,16 +891,22 @@ On Off - + Lejo audio dhe video + + Lejo audio dhe video Blloko audio dhe video vetëm nga të dhëna rrjeti celular Audio dhe video do të luhen nën Wi-Fi - + Blloko vetëm audio - + + Blloko vetëm audio + Blloko audio dhe video + + Blloko audio dhe video On @@ -958,8 +972,12 @@ Krejt veprimet Përdorur së fundi + + Futur si %1$s + + Që të njëkohësoni, bëni hyrjen - Që të Njëkohësoni, bëni hyrjen + Për Njëkohësim, bëni hyrjen Dërgoje te krejt pajisjet @@ -1151,9 +1169,6 @@ Mirë se vini te %s! Keni tashmë një llogari? - - Njihuni me %s Shihni ç’ka të re Merrni përgjigje këtu - - Filloni të njëkohësoni faqerojtës, fjalëkalime, etj, me llogarinë tuaj Firefox. + + Njëkohësoni Firefox-in mes pajisjesh - Mësoni më tepër + Sillni te Firefox-i në këtë pajisje faqerojtës, historik dhe fjalëkalime. @@ -1173,8 +1188,8 @@ Po, futmë Po hyhet… - - Hyni në Firefox + + Regjistrohuni Qëndro i dalë @@ -1182,26 +1197,23 @@ S’u arrit të hyhej - Privatësi e vetvetishme - - Rregullimet e privatësisë dhe sigurisë bllokojnë gjurmues, malware, dhe shoqëri që ju ndjekin. + Privatësi gjithnjë në punë + + Firefox-i ndal automatikisht shoqëri t’ju ndjekin fshehtazi nëpër internet. Standarde (parazgjedhje) - Bllokon më pak gjurmues. Faqet do të ngarkohen normalisht. + I baraspeshuar për privatësi dhe funksionim. Faqet do të ngarkohen normalisht. Strikte (e këshilluar) Strikte - Bllokon më shumë gjurmues, reklama dhe flluska. Faqet ngarkohen më shpejt, por disa anë mund të mos punojnë. - - Zini një pozicion + Bllokon më shumë gjurmues, ndaj faqet ngarkohen më shpejt, por disa anë, pjesë e faqes, mund të mos punojnë. + + Zgjidhni vendosjen e panelit tuaj - Provoni shfletim me një dorë, me panelin në fund, ose ngjiteni sipër. + Vendoseni panelin diku ku e përdorni kollaj. Mbajeni në fund, ose kalojeni në krye. Shfletoni privatisht Privatësia juaj + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> E kemi hartuar %s për t’ju dhënë kontroll mbi ç’ndani me të tjerë në internet dhe ç’ndani me ne. Lexoni shënimin tonë mbi privatësinë @@ -1229,7 +1241,7 @@ Zgjidhni temën tuaj - Kurseni pak bateri dhe shikimin tuaj, duke aktivizuar mënyrën e errët. + Kurseni pak bateri dhe shikimin tuaj, me mënyrën e errët. Vetvetiu @@ -1286,13 +1298,13 @@ Standarde (parazgjedhje) - Bllokon më pak gjurmues. Faqet do të ngarkohen normalisht. + I baraspeshuar për privatësi dhe funksionim. Faqet do të ngarkohen normalisht. Ç’bllokohet nga mbrojtje standarde kundër gjurmimit Strikte - Bllokon më shumë gjurmues, reklama dhe flluska. Faqet ngarkohen më shpejt, por disa anë mund të mos punojnë. + Bllokon më shumë gjurmues, ndaj faqet ngarkohen më shpejt, por disa anë, pjesë e faqes, mund të mos punojnë. Ç’bllokohet nga mbrojtje strikte kundër gjurmimit @@ -1441,7 +1453,7 @@ Rilidhu - Bëni hyrjen që të Njëkohësoni + Për Njëkohësim, bëni hyrjen Kredenciale hyrjesh të ruajtur @@ -1529,6 +1541,36 @@ Renditni menu kredencialesh + + + Karta krediti + + Ruaj dhe plotësoni vetvetiu të dhëna kartash + + Të dhënat janë të fshehtëzuara + + Njëkohëso të dhëna kartash mes pajisjesh + + Shtoni kartë krediti + + Shtoni kartë + + Numër Karte + + Datë Skadimi + + Emër në Kartë + + Nofkë Karte + + Fshije kartën + + Ruaje + + Ruaje + + Anuloje + Shtoni motor kërkimesh @@ -1664,7 +1706,7 @@ Shihni një listë skedash nga pajisje tuajat të tjera. - Bëni hyrjen që të sjëkohësoni + Për njëkohësim, bëni hyrjen S’ka skeda të hapura diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e4a6bc50d..1dec857e9 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -179,6 +179,8 @@ Изглед + + Прилагоди приказ за читање Није могуће повезивање. Непозната URL шема. @@ -1548,6 +1550,18 @@ Сортирај мени пријава + + + Кредитне картице + + Сачувај и аутоматски попуни поља картице + + Подаци су шифровани + + Синхронизуј картице на уређајима + + Додај кредитну картицу + Додај претраживач diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 4dc5c7319..95c4a51ef 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -179,6 +179,8 @@ Pidangan + + Robah panémbong pamaca Teu bisa nyambung. Skéma URL teu dipikawanoh. @@ -1556,6 +1558,18 @@ Runtuykeun menu login + + + Kartu kiridit + + Simpen jeung otongeusi kartu + + Data diénkrip + + Singkronkeun kartu di sakabeh parabot + + Tambah kartu kiridit + Tambah mesin pamaluruh diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 6edd64c30..ac20575f7 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -20,10 +20,6 @@ Dina privata flikar kommer att visas här. - - Baidu - - JD 1 öppen flik. Tryck för att växla mellan flikar. @@ -53,7 +49,7 @@ Markerad - %1$s produceras av @fork-maintainers. + %1$s produceras av Mozilla. @@ -187,6 +183,11 @@ Anpassa läsvyn + + Lägg till + + Redigera + Kan inte ansluta. Oigenkännligt URL-schema. @@ -985,6 +986,10 @@ Alla åtgärder Nyligen använd + + Inloggad som %1$s + + Logga in för att synkronisera Logga in till Sync @@ -1183,9 +1188,6 @@ Välkommen till %s! Har du redan ett konto? - - Lär känna %s Se vad som är nytt Få svar här - - Börja synkronisera bokmärken, lösenord och mer med ditt Firefox-konto. + + Synkronisera Firefox mellan enheter - Läs mer + Ta med bokmärken, historik och lösenord till Firefox på den här enheten. @@ -1205,9 +1207,9 @@ Ja, logga in mig Loggar in… - - Logga in till Firefox + + Registrera dig Håll mig utloggad @@ -1215,26 +1217,23 @@ Det gick inte att logga in - Automatisk integritet - - Sekretess- och säkerhetsinställningar blockerar spårare, skadlig programvara och företag som följer dig. + Alltid med integritet + + Firefox hindrar automatiskt företag från att i hemlighet följa dig på nätet. Standard - Blockerar färre spårare. Sidor laddas normalt. + Balanserad för integritet och prestanda. Sidor laddas normalt. Strikt (rekommenderas) Strikt - Blockerar fler spårare, annonser och popup-fönster. Sidor laddas snabbare, men vissa funktioner fungerar kanske inte. - - Välj en sida + Blockerar fler spårare så att sidor laddas snabbare, men vissa sidor kanske inte fungerar ordentligt. + + Välj plats för verktygsfältet - Försök att surfa med en hand med det nedre verktygsfältet eller flytta det till toppen. + Placera verktygsfältet inom räckhåll. Ha den på botten eller flytta den till toppen. Surfa privat @@ -1248,7 +1247,7 @@ Din integritet + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Vi har utformat %s för att ge dig kontroll över vad du delar online och vad du delar med oss. Läs vår sekretesspolicy @@ -1263,7 +1262,7 @@ Välj ditt tema - Spara lite batteri och syn genom att aktivera mörkt läge. + Spara lite batteri och syn med mörkt läge. Automatisk @@ -1319,13 +1318,13 @@ Standard - Blockerar färre spårare. Sidor laddas normalt. + Balanserad för integritet och prestanda. Sidor laddas normalt. Vad blockeras av spårningsskydd standard Strikt - Blockerar fler spårare, annonser och popup-fönster. Sidor laddas snabbare, men vissa funktioner fungerar kanske inte. + Blockerar fler spårare så att sidor laddas snabbare, men vissa sidor kanske inte fungerar ordentligt. Vad blockeras av spårningsskydd strikt @@ -1560,6 +1559,37 @@ Sortera inloggningsmenyn + + + Kreditkort + + Spara och fyll i kreditkort automatiskt + + Data är krypterad + + Synkronisera kort mellan enheter + + Lägg till kreditkort + + + Lägg till kreditkort + + Kortnummer + + Utgångsdatum + + Namn på kort + + Smeknamn för kort + + Ta bort kort + + Spara + + Spara + + Avbryt + Lägg till sökmotor diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index af1b29dbe..7b9274538 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -18,10 +18,6 @@ Варақаҳои махфии шумо дар ин ҷо нишон дода мешаванд. - - Baidu - - JD 1 варақаи кушодашуда. Барои гузариш байни варақаҳо зарба занед. @@ -183,6 +179,11 @@ Фармоишдиҳии намоиши хониш + + Илова кардан + + Таҳрир кардан + Пайваст нашуд. Нақшаи URL шинохтанашаванда аст. @@ -416,9 +417,9 @@ Огоҳиномаҳо дар бораи варақаҳое, ки аз дигар дастгоҳҳои Firefox гирифта шудаанд. - Рарақаи қабулшуда + Варақаи қабулшуда - Рарақаҳои қабулшуда + Варақаҳои қабулшуда Варақа аз %s @@ -973,6 +974,10 @@ Ҳамаи амалҳо Истифодашудаи охирин + + Ҳамчун %1$s ворид шуд + + Барои ҳамоҳангсозӣ ворид шавед Барои ҳамоҳангсозӣ ворид шавед @@ -1138,32 +1143,32 @@ - Нашри Firefox-и «Пешнамоиш» акнун Firefox-и «Ҳаршабона» шуд + Нашри Firefox-и «Пешнамоиш» акнун Firefox-и «Ҳаршабонарӯзӣ» шуд - Firefox-и «Ҳаршабона» ҳар шаб навсозӣ мешавад ва хусусиятҳои нави таҷрибавиро дар бар мегирад. + Firefox-и «Ҳаршабонарӯзӣ» ҳар шаб навсозӣ мешавад ва хусусиятҳои нави таҷрибавиро дар бар мегирад. Аммо, он метавонад ноустувор бошад. Барои ба даст овардани таҷрибаи устувор, браузери «бета»-ро боргирӣ намоед. «Firefox»-ро барои «Android Beta» ба даст оред - Нашри Firefox-и «Ҳаршабона» интиқол дода шуд + Нашри Firefox-и «Ҳаршабонарӯзӣ» интиқол дода шуд - Ин барнома дигар навсозиҳои амниятиро қабул намекунад. Истифодаи ин барномаро қатъ кунед ва ба нашри нави «Ҳаршабона» гузаред. + Ин барнома дигар навсозиҳои амниятиро қабул намекунад. Истифодаи ин барномаро қатъ кунед ва ба нашри нави «Ҳаршабонарӯзӣ» гузаред. \n\nБарои интиқол додани хатбаракҳо, воридшавиҳо ва таърихи худ ба барномаи дигар, ҳисоби Firefox-ро эҷод намоед. - Ба нашри нави «Ҳаршабона» гузаред + Ба нашри нави «Ҳаршабонарӯзӣ» гузаред - Нашри Firefox-и «Ҳаршабона» интиқол дода шуд + Нашри Firefox-и «Ҳаршабонарӯзӣ» интиқол дода шуд - Ин барнома дигар навсозиҳои амниятиро қабул намекунад. Нашри нави «Ҳаршабона»-ро ба даст оред ва истифодаи ин барномаро қатъ кунед. + Ин барнома дигар навсозиҳои амниятиро қабул намекунад. Нашри нави «Ҳаршабонарӯзӣ»-ро ба даст оред ва истифодаи ин барномаро қатъ кунед. \n\nБарои интиқол додани хатбаракҳо, воридшавиҳо ва таърихи худ ба барномаи дигар, ҳисоби Firefox-ро эҷод намоед. - Нашри «Ҳаршабона»-и навро ба даст оред + Нашри «Ҳаршабонарӯзӣ»-и навро ба даст оред Аллакай ҳисобе доред? - - Бо %s шинос шавед Бинед, ки чӣ нав аст Ҷавобҳоро дар ин ҷо гиред - - Ба воситаи ҳисоби Firefox-и худ ҳамоҳангсозии хатбаракҳо, ниҳонвожаҳо ва чизҳои дигарро оғоз кунед. + + Firefox-ро байни дастгоҳҳо ҳамоҳанг кунед - Маълумоти бештар + Хатбаракҳо, таърих ва ниҳонвожаҳоро ба Firefox дар ин дастгоҳ интиқол диҳед. @@ -1193,8 +1195,8 @@ Ҳа, маро ворид кунед Ворид шуда истодааст… - - Ба Firefox ворид шавед + + Бақайдгирӣ Вориднашуда истад @@ -1202,26 +1204,23 @@ Воридшавӣ иҷро нашуд - Махфияти худкор - - Танзимоти махфият ва амният васоити пайгирӣ, барномаҳои зараровар ва ширкатҳоеро, ки шуморо пайгирӣ мекунанд, маҳдуд мекунад. + Махфияти доимӣ + + Firefox маъракаҳоеро ба таври худкор қатъ мекунад, ки шуморо дар атрофи веб пинҳонӣ пайгирӣ мекунанд. Стандартӣ (пешфарз) - Баъзеи васоити пайгириро маҳдуд мекунад. Саҳифаҳо ба таври муқаррар бор карда мешаванд. + Мутаносиб барои махфият ва самаранокӣ. Саҳифаҳо ба таври муқаррар бор карда мешаванд. Ҷиддӣ (тавсия дода мешавад) Ҷиддӣ - Васоити пайгирӣ, реклама ва равзанаҳои зоҳиршавандаи бештарро маҳдуд мекунад. Саҳифаҳо зудтар бор мешаванд, аммо баъзеи функсияҳо метавонанд кор накунанд. - - Интихоб кунед + Васоити пайгирии бештарро қатъ мекунад, то ки саҳифаҳо тезтар кушода шаванд, аммо баъзеи функсияҳои саҳифа метавонанд вайрон шаванд. + + Ҷойгиркунии навори абзорҳои худро интихоб кунед - Тамошокуниро бо як даст тавассути навори абзорҳои поён кӯшиш кунед ё ин ки наворро ба боло гузоред. + Навори абзорҳоро барои дастрасии осон дар наздикӣ ҷойгир намоед. Онро дар поён нигоҳ доред ё ба боло гузоред. Реҷаи тамошокунии махфӣ Махфияти шумо + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Мо %s-ро ҳамин тавр тарҳрезӣ кардаем, ки шумо тавонед он чизҳоеро, ки дар онлайн ва бо мо мубодила мекунед, идора намоед. Огоҳиномаи махфияти моро хонед @@ -1248,7 +1247,7 @@ Мавзӯи худро интихоб кунед - Бо фаъол кардани реҷаи торик барқи батареяро сарфа кунед ва биноии худро ҳифз намоед. + Ба воситаи реҷаи торик барқи батареяро сарфа кунед ва биноии худро ҳифз намоед. Худкор @@ -1303,13 +1302,13 @@ Стандартӣ (пешфарз) - Баъзеи васоити пайгириро маҳдуд мекунад. Саҳифаҳо ба таври муқаррар бор карда мешаванд. + Мутаносиб барои махфият ва самаранокӣ. Саҳифаҳо ба таври муқаррар бор карда мешаванд. Ба воситаи муҳофизати стандартӣ аз пайгирӣ чӣ баста шудааст Ҷиддӣ - Васоити пайгирӣ, реклама ва равзанаҳои зоҳиршавандаи бештарро маҳдуд мекунад. Саҳифаҳо зудтар бор мешаванд, аммо баъзеи функсияҳо метавонанд кор накунанд. + Васоити пайгирии бештарро қатъ мекунад, то ки саҳифаҳо тезтар кушода шаванд, аммо баъзеи функсияҳои саҳифа метавонанд вайрон шаванд. Ба воситаи муҳофизати ҷиддӣ аз пайгирӣ чӣ баста шудааст @@ -1545,6 +1544,38 @@ Мураттаб кардани менюи воридшавиҳо + + + Кортҳои насия + + Нигоҳ доштан ва ба таври худкор пур кардани кортҳо + + Маълумот рамзгузорӣ карда шуд + + Ҳамоҳанг кардани кортҳо байни дастгоҳҳо + + Илова кардани корти насия + + + Илова кардани корт + + Рақами корт + + Санаи анҷоми муҳлат + + Ном дар корт + + Номи корбари корт + + + Нест кардани корт + + Нигоҳ доштан + + Нигоҳ доштан + + Бекор кардан + Илова кардани низоми ҷустуҷӯӣ diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index fd57935fc..dcb35ef51 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -19,10 +19,6 @@ แท็บส่วนตัวของคุณจะถูกแสดงที่นี่ - - Baidu - - JD 1 แท็บที่เปิด แตะเพื่อสลับไปยังแท็บ @@ -179,6 +175,13 @@ ลักษณะที่ปรากฏ + + ปรับแต่งมุมมองผู้อ่าน + + เพิ่ม + + แก้ไข + ไม่สามารถเชื่อมต่อได้เนื่องจากเป็นรูปแบบ URL ที่ไม่รู้จัก @@ -1161,9 +1164,6 @@ ยินดีต้อนรับสู่ %s! มีบัญชีอยู่แล้ว? - - ทำความรู้จัก %s ดูว่ามีอะไรใหม่ พบคำตอบได้ที่นี่ - - เริ่มซิงค์ที่คั่นหน้า รหัสผ่าน และอื่น ๆ ด้วยบัญชี Firefox ของคุณ + + ซิงค์ Firefox ระหว่างอุปกรณ์ - เรียนรู้เพิ่มเติม + นำที่คั่นหน้า ประวัติ และรหัสผ่านไปยัง Firefox บนอุปกรณ์นี้ @@ -1183,8 +1183,8 @@ ใช่ ให้ฉันลงชื่อเข้า กำลังลงชื่อเข้า… - - ลงชื่อเข้าไปยัง Firefox + + ลงทะเบียน ลงชื่อออกต่อไป @@ -1192,26 +1192,13 @@ ไม่สามารถเข้าสู่ระบบ - ความเป็นส่วนตัวอัตโนมัติ - - ตั้งค่าความเป็นส่วนตัวและความปลอดภัยป้องกันตัวติดตาม มัลแวร์ และบริษัทที่ตามคุณ + ความเป็นส่วนตัวตลอดเวลา มาตรฐาน (ค่าเริ่มต้น) - - ปิดกั้นตัวติดตามน้อยลง หน้าเว็บจะโหลดตามปกติ เข้มงวด (แนะนำ) เข้มงวด - - ปิดกั้นตัวติดตาม โฆษณา และป๊อปอัปมากขึ้น เว็บโหลดเร็วขึ้น แต่ฟังก์ชั่นบางอย่างอาจไม่ทำงาน - - เลือกตำแหน่ง - - ลองใช้การเรียกดูด้วยมือเดียวด้วยแถบเครื่องมือด้านล่างหรือย้ายไปด้านบน เรียกดูอย่างเป็นส่วนตัว ความเป็นส่วนตัวของคุณ + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> เราได้ออกแบบ %s เพื่อให้คุณสามารถควบคุมสิ่งที่คุณต้องการแบ่งปันออนไลน์และสิ่งที่คุณต้องการแบ่งปันกับเราได้ อ่านประกาศความเป็นส่วนตัวของเรา @@ -1238,8 +1225,6 @@ เลือกชุดตกแต่งของคุณ - - ประหยัดแบตเตอรี่และถนอมสายตาของคุณโดยเปิดใช้งานโหมดมืด อัตโนมัติ @@ -1294,14 +1279,10 @@ เรียนรู้เพิ่มเติม มาตรฐาน (ค่าเริ่มต้น) - - ปิดกั้นตัวติดตามน้อยลง หน้าเว็บจะโหลดตามปกติ สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบมาตรฐาน เข้มงวด - - ปิดกั้นตัวติดตาม โฆษณา และป๊อปอัปมากขึ้น เว็บโหลดเร็วขึ้น แต่ฟังก์ชั่นบางอย่างอาจไม่ทำงาน สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบเข้มงวด @@ -1538,6 +1519,37 @@ เรียงเมนูเข้าสู่ระบบ + + + บัตรเครดิต + + บันทึกและเติมข้อมูลบัตรอัตโนมัติ + + ข้อมูลถูกเข้ารหัส + + ซิงค์บัตรระหว่างอุปกรณ์ + + เพิ่มบัตรเครดิต + + + เพิ่มบัตร + + หมายเลขบัตร + + วันหมดอายุ + + ชื่อบนบัตร + + ชื่อย่อบัตร + + ลบบัตร + + บันทึก + + บันทึก + + ยกเลิก + เพิ่มเครื่องมือค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cc9cdc8df..b49cf708f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -20,10 +20,6 @@ Gizli sekmeleriniz burada gösterilecek. - - Baidu - - JD 1 açık sekme. Sekme değiştirmek için dokunun. @@ -53,7 +49,7 @@ Seçildi - %1$s bir @fork-maintainers ürünüdür. + %1$s bir Mozilla ürünüdür. @@ -183,6 +179,11 @@ Okuyucu görünümünü özelleştir + + Ekle + + Düzenle + Bağlanılamıyor. Tanınmayan URL şeması. @@ -975,6 +976,8 @@ Tüm eylemler Son kullanılanlar + + Eşitlemek için giriş yap Sync’e giriş yap @@ -1167,9 +1170,6 @@ %s’a hoş geldiniz! Zaten hesabınız var mı? - - %s ile tanışın Yenilikleri görün Yanıtlar burada - - Firefox hesabınızla yer imlerinizi, parolalarınızı ve daha fazlasını eşitlemeye başlayın. + + Firefox’u cihazlar arasında eşitleyin - Daha fazla bilgi al + Yer imlerinizi, geçmişinizi ve parolalarınızı bu cihazdaki Firefox’a taşıyın. @@ -1189,8 +1189,8 @@ Evet, giriş yap Giriş yapılıyor… - - Firefox’a giriş yap + + Kaydol Giriş yapma @@ -1198,26 +1198,21 @@ Giriş başarısız - Otomatik gizlilik - - Gizlilik ve güvenlik ayarları; takipçileri, kötü amaçlı yazılımları ve sizi takip eden şirketleri engeller. + Sürekli gizlilik + + Firefox, şirketlerin sizi web’de gizlice takip etmesini otomatik olarak engeller. Standart (varsayılan) - Daha az takipçiyi engeller. Sayfalar normal şekilde yüklenir. + Dengeli gizlilik ve performans. Sayfalar normal şekilde yüklenir. Sıkı (önerilen) Sıkı - - Daha fazla takipçiyi, reklamı ve açılır pencereyi engeller. Sayfalar daha hızlı yüklenir ama bazı işlevler çalışmayabilir. - - Tarafınızı seçin + + Araç çubuğu konumunu seçin - Araç çubuğunun altta olması tek elle gezinmeyi kolaylaştırır ama çubuğu üste de taşıyabilirsiniz. + Araç çubuğunu kolayca erişilebileceğiniz bir yere koyun. Altta tutabilir veya en üste taşıyabilirsiniz. Daha gizli gezinin Gizliliğiniz + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s, internette başkalarıyla ve bizimle neleri paylaşacağınızın kontrolünü size verir. Gizlilik bildirimimizi okuyun @@ -1245,7 +1240,7 @@ Temanızı seçin - Koyu modu etkinleştirerek pilden tasarruf ederken gözlerinizi rahatlatabilirsiniz. + Koyu mod sayesinde pilden tasarruf ederken gözlerinizi rahatlatabilirsiniz. Otomatik @@ -1301,13 +1296,11 @@ Standart (varsayılan) - Daha az takipçiyi engeller. Sayfalar normal şekilde yüklenir. + Dengeli gizlilik ve performans. Sayfalar normal şekilde yüklenir. Standart izlenme korumasında neler engellenir? Sıkı - - Daha fazla takipçiyi, reklamı ve açılır pencereyi engeller. Sayfalar daha hızlı yüklenir ama bazı işlevler çalışmayabilir. Sıkı izlenme korumasında neler engellenir? @@ -1543,6 +1536,37 @@ Hesapları sırala menüsü + + + Kredi kartları + + Kartları kaydedip otomatik doldur + + Veriler şifrelenir + + Kartları cihazlar arasında eşitle + + Kredi kartı ekle + + + Kart ekle + + Kart numarası + + Son kullanma tarihi + + Kart üzerindeki ad + + Kart adı + + Kartı sil + + Kaydet + + Kaydet + + İptal + Arama motoru ekle diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 984dc782d..8116e523f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -19,10 +19,6 @@ Тут зʼявлятимуться ваші приватні вкладки. - - Baidu - - JD 1 відкрита вкладка. Торкніться, щоб перемкнути вкладки. @@ -52,7 +48,7 @@ Вибрано - %1$s розроблено @fork-maintainers. + %1$s розроблено Mozilla. @@ -88,14 +84,14 @@ Перейти до налаштувань - Закрити + Відхилити Налаштуйте автоматичне закривання відкритих вкладок, які не переглядалися попереднього дня, тижня чи місяця. Перейти до параметрів - Закрити + Відхилити Змініть вигляд відкритих вкладок. Перейдіть до налаштувань і виберіть подання вкладок сіткою. @@ -184,6 +180,12 @@ Налаштувати режим читача + + + Додати + + Редагувати + Неможливо з’єднатися. Невідома схема URL-адреси. @@ -567,7 +569,7 @@ Показати всю історію - %d вкладок + Вкладок: %d %d вкладка @@ -983,6 +985,10 @@ Недавно використані + + Ви увійшли як %1$s + + Увійти до синхронізації Увійти до Синхронізації @@ -1175,9 +1181,6 @@ Вітаємо в %s! Вже маєте обліковий запис? - - Познайомтеся з %s Погляньте, що нового Отримайте відповіді тут - - Почніть синхронізувати закладки, паролі та інші дані з обліковим записом Firefox. + + Синхронізуйте Firefox між пристроями - Докладніше + Перенесіть свої закладки, історію та паролі у Firefox на цей пристрій. @@ -1198,8 +1201,8 @@ Так, увійти Вхід… - - Увійти в Firefox + + Зареєструватись Не входити @@ -1208,26 +1211,23 @@ Не вдалося увійти - Автоматичний захист приватності - - Налаштування приватності та безпеки блокують елементи стеження, зловмисне програмне забезпечення та стеження компаній за вами. + Постійна приватність + + Firefox автоматично блокує таємне стеження компаній за вами в Інтернеті. Стандартний (типово) - Блокує менше елементів стеження. Сторінки завантажуватимуться нормально. + Баланс приватності та швидкодії. Сторінки завантажуються нормально. Надійний (рекомендовано) Надійний - Блокує більше елементів стеження, реклами та виринаючих вікон. Сторінки завантажуються швидше, але деякі функції можуть не працювати. - - Зробіть вибір + Блокує більше стеження, тому сторінки завантажуються швидше, однак можливі порушення їх роботи. + + Оберіть розташування панелі інструментів - Спробуйте керування однією рукою завдяки нижньому розташуванню панелі, або перемістіть її вгору. + Розташуйте панель для легкого доступу. Тримайте її внизу, або перемістіть вгору. Переглядайте приватно @@ -1242,7 +1242,7 @@ Ваша приватність + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Ми створили %s, щоб надати вам контроль над тим, чим ви ділитесь в Інтернеті та з нами. Повідомлення про приватність @@ -1257,7 +1257,7 @@ Оберіть тему - Заощадьте заряд акумулятора і збережіть свої очі, увімкнувши темний режим. + Заощадьте заряд акумулятора і збережіть свої очі з темним режимом. Автоматично @@ -1313,13 +1313,13 @@ Стандартний (типово) - Блокує менше елементів стеження. Сторінки завантажуються нормально. + Баланс приватності та швидкодії. Сторінки завантажуються нормально. Що блокується стандартним рівнем захисту від стеження Надійний - Блокує більше елементів стеження, реклами та виринаючих вікон. Сторінки завантажуються швидше, але деякі функції можуть не працювати. + Блокує більше стеження, тому сторінки завантажуються швидше, однак можливі порушення їх роботи. Що блокується надійним рівнем захисту від стеження @@ -1422,7 +1422,7 @@ 1 вкладка - %d вкладок + Вкладок: %d @@ -1557,6 +1557,37 @@ Меню впорядкування паролів + + + Кредитні картки + + Зберігати та автоматично заповнювати картки + + Дані зашифровано + + Синхронізувати картки між пристроями + + Додати кредитну картку + + + Додати картку + + Номер картки + + Термін дії + + Ім’я на картці + + Псевдонім картки + + Видалити картку + + Зберегти + + Зберегти + + Скасувати + Додати засіб пошуку diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 8d14f5ecf..2764984d7 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -20,10 +20,6 @@ Các thẻ riêng tư của bạn sẽ được hiển thị ở đây. - - Baidu - - JD 1 thẻ đang mở. Chạm để chuyển thẻ. @@ -53,7 +49,7 @@ Đã chọn - %1$s được sản xuất bởi @fork-maintainers. + %1$s được sản xuất bởi Mozilla. @@ -183,6 +179,11 @@ Tùy chỉnh chế độ đọc + + Thêm + + Chỉnh sửa + Không thể kết nối. Không thể nhận dạng URL. @@ -1160,9 +1161,6 @@ Chào mừng đến với %s! Đã có một tài khoản? - - Tìm hiểu qua %s Xem có gì mới Nhận câu trả lời tại đây - - Bắt đầu đồng bộ hóa dấu trang, mật khẩu và nhiều hơn nữa với tài khoản Firefox của bạn. + + Đồng bộ hóa Firefox giữa các thiết bị - Tìm hiểu thêm + Mang dấu trang, lịch sử và mật khẩu vào Firefox trên thiết bị này. @@ -1182,8 +1180,8 @@ Có, đăng nhập cho tôi Đang đăng nhập… - - Đăng nhập vào Firefox + + Đăng ký Vẫn đăng xuất @@ -1191,26 +1189,23 @@ Không thể đăng nhập - Bảo mật tự động - - Cài đặt riêng tư và bảo mật chặn trình theo dõi, phần mềm độc hại và các công ty theo dõi bạn. + Luôn bảo vệ quyền riêng tư + + Firefox tự động ngăn các công ty bí mật theo dõi bạn trên web. Tiêu chuẩn (mặc định) - Chặn trình theo dõi ít hơn. Các trang sẽ tải bình thường. + Cân bằng cho sự riêng tư và hiệu suất. Các trang tải bình thường. Nghiêm ngặt (được khuyến nghị) Nghiêm ngặt - Chặn nhiều trình theo dõi, quảng cáo và cửa sổ bật lên. Các trang tải nhanh hơn, nhưng một số chức năng có thể không hoạt động. - - Thể hiện vị trí của bạn + Chặn nhiều trình theo dõi hơn để các trang tải nhanh hơn, nhưng một số trên trang có thể bị hỏng về mặt chức năng. + + Chọn vị trí thanh công cụ của bạn - Hãy thử duyệt bằng một tay với thanh công cụ dưới cùng hoặc di chuyển nó lên trên cùng. + Đặt thanh công cụ trong tầm với. Giữ nó ở dưới cùng hoặc di chuyển nó lên trên cùng. Duyệt web riêng tư hơn Quyền riêng tư của bạn + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> Chúng tôi đã thiết kế %s để cung cấp cho bạn quyền kiểm soát những gì bạn chia sẻ trực tuyến và những gì bạn chia sẻ với chúng tôi. Đọc thông báo bảo mật của chúng tôi @@ -1238,7 +1233,7 @@ Chọn chủ đề của bạn - Tiết kiệm pin và bảo vệ thị lực của bạn bằng cách bật chế độ tối. + Tiết kiệm pin và thị lực của bạn với chế độ tối. Tự động @@ -1294,13 +1289,13 @@ Tiêu chuẩn (mặc định) - Chặn trình theo dõi ít hơn. Các trang sẽ tải bình thường. + Cân bằng cho sự riêng tư và hiệu suất. Các trang tải bình thường. Những gì bị chặn bởi trình chống theo dõi tiêu chuẩn Nghiêm ngặt - Chặn nhiều trình theo dõi, quảng cáo và cửa sổ bật lên. Các trang tải nhanh hơn, nhưng một số chức năng có thể không hoạt động. + Chặn nhiều trình theo dõi hơn để các trang tải nhanh hơn, nhưng một số chức năng trên trang có thể bị hỏng. Những gì bị chặn bởi trình chống theo dõi nghiêm ngặt @@ -1534,6 +1529,37 @@ Sắp xếp menu đăng nhập + + + Thẻ tín dụng + + Lưu và tự động điền thẻ tín dụng + + Dữ liệu được mã hóa + + Đồng bộ thông tin thẻ tín dụng trên các thiết bị + + Thêm thẻ tín dụng + + + Thêm thẻ + + Số thẻ + + Ngày hết hạn + + Tên trên thẻ + + Biệt danh thẻ + + Xóa thẻ + + Lưu + + Lưu + + Hủy bỏ + Thêm công cụ tìm kiếm diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index fe6bc4d34..88e014345 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -23,10 +23,6 @@ 您的隐私标签页将显示于此。 - - 百度 - - 京东 打开了 1 个标签页,点击即可切换。 @@ -190,6 +186,11 @@ 定制阅读器视图 + + 添加 + + 编辑 + 未知的 URL 规范,无法连接。 @@ -1009,6 +1010,10 @@ 所有动作 最近使用 + + 已登录为 %1$s + + 登录同步服务 登录同步服务 @@ -1209,9 +1214,6 @@ 欢迎使用 %s! 已有账户? - - 认识 %s 了解新动向 在此寻找答案 - - 使用您的 Firefox 账户开始同步书签、历史记录等数据。 + + 在设备之间同步 Firefox - 详细了解 + 将书签、历史记录和密码同步到此设备。 @@ -1231,8 +1233,8 @@ 是的,我要登录 正在登录… - - 登录 Firefox + + 注册 不要登录 @@ -1240,26 +1242,23 @@ 登录失败 - 全自动的隐私保护 - - 可通过隐私与安全设置,拦截跟踪器、恶意软件和企业在网上对您的跟踪。 + 隐私与您同行 + + Firefox 会自动阻止大公司在网上偷偷跟踪您。 标准(默认) - 少拦截一些跟踪器,页面将可正常加载。 + 平衡隐私和性能。页面可正常加载。 严格(推荐) 严格 - 拦截更多跟踪器和弹窗。页面加载速度更快,但是某些功能可能无法正常工作。 - - 选择工具栏位置 + 拦截更多跟踪器,页面加载更快,但可能导致页面上某些功能异常。 + + 选择您的工具栏位置 - 试试用底部工具栏单手上网,也可以将其移至顶部。 + 将工具栏放在顺手的位置。可以留在底部,或移到顶部。 上网冲浪也私密 您的隐私权 + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> %s 的设计旨在让您可以控制要在网上披露哪些内容,以及告诉我们哪些信息。 阅读我们的隐私声明 @@ -1287,7 +1286,7 @@ 选择您的主题 - 启用深色模式,既省电又护眼。 + 启用深色模式,既省电又护眼。 自动 @@ -1343,13 +1342,13 @@ 标准(默认) - 少拦截一些跟踪器,页面将可正常加载。 + 平衡隐私和性能。页面可正常加载。 标准跟踪保护会拦截的内容 严格 - 拦截更多跟踪器和弹窗。页面加载速度更快,但是某些功能可能无法正常工作。 + 拦截更多跟踪器,页面加载更快,但可能导致页面上某些功能异常。 严格跟踪保护会拦截的内容 @@ -1584,6 +1583,37 @@ 排序登录信息菜单 + + + 信用卡 + + 保存并自动填充信用卡信息 + + 数据已加密 + + 跨设备同步信用卡信息 + + 添加信用卡 + + + 添加信用卡 + + 卡号 + + 失效日期 + + 卡上姓名 + + 卡的昵称 + + 删除此卡 + + 保存 + + 保存 + + 取消 + 添加搜索引擎 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c6029ca8b..b0c8f10a0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -23,10 +23,6 @@ 您開啟的隱私瀏覽分頁將顯示於此處。 - - 百度 - - 京東 開啟了 1 個分頁,點擊即可切換分頁。 @@ -56,7 +52,7 @@ 已選取 - %1$s 是由 @fork-maintainers 所打造。 + %1$s 是由 Mozilla 所打造。 @@ -186,6 +182,11 @@ 自訂閱讀模式 + + 新增 + + 編輯 + 不認識的通訊協定,無法連線。 @@ -998,6 +999,10 @@ 所有動作 最近使用 + + 已登入為 %1$s + + 登入進行同步 登入 Sync @@ -1196,9 +1201,6 @@ 歡迎使用 %s! 已經有帳號了嗎? - - 了解 %s 看看有什麼新鮮事 在此尋找答案 - - 使用您的 Firefox 帳號同步書籤、密碼等資料。 + + 在不同裝置間同步 Firefox - 了解更多 + 將 Firefox 上的書籤、瀏覽紀錄、網站密碼帶到此裝置。 @@ -1218,9 +1220,9 @@ 好,請幫我登入 登入中… - - 登入 Firefox + + 註冊 不要登入 @@ -1228,26 +1230,23 @@ 登入失敗 - 自動保護隱私 - - 可透過隱私與安全性設定,封鎖追蹤器、惡意軟體與企業在網路上追蹤您的行為。 + 隨時都有隱私保護 + + Firefox 會自動封鎖讓大企業在網路上偷偷跟蹤您的程式。 標準(預設) - 封鎖少一點追蹤器,網頁可正常運作。 + 隱私權保護與效能兼顧。網站可正常運作。 嚴格(建議) 嚴格 - 封鎖更多追蹤器、廣告與彈出視窗。可更快載入網頁,但頁面中的部分功能可能會不正常。 - - 表示你的立場 + 封鎖更多追蹤器,讓網頁可以更快載入,但頁面上的某些功能可能會故障。 + + 挑選工具列要放置的位置 - 用畫面底部的工具列試試看單手上網,也可以移到畫面頂端。 + 可以將工具列放在畫面底端或頂端,容易操作的地方。 上網變得私密 您的隱私權 + The first parameter is the name of the app (e.g. Firefox Preview) Substitute %s for long browser name. --> 我們將 %s 設計成讓您可以完整控制要在網路上分享哪些東西、以及與我們分享哪些東西。 閱讀我們的隱私權公告 @@ -1275,7 +1274,7 @@ 選擇佈景主題 - 開啟暗色模式,更省電又保護視力。 + 使用暗色模式,更省電又保護視力。 自動 @@ -1330,13 +1329,13 @@ 標準(預設) - 封鎖少一點追蹤器,網頁可正常運作。 + 隱私權保護與效能兼顧。網站可正常運作。 標準追蹤保護會封鎖哪些內容 嚴格 - 封鎖更多追蹤器、廣告與彈出視窗。可更快載入網頁,但頁面中的部分功能可能會不正常。 + 封鎖更多追蹤器,讓網頁可以更快載入,但頁面上的某些功能可能會故障。 嚴格追蹤保護會封鎖哪些內容 @@ -1571,6 +1570,38 @@ 排序登入資訊選單 + + + 信用卡 + + + 儲存並自動填寫卡片 + + 資料有加密 + + 在不同裝置間同步卡片資料 + + 新增信用卡 + + + 新增付款卡片 + + 卡號 + + 到期日 + + 持卡人姓名 + + 卡片暱稱 + + 刪除卡片 + + 儲存 + + 儲存 + + 取消 + 新增搜尋引擎 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 27617106a..40e04af06 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -58,6 +58,7 @@ 12dp 8dp 72dp + 16dp 48dp diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index c5a0879c4..1d5a9656f 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -227,6 +227,12 @@ pref_key_open_tabs_count + + pref_key_installed_addons_count + pref_key_installed_addons_list + pref_key_enabled_addons_count + pref_key_enabled_addons_list + pref_key_search_count pref_key_mobile_bookmarks_size @@ -246,15 +252,20 @@ pref_key_close_tabs_after_one_day pref_key_close_tabs_after_one_week pref_key_close_tabs_after_one_month + pref_key_new_tabs_tray pref_key_camera_permissions_needed pref_key_return_to_browser - + pref_key_secret_debug_info pref_key_leanplum_user_id pref_key_leanplum_device_id pref_key_search_region_home pref_key_search_region_current + + + pref_key_show_credit_cards_feature + pref_key_show_address_feature diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 170e9b38a..167d0e59a 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -30,11 +30,19 @@ AS + Secret Settings Secret Debug Info - + + Enable Address Autofill + + Enable Credit Card Autofill + + Use new Tabs Tray + + A refactored tabs tray that will include Synced Tabs. Show Synced Tabs in the tabs tray diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 974318c8c..20ccda79f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,6 +179,8 @@ Open in app Appearance + + Customize reader view Unable to connect. Unrecognizable URL scheme. @@ -214,6 +216,10 @@ %s will share everything you type in the address bar with your default search engine. Learn more + + Search %s + + Search directly from the address bar diff --git a/app/src/main/res/xml/preferences_without_icons.xml b/app/src/main/res/xml/preferences_without_icons.xml new file mode 100644 index 000000000..96c588a9b --- /dev/null +++ b/app/src/main/res/xml/preferences_without_icons.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/secret_settings_preferences.xml b/app/src/main/res/xml/secret_settings_preferences.xml index c9a243d18..851a27964 100644 --- a/app/src/main/res/xml/secret_settings_preferences.xml +++ b/app/src/main/res/xml/secret_settings_preferences.xml @@ -4,4 +4,20 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + + + diff --git a/app/src/nightly/AndroidManifest.xml b/app/src/nightly/AndroidManifest.xml index 5fdb32de4..3aaf3d6a2 100644 --- a/app/src/nightly/AndroidManifest.xml +++ b/app/src/nightly/AndroidManifest.xml @@ -4,6 +4,24 @@ + + + + + + + + + + + diff --git a/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt b/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt index a82099258..f1c508960 100644 --- a/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt +++ b/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt @@ -5,6 +5,13 @@ package org.mozilla.fenix import androidx.test.core.app.ApplicationProvider +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import mozilla.components.concept.engine.webextension.DisabledFlags +import mozilla.components.concept.engine.webextension.Metadata +import mozilla.components.concept.engine.webextension.WebExtension +import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker import mozilla.components.service.glean.testing.GleanTestRule import org.junit.Assert.assertTrue import org.junit.Before @@ -34,4 +41,32 @@ class FenixApplicationTest { // https://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html assertTrue(PerfStartup.applicationOnCreate.testHasValue()) } + + @Test + fun `GIVEN there are unsupported addons installed WHEN subscribing for new add-ons checks THEN register for checks`() { + val checker = mockk(relaxed = true) + val unSupportedExtension: WebExtension = mockk() + val metadata: Metadata = mockk() + + every { unSupportedExtension.getMetadata() } returns metadata + every { metadata.disabledFlags } returns DisabledFlags.select(DisabledFlags.APP_SUPPORT) + + application.subscribeForNewAddonsIfNeeded(checker, listOf(unSupportedExtension)) + + verify { checker.registerForChecks() } + } + + @Test + fun `GIVEN there are no unsupported addons installed WHEN subscribing for new add-ons checks THEN unregister for checks`() { + val checker = mockk(relaxed = true) + val unSupportedExtension: WebExtension = mockk() + val metadata: Metadata = mockk() + + every { unSupportedExtension.getMetadata() } returns metadata + every { metadata.disabledFlags } returns DisabledFlags.select(DisabledFlags.USER) + + application.subscribeForNewAddonsIfNeeded(checker, listOf(unSupportedExtension)) + + verify { checker.unregisterForChecks() } + } } diff --git a/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt index 3f086f68f..55af22ff9 100644 --- a/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt @@ -25,10 +25,11 @@ import mozilla.components.support.test.mock import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.After -import org.junit.Assert import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test @@ -38,7 +39,7 @@ import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry import org.mozilla.fenix.utils.Settings -import org.mozilla.fenix.GleanMetrics.Engine as EngineMetrics +import org.mozilla.fenix.GleanMetrics.EngineTab as EngineMetrics @RunWith(FenixRobolectricTestRunner::class) @ExperimentalCoroutinesApi @@ -284,14 +285,14 @@ class TelemetryMiddlewareTest { selectedTabId = "foreground" )).joinBlocking() - Assert.assertFalse(EngineMetrics.tabKills["foreground"].testHasValue()) - Assert.assertFalse(EngineMetrics.tabKills["background"].testHasValue()) + assertFalse(EngineMetrics.kills["foreground"].testHasValue()) + assertFalse(EngineMetrics.kills["background"].testHasValue()) store.dispatch( EngineAction.KillEngineSessionAction("foreground") ).joinBlocking() - Assert.assertTrue(EngineMetrics.tabKills["foreground"].testHasValue()) + assertTrue(EngineMetrics.kills["foreground"].testHasValue()) } @Test @@ -305,24 +306,24 @@ class TelemetryMiddlewareTest { selectedTabId = "foreground" )).joinBlocking() - Assert.assertFalse(EngineMetrics.tabKills["foreground"].testHasValue()) - Assert.assertFalse(EngineMetrics.tabKills["background"].testHasValue()) + assertFalse(EngineMetrics.kills["foreground"].testHasValue()) + assertFalse(EngineMetrics.kills["background"].testHasValue()) store.dispatch( EngineAction.KillEngineSessionAction("background_pocket") ).joinBlocking() - Assert.assertFalse(EngineMetrics.tabKills["foreground"].testHasValue()) - Assert.assertTrue(EngineMetrics.tabKills["background"].testHasValue()) - assertEquals(1, EngineMetrics.tabKills["background"].testGetValue()) + assertFalse(EngineMetrics.kills["foreground"].testHasValue()) + assertTrue(EngineMetrics.kills["background"].testHasValue()) + assertEquals(1, EngineMetrics.kills["background"].testGetValue()) store.dispatch( EngineAction.KillEngineSessionAction("background_verge") ).joinBlocking() - Assert.assertFalse(EngineMetrics.tabKills["foreground"].testHasValue()) - Assert.assertTrue(EngineMetrics.tabKills["background"].testHasValue()) - assertEquals(2, EngineMetrics.tabKills["background"].testGetValue()) + assertFalse(EngineMetrics.kills["foreground"].testHasValue()) + assertTrue(EngineMetrics.kills["background"].testHasValue()) + assertEquals(2, EngineMetrics.kills["background"].testGetValue()) } @Test @@ -343,8 +344,8 @@ class TelemetryMiddlewareTest { engineSession = mock() )).joinBlocking() - Assert.assertFalse(EngineMetrics.killForegroundAge.testHasValue()) - Assert.assertFalse(EngineMetrics.killBackgroundAge.testHasValue()) + assertFalse(EngineMetrics.killForegroundAge.testHasValue()) + assertFalse(EngineMetrics.killBackgroundAge.testHasValue()) clock.elapsedTime = 500 @@ -352,9 +353,9 @@ class TelemetryMiddlewareTest { EngineAction.KillEngineSessionAction("foreground") ).joinBlocking() - Assert.assertTrue(EngineMetrics.killForegroundAge.testHasValue()) - Assert.assertFalse(EngineMetrics.killBackgroundAge.testHasValue()) - assertEquals(400, EngineMetrics.killForegroundAge.testGetValue()) + assertTrue(EngineMetrics.killForegroundAge.testHasValue()) + assertFalse(EngineMetrics.killBackgroundAge.testHasValue()) + assertEquals(400_000_000, EngineMetrics.killForegroundAge.testGetValue().sum) } @Test @@ -377,16 +378,16 @@ class TelemetryMiddlewareTest { clock.elapsedTime = 700 - Assert.assertFalse(EngineMetrics.killForegroundAge.testHasValue()) - Assert.assertFalse(EngineMetrics.killBackgroundAge.testHasValue()) + assertFalse(EngineMetrics.killForegroundAge.testHasValue()) + assertFalse(EngineMetrics.killBackgroundAge.testHasValue()) store.dispatch( EngineAction.KillEngineSessionAction("background_pocket") ).joinBlocking() - Assert.assertTrue(EngineMetrics.killBackgroundAge.testHasValue()) - Assert.assertFalse(EngineMetrics.killForegroundAge.testHasValue()) - assertEquals(600, EngineMetrics.killBackgroundAge.testGetValue()) + assertTrue(EngineMetrics.killBackgroundAge.testHasValue()) + assertFalse(EngineMetrics.killForegroundAge.testHasValue()) + assertEquals(600_000_000, EngineMetrics.killBackgroundAge.testGetValue().sum) } } diff --git a/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt index 53e62f2f0..5668fa4b6 100644 --- a/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt @@ -4,6 +4,8 @@ package org.mozilla.fenix.components +import com.google.android.play.core.review.ReviewManager +import com.google.android.play.core.review.ReviewManagerFactory import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runBlockingTest import mozilla.components.support.test.robolectric.testContext @@ -11,6 +13,7 @@ import org.junit.Test import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Assert.assertFalse +import org.junit.Before import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @@ -27,6 +30,14 @@ class TestReviewSettings( @ExperimentalCoroutinesApi @RunWith(FenixRobolectricTestRunner::class) class ReviewPromptControllerTest { + + private lateinit var reviewManager: ReviewManager + + @Before + fun setUp() { + reviewManager = ReviewManagerFactory.create(testContext) + } + @Test fun promptReviewDoesNotSetMillis() = runBlockingTest { var promptWasCalled = false @@ -37,7 +48,7 @@ class ReviewPromptControllerTest { ) val controller = ReviewPromptController( - testContext, + reviewManager, settings, { 100L }, { promptWasCalled = true } @@ -60,7 +71,7 @@ class ReviewPromptControllerTest { ) val controller = ReviewPromptController( - testContext, + reviewManager, settings, { 100L }, { promptWasCalled = true } @@ -82,7 +93,7 @@ class ReviewPromptControllerTest { ) val controller = ReviewPromptController( - testContext, + reviewManager, settings, { 100L }, { promptWasCalled = true } @@ -102,7 +113,7 @@ class ReviewPromptControllerTest { ) val controller = ReviewPromptController( - testContext, + reviewManager, settings, { 100L }, { promptWasCalled = true } @@ -126,7 +137,7 @@ class ReviewPromptControllerTest { ) val controller = ReviewPromptController( - testContext, + reviewManager, settings, { 0L } ) @@ -149,7 +160,7 @@ class ReviewPromptControllerTest { ) val controller = ReviewPromptController( - testContext, + reviewManager, settings, { TEST_TIME_NOW } ) diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/GleanMetricsServiceTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/GleanMetricsServiceTest.kt index 16e932db2..2cb344365 100644 --- a/app/src/test/java/org/mozilla/fenix/components/metrics/GleanMetricsServiceTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/GleanMetricsServiceTest.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.components.metrics import io.mockk.MockKAnnotations import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.mockk import mozilla.components.browser.state.store.BrowserStore import mozilla.components.service.glean.testing.GleanTestRule import mozilla.components.support.test.robolectric.testContext @@ -17,11 +18,18 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.Addons +import org.mozilla.fenix.GleanMetrics.Awesomebar +import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.GleanMetrics.History import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.SearchDefaultEngine +import org.mozilla.fenix.GleanMetrics.SyncedTabs +import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.BrowsersCache +import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class GleanMetricsServiceTest { @@ -44,16 +52,46 @@ class GleanMetricsServiceTest { @Test fun `setStartupMetrics sets some base metrics`() { val expectedAppName = "org.mozilla.fenix" + val settings: Settings = mockk() every { browsersCache.all(any()).isDefaultBrowser } returns true every { mozillaProductDetector.getMozillaBrowserDefault(any()) } returns expectedAppName every { mozillaProductDetector.getInstalledMozillaProducts(any()) } returns listOf(expectedAppName) - - gleanService.setStartupMetrics() + every { settings.adjustCampaignId } returns "ID" + every { settings.adjustAdGroup } returns "group" + every { settings.adjustCreative } returns "creative" + every { settings.adjustNetwork } returns "network" + every { settings.searchWidgetInstalled } returns true + every { settings.openTabsCount } returns 1 + every { settings.topSitesSize } returns 2 + every { settings.installedAddonsCount } returns 3 + every { settings.installedAddonsList } returns "test1,test2,test3" + every { settings.enabledAddonsCount } returns 2 + every { settings.enabledAddonsList } returns "test1,test2" + every { settings.desktopBookmarksSize } returns 4 + every { settings.mobileBookmarksSize } returns 5 + every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM + every { settings.getTabViewPingString() } returns "test" + every { settings.getTabTimeoutPingString() } returns "test" + + gleanService.setStartupMetrics(settings) // Verify that browser defaults metrics are set. assertEquals(true, Metrics.defaultBrowser.testGetValue()) assertEquals(expectedAppName, Metrics.defaultMozBrowser.testGetValue()) assertEquals(listOf(expectedAppName), Metrics.mozillaProducts.testGetValue()) + assertEquals("ID", Metrics.adjustCampaign.testGetValue()) + assertEquals("group", Metrics.adjustAdGroup.testGetValue()) + assertEquals("creative", Metrics.adjustCreative.testGetValue()) + assertEquals("network", Metrics.adjustNetwork.testGetValue()) + assertEquals(true, Metrics.searchWidgetInstalled.testGetValue()) + assertEquals(true, Metrics.hasOpenTabs.testGetValue()) + assertEquals(1, Metrics.tabsOpenCount.testGetValue()) + assertEquals(true, Metrics.hasTopSites.testGetValue()) + assertEquals(2, Metrics.topSitesCount.testGetValue()) + assertEquals(true, Addons.hasInstalledAddons.testGetValue()) + assertEquals(listOf("test1", "test2", "test3"), Addons.installedAddons.testGetValue()) + assertEquals(true, Addons.hasEnabledAddons.testGetValue()) + assertEquals(listOf("test1", "test2"), Addons.enabledAddons.testGetValue()) // Verify that search engine defaults are NOT set. This test does // not mock most of the objects telemetry is collected from. @@ -85,4 +123,112 @@ class GleanMetricsServiceTest { assertEquals(1, events[0].extra!!.size) assertEquals("APP_ICON", events[0].extra!!["source"]) } + + @Test + fun `synced tab event is correctly recorded`() { + assertFalse(SyncedTabs.syncedTabsSuggestionClicked.testHasValue()) + gleanService.track(Event.SyncedTabSuggestionClicked) + assertTrue(SyncedTabs.syncedTabsSuggestionClicked.testHasValue()) + } + + @Test + fun `awesomebar events are correctly recorded`() { + assertFalse(Awesomebar.bookmarkSuggestionClicked.testHasValue()) + gleanService.track(Event.BookmarkSuggestionClicked) + assertTrue(Awesomebar.bookmarkSuggestionClicked.testHasValue()) + + assertFalse(Awesomebar.clipboardSuggestionClicked.testHasValue()) + gleanService.track(Event.ClipboardSuggestionClicked) + assertTrue(Awesomebar.clipboardSuggestionClicked.testHasValue()) + + assertFalse(Awesomebar.historySuggestionClicked.testHasValue()) + gleanService.track(Event.HistorySuggestionClicked) + assertTrue(Awesomebar.historySuggestionClicked.testHasValue()) + + assertFalse(Awesomebar.searchActionClicked.testHasValue()) + gleanService.track(Event.SearchActionClicked) + assertTrue(Awesomebar.searchActionClicked.testHasValue()) + + assertFalse(Awesomebar.searchSuggestionClicked.testHasValue()) + gleanService.track(Event.SearchSuggestionClicked) + assertTrue(Awesomebar.searchSuggestionClicked.testHasValue()) + + assertFalse(Awesomebar.openedTabSuggestionClicked.testHasValue()) + gleanService.track(Event.OpenedTabSuggestionClicked) + assertTrue(Awesomebar.openedTabSuggestionClicked.testHasValue()) + } + + @Test + fun `bookmark events is correctly recorded`() { + assertFalse(BookmarksManagement.open.testHasValue()) + gleanService.track(Event.OpenedBookmark) + assertTrue(BookmarksManagement.open.testHasValue()) + + assertFalse(BookmarksManagement.openInNewTab.testHasValue()) + gleanService.track(Event.OpenedBookmarkInNewTab) + assertTrue(BookmarksManagement.openInNewTab.testHasValue()) + + assertFalse(BookmarksManagement.openInNewTabs.testHasValue()) + gleanService.track(Event.OpenedBookmarksInNewTabs) + assertTrue(BookmarksManagement.openInNewTabs.testHasValue()) + + assertFalse(BookmarksManagement.openInPrivateTab.testHasValue()) + gleanService.track(Event.OpenedBookmarkInPrivateTab) + assertTrue(BookmarksManagement.openInPrivateTab.testHasValue()) + + assertFalse(BookmarksManagement.openInPrivateTabs.testHasValue()) + gleanService.track(Event.OpenedBookmarksInPrivateTabs) + assertTrue(BookmarksManagement.openInPrivateTabs.testHasValue()) + + assertFalse(BookmarksManagement.edited.testHasValue()) + gleanService.track(Event.EditedBookmark) + assertTrue(BookmarksManagement.edited.testHasValue()) + + assertFalse(BookmarksManagement.moved.testHasValue()) + gleanService.track(Event.MovedBookmark) + assertTrue(BookmarksManagement.moved.testHasValue()) + + assertFalse(BookmarksManagement.removed.testHasValue()) + gleanService.track(Event.RemoveBookmark) + assertTrue(BookmarksManagement.removed.testHasValue()) + + assertFalse(BookmarksManagement.multiRemoved.testHasValue()) + gleanService.track(Event.RemoveBookmarks) + assertTrue(BookmarksManagement.multiRemoved.testHasValue()) + + assertFalse(BookmarksManagement.shared.testHasValue()) + gleanService.track(Event.ShareBookmark) + assertTrue(BookmarksManagement.shared.testHasValue()) + + assertFalse(BookmarksManagement.copied.testHasValue()) + gleanService.track(Event.CopyBookmark) + assertTrue(BookmarksManagement.copied.testHasValue()) + + assertFalse(BookmarksManagement.folderAdd.testHasValue()) + gleanService.track(Event.AddBookmarkFolder) + assertTrue(BookmarksManagement.folderAdd.testHasValue()) + + assertFalse(BookmarksManagement.folderRemove.testHasValue()) + gleanService.track(Event.RemoveBookmarkFolder) + assertTrue(BookmarksManagement.folderRemove.testHasValue()) + } + + @Test + fun `History events is correctly recorded`() { + assertFalse(History.openedItemInNewTab.testHasValue()) + gleanService.track(Event.HistoryOpenedInNewTab) + assertTrue(History.openedItemInNewTab.testHasValue()) + + assertFalse(History.openedItemsInNewTabs.testHasValue()) + gleanService.track(Event.HistoryOpenedInNewTabs) + assertTrue(History.openedItemsInNewTabs.testHasValue()) + + assertFalse(History.openedItemInPrivateTab.testHasValue()) + gleanService.track(Event.HistoryOpenedInPrivateTab) + assertTrue(History.openedItemInPrivateTab.testHasValue()) + + assertFalse(History.openedItemsInPrivateTabs.testHasValue()) + gleanService.track(Event.HistoryOpenedInPrivateTabs) + assertTrue(History.openedItemsInPrivateTabs.testHasValue()) + } } diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt index be97fd8a3..2a824564f 100644 --- a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt @@ -15,9 +15,10 @@ import mozilla.components.support.base.Component import mozilla.components.support.base.facts.Action import mozilla.components.support.base.facts.Fact import mozilla.components.support.base.log.logger.Logger -import org.junit.Assert.assertEquals +import mozilla.components.support.webextensions.facts.WebExtensionFacts import org.junit.Before import org.junit.Test +import org.mozilla.fenix.utils.Settings class MetricControllerTest { @@ -57,7 +58,8 @@ class MetricControllerTest { val controller = ReleaseMetricController( services = listOf(dataService1, marketingService1, dataService2, marketingService2), isDataTelemetryEnabled = { enabled }, - isMarketingDataTelemetryEnabled = { enabled } + isMarketingDataTelemetryEnabled = { enabled }, + mockk() ) controller.start(MetricServiceType.Data) @@ -83,7 +85,8 @@ class MetricControllerTest { val controller = ReleaseMetricController( services = listOf(dataService1), isDataTelemetryEnabled = { false }, - isMarketingDataTelemetryEnabled = { true } + isMarketingDataTelemetryEnabled = { true }, + mockk() ) controller.start(MetricServiceType.Data) @@ -99,7 +102,8 @@ class MetricControllerTest { val controller = ReleaseMetricController( services = listOf(dataService1), isDataTelemetryEnabled = { enabled }, - isMarketingDataTelemetryEnabled = { true } + isMarketingDataTelemetryEnabled = { true }, + mockk() ) controller.start(MetricServiceType.Data) @@ -119,7 +123,8 @@ class MetricControllerTest { val controller = ReleaseMetricController( services = listOf(dataService1, marketingService1, dataService2, marketingService2), isDataTelemetryEnabled = { enabled }, - isMarketingDataTelemetryEnabled = { enabled } + isMarketingDataTelemetryEnabled = { enabled }, + mockk() ) controller.start(MetricServiceType.Marketing) @@ -145,7 +150,8 @@ class MetricControllerTest { val controller = ReleaseMetricController( listOf(dataService1, marketingService1), isDataTelemetryEnabled = { true }, - isMarketingDataTelemetryEnabled = { true } + isMarketingDataTelemetryEnabled = { true }, + mockk() ) every { dataService1.shouldTrack(Event.TabMediaPause) } returns false every { marketingService1.shouldTrack(Event.TabMediaPause) } returns true @@ -161,7 +167,8 @@ class MetricControllerTest { val controller = ReleaseMetricController( listOf(dataService1, marketingService1), isDataTelemetryEnabled = { enabled }, - isMarketingDataTelemetryEnabled = { true } + isMarketingDataTelemetryEnabled = { true }, + mockk() ) every { dataService1.shouldTrack(Event.TabMediaPause) } returns true every { marketingService1.shouldTrack(Event.TabMediaPause) } returns true @@ -174,57 +181,188 @@ class MetricControllerTest { } @Test - fun `topsites fact should convert to the right events`() { - var enabled = true + fun `topsites fact should set value in SharedPreference`() { + val enabled = true + val settings: Settings = mockk(relaxed = true) val controller = ReleaseMetricController( services = listOf(dataService1), isDataTelemetryEnabled = { enabled }, - isMarketingDataTelemetryEnabled = { enabled } + isMarketingDataTelemetryEnabled = { enabled }, + settings ) - var fact = Fact( + val fact = Fact( Component.FEATURE_TOP_SITES, Action.INTERACTION, TopSitesFacts.Items.COUNT, "1" ) - assertEquals(controller.factToEvent(fact), Event.HaveTopSites) + verify(exactly = 0) { settings.topSitesSize = any() } + controller.factToEvent(fact) + verify(exactly = 1) { settings.topSitesSize = any() } + } - fact = Fact( - Component.FEATURE_TOP_SITES, - Action.INTERACTION, - TopSitesFacts.Items.COUNT, - "0" + @Test + fun `tracking synced tab event should be sent to enabled service`() { + val controller = ReleaseMetricController( + listOf(marketingService1), + isDataTelemetryEnabled = { true }, + isMarketingDataTelemetryEnabled = { true }, + mockk() ) + every { marketingService1.shouldTrack(Event.SyncedTabSuggestionClicked) } returns true + controller.start(MetricServiceType.Marketing) - assertEquals(controller.factToEvent(fact), Event.HaveNoTopSites) + controller.track(Event.SyncedTabSuggestionClicked) + verify { marketingService1.track(Event.SyncedTabSuggestionClicked) } + } - fact = Fact( - Component.FEATURE_TOP_SITES, - Action.INTERACTION, - TopSitesFacts.Items.COUNT, - "10" + @Test + fun `tracking awesomebar events should be sent to enabled service`() { + val controller = ReleaseMetricController( + listOf(marketingService1), + isDataTelemetryEnabled = { true }, + isMarketingDataTelemetryEnabled = { true }, + mockk() ) + every { marketingService1.shouldTrack(Event.BookmarkSuggestionClicked) } returns true + every { marketingService1.shouldTrack(Event.ClipboardSuggestionClicked) } returns true + every { marketingService1.shouldTrack(Event.HistorySuggestionClicked) } returns true + every { marketingService1.shouldTrack(Event.SearchActionClicked) } returns true + every { marketingService1.shouldTrack(Event.SearchSuggestionClicked) } returns true + every { marketingService1.shouldTrack(Event.OpenedTabSuggestionClicked) } returns true + controller.start(MetricServiceType.Marketing) - assertEquals(controller.factToEvent(fact), Event.HaveTopSites) + controller.track(Event.BookmarkSuggestionClicked) + verify { marketingService1.track(Event.BookmarkSuggestionClicked) } - fact = Fact( - Component.FEATURE_TOP_SITES, - Action.INTERACTION, - TopSitesFacts.Items.COUNT, - "-4" + controller.track(Event.ClipboardSuggestionClicked) + verify { marketingService1.track(Event.ClipboardSuggestionClicked) } + + controller.track(Event.HistorySuggestionClicked) + verify { marketingService1.track(Event.HistorySuggestionClicked) } + + controller.track(Event.SearchActionClicked) + verify { marketingService1.track(Event.SearchActionClicked) } + + controller.track(Event.SearchSuggestionClicked) + verify { marketingService1.track(Event.SearchSuggestionClicked) } + + controller.track(Event.OpenedTabSuggestionClicked) + verify { marketingService1.track(Event.OpenedTabSuggestionClicked) } + } + + @Test + fun `tracking bookmark events should be sent to enabled service`() { + val controller = ReleaseMetricController( + listOf(marketingService1), + isDataTelemetryEnabled = { true }, + isMarketingDataTelemetryEnabled = { true }, + mockk() ) + every { marketingService1.shouldTrack(Event.AddBookmark) } returns true + every { marketingService1.shouldTrack(Event.RemoveBookmark) } returns true + every { marketingService1.shouldTrack(Event.OpenedBookmark) } returns true + every { marketingService1.shouldTrack(Event.OpenedBookmarkInNewTab) } returns true + every { marketingService1.shouldTrack(Event.OpenedBookmarksInNewTabs) } returns true + every { marketingService1.shouldTrack(Event.OpenedBookmarkInPrivateTab) } returns true + every { marketingService1.shouldTrack(Event.OpenedBookmarksInPrivateTabs) } returns true + every { marketingService1.shouldTrack(Event.EditedBookmark) } returns true + every { marketingService1.shouldTrack(Event.MovedBookmark) } returns true + every { marketingService1.shouldTrack(Event.ShareBookmark) } returns true + every { marketingService1.shouldTrack(Event.CopyBookmark) } returns true + every { marketingService1.shouldTrack(Event.AddBookmarkFolder) } returns true + every { marketingService1.shouldTrack(Event.RemoveBookmarkFolder) } returns true + every { marketingService1.shouldTrack(Event.RemoveBookmarks) } returns true - assertEquals(controller.factToEvent(fact), Event.HaveNoTopSites) + controller.start(MetricServiceType.Marketing) - fact = Fact( - Component.FEATURE_TOP_SITES, + controller.track(Event.AddBookmark) + controller.track(Event.RemoveBookmark) + controller.track(Event.OpenedBookmark) + controller.track(Event.OpenedBookmarkInNewTab) + controller.track(Event.OpenedBookmarksInNewTabs) + controller.track(Event.OpenedBookmarkInPrivateTab) + controller.track(Event.OpenedBookmarksInPrivateTabs) + controller.track(Event.EditedBookmark) + controller.track(Event.MovedBookmark) + controller.track(Event.ShareBookmark) + controller.track(Event.CopyBookmark) + controller.track(Event.AddBookmarkFolder) + controller.track(Event.RemoveBookmarkFolder) + controller.track(Event.RemoveBookmarks) + + verify { marketingService1.track(Event.AddBookmark) } + verify { marketingService1.track(Event.RemoveBookmark) } + verify { marketingService1.track(Event.OpenedBookmark) } + verify { marketingService1.track(Event.OpenedBookmarkInNewTab) } + verify { marketingService1.track(Event.OpenedBookmarksInNewTabs) } + verify { marketingService1.track(Event.OpenedBookmarkInPrivateTab) } + verify { marketingService1.track(Event.OpenedBookmarksInPrivateTabs) } + verify { marketingService1.track(Event.EditedBookmark) } + verify { marketingService1.track(Event.MovedBookmark) } + verify { marketingService1.track(Event.ShareBookmark) } + verify { marketingService1.track(Event.CopyBookmark) } + verify { marketingService1.track(Event.AddBookmarkFolder) } + verify { marketingService1.track(Event.RemoveBookmarkFolder) } + verify { marketingService1.track(Event.RemoveBookmarks) } + } + + @Test + fun `history events should be sent to enabled service`() { + val controller = ReleaseMetricController( + listOf(marketingService1), + isDataTelemetryEnabled = { true }, + isMarketingDataTelemetryEnabled = { true }, + mockk() + ) + every { marketingService1.shouldTrack(Event.HistoryOpenedInNewTab) } returns true + every { marketingService1.shouldTrack(Event.HistoryOpenedInNewTabs) } returns true + every { marketingService1.shouldTrack(Event.HistoryOpenedInPrivateTab) } returns true + every { marketingService1.shouldTrack(Event.HistoryOpenedInPrivateTabs) } returns true + + controller.start(MetricServiceType.Marketing) + + controller.track(Event.HistoryOpenedInNewTab) + controller.track(Event.HistoryOpenedInNewTabs) + controller.track(Event.HistoryOpenedInPrivateTab) + controller.track(Event.HistoryOpenedInPrivateTabs) + + verify { marketingService1.track(Event.HistoryOpenedInNewTab) } + verify { marketingService1.track(Event.HistoryOpenedInNewTabs) } + verify { marketingService1.track(Event.HistoryOpenedInPrivateTab) } + verify { marketingService1.track(Event.HistoryOpenedInPrivateTabs) } + } + + @Test + fun `web extension fact should set value in SharedPreference`() { + val enabled = true + val settings: Settings = mockk(relaxed = true) + val controller = ReleaseMetricController( + services = listOf(dataService1), + isDataTelemetryEnabled = { enabled }, + isMarketingDataTelemetryEnabled = { enabled }, + settings + ) + val fact = Fact( + Component.SUPPORT_WEBEXTENSIONS, Action.INTERACTION, - TopSitesFacts.Items.COUNT, - "test" + WebExtensionFacts.Items.WEB_EXTENSIONS_INITIALIZED, + metadata = mapOf( + "installed" to listOf("test1"), + "enabled" to listOf("test2") + ) ) - assertEquals(controller.factToEvent(fact), Event.HaveNoTopSites) + verify(exactly = 0) { settings.installedAddonsCount = any() } + verify(exactly = 0) { settings.installedAddonsList = any() } + verify(exactly = 0) { settings.enabledAddonsCount = any() } + verify(exactly = 0) { settings.enabledAddonsList = any() } + controller.factToEvent(fact) + verify(exactly = 1) { settings.installedAddonsCount = any() } + verify(exactly = 1) { settings.installedAddonsList = any() } + verify(exactly = 1) { settings.enabledAddonsCount = any() } + verify(exactly = 1) { settings.enabledAddonsList = any() } } } diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt index da473a25d..8420a72d8 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt @@ -237,7 +237,7 @@ class DefaultBrowserToolbarMenuControllerTest { @Test fun `WHEN reader mode menu item is pressed THEN handle appearance change`() = runBlockingTest { - val item = ToolbarMenu.Item.ReaderModeAppearance + val item = ToolbarMenu.Item.CustomizeReaderView val controller = createController(scope = this, store = browserStore) diff --git a/app/src/test/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessorTest.kt b/app/src/test/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessorTest.kt index 6e9f7c715..b39b012a8 100644 --- a/app/src/test/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/customtabs/FennecWebAppIntentProcessorTest.kt @@ -5,9 +5,8 @@ package org.mozilla.fenix.customtabs import io.mockk.mockk -import mozilla.components.browser.session.SessionManager import mozilla.components.feature.pwa.ManifestStorage -import mozilla.components.feature.session.SessionUseCases +import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -60,13 +59,11 @@ class FennecWebAppIntentProcessorTest { } private fun createFennecWebAppIntentProcessor(): FennecWebAppIntentProcessor { - val sessionManager = SessionManager(engine = mockk(relaxed = true)) - val useCase: SessionUseCases.DefaultLoadUrlUseCase = mockk(relaxed = true) + val useCase: TabsUseCases.AddNewTabUseCase = mockk(relaxed = true) val storage: ManifestStorage = mockk(relaxed = true) return FennecWebAppIntentProcessor( testContext, - sessionManager, useCase, storage ) diff --git a/app/src/test/java/org/mozilla/fenix/downloads/DynamicDownloadDialogTest.kt b/app/src/test/java/org/mozilla/fenix/downloads/DynamicDownloadDialogTest.kt new file mode 100644 index 000000000..4ac91f837 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/downloads/DynamicDownloadDialogTest.kt @@ -0,0 +1,36 @@ +/* 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.downloads + +import android.webkit.MimeTypeMap +import mozilla.components.browser.state.state.content.DownloadState +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.downloads.DynamicDownloadDialog.Companion.getCannotOpenFileErrorMessage +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.robolectric.Shadows.shadowOf + +@RunWith(FenixRobolectricTestRunner::class) +class DynamicDownloadDialogTest { + + @Test + fun `WHEN calling getCannotOpenFileErrorMessage THEN should return the error message for the download file type`() { + val download = DownloadState(url = "", fileName = "image.gif") + + shadowOf(MimeTypeMap.getSingleton()).apply { + addExtensionMimeTypMapping(".gif", "image/gif") + } + + val expected = testContext.getString( + R.string.mozac_feature_downloads_open_not_supported1, "gif" + ) + + val result = getCannotOpenFileErrorMessage(testContext, download) + assertEquals(expected, result) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 794d34039..99fbaaf96 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -101,6 +101,15 @@ class DefaultSessionControlControllerTest { suggestUrl = "https://www.google.com/" ) + private val duckDuckGoSearchEngine = SearchEngine( + id = "ddgTest", + name = "DuckDuckGo Test Engine", + icon = mockk(relaxed = true), + type = SearchEngine.Type.BUNDLED, + resultUrls = listOf("https://duckduckgo.com/?q=%7BsearchTerms%7D&t=fpas"), + suggestUrl = "https://ac.duckduckgo.com/ac/?q=%7BsearchTerms%7D&type=list" + ) + private lateinit var store: BrowserStore private lateinit var controller: DefaultSessionControlController @@ -374,6 +383,7 @@ class DefaultSessionControlControllerTest { @Test fun handleSelectDefaultTopSite() { val topSiteUrl = "mozilla.org" + every { controller.getAvailableSearchEngines() } returns listOf(searchEngine) controller.handleSelectTopSite(topSiteUrl, TopSite.Type.DEFAULT) verify { metrics.track(Event.TopSiteOpenInNewTab) } @@ -391,6 +401,7 @@ class DefaultSessionControlControllerTest { @Test fun handleSelectNonDefaultTopSite() { val topSiteUrl = "mozilla.org" + every { controller.getAvailableSearchEngines() } returns listOf(searchEngine) controller.handleSelectTopSite(topSiteUrl, TopSite.Type.FRECENT) verify { metrics.track(Event.TopSiteOpenInNewTab) } @@ -466,6 +477,36 @@ class DefaultSessionControlControllerTest { ) ) ) + metrics.track(Event.TopSiteOpenGoogle) + metrics.track(Event.TopSiteOpenDefault) + } + } finally { + unmockkStatic("mozilla.components.browser.state.state.SearchStateKt") + } + } + + @Test + fun handleSelectDuckDuckGoTopSite_EventPerformedSearchTopSite() { + val topSiteUrl = "https://duckduckgo.com" + val engineSource = EngineSource.Shortcut(duckDuckGoSearchEngine, false) + every { controller.getAvailableSearchEngines() } returns listOf(googleSearchEngine, duckDuckGoSearchEngine) + try { + mockkStatic("mozilla.components.browser.state.state.SearchStateKt") + + every { any().selectedOrDefaultSearchEngine } returns googleSearchEngine + + controller.handleSelectTopSite(topSiteUrl, TopSite.Type.PINNED) + + verify { + metrics.track( + Event.PerformedSearch( + Event.PerformedSearch.EventSource.TopSite( + engineSource + ) + ) + ) + + metrics.track(Event.TopSiteOpenPinned) } } finally { unmockkStatic("mozilla.components.browser.state.state.SearchStateKt") diff --git a/app/src/test/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessorTest.kt b/app/src/test/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessorTest.kt index 06f1ffed8..4d7cd34da 100644 --- a/app/src/test/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/intent/FennecBookmarkShortcutsIntentProcessorTest.kt @@ -9,33 +9,27 @@ import android.net.Uri import io.mockk.Called import io.mockk.every import io.mockk.mockk -import io.mockk.mockkStatic import io.mockk.verify -import io.mockk.verifyAll import kotlinx.coroutines.runBlocking -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.state.SessionState import mozilla.components.concept.engine.EngineSession import mozilla.components.feature.intent.ext.getSessionId -import mozilla.components.feature.session.SessionUseCases +import mozilla.components.feature.tabs.TabsUseCases import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith -import org.mozilla.fenix.home.intent.FennecBookmarkShortcutsIntentProcessor.Companion.ACTION_FENNEC_HOMESCREEN_SHORTCUT import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import java.util.UUID +import org.mozilla.fenix.home.intent.FennecBookmarkShortcutsIntentProcessor.Companion.ACTION_FENNEC_HOMESCREEN_SHORTCUT @RunWith(FenixRobolectricTestRunner::class) class FennecBookmarkShortcutsIntentProcessorTest { - private val sessionManager = mockk(relaxed = true) - private val loadUrlUseCase = mockk(relaxed = true) + private val addNewTabUseCase = mockk(relaxed = true) @Test fun `do not process blank Intents`() = runBlocking { - val processor = FennecBookmarkShortcutsIntentProcessor(sessionManager, loadUrlUseCase) + val processor = FennecBookmarkShortcutsIntentProcessor(addNewTabUseCase) val fennecShortcutsIntent = Intent(ACTION_FENNEC_HOMESCREEN_SHORTCUT) fennecShortcutsIntent.data = Uri.parse("http://mozilla.org") @@ -43,30 +37,38 @@ class FennecBookmarkShortcutsIntentProcessorTest { assertFalse(wasEmptyIntentProcessed) verify { - sessionManager wasNot Called - loadUrlUseCase wasNot Called + addNewTabUseCase wasNot Called } } @Test fun `processing a Fennec shortcut Intent results in loading it's URL in a new Session`() = runBlocking { - mockkStatic(UUID::class) - // The Session constructor uses UUID.randomUUID().toString() as the default value for it's id field - every { UUID.randomUUID().toString() } returns "test" - val processor = FennecBookmarkShortcutsIntentProcessor(sessionManager, loadUrlUseCase) + val expectedSessionId = "test" + val processor = FennecBookmarkShortcutsIntentProcessor(addNewTabUseCase) val fennecShortcutsIntent = Intent(ACTION_FENNEC_HOMESCREEN_SHORTCUT) val testUrl = "http://mozilla.org" fennecShortcutsIntent.data = Uri.parse(testUrl) - val expectedSession = Session(testUrl, private = false, source = SessionState.Source.HOME_SCREEN) - val wasIntentProcessed = processor.process(fennecShortcutsIntent) + every { addNewTabUseCase( + url = testUrl, + flags = EngineSession.LoadUrlFlags.external(), + source = SessionState.Source.HOME_SCREEN, + selectTab = true, + startLoading = true) + } returns expectedSessionId + val wasIntentProcessed = processor.process(fennecShortcutsIntent) assertTrue(wasIntentProcessed) assertEquals(Intent.ACTION_VIEW, fennecShortcutsIntent.action) - assertEquals(expectedSession.id, fennecShortcutsIntent.getSessionId()) - verifyAll { - sessionManager.add(expectedSession, true) - loadUrlUseCase(testUrl, expectedSession.id, EngineSession.LoadUrlFlags.external()) + assertEquals(expectedSessionId, fennecShortcutsIntent.getSessionId()) + verify { + addNewTabUseCase( + url = testUrl, + flags = EngineSession.LoadUrlFlags.external(), + source = SessionState.Source.HOME_SCREEN, + selectTab = true, + startLoading = true + ) } } } diff --git a/app/src/test/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurementTest.kt b/app/src/test/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurementTest.kt index fa465b2fb..76c32c3ad 100644 --- a/app/src/test/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurementTest.kt +++ b/app/src/test/java/org/mozilla/fenix/perf/StartupFrameworkStartMeasurementTest.kt @@ -11,7 +11,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.spyk import io.mockk.verify import mozilla.components.service.glean.private.BooleanMetricType -import mozilla.components.service.glean.private.CounterMetricType +import mozilla.components.service.glean.private.QuantityMetricType import mozilla.components.service.glean.private.TimespanMetricType import org.junit.Before import org.junit.Test @@ -31,7 +31,7 @@ class StartupFrameworkStartMeasurementTest { @MockK(relaxed = true) private lateinit var frameworkPrimary: TimespanMetricType @MockK(relaxed = true) private lateinit var frameworkSecondary: TimespanMetricType @MockK(relaxed = true) private lateinit var frameworkStartError: BooleanMetricType - @MockK(relaxed = true) private lateinit var clockTicksPerSecond: CounterMetricType + @MockK(relaxed = true) private lateinit var clockTicksPerSecondV2: QuantityMetricType private var clockTicksPerSecondValue = -1L @@ -57,7 +57,7 @@ class StartupFrameworkStartMeasurementTest { every { telemetry.frameworkPrimary } returns frameworkPrimary every { telemetry.frameworkSecondary } returns frameworkSecondary every { telemetry.frameworkStartError } returns frameworkStartError - every { telemetry.clockTicksPerSecond } returns clockTicksPerSecond + every { telemetry.clockTicksPerSecondV2 } returns clockTicksPerSecondV2 metrics = StartupFrameworkStartMeasurement(stat, telemetry, getElapsedRealtimeNanos) } @@ -131,7 +131,7 @@ class StartupFrameworkStartMeasurementTest { val (setMetric, unsetMetric) = getSetAndUnsetMetric(isPrimary) verify(exactly = 1) { setMetric.setRawNanos(any()) } verify { unsetMetric wasNot Called } - verify(exactly = 1) { clockTicksPerSecond.add(any()) } + verify(exactly = 1) { clockTicksPerSecondV2.set(any()) } verify { frameworkStartError wasNot Called } } @@ -150,7 +150,7 @@ class StartupFrameworkStartMeasurementTest { verify { unsetMetric wasNot Called } val expectedClockTicksPerSecond = getExpectedClockTicksPerSecond(isPrimary) - verify { clockTicksPerSecond.add(expectedClockTicksPerSecond.toInt()) } + verify { clockTicksPerSecondV2.set(expectedClockTicksPerSecond) } verify { frameworkStartError wasNot Called } } @@ -158,7 +158,7 @@ class StartupFrameworkStartMeasurementTest { verify { frameworkStartError.set(true) } verify { frameworkPrimary wasNot Called } verify { frameworkSecondary wasNot Called } - verify { clockTicksPerSecond wasNot Called } + verify { clockTicksPerSecondV2 wasNot Called } } private fun getSetAndUnsetMetric(isPrimary: Boolean): Pair { diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt index f8b79a052..96218a32d 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt @@ -50,6 +50,7 @@ class SearchDialogControllerTest { @MockK private lateinit var sessionManager: SessionManager @MockK(relaxed = true) private lateinit var clearToolbarFocus: () -> Unit @MockK(relaxed = true) private lateinit var focusToolbar: () -> Unit + @MockK(relaxed = true) private lateinit var clearToolbar: () -> Unit @MockK(relaxed = true) private lateinit var dismissDialog: () -> Unit private lateinit var controller: SearchDialogController @@ -81,7 +82,8 @@ class SearchDialogControllerTest { metrics = metrics, dismissDialog = dismissDialog, clearToolbarFocus = clearToolbarFocus, - focusToolbar = focusToolbar + focusToolbar = focusToolbar, + clearToolbar = clearToolbar ) } diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchProviderModelTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchProviderModelTest.kt index 31879d39c..e9d856149 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchProviderModelTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchProviderModelTest.kt @@ -29,13 +29,13 @@ class SearchProviderModelTest { fun `test search provider contains ads`() { val ad = "https://www.bing.com/aclick" val nonAd = "https://www.bing.com/notanad" - assertTrue(testSearchProvider.containsAds(listOf(ad, nonAd))) + assertTrue(testSearchProvider.containsAdLinks(listOf(ad, nonAd))) } @Test fun `test search provider does not contain ads`() { val nonAd1 = "https://www.yahoo.com/notanad" val nonAd2 = "https://www.google.com/" - assertFalse(testSearchProvider.containsAds(listOf(nonAd1, nonAd2))) + assertFalse(testSearchProvider.containsAdLinks(listOf(nonAd1, nonAd2))) } } diff --git a/app/src/test/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetryTest.kt b/app/src/test/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetryTest.kt index ff6e290b4..c859dab52 100644 --- a/app/src/test/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetryTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetryTest.kt @@ -22,6 +22,7 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.search.telemetry.ExtensionInfo import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry.Companion.ADS_EXTENSION_ID import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry.Companion.ADS_EXTENSION_RESOURCE_URL +import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry.Companion.ADS_MESSAGE_COOKIES_KEY import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry.Companion.ADS_MESSAGE_DOCUMENT_URLS_KEY import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry.Companion.ADS_MESSAGE_ID import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry.Companion.ADS_MESSAGE_SESSION_URL_KEY @@ -55,7 +56,6 @@ class AdsTelemetryTest { @Test fun `track when ads are in the redirect path`() { - val metricEvent = slot() val sessionUrl = "https://www.google.com/search?q=aaa" ads.trackAdClickedMetric( @@ -63,8 +63,7 @@ class AdsTelemetryTest { listOf("https://www.google.com/aclk", "https://www.aaa.com") ) - verify { metrics.track(capture(metricEvent)) } - assertEquals(ads.providerList[0].name, metricEvent.captured.label) + verify { metrics.track(Event.SearchAdClicked("google.in-content.organic.none")) } } @Test @@ -86,12 +85,14 @@ class AdsTelemetryTest { val metricEvent = slot() val first = "https://www.google.com/aclk" val second = "https://www.google.com/aaa" - val array = JSONArray() - array.put(first) - array.put(second) + val urls = JSONArray() + urls.put(first) + urls.put(second) + val cookies = JSONArray() val message = JSONObject() - message.put(ADS_MESSAGE_DOCUMENT_URLS_KEY, array) + message.put(ADS_MESSAGE_DOCUMENT_URLS_KEY, urls) message.put(ADS_MESSAGE_SESSION_URL_KEY, "https://www.google.com/search?q=aaa") + message.put(ADS_MESSAGE_COOKIES_KEY, cookies) ads.processMessage(message) @@ -103,15 +104,37 @@ class AdsTelemetryTest { fun `process the document urls and don't find ads`() { val first = "https://www.google.com/aaaaaa" val second = "https://www.google.com/aaa" - val array = JSONArray() - array.put(first) - array.put(second) + val urls = JSONArray() + urls.put(first) + urls.put(second) + val cookies = JSONArray() val message = JSONObject() - message.put(ADS_MESSAGE_DOCUMENT_URLS_KEY, array) + message.put(ADS_MESSAGE_DOCUMENT_URLS_KEY, urls) message.put(ADS_MESSAGE_SESSION_URL_KEY, "https://www.google.com/search?q=aaa") + message.put(ADS_MESSAGE_COOKIES_KEY, cookies) ads.processMessage(message) verify(exactly = 0) { metrics.track(any()) } } + + @Test + fun `track bing sap-follow-on metric by cookies`() { + val url = "https://www.bing.com/search?q=aaa&pc=MOZMBA&form=QBRERANDOM" + + ads.cachedCookies = createCookieList() + ads.trackAdClickedMetric(url, listOf("https://www.bing.com/aclik", "https://www.aaa.com")) + + verify { metrics.track(Event.SearchAdClicked("bing.in-content.sap-follow-on.mozmba")) } + } + + private fun createCookieList(): List { + val first = JSONObject() + first.put("name", "SRCHS") + first.put("value", "PC=MOZMBA") + val second = JSONObject() + second.put("name", "RANDOM") + second.put("value", "RANDOM") + return listOf(first, second) + } } diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt index c1f4f463d..d55b6f2ea 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt @@ -15,6 +15,7 @@ import io.mockk.spyk import io.mockk.verify import io.mockk.verifyAll import mozilla.components.support.locale.LocaleManager +import mozilla.components.support.locale.LocaleUseCases import org.junit.Before import org.junit.Test import java.util.Locale @@ -23,13 +24,20 @@ class LocaleSettingsControllerTest { private val activity = mockk(relaxed = true) private val localeSettingsStore: LocaleSettingsStore = mockk(relaxed = true) + private val localeUseCases: LocaleUseCases = mockk(relaxed = true) private val mockState = LocaleSettingsState(mockk(), mockk(), mockk()) private lateinit var controller: DefaultLocaleSettingsController @Before fun setup() { - controller = spyk(DefaultLocaleSettingsController(activity, localeSettingsStore)) + controller = spyk( + DefaultLocaleSettingsController( + activity, + localeSettingsStore, + localeUseCases + ) + ) mockkObject(LocaleManager) mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") @@ -45,11 +53,13 @@ class LocaleSettingsControllerTest { verifyAll(inverse = true) { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) - LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) + LocaleManager.setNewLocale(activity, locale = selectedLocale) activity.recreate() } with(controller) { - verify(inverse = true) { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } + verify(inverse = true) { + LocaleManager.updateBaseConfiguration(activity, selectedLocale) + } } } @@ -57,8 +67,9 @@ class LocaleSettingsControllerTest { fun `set a new locale from the list if other locale is chosen`() { val selectedLocale = Locale("en", "UK") val otherLocale: Locale = mockk() + every { localeUseCases.notifyLocaleChanged } returns mockk() every { localeSettingsStore.state } returns mockState.copy(selectedLocale = otherLocale) - every { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } returns activity + every { LocaleManager.setNewLocale(activity, localeUseCases, selectedLocale) } returns activity with(controller) { every { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } just Runs } @@ -66,7 +77,7 @@ class LocaleSettingsControllerTest { controller.handleLocaleSelected(selectedLocale) verify { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) } - verify { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } + verify { LocaleManager.setNewLocale(activity, localeUseCases, selectedLocale) } verify { activity.recreate() } with(controller) { verify { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } @@ -76,9 +87,11 @@ class LocaleSettingsControllerTest { @Test fun `set a new locale from the list if default locale is not selected`() { val selectedLocale = Locale("en", "UK") + every { localeUseCases.notifyLocaleChanged } returns mockk() every { localeSettingsStore.state } returns mockState.copy(selectedLocale = selectedLocale) every { LocaleManager.getCurrentLocale(activity) } returns null - every { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } returns activity + every { LocaleManager.setNewLocale(activity, localeUseCases, selectedLocale) } returns activity + with(controller) { every { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } just Runs } @@ -86,7 +99,7 @@ class LocaleSettingsControllerTest { controller.handleLocaleSelected(selectedLocale) verify { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) } - verify { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } + verify { LocaleManager.setNewLocale(activity, localeUseCases, selectedLocale) } verify { activity.recreate() } with(controller) { verify { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } @@ -103,7 +116,7 @@ class LocaleSettingsControllerTest { verifyAll(inverse = true) { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) - LocaleManager.resetToSystemDefault(activity) + LocaleManager.resetToSystemDefault(activity, localeUseCases) activity.recreate() with(controller) { LocaleManager.updateBaseConfiguration(activity, selectedLocale) @@ -114,8 +127,9 @@ class LocaleSettingsControllerTest { @Test fun `set the default locale as the new locale`() { val selectedLocale = Locale("en", "UK") + every { localeUseCases.notifyLocaleChanged } returns mockk() every { localeSettingsStore.state } returns mockState.copy(localeList = listOf(selectedLocale)) - every { LocaleManager.resetToSystemDefault(activity) } just Runs + every { LocaleManager.resetToSystemDefault(activity, localeUseCases) } just Runs with(controller) { every { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } just Runs } @@ -123,7 +137,7 @@ class LocaleSettingsControllerTest { controller.handleDefaultLocaleSelected() verify { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) } - verify { LocaleManager.resetToSystemDefault(activity) } + verify { LocaleManager.resetToSystemDefault(activity, localeUseCases) } verify { activity.recreate() } with(controller) { verify { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt index 451d67a89..b1d005b89 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt @@ -66,6 +66,29 @@ class LocaleViewHoldersTest { verify { interactor.onLocaleSelected(selectedLocale) } } + @Test + // Note that after we can run tests on SDK 30 the result of the locale.getDisplayName(locale) could differ and this test will fail + fun `GIVEN a locale is not properly identified in Android WHEN we bind locale THEN the title and subtitle are set from locale maps`() { + + val otherLocale = Locale("vec") + + localeViewHolder.bind(otherLocale) + + assertEquals("Vèneto", view.locale_title_text.text) + assertEquals("Venitian", view.locale_subtitle_text.text) + } + + @Test + fun `GIVEN a locale is not properly identified in Android and it is not mapped WHEN we bind locale THEN the text is the capitalised code`() { + + val otherLocale = Locale("yyy") + + localeViewHolder.bind(otherLocale) + + assertEquals("Yyy", view.locale_title_text.text) + assertEquals("Yyy", view.locale_subtitle_text.text) + } + @Test fun `bind SystemLocaleViewHolder`() { systemLocaleViewHolder.bind(selectedLocale) diff --git a/app/src/test/java/org/mozilla/fenix/settings/logins/biometric/BiometricPromptFeatureTest.kt b/app/src/test/java/org/mozilla/fenix/settings/biometric/BiometricPromptFeatureTest.kt similarity index 95% rename from app/src/test/java/org/mozilla/fenix/settings/logins/biometric/BiometricPromptFeatureTest.kt rename to app/src/test/java/org/mozilla/fenix/settings/biometric/BiometricPromptFeatureTest.kt index c91a99441..66a081aac 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/logins/biometric/BiometricPromptFeatureTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/biometric/BiometricPromptFeatureTest.kt @@ -2,7 +2,7 @@ * 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.settings.logins.biometric +package org.mozilla.fenix.settings.biometric import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.N @@ -30,8 +30,8 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import org.mozilla.fenix.settings.logins.biometric.ext.isEnrolled -import org.mozilla.fenix.settings.logins.biometric.ext.isHardwareAvailable +import org.mozilla.fenix.settings.biometric.ext.isEnrolled +import org.mozilla.fenix.settings.biometric.ext.isHardwareAvailable import org.robolectric.annotation.Config @RunWith(FenixRobolectricTestRunner::class) diff --git a/app/src/test/java/org/mozilla/fenix/settings/logins/biometric/ext/BiometricManagerKtTest.kt b/app/src/test/java/org/mozilla/fenix/settings/biometric/ext/BiometricManagerKtTest.kt similarity index 96% rename from app/src/test/java/org/mozilla/fenix/settings/logins/biometric/ext/BiometricManagerKtTest.kt rename to app/src/test/java/org/mozilla/fenix/settings/biometric/ext/BiometricManagerKtTest.kt index 26b77a692..dd66dbc71 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/logins/biometric/ext/BiometricManagerKtTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/biometric/ext/BiometricManagerKtTest.kt @@ -2,7 +2,7 @@ * 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.settings.logins.biometric.ext +package org.mozilla.fenix.settings.biometric.ext import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE diff --git a/app/src/test/java/org/mozilla/fenix/settings/logins/SyncLoginsPreferenceViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/logins/LoginsSyncPreferenceViewTest.kt similarity index 84% rename from app/src/test/java/org/mozilla/fenix/settings/logins/SyncLoginsPreferenceViewTest.kt rename to app/src/test/java/org/mozilla/fenix/settings/logins/LoginsSyncPreferenceViewTest.kt index a6b68ecb4..c98544174 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/logins/SyncLoginsPreferenceViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/logins/LoginsSyncPreferenceViewTest.kt @@ -24,9 +24,10 @@ import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mozilla.fenix.R +import org.mozilla.fenix.settings.SyncPreferenceView import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections -class SyncLoginsPreferenceViewTest { +class LoginsSyncPreferenceViewTest { @MockK private lateinit var syncLoginsPreference: Preference @MockK private lateinit var lifecycleOwner: LifecycleOwner @@ -137,10 +138,25 @@ class SyncLoginsPreferenceViewTest { } } - private fun createView() = SyncLoginsPreferenceView( - syncLoginsPreference, - lifecycleOwner, - accountManager, - navController + private fun createView() = SyncPreferenceView( + syncPreference = syncLoginsPreference, + lifecycleOwner = lifecycleOwner, + accountManager = accountManager, + syncEngine = SyncEngine.Passwords, + onSignInToSyncClicked = { + val directions = + SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment() + navController.navigate(directions) + }, + onSyncStatusClicked = { + val directions = + SavedLoginsAuthFragmentDirections.actionGlobalAccountSettingsFragment() + navController.navigate(directions) + }, + onReconnectClicked = { + val directions = + SavedLoginsAuthFragmentDirections.actionGlobalAccountProblemFragment() + navController.navigate(directions) + } ) } diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt new file mode 100644 index 000000000..4ee3645ae --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/tabstray/TabLayoutObserverTest.kt @@ -0,0 +1,26 @@ +/* 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.tabstray + +import com.google.android.material.tabs.TabLayout +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import org.junit.Test + +class TabLayoutObserverTest { + private val interactor = mockk(relaxed = true) + + @Test + fun `WHEN tab is selected THEN notify the interactor`() { + val observer = TabLayoutObserver(interactor) + val tab = mockk() + every { tab.position } returns 1 + + observer.onTabSelected(tab) + + verify { interactor.setCurrentTrayPosition(1) } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/browser/RemoveTabUseCaseWrapperTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/browser/RemoveTabUseCaseWrapperTest.kt new file mode 100644 index 000000000..3e6914d83 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/tabstray/browser/RemoveTabUseCaseWrapperTest.kt @@ -0,0 +1,27 @@ +/* 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.tabstray.browser + +import io.mockk.mockk +import io.mockk.verify +import org.junit.Test +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.components.metrics.MetricController + +class RemoveTabUseCaseWrapperTest { + + val metricController = mockk(relaxed = true) + + @Test + fun `WHEN invoked THEN metrics, use case and callback are triggered`() { + val onRemove: (String) -> Unit = mockk(relaxed = true) + val wrapper = RemoveTabUseCaseWrapper(metricController, onRemove) + + wrapper("123") + + verify { metricController.track(Event.ClosedExistingTab) } + verify { onRemove("123") } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/browser/SelectTabUseCaseWrapperTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/browser/SelectTabUseCaseWrapperTest.kt new file mode 100644 index 000000000..fd0f24574 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/tabstray/browser/SelectTabUseCaseWrapperTest.kt @@ -0,0 +1,30 @@ +/* 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.tabstray.browser + +import io.mockk.mockk +import io.mockk.verify +import mozilla.components.feature.tabs.TabsUseCases +import org.junit.Test +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.components.metrics.MetricController + +class SelectTabUseCaseWrapperTest { + + val metricController = mockk(relaxed = true) + val selectUseCase: TabsUseCases.SelectTabUseCase = mockk(relaxed = true) + + @Test + fun `WHEN invoked THEN metrics, use case and callback are triggered`() { + val onSelect: (String) -> Unit = mockk(relaxed = true) + val wrapper = SelectTabUseCaseWrapper(metricController, selectUseCase, onSelect) + + wrapper("123") + + verify { metricController.track(Event.OpenedExistingTab) } + verify { selectUseCase("123") } + verify { onSelect("123") } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/ext/TabSessionStateKtTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/ext/TabSessionStateKtTest.kt new file mode 100644 index 000000000..410c4eac7 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/tabstray/ext/TabSessionStateKtTest.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.tabstray.ext + +import io.mockk.every +import io.mockk.mockk +import mozilla.components.browser.state.state.ContentState +import mozilla.components.browser.state.state.TabSessionState +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList.BrowserTabType.NORMAL +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList.BrowserTabType.PRIVATE +import org.mozilla.fenix.tabstray.browser.BaseBrowserTrayList.Configuration + +class TabSessionStateKtTest { + + @Test + fun `WHEN configuration is private THEN return true`() { + val contentState = mockk() + val state = TabSessionState(content = contentState) + val config = Configuration(PRIVATE) + + every { contentState.private } returns true + + assertTrue(state.filterFromConfig(config)) + } + + @Test + fun `WHEN configuration is normal THEN return false`() { + val contentState = mockk() + val state = TabSessionState(content = contentState) + val config = Configuration(NORMAL) + + every { contentState.private } returns false + + assertTrue(state.filterFromConfig(config)) + } + + @Test + fun `WHEN configuration does not match THEN return false`() { + val contentState = mockk() + val state = TabSessionState(content = contentState) + val config = Configuration(NORMAL) + + every { contentState.private } returns true + + assertFalse(state.filterFromConfig(config)) + + val config2 = Configuration(PRIVATE) + + every { contentState.private } returns false + + assertFalse(state.filterFromConfig(config2)) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/utils/ToolbarPopupWindowTest.kt b/app/src/test/java/org/mozilla/fenix/utils/ToolbarPopupWindowTest.kt index 69ef82b3a..d56f1b50b 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/ToolbarPopupWindowTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/ToolbarPopupWindowTest.kt @@ -4,35 +4,44 @@ package org.mozilla.fenix.utils -import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestCoroutineDispatcher +import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.ReaderState import mozilla.components.browser.state.state.createCustomTab import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.support.test.ext.joinBlocking +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Assert.assertEquals +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +@ExperimentalCoroutinesApi @RunWith(FenixRobolectricTestRunner::class) class ToolbarPopupWindowTest { + private val testDispatcher = TestCoroutineDispatcher() - @Test - fun getUrlForClipboard() { - val customTabSession = createCustomTab("https://mozilla.org") + @get:Rule + val coroutinesTestRule = MainCoroutineRule(testDispatcher) + @Test + fun `getUrlForClipboard should get the right URL`() { // Custom tab + val customTabSession = createCustomTab("https://mozilla.org") + var store = BrowserStore(BrowserState(customTabs = listOf(customTabSession))) assertEquals( "https://mozilla.org", - ToolbarPopupWindow.getUrlForClipboard(mockk(), customTabSession) + ToolbarPopupWindow.getUrlForClipboard(store, customTabSession.id) ) // Regular tab val regularTab = createTab(url = "http://firefox.com") - var store = - BrowserStore(BrowserState(tabs = listOf(regularTab), selectedTabId = regularTab.id)) - assertEquals(regularTab.content.url, ToolbarPopupWindow.getUrlForClipboard(store)) + store = BrowserStore(BrowserState(tabs = listOf(regularTab), selectedTabId = regularTab.id)) + assertEquals("http://firefox.com", ToolbarPopupWindow.getUrlForClipboard(store)) // Reader Tab val readerTab = createTab( @@ -40,6 +49,24 @@ class ToolbarPopupWindowTest { readerState = ReaderState(active = true, activeUrl = "https://blog.mozilla.org/123") ) store = BrowserStore(BrowserState(tabs = listOf(readerTab), selectedTabId = readerTab.id)) - assertEquals(readerTab.readerState.activeUrl, ToolbarPopupWindow.getUrlForClipboard(store)) + assertEquals("https://blog.mozilla.org/123", ToolbarPopupWindow.getUrlForClipboard(store)) + } + + @Test + fun `getUrlForClipboard should get the updated URL`() { + // Custom tab + val customTabSession = createCustomTab("https://mozilla.org") + var store = BrowserStore(BrowserState(customTabs = listOf(customTabSession))) + store.dispatch(ContentAction.UpdateUrlAction(customTabSession.id, "https://firefox.com")).joinBlocking() + assertEquals( + "https://firefox.com", + ToolbarPopupWindow.getUrlForClipboard(store, customTabSession.id) + ) + + // Regular tab + val regularTab = createTab(url = "http://firefox.com") + store = BrowserStore(BrowserState(tabs = listOf(regularTab), selectedTabId = regularTab.id)) + store.dispatch(ContentAction.UpdateUrlAction(regularTab.id, "https://mozilla.org")).joinBlocking() + assertEquals("https://mozilla.org", ToolbarPopupWindow.getUrlForClipboard(store)) } } diff --git a/automation/taskcluster/androidTest/flank-x86-start-test.yml b/automation/taskcluster/androidTest/flank-x86-start-test.yml index 16292c98e..c9a24e662 100644 --- a/automation/taskcluster/androidTest/flank-x86-start-test.yml +++ b/automation/taskcluster/androidTest/flank-x86-start-test.yml @@ -35,6 +35,12 @@ gcloud: test-targets: - class org.mozilla.fenix.ui.NavigationToolbarTest#visitURLTest + - class org.mozilla.fenix.ui.HistoryTest#visitedUrlHistoryTest + - class org.mozilla.fenix.ui.SmokeTest#openMainMenuSettingsItemTest + - class org.mozilla.fenix.ui.SmokeTest#toggleSearchSuggestions + - class org.mozilla.fenix.ui.SmokeTest#deleteCollectionTest + - class org.mozilla.fenix.ui.SmokeTest#noHistoryInPrivateBrowsingTest + - class org.mozilla.fenix.ui.NoNetworkAccessStartupTests#noNetworkConnectionStartupTest device: - model: Pixel2 @@ -42,6 +48,9 @@ gcloud: flank: project: GOOGLE_PROJECT + # test shards - the amount of groups to split the test suite into + # set to -1 to use one shard per test. + max-test-shards: 1 # num-test-runs: the amount of times to run the tests. # 1 runs the tests once. 10 runs all the tests 10x num-test-runs: 1 diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 508a8d43d..c3d133e6a 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -7,5 +7,12 @@ plugins { } repositories { - jcenter() + if (project.hasProperty("centralRepo")) { + maven { + name "MavenCentral" + url project.property("centralRepo") + } + } else { + mavenCentral() + } } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5899e75df..e4d4022f8 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 = "73.0.11" + const val VERSION = "74.0.9" } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 6b103a612..7263bc171 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -93,6 +93,7 @@ object Deps { const val mozilla_feature_accounts = "org.mozilla.components:feature-accounts:${Versions.mozilla_android_components}" const val mozilla_feature_app_links = "org.mozilla.components:feature-app-links:${Versions.mozilla_android_components}" + const val mozilla_feature_autofill = "org.mozilla.components:feature-autofill:${Versions.mozilla_android_components}" const val mozilla_feature_awesomebar = "org.mozilla.components:feature-awesomebar:${Versions.mozilla_android_components}" const val mozilla_feature_contextmenu = "org.mozilla.components:feature-contextmenu:${Versions.mozilla_android_components}" const val mozilla_feature_customtabs = "org.mozilla.components:feature-customtabs:${Versions.mozilla_android_components}" @@ -126,6 +127,8 @@ object Deps { const val mozilla_service_digitalassetlinks = "org.mozilla.components:service-digitalassetlinks:${Versions.mozilla_android_components}" + const val mozilla_service_sync_autofill = + "org.mozilla.components:service-sync-autofill:${Versions.mozilla_android_components}" const val mozilla_service_sync_logins = "org.mozilla.components:service-sync-logins:${Versions.mozilla_android_components}" const val mozilla_service_firefox_accounts = "org.mozilla.components:service-firefox-accounts:${Versions.mozilla_android_components}" diff --git a/config/pre-push-recommended.sh b/config/pre-push-recommended.sh index 28e245997..9d140ce3d 100755 --- a/config/pre-push-recommended.sh +++ b/config/pre-push-recommended.sh @@ -14,6 +14,25 @@ # Descriptions for each gradle task below can be found in the # output of `./gradlew tasks`. +# Prevent push if generated glean docs are not committed. +# A better implementation would make sure these doc updates +# only came from this commit. +./gradlew -q \ + gleanGenerateMetricsDocsForDebug \ + gleanGenerateMetricsSourceForDebug +if git status --porcelain=v1 | grep -q "docs/metrics.md"; then + echo " +FAIL pre-push hook: generated glean file, docs/metrics.md, has uncommitted changes. +Please commit these files and try again. + +This check tries to prevent these generated files from being uncommitted on master. +However, it may fail unintuitively if we're in that state. If this happens often +and is disruptive to your workflow, please notify mcomella so we can improve this +check." >&2 + exit 1 +fi + +# Run core checks. ./gradlew -q \ ktlint \ detekt \ diff --git a/docs/metrics.md b/docs/metrics.md index 0c988a1d7..63598cc4a 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -1,18 +1,18 @@ # Metrics + This document enumerates the metrics collected by this project using the [Glean SDK](https://mozilla.github.io/glean/book/index.html). This project may depend on other projects which also collect metrics. This means you might have to go searching through the dependency tree to get a full picture of everything collected by this project. # Pings - - [activation](#activation) - - [events](#events) - - [first-session](#first-session) - - [metrics](#metrics) - - [startup-timeline](#startup-timeline) - +- [activation](#activation) +- [events](#events) +- [first-session](#first-session) +- [metrics](#metrics) +- [startup-timeline](#startup-timeline) ## activation @@ -31,12 +31,14 @@ an hashed version of the Google Advertising ID. - - -The following metrics are added to the ping: +All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections. + +In addition to those built-in metrics, the following metrics are added to the ping: | Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) | | --- | --- | --- | --- | --- | --- | --- | -| activation.activation_id |[uuid](https://mozilla.github.io/glean/book/user/metrics/uuid.html) |An alternate identifier, not correlated with the client_id, generated once and only sent with the activation ping. |[1](https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |4 | -| activation.identifier |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A hashed and salted version of the Google Advertising ID from the device. This will never be sent in a ping that also contains the client_id. |[1](https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |4 | +| activation.activation_id |[uuid](https://mozilla.github.io/glean/book/user/metrics/uuid.html) |An alternate identifier, not correlated with the client_id, generated once and only sent with the activation ping. |[mozilla-mobile/fenix#1707](https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |4 | +| activation.identifier |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A hashed and salted version of the Google Advertising ID from the device. This will never be sent in a ping that also contains the client_id. |[mozilla-mobile/fenix#1707](https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |4 | ## events @@ -44,204 +46,218 @@ This is a built-in ping that is assembled out of the box by the Glean SDK. See the Glean SDK documentation for the [`events` ping](https://mozilla.github.io/glean/book/user/pings/events.html). -The following metrics are added to the ping: +All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections. + +In addition to those built-in metrics, the following metrics are added to the ping: | Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) | | --- | --- | --- | --- | --- | --- | --- | -| about_page.privacy_notice_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped on "Privacy notice" item from About page |[1](https://github.com/mozilla-mobile/fenix/pull/8047), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| about_page.support_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped on "Support" item from About page |[1](https://github.com/mozilla-mobile/fenix/pull/8047), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| addons.open_addon_in_toolbar_menu |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user interacted with an installed add-on in the toolbar menu |[1](https://github.com/mozilla-mobile/fenix/pull/8318), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • addon_id: The id of the add-on that was interacted with in the toolbar menu
|2021-04-01 |2 | -| addons.open_addons_in_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed "Add-ons" from the Settings |[1](https://github.com/mozilla-mobile/fenix/pull/8318), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| android_keystore_experiment.experiment_failure |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Records an instance of an unexpected failure during the experiment |[1](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • failure_exception: Exception class associated with an unexpected failure of this experiment, not caught by the other failure handlers.
|2021-09-01 |1 | -| android_keystore_experiment.get_failure |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Unexpected failure when trying to read from secure prefs. |[1](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • failure_exception: Exception class associated with an unexpected failure of this experiment.
|2021-09-01 |1 | -| android_keystore_experiment.get_result |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Success when trying to read from secure prefs. |[1](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • result: Result code identifying whether the read operation returned the expected value or not.
|2021-09-01 |1 | -| android_keystore_experiment.reset |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An experiment failed, and was reset to run again in the future from a blank state. |[1](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)||2021-09-01 |1 | -| android_keystore_experiment.write_failure |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Unexpected failure when trying to write to secure prefs. |[1](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • failure_exception: Exception class associated with an unexpected failure of this experiment.
|2021-09-01 |1 | -| android_keystore_experiment.write_success |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Success in writing to secure prefs. |[1](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)||2021-09-01 |1 | -| app_theme.dark_theme_selected |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected Dark Theme |[1](https://github.com/mozilla-mobile/fenix/pull/7968), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: The source from where dark theme was selected. The source can be 'SETTINGS' or 'ONBOARDING'
|2021-04-01 |2 | -| autoplay.setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their autoplay setting to either block_cellular, block_audio, or block_all. |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)|
  • autoplay_setting: The new setting for autoplay: block_cellular, block_audio, or block_all.
|2021-08-01 |2 | -| autoplay.visited_setting |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user visited the autoplay settings screen |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)||2021-08-01 |2 | -| banner_open_in_app.dismissed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'dismiss' on Open in App banner. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 | -| banner_open_in_app.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Open in App banner was shown. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 | -| banner_open_in_app.go_to_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'go to settings' on Open in App banner. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 | -| bookmarks_management.copied |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user copied a bookmark. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.edited |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user edited the title and/or URL of an existing bookmark. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.folder_add |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a new bookmark folder. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.folder_remove |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a bookmark folder. |[1](https://github.com/mozilla-mobile/fenix/pull/3724), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.moved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user moved an existing bookmark or folder to another folder. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.multi_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed multiple bookmarks at once. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.open_in_new_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a bookmark in a new tab. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.open_in_new_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened multiple bookmarks at once in new tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.open_in_private_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a bookmark in a new private tab. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.open_in_private_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened multiple bookmarks at once in new private tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a bookmark item. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| bookmarks_management.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user shared a bookmark. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| collections.add_tab_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the "add tab" button in the three dot menu of collections |[1](https://github.com/mozilla-mobile/fenix/pull/4358), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| collections.all_tabs_restored |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped "open tabs" from collection menu |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.long_press |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user long pressed on a tab, triggering the collection creation screen |[1](https://github.com/mozilla-mobile/fenix/pull/4358), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| collections.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped delete collection from collection menu |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.rename_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "rename collection" button in the three dot menu |[1](https://github.com/mozilla-mobile/fenix/pull/4539), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| collections.renamed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user renamed a collection |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.save_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "save to collection" button on either the home or browser screen, triggering the collection creation screen to open (tab_select_opened) |[1](https://github.com/mozilla-mobile/fenix/pull/4358), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • from_screen: A string representing the screen from which the user pressed the save button. Currently one of: `browserMenu`, `homeMenu` or `home`
|2021-04-01 |2 | -| collections.saved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user saved a list of tabs to a new collection |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • tabs_open: The number of tabs open in the current session
  • tabs_selected: The number of tabs added to the collection
|2021-04-01 |1, 2 | -| collections.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped share collection |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.tab_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped remove tab from collection tab list |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.tab_restored |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user restored a tab from collection tab list |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.tab_select_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the select tabs screen (the first step of the collection creation flow) |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |1, 2 | -| collections.tabs_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user saved a list of tabs to an existing collection |[1](https://github.com/mozilla-mobile/fenix/pull/3935), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • tabs_open: The number of tabs open in the current session
  • tabs_selected: The number of tabs added to the collection
|2021-04-01 |1, 2 | -| context_menu.item_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped an item in the browsers context menu |[1](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [3](https://github.com/mozilla-mobile/fenix/issues/16076#issuecomment-726216734)|
  • named: The name of the item that was tapped. Available items are: ``` open_in_new_tab, open_in_private_tab, open_image_in_new_tab, save_image, share_link, copy_link, copy_image_location, share_image ```
|2021-04-01 |2 | -| contextual_hint.tracking_protection.dismiss |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The enhanced tracking protection contextual hint was dismissed by pressing the close button |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| contextual_hint.tracking_protection.display |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The enhanced tracking protection contextual hint was displayed. |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| contextual_hint.tracking_protection.inside_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user tapped inside of the etp contextual hint (which brings up the etp panel for this site). |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| contextual_hint.tracking_protection.outside_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user tapped outside of the etp contextual hint (which has no effect). |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| contextual_menu.copy_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'copy' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | -| contextual_menu.search_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'search' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | -| contextual_menu.select_all_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'select all' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | -| contextual_menu.share_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'share' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | -| crash_reporter.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The crash reporter was closed |[1](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • crash_submitted: A boolean that tells us whether or not the user submitted a crash report
|2021-04-01 |2 | -| crash_reporter.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The crash reporter was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| custom_tab.action_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the action button provided by the launching app |[1](https://github.com/mozilla-mobile/fenix/pull/1697), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| custom_tab.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the custom tab |[1](https://github.com/mozilla-mobile/fenix/pull/1697), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| custom_tab.menu |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the custom tabs menu |[1](https://github.com/mozilla-mobile/fenix/pull/1697), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| download_notification.cancel |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user cancelled a download 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 | -| download_notification.in_app_open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a downloaded file in the in-app notification link |[1](https://github.com/mozilla-mobile/fenix/pull/6554), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| download_notification.in_app_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 in-app notification link |[1](https://github.com/mozilla-mobile/fenix/pull/6554), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | -| download_notification.open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a downloaded file 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 | -| download_notification.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user paused a download 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 | -| download_notification.resume |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user resumed a download 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 | -| 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 | -| downloads_management.downloads_screen_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for the number of times users access the "Downloads" folder inside the app. |[1](https://github.com/mozilla-mobile/fenix/pull/16728)||2021-04-01 | | -| downloads_management.item_deleted |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for how often a user deletes one / more downloads at a time. |[1](https://github.com/mozilla-mobile/fenix/pull/16728)||2021-04-01 | | -| downloads_management.item_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for how often a user tap to opens a download from inside the "Downloads" folder. |[1](https://github.com/mozilla-mobile/fenix/pull/16728)||2021-04-01 | | -| downloads_misc.download_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for how many times something is downloaded in the app. |[1](https://github.com/mozilla-mobile/fenix/pull/16730)||2021-04-01 | | -| 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), [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.copy_url_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event that indicates that a user has selected copy option when long pressing on url bar. |[1](https://github.com/mozilla-mobile/fenix/pull/16915)||2021-05-10 |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 | -| events.opened_link |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a link with Fenix |[1](https://github.com/mozilla-mobile/fenix/pull/5975), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • mode: The mode the link was opened in. Either 'PRIVATE' or 'NORMAL'. N.B.: this probe may be incorrectly implemented: see https://github.com/mozilla-mobile/fenix/issues/14133
|2021-04-01 |2 | -| events.performed_search |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user performed a search |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/1677), [3](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: A string that tells us how the user performed the search. Possible values are: * default.action * default.suggestion * shortcut.action * shortcut.suggestion
|2021-04-01 |2 | -| events.preference_toggled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user toggled a boolean preference in settings |[1](https://github.com/mozilla-mobile/fenix/pull/1896), [2](https://github.com/mozilla-mobile/fenix/pull/5704), [3](https://github.com/mozilla-mobile/fenix/pull/5886), [4](https://github.com/mozilla-mobile/fenix/pull/5975), [5](https://github.com/mozilla-mobile/fenix/pull/6352), [6](https://github.com/mozilla-mobile/fenix/pull/6601), [7](https://github.com/mozilla-mobile/fenix/pull/6746), [8](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • enabled: Whether or not the preference is *now* enabled
  • preference_key: The preference key for the boolean (true/false) preference the user toggled. We currently track: show_search_suggestions, remote_debugging, telemetry, tracking_protection, search_bookmarks, search_browsing_history, show_clipboard_suggestions, show_search_shortcuts, open_links_in_a_private_tab (bug in implementation https://github.com/mozilla-mobile/fenix/issues/7384), pref_key_sync_logins, pref_key_sync_bookmarks, pref_key_sync_history, pref_key_show_voice_search, and pref_key_show_search_suggestions_in_private.
|2021-06-01 |1, 2 | -| events.recently_closed_tabs_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event that indicates that the user has accessed recently closed tabs list. |[1](https://github.com/mozilla-mobile/fenix/pull/16739)||2021-05-10 |2 | -| 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.synced_tab_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event that indicates that a synced tab was opened. |[1](https://github.com/mozilla-mobile/fenix/pull/16727)||2021-05-10 |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), [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-08-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-08-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-08-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-08-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), [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), [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.fullscreen |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Video set to fullscreen. |[1](https://github.com/mozilla-mobile/fenix/pull/16833)||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.picture_in_picture |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Video set to picture in picture mode. |[1](https://github.com/mozilla-mobile/fenix/pull/16833)||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 | -| 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.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 | -| 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 | -| 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.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.setting_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tab settings were opened. |[1](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||2021-08-01 |2 | -| tabs_tray.cfr.dismiss |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user dismisses the tabs tray CFR. |[1](https://github.com/mozilla-mobile/fenix/pull/17442), [2](https://github.com/mozilla-mobile/fenix/issues/16485#issuecomment-759641324)||2021-08-01 |2 | -| tabs_tray.cfr.go_to_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selects the CFR option to navigate to settings. |[1](https://github.com/mozilla-mobile/fenix/pull/17442), [2](https://github.com/mozilla-mobile/fenix/issues/16485#issuecomment-759641324)||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 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_google_search_attribution |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the google top site |[1](https://github.com/mozilla-mobile/fenix/pull/17637)||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 | +| about_page.privacy_notice_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped on "Privacy notice" item from About page |[mozilla-mobile/fenix#8047](https://github.com/mozilla-mobile/fenix/pull/8047), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| about_page.support_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped on "Support" item from About page |[mozilla-mobile/fenix#8047](https://github.com/mozilla-mobile/fenix/pull/8047), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| addons.open_addon_in_toolbar_menu |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user interacted with an installed add-on in the toolbar menu |[mozilla-mobile/fenix#8318](https://github.com/mozilla-mobile/fenix/pull/8318), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • addon_id: The id of the add-on that was interacted with in the toolbar menu
|2021-07-01 |2 | +| addons.open_addons_in_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed "Add-ons" from the Settings |[mozilla-mobile/fenix#8318](https://github.com/mozilla-mobile/fenix/pull/8318), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| android_keystore_experiment.experiment_failure |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Records an instance of an unexpected failure during the experiment |[mozilla-mobile/fenix#18333](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • failure_exception: Exception class associated with an unexpected failure of this experiment, not caught by the other failure handlers.
|2021-09-01 |1 | +| android_keystore_experiment.get_failure |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Unexpected failure when trying to read from secure prefs. |[mozilla-mobile/fenix#18333](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • failure_exception: Exception class associated with an unexpected failure of this experiment.
|2021-09-01 |1 | +| android_keystore_experiment.get_result |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Success when trying to read from secure prefs. |[mozilla-mobile/fenix#18333](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • result: Result code identifying whether the read operation returned the expected value or not.
|2021-09-01 |1 | +| android_keystore_experiment.reset |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An experiment failed, and was reset to run again in the future from a blank state. |[mozilla-mobile/fenix#18333](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)||2021-09-01 |1 | +| android_keystore_experiment.write_failure |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Unexpected failure when trying to write to secure prefs. |[mozilla-mobile/fenix#18333](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)|
  • failure_exception: Exception class associated with an unexpected failure of this experiment.
|2021-09-01 |1 | +| android_keystore_experiment.write_success |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Success in writing to secure prefs. |[mozilla-mobile/fenix#18333](https://github.com/mozilla-mobile/fenix/pull/18333#pullrequestreview-612447395)||2021-09-01 |1 | +| app_theme.dark_theme_selected |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected Dark Theme |[mozilla-mobile/fenix#7968](https://github.com/mozilla-mobile/fenix/pull/7968), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • source: The source from where dark theme was selected. The source can be 'SETTINGS' or 'ONBOARDING'
|2021-07-01 |2 | +| autoplay.setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their autoplay setting to either block_cellular, block_audio, or block_all. |[mozilla-mobile/fenix#13041](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)|
  • autoplay_setting: The new setting for autoplay: block_cellular, block_audio, or block_all.
|2021-08-01 |2 | +| autoplay.visited_setting |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user visited the autoplay settings screen |[mozilla-mobile/fenix#13041](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)||2021-08-01 |2 | +| awesomebar.bookmark_suggestion_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The bookmark suggestion in awesomebar was clicked. |[mozilla-mobile/fenix#18090](https://github.com/mozilla-mobile/fenix/pull/18090)||2021-08-01 |2 | +| awesomebar.clipboard_suggestion_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The clipboard suggestion in awesomebar was clicked. |[mozilla-mobile/fenix#18090](https://github.com/mozilla-mobile/fenix/pull/18090)||2021-08-01 |2 | +| awesomebar.history_suggestion_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The history suggestion in awesomebar was clicked. |[mozilla-mobile/fenix#18090](https://github.com/mozilla-mobile/fenix/pull/18090)||2021-08-01 |2 | +| awesomebar.opened_tab_suggestion_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The opened tab suggestion in awesomebar was clicked. |[mozilla-mobile/fenix#18090](https://github.com/mozilla-mobile/fenix/pull/18090)||2021-08-01 |2 | +| awesomebar.search_action_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The search action in awesomebar was clicked. |[mozilla-mobile/fenix#18090](https://github.com/mozilla-mobile/fenix/pull/18090)||2021-08-01 |2 | +| awesomebar.search_suggestion_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The search suggestion in awesomebar was clicked. |[mozilla-mobile/fenix#18090](https://github.com/mozilla-mobile/fenix/pull/18090)||2021-08-01 |2 | +| banner_open_in_app.dismissed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'dismiss' on Open in App banner. |[mozilla-mobile/fenix#17049](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 | +| banner_open_in_app.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Open in App banner was shown. |[mozilla-mobile/fenix#17049](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 | +| banner_open_in_app.go_to_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'go to settings' on Open in App banner. |[mozilla-mobile/fenix#17049](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 | +| bookmarks_management.copied |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user copied a bookmark. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.edited |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user edited the title and/or URL of an existing bookmark. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.folder_add |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a new bookmark folder. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.folder_remove |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a bookmark folder. |[mozilla-mobile/fenix#3724](https://github.com/mozilla-mobile/fenix/pull/3724), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.moved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user moved an existing bookmark or folder to another folder. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.multi_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed multiple bookmarks at once. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a bookmark. |[mozilla-mobile/fenix#18174](https://github.com/mozilla-mobile/fenix/pull/18174)||2022-08-01 |2 | +| bookmarks_management.open_in_new_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a bookmark in a new tab. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.open_in_new_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened multiple bookmarks at once in new tabs. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.open_in_private_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a bookmark in a new private tab. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.open_in_private_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened multiple bookmarks at once in new private tabs. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a bookmark item. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| bookmarks_management.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user shared a bookmark. |[mozilla-mobile/fenix#1708](https://github.com/mozilla-mobile/fenix/pull/1708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| collections.add_tab_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the "add tab" button in the three dot menu of collections |[mozilla-mobile/fenix#4358](https://github.com/mozilla-mobile/fenix/pull/4358), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| collections.all_tabs_restored |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped "open tabs" from collection menu |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.long_press |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user long pressed on a tab, triggering the collection creation screen |[mozilla-mobile/fenix#4358](https://github.com/mozilla-mobile/fenix/pull/4358), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| collections.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped delete collection from collection menu |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.rename_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "rename collection" button in the three dot menu |[mozilla-mobile/fenix#4539](https://github.com/mozilla-mobile/fenix/pull/4539), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| collections.renamed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user renamed a collection |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.save_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the "save to collection" button on either the home or browser screen, triggering the collection creation screen to open (tab_select_opened) |[mozilla-mobile/fenix#4358](https://github.com/mozilla-mobile/fenix/pull/4358), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • from_screen: A string representing the screen from which the user pressed the save button. Currently one of: `browserMenu`, `homeMenu` or `home`
|2021-07-01 |2 | +| collections.saved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user saved a list of tabs to a new collection |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • tabs_open: The number of tabs open in the current session
  • tabs_selected: The number of tabs added to the collection
|2021-07-01 |1, 2 | +| collections.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped share collection |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.tab_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped remove tab from collection tab list |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.tab_restored |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user restored a tab from collection tab list |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.tab_select_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the select tabs screen (the first step of the collection creation flow) |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |1, 2 | +| collections.tabs_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user saved a list of tabs to an existing collection |[mozilla-mobile/fenix#3935](https://github.com/mozilla-mobile/fenix/pull/3935), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • tabs_open: The number of tabs open in the current session
  • tabs_selected: The number of tabs added to the collection
|2021-07-01 |1, 2 | +| context_menu.item_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped an item in the browsers context menu |[mozilla-mobile/fenix#1344](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix/issues/16076](https://github.com/mozilla-mobile/fenix/issues/16076#issuecomment-726216734), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • named: The name of the item that was tapped. Available items are: ``` open_in_new_tab, open_in_private_tab, open_image_in_new_tab, save_image, share_link, copy_link, copy_image_location, share_image ```
|2021-07-01 |2 | +| contextual_hint.tracking_protection.dismiss |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The enhanced tracking protection contextual hint was dismissed by pressing the close button |[mozilla-mobile/fenix#11923](https://github.com/mozilla-mobile/fenix/pull/11923), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| contextual_hint.tracking_protection.display |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The enhanced tracking protection contextual hint was displayed. |[mozilla-mobile/fenix#11923](https://github.com/mozilla-mobile/fenix/pull/11923), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| contextual_hint.tracking_protection.inside_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user tapped inside of the etp contextual hint (which brings up the etp panel for this site). |[mozilla-mobile/fenix#11923](https://github.com/mozilla-mobile/fenix/pull/11923), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| contextual_hint.tracking_protection.outside_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user tapped outside of the etp contextual hint (which has no effect). |[mozilla-mobile/fenix#11923](https://github.com/mozilla-mobile/fenix/pull/11923), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| contextual_menu.copy_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'copy' option was used. |[mozilla-mobile/fenix#16968](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| contextual_menu.search_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'search' option was used. |[mozilla-mobile/fenix#16968](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| contextual_menu.select_all_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'select all' option was used. |[mozilla-mobile/fenix#16968](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| contextual_menu.share_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'share' option was used. |[mozilla-mobile/fenix#16968](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| crash_reporter.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The crash reporter was closed |[mozilla-mobile/fenix#1214](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • crash_submitted: A boolean that tells us whether or not the user submitted a crash report
|2021-07-01 |2 | +| crash_reporter.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The crash reporter was displayed |[mozilla-mobile/fenix#1214](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| custom_tab.action_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the action button provided by the launching app |[mozilla-mobile/fenix#1697](https://github.com/mozilla-mobile/fenix/pull/1697), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| custom_tab.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the custom tab |[mozilla-mobile/fenix#1697](https://github.com/mozilla-mobile/fenix/pull/1697), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| custom_tab.menu |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the custom tabs menu |[mozilla-mobile/fenix#1697](https://github.com/mozilla-mobile/fenix/pull/1697), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| download_notification.cancel |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user cancelled a download in the download notification |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| download_notification.in_app_open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a downloaded file in the in-app notification link |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| download_notification.in_app_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 in-app notification link |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| download_notification.open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a downloaded file in the download notification |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| download_notification.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user paused a download in the download notification |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| download_notification.resume |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user resumed a download in the download notification |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| 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 |[mozilla-mobile/fenix#6554](https://github.com/mozilla-mobile/fenix/pull/6554), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| downloads_management.downloads_screen_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for the number of times users access the "Downloads" folder inside the app. |[mozilla-mobile/fenix#16728](https://github.com/mozilla-mobile/fenix/pull/16728), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 | | +| downloads_management.item_deleted |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for how often a user deletes one / more downloads at a time. |[mozilla-mobile/fenix#16728](https://github.com/mozilla-mobile/fenix/pull/16728), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 | | +| downloads_management.item_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for how often a user tap to opens a download from inside the "Downloads" folder. |[mozilla-mobile/fenix#16728](https://github.com/mozilla-mobile/fenix/pull/16728), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 | | +| downloads_misc.download_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A counter for how many times something is downloaded in the app. |[mozilla-mobile/fenix#16730](https://github.com/mozilla-mobile/fenix/pull/16730), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 | | +| error_page.visited_error |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user encountered an error page |[mozilla-mobile/fenix#2491](https://github.com/mozilla-mobile/fenix/pull/2491#issuecomment-492414486), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • error_type: The error type of the error page encountered
|2021-07-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) |[mozilla-mobile/fenix#1067](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • source: The method used to open Fenix. Possible values are: `app_icon`, `custom_tab` or `link`
|2021-07-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]. |[mozilla-mobile/fenix#12114](https://github.com/mozilla-mobile/fenix/pull/12114#pullrequestreview-445245341), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#13494](https://github.com/mozilla-mobile/fenix/pull/13494#pullrequestreview-474050499), [mozilla-mobile/fenix#15605](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. |[mozilla-mobile/fenix#11940/](https://github.com/mozilla-mobile/fenix/pull/11940/), [mozilla-mobile/fenix#13958](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 |[mozilla-mobile/fenix#1214](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [mozilla-mobile/fenix#5098](https://github.com/mozilla-mobile/fenix/pull/5098#issuecomment-529658996), [mozilla-mobile/fenix#6310](https://github.com/mozilla-mobile/fenix/pull/6310), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • 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-07-01 |2 | +| events.copy_url_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event that indicates that a user has selected copy option when long pressing on url bar. |[mozilla-mobile/fenix#16915](https://github.com/mozilla-mobile/fenix/pull/16915)||2021-05-10 |2 | +| events.entered_url |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user entered a url |[mozilla-mobile/fenix#1067](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • autocomplete: A boolean that tells us whether the URL was autofilled by an Autocomplete suggestion
|2021-07-01 |2 | +| events.opened_link |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a link with Fenix |[mozilla-mobile/fenix#5975](https://github.com/mozilla-mobile/fenix/pull/5975), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • mode: The mode the link was opened in. Either 'PRIVATE' or 'NORMAL'. N.B.: this probe may be incorrectly implemented: see https://github.com/mozilla-mobile/fenix/issues/14133
|2021-07-01 |2 | +| events.performed_search |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user performed a search |[mozilla-mobile/fenix#1067](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [mozilla-mobile/fenix#1677](https://github.com/mozilla-mobile/fenix/pull/1677), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • source: A string that tells us how the user performed the search. Possible values are: * default.action * default.suggestion * shortcut.action * shortcut.suggestion
|2021-07-01 |2 | +| events.preference_toggled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user toggled a boolean preference in settings |[mozilla-mobile/fenix#1896](https://github.com/mozilla-mobile/fenix/pull/1896), [mozilla-mobile/fenix#5704](https://github.com/mozilla-mobile/fenix/pull/5704), [mozilla-mobile/fenix#5886](https://github.com/mozilla-mobile/fenix/pull/5886), [mozilla-mobile/fenix#5975](https://github.com/mozilla-mobile/fenix/pull/5975), [mozilla-mobile/fenix#6352](https://github.com/mozilla-mobile/fenix/pull/6352), [mozilla-mobile/fenix#6601](https://github.com/mozilla-mobile/fenix/pull/6601), [mozilla-mobile/fenix#6746](https://github.com/mozilla-mobile/fenix/pull/6746), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • enabled: Whether or not the preference is *now* enabled
  • preference_key: The preference key for the boolean (true/false) preference the user toggled. We currently track: show_search_suggestions, remote_debugging, telemetry, tracking_protection, search_bookmarks, search_browsing_history, show_clipboard_suggestions, show_search_shortcuts, open_links_in_a_private_tab (bug in implementation https://github.com/mozilla-mobile/fenix/issues/7384), pref_key_sync_logins, pref_key_sync_bookmarks, pref_key_sync_history, pref_key_show_voice_search, and pref_key_show_search_suggestions_in_private.
|2021-06-01 |1, 2 | +| events.recently_closed_tabs_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event that indicates that the user has accessed recently closed tabs list. |[mozilla-mobile/fenix#16739](https://github.com/mozilla-mobile/fenix/pull/16739)||2021-05-10 |2 | +| events.search_bar_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the search bar |[mozilla-mobile/fenix#1067](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • source: The view the user was on when they initiated the search (For example: `Home` or `Browser`)
|2021-07-01 |2 | +| events.synced_tab_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event that indicates that a synced tab was opened. |[mozilla-mobile/fenix#16727](https://github.com/mozilla-mobile/fenix/pull/16727)||2021-05-10 |2 | +| events.tab_counter_menu_action |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A tab counter menu item was tapped |[mozilla-mobile/fenix#11533](https://github.com/mozilla-mobile/fenix/pull/11533), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)|
  • item: A string containing the name of the item the user tapped. These items are: New tab, New private tab, Close tab
|2021-07-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 |[mozilla-mobile/fenix#5090](https://github.com/mozilla-mobile/fenix/pull/5090), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-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 |[mozilla-mobile/fenix#1344](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#1344](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#1344](https://github.com/mozilla-mobile/fenix/pull/1344#issuecomment-479285010), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#3940](https://github.com/mozilla-mobile/fenix/pull/3940), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#18261](https://github.com/mozilla-mobile/fenix/pull/18261)||2022-08-01 |2 | +| history.opened_item_in_new_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a history item in a new tab |[mozilla-mobile/fenix#18261](https://github.com/mozilla-mobile/fenix/pull/18261)||2022-08-01 |2 | +| history.opened_item_in_private_tab |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened a history item in a private tab |[mozilla-mobile/fenix#18261](https://github.com/mozilla-mobile/fenix/pull/18261)||2022-08-01 |2 | +| history.opened_items_in_new_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened multiple history items in new tabs |[Review 1](https://gith ub.com/mozilla-mobile/fenix/pull/18261)||2022-08-01 |2 | +| history.opened_items_in_private_tabs |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened multiple history items in private tabs |[mozilla-mobile/fenix#18261](https://github.com/mozilla-mobile/fenix/pull/18261)||2022-08-01 |2 | +| history.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a history item |[mozilla-mobile/fenix#3940](https://github.com/mozilla-mobile/fenix/pull/3940), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#3940](https://github.com/mozilla-mobile/fenix/pull/3940), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#3940](https://github.com/mozilla-mobile/fenix/pull/3940), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#13050](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-01 |2 | +| login_dialog.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was displayed |[mozilla-mobile/fenix#13050](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-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 |[mozilla-mobile/fenix#13050](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-01 |2 | +| login_dialog.saved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "save" button was pressed |[mozilla-mobile/fenix#13050](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-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 |[mozilla-mobile/fenix#6352](https://github.com/mozilla-mobile/fenix/pull/6352), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix/issues/11208](https://github.com/mozilla-mobile/fenix/issues/11208), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6352](https://github.com/mozilla-mobile/fenix/pull/6352), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix/issues/11208](https://github.com/mozilla-mobile/fenix/issues/11208), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6352](https://github.com/mozilla-mobile/fenix/pull/6352), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix/issues/11208](https://github.com/mozilla-mobile/fenix/issues/11208), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#7767](https://github.com/mozilla-mobile/fenix/pull/7767), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6352](https://github.com/mozilla-mobile/fenix/pull/6352), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#14468](https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534), [mozilla-mobile/fenix#18071](https://github.com/mozilla-mobile/fenix/pull/18071)||2021-09-01 |2 | +| master_password.migration |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Logins were successfully migrated using a master password. |[mozilla-mobile/fenix#14468](https://github.com/mozilla-mobile/fenix/pull/14468#issuecomment-684114534), [mozilla-mobile/fenix#18071](https://github.com/mozilla-mobile/fenix/pull/18071)||2021-09-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 |[mozilla-mobile/fenix#5520](https://github.com/mozilla-mobile/fenix/pull/5520), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#5520](https://github.com/mozilla-mobile/fenix/pull/5520), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| media_state.fullscreen |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Video set to fullscreen. |[mozilla-mobile/fenix#16833](https://github.com/mozilla-mobile/fenix/pull/16833)||2021-08-01 |2 | +| media_state.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback was paused. |[mozilla-mobile/fenix#6463](https://github.com/mozilla-mobile/fenix/pull/6463), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| media_state.picture_in_picture |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Video set to picture in picture mode. |[mozilla-mobile/fenix#16833](https://github.com/mozilla-mobile/fenix/pull/16833)||2021-08-01 |2 | +| media_state.play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media started playing. |[mozilla-mobile/fenix#6463](https://github.com/mozilla-mobile/fenix/pull/6463), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#6463](https://github.com/mozilla-mobile/fenix/pull/6463), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11867](https://github.com/mozilla-mobile/fenix/pull/11867), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#8098](https://github.com/mozilla-mobile/fenix/pull/8098), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#8098](https://github.com/mozilla-mobile/fenix/pull/8098), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#4968](https://github.com/mozilla-mobile/fenix/pull/4968), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#4968](https://github.com/mozilla-mobile/fenix/pull/4968), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5194](https://github.com/mozilla-mobile/fenix/pull/5194), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5194](https://github.com/mozilla-mobile/fenix/pull/5194), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5194](https://github.com/mozilla-mobile/fenix/pull/5194), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5194](https://github.com/mozilla-mobile/fenix/pull/5194), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5194](https://github.com/mozilla-mobile/fenix/pull/5194), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5194](https://github.com/mozilla-mobile/fenix/pull/5194), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11859](https://github.com/mozilla-mobile/fenix/pull/11859), [mozilla-mobile/fenix#18071](https://github.com/mozilla-mobile/fenix/pull/18071)|
  • time_ms: The current time in ms when the PWA was backgrounded.
|2021-09-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. |[mozilla-mobile/fenix#11859](https://github.com/mozilla-mobile/fenix/pull/11859), [mozilla-mobile/fenix#18071](https://github.com/mozilla-mobile/fenix/pull/18071)|
  • time_ms: The current time in ms when the PWA was brought to the foreground.
|2021-09-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 |[mozilla-mobile/fenix#11859](https://github.com/mozilla-mobile/fenix/pull/11859), [mozilla-mobile/fenix#18071](https://github.com/mozilla-mobile/fenix/pull/18071)||2021-09-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. |[mozilla-mobile/fenix#11859](https://github.com/mozilla-mobile/fenix/pull/11859), [mozilla-mobile/fenix#18071](https://github.com/mozilla-mobile/fenix/pull/18071)||2021-09-01 |2 | +| reader_mode.appearance |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped the appearance button |[mozilla-mobile/fenix#3941](https://github.com/mozilla-mobile/fenix/pull/3941), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#3941](https://github.com/mozilla-mobile/fenix/pull/3941), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#4328](https://github.com/mozilla-mobile/fenix/pull/4328), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#3941](https://github.com/mozilla-mobile/fenix/pull/3941), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#1202](https://github.com/mozilla-mobile/fenix/pull/1202#issuecomment-476870449), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6746](https://github.com/mozilla-mobile/fenix/pull/6746), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#4714](https://github.com/mozilla-mobile/fenix/pull/4714), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#4714](https://github.com/mozilla-mobile/fenix/pull/4714), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#5106](https://github.com/mozilla-mobile/fenix/pull/5106), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#5106](https://github.com/mozilla-mobile/fenix/pull/5106), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| sync_auth.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user closed the sync page |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#4931](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#4931](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#4931](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#2745](https://github.com/mozilla-mobile/fenix/pull/2745#issuecomment-494918532), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#4931](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300), [mozilla-mobile/fenix#15713](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" |[mozilla-mobile/fenix#9835](https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#9835](https://github.com/mozilla-mobile/fenix/pull/9835#pullrequestreview-398641844), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| synced_tabs.synced_tabs_suggestion_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The synced tab suggestion in awesomebar was clicked. |[mozilla-mobile/fenix#18172](https://github.com/mozilla-mobile/fenix/pull/18172)||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 |[mozilla-mobile/fenix#5266](https://github.com/mozilla-mobile/fenix/pull/5266), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#5266](https://github.com/mozilla-mobile/fenix/pull/5266), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| tabs.setting_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The tab settings were opened. |[mozilla-mobile/fenix#15811](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||2021-08-01 |2 | +| tabs_tray.cfr.dismiss |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user dismisses the tabs tray CFR. |[mozilla-mobile/fenix#17442](https://github.com/mozilla-mobile/fenix/pull/17442), [mozilla-mobile/fenix/issues/16485](https://github.com/mozilla-mobile/fenix/issues/16485#issuecomment-759641324)||2021-08-01 |2 | +| tabs_tray.cfr.go_to_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selects the CFR option to navigate to settings. |[mozilla-mobile/fenix#17442](https://github.com/mozilla-mobile/fenix/pull/17442), [mozilla-mobile/fenix/issues/16485](https://github.com/mozilla-mobile/fenix/issues/16485#issuecomment-759641324)||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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 tabs tray |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#12036](https://github.com/mozilla-mobile/fenix/pull/12036), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#9836](https://github.com/mozilla-mobile/fenix/pull/9836), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#9836](https://github.com/mozilla-mobile/fenix/pull/9836), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#9836](https://github.com/mozilla-mobile/fenix/pull/9836), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6608](https://github.com/mozilla-mobile/fenix/pull/6608), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#15136](https://github.com/mozilla-mobile/fenix/pull/15136), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#10752](https://github.com/mozilla-mobile/fenix/pull/10752), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#15136](https://github.com/mozilla-mobile/fenix/pull/15136), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| top_sites.open_google_search_attribution |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the google top site |[mozilla-mobile/fenix#17637](https://github.com/mozilla-mobile/fenix/pull/17637)||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 |[mozilla-mobile/fenix#7523](https://github.com/mozilla-mobile/fenix/pull/7523), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#7523](https://github.com/mozilla-mobile/fenix/pull/7523), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#15136](https://github.com/mozilla-mobile/fenix/pull/15136), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#7523](https://github.com/mozilla-mobile/fenix/pull/7523), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#15136](https://github.com/mozilla-mobile/fenix/pull/15136), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5414](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [mozilla-mobile/fenix#11383](https://github.com/mozilla-mobile/fenix/pull/11383), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5414](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5414](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5414](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5414](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5414](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6918](https://github.com/mozilla-mobile/fenix/pull/6918), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6918](https://github.com/mozilla-mobile/fenix/pull/6918), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#10785](https://github.com/mozilla-mobile/fenix/pull/10785), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | ## first-session @@ -259,15 +275,17 @@ This ping includes the [client id](https://mozilla.github.io/glean/book/user/pin - -The following metrics are added to the ping: +All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections. + +In addition to those built-in metrics, 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), [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 | +| 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. |[mozilla-mobile/fenix#8074](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586480836), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#8074](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#8074](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#8074](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#8074](https://github.com/mozilla-mobile/fenix/pull/8074#issuecomment-586512202), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | ## metrics @@ -275,78 +293,88 @@ This is a built-in ping that is assembled out of the box by the Glean SDK. See the Glean SDK documentation for the [`metrics` ping](https://mozilla.github.io/glean/book/user/pings/metrics.html). -The following metrics are added to the ping: +All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections. + +In addition to those built-in metrics, the following metrics are added to the ping: | Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) | | --- | --- | --- | --- | --- | --- | --- | -| addons.enabled_addons |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |A list of all enabled 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 | -| 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), [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 | -| engine.kill_background_age |[timespan](https://mozilla.github.io/glean/book/user/metrics/timespan.html) |Measures the age of the engine session of a background tab at the time its content process got killed. |[1](https://github.com/mozilla-mobile/fenix/pull/17864)||2021-12-31 |1 | -| engine.kill_foreground_age |[timespan](https://mozilla.github.io/glean/book/user/metrics/timespan.html) |Measures the age of the engine session of a foreground (selected) tab at the time its content process got killed. |[1](TBD)||2021-12-31 |1 | -| engine.tab_kills |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |How often was the content process of a foreground (selected) or background tab killed. |[1](https://github.com/mozilla-mobile/fenix/pull/17864)|
  • foreground
  • background
|2021-12-31 |1 | -| events.normal_and_private_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 includes private browsing. This does not include background page requests and URIs from embedded pages 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/17935)||2022-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.close_tab_setting |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the setting for tab closing: MANUAL, ONE_DAY, ONE_WEEK, ONE_MONTH |[1](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||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.desktop_bookmarks_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many bookmarks a user has in the desktop folder. This value will only be set if the user has at least *one* bookmark. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `desktop_bookmarks_count` ping and 0 bookmarks, please see `has_desktop_bookmarks`. |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | -| metrics.distribution_id |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the distribution identifier. This is currently used to identify installs from Mozilla Online. |[1](https://github.com/mozilla-mobile/fenix/issues/16075)||never |1 | -| metrics.has_desktop_bookmarks |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has bookmarks in the desktop folder |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | -| metrics.has_mobile_bookmarks |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has bookmarks in the mobile folder |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |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.mobile_bookmarks_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many bookmarks a user has in the mobile folder. This value will only be set if the user has at least *one* bookmark. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `mobile_bookmarks_count` ping and 0 bookmarks, please see `has_mobile_bookmarks`. |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||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`, `shortcut`, `topsite` (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.tab_view_setting |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the setting for tab view: GRID, LIST |[1](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||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 | -| perf.awesomebar.search_engine_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a search engine awesomebar suggestion query. |[1](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | -| 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 | -| perf.startup.application_on_create |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `FenixApplication.onCreate` in the main process. |[1](https://github.com/mozilla-mobile/fenix/pull/17973#issue-572183889)||2021-08-11 |1 | -| perf.startup.home_activity_on_create |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `HomeActivity.onCreate`. |[1](https://github.com/mozilla-mobile/fenix/pull/17973#issue-572183889)||2021-08-11 |1 | -| 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), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-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), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-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), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 | -| storage.stats.query_stats_duration |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |How long it took to query the device for the StorageStats that contain the file size information. The docs say it may be expensive so we want to ensure it's not too expensive. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 | +| addons.enabled_addons |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |A list of all enabled add-ons on the device. |[mozilla-mobile/fenix#11080](https://github.com/mozilla-mobile/fenix/pull/11080), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-01 |2 | +| 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. |[mozilla-mobile/fenix#8318](https://github.com/mozilla-mobile/fenix/pull/8318), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-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. |[mozilla-mobile/fenix#8318](https://github.com/mozilla-mobile/fenix/pull/8318), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-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. |[mozilla-mobile/fenix#11080](https://github.com/mozilla-mobile/fenix/pull/11080), [mozilla-mobile/fenix#13958](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [mozilla-mobile/fenix#18143](https://github.com/mozilla-mobile/fenix/pull/18143)||2021-07-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 ‘’. |[mozilla-mobile/fenix#10112](https://github.com/mozilla-mobile/fenix/pull/10112), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#10167](https://github.com/mozilla-mobile/fenix/pull/10167), [mozilla-mobile/fenix#15713](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 ‘’. |[mozilla-mobile/fenix#10112](https://github.com/mozilla-mobile/fenix/pull/10112), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| engine_tab.kill_background_age |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Measures the age of the engine session of a background tab at the time its content process got killed. |[mozilla-mobile/fenix#17864](https://github.com/mozilla-mobile/fenix/pull/17864)||2021-12-31 |1 | +| engine_tab.kill_foreground_age |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Measures the age of the engine session of a foreground (selected) tab at the time its content process got killed. |[mozilla-mobile/fenix#17864](https://github.com/mozilla-mobile/fenix/pull/17864)||2021-12-31 |1 | +| engine_tab.kills |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |How often was the content process of a foreground (selected) or background tab killed. |[mozilla-mobile/fenix#17864](https://github.com/mozilla-mobile/fenix/pull/17864)|
  • foreground
  • background
|2021-12-31 |1 | +| events.normal_and_private_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 includes private browsing. This does not include background page requests and URIs from embedded pages but may be incremented without user interaction by website scripts that programmatically redirect to a new location. |[mozilla-mobile/fenix#17935](https://github.com/mozilla-mobile/fenix/pull/17935)||2022-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. |[mozilla-mobile/fenix#1785](https://github.com/mozilla-mobile/fenix/pull/1785), [mozilla-mobile/fenix#8314](https://github.com/mozilla-mobile/fenix/pull/8314), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#9253](https://github.com/mozilla-mobile/fenix/pull/9253), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#5579](https://github.com/mozilla-mobile/fenix/pull/5579), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#9253](https://github.com/mozilla-mobile/fenix/pull/9253), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#9253](https://github.com/mozilla-mobile/fenix/pull/9253), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.close_tab_setting |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the setting for tab closing: MANUAL, ONE_DAY, ONE_WEEK, ONE_MONTH |[mozilla-mobile/fenix#15811](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||2021-08-01 |2 | +| metrics.default_browser |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Is Fenix the default browser? |[mozilla-mobile/fenix#1067](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#1953/](https://github.com/mozilla-mobile/fenix/pull/1953/), [mozilla-mobile/fenix#5216](https://github.com/mozilla-mobile/fenix/pull/5216), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| metrics.desktop_bookmarks_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many bookmarks a user has in the desktop folder. This value will only be set if the user has at least *one* bookmark. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `desktop_bookmarks_count` ping and 0 bookmarks, please see `has_desktop_bookmarks`. |[mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942), [mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | +| metrics.distribution_id |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the distribution identifier. This is currently used to identify installs from Mozilla Online. |[mozilla-mobile/fenix/issues/16075](https://github.com/mozilla-mobile/fenix/issues/16075)||never |1 | +| metrics.has_desktop_bookmarks |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has bookmarks in the desktop folder |[mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942), [mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | +| metrics.has_mobile_bookmarks |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has bookmarks in the mobile folder |[mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942), [mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |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. |[mozilla-mobile/fenix#12024](https://github.com/mozilla-mobile/fenix/pull/12024), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#11982](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#9556](https://github.com/mozilla-mobile/fenix/pull/9556), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.mobile_bookmarks_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many bookmarks a user has in the mobile folder. This value will only be set if the user has at least *one* bookmark. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `mobile_bookmarks_count` ping and 0 bookmarks, please see `has_mobile_bookmarks`. |[mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942), [mozilla-mobile/fenix#16942](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||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. |[mozilla-mobile/fenix#1953/](https://github.com/mozilla-mobile/fenix/pull/1953/), [mozilla-mobile/fenix#5216](https://github.com/mozilla-mobile/fenix/pull/5216), [mozilla-mobile/fenix#15713](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`. |[mozilla-mobile/fenix#11982](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [mozilla-mobile/fenix#15713](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`, `shortcut`, `topsite` (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. |[mozilla-mobile/fenix#1677](https://github.com/mozilla-mobile/fenix/pull/1677), [mozilla-mobile/fenix#5216](https://github.com/mozilla-mobile/fenix/pull/5216), [mozilla-mobile/fenix#7310](https://github.com/mozilla-mobile/fenix/pull/7310), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#10958](https://github.com/mozilla-mobile/fenix/pull/10958), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.tab_view_setting |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the setting for tab view: GRID, LIST |[mozilla-mobile/fenix#15811](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||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`. |[mozilla-mobile/fenix#12024](https://github.com/mozilla-mobile/fenix/pull/12024), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#6608](https://github.com/mozilla-mobile/fenix/pull/6608), [mozilla-mobile/fenix#15713](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`. |[mozilla-mobile/fenix#9556](https://github.com/mozilla-mobile/fenix/pull/9556), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#10276](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. |[mozilla-mobile/fenix#10276](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. |[mozilla-mobile/fenix#10276](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | +| perf.awesomebar.search_engine_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a search engine awesomebar suggestion query. |[mozilla-mobile/fenix#10276](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | +| perf.awesomebar.session_suggestions |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |Duration of a session awesomebar suggestion query. |[mozilla-mobile/fenix#10276](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. |[mozilla-mobile/fenix#10276](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. |[mozilla-mobile/fenix#10276](https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979)||2020-11-15 |1, 2 | +| perf.startup.app_on_create_to_glean_init |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |A subsection of the duration of `FenixApplication.onCreate` and thus the `application_on_create` probe from the start of the method through when `initializeGlean` is called. Note: `initializeGlean` is a no-op for Beta and Release builds which instead initialize it during `MigratingFenixApplication`, which we don't currently measure. |[mozilla-mobile/fenix#18525](https://github.com/mozilla-mobile/fenix/pull/18525#issue-594961170)||2021-08-11 |1 | +| perf.startup.app_on_create_to_megazord_init |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |A subsection of the duration of `FenixApplication.onCreate` and thus the `application_on_create` probe from after the `app_on_create_to_glean_init` probe until we block for the megazord to complete set up. |[mozilla-mobile/fenix#18525](https://github.com/mozilla-mobile/fenix/pull/18525#issue-594961170)||2021-08-11 |1 | +| perf.startup.app_on_create_to_setup_in_main |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |A subsection of the duration of `FenixApplication.onCreate` and thus the `application_on_create` probe from after the `app_on_create_to_megazord_init` probe until the end of `setupInMainProcessOnly`, which is expected to be the end of the `onCreate` call (unless the implementation later changes). |[mozilla-mobile/fenix#18525](https://github.com/mozilla-mobile/fenix/pull/18525#issue-594961170)||2021-08-11 |1 | +| perf.startup.application_on_create |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `FenixApplication.onCreate` in the main process. This does not measure the duration of migration code (via `MigratingFenixApplication` included in the Beta and Release channels. |[mozilla-mobile/fenix#17973](https://github.com/mozilla-mobile/fenix/pull/17973#issue-572183889)||2021-08-11 |1 | +| perf.startup.base_bfragment_on_create_view |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `BaseBrowserFragment.onCreateView`. |[mozilla-mobile/fenix#18558](https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848)||2021-08-11 |1 | +| perf.startup.base_bfragment_on_view_created |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `BaseBrowserFragment.onViewCreated`. |[mozilla-mobile/fenix#18558](https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848)||2021-08-11 |1 | +| perf.startup.home_activity_on_create |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `HomeActivity.onCreate`. |[mozilla-mobile/fenix#17973](https://github.com/mozilla-mobile/fenix/pull/17973#issue-572183889)||2021-08-11 |1 | +| perf.startup.home_activity_on_start |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `HomeActivity.onStart`. This may encapsulate `HomeFragment` or `BrowserFragment` creation, depending on the code path, so we expect this to take varying amounts of time. As such, this probe may not be easy to interpret directly but we believe collecting it may give us more information about different patterns we might see in performance data. |[mozilla-mobile/fenix#18558](https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848)||2021-08-11 |1 | +| perf.startup.home_fragment_on_create_view |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `HomeFragment.onCreateView`. |[mozilla-mobile/fenix#18558](https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848)||2021-08-11 |1 | +| perf.startup.home_fragment_on_view_created |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |The duration of `HomeFragment.onViewCreated`. |[mozilla-mobile/fenix#18558](https://github.com/mozilla-mobile/fenix/pull/18558#issue-596791848)||2021-08-11 |1 | +| 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: "" |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11446](https://github.com/mozilla-mobile/fenix/pull/11446), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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) |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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] |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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 |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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" |[mozilla-mobile/fenix#11446](https://github.com/mozilla-mobile/fenix/pull/11446), [mozilla-mobile/fenix#15713](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) |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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" |[mozilla-mobile/fenix#11211](https://github.com/mozilla-mobile/fenix/pull/11211), [mozilla-mobile/fenix#15713](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" |[mozilla-mobile/fenix#1606](https://github.com/mozilla-mobile/fenix/pull/1606), [mozilla-mobile/fenix#5216](https://github.com/mozilla-mobile/fenix/pull/5216), [mozilla-mobile/fenix#15713](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" |[mozilla-mobile/fenix#1606](https://github.com/mozilla-mobile/fenix/pull/1606), [mozilla-mobile/fenix#5216](https://github.com/mozilla-mobile/fenix/pull/5216), [mozilla-mobile/fenix#15713](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" |[mozilla-mobile/fenix#1606](https://github.com/mozilla-mobile/fenix/pull/1606), [mozilla-mobile/fenix#5216](https://github.com/mozilla-mobile/fenix/pull/5216), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#12876](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [mozilla-mobile/fenix#17704](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-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+. |[mozilla-mobile/fenix#12876](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [mozilla-mobile/fenix#17704](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-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+. |[mozilla-mobile/fenix#12876](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [mozilla-mobile/fenix#17704](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 | +| storage.stats.query_stats_duration |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |How long it took to query the device for the StorageStats that contain the file size information. The docs say it may be expensive so we want to ensure it's not too expensive. This value is only available on Android 8+. |[mozilla-mobile/fenix#12876](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [mozilla-mobile/fenix#17704](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 | ## startup-timeline @@ -372,16 +400,17 @@ This ping includes the [client id](https://mozilla.github.io/glean/book/user/pin - - -The following metrics are added to the ping: +All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections. + +In addition to those built-in metrics, 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), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | -| startup.timeline.framework_primary |[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` when this device has `clock_ticks_per_second` equal to 100: if it's not equal to 100, then this value is captured in `framework_secondary`. We split this into two metrics to make it easier to analyze in GLAM. We split on 100 because when we did our initial brief analysis - https://sql.telemetry.mozilla.org/queries/75591 - the results for clocks ticks were overwhelmingly 100. The duration 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), [3](https://github.com/mozilla-mobile/fenix/pull/18043#issue-575389284)||2021-08-01 |1 | -| startup.timeline.framework_secondary |[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` when this device has `clock_ticks_per_second` not equal to 100. For more details on this metric, see `framework_primary` |[1](https://github.com/mozilla-mobile/fenix/pull/18043#issue-575389284)||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_primary/secondary` - 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 | - +| startup.timeline.clock_ticks_per_second_v2 |[quantity](https://mozilla.github.io/glean/book/user/metrics/quantity.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_primary/secondary` metrics. |[mozilla-mobile/fenix#9788](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068), [mozilla-mobile/fenix#18158](https://github.com/mozilla-mobile/fenix/pull/18158#issue-579593943)|
  • unit: clock ticks per second
|2021-08-01 |1 | +| startup.timeline.framework_primary |[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` when this device has `clock_ticks_per_second_v2` equal to 100: if it's not equal to 100, then this value is captured in `framework_secondary`. We split this into two metrics to make it easier to analyze in GLAM. We split on 100 because when we did our initial brief analysis - https://sql.telemetry.mozilla.org/queries/75591 - the results for clocks ticks were overwhelmingly 100. The duration 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_v2`, which may vary between devices, is also reported as a metric |[mozilla-mobile/fenix#9788](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626), [mozilla-mobile/fenix#15713](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068), [mozilla-mobile/fenix#18043](https://github.com/mozilla-mobile/fenix/pull/18043#issue-575389284)||2021-08-01 |1 | +| startup.timeline.framework_secondary |[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` when this device has `clock_ticks_per_second_v2` not equal to 100. For more details on this metric, see `framework_primary` |[mozilla-mobile/fenix#18043](https://github.com/mozilla-mobile/fenix/pull/18043#issue-575389284)||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_primary/secondary` - the application init timestamp returned a negative value - which is likely indicative of a bug in the implementation. |[mozilla-mobile/fenix#9788](https://github.com/mozilla-mobile/fenix/pull/9788#pullrequestreview-394228626), [mozilla-mobile/fenix#15713](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. |[mozilla-mobile/fenix#10481](https://github.com/mozilla-mobile/fenix/pull/10481), [mozilla-mobile/fenix#15713](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-release.toml b/l10n-release.toml index acce5ec89..02dac9510 100644 --- a/l10n-release.toml +++ b/l10n-release.toml @@ -93,4 +93,3 @@ locales = [ "zh-CN", "zh-TW", ] - diff --git a/l10n.toml b/l10n.toml index e74207276..0d917573b 100644 --- a/l10n.toml +++ b/l10n.toml @@ -93,6 +93,7 @@ locales = [ "tl", "tr", "trs", + "tt", "uk", "ur", "uz", diff --git a/taskcluster/ci/browsertime/kind.yml b/taskcluster/ci/browsertime/kind.yml index 2c2f7d6a1..486b557a3 100644 --- a/taskcluster/ci/browsertime/kind.yml +++ b/taskcluster/ci/browsertime/kind.yml @@ -62,6 +62,8 @@ job-defaults: NEED_XVFB: "false" NO_FAIL_ON_TEST_ERRORS: "1" XPCOM_DEBUG_BREAK: "warn" + PYTHON: "python3" + LANG: "en_US.UTF-8" artifacts: - name: public/logs/ path: workspace/logs diff --git a/taskcluster/ci/build/kind.yml b/taskcluster/ci/build/kind.yml index 335abd497..2d647cb8f 100644 --- a/taskcluster/ci/build/kind.yml +++ b/taskcluster/ci/build/kind.yml @@ -63,6 +63,15 @@ jobs: treeherder: symbol: beta(Bf) + nightly-firebase: + disable-optimization: true + run-on-tasks-for: [github-push] # We want this on push so that we detect problem before triggering a new nightly + run: + gradle-build-type: nightly + test-build-type: nightly + treeherder: + symbol: nightly(Bf) + android-test-debug: attributes: code-review: true @@ -85,13 +94,16 @@ jobs: android-test-nightly: attributes: nightly: true - run: - gradle-build-type: androidTest apk-artifact-template: # 2 differences here: # * "androidTest/" is added # * "{gradle_build_type}" is forced to "debug" - path: '/builds/worker/checkouts/src/app/build/outputs/apk/androidTest/debug/{fileName}' + path: '/builds/worker/checkouts/src/app/build/outputs/apk/androidTest/nightly/app-nightly-androidTest.apk' + disable-optimization: true + run: + gradle-build-type: androidTest + test-build-type: nightly + run-on-tasks-for: [github-push] treeherder: symbol: nightly(Bat) diff --git a/taskcluster/ci/signing/kind.yml b/taskcluster/ci/signing/kind.yml index 87e55c0e7..9c62998d8 100644 --- a/taskcluster/ci/signing/kind.yml +++ b/taskcluster/ci/signing/kind.yml @@ -18,44 +18,29 @@ group-by: build-type job-template: description: Sign Fenix - worker-type: - by-build-type: - (nightly|beta|release|android-test-nightly): - by-level: - '3': signing - default: dep-signing - default: dep-signing - worker: - signing-type: - by-build-type: - (beta|release): - by-level: - '3': fennec-production-signing - default: dep-signing - performance-test: dep-signing - (nightly|android-test-nightly): - by-level: - '3': production-signing - default: dep-signing - default: dep-signing + worker: {} signing-format: autograph_apk index: - by-build-type: - (nightly|debug|nightly-simulation|beta|release): - type: signing + by-tasks-for: + (action|cron|github-release): + by-build-type: + (nightly|debug|nightly-simulation|beta|release): + type: signing + default: {} default: {} run-on-tasks-for: by-build-type: # No test job runs on push against this build type. Although we do want nightly-simulation # signed to use it in the gecko trees. # We want beta on push so that we detect problem before shipping it - (nightly-simulation|beta-firebase|android-test-beta): [github-push] + (nightly-simulation|beta-firebase|android-test-beta|nightly-firebase|android-test-nightly): [github-push] default: [] treeherder: job-symbol: by-build-type: android-test.+: Bats beta-firebase: Bfs + nightly-firebase: Bfs default: Bs kind: build platform: android-all/opt diff --git a/taskcluster/ci/ui-test/kind.yml b/taskcluster/ci/ui-test/kind.yml index f4c7ed80b..e5fc36a09 100644 --- a/taskcluster/ci/ui-test/kind.yml +++ b/taskcluster/ci/ui-test/kind.yml @@ -80,3 +80,16 @@ jobs: - [automation/taskcluster/androidTest/ui-test.sh, x86-beta-tests, app.apk, android-test.apk, '50'] treeherder: symbol: beta(ui-test-x86-beta) + x86-nightly: + attributes: + build-type: nightly-firebase + description: Test Fenix + run-on-tasks-for: [github-push] + dependencies: + signing: signing-nightly-firebase + signing-android-test: signing-android-test-nightly + run: + commands: + - [automation/taskcluster/androidTest/ui-test.sh, x86-start-test, app.apk, android-test.apk, '-1'] + treeherder: + symbol: nightly(ui-test-x86-nightly) diff --git a/taskcluster/fenix_taskgraph/release_promotion.py b/taskcluster/fenix_taskgraph/release_promotion.py index 902e7371b..eb028b419 100644 --- a/taskcluster/fenix_taskgraph/release_promotion.py +++ b/taskcluster/fenix_taskgraph/release_promotion.py @@ -159,6 +159,7 @@ def release_promotion_action(parameters, graph_config, input, task_group_id, tas else: raise ValueError("Unsupported version type: {}".format(version.version_type)) parameters['release_type'] = release_type + parameters['tasks_for'] = "action" parameters['pull_request_number'] = None diff --git a/taskcluster/fenix_taskgraph/transforms/signing.py b/taskcluster/fenix_taskgraph/transforms/signing.py index 8c6570fcc..428bde612 100644 --- a/taskcluster/fenix_taskgraph/transforms/signing.py +++ b/taskcluster/fenix_taskgraph/transforms/signing.py @@ -18,7 +18,7 @@ transforms = TransformSequence() @transforms.add def resolve_keys(config, tasks): for task in tasks: - for key in ("index", "run-on-tasks-for", "worker-type", "worker.signing-type", "signing-format"): + for key in ("run-on-tasks-for",): resolve_keyed_by( task, key, @@ -26,10 +26,55 @@ def resolve_keys(config, tasks): **{ 'build-type': task["attributes"]["build-type"], 'level': config.params["level"], + 'tasks-for': config.params["tasks_for"], } ) yield task +@transforms.add +def set_worker_type(config, tasks): + for task in tasks: + worker_type = "dep-signing" + if ( + str(config.params["level"]) == "3" + and task["attributes"]["build-type"] + in ("nightly", "beta", "release", "android-test-nightly") + and config.params["tasks_for"] in ("cron", "github-release", "action") + ): + worker_type = "signing" + task["worker-type"] = worker_type + yield task + + +@transforms.add +def set_signing_type(config, tasks): + for task in tasks: + signing_type = "dep-signing" + if ( + str(config.params["level"]) == "3" + and config.params["tasks_for"] in ("cron", "github-release", "action") + ): + if task["attributes"]["build-type"] in ("beta", "release"): + signing_type = "fennec-production-signing" + elif task["attributes"]["build-type"] in ("nightly", "android-test-nightly"): + signing_type = "production-signing" + task.setdefault("worker", {})["signing-type"] = signing_type + yield task + + +@transforms.add +def set_index(config, tasks): + for task in tasks: + index = {} + if ( + config.params["tasks_for"] in ("cron", "github-release", "action") + and task["attributes"]["build-type"] + in ("nightly", "debut", "nightly-simulation", "beta", "release") + ): + index["type"] = "signing" + task["index"] = index + yield task + @transforms.add def set_signing_attributes(config, tasks): diff --git a/tools/measure_time_to_first_frame.py b/tools/measure_time_to_first_frame.py new file mode 100755 index 000000000..0056becde --- /dev/null +++ b/tools/measure_time_to_first_frame.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +# 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 https://mozilla.org/MPL/2.0/. + +import argparse +import os +import subprocess +import time +from pprint import pprint + +DESC = """Measures the duration from process start until the first frame is drawn +using the "TotalTime:" field from `adb shell am start -W`. This script is a python +reimplementation of https://medium.com/androiddevelopers/testing-app-startup-performance-36169c27ee55 +with additional functionality. + +IMPORTANT: this method does not provide a complete picture of start up. Using +./mach perftest (or the deprecated FNPRMS) is the preferred approach because those +provide more comprehensive views of start up. However, this is useful for lightweight +testing if you know exactly what you're looking for. +""" + +DEFAULT_ITER_COUNT = 25 + +CHANNEL_TO_PKG = { + 'nightly': 'org.mozilla.fenix', + 'beta': 'org.mozilla.firefox.beta', + 'release': 'org.mozilla.firefox', + 'debug': 'org.mozilla.fenix.debug' +} + + +def parse_args(): + parser = argparse.ArgumentParser(description=DESC, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument( + "release_channel", choices=['nightly', 'beta', 'release', 'debug'], help="the release channel to measure" + ) + parser.add_argument( + "startup_type", choices=['cold_main', 'cold_view'], help="the type of start up to measure. see https://wiki.mozilla.org/Performance/Fenix#Terminology for descriptions of cold/warm/hot and main/view" + ) + parser.add_argument("path", help="the path to save the measurement results; will be overwritten") + + parser.add_argument("-c", "--iter-count", default=DEFAULT_ITER_COUNT, type=int, + help="the number of iterations to run. defaults to {}".format(DEFAULT_ITER_COUNT)) + parser.add_argument("-f", "--force", action="store_true", help="overwrite the given path rather than stopping on file existence") + return parser.parse_args() + + +def validate_args(args): + # This helps prevent us from accidentally overwriting previous measurements. + if not args.force: + if os.path.exists(args.path): + raise Exception("Given `path` unexpectedly exists: pick a new path or use --force to overwrite.") + + +def get_package_id(release_channel): + package_id = CHANNEL_TO_PKG.get(release_channel) + if not package_id: + raise Exception('this should never happen: this should be validated by argparse') + return package_id + + +def get_activity_manager_args(): + return ['adb', 'shell', 'am'] + + +def force_stop(pkg_id): + args = get_activity_manager_args() + ['force-stop', pkg_id] + subprocess.run(args, check=True) + + +def disable_startup_profiling(): + # Startup profiling sets the app to the "debug-app" which executes extra code to + # read a config file off disk that triggers the profiling. Removing the app as a + # debug app should address that issue but isn't a perfect clean up. + args = get_activity_manager_args() + ['clear-debug-app'] + subprocess.run(args, check=True) + + +def get_start_cmd(startup_type, pkg_id): + args_prefix = get_activity_manager_args() + ['start-activity', '-W', '-n'] + if startup_type == 'cold_main': + cmd = args_prefix + ['{}/.App'.format(pkg_id)] + elif startup_type == 'cold_view': + pkg_activity = '{}/org.mozilla.fenix.IntentReceiverActivity'.format(pkg_id) + cmd = args_prefix + [ + pkg_activity, + '-d', 'https://example.com', + '-a', 'android.intent.action.VIEW' + ] + else: + raise Exception('Should never happen (if argparse is set up correctly') + return cmd + + +def measure(pkg_id, start_cmd_args, iter_count): + # Startup profiling may accidentally be left enabled and throw off the results. + # To prevent this, we disable it. + disable_startup_profiling() + + # After an (re)installation, we've observed the app starts up more slowly than subsequent runs. + # As such, we start it once beforehand to let it settle. + force_stop(pkg_id) + subprocess.run(start_cmd_args, check=True, capture_output=True) # capture_output so it doesn't print to the console. + time.sleep(5) # To hopefully reach visual completeness. + + measurements = [] + for i in range(0, iter_count): + force_stop(pkg_id) + time.sleep(1) + proc = subprocess.run(start_cmd_args, check=True, capture_output=True) # expected to wait for app to start. + measurements.append(get_measurement_from_stdout(proc.stdout)) + return measurements + + +def get_measurement_from_stdout(stdout): + # Sample input: + # + # Starting: Intent { cmp=org.mozilla.fenix/.App } + # Status: ok + # Activity: org.mozilla.fenix/.App + # ThisTime: 5662 + # TotalTime: 5662 + # WaitTime: 5680 + # Complete + total_time_prefix = b'TotalTime: ' + lines = stdout.split(b'\n') + matching_lines = [line for line in lines if line.startswith(total_time_prefix)] + if len(matching_lines) != 1: + raise Exception('Each run should only have one {} but this unexpectedly had more: '.format(total_time_prefix) + + matching_lines) + duration = int(matching_lines[0][len(total_time_prefix):]) + return duration + + +def save_measurements(path, measurements): + with open(path, 'w') as f: + for measurement in measurements: + f.write(str(measurement) + '\n') + + +def main(): + args = parse_args() + validate_args(args) + + # Exceptions and script piping like these are why we prefer mozperftest. :) + print("Clear the onboarding experience manually, if it's desired and you haven't already done so.") + print("\nYou can use this script to find the average from the results file: https://github.com/mozilla-mobile/perf-tools/blob/9dd8bf1ea0ea8b2663e21d341a1572c5249c513d/average_times.py") + + pkg_id = get_package_id(args.release_channel) + start_cmd = get_start_cmd(args.startup_type, pkg_id) + measurements = measure(pkg_id, start_cmd, args.iter_count) + save_measurements(args.path, measurements) + + +if __name__ == '__main__': + main() diff --git a/tools/setup-startup-profiling.py b/tools/setup-startup-profiling.py index 1619cb75b..71593a69d 100755 --- a/tools/setup-startup-profiling.py +++ b/tools/setup-startup-profiling.py @@ -41,7 +41,9 @@ def push(id, filename): print('Pushing {} to device.'.format(filename)) run(['adb', 'push', config.name, os.path.join(PATH_PREFIX, filename)]) run(['adb', 'shell', 'am', 'set-debug-app', '--persistent', id]) - print('Startup profiling enabled on all future start ups, possibly even after reinstall. Call script with `deactivate` to disable it.') + print('\nStartup profiling enabled on all future start ups, possibly even after reinstall.') + print('Call script with `deactivate` to disable it.') + print('DON\'T FORGET TO ENABLE \'Remote debugging via USB\' IN THE APP SETTINGS!') finally: os.remove(config.name) diff --git a/version.txt b/version.txt index 275710fc9..79e076c02 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -87.0.0-rc.1 +88.0.0-beta.6