From 83b5bae65e8e63c2d0212342852aac61ba983a0f Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Mon, 12 Oct 2020 00:03:46 +0000 Subject: [PATCH 01/97] Import l10n. --- .../main/res/values-b+sat+Olck/strings.xml | 89 ++++++++++++++++++- app/src/main/res/values-be/strings.xml | 14 +++ app/src/main/res/values-el/strings.xml | 19 ++++ app/src/main/res/values-es-rAR/strings.xml | 28 ++++++ app/src/main/res/values-fy-rNL/strings.xml | 10 +++ app/src/main/res/values-lt/strings.xml | 28 ++++++ app/src/main/res/values-nn-rNO/strings.xml | 10 +++ app/src/main/res/values-oc/strings.xml | 24 +++++ app/src/main/res/values-ru/strings.xml | 10 +++ app/src/main/res/values-sl/strings.xml | 22 +++++ app/src/main/res/values-tg/strings.xml | 2 + app/src/main/res/values-th/strings.xml | 28 ++++++ app/src/main/res/values-vi/strings.xml | 28 ++++++ 13 files changed, 309 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-b+sat+Olck/strings.xml b/app/src/main/res/values-b+sat+Olck/strings.xml index 68d0b50cab..dc0983a80a 100644 --- a/app/src/main/res/values-b+sat+Olck/strings.xml +++ b/app/src/main/res/values-b+sat+Olck/strings.xml @@ -24,11 +24,11 @@ %1$d ᱵᱟᱪᱷᱟᱣᱮᱱᱟ - ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱡᱟᱣᱨᱟ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱥᱮᱞᱮᱫ ᱢᱮ ᱧᱩᱛᱩᱢ - ᱛᱩᱢᱟᱹᱞ ᱡᱟᱣᱨᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱛᱩᱢᱟᱹᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱢᱟᱹᱞᱴᱤᱥᱤᱞᱮᱠᱼᱴ ᱢᱳᱰ ᱵᱟᱹᱰ @@ -151,7 +151,7 @@ ᱱᱟᱶᱟ ᱴᱮᱵ - ᱛᱩᱢᱟᱹᱞ ᱡᱟᱣᱨᱟ ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱢᱮ + ᱛᱩᱢᱟᱹᱞ ᱨᱮ ᱥᱟᱸᱪᱟᱣ ᱢᱮ ᱦᱟᱹᱴᱤᱧ @@ -340,6 +340,20 @@ ᱤᱛᱞᱟᱭ ᱠᱚ + + + ᱠᱟᱹᱥᱴᱚᱢ ᱮᱰᱰᱼᱚᱱ ᱛᱩᱢᱟᱹᱞ + + ᱴᱷᱤᱠ + + ᱵᱟᱹᱰᱨᱟᱹ + + ᱛᱩᱢᱟᱹᱞ ᱧᱩᱛᱩᱢ + + ᱛᱩᱢᱟᱹᱞ ᱢᱟᱞᱤᱠ (ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ID) + + ᱥᱮᱞᱮᱫ ᱮᱦᱚᱵ ᱛᱩᱢᱟᱹᱞ ᱵᱚᱫᱚᱞᱮᱱᱟ ᱾ ᱵᱚᱫᱚᱞ ᱠᱚ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱮᱯᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱸᱫᱚᱜ ᱠᱟᱱᱟ… + ᱱᱤᱛᱚᱜ ᱥᱭᱸᱠ ᱢᱮ @@ -378,6 +392,8 @@ ᱧᱟᱢᱟᱠᱟᱱ ᱴᱮᱵ ᱠᱚ + + ᱚᱞᱜᱟ Firefox ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱴᱮᱵ ᱠᱚ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ ᱧᱟᱢᱮᱱᱟ ᱾ ᱴᱮᱵ ᱧᱟᱢᱮᱱᱟ @@ -399,6 +415,8 @@ ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱱᱚᱣᱟ ᱠᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ ᱡᱷᱚᱛᱚ ᱠᱚ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱱ ᱢᱮ + + ᱪᱚᱭᱚᱱᱟᱠᱟᱱ ᱫᱟᱭᱤᱴ ᱠᱚᱨᱮ ᱟᱢ ᱤᱪᱷᱟᱹ ᱚᱱᱩᱥᱟᱨ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱵᱚᱸᱫᱚ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ @@ -409,8 +427,12 @@ ᱴᱮᱞᱭᱢᱮᱴᱨᱭ ᱵᱮᱵᱷᱟᱨ ᱟᱨ ᱴᱮᱠᱱᱤᱠᱚᱞ ᱰᱟᱴᱟ ᱠᱚ + + ᱟᱢᱟᱜ ᱵᱨᱟᱣᱡᱟᱚᱨ ᱨᱮᱭᱟᱜ ᱠᱟᱹᱢᱤ, ᱭᱩᱥᱮᱡ, ᱦᱟᱰᱣᱮᱨ ᱟᱨ ᱠᱟᱹᱥᱴᱚᱢᱟᱭᱡᱮᱥᱚᱱ ᱰᱟᱴᱟ ᱠᱚ Mozilla ᱥᱟᱞᱟᱜ ᱦᱟᱹᱴᱤᱧᱚᱜ ᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱚ %1$s ᱵᱮᱥ ᱛᱮᱭᱟᱜ ᱨᱮ ᱜᱚᱲᱚ ᱮᱢᱟᱭ ᱢᱟᱨᱠᱮᱴᱤᱝ ᱰᱟᱴᱟ + + Leanplum ᱚᱠᱚᱭ ᱫᱚ ᱟᱞᱮᱭᱤᱡ ᱢᱚᱵᱟᱭᱤᱞ ᱢᱟᱨᱠᱮᱴᱤᱝ ᱣᱮᱱᱰᱚᱨ ᱠᱟᱱᱟᱭ ᱩᱱᱤ ᱥᱟᱞᱟᱜ %1$s ᱨᱮ ᱯᱷᱤᱪᱚᱨ ᱵᱟᱵᱚᱛ ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱ ᱰᱟᱴᱟ ᱦᱟᱹᱴᱤᱧᱚᱜᱼᱟ ᱾ ᱵᱤᱰᱟᱣ @@ -516,6 +538,14 @@ ᱱᱤᱛᱚᱜᱼᱟᱜ ᱵᱚᱸᱫᱚᱼᱟᱜ ᱴᱮᱵ ᱠᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ + + ᱴᱮᱵ ᱠᱚ + + ᱴᱮᱵ ᱧᱮᱞ + + ᱞᱤᱥᱴᱭ + + ᱡᱟᱹᱞᱤ ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭ ᱢᱮ @@ -629,6 +659,10 @@ %1$d ᱡᱤᱱᱤᱥ ᱠᱚ ᱢᱮᱴᱟᱣ + + ᱛᱮᱦᱮᱸᱧ + + ᱦᱚᱞᱟ 24 ᱴᱟᱲᱟᱝ ᱢᱟᱲᱟᱝ @@ -767,6 +801,8 @@ ᱡᱟᱭᱜᱟ ᱤᱛᱞᱟᱭ + + ᱛᱟᱦᱮᱸᱱᱠᱟᱱ ᱡᱟᱭᱜᱟ ᱦᱮᱥᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱠᱩᱠᱞᱤ ᱢᱮ @@ -952,6 +988,9 @@ ᱟᱪᱛᱮ ᱪᱤᱠᱤ ᱥᱟᱡᱟᱣ + + ᱪᱤᱠᱤ ᱢᱟᱞ ᱫᱚ ᱮᱱᱰᱨᱚᱭᱮᱰ ᱥᱟᱡᱟᱣ ᱥᱟᱞᱟᱜ ᱥᱚᱢᱟᱱᱚᱜᱼᱟ ᱾ ᱪᱤᱠᱤ ᱢᱟᱯ ᱵᱚᱸᱫᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱰᱮ ᱢᱮᱱᱮᱡ ᱢᱮ ᱾ + ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ @@ -1030,12 +1069,19 @@ %s ᱵᱟᱵᱚᱛ ᱵᱟᱲᱟᱭ ᱢᱮ ᱧᱮᱞ ᱢᱮ ᱪᱮᱫ ᱱᱟᱶᱟ ᱢᱮᱱᱟᱜ-ᱟ + + ᱨᱤᱰᱤᱡᱟᱭᱤᱱ %s ᱵᱟᱵᱚᱛ ᱠᱩᱞᱤ ᱢᱮᱱᱟᱜᱼᱟ? ᱵᱚᱫᱚᱞ ᱠᱚ ᱵᱟᱰᱟᱭ ᱥᱟᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? ᱱᱚᱰᱮ ᱛᱮᱞᱟ ᱠᱚ ᱧᱟᱢ ᱟᱢ ᱵᱩᱠᱢᱟᱨᱠ, ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱟᱨ ᱵᱟᱹᱲᱛᱤ ᱠᱚ ᱞᱟᱹᱜᱤᱛ ᱟᱢᱟᱜ Firefox ᱠᱷᱟᱛᱟ ᱨᱮ ᱥᱭᱸᱠ ᱮᱦᱚᱵ ᱢᱮ ᱾ ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ + + ᱟᱢ %s ᱞᱮᱠᱷᱟᱛᱮ ᱚᱞᱜᱟ Firefox ᱵᱨᱟᱩᱡᱟᱹᱨ ᱨᱮ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱮ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟᱢ ᱾ ᱟᱢ ᱪᱮᱫ ᱱᱚᱶᱟ ᱠᱷᱟᱛᱟ ᱨᱮ ᱵᱚᱞᱚ ᱥᱟᱱᱟᱢ ᱠᱟᱱᱟ? ᱦᱮᱸ, ᱵᱚᱞᱚ ᱪᱷᱚᱭᱤᱧ ᱢᱮ @@ -1052,6 +1098,8 @@ ᱟᱡ ᱛᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ ᱵᱮᱥᱟᱜ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) + + ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱵᱞᱚᱠ ᱠᱚᱣᱟᱭ ᱾ ᱥᱟᱦᱴᱟ ᱫᱚ ᱢᱟᱲᱟᱝ ᱞᱮᱠᱷᱟ ᱜᱮ ᱞᱟᱫᱮᱜᱼᱟ ᱾ ᱱᱤᱦᱟᱹᱛ (ᱵᱟᱛᱟᱣᱮᱢᱠᱟᱱᱟ) @@ -1062,13 +1110,25 @@ In English this is an idiom for "choose a side as in an argument or fight" but it is ok to make this more literally about "choosing a position in a physical space --> ᱡᱟᱭᱜᱟ ᱦᱟᱛᱟᱣ ᱢᱮ + + ᱞᱟᱛᱟᱨ ᱴᱩᱞᱵᱟᱨ ᱥᱟᱞᱟᱜ ᱢᱤᱫ ᱛᱤ ᱵᱨᱟᱣᱡᱤᱝ ᱥᱟᱞᱟᱜ ᱪᱮᱛᱟᱱ ᱥᱮᱱ ᱨᱟᱠᱟᱵ ᱨᱮᱭᱟᱜ ᱪᱮᱥᱴᱟᱭ ᱢᱮ ᱾ ᱱᱤᱡᱮᱨᱟᱜ ᱨᱮ ᱵᱨᱟᱩᱡ ᱢᱮ + + ᱢᱤᱫ ᱡᱮᱠᱷᱟ ᱯᱨᱭᱣᱮᱴ ᱴᱮᱵ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ: %s ᱟᱭᱠᱚᱱ ᱨᱮ ᱴᱤᱯᱟᱹᱣ ᱢᱮ ᱾ + + ᱡᱷᱚᱛᱚ ᱵᱮᱲᱟ ᱱᱤᱡᱚᱨᱟᱜ ᱴᱮᱵᱠᱚ ᱠᱷᱩᱞᱟ ᱠᱟᱜᱼᱢᱮ: ᱱᱤᱡᱚᱴᱨᱟᱜ ᱵᱨᱟᱣᱡᱤᱝ ᱥᱟᱡᱟᱣ ᱠᱚ ᱟᱹᱯᱰᱮᱴ ᱢᱮ ᱾ ᱥᱟᱡᱟᱣ ᱠᱚ ᱡᱷᱤᱡ ᱢᱮ ᱟᱢᱟᱜ ᱱᱤᱥᱚᱱ + + ᱟᱞᱮ %s ᱞᱮ ᱰᱤᱡᱟᱭᱤᱱ ᱟᱠᱟᱫᱼᱟ ᱚᱠᱟ ᱫᱚ ᱡᱟᱦᱟᱱᱟᱜ ᱠᱚ ᱚᱱᱞᱟᱭᱤᱱ ᱦᱟᱹᱴᱤᱧ ᱨᱮ + ᱟᱨ ᱚᱠᱟ ᱠᱚ ᱟᱞᱮ ᱦᱟᱹᱤᱧ ᱟᱞᱮᱭᱟᱢ, ᱜᱚᱲᱚ ᱮᱢᱟᱭ ᱾ + ᱟᱞᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ ᱱᱚᱴᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱯᱮ @@ -1109,6 +1169,10 @@ ᱟᱢᱟᱜ ᱠᱮᱢᱨᱟ ᱛᱮ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ ᱵᱟᱹᱫᱟᱹᱞ ᱛᱮ ᱮᱢᱮᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + + ᱢᱤᱫᱴᱟᱹᱝ ᱛᱮᱭᱟᱨ ᱢᱮ ᱰᱥᱫᱷᱚᱱ ᱠᱚ ᱵᱷᱤᱛᱨᱭ ᱨᱮ Firefox ᱥᱭᱸᱠ ᱞᱟᱹᱜᱤᱫ ᱾]]> + + Firefox ᱟᱢᱟᱜ ᱠᱷᱟᱛᱟ ᱥᱟᱞᱟᱜ ᱟᱭᱩᱨ ᱢᱤᱫ ᱵᱚᱸᱫᱭ ᱟᱭ, ᱦᱮᱞᱮ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱭ ᱢᱮᱴᱟᱣᱟᱭ ᱾ ᱡᱚᱱᱚᱲᱟᱣ ᱚᱪᱚᱜ @@ -1127,17 +1191,33 @@ ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ ᱱᱟᱯ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) + + ᱠᱚᱢ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱵᱚᱸᱫᱚᱭᱮᱟ ᱾ ᱥᱟᱦᱴᱟ ᱢᱟᱲᱟᱝ ᱞᱮᱠᱷᱟ ᱞᱟᱫᱮᱜᱼᱟ ᱾ + + ᱢᱩᱞ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱨᱚᱠᱷᱭᱟ ᱫᱚ ᱪᱮᱫ ᱮ ᱵᱞᱚᱠ ᱪᱷᱚ ᱠᱮᱜᱼᱟᱭ ᱱᱤᱦᱟᱹᱛ ᱡᱟᱹᱥᱛᱤ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ, ᱰᱷᱟᱣᱨᱟ ᱟᱨ ᱴᱟᱴᱠᱟ ᱚᱰᱚᱠ ᱠᱚ ᱟᱴᱠᱟᱣ ᱟᱭ , ᱥᱟᱠᱟᱢ ᱞᱚᱜᱚᱱ ᱞᱚᱰᱚᱜᱼᱟ ᱦᱮᱞᱮ ᱠᱤᱪᱷᱤ ᱡᱤᱱᱤᱥ ᱴᱷᱤᱠ ᱥᱮ ᱵᱟᱭ ᱠᱟᱹᱢᱤᱟᱭ ᱾ + + ᱴᱷᱤᱴ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱨᱩᱠᱷᱭᱟ ᱫᱚ ᱪᱮᱫ ᱵᱞᱚᱠ ᱠᱮᱜᱼᱟᱭ ᱠᱩᱥᱤᱭᱟᱜ + + ᱪᱚᱭᱚᱱ ᱢᱮ ᱚᱠᱟ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱟᱨ ᱥᱠᱨᱤᱯᱴ ᱞᱚ ᱵᱞᱚᱠ ᱠᱚᱣᱟ ᱾ + + ᱠᱚᱥᱴᱚᱢ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱛᱮ ᱪᱮᱫ ᱵᱞᱚᱠ ᱟᱹᱠᱟᱱᱟ ᱠᱩᱠᱤᱡ ᱠᱚ ᱠᱨᱚᱥᱼᱥᱟᱭᱤᱴ ᱟᱨ ᱥᱳᱥᱤᱭᱟᱞ ᱢᱤᱰᱤᱭᱟ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ + + ᱵᱟᱝ ᱦᱤᱨᱤᱠᱟᱱ ᱥᱟᱭᱤᱴ ᱠᱚ ᱠᱷᱚᱱ ᱠᱩᱩᱠᱤ ᱠᱚ + + ᱡᱷᱚᱛᱚ ᱯᱮᱼᱯᱟᱨᱴᱭ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱣᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱭ) + + ᱠᱷᱚᱛᱚ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱣᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫᱟᱭ) ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱡᱤᱱᱤᱥ @@ -1232,6 +1312,9 @@ ᱠᱷᱟᱴᱚᱢᱟᱪᱷᱟ ᱧᱩᱛᱩᱢ + + ᱟᱢ ᱞᱚᱜᱚᱱ ᱵᱨᱟᱩᱡ ᱟᱨ ᱮᱯᱯ ᱞᱮᱠᱷᱟᱱ ᱚᱱᱩᱵᱷᱟᱹᱵ ᱤᱫᱤ ᱞᱟᱹᱜᱤᱫ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱫᱚ ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱚᱲᱟᱜ ᱥᱠᱨᱭᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫ ᱫᱟᱲᱮᱟᱜᱼᱟᱢ ᱾ + ᱵᱚᱞᱚᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 9c31ee113e..73d4e3b7f4 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -342,6 +342,10 @@ Уласная калекцыя дадаткаў + + OK + + Скасаваць Назва калекцыі @@ -538,6 +542,14 @@ Тут няма нядаўна закрытых картак + + Карткі + + Выгляд карткі + + Спіс + + Сетка Закрываць карткі @@ -800,6 +812,8 @@ Месцазнаходжанне Абвестка + + Пастаяннае сховішча Запытваць дазвол diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1b3a5f556f..1f3b382fe9 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -351,6 +351,13 @@ Ειδοποιήσεις + + OK + + Ακύρωση + + Όνομα συλλογής + Συγχρονισμός τώρα @@ -536,6 +543,14 @@ Καμία πρόσφατα κλεισμένη καρτέλα + + Καρτέλες + + Προβολή καρτελών + + Λίστα + + Πλέγμα Κλείσιμο καρτελών @@ -651,6 +666,10 @@ Διαγραφή %1$d στοιχείων + + Σήμερα + + Χθες Τελευταίες 24 ώρες diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 51c50aca57..e820024788 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -350,6 +350,20 @@ Notificaciones + + + Colección personalizada de complementos + + Aceptar + + Cancelar + + Nombre de la colección + + Dueño de la colección (ID de usuario) + + Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + Sincronizar ahora @@ -540,6 +554,14 @@ No hay pestañas recientemente cerradas + + Pestañas + + Vista de pestaña + + Lista + + Cuadrícula Cerrar pestañas @@ -660,6 +682,10 @@ Eliminar %1$d elementos + + Hoy + + Ayer Últimas 24 horas @@ -800,6 +826,8 @@ Ubicación Notificación + + Almacenamiento persistente Pedir permiso diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 3f368f35df..2e9c7824a5 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -542,6 +542,14 @@ Gjin koartlyn sluten ljepblêden hjir + + Ljepblêden + + Ljepblêdwerjefte + + List + + Roaster Ljepblêden slute @@ -798,6 +806,8 @@ Lokaasje Notifikaasje + + Fêst ûnthâld Freegje om tastimming diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 3676434aff..1baf32218e 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -343,6 +343,20 @@ Pranešimai + + + Tinkintas priedų rinkinys + + Gerai + + Atsisakyti + + Rinkinio pavadinimas + + Rinkinio savininkas (naudotojo ID) + + Pakeistas priedų rinkinys. Išeinama iš programos, kad būtų pritaikyti pakeitimai… + Sinchronizuoti dabar @@ -529,6 +543,14 @@ Nėra paskiausiai užvertų kortelių + + Kortelės + + Kortelių vaizdas + + Sąrašas + + Tinklelis Užverti korteles @@ -645,6 +667,10 @@ Pašalinti įrašus (%1$d) + + Šiandien + + Vakar Paskiausios 24 valandos @@ -784,6 +810,8 @@ Vieta Pranešimas + + Išliekanti atmintis Prašyti leidimo diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 9e76e259e3..65f9e77c5c 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -548,6 +548,14 @@ Ingen nylege attlatne faner + + Faner + + Fanevising + + Liste + + Rutenett Lat att faner @@ -809,6 +817,8 @@ Varsel + + Vedvarande lagring Spør om løyve diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 4ef920b5a5..df43ddee36 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -342,6 +342,13 @@ Notificacions + + D’acòrdi + + Anullar + + Nom de la collecion + Sincronizar ara @@ -528,6 +535,14 @@ Cap d’onglets pas tampats recentament + + Onglets + + Vista onglet + + Lista + + Grasilha Tampar los onglets @@ -644,6 +659,10 @@ Suprimir %1$d elements + + Uèi + + Ièr Las darrièras 24 oras @@ -787,6 +806,8 @@ Notificacion + + Emmagazinatge persistent Demandar per autorizar @@ -1240,6 +1261,9 @@ The first parameter is the app name --> %s | Bibliotècas liuras + + Traçador per redireccion + Assisténcia diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 92fae823e0..4537574851 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -555,6 +555,14 @@ Здесь нет недавно закрытых вкладок + + Вкладки + + Просмотр вкладок + + Списком + + Сеткой Закрывать вкладки @@ -816,6 +824,8 @@ Местоположение Уведомления + + Постоянное хранилище Всегда спрашивать diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index df69291c99..d10fc67cc1 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -346,6 +346,9 @@ Obvestila + + + Zbirka dodatkov po meri V redu @@ -353,6 +356,11 @@ Ime zbirke + + Lastnik zbirke (ID uporabnika) + + Zbirka dodatkov je spremenjena. Zapiranje aplikacije za uveljavitev sprememb … + Sinhroniziraj zdaj @@ -537,6 +545,14 @@ Ni nedavno zaprtih zavihkov + + Zavihki + + Pogled zavihkov + + Seznam + + Mreža Zapri zavihke @@ -653,6 +669,10 @@ Izbriši %1$d predmetov + + Danes + + Včeraj Zadnjih 24 ur @@ -792,6 +812,8 @@ Lokacija Obvestilo + + Trajna shramba Vprašaj za dovoljenje diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index f89ca5904b..2ee40e3dbc 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -1510,6 +1510,8 @@ Хуш омадед ба барномаи комилан нави %s + + Шуморо браузери комилан аз нав тарҳрезишуда интизор аст, ки ба шумо бо самаранокӣ ва хусусиятҳои такмилёфта барои кори бештар дар Интернет кумак мерасонад.\n\nЛутфан, интизор шавед, то мо %s-ро навсозӣ кунем, аз он ҷумла %s нав шуда истодааст... diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 65ba9d0ee3..0ab7704f72 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -344,6 +344,20 @@ การแจ้งเตือน + + + ชุดสะสมส่วนเสริมที่กำหนดเอง + + ตกลง + + ยกเลิก + + ชื่อชุดสะสม + + เจ้าของชุดสะสม (ไอดีผู้ใช้) + + ชุดสะสมส่วนเสริมได้ถูกแก้ไขแล้ว ออกจากแอปพลิเคชันเพื่อใช้การเปลี่ยนแปลง… + ซิงค์ตอนนี้ @@ -526,6 +540,14 @@ ไม่มีแท็บที่ปิดล่าสุด + + แท็บ + + มุมมองแท็บ + + รายการ + + เส้นตาราง ปิดแท็บ @@ -642,6 +664,10 @@ ลบ %1$d รายการ + + วันนี้ + + เมื่อวาน 24 ชั่วโมงที่ผ่านมา @@ -780,6 +806,8 @@ ตำแหน่งที่ตั้ง การแจ้งเตือน + + ที่เก็บถาวร ถามเพื่ออนุญาต diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a03e619e4e..1bc81b9bc8 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -344,6 +344,20 @@ Thông báo + + + Bộ sưu tập tiện ích tùy chỉnh + + OK + + Hủy bỏ + + Tên bộ sưu tập + + Chủ sở hữu bộ sưu tập (ID người dùng) + + Đã sửa đổi bộ sưu tập tiện ích mở rộng. Thoát ứng dụng để áp dụng các thay đổi… + Đồng bộ ngay @@ -526,6 +540,14 @@ Không có thẻ nào đã đóng gần đây ở đây + + Thẻ + + Chế độ xem thẻ + + Danh sách + + Lưới Đóng thẻ @@ -641,6 +663,10 @@ Xóa %1$d mục + + Hôm nay + + Hôm qua 24 giờ qua @@ -779,6 +805,8 @@ Thông báo + + Bộ nhớ liên tục Hỏi để cho phép From ee0acabd73cc98bdc5e5fb95ec3dc1ac1837b20f Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 11 Oct 2020 15:34:22 +0000 Subject: [PATCH 02/97] Update Android Components version to 63.0.20201010190133. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 1da5df7ea1..b18a72855a 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 = "63.0.20201010143128" + const val VERSION = "63.0.20201010190133" } From 827f7559623971962d7393e53df99ea5030311b8 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sun, 11 Oct 2020 22:53:05 -0400 Subject: [PATCH 03/97] No issue - Commit auto-generated glean changes for metrics.md --- docs/metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/metrics.md b/docs/metrics.md index 6ba26840c5..0614a699c9 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -99,7 +99,7 @@ The following metrics are added to the ping: | download_notification.try_again |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user tapped on try again when a download fails in the download notification |[1](https://github.com/mozilla-mobile/fenix/pull/6554), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | error_page.visited_error |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user encountered an error page |[1](https://github.com/mozilla-mobile/fenix/pull/2491#issuecomment-492414486), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • error_type: The error type of the error page encountered
|2021-04-01 |2 | | events.app_opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the app (from cold start, to the homescreen or browser) |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: The method used to open Fenix. Possible values are: `app_icon`, `custom_tab` or `link`
|2021-04-01 |2 | -| events.app_opened_all_startup |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the app to the HomeActivity. The HomeActivity encompasses the home screen, browser screen, settings screen, collections and other screens in the nav_graph. This differs from the app_opened probe because it measures all startups, not just cold startup. Note: There is a short gap between the time application goes into background and the time android reports the application going into the background. Note: This metric does not record souce when app opened from task switcher: open application -> press home button -> open recent tasks -> choose fenix. In this case will report [source = unknown, type = hot, has_saved_instance_state = false]. |[1](https://github.com/mozilla-mobile/fenix/pull/12114#pullrequestreview-445245341), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [3](https://github.com/mozilla-mobile/fenix/pull/13494#pullrequestreview-474050499)|
  • 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_opened_all_startup |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened the app to the HomeActivity. The HomeActivity encompasses the home screen, browser screen, settings screen, collections and other screens in the nav_graph. This differs from the app_opened probe because it measures all startups, not just cold startup. Note: There is a short gap between the time application goes into background and the time android reports the application going into the background. Note: This metric does not record souce when app opened from task switcher: open application -> press home button -> open recent tasks -> choose fenix. In this case will report [source = unknown, type = hot, has_saved_instance_state = false]. |[1](https://github.com/mozilla-mobile/fenix/pull/12114#pullrequestreview-445245341), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877), [3](https://github.com/mozilla-mobile/fenix/pull/13494#pullrequestreview-474050499), [4](https://github.com/mozilla-mobile/fenix/pull/15605#issuecomment-702365594)|
  • first_frame_pre_draw_nanos: the number of nanoseconds the application took to launch. This is the time difference between application launch(user pressing app_icon, launching a link) and until the first view is about to be drawn on the screen. If the time is not captured, this extra key will not be reported.
  • has_saved_instance_state: boolean value whether or not startup type has a savedInstance. using savedInstance, HomeActivity's previous state can be restored. This is an optional key since it is not applicable to all the cases. for example, when we are doing a hot start up, we cant have a savedInstanceState therefore we report only [APP_ICON, HOT] instead of [APP_ICON, HOT, false].
  • source: The method used to open Fenix. Possible values are `app_icon`, `custom_tab`, `link` or `unknown`. unknown is for startup sources where we can't pinpoint the cause. One UNKNOWN case is the app switcher where we don't know what variables to check to ensure this startup wasn't caused by something else.
  • type: the startup type for opening fenix. the application and HomeActivity either needs to be created or started again. possible values are `cold`, `warm`, `hot` or `error`. Error is for impossible cases. Please file a bug if you see the error case. app created AND HomeActivity created = cold app started AND HomeActivity created = warm app started AND HomeActivity started = hot app created AND HomeActivity started = error Some applications such as gmail launches the default browser in the background. So when we eventually click a link, browser is already started in the background. This means that custom_tab will mostly report `warm` startup type.
|2021-06-01 |2 | | events.app_received_intent |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The system received an Intent for the HomeActivity. An intent is received an external entity wants to the app to display content. Intents can be received when the app is closed – at which point the app will be opened – or when the app is already opened – at which point the already open app will make changes such as loading a url. This can be used loosely as a heuristic for when the user requested to open the app. The HomeActivity encompasses the home screen and browser screen but may include other screens. This differs from the app_opened probe because it measures all startups, not just cold startup. |[1](https://github.com/mozilla-mobile/fenix/pull/11940/), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • source: The method used to open Fenix. Possible values are `app_icon`, `custom_tab`, `link` or `unknown`
|2021-06-01 | | | events.browser_menu_action |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A browser menu item was tapped |[1](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [2](https://github.com/mozilla-mobile/fenix/pull/5098#issuecomment-529658996), [3](https://github.com/mozilla-mobile/fenix/pull/6310), [4](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • item: A string containing the name of the item the user tapped. These items include: Settings, Help, Desktop Site toggle on/off, Find in Page, New Tab, Private Tab, Share, Report Site Issue, Back/Forward button, Reload Button, Quit, Reader Mode On, Reader Mode Off, Open In app, Add To Top Sites, Add-ons Manager, Bookmarks, History
|2021-04-01 |2 | | events.entered_url |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user entered a url |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • autocomplete: A boolean that tells us whether the URL was autofilled by an Autocomplete suggestion
|2021-04-01 |2 | From 463f83a79a7a666a9e4c3819e7852a4bf7fe057b Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sun, 11 Oct 2020 22:32:35 -0400 Subject: [PATCH 04/97] =?UTF-8?q?For=20#15758=20=E2=81=83=20[Grid=20View]?= =?UTF-8?q?=20Add=20a=20divider=20between=20the=20tab=20item's=20title=20a?= =?UTF-8?q?nd=20thumbnail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/tab_tray_grid_item.xml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/tab_tray_grid_item.xml b/app/src/main/res/layout/tab_tray_grid_item.xml index c8edbdf74d..00e1b7c280 100644 --- a/app/src/main/res/layout/tab_tray_grid_item.xml +++ b/app/src/main/res/layout/tab_tray_grid_item.xml @@ -40,8 +40,8 @@ android:layout_height="16dp" android:layout_marginStart="8dp" android:importantForAccessibility="no" - app:layout_constraintBottom_toTopOf="@id/mozac_browser_tabstray_card" - app:layout_constraintStart_toStartOf="@id/mozac_browser_tabstray_card" + app:layout_constraintBottom_toTopOf="@id/horizonatal_divider" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintTop_toBottomOf="@+id/horizonatal_divider"> Date: Sun, 11 Oct 2020 22:50:18 -0400 Subject: [PATCH 05/97] For #15777 - [Grid View] Set the height of the title to 30dp --- app/src/main/res/layout/tab_tray_grid_item.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/tab_tray_grid_item.xml b/app/src/main/res/layout/tab_tray_grid_item.xml index 00e1b7c280..4a46ad7ee6 100644 --- a/app/src/main/res/layout/tab_tray_grid_item.xml +++ b/app/src/main/res/layout/tab_tray_grid_item.xml @@ -47,7 +47,7 @@ Date: Tue, 13 Oct 2020 00:05:42 +0000 Subject: [PATCH 06/97] Import l10n. --- app/src/main/res/values-be/strings.xml | 16 +++-- app/src/main/res/values-ca/strings.xml | 75 ++++++++++++++++++++-- app/src/main/res/values-cak/strings.xml | 10 +++ app/src/main/res/values-cs/strings.xml | 3 +- app/src/main/res/values-cy/strings.xml | 10 +++ app/src/main/res/values-el/strings.xml | 10 +++ app/src/main/res/values-es-rCL/strings.xml | 10 +++ app/src/main/res/values-fr/strings.xml | 8 +++ app/src/main/res/values-it/strings.xml | 29 +++++++++ 9 files changed, 159 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 73d4e3b7f4..7a57ea6cf2 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -276,6 +276,8 @@ Уласны сервер уліковых запісаў Firefox Уласны сервер сінхранізацыі + + Сервер уліковага запісу Firefox/сінхранізацыі зменены. Выхад з праграмы, каб прымяніць змены… Уліковы запіс @@ -489,9 +491,9 @@ Пацягніце, каб абнавіць - Пракруціце, каб схаваць панэль інструментаў + Пракруціць, каб схаваць панэль інструментаў - Пасуньце ўбок панэль інструментаў, каб пераключыць карткі + Пасунуць убок панэль інструментаў, каб пераключыць карткі Пасуньце ўверх панэль інструментаў, каб адкрыць карткі @@ -1275,6 +1277,8 @@ Абмяжоўвае мажлівасць сацыяльных сетак асочваць вашу дзейнасць у сеціве. Міжсайтавыя кукі асочвання + + Блакуе файлы cookie, якія рэкламныя сеткі і аналітычныя кампаніі выкарыстоўваюць, каб аб’яднаць звесткі аглядання з многіх сайтаў. Майнеры крыптавалют @@ -1467,7 +1471,7 @@ Маштабаванне на ўсіх сайтах - Актываваць, каб дазволіць маштабаванне нават на тых вэб-сайтах, якія гэта забараняюць. + Уключыце, каб дазволіць маштабаванне нават на тых сайтах, якія гэта забараняюць. Назва (А-Я) @@ -1630,7 +1634,7 @@ OK, зразумела - Паказаць найбольш наведаныя сайты + Паказваць найбольш наведаныя сайты Выдаліць @@ -1645,4 +1649,6 @@ Групуйце падобныя пошукі, сайты і карткі для хуткага доступу. Вы ўвайшлі як %s у іншым браўзеры Firefox на гэтым тэлефоне. Ці хочаце аўтарызавацца з дапамогай гэтага ўліковага запісу? - + + Вы можаце лёгка дадаць гэты вэб-сайт на хатні экран свайго тэлефона, каб мець да яго імгненны доступ і аглядаць хутчэй, нібыта гэта асобная праграма. + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 3920dac193..13b3be7859 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -144,6 +144,8 @@ Instal·la Pestanyes sincronitzades + + Resincronitza Cerca a la pàgina @@ -270,6 +272,8 @@ Obre els enllaços en una pestanya privada Permet les captures de pantalla en la navegació privada + + Si es permet, les pestanyes privades també seran visibles quan hi hagi diverses aplicacions obertes Afegeix una drecera de navegació privada @@ -290,6 +294,8 @@ Tema Inici + + Gestos Personalitza @@ -324,9 +330,13 @@ Cerca en l’historial de navegació Cerca en les adreces d’interès + + Cerca en les pestanyes sincronitzades Paràmetres del compte + + Emplenament automàtic dels URL Obre els enllaços en les aplicacions @@ -337,6 +347,20 @@ Notificacions + + + Col·lecció de complements personalitzada + + D’acord + + Cancel·la + + Nom de la col·lecció + + Propietari de la col·lecció (identificador d’usuari) + + S’ha modificat la col·lecció de complements. L’aplicació es tancarà per aplicar els canvis… + Sincronitza ara @@ -463,6 +487,17 @@ Segons el tema del dispositiu + + + Estira per actualitzar + + Amaga la barra d’eines en desplaçar-me + + + Canvia de pestanya en fer lliscar la barra d’eines cap als costats + + Mostra les pestanyes obertes en fer lliscar la barra d’eines cap amunt + Sessions @@ -509,6 +544,14 @@ No hi ha cap pestanya tancada recentment + + Pestanyes + + Vista de pestanyes + + Llista + + Graella Tanca les pestanyes @@ -624,6 +667,10 @@ Suprimeix %1$d elements + + Avui + + Ahir Darreres 24 hores @@ -762,6 +809,8 @@ Ubicació Notificació + + Emmagatzematge persistent Demana-m’ho @@ -1055,7 +1104,7 @@ - Ja heu iniciat la sessió com a %s en un altre navegador Firefox d’aquest telèfon. Voleu iniciar la sessió amb aquest compte? + Ja heu iniciat la sessió com a %s en un altre navegador Firefox d’aquest dispositiu. Voleu iniciar la sessió amb aquest compte? Sí, inicia la sessió @@ -1145,6 +1194,8 @@ Inicieu la sessió amb la càmera Usa el correu electrònic en lloc + + Creeu-ne un per sincronitzar el Firefox entre dispositius.]]> El Firefox deixarà de sincronitzar-se amb el vostre compte, però les vostres dades de navegació d’aquest dispositiu no se suprimiran. @@ -1254,6 +1305,11 @@ The first parameter is the app name --> %s | Biblioteques de codi obert + + Elements de seguiment de redirecció + + Esborra les galetes definides per redireccions a llocs web que se sap que fan seguiment. + Assistència @@ -1299,7 +1355,7 @@ Nom de la drecera - Podeu afegir fàcilment aquest lloc web a la pantalla d’inici del telèfon per accedir-hi directament i navegar-hi com si fos una aplicació. + Podeu afegir fàcilment aquest lloc web a la pantalla d’inici del vostre dispositiu per accedir-hi directament i navegar-hi com si fos una aplicació. Inicis de sessió i contrasenyes @@ -1370,8 +1426,12 @@ S’ha copiat el lloc al porta-retalls Copia la contrasenya + + Esborra la contrasenya Copia el nom d’usuari + + Esborra el nom d’usuari Copia el lloc @@ -1528,7 +1588,7 @@ Ja existeix un inici de sessió amb aquest nom d’usuari - + Connecteu un altre dispositiu. Torneu a autenticar-vos. @@ -1549,7 +1609,7 @@ S’ha arribat al límit de llocs principals - Per afegir un lloc principal nou, primer cal que n’elimineu algun altre. Manteniu premut el lloc i seleccioneu eliminar-lo. + Per afegir un lloc principal nou, primer cal que n’elimineu algun altre. Manteniu premut el lloc i seleccioneu eliminar-lo. Entesos @@ -1559,7 +1619,7 @@ Elimina - Traieu tot el profit al %s. @@ -1567,4 +1627,9 @@ Recolliu tot allò que us insteressa Agrupeu les cerques, els llocs i les pestanyes similars per accedir-hi ràpidament en el futur. + + Ja heu iniciat la sessió com a %s en un altre navegador Firefox d’aquest telèfon. Voleu iniciar la sessió amb aquest compte? + + Podeu afegir fàcilment aquest lloc web a la pantalla d’inici del telèfon per accedir-hi directament i navegar-hi com si fos una aplicació. + diff --git a/app/src/main/res/values-cak/strings.xml b/app/src/main/res/values-cak/strings.xml index 1faae1da74..d8ba745d25 100644 --- a/app/src/main/res/values-cak/strings.xml +++ b/app/src/main/res/values-cak/strings.xml @@ -553,6 +553,14 @@ Taq ruwi\' man nimakol ta ketz\'apïx wawe\' + + Taq ruwi\' + + Kitz\'etik ruwi\' + + Cholajem + + Kajtz\'ikil Ketz\'apïx taq ruwi\' @@ -816,6 +824,8 @@ K\'ojlemal Rutzijol + + Jutaqil taq Yakoj Tik\'utüx q\'ij diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 080b9118b6..4e8b6e5949 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -536,7 +536,6 @@ Nemáte žádné nedávno zavřené panely - Zavírat panely @@ -1338,7 +1337,7 @@ Název zkratky - Tuto stránku si můžete snadno přidat na domovskou obrazovku svého zařázení. Budete k ní mít okamžitý přístup a prohlížení bude rychlejší se zážitkem jako v aplikaci. + Tuto stránku si můžete snadno přidat na domovskou obrazovku svého zařízení. Budete k ní mít okamžitý přístup a prohlížení bude rychlejší se zážitkem jako v aplikaci. Přihlašovací údaje diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 893758d313..52fbd99085 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -541,6 +541,14 @@ Dim tabiau wedi’u cau yn ddiweddar yma + + Tabiau + + Golwg tab + + Rhestr + + Grid Cau tabiau @@ -799,6 +807,8 @@ Lleoliad Hysbysiad + + Storfa Barhaol Gofyn i ganiatáu diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1f3b382fe9..8605e93992 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -351,6 +351,9 @@ Ειδοποιήσεις + + + Προσαρμοσμένη συλλογή προσθέτων OK @@ -358,6 +361,11 @@ Όνομα συλλογής + + Κάτοχος συλλογής (ID χρήστη) + + Η συλλογή προσθέτων τροποποιήθηκε. Κλείσιμο εφαρμογής για εφαρμογή αλλαγών… + Συγχρονισμός τώρα @@ -810,6 +818,8 @@ Τοποθεσία Ειδοποιήσεις + + Μόνιμη αποθήκευση Ερώτηση για αποδοχή diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index 7dafcda13a..1405f1b7c8 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -540,6 +540,14 @@ No hay pestañas cerradas recientemente aquí + + Pestañas + + Vista de pestaña + + Lista + + Cuadrícula Cerrar pestañas @@ -797,6 +805,8 @@ Ubicación Notificación + + Almacenamiento persistente Pedir permiso diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2fa062c0aa..6579565a64 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -537,6 +537,12 @@ Aucun onglet récemment fermé ici + + Onglets + + Liste + + Grille Fermer les onglets @@ -794,6 +800,8 @@ Localisation Notifications + + Stockage persistant Demander pour autoriser diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0dde1246c0..c25bdf3384 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -351,6 +351,21 @@ Notifiche + + + Raccolta di componenti aggiuntivi personalizzata + + OK + + Annulla + + Nome della raccolta + + Proprietario della raccolta (ID utente) + + + Raccolta di componenti aggiuntivi modificata. L’app verrà chiusa per applicare le modifiche… + Sincronizza adesso @@ -540,6 +555,14 @@ Nessuna scheda chiusa di recente + + Schede + + Visualizzazione schede + + Elenco + + Griglia Chiudi schede @@ -656,6 +679,10 @@ Elimina %1$d elementi + + Oggi + + Ieri Ultime 24 ore @@ -797,6 +824,8 @@ Posizione Notifica + + Archiviazione permanente Chiedi il consenso From 0e2657e2620457c502e6b79b40f67ced6f8f0117 Mon Sep 17 00:00:00 2001 From: Mihai Adrian Carare <48995920+mcarare@users.noreply.github.com> Date: Tue, 13 Oct 2020 16:17:58 +0300 Subject: [PATCH 07/97] For #14735: Remove debug logs from release build. (#15747) --- app/proguard-rules.pro | 8 ++ .../org/mozilla/fenix/FenixApplication.kt | 4 +- .../java/org/mozilla/fenix/FenixLogSink.kt | 30 ++++++++ .../org/mozilla/fenix/FenixLogSinkTest.kt | 77 +++++++++++++++++++ 4 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/FenixLogSink.kt create mode 100644 app/src/test/java/org/mozilla/fenix/FenixLogSinkTest.kt diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 6ca59c4d9e..aa2ae32aee 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -45,6 +45,14 @@ boolean ANDROID_DETECTED return true; } +#################################################################################################### +# Remove debug logs from release builds +#################################################################################################### +-assumenosideeffects class android.util.Log { + public static boolean isLoggable(java.lang.String, int); + public static int d(...); +} + #################################################################################################### # Mozilla Application Services #################################################################################################### diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 750a68d4c6..086035b130 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -32,7 +32,6 @@ import mozilla.components.service.glean.config.Configuration import mozilla.components.service.glean.net.ConceptFetchHttpUploader import mozilla.components.support.base.log.Log import mozilla.components.support.base.log.logger.Logger -import mozilla.components.support.base.log.sink.AndroidLogSink import mozilla.components.support.ktx.android.content.isMainProcess import mozilla.components.support.ktx.android.content.runOnlyInMainProcess import mozilla.components.support.locale.LocaleAwareApplication @@ -42,7 +41,6 @@ import mozilla.components.support.utils.logElapsedTime import mozilla.components.support.webextensions.WebExtensionSupport import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.metrics.MetricServiceType -import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.perf.StorageStatsMetrics import org.mozilla.fenix.perf.StartupTimeline @@ -114,7 +112,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { setupCrashReporting() // We want the log messages of all builds to go to Android logcat - Log.addSink(AndroidLogSink()) + Log.addSink(FenixLogSink(logsDebug = Config.channel.isDebug)) } @CallSuper diff --git a/app/src/main/java/org/mozilla/fenix/FenixLogSink.kt b/app/src/main/java/org/mozilla/fenix/FenixLogSink.kt new file mode 100644 index 0000000000..b09b003af4 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/FenixLogSink.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 + +import mozilla.components.support.base.log.Log +import mozilla.components.support.base.log.sink.AndroidLogSink +import mozilla.components.support.base.log.sink.LogSink + +/** + * Fenix [LogSink] implementation that writes to Android's log, depending on settings. + * + * @param logsDebug If set to false, removes logging of debug logs. + */ +class FenixLogSink(private val logsDebug: Boolean = true) : LogSink { + + private val androidLogSink = AndroidLogSink() + + override fun log( + priority: Log.Priority, + tag: String?, + throwable: Throwable?, + message: String? + ) { + if (priority == Log.Priority.DEBUG && !logsDebug) + return + androidLogSink.log(priority, tag, throwable, message) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/FenixLogSinkTest.kt b/app/src/test/java/org/mozilla/fenix/FenixLogSinkTest.kt new file mode 100644 index 0000000000..b643e71e1e --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/FenixLogSinkTest.kt @@ -0,0 +1,77 @@ +package org.mozilla.fenix + +import android.util.Log +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import io.mockk.verify +import org.junit.After +import org.junit.Before +import org.junit.Test + +class FenixLogSinkTest { + + @Before + fun setup() { + mockkStatic(Log::class) + } + + @After + fun teardown() { + unmockkStatic(Log::class) + } + + @Test + fun `GIVEN we're in a release build WHEN we log debug statements THEN logs should not be forwarded`() { + val logSink = FenixLogSink(false) + logSink.log( + mozilla.components.support.base.log.Log.Priority.DEBUG, + "test", + message = "test" + ) + verify(exactly = 0) { Log.println(Log.DEBUG, "test", "test") } + } + + @Test + fun `GIVEN we're in a release build WHEN we log error statements THEN logs should be forwarded`() { + val logSink = FenixLogSink(false) + logSink.log( + mozilla.components.support.base.log.Log.Priority.ERROR, + "test", + message = "test" + ) + verify(exactly = 1) { Log.println(Log.ERROR, "test", "test") } + } + + @Test + fun `GIVEN we're in a release build WHEN we log warn statements THEN logs should be forwarded`() { + val logSink = FenixLogSink(false) + logSink.log( + mozilla.components.support.base.log.Log.Priority.WARN, + "test", + message = "test" + ) + verify(exactly = 1) { Log.println(Log.WARN, "test", "test") } + } + + @Test + fun `GIVEN we're in a release build WHEN we log info statements THEN logs should be forwarded`() { + val logSink = FenixLogSink(false) + logSink.log( + mozilla.components.support.base.log.Log.Priority.INFO, + "test", + message = "test" + ) + verify(exactly = 1) { Log.println(Log.INFO, "test", "test") } + } + + @Test + fun `GIVEN we're in a debug build WHEN we log debug statements THEN logs should be forwarded`() { + val logSink = FenixLogSink(true) + logSink.log( + mozilla.components.support.base.log.Log.Priority.DEBUG, + "test", + message = "test" + ) + verify(exactly = 1) { Log.println(Log.DEBUG, "test", "test") } + } +} From 7931d66c8ebbf6305abf1437dea2b7e3a79e16a4 Mon Sep 17 00:00:00 2001 From: ekager Date: Mon, 12 Oct 2020 15:58:32 -0700 Subject: [PATCH 08/97] For #15853 - Always set fontSizeFactor setting with new text scale --- .../org/mozilla/fenix/settings/AccessibilityFragment.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt index d607112a87..c1e55db14c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccessibilityFragment.kt @@ -45,7 +45,10 @@ class AccessibilityFragment : PreferenceFragmentCompat() { val components = preference.context.components // Value is mapped from 0->30 in steps of 1 so let's convert to float in range 0.5->2.0 - val newTextScale = ((newTextSize * STEP_SIZE) + MIN_SCALE_VALUE).toFloat() / PERCENT_TO_DECIMAL + val newTextScale = + ((newTextSize * STEP_SIZE) + MIN_SCALE_VALUE).toFloat() / PERCENT_TO_DECIMAL + + settings.fontSizeFactor = newTextScale // If scale is 100%, use the automatic font size adjustment val useAutoSize = newTextScale == 1F @@ -54,7 +57,6 @@ class AccessibilityFragment : PreferenceFragmentCompat() { // If using manual sizing, update the engine settings with the new scale if (!useAutoSize) { - settings.fontSizeFactor = newTextScale components.core.engine.settings.fontSizeFactor = newTextScale } From fb330b188a801283eb2e32cf5693c5e8c0b8fe3f Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 13 Oct 2020 15:33:09 +0000 Subject: [PATCH 09/97] Update Android Components version to 63.0.20201013143114. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index b18a72855a..c9d5a906b1 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 = "63.0.20201010190133" + const val VERSION = "63.0.20201013143114" } From 399c9c57fb69b9a35cf2a2742dd27f087481a5db Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Wed, 14 Oct 2020 00:05:27 +0000 Subject: [PATCH 10/97] Import l10n. --- .../main/res/values-b+sat+Olck/strings.xml | 34 ++++++++++--------- app/src/main/res/values-es/strings.xml | 13 +++++++ app/src/main/res/values-gn/strings.xml | 10 ++++++ app/src/main/res/values-in/strings.xml | 28 +++++++++++++++ app/src/main/res/values-kk/strings.xml | 10 ++++++ app/src/main/res/values-rm/strings.xml | 28 +++++++++++++++ app/src/main/res/values-tg/strings.xml | 12 +++---- app/src/main/res/values-tr/strings.xml | 22 ++++++++++++ 8 files changed, 135 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/values-b+sat+Olck/strings.xml b/app/src/main/res/values-b+sat+Olck/strings.xml index dc0983a80a..2f1d9bcbe2 100644 --- a/app/src/main/res/values-b+sat+Olck/strings.xml +++ b/app/src/main/res/values-b+sat+Olck/strings.xml @@ -52,7 +52,7 @@ ᱟᱢ ᱱᱤᱡᱚᱨᱟᱜ ᱚᱠᱛᱚ ᱨᱮ ᱢᱮᱱᱟᱢ-ᱟ - %1$s ᱟᱢᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱟᱨ ᱯᱟᱱᱛᱮᱭᱟᱜ ᱦᱤᱛᱟᱹᱞ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱠᱷᱚᱱ ᱯᱷᱟᱨᱪᱟ ᱭᱟᱭ ᱡᱚᱠᱷᱚᱱ ᱟᱢ ᱩᱱᱠᱩ ᱵᱚᱸᱫᱚ ᱠᱚᱣᱟᱢ ᱟᱨ ᱮᱯ ᱟᱲᱟᱹᱜ ᱟᱢ. ᱱᱚᱣᱟ ᱫᱚ ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱵᱟᱝ ᱵᱮᱱᱟᱣ ᱢᱤᱭᱟᱭ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱟᱨ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱮᱢᱚᱜᱤᱪ ᱠᱷᱚᱱ, ᱱᱚᱣᱟ ᱫᱚ ᱟᱞᱜᱟ ᱵᱮᱱᱟᱣ ᱟᱭ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱛ ᱪᱷᱤ ᱠᱚ ᱟᱢ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱚᱨᱟᱣ ᱫᱟᱢ ᱩᱱᱠᱩ ᱠᱷᱚᱱ ᱡᱟ ᱱᱚᱣᱟ ᱥᱟᱫᱷᱚᱱ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱚ ᱾ + %1$s ᱟᱢᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱟᱨ ᱯᱟᱱᱛᱮᱭᱟᱜ ᱦᱤᱛᱟᱹᱞ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱠᱷᱚᱱ ᱯᱷᱟᱨᱪᱟ ᱭᱟᱭ ᱡᱚᱠᱷᱚᱱ ᱟᱢ ᱩᱱᱠᱩ ᱵᱚᱸᱫᱚ ᱠᱚᱣᱟᱢ ᱟᱨ ᱮᱯ ᱟᱲᱟᱹᱜ ᱟᱢ. ᱱᱚᱶᱟ ᱫᱚ ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱵᱟᱝ ᱵᱮᱱᱟᱣ ᱢᱤᱭᱟᱭ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱟᱨ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱮᱢᱚᱜᱤᱪ ᱠᱷᱚᱱ, ᱱᱚᱶᱟ ᱫᱚ ᱟᱞᱜᱟ ᱵᱮᱱᱟᱣ ᱟᱭ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱛ ᱪᱷᱤ ᱠᱚ ᱟᱢ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱚᱨᱟᱣ ᱫᱟᱢ ᱩᱱᱠᱩ ᱠᱷᱚᱱ ᱡᱟ ᱱᱚᱶᱟ ᱥᱟᱫᱷᱚᱱ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱚ ᱾ ᱱᱤᱡᱚᱨᱟᱜ ᱵᱨᱟᱣᱡᱤᱝ ᱨᱮᱭᱟᱜ ᱥᱚᱢᱟᱱ ᱮᱰᱮ ᱠᱚ ᱚᱠᱛᱚ ᱢᱮᱴᱟᱣ ᱢᱮ @@ -412,7 +412,7 @@ ᱪᱷᱟᱰᱟ ᱠᱚ - ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱱᱚᱣᱟ ᱠᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ + ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱱᱚᱶᱟ ᱠᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ ᱡᱷᱚᱛᱚ ᱠᱚ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱱ ᱢᱮ @@ -435,6 +435,8 @@ Leanplum ᱚᱠᱚᱭ ᱫᱚ ᱟᱞᱮᱭᱤᱡ ᱢᱚᱵᱟᱭᱤᱞ ᱢᱟᱨᱠᱮᱴᱤᱝ ᱣᱮᱱᱰᱚᱨ ᱠᱟᱱᱟᱭ ᱩᱱᱤ ᱥᱟᱞᱟᱜ %1$s ᱨᱮ ᱯᱷᱤᱪᱚᱨ ᱵᱟᱵᱚᱛ ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱ ᱰᱟᱴᱟ ᱦᱟᱹᱴᱤᱧᱚᱜᱼᱟ ᱾ ᱵᱤᱰᱟᱣ + + ᱮᱠᱥᱯᱮᱨᱤᱢᱮᱱᱴᱟᱞ ᱯᱷᱤᱪᱚᱨ ᱞᱟᱹᱜᱤᱫ Mozilla ᱟᱹᱛᱩᱨ ᱟᱨ ᱰᱟᱴᱟ ᱡᱟᱣᱨᱟ ᱪᱷᱚᱭᱮᱢ ᱨᱟᱹᱯᱩᱫ ᱞᱟᱭ-ᱟᱜ @@ -906,7 +908,7 @@ ᱵᱩᱡᱷᱟᱹᱣ ᱠᱮᱫᱟ - ᱱᱚᱣᱟ ᱮᱯᱯ ᱵᱷᱮᱡᱟ ᱵᱟᱝ ᱜᱟᱱᱚᱜᱼᱟ + ᱱᱚᱶᱟ ᱮᱯᱯ ᱵᱷᱮᱡᱟ ᱵᱟᱝ ᱜᱟᱱᱚᱜᱼᱟ ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱠᱩᱞ ᱢᱮ @@ -968,7 +970,7 @@ %1$s ᱢᱮᱴᱟᱣ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢ-ᱟ? - ᱱᱚᱣᱟ ᱴᱮᱵ ᱢᱮᱴᱟᱣ ᱞᱮᱠᱷᱟᱭ ᱥᱟᱱᱟᱢ ᱛᱩᱢᱟᱹᱞ ᱢᱮᱴᱟᱣ ᱪᱟᱵᱟᱜ-ᱟ ᱾ ᱚᱠᱟ ᱥᱚᱢᱚᱭ ᱨᱮ ᱦᱚᱸ ᱟᱢ ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱠᱚ ᱛᱮᱭᱟᱨ ᱫᱟᱲᱮᱼᱟᱜ ᱟᱢ ᱾ + ᱱᱚᱶᱟ ᱴᱮᱵ ᱢᱮᱴᱟᱣ ᱞᱮᱠᱷᱟᱭ ᱥᱟᱱᱟᱢ ᱛᱩᱢᱟᱹᱞ ᱢᱮᱴᱟᱣ ᱪᱟᱵᱟᱜ-ᱟ ᱾ ᱚᱠᱟ ᱥᱚᱢᱚᱭ ᱨᱮ ᱦᱚᱸ ᱟᱢ ᱱᱟᱶᱟ ᱛᱩᱢᱟᱹᱞ ᱠᱚ ᱛᱮᱭᱟᱨ ᱫᱟᱲᱮᱼᱟᱜ ᱟᱢ ᱾ %1$s ᱢᱮᱴᱟᱣᱟ ᱥᱮ? @@ -1029,7 +1031,7 @@ ᱟᱲᱟᱹᱜ ᱢᱮ - ᱱᱚᱣᱟ ᱫᱚ ᱟᱢᱟᱜ ᱥᱟᱱᱟᱢ ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱛᱟᱢᱟᱭ ᱾ + ᱱᱚᱶᱟ ᱫᱚ ᱟᱢᱟᱜ ᱥᱟᱱᱟᱢ ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱛᱟᱢᱟᱭ ᱾ %s ᱵᱟᱪᱷᱟᱣᱟᱜ ᱵᱨᱟᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱟᱭ ᱾ @@ -1215,9 +1217,9 @@ ᱵᱟᱝ ᱦᱤᱨᱤᱠᱟᱱ ᱥᱟᱭᱤᱴ ᱠᱚ ᱠᱷᱚᱱ ᱠᱩᱩᱠᱤ ᱠᱚ - ᱡᱷᱚᱛᱚ ᱯᱮᱼᱯᱟᱨᱴᱭ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱣᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱭ) + ᱡᱷᱚᱛᱚ ᱯᱮᱼᱯᱟᱨᱴᱭ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱶᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱭ) - ᱠᱷᱚᱛᱚ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱣᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫᱟᱭ) + ᱠᱷᱚᱛᱚ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱶᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫᱟᱭ) ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱡᱤᱱᱤᱥ @@ -1244,9 +1246,9 @@ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱡᱤᱱᱤᱥ - ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱠᱚ ᱪᱚᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ + ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱠᱚ ᱪᱚᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ - ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱠᱚ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ + ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱯᱨᱚᱴᱮᱠᱥᱚᱱ ᱠᱚ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ ᱱᱚᱶᱟ ᱠᱚ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱛ ᱵᱟᱲᱦᱟᱣᱟᱠᱟᱱ ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟ-ᱟ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚ ᱡᱟ ᱵᱟᱝ ᱥᱟᱸᱪᱟᱣ ᱠᱟᱱᱟ ᱚᱱᱟᱠᱩ ᱱᱚᱰᱮ ᱩᱫᱩᱜᱚᱣᱟ ᱾ - ᱞᱚᱜᱤᱱᱥ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱫᱚ ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱥᱟᱸᱪᱟᱣᱜᱼᱟ ᱾ + ᱞᱚᱜᱤᱱᱥ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱫᱚ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱥᱟᱸᱪᱟᱣᱜᱼᱟ ᱾ ᱡᱚᱛᱚ ᱪᱷᱟᱰᱟ ᱠᱚ ᱢᱮᱴᱟᱣ ᱢᱮ @@ -1366,7 +1368,7 @@ ᱥᱟᱸᱪᱟᱣᱠᱟᱱ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱚᱱᱞᱚᱠ ᱢᱮ - ᱱᱚᱣᱟ ᱡᱩᱲᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠ ᱟ ᱾ ᱞᱚᱜᱤᱱ ᱨᱮ ᱚᱞ ᱮᱢ ᱡᱤᱱᱤᱥ ᱫᱚ ᱠᱚᱢᱯᱨᱚᱢᱟᱭᱤᱡ ᱫᱟᱲᱮᱟᱜᱼᱟ ᱾ + ᱱᱚᱶᱟ ᱡᱩᱲᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠ ᱟ ᱾ ᱞᱚᱜᱤᱱ ᱨᱮ ᱚᱞ ᱮᱢ ᱡᱤᱱᱤᱥ ᱫᱚ ᱠᱚᱢᱯᱨᱚᱢᱟᱭᱤᱡ ᱫᱟᱲᱮᱟᱜᱼᱟ ᱾ ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ @@ -1466,9 +1468,9 @@ %s ᱢᱮᱴᱟᱣᱮᱱᱟ - %s ᱡᱷᱚᱛᱚ ᱱᱟᱣᱟ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ + %s ᱡᱷᱚᱛᱚ ᱱᱟᱶᱟ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ - ᱯᱭᱨᱟ ᱱᱟᱣᱟ ᱨᱤᱰᱤᱭᱟᱭᱤᱸᱰ ᱵᱨᱟᱩᱡᱚᱨ ᱛᱟᱸᱜᱤ ᱟᱠᱟᱫᱟᱭ, ᱵᱮᱥ ᱠᱟᱹᱢᱤ ᱟᱨ ᱯᱷᱤᱪᱚᱨ ᱠᱚ ᱥᱟᱞᱟᱜ ᱛᱮ ᱚᱠᱟ ᱫᱚ ᱟᱨᱦᱚᱸ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱟᱹᱢᱤ ᱠᱚᱨᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚ ᱢᱮᱟᱭ ᱾ \n\nᱫᱚᱭᱟᱠᱟᱛᱮ ᱛᱟᱸᱜᱤ ᱢᱮ ᱟᱢᱟᱜ %s ᱦᱟᱹᱞᱤᱭᱟᱜ ᱦᱟᱹᱵᱤᱡ + ᱯᱭᱨᱟ ᱱᱟᱶᱟ ᱨᱤᱰᱤᱭᱟᱭᱤᱸᱰ ᱵᱨᱟᱩᱡᱚᱨ ᱛᱟᱸᱜᱤ ᱟᱠᱟᱫᱟᱭ, ᱵᱮᱥ ᱠᱟᱹᱢᱤ ᱟᱨ ᱯᱷᱤᱪᱚᱨ ᱠᱚ ᱥᱟᱞᱟᱜ ᱛᱮ ᱚᱠᱟ ᱫᱚ ᱟᱨᱦᱚᱸ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱟᱹᱢᱤ ᱠᱚᱨᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚ ᱢᱮᱟᱭ ᱾ \n\nᱫᱚᱭᱟᱠᱟᱛᱮ ᱛᱟᱸᱜᱤ ᱢᱮ ᱟᱢᱟᱜ %s ᱦᱟᱹᱞᱤᱭᱟᱜ ᱦᱟᱹᱵᱤᱡ %s ᱦᱟᱹᱞᱤᱭᱟᱼᱜ ᱠᱟᱱᱟ ... @@ -1496,13 +1498,13 @@ ᱟᱢ ᱪᱮᱫ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟᱛᱮ ᱡᱷᱚᱛᱚ ᱚᱱᱩᱢᱚᱛᱤ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? - ᱟᱢ ᱪᱮᱫ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟᱛᱮ ᱱᱚᱶᱟ ᱚᱱᱩᱢᱚᱛᱤ ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? + ᱟᱢ ᱪᱮᱫ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟᱛᱮ ᱱᱚᱶᱟ ᱚᱱᱩᱢᱚᱛᱤ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟᱣ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? ᱥᱟᱭᱤᱴ ᱨᱮᱭᱟᱜ ᱪᱷᱟᱰᱟ ᱠᱚ ᱵᱚᱱᱩᱜ-ᱟ ᱵᱮᱥ ᱚᱱᱚᱞ ᱠᱚ - ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱣᱟ ᱵᱩᱠᱢᱟᱨᱠ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ? + ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱵᱩᱠᱢᱟᱨᱠ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ? ᱛᱮᱛᱟᱱ ᱥᱟᱭᱤᱴ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ ᱥᱟᱯᱲᱟᱣ - ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱣᱟ ᱞᱚᱜᱤᱱ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ? + ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱞᱚᱜᱤᱱ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ? ᱢᱮᱴᱟᱣ ᱢᱮ diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2a65060012..b906c52401 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -551,6 +551,14 @@ No hay pestañas recientemente cerradas + + Pestañas + + Vista de pestaña + + Lista + + Cuadrícula Cerrar pestañas @@ -812,6 +820,8 @@ Ubicación Notificación + + Almacenamiento persistente Pedir permiso @@ -1324,6 +1334,9 @@ Rastreadores de redirección + + Limpia las cookies creadas por redirecciones a sitios web de seguimiento conocidos. + Ayuda diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index e043cc804a..1d48306a05 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -549,6 +549,14 @@ Ndaipóri tendayke oñemboty ramóva + + Tendayke + + Tendayke jehecha + + Tysýi + + Kora’ieta Emboty tendayke @@ -812,6 +820,8 @@ Tendaite Ñemomarandu + + Ñongatuharenda areguáva Ejerure ñemoneĩ diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index c0392a8fcf..07ef41a251 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -353,6 +353,20 @@ Notifikasi + + + Koleksi Pengaya ubahsuai + + Oke + + Batalkan + + Nama koleksi + + Pemilik koleksi (ID Pengguna) + + Koleksi pengaya dimodifikasi. Keluar dari aplikasi untuk menerapkan pengubahan… + Sinkronkan sekarang @@ -540,6 +554,14 @@ Tidak ada tab yang baru saja ditutup di sini + + Tab + + Tampilan tab + + Daftar + + Grid Tutup tab @@ -657,6 +679,10 @@ is a digit showing the number of items you have selected --> Hapus %1$d item + + Hari Ini + + Kemarin 24 jam terakhir @@ -795,6 +821,8 @@ Lokasi Pemberitahuan + + Penyimpanan Persisten Meminta izin diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index fc9c8ebcb0..c200dbc5d8 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -534,6 +534,14 @@ Осында жуырда жабылған беттер жоқ + + Беттер + + Бет көрінісі + + Тізім + + Тор Беттерді жабу @@ -790,6 +798,8 @@ Орналасу Хабарлама + + Тұрақты қойма Рұқсат ету үшін сұрау diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index 92ab7cfa78..05a4bc6198 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -340,6 +340,20 @@ Communicaziuns + + + Collecziun da supplements persunalisada + + OK + + Interrumper + + Num da la collecziun + + Possessur da la collecziun (ID da l\'utilisader) + + Modifitgà la collecziun da supplements. L\'applicaziun vegn serrada per applitgar las midadas… + Sincronisar ussa @@ -522,6 +536,14 @@ Nagins tabs serrads dacurt + + Tabs + + Vista da tab + + Glista + + Griglia Serrar ils tabs @@ -636,6 +658,10 @@ Stizzar %1$d elements + + Oz + + Ier Ultimas 24 uras @@ -773,6 +799,8 @@ Posiziun Communicaziuns + + Memoria durabla Dumandar il permiss diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 2ee40e3dbc..af2c08f982 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -8,9 +8,9 @@ Имконоти бештар - Фаъол кардан баррасии махфӣ + Фаъол кардани тамошокунии махфӣ - Ғайрифаъол кардан баррасии махфӣ + Ғайрифаъол кардани тамошокунии махфӣ Нишониеро ҷустуҷӯ кунед ё ворид намоед @@ -264,7 +264,7 @@ Иҷозатҳои сомона - Баррасии махфӣ + Тамошокунии махфӣ Кушодани пайвандҳо дар варақаи махфӣ @@ -272,7 +272,7 @@ Агар иҷозат дода шавад, варақаҳои махфӣ низ ҳангоми кушода будани якчанд барнома намоён мешаванд - Илова кардани миёнбури тамошои махфӣ + Илова кардани миёнбури тамошокунии махфӣ Қобилияти дастрасӣ @@ -926,7 +926,7 @@ - Ҷаласаи баррасии махфӣ + Ҷаласаи тамошокунии махфӣ Нест кардани варақаҳои махфӣ @@ -1139,7 +1139,7 @@ Тамошокуниро бо як даст тавассути навори абзорҳои поён кӯшиш кунед ё ин ки наворро ба боло гузоред. - Реҷаи тамошои махфӣ + Реҷаи тамошокунии махфӣ Варақаи махфиро як бор кушоед: Ба нишонии %s зарба занед. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 80551673ce..9bfbeb6e8d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -346,6 +346,16 @@ Bildirimler + + + Özel eklenti koleksiyonu + + Tamam + + Koleksiyon adı + + Eklenti koleksiyonu değiştirildi. Değişiklikleri uygulamak için uygulamadan çıkılıyor… + Şimdi eşitle @@ -529,6 +539,12 @@ Yakın zamanda kapatılmış sekme yok + + Sekmeler + + Sekme görünümü + + Liste Sekmeleri kapat @@ -645,6 +661,10 @@ %1$d öğeyi sil + + Bugün + + Dün Son 24 saat @@ -782,6 +802,8 @@ Konum Bildirim + + Kalıcı depolama İzin iste From dd83130d9f1d138c31e99e8a92526ef64e611174 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Wed, 14 Oct 2020 15:03:51 +0300 Subject: [PATCH 11/97] For #15890 - Ensure app locale switcher works for Windows builds A hardcoded unix file separator prevented us from building a proper list of locales for which we actually have packaged translations. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 68d73308dd..fc074cc440 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -569,8 +569,8 @@ task buildTranslationArray { foundLocales.append("new String[]{") fileTree("src/main/res").visit { FileVisitDetails details -> - if(details.file.path.endsWith("/strings.xml")){ - def languageCode = details.file.parent.tokenize('/').last().replaceAll('values-','').replaceAll('-r','-') + if(details.file.path.endsWith("${File.separator}strings.xml")){ + def languageCode = details.file.parent.tokenize(File.separator).last().replaceAll('values-','').replaceAll('-r','-') languageCode = (languageCode == "values") ? "en-US" : languageCode foundLocales.append("\"").append(languageCode).append("\"").append(",") } From 4597e0d8ffdc162c334c92d10543d9192cb2e9ca Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 14 Oct 2020 15:36:12 +0000 Subject: [PATCH 12/97] Update Android Components version to 63.0.20201013204753. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index c9d5a906b1..eed28b020d 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 = "63.0.20201013143114" + const val VERSION = "63.0.20201013204753" } From cbe293d3e4d9ffc684a6d41abe470d018d8c480d Mon Sep 17 00:00:00 2001 From: ekager Date: Fri, 2 Oct 2020 15:39:03 -0700 Subject: [PATCH 13/97] For #12062 - Launch back to browser if we previoulsy had tabs --- .../java/org/mozilla/fenix/HomeActivity.kt | 29 ++++++++++++-- .../fenix/browser/BaseBrowserFragment.kt | 26 +++++++++++- .../java/org/mozilla/fenix/components/Core.kt | 3 ++ .../customtabs/ExternalAppBrowserActivity.kt | 4 ++ .../java/org/mozilla/fenix/utils/Settings.kt | 5 +++ app/src/main/res/values/preference_keys.xml | 2 + .../org/mozilla/fenix/HomeActivityTest.kt | 40 ++++++++++++++++++- .../ExternalAppBrowserActivityTest.kt | 21 ++++++++++ .../org/mozilla/fenix/utils/SettingsTest.kt | 13 ++++++ 9 files changed, 135 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 1e99001e62..81205292a5 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -39,6 +39,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.session.SessionManager +import mozilla.components.browser.state.selector.getNormalOrPrivateTabs import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.WebExtensionState import mozilla.components.concept.engine.EngineSession @@ -126,7 +127,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { private var isVisuallyComplete = false - private var privateNotificationObserver: PrivateNotificationFeature? = null + private var privateNotificationObserver: PrivateNotificationFeature? = + null private var isToolbarInflated = false @@ -192,14 +194,18 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { it.start() } - if (isActivityColdStarted(intent, savedInstanceState)) { - externalSourceIntentProcessors.any { + if (isActivityColdStarted( + intent, + savedInstanceState + ) && !externalSourceIntentProcessors.any { it.process( intent, navHost.navController, this.intent ) } + ) { + navigateToBrowserOnColdStart() } Performance.processIntentIfPerformanceTest(intent, this) @@ -240,7 +246,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { StartupTimeline.onActivityCreateEndHome(this) // DO NOT MOVE ANYTHING BELOW HERE. } - protected open fun startupTelemetryOnCreateCalled(safeIntent: SafeIntent, hasSavedInstanceState: Boolean) { + protected open fun startupTelemetryOnCreateCalled( + safeIntent: SafeIntent, + hasSavedInstanceState: Boolean + ) { components.appStartupTelemetry.onHomeActivityOnCreate( safeIntent, hasSavedInstanceState, @@ -322,6 +331,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } final override fun onPause() { + // We should return to the browser if there were normal tabs when we left the app + settings().shouldReturnToBrowser = + components.core.store.state.getNormalOrPrivateTabs(private = false).isNotEmpty() + if (settings().lastKnownMode.isPrivate) { window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) } @@ -763,6 +776,14 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } } + open fun navigateToBrowserOnColdStart() { + // Normal tabs + cold start -> Should go back to browser if we had any tabs open when we left last + // except for PBM + Cold Start there won't be any tabs since they're evicted so we never will navigate + if (settings().shouldReturnToBrowser && !browsingModeManager.mode.isPrivate) { + openToBrowser(BrowserDirection.FromGlobal, null) + } + } + override fun attachBaseContext(base: Context) { base.components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { super.attachBaseContext(base) 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 9c6e9aa5d1..17997e65ae 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -32,6 +32,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -41,6 +42,7 @@ import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab +import mozilla.components.browser.state.selector.getNormalOrPrivateTabs import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.store.BrowserStore @@ -189,6 +191,28 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session val view = inflater.inflate(R.layout.fragment_browser, container, false) val activity = activity as HomeActivity + components = requireComponents + + if (customTabSessionId == null) { + // Once tab restoration is complete, if there are no tabs to show in the browser, go home + components.core.store.flowScoped(viewLifecycleOwner) { flow -> + flow.map { state -> state.restoreComplete } + .ifChanged() + .collect { restored -> + if (restored) { + val tabs = + components.core.store.state.getNormalOrPrivateTabs( + activity.browsingModeManager.mode.isPrivate + ) + if (tabs.isEmpty()) findNavController().popBackStack( + R.id.homeFragment, + false + ) + } + } + } + } + activity.themeManager.applyStatusBarTheme(activity) browserFragmentStore = StoreProvider.get(this) { @@ -197,8 +221,6 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session ) } - components = requireComponents - return view } 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 3ce27cd479..8a8d3a57f6 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -21,6 +21,7 @@ import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.engine.EngineMiddleware import mozilla.components.browser.session.storage.SessionStorage import mozilla.components.browser.session.undo.UndoMiddleware +import mozilla.components.browser.state.action.RestoreCompleteAction import mozilla.components.browser.state.action.RecentlyClosedAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.store.BrowserStore @@ -231,6 +232,8 @@ class Core( } } } + + store.dispatch(RestoreCompleteAction) } WebNotificationFeature( diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt index bd27a18987..3149204803 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivity.kt @@ -46,6 +46,10 @@ open class ExternalAppBrowserActivity : HomeActivity() { ) } + override fun navigateToBrowserOnColdStart() { + // No-op for external app + } + override fun getNavDirections( from: BrowserDirection, customTabSessionId: String? 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 f9dcc8faa7..33b1b2b42c 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -182,6 +182,11 @@ class Settings(private val appContext: Context) : PreferencesHolder { true ) + var shouldReturnToBrowser by booleanPreference( + appContext.getString(R.string.pref_key_return_to_browser), + false + ) + // If any of the prefs have been modified, quit displaying the fenix moved tip fun shouldDisplayFenixMovingTip(): Boolean = preferences.getBoolean( diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 4c5266a407..63ec9a704a 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -235,4 +235,6 @@ pref_key_show_grid_view_tabs_settings pref_key_camera_permissions_needed + + pref_key_return_to_browser diff --git a/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt b/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt index 6f5c9634cb..9d83d53603 100644 --- a/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt +++ b/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt @@ -7,7 +7,9 @@ package org.mozilla.fenix import android.content.Intent import android.os.Bundle import io.mockk.every +import io.mockk.mockk import io.mockk.spyk +import io.mockk.verify import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.utils.toSafeIntent import org.junit.Assert.assertEquals @@ -20,9 +22,12 @@ import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity.Companion.PRIVATE_BROWSING_MODE import org.mozilla.fenix.browser.browsingmode.BrowsingMode +import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class HomeActivityTest { @@ -32,8 +37,6 @@ class HomeActivityTest { @Before fun setup() { activity = spyk(HomeActivity()) - - every { activity.applicationContext } returns testContext } @Test @@ -52,6 +55,7 @@ class HomeActivityTest { @Test fun `getModeFromIntentOrLastKnown returns mode from settings when intent does not set`() { + every { activity.applicationContext } returns testContext testContext.settings().lastKnownMode = BrowsingMode.Private assertEquals(testContext.settings().lastKnownMode, activity.getModeFromIntentOrLastKnown(null)) @@ -87,6 +91,38 @@ class HomeActivityTest { assertFalse(activity.isActivityColdStarted(startingIntent, null)) } + @Test + fun `navigateToBrowserOnColdStart in normal mode navigates to browser`() { + val browsingModeManager: BrowsingModeManager = mockk() + every { browsingModeManager.mode } returns BrowsingMode.Normal + + val settings: Settings = mockk() + every { settings.shouldReturnToBrowser } returns true + every { activity.components.settings.shouldReturnToBrowser } returns true + every { activity.openToBrowser(any(), any()) } returns Unit + + activity.browsingModeManager = browsingModeManager + activity.navigateToBrowserOnColdStart() + + verify(exactly = 1) { activity.openToBrowser(BrowserDirection.FromGlobal, null) } + } + + @Test + fun `navigateToBrowserOnColdStart in private mode does not navigate to browser`() { + val browsingModeManager: BrowsingModeManager = mockk() + every { browsingModeManager.mode } returns BrowsingMode.Private + + val settings: Settings = mockk() + every { settings.shouldReturnToBrowser } returns true + every { activity.components.settings.shouldReturnToBrowser } returns true + every { activity.openToBrowser(any(), any()) } returns Unit + + activity.browsingModeManager = browsingModeManager + activity.navigateToBrowserOnColdStart() + + verify(exactly = 0) { activity.openToBrowser(BrowserDirection.FromGlobal, null) } + } + @Test fun `isActivityColdStarted returns false for null savedInstanceState and not launched from history`() { val startingIntent = Intent().apply { diff --git a/app/src/test/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivityTest.kt b/app/src/test/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivityTest.kt index a0b117af87..b4f3c02a99 100644 --- a/app/src/test/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivityTest.kt +++ b/app/src/test/java/org/mozilla/fenix/customtabs/ExternalAppBrowserActivityTest.kt @@ -17,7 +17,11 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Test import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.browser.browsingmode.BrowsingMode +import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.utils.Settings class ExternalAppBrowserActivityTest { @@ -37,6 +41,23 @@ class ExternalAppBrowserActivityTest { assertEquals(Event.OpenedApp.Source.CUSTOM_TAB, activity.getIntentSource(otherIntent)) } + @Test + fun `navigateToBrowserOnColdStart does nothing for external app browser activity`() { + val activity = spyk(ExternalAppBrowserActivity()) + val browsingModeManager: BrowsingModeManager = mockk() + every { browsingModeManager.mode } returns BrowsingMode.Normal + + val settings: Settings = mockk() + every { settings.shouldReturnToBrowser } returns true + every { activity.components.settings.shouldReturnToBrowser } returns true + every { activity.openToBrowser(any(), any()) } returns Unit + + activity.browsingModeManager = browsingModeManager + activity.navigateToBrowserOnColdStart() + + verify(exactly = 0) { activity.openToBrowser(BrowserDirection.FromGlobal, null) } + } + @Test fun `getNavDirections finishes activity if session ID is null`() { val activity = spyk(object : ExternalAppBrowserActivity() { diff --git a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt index 0856ac71ac..d6b3ef2c64 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt @@ -53,6 +53,19 @@ class SettingsTest { assertTrue(settings.openLinksInAPrivateTab) } + @Test + fun shouldReturnToBrowser() { + // When just created + // Then + assertFalse(settings.shouldReturnToBrowser) + + // When + settings.shouldReturnToBrowser = true + + // Then + assertTrue(settings.shouldReturnToBrowser) + } + @Test fun clearDataOnQuit() { // When just created From e56043c4850260a30a5852b36304314f96cb5401 Mon Sep 17 00:00:00 2001 From: ekager Date: Mon, 12 Oct 2020 16:54:12 -0700 Subject: [PATCH 14/97] For #15265 - Save cached top sites for metrics ping --- .../java/org/mozilla/fenix/HomeActivity.kt | 4 ++++ .../mozilla/fenix/browser/UriOpenedObserver.kt | 2 +- .../java/org/mozilla/fenix/utils/Settings.kt | 18 +++++------------- .../fenix/browser/UriOpenedObserverTest.kt | 2 +- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 81205292a5..43a0bfb349 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -339,6 +339,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { window.addFlags(WindowManager.LayoutParams.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 + super.onPause() // Diagnostic breadcrumb for "Display already aquired" crash: diff --git a/app/src/main/java/org/mozilla/fenix/browser/UriOpenedObserver.kt b/app/src/main/java/org/mozilla/fenix/browser/UriOpenedObserver.kt index 3c42b1f1ef..0907188fee 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/UriOpenedObserver.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/UriOpenedObserver.kt @@ -46,7 +46,7 @@ class UriOpenedObserver( } private fun saveOpenTabsCount() { - settings.setOpenTabsCount(sessionManager.sessionsOfType(private = false).count()) + settings.openTabsCount = sessionManager.sessionsOfType(private = false).count() } override fun onAllSessionsRemoved() { 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 33b1b2b42c..6a32e55ef5 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -919,7 +919,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { return overrideAmoUser.isNotEmpty() || overrideAmoCollection.isNotEmpty() } - val topSitesSize by intPreference( + var topSitesSize by intPreference( appContext.getPreferenceKey(R.string.pref_key_top_sites_size), default = 0 ) @@ -929,18 +929,10 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = topSitesMaxCount ) - fun setOpenTabsCount(count: Int) { - preferences.edit().putInt( - appContext.getPreferenceKey(R.string.pref_key_open_tabs_count), - count - ).apply() - } - - val openTabsCount: Int - get() = preferences.getInt( - appContext.getPreferenceKey(R.string.pref_key_open_tabs_count), - 0 - ) + var openTabsCount by intPreference( + appContext.getPreferenceKey(R.string.pref_key_open_tabs_count), + 0 + ) private var savedLoginsSortingStrategyString by stringPreference( appContext.getPreferenceKey(R.string.pref_key_saved_logins_sorting_strategy), diff --git a/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt b/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt index b57b29ac88..82748f936f 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt @@ -59,7 +59,7 @@ class UriOpenedObserverTest { observer.onSessionRemoved(session) verify { session.unregister(observer.singleSessionObserver) } - verify { settings.setOpenTabsCount(1) } + verify { settings.openTabsCount = 1 } } @Test From 8893468102797359676b5e90b2506c082801dbc9 Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Mon, 5 Oct 2020 13:58:45 -0700 Subject: [PATCH 15/97] For #15280: add ConstraintLayoutPerfDetector custom lint rule. --- .../lintrules/ConstraintLayoutPerfDetector.kt | 227 ++++++++++++++++++ .../fenix/lintrules/LintIssueRegistry.kt | 2 +- 2 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ConstraintLayoutPerfDetector.kt diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ConstraintLayoutPerfDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ConstraintLayoutPerfDetector.kt new file mode 100644 index 0000000000..7ae61bce57 --- /dev/null +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ConstraintLayoutPerfDetector.kt @@ -0,0 +1,227 @@ +/* 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.lintrules + +import com.android.resources.ResourceFolderType +import com.android.tools.lint.detector.api.Category +import com.android.tools.lint.detector.api.Context +import com.android.tools.lint.detector.api.Implementation +import com.android.tools.lint.detector.api.Issue +import com.android.tools.lint.detector.api.ResourceXmlDetector +import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Severity +import com.android.tools.lint.detector.api.XmlContext +import org.w3c.dom.Element + +private val FRAMEWORK_ELEMENTS = setOf( + "androidx.constraintlayout.widget.ConstraintLayout", + + // Android framework views that extend ConstraintLayout + "androidx.constraintlayout.motion.widget.MotionLayout" +) +private val FRAMEWORK_ELEMENTS_BULLETED_LIST = FRAMEWORK_ELEMENTS.map { "- `$it`" }.joinToString("\n") + +private const val FENIX_PREFIX = "org.mozilla.fenix" +private const val AC_PREFIX = "mozilla.components" + +/** + * Custom views that we wrote that extend ConstraintLayout. + * + * This data was manually added from the Type Hierarchy IDE action. Last update: 8/5/2020. + * In the future, we could generate this list statically to prevent transcription errors and + * errors from refactors. + */ +private val CUSTOM_VIEW_ELEMENTS = setOf( + "$FENIX_PREFIX.library.LibrarySiteItemView", + "$FENIX_PREFIX.settings.deletebrowsingdata.DeleteBrowsingDataItem", + "$FENIX_PREFIX.trackingprotection.SwitchWithDescription", + "$FENIX_PREFIX.trackingprotection.TrackingProtectionCategoryItem", + + "$AC_PREFIX.feature.readerview.view.ReaderViewControlsBar", + "$AC_PREFIX.feature.findinpage.view.FindInPageBar", + "$AC_PREFIX.feature.prompts.login.LoginSelectBar", + "$AC_PREFIX.ui.widgets.WidgetSiteItemView", + "$AC_PREFIX.browser.toolbar.display.DisplayToolbarView" +) +private val CUSTOM_VIEW_ELEMENTS_BULLETED_LIST = CUSTOM_VIEW_ELEMENTS.map { "- `$it`" }.joinToString("\n") + +private val ALL_APPLICABLE_ELEMENTS = FRAMEWORK_ELEMENTS + CUSTOM_VIEW_ELEMENTS + +private const val FRAMEWORK_ISSUE_DESCRIPTION = "2+ ConstraintLayouts in one hierarchy can be inefficient" +private const val FRAMEWORK_ISSUE_MESSAGE = "Flatten the view hierarchy by using one `ConstraintLayout`, " + + "if possible. If the alternative is several nested `ViewGroup`, it may not help performance and " + + "this may be worth suppressing." +private val FRAMEWORK_ISSUE_EXPLANATION = """`ConstraintLayout`'s main performance benefit is + that it enables devs to define layouts with very little view nesting. However, they are slow to + inflate so we only want to use as many as are strictly necessary. In most cases, this is one: a + layout can have a ConstraintLayout defined at the root and the entire hierarchy can be a direct + descendant of it. + + This check will report if there is more than one ConstraintLayout, or a view that extends it, + defined in a single layout file to remind the implementor of these performance concerns. + + **WARNING: replacing a ConstraintLayout with several nested ViewGroups is unlikely to improve + performance. Remember, a goal is to reduce nesting. If you're unable to remove the extra + ConstraintLayout(s) without doing this, it's probably better to suppress this violation.** + + Here are **known cases where ConstraintLayouts are unnecessarily nested and the alternatives:** + - To set a background color. Instead, use a `` of the appropriate size directly in the ConstraintLayout + - To change visibility on a group of sub-views. Instead, use `androidx.constraintlayout.widget.Group` + + There are a few cases the perf team is not 100% sure of the best solution - let us know if you + have better solutions: + - ScrollView can only have one child so perhaps making it a ConstraintLayout is fine, despite nesting + - a11y may rely on nesting views. Maybe `Group` solves this problem? + + The following views that are, or that extend, ConstraintLayout are inspected in this check: +""".trimIndent() + .lines() + .joinToStringRemovingManualWrapping() + + "\n$FRAMEWORK_ELEMENTS_BULLETED_LIST\n\n" + +private val CUSTOM_VIEW_ISSUE_DESCRIPTION = "Caution regarding custom views extending `ConstraintLayout`" +private val CUSTOM_VIEW_ISSUE_MESSAGE = "Custom views extending `ConstraintLayout` are less " + + "efficient because they cannot share other `ConstraintLayout` defined in file." +private val CUSTOM_VIEW_ISSUE_EXPLANATION = """`ConstraintLayout` is slow to inflate so we + should aim to have as few as possible. However, the performance team doesn't have a good generic + solution for when custom views extend ConstraintLayout because the encapsulation may be worth + it and the replacement may not be more performant. Therefore, we warn the implementor that this + may be undesireable but don't fail the build on it. + + More generic information about the performance concerns of ConstraintLayout is found below, + copied from our more strict ConstraintLayout check. + + The following additional views are inspected for this less strict check: +""".trimIndent() + .lines() + .joinToStringRemovingManualWrapping() + + "\n$CUSTOM_VIEW_ELEMENTS_BULLETED_LIST\n\n" + + "---\n\n" + // divider + FRAMEWORK_ISSUE_EXPLANATION + +/** + * An issue where multiple ConstraintLayouts that are defined by the framework are detected in the + * same file. This is distinct from [CUSTOM_VIEW_ISSUE] because that one handles custom views. + * We don't want to combine them because solving a custom view ConstraintLayout problem rarely has + * a clear cut solution and we don't want to fail the build on checks that aren't clear cut. + */ +private val FRAMEWORK_ISSUE = Issue.create( + id = "MozMultipleConstraintLayouts", + briefDescription = FRAMEWORK_ISSUE_DESCRIPTION, + explanation = FRAMEWORK_ISSUE_EXPLANATION, + category = Category.PERFORMANCE, + priority = 8, // UseCompoundDrawables is a 6 and I think this is much more impactful. + severity = Severity.ERROR, + implementation = Implementation( + ConstraintLayoutPerfDetector::class.java, + Scope.RESOURCE_FILE_SCOPE + ) +) + +/** + * An issue where multiple ConstraintLayouts, that may also be defined by us as custom views, are + * detected in the same file. See [FRAMEWORK_ISSUE] for why these are distinct. + */ +private val CUSTOM_VIEW_ISSUE = Issue.create( + id = "MozMultipleConstraintLayoutsAndCustomViews", + briefDescription = CUSTOM_VIEW_ISSUE_DESCRIPTION, + explanation = CUSTOM_VIEW_ISSUE_EXPLANATION, + category = Category.PERFORMANCE, + priority = 6, // UseCompoundDrawables is a 6 and this seems more impactful but less actionable. + severity = Severity.WARNING, + implementation = Implementation( + ConstraintLayoutPerfDetector::class.java, + Scope.RESOURCE_FILE_SCOPE + ) +) + +/** + * A custom lint detector that helps us ensure we're using ConstraintLayout performantly. + * + * This detector has a few shortcomings: + * - it will not notice if a ConstraintLayout is in the same view hierarchy at runtime but added + * from a different file (e.g. via ) + * - it will not notice if a ConstraintLayout is added at runtime + * - if we add additional views that extend ConstraintLayout, this check won't know about them + * (though we could generate this information and include it in this check via static analysis) + */ +class ConstraintLayoutPerfDetector : ResourceXmlDetector() { + + companion object { + val ISSUES = listOf( + FRAMEWORK_ISSUE, + CUSTOM_VIEW_ISSUE + ) + } + + private var frameworkConstraintLayoutCountInFile = 0 + private var customViewConstraintLayoutCountInFile = 0 + + override fun appliesTo(folderType: ResourceFolderType): Boolean = folderType == ResourceFolderType.LAYOUT + override fun getApplicableElements(): Collection? = ALL_APPLICABLE_ELEMENTS + + override fun beforeCheckFile(context: Context) { + frameworkConstraintLayoutCountInFile = 0 + customViewConstraintLayoutCountInFile = 0 + } + + override fun visitElement(context: XmlContext, element: Element) { + super.visitElement(context, element) + + // This scope is unideal: if the root element is a ConstraintLayout and is suppressed, all + // ConstraintLayout children will also be suppressed. If more ConstraintLayout children are + // added, the root ConstraintLayout will suppress them too. Ideally, we'd want a suppression + // to only affect a node and not its children. + val scope = element + val location = context.getElementLocation(element) + + // For these inner visit methods, we only warn on 2+ violations because: + // - we avoid having 2 warnings for the first intuitive violation (i.e. 2 ConstraintLayouts + // in a file is one violation on the second ConstraintLayout) + // - of the suppression & scope issues mentioned above. The first found element is most + // likely to be a parent of other ConstraintLayouts because of the traversal order so if + // there's one node we don't report on, that's the best one. + // + // The fact that we use two different issues can create a weird situation where if a custom + // view is a sibling above a ConstraintLayout, it won't report but if it's below the + // ConstraintLayout, it will report. I don't think it's worth the complexity to address this + // and in-IDE inspection seems to break when we use afterCheckFile, which would be useful for this. + fun visitFrameworkElement() { + frameworkConstraintLayoutCountInFile += 1 + if (frameworkConstraintLayoutCountInFile > 1) { + context.report(FRAMEWORK_ISSUE, scope, location, FRAMEWORK_ISSUE_MESSAGE) + } + } + + fun visitCustomViewElement() { + customViewConstraintLayoutCountInFile += 1 + + // We want to report if there are too many ConstraintLayouts in the file. This issue + // intentionally includes both framework CL and our custom view CL so we add both counts. + if (frameworkConstraintLayoutCountInFile + customViewConstraintLayoutCountInFile > 1) { + context.report(CUSTOM_VIEW_ISSUE, scope, location, CUSTOM_VIEW_ISSUE_MESSAGE) + } + } + + when (element.tagName) { + in FRAMEWORK_ELEMENTS -> visitFrameworkElement() + in CUSTOM_VIEW_ELEMENTS -> visitCustomViewElement() + else -> throw IllegalStateException("Unexpected tag seen: ${element.tagName}") + } + } +} + +/** + * Takes paragraphs wrapped by hand and combines them into a single line, preserving white space + * between paragraphs. + */ +private fun List.joinToStringRemovingManualWrapping(): String = fold("") { acc, str -> + val toAppend = when { + str.isBlank() -> "\n\n" // new paragraph + str.trim().startsWith("-") -> "\n$str" // bulleted list + else -> str + } + acc + toAppend +} diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt index 920c0aeda5..7f3945eb92 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt @@ -18,5 +18,5 @@ class LintIssueRegistry : IssueRegistry() { AndroidSrcXmlDetector.ISSUE_XML_SRC_USAGE, TextViewAndroidSrcXmlDetector.ISSUE_XML_SRC_USAGE, ImageViewAndroidTintXmlDetector.ISSUE_XML_SRC_USAGE - ) + ) + ConstraintLayoutPerfDetector.ISSUES } From c071889520f0e8115e8d9a613cfd8c47ac86e28a Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Mon, 5 Oct 2020 14:59:26 -0700 Subject: [PATCH 16/97] For #15280: add new lint rule to CODE OWNERS. --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 87d873964e..d5c297efb5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -49,6 +49,7 @@ # Possible startup regressions *Application.kt @mozilla-mobile/Performance *StrictMode*kt @mozilla-mobile/Performance +*ConstraintLayoutPerfDetector.kt @mozilla-mobile/Performance # We want to be aware of new features behind flags as well as features # about to be enabled. From c6b83b10e0a93aca7e6ef632e88d33b5e580d4d2 Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Mon, 5 Oct 2020 15:01:33 -0700 Subject: [PATCH 17/97] For #15280: suppress new lint rule in migration code. --- app/src/main/res/layout/activity_migration.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_migration.xml b/app/src/main/res/layout/activity_migration.xml index c7b48d1c2e..884af730c6 100644 --- a/app/src/main/res/layout/activity_migration.xml +++ b/app/src/main/res/layout/activity_migration.xml @@ -20,9 +20,11 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> + + android:layout_height="match_parent" + tools:ignore="MozMultipleConstraintLayouts"> Date: Mon, 5 Oct 2020 15:14:02 -0700 Subject: [PATCH 18/97] For #15280: add current ConstraintLayout warnings to lint baseline. --- app/build.gradle | 1 + app/lint-baseline.xml | 136 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 app/lint-baseline.xml diff --git a/app/build.gradle b/app/build.gradle index fc074cc440..6e1b9d755c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -163,6 +163,7 @@ android { lintOptions { lintConfig file("lint.xml") + baseline file("lint-baseline.xml") } packagingOptions { diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml new file mode 100644 index 0000000000..3c9067367b --- /dev/null +++ b/app/lint-baseline.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ea2bb0df75c407e98618838cf39f90ee8bc421d9 Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Wed, 14 Oct 2020 13:18:49 -0700 Subject: [PATCH 19/97] For #15280 - review: add license to lint-baseline.xml. --- app/lint-baseline.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index 3c9067367b..a5aab8c1d5 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -1,4 +1,7 @@ + Date: Thu, 15 Oct 2020 00:03:51 +0000 Subject: [PATCH 20/97] Import l10n. --- app/src/main/res/values-cak/strings.xml | 8 +++++++ app/src/main/res/values-ka/strings.xml | 28 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/app/src/main/res/values-cak/strings.xml b/app/src/main/res/values-cak/strings.xml index d8ba745d25..49ef2e9cee 100644 --- a/app/src/main/res/values-cak/strings.xml +++ b/app/src/main/res/values-cak/strings.xml @@ -356,6 +356,9 @@ Taq rutzijol + + + Kimolik ichinan taq Tz\'aqat ÜTZ @@ -364,6 +367,11 @@ Rub\'i\' mol + + Rajaw Mol (Winäq ID) + + Xjal kimolaj tz\'aqat. Nitz\'apïx chokoy richin yesamajïx ri taq jaloj… + Tixim wakami diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 05503280ac..2ea53e716b 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -343,6 +343,20 @@ შეტყობინებები + + + შერჩეული დამატებების კრებული + + კარგი + + გაუქმება + + კრებულის დასახელება + + კრებულის მფლობელი (მომხმარებლის ID) + + დამატებების კრებული შეიცვალა. დატოვეთ პროგრამა ცვლილებების ასასახად… + დასინქრონება ახლავე @@ -527,6 +541,14 @@ ბოლოს დახურული ჩანართები არაა + + ჩანართები + + ჩანართის ხედი + + სია + + ბადე ჩანართების დახურვა @@ -643,6 +665,10 @@ %1$d ჩანაწერის წაშლა + + დღეს + + გუშინ ბოლო 24 საათი @@ -782,6 +808,8 @@ მდებარეობა შეტყობინება + + მუდმივი მეხსიერება კითხვა ყოველ ჯერზე From 430282c8ec297a2a7c0dd59bdb7c15d0ffd474a7 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 14 Oct 2020 16:13:32 +0200 Subject: [PATCH 21/97] Use new SearchEngineProvider interface. --- .../java/org/mozilla/fenix/components/UseCases.kt | 3 ++- .../fenix/search/awesomebar/AwesomeBarView.kt | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) 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 9c05a060ea..3d5d03a32c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/UseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/components/UseCases.kt @@ -15,6 +15,7 @@ import mozilla.components.feature.downloads.DownloadsUseCases import mozilla.components.feature.pwa.WebAppShortcutManager import mozilla.components.feature.pwa.WebAppUseCases import mozilla.components.feature.search.SearchUseCases +import mozilla.components.browser.search.ext.toDefaultSearchEngineProvider import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SettingsUseCases import mozilla.components.feature.session.TrackingProtectionUseCases @@ -51,7 +52,7 @@ class UseCases( /** * Use cases that provide search engine integration. */ - val searchUseCases by lazy { SearchUseCases(context, store, searchEngineManager, sessionManager) } + val searchUseCases by lazy { SearchUseCases(context, store, searchEngineManager.toDefaultSearchEngineProvider(context), sessionManager) } /** * Use cases that provide settings management. 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 46232e1914..6e42d883e8 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 @@ -9,6 +9,7 @@ import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFil import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.core.graphics.drawable.toBitmap import mozilla.components.browser.awesomebar.BrowserAwesomeBar +import mozilla.components.browser.search.DefaultSearchEngineProvider import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.session.Session import mozilla.components.concept.awesomebar.AwesomeBar @@ -19,6 +20,7 @@ import mozilla.components.feature.awesomebar.provider.SearchActionProvider import mozilla.components.feature.awesomebar.provider.SearchSuggestionProvider import mozilla.components.feature.awesomebar.provider.SessionSuggestionProvider import mozilla.components.feature.search.SearchUseCases +import mozilla.components.browser.search.ext.toDefaultSearchEngineProvider import mozilla.components.feature.syncedtabs.DeviceIndicators import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.syncedtabs.SyncedTabsStorageSuggestionProvider @@ -146,7 +148,7 @@ class AwesomeBarView( defaultSearchSuggestionProvider = SearchSuggestionProvider( context = activity, - searchEngineManager = components.search.searchEngineManager, + defaultSearchEngineProvider = components.search.searchEngineManager.toDefaultSearchEngineProvider(activity), searchUseCase = searchUseCase, fetchClient = components.core.client, mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, @@ -159,9 +161,7 @@ class AwesomeBarView( defaultSearchActionProvider = SearchActionProvider( - searchEngineGetter = suspend { - components.search.searchEngineManager.getDefaultSearchEngineAsync(activity) - }, + defaultSearchEngineProvider = components.search.searchEngineManager.toDefaultSearchEngineProvider(activity), searchUseCase = searchUseCase, icon = searchBitmap, showDescription = false @@ -313,7 +313,10 @@ class AwesomeBarView( listOf( SearchActionProvider( - searchEngineGetter = suspend { searchEngine }, + defaultSearchEngineProvider = object : DefaultSearchEngineProvider { + override fun getDefaultSearchEngine(): SearchEngine? = searchEngine + override suspend fun retrieveDefaultSearchEngine(): SearchEngine? = searchEngine + }, searchUseCase = shortcutSearchUseCase, icon = searchBitmap ), From 1364095c23e04335f285ee10d4bc0b589fb420b4 Mon Sep 17 00:00:00 2001 From: ekager Date: Wed, 14 Oct 2020 17:23:22 -0700 Subject: [PATCH 22/97] bump AC version to 63.0.20201014190200 --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index eed28b020d..fe82f5a67c 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 = "63.0.20201013204753" + const val VERSION = "63.0.20201014190200" } From b6587455f81238bc38dc96e8195631835bf42926 Mon Sep 17 00:00:00 2001 From: ekager Date: Wed, 14 Oct 2020 17:26:12 -0700 Subject: [PATCH 23/97] fix detekt errors --- .../java/org/mozilla/fenix/components/UseCases.kt | 9 ++++++++- .../mozilla/fenix/search/awesomebar/AwesomeBarView.kt | 11 ++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) 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 3d5d03a32c..9db4197c95 100644 --- a/app/src/main/java/org/mozilla/fenix/components/UseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/components/UseCases.kt @@ -52,7 +52,14 @@ class UseCases( /** * Use cases that provide search engine integration. */ - val searchUseCases by lazy { SearchUseCases(context, store, searchEngineManager.toDefaultSearchEngineProvider(context), sessionManager) } + val searchUseCases by lazy { + SearchUseCases( + context, + store, + searchEngineManager.toDefaultSearchEngineProvider(context), + sessionManager + ) + } /** * Use cases that provide settings management. 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 6e42d883e8..69ea1b7a10 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 @@ -148,7 +148,9 @@ class AwesomeBarView( defaultSearchSuggestionProvider = SearchSuggestionProvider( context = activity, - defaultSearchEngineProvider = components.search.searchEngineManager.toDefaultSearchEngineProvider(activity), + defaultSearchEngineProvider = components.search.searchEngineManager.toDefaultSearchEngineProvider( + activity + ), searchUseCase = searchUseCase, fetchClient = components.core.client, mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, @@ -161,7 +163,9 @@ class AwesomeBarView( defaultSearchActionProvider = SearchActionProvider( - defaultSearchEngineProvider = components.search.searchEngineManager.toDefaultSearchEngineProvider(activity), + defaultSearchEngineProvider = components.search.searchEngineManager.toDefaultSearchEngineProvider( + activity + ), searchUseCase = searchUseCase, icon = searchBitmap, showDescription = false @@ -315,7 +319,8 @@ class AwesomeBarView( SearchActionProvider( defaultSearchEngineProvider = object : DefaultSearchEngineProvider { override fun getDefaultSearchEngine(): SearchEngine? = searchEngine - override suspend fun retrieveDefaultSearchEngine(): SearchEngine? = searchEngine + override suspend fun retrieveDefaultSearchEngine(): SearchEngine? = + searchEngine }, searchUseCase = shortcutSearchUseCase, icon = searchBitmap From 508ec8b8ffa6013bfa83d89bfba5ca449e23a1a2 Mon Sep 17 00:00:00 2001 From: ekager Date: Tue, 6 Oct 2020 10:24:14 -0700 Subject: [PATCH 24/97] For #15347 - Adds telemetry for tabs settings --- app/metrics.yaml | 51 ++++++++++++++++++- .../mozilla/fenix/components/metrics/Event.kt | 2 + .../components/metrics/GleanMetricsService.kt | 11 +++- .../fenix/settings/TabsSettingsFragment.kt | 8 +++ .../java/org/mozilla/fenix/utils/Settings.kt | 25 +++++++++ docs/metrics.md | 3 ++ 6 files changed, 98 insertions(+), 2 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index bfe448679e..fd6de67c9a 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -279,7 +279,7 @@ events: whats_new_tapped: type: event description: | - A user opened the "what's new" page button + A user opened the "what's new" page button bugs: - https://github.com/mozilla-mobile/fenix/issues/5021 data_reviews: @@ -947,6 +947,40 @@ metrics: notification_emails: - fenix-core@mozilla.com expires: "2021-08-01" + close_tab_setting: + type: string + lifetime: application + description: | + A string that indicates the setting for tab closing: + MANUAL, ONE_DAY, ONE_WEEK, ONE_MONTH + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/fenix/issues/15347#issue-707408975 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + tab_view_setting: + type: string + lifetime: application + description: | + A string that indicates the setting for tab view: + GRID, LIST + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/fenix/issues/15347#issue-707408975 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" search_widget_installed: type: boolean lifetime: application @@ -4207,3 +4241,18 @@ master_password: notification_emails: - fenix-core@mozilla.com expires: "2021-03-01" + +tabs: + setting_opened: + type: event + description: | + The tab settings were opened. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/15347#issue-707408975 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" 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 aec8008f1f..bd79b6f9f1 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 @@ -194,6 +194,8 @@ sealed class Event { object MasterPasswordMigrationSuccess : Event() object MasterPasswordMigrationDisplayed : Event() + object TabSettingsOpened : Event() + // Interaction events with extras data class TopSiteSwipeCarousel(val page: Int) : 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 25a289a55f..aa82939e5e 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 @@ -48,6 +48,7 @@ import org.mozilla.fenix.GleanMetrics.SearchWidgetCfr import org.mozilla.fenix.GleanMetrics.SyncAccount import org.mozilla.fenix.GleanMetrics.SyncAuth import org.mozilla.fenix.GleanMetrics.Tab +import org.mozilla.fenix.GleanMetrics.Tabs import org.mozilla.fenix.GleanMetrics.TabsTray import org.mozilla.fenix.GleanMetrics.Tip import org.mozilla.fenix.GleanMetrics.ToolbarSettings @@ -705,6 +706,9 @@ private val Event.wrapper: EventWrapper<*>? Event.MasterPasswordMigrationSuccess -> EventWrapper( { MasterPassword.migration.record(it) } ) + Event.TabSettingsOpened -> EventWrapper( + { Tabs.settingOpened.record(it) } + ) // Don't record other events in Glean: is Event.AddBookmark -> null @@ -786,6 +790,9 @@ class GleanMetricsService(private val context: Context) : MetricsService { ToolbarPosition.TOP -> Event.ToolbarPositionChanged.Position.TOP.name } ) + + tabViewSetting.set(context.settings().getTabViewPingString()) + closeTabSetting.set(context.settings().getTabTimeoutPingString()) } SearchDefaultEngine.apply { @@ -859,7 +866,9 @@ class GleanMetricsService(private val context: Context) : MetricsService { val accessibilitySelection = mutableListOf() - if (context.settings().switchServiceIsEnabled) { accessibilitySelection.add("switch") } + if (context.settings().switchServiceIsEnabled) { + accessibilitySelection.add("switch") + } if (context.settings().touchExplorationIsEnabled) { accessibilitySelection.add("touch exploration") diff --git a/app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt index b6aa9cf32e..b5b9964991 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TabsSettingsFragment.kt @@ -5,9 +5,12 @@ package org.mozilla.fenix.settings import android.os.Bundle +import android.view.View import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import org.mozilla.fenix.R +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.utils.view.addToRadioGroup @@ -27,6 +30,11 @@ class TabsSettingsFragment : PreferenceFragmentCompat() { setPreferencesFromResource(R.xml.tabs_preferences, rootKey) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.context.components.analytics.metrics.track(Event.TabSettingsOpened) + } + override fun onResume() { super.onResume() showToolbar(getString(R.string.preferences_tabs)) 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 6a32e55ef5..6c411abed9 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -390,6 +390,31 @@ class Settings(private val appContext: Context) : PreferencesHolder { else -> System.currentTimeMillis() } + enum class TabView { + GRID, LIST + } + + fun getTabViewPingString() = if (gridTabView) TabView.GRID.name else TabView.LIST.name + + enum class TabTimout { + ONE_DAY, ONE_WEEK, ONE_MONTH, MANUAL + } + + fun getTabTimeoutPingString(): String = when { + closeTabsAfterOneDay -> { + TabTimout.ONE_DAY.name + } + closeTabsAfterOneWeek -> { + TabTimout.ONE_WEEK.name + } + closeTabsAfterOneMonth -> { + TabTimout.ONE_MONTH.name + } + else -> { + TabTimout.MANUAL.name + } + } + fun getTabTimeoutString(): String = when { closeTabsAfterOneDay -> { appContext.getString(R.string.close_tabs_after_one_day) diff --git a/docs/metrics.md b/docs/metrics.md index 0614a699c9..f75c30e25b 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -197,6 +197,7 @@ The following metrics are added to the ping: | 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.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 | @@ -279,6 +280,7 @@ The following metrics are added to the ping: | 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.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 | @@ -288,6 +290,7 @@ The following metrics are added to the ping: | metrics.recently_used_pwa_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many PWAs a user has recently used. Threshold for "recency" set in HomeActivity#PWA_RECENTLY_USED_THRESHOLD. Currently we are not told by the OS when a PWA is removed by the user, so we use the "recently used" heuristic to judge how many PWAs are still active, as a proxy for "installed". This value will only be set if the user has at least *one* recently used PWA. If they have 0, this metric will not be sent, resulting in a null value during analysis on the server-side. To disambiguate between a failed `recently_used_pwa_count` metric and 0 recent PWAs, please see `has_recent_pwas`. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.search_count |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |The labels for this counter are `.`. If the search engine is bundled with Fenix `search-engine-name` will be the name of the search engine. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be `custom`. `source` will be: `action`, `suggestion`, `widget` or `shortcut` (depending on the source from which the search started). Also added the `other` option for the source but it should never enter on this case. |[1](https://github.com/mozilla-mobile/fenix/pull/1677), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/7310), [4](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | | metrics.search_widget_installed |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Whether or not the search widget is installed |[1](https://github.com/mozilla-mobile/fenix/pull/10958), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.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 | From 665a71cbb07e07ff5a4f963ee8ff1ec6fce245d5 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Wed, 14 Oct 2020 21:24:05 -0400 Subject: [PATCH 25/97] For #15907 - Remove the usage of the TabTrayGridItemDecorator --- .../fenix/tabtray/TabTrayGridItemDecorator.kt | 62 ------------------- .../org/mozilla/fenix/tabtray/TabTrayView.kt | 3 - 2 files changed, 65 deletions(-) delete mode 100644 app/src/main/java/org/mozilla/fenix/tabtray/TabTrayGridItemDecorator.kt diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayGridItemDecorator.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayGridItemDecorator.kt deleted file mode 100644 index c0db0fa25a..0000000000 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayGridItemDecorator.kt +++ /dev/null @@ -1,62 +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.tabtray - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Paint -import android.graphics.RectF -import android.view.View -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.R -import org.mozilla.fenix.ext.components - -/** - * An item decorator for the tab tray grid tabs. Draws a border for the selected tab. - */ -class TabTrayGridItemDecorator(context: Context) : - RecyclerView.ItemDecoration() { - - override fun onDrawOver(canvas: Canvas, recyclerView: RecyclerView, state: RecyclerView.State) { - for (i in 0 until recyclerView.childCount) { - val child = recyclerView.getChildAt(i) - val viewHolder = recyclerView.getChildViewHolder(child) - if (viewHolder !is TabTrayViewHolder) { - continue - } - - if (viewHolder.tab?.id == recyclerView.context.components.core.store.state.selectedTabId) { - drawSelectedTabBorder(child, canvas) - } - } - - super.onDrawOver(canvas, recyclerView, state) - } - - private fun drawSelectedTabBorder(child: View, canvas: Canvas) { - val borderRadius = - child.resources.getDimensionPixelSize(R.dimen.tab_tray_grid_item_border_radius) - .toFloat() - canvas.drawRoundRect(child.getBounds(), borderRadius, borderRadius, borderStroke) - } - - private val borderStroke: Paint = Paint().apply { - color = ContextCompat.getColor(context, R.color.photonViolet50) - isAntiAlias = true - strokeWidth = - context.resources.getDimensionPixelSize(R.dimen.tab_tray_grid_item_selected_border_width) - .toFloat() - style = Paint.Style.STROKE - } - - private fun View.getBounds(): RectF { - val leftPosition = left + translationX - paddingLeft - val rightPosition = right + translationX + paddingRight - val topPosition = top + translationY - paddingTop - val bottomPosition = bottom + translationY + paddingBottom - return RectF(leftPosition, topPosition, rightPosition, bottomPosition) - } -} 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 6d7f135e58..88d372d999 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -335,8 +335,6 @@ class TabTrayView( updateUINormalMode(view.context.components.core.store.state) scrollToTab(view.context.components.core.store.state.selectedTabId) - view.tabsTray.invalidateItemDecorations() - if (isPrivateModeSelected) { components.analytics.metrics.track(Event.TabsTrayPrivateModeTapped) } else { @@ -375,7 +373,6 @@ class TabTrayView( } layoutManager = gridLayoutManager - addItemDecoration(TabTrayGridItemDecorator(container.context)) } } From 30ce88c5d25fbe50fb10532b3647a742d864360c Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Fri, 2 Oct 2020 15:29:04 -0700 Subject: [PATCH 26/97] For #15644: update RepoMatching.comAndroid. In Android Gradle Plugin 3.6+, a new dependency is com.android:zipflinger so we can't assume com.android is following by a dot. --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 1aa44baba0..b0b0d9c991 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -235,7 +235,7 @@ object Deps { object RepoMatching { const val mozilla = "org\\.mozilla\\..*" const val androidx = "androidx\\..*" - const val comAndroid = "com\\.android\\..*" + const val comAndroid = "com\\.android.*" const val comGoogleFirebase = "com\\.google\\.firebase" /** From aeb0205ea5f1e618ad75d5d82badb7baad986fac Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Fri, 2 Oct 2020 15:29:56 -0700 Subject: [PATCH 27/97] For #15644: update Android Gradle Plugin version. This ensures our custom lint rules are running on the command line. --- build.gradle | 4 ++-- buildSrc/src/main/java/Dependencies.kt | 7 ++++++- mozilla-lint-rules/build.gradle | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 1d4706748e..e1399e4592 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ buildscript { } else { google() { content { - // Improve performance: only check google maven for mozilla deps. + // Improve performance: only check google maven for google deps. includeGroupByRegex RepoMatching.androidx includeGroupByRegex RepoMatching.comGoogleAndroid includeGroupByRegex RepoMatching.comGoogleFirebase @@ -102,7 +102,7 @@ allprojects { } else { google() { content { - // Improve performance: only check google maven for mozilla deps. + // Improve performance: only check google maven for google deps. includeGroupByRegex RepoMatching.androidx includeGroupByRegex RepoMatching.comGoogleAndroid includeGroupByRegex RepoMatching.comGoogleFirebase diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index b0b0d9c991..ea10a1b998 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -5,7 +5,12 @@ object Versions { const val kotlin = "1.3.72" const val coroutines = "1.3.3" - const val android_gradle_plugin = "3.5.0" + + // These versions are linked: lint should be X+23.Y.Z of gradle_plugin version, according to: + // https://github.com/alexjlockwood/android-lint-checks-demo/blob/0245fc027463137b1b4afb97c5295d60dce998b6/dependencies.gradle#L3 + const val android_gradle_plugin = "3.6.4" + const val android_lint_api = "26.6.4" + const val sentry = "1.7.10" const val leakcanary = "2.4" const val leanplum = "5.4.0" diff --git a/mozilla-lint-rules/build.gradle b/mozilla-lint-rules/build.gradle index 9a8aa848ec..57725a5c17 100644 --- a/mozilla-lint-rules/build.gradle +++ b/mozilla-lint-rules/build.gradle @@ -9,9 +9,9 @@ targetCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8 dependencies { - compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.61" - compileOnly "com.android.tools.lint:lint-api:26.6.1" - compileOnly "com.android.tools.lint:lint-checks:26.6.1" + compileOnly "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}" + compileOnly "com.android.tools.lint:lint-api:${Versions.android_lint_api}" + compileOnly "com.android.tools.lint:lint-checks:${Versions.android_lint_api}" } jar { From 4d348dd26a14d4b42d0992722ba45cee5f012546 Mon Sep 17 00:00:00 2001 From: ekager Date: Fri, 2 Oct 2020 17:58:11 -0700 Subject: [PATCH 28/97] Fixes existing lint errors --- .../fenix/components/toolbar/TabCounter.kt | 5 ++- .../fenix/customtabs/CustomTabToolbarMenu.kt | 10 ++++- .../fenix/settings/DataChoicesFragment.kt | 8 ++-- .../settings/RadioButtonInfoPreference.kt | 25 ----------- .../account/AccountSettingsFragment.kt | 4 +- .../fenix/settings/account/SignOutFragment.kt | 6 ++- .../search/AddSearchEngineFragment.kt | 5 ++- .../search/EditCustomSearchEngineFragment.kt | 21 +++++---- .../org/mozilla/fenix/tabtray/TabTrayView.kt | 2 +- .../main/res/layout/account_preference.xml | 1 + .../layout/amo_collection_override_dialog.xml | 26 ++++++----- .../layout/browser_toolbar_popup_window.xml | 6 ++- app/src/main/res/layout/button_tip_item.xml | 2 +- .../main/res/layout/collections_list_item.xml | 2 +- .../layout/component_collection_creation.xml | 43 ++++++++++--------- ...nt_collection_creation_name_collection.xml | 20 +++++---- ..._collection_creation_select_collection.xml | 22 ++++++---- .../res/layout/download_dialog_layout.xml | 11 ++--- .../res/layout/fragment_crash_reporter.xml | 3 +- app/src/main/res/layout/list_element.xml | 2 +- .../res/layout/name_collection_dialog.xml | 2 + .../layout/onboarding_automatic_signin.xml | 2 +- ...reference_widget_radiobutton_with_info.xml | 7 +-- .../layout/search_widget_extra_small_v1.xml | 10 ++--- .../layout/search_widget_extra_small_v2.xml | 26 +++++------ .../main/res/layout/search_widget_large.xml | 14 +++--- .../main/res/layout/search_widget_medium.xml | 2 +- .../main/res/layout/search_widget_small.xml | 8 ++-- .../res/layout/search_widget_small_no_mic.xml | 22 +++++----- app/src/main/res/layout/tab_header.xml | 2 +- ...cking_protection_learn_more_preference.xml | 2 +- .../res/layout/view_synced_tabs_title.xml | 2 +- app/src/main/res/values/strings.xml | 7 +++ .../fenix/lintrules/ButtonStyleXmlDetector.kt | 5 +-- 34 files changed, 179 insertions(+), 156 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounter.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounter.kt index fe015efa05..1585fb7c36 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounter.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounter.kt @@ -39,7 +39,7 @@ class TabCounter @JvmOverloads constructor( counter_root.contentDescription = if (count == 1) { context?.getString(R.string.open_tab_tray_single) } else { - context?.getString(R.string.open_tab_tray_plural, count.toString()) + String.format(context.getString(R.string.open_tab_tray_plural), count.toString()) } } @@ -191,7 +191,8 @@ class TabCounter @JvmOverloads constructor( ONE_DIGIT_SIZE_RATIO } - val counterBoxWidth = context.resources.getDimensionPixelSize(R.dimen.tab_counter_box_width_height) + val counterBoxWidth = + context.resources.getDimensionPixelSize(R.dimen.tab_counter_box_width_height) val textSize = newRatio * counterBoxWidth counter_text.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) counter_text.setTypeface(null, Typeface.BOLD) diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt index fa3e8a94e9..dd9a3baead 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -25,6 +25,7 @@ import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getStringWithArgSafe import org.mozilla.fenix.ext.settings import org.mozilla.fenix.theme.ThemeManager +import java.util.Locale /** * Builds the toolbar object used with the 3-dot menu in the custom tab browser fragment. @@ -121,7 +122,11 @@ class CustomTabToolbarMenu( BrowserMenuDivider(), menuToolbar ) - if (shouldReverseItems) { menuItems.reversed() } else { menuItems } + if (shouldReverseItems) { + menuItems.reversed() + } else { + menuItems + } } private val desktopMode = BrowserMenuImageSwitch( @@ -161,7 +166,8 @@ class CustomTabToolbarMenu( } private val poweredBy = BrowserMenuCategory( - label = context.getStringWithArgSafe(R.string.browser_menu_powered_by, appName).toUpperCase(), + label = context.getStringWithArgSafe(R.string.browser_menu_powered_by, appName) + .toUpperCase(Locale.getDefault()), textSize = CAPTION_TEXT_SIZE, textColorResource = primaryTextColor(), textStyle = Typeface.NORMAL diff --git a/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt index 0579c9b5f3..be6f1a274d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt @@ -24,8 +24,7 @@ class DataChoicesFragment : PreferenceFragmentCompat() { super.onCreate(savedInstanceState) val context = requireContext() - preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) { - _, key -> + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) { _, key -> if (key == getPreferenceKey(R.string.pref_key_telemetry)) { if (context.settings().isTelemetryEnabled) { context.components.analytics.metrics.start(MetricServiceType.Data) @@ -63,7 +62,10 @@ class DataChoicesFragment : PreferenceFragmentCompat() { isChecked = context.settings().isMarketingTelemetryEnabled val appName = context.getString(R.string.app_name) - summary = context.getString(R.string.preferences_marketing_data_description, appName) + summary = String.format( + context.getString(R.string.preferences_marketing_data_description), + appName + ) onPreferenceChangeListener = SharedPreferenceUpdater() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/RadioButtonInfoPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/RadioButtonInfoPreference.kt index b2389c1740..4ee82e6709 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/RadioButtonInfoPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/RadioButtonInfoPreference.kt @@ -7,8 +7,6 @@ package org.mozilla.fenix.settings import android.content.Context import android.util.AttributeSet import android.widget.ImageView -import androidx.core.content.res.TypedArrayUtils -import androidx.core.content.withStyledAttributes import androidx.preference.PreferenceViewHolder import org.mozilla.fenix.R @@ -32,29 +30,6 @@ class RadioButtonInfoPreference @JvmOverloads constructor( init { layoutResource = R.layout.preference_widget_radiobutton_with_info - - context.withStyledAttributes( - attrs, - androidx.preference.R.styleable.Preference, - TypedArrayUtils.getAttr( - context, - androidx.preference.R.attr.preferenceStyle, - android.R.attr.preferenceStyle - ), - 0 - ) { - val defaultValue = when { - hasValue(androidx.preference.R.styleable.Preference_defaultValue) -> - getBoolean(androidx.preference.R.styleable.Preference_defaultValue, false) - hasValue(androidx.preference.R.styleable.Preference_android_defaultValue) -> - getBoolean( - androidx.preference.R.styleable.Preference_android_defaultValue, - false - ) - else -> false - } - setDefaultValue(defaultValue) - } } override fun onBindViewHolder(holder: PreferenceViewHolder) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt index 45e73998db..570ec64b4c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt @@ -403,8 +403,8 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { ) } } - is LastSyncTime.Success -> getString( - R.string.sync_last_synced_summary, + is LastSyncTime.Success -> String.format( + getString(R.string.sync_last_synced_summary), DateUtils.getRelativeTimeSpanString(state.lastSyncedDate.lastSync) ) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt index c972737def..2544945f58 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt @@ -50,8 +50,10 @@ class SignOutFragment : BottomSheetDialogFragment() { ): View? { accountManager = requireComponents.backgroundServices.accountManager val view = inflater.inflate(R.layout.fragment_sign_out, container, false) - view.sign_out_message.text = view.context.getString( - R.string.sign_out_confirmation_message_2, + view.sign_out_message.text = String.format( + view.context.getString( + R.string.sign_out_confirmation_message_2 + ), view.context.getString(R.string.app_name) ) return view diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt index d3e4aaa565..fdf1470a45 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt @@ -155,8 +155,9 @@ class AddSearchEngineFragment : Fragment(R.layout.fragment_add_search_engine), .map { it.toLowerCase(Locale.ROOT) } if (existingIdentifiers.contains(name.toLowerCase(Locale.ROOT))) { - custom_search_engine_name_field.error = resources - .getString(R.string.search_add_custom_engine_error_existing_name, name) + custom_search_engine_name_field.error = String.format( + resources.getString(R.string.search_add_custom_engine_error_existing_name), name + ) hasError = true } 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 92ed2f1451..2def180a15 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 @@ -85,6 +85,7 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng } } + @Suppress("LongMethod") private fun saveCustomEngine() { custom_search_engine_name_field.error = "" custom_search_engine_search_string_field.error = "" @@ -108,24 +109,30 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng val nameHasChanged = name != args.searchEngineIdentifier if (existingIdentifiers.contains(name.toLowerCase(Locale.ROOT)) && nameHasChanged) { - custom_search_engine_name_field.error = resources - .getString(R.string.search_add_custom_engine_error_existing_name, name) + custom_search_engine_name_field.error = String.format( + resources + .getString(R.string.search_add_custom_engine_error_existing_name), name + ) hasError = true } if (searchString.isEmpty()) { custom_search_engine_search_string_field - .error = resources.getString(R.string.search_add_custom_engine_error_empty_search_string) + .error = + resources.getString(R.string.search_add_custom_engine_error_empty_search_string) hasError = true } if (!searchString.contains("%s")) { custom_search_engine_search_string_field - .error = resources.getString(R.string.search_add_custom_engine_error_missing_template) + .error = + resources.getString(R.string.search_add_custom_engine_error_missing_template) hasError = true } - if (hasError) { return } + if (hasError) { + return + } viewLifecycleOwner.lifecycleScope.launch(Main) { val result = withContext(IO) { @@ -166,8 +173,4 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng } } } - - companion object { - private const val DPS_TO_INCREASE = 20 - } } 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 88d372d999..d3d037d0ce 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt @@ -581,7 +581,7 @@ class TabTrayView( view.tab_layout.getTabAt(0)?.contentDescription = if (count == 1) { view.context?.getString(R.string.open_tab_tray_single) } else { - view.context?.getString(R.string.open_tab_tray_plural, count.toString()) + String.format(view.context.getString(R.string.open_tab_tray_plural), count.toString()) } view.tabsTray.accessibilityDelegate = object : View.AccessibilityDelegate() { diff --git a/app/src/main/res/layout/account_preference.xml b/app/src/main/res/layout/account_preference.xml index e2998bee9d..23a2bfbac7 100644 --- a/app/src/main/res/layout/account_preference.xml +++ b/app/src/main/res/layout/account_preference.xml @@ -13,6 +13,7 @@ + android:id="@+id/linear_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + android:layout_marginEnd="16dp" + android:autofillHints="false" + android:hint="@string/customize_addon_collection_user_hint" + android:inputType="number" + android:singleLine="true" + android:textColor="?primaryText" /> + android:autofillHints="false" + android:hint="@string/customize_addon_collection_hint" + android:inputType="text" + android:singleLine="true" + android:textColor="?primaryText" /> diff --git a/app/src/main/res/layout/browser_toolbar_popup_window.xml b/app/src/main/res/layout/browser_toolbar_popup_window.xml index c068b404cb..a92608402d 100644 --- a/app/src/main/res/layout/browser_toolbar_popup_window.xml +++ b/app/src/main/res/layout/browser_toolbar_popup_window.xml @@ -1,4 +1,5 @@ - diff --git a/app/src/main/res/layout/collections_list_item.xml b/app/src/main/res/layout/collections_list_item.xml index 99fb2b0381..a42e135ad8 100644 --- a/app/src/main/res/layout/collections_list_item.xml +++ b/app/src/main/res/layout/collections_list_item.xml @@ -29,7 +29,7 @@ android:layout_height="wrap_content" android:importantForAccessibility="no" app:srcCompat="@drawable/ic_tab_collection" - android:tint="@null" + app:tint="@null" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/component_collection_creation.xml b/app/src/main/res/layout/component_collection_creation.xml index 88e156ef42..e8fe8a8162 100644 --- a/app/src/main/res/layout/component_collection_creation.xml +++ b/app/src/main/res/layout/component_collection_creation.xml @@ -14,53 +14,55 @@ android:id="@+id/back_button" android:layout_width="0dp" android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:drawablePadding="8dp" + android:gravity="start|center_vertical" android:paddingStart="16dp" android:paddingTop="16dp" android:paddingEnd="8dp" android:paddingBottom="16dp" - android:background="?android:attr/selectableItemBackgroundBorderless" - app:drawableStartCompat="@drawable/mozac_ic_back" - android:drawablePadding="8dp" - app:drawableTint="@color/neutral_text" - android:gravity="start|center_vertical" android:text="@string/create_collection_select_tabs" android:textAppearance="@style/HeaderTextStyle" android:textColor="@color/neutral_text" android:textSize="20sp" + app:drawableStartCompat="@drawable/mozac_ic_back" + app:drawableTint="@color/neutral_text" app:layout_constraintEnd_toStartOf="@+id/guideline" app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintWidth_default="wrap"/> + app:layout_constraintWidth_default="wrap" + tools:ignore="ButtonStyleXmlDetector" />