From df95df041e7cf6d3d665ae54f1a47b1caf645aa9 Mon Sep 17 00:00:00 2001 From: Aaron Train Date: Mon, 17 Apr 2023 14:16:48 -0400 Subject: [PATCH 001/207] Bug 1826513 - Expose FTL JUnit results in live log --- .../androidTest/parse-ui-test-fromfile.py | 75 +++++++++++++++++++ automation/taskcluster/androidTest/ui-test.sh | 4 + 2 files changed, 79 insertions(+) create mode 100644 automation/taskcluster/androidTest/parse-ui-test-fromfile.py diff --git a/automation/taskcluster/androidTest/parse-ui-test-fromfile.py b/automation/taskcluster/androidTest/parse-ui-test-fromfile.py new file mode 100644 index 000000000..72880fc19 --- /dev/null +++ b/automation/taskcluster/androidTest/parse-ui-test-fromfile.py @@ -0,0 +1,75 @@ +#!/usr/bin/python3 + +import argparse +import sys +import xml +from pathlib import Path + +from beautifultable import BeautifulTable +from junitparser import Attr, Failure, JUnitXml, TestSuite + + +def parse_args(cmdln_args): + parser = argparse.ArgumentParser(description="Parse and print UI test JUnit results") + parser.add_argument( + "--results", type=Path, + help="Directory containing task artifact results", required=True + ) + return parser.parse_args(args=cmdln_args) + + +class test_suite(TestSuite): + flakes = Attr() + + +def parse_print_failure_results(results): + table = BeautifulTable(maxwidth=256) + table.columns.header = (['UI Test', 'Outcome', 'Details']) + table.columns.alignment = BeautifulTable.ALIGN_LEFT + table.set_style(BeautifulTable.STYLE_GRID) + + for suite in results: + cur_suite = test_suite.fromelem(suite) + if cur_suite.flakes != '0': + for case in suite: + for entry in case.result: + if case.result: + table.rows.append( + ["%s#%s" % (case.classname, case.name), "Flaky", entry.text.replace('\t', ' ')]) + break + else: + for case in suite: + for entry in case.result: + if isinstance(entry, Failure): + table.rows.append( + ["%s#%s" % (case.classname, case.name), "Failure", entry.text.replace('\t', ' ')]) + break + print(table) + + +def load_results_file(filename): + ret = None + try: + f = open(filename, 'r') + try: + ret = JUnitXml.fromfile(f) + except xml.etree.ElementTree.ParseError as e: + print(f'Error parsing {filename} file: {e}') + finally: + f.close() + except IOError as e: + print(e) + + return ret + + +def main(): + args = parse_args(sys.argv[1:]) + + junitxml = load_results_file(args.results.joinpath('FullJUnitReport.xml')) + if junitxml: + parse_print_failure_results(junitxml) + + +if __name__ == '__main__': + main() diff --git a/automation/taskcluster/androidTest/ui-test.sh b/automation/taskcluster/androidTest/ui-test.sh index 530dfc5ba..a0498d8f5 100755 --- a/automation/taskcluster/androidTest/ui-test.sh +++ b/automation/taskcluster/androidTest/ui-test.sh @@ -118,6 +118,10 @@ function failure_check() { --results "${RESULTS_DIR}" \ --output-md "${ARTIFACT_DIR}/github/customCheckRunText.md" \ --device-type "${device_type}" + + chmod +x $PATH_TEST/parse-ui-test-fromfile.py + $PATH_TEST/parse-ui-test-fromfile.py \ + --results "${RESULTS_DIR}" } echo From 6f31670705c9323516557ede1e56acc30a45913b Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Wed, 28 Jun 2023 18:36:39 +0200 Subject: [PATCH 002/207] Bug 1840099 - Add bottom sheet container for shopping experience --- .../mozilla/fenix/browser/BrowserFragment.kt | 19 +++- .../fenix/compose/BottomSheetHandle.kt | 74 ++++++++++++ .../shopping/ReviewQualityCheckFeature.kt | 3 + .../shopping/ReviewQualityCheckFragment.kt | 63 +++++++++++ .../shopping/ReviewQualityCheckViewModel.kt | 34 ++++++ .../shopping/ui/ReviewQualityCheckContent.kt | 107 ++++++++++++++++++ app/src/main/res/navigation/nav_graph.xml | 7 ++ app/src/main/res/values/static_strings.xml | 1 + 8 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/mozilla/fenix/compose/BottomSheetHandle.kt create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index b0ebc1e39..690b5c5fc 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -10,11 +10,13 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources +import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -35,6 +37,7 @@ import mozilla.components.lib.state.ext.consumeFlow import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import mozilla.components.support.ktx.android.view.toScope import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import org.mozilla.fenix.GleanMetrics.ReaderMode import org.mozilla.fenix.R @@ -51,6 +54,7 @@ import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.settings.quicksettings.protections.cookiebanners.dialog.CookieBannerReEngagementDialogUtils import org.mozilla.fenix.settings.quicksettings.protections.cookiebanners.getCookieBannerUIMode import org.mozilla.fenix.shopping.ReviewQualityCheckFeature +import org.mozilla.fenix.shopping.ReviewQualityCheckViewModel import org.mozilla.fenix.shortcut.PwaOnboardingObserver import org.mozilla.fenix.theme.ThemeManager @@ -63,6 +67,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val windowFeature = ViewBoundFeatureWrapper() private val openInAppOnboardingObserver = ViewBoundFeatureWrapper() private val reviewQualityCheckFeature = ViewBoundFeatureWrapper() + private val reviewQualityCheckViewModel: ReviewQualityCheckViewModel by activityViewModels() private var readerModeAvailable = false private var reviewQualityCheckAvailable = false @@ -204,7 +209,13 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { contentDescription = context.getString(R.string.browser_menu_review_quality_check), contentDescriptionSelected = context.getString(R.string.browser_menu_review_quality_check_close), visible = { reviewQualityCheckAvailable }, - listener = {}, + listener = { isSelected -> + if (isSelected) { + findNavController().navigate( + BrowserFragmentDirections.actionBrowserFragmentToReviewQualityCheckDialogFragment(), + ) + } + }, ) browserToolbarView.view.addPageAction(reviewQualityCheck) @@ -216,6 +227,12 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { owner = this, view = view, ) + + view.toScope().launch { + reviewQualityCheckViewModel.isBottomSheetVisible.collectLatest { + reviewQualityCheck.setSelected(selected = it, notifyListener = false) + } + } } override fun onUpdateToolbarForConfigurationChange(toolbar: BrowserToolbarView) { diff --git a/app/src/main/java/org/mozilla/fenix/compose/BottomSheetHandle.kt b/app/src/main/java/org/mozilla/fenix/compose/BottomSheetHandle.kt new file mode 100644 index 000000000..8e509354e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/compose/BottomSheetHandle.kt @@ -0,0 +1,74 @@ +/* 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.compose + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A handle present on top of a bottom sheet. This is selectable when talkback is enabled. + * + * @param onRequestDismiss Invoked on clicking the handle when talkback is enabled. + * @param contentDescription Content Description of the composable. + * @param modifier The modifier to be applied to the Composable. + * @param color Color of the handle. + */ +@Composable +fun BottomSheetHandle( + onRequestDismiss: () -> Unit, + contentDescription: String, + modifier: Modifier = Modifier, + color: Color = FirefoxTheme.colors.textSecondary, +) { + Canvas( + modifier = modifier + .height(dimensionResource(id = R.dimen.bottom_sheet_handle_height)) + .semantics(mergeDescendants = true) { + this.contentDescription = contentDescription + onClick { + onRequestDismiss() + true + } + }, + ) { + drawRect(color = color) + } +} + +@Composable +@LightDarkPreview +private fun BottomSheetHandlePreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer1) + .padding(16.dp), + ) { + BottomSheetHandle( + onRequestDismiss = {}, + contentDescription = "", + modifier = Modifier + .width(100.dp) + .align(Alignment.CenterHorizontally), + ) + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFeature.kt b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFeature.kt index 342135fb0..2a1e154ca 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFeature.kt @@ -10,6 +10,9 @@ import org.mozilla.fenix.nimbus.FxNimbus /** * Feature implementation that provides review quality check information for supported product * pages. + * + * @param onAvailabilityChange Invoked when availability of this feature changes based on feature + * flag and when the loaded page is a supported product page. */ class ReviewQualityCheckFeature( private val onAvailabilityChange: (isAvailable: Boolean) -> Unit, diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt new file mode 100644 index 000000000..fb97b4377 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt @@ -0,0 +1,63 @@ +/* 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.shopping + +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.activityViewModels +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import org.mozilla.fenix.shopping.ui.ReviewQualityCheckContent +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A bottom sheet fragment displaying Review Quality Check information. + */ +class ReviewQualityCheckFragment : BottomSheetDialogFragment() { + + private val viewModel: ReviewQualityCheckViewModel by activityViewModels() + private var behavior: BottomSheetBehavior? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = + super.onCreateDialog(savedInstanceState).apply { + setOnShowListener { + val bottomSheet = + findViewById(com.google.android.material.R.id.design_bottom_sheet) + bottomSheet?.setBackgroundResource(android.R.color.transparent) + behavior = BottomSheetBehavior.from(bottomSheet) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + ReviewQualityCheckContent( + onRequestDismiss = { + behavior?.state = BottomSheetBehavior.STATE_HIDDEN + }, + ) + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + viewModel.onDialogCreated() + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + viewModel.onDialogDismissed() + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt new file mode 100644 index 000000000..2954e9d2a --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt @@ -0,0 +1,34 @@ +/* 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.shopping + +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update + +/** + * A ViewModel to communicate between ReviewQualityCheckFragment bottom sheet and the parent + * fragment. + */ +class ReviewQualityCheckViewModel : ViewModel() { + + private val _isBottomSheetVisible = MutableStateFlow(false) + val isBottomSheetVisible: StateFlow = _isBottomSheetVisible + + /** + * Invoked when bottom sheet dialog is created. + */ + fun onDialogCreated() { + _isBottomSheetVisible.update { true } + } + + /** + * Invoked when bottom sheet dialog is dismissed. + */ + fun onDialogDismissed() { + _isBottomSheetVisible.update { false } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt new file mode 100644 index 000000000..78663ad03 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt @@ -0,0 +1,107 @@ +/* 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.shopping.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.BottomSheetHandle +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +private val bottomSheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp) +private const val BOTTOM_SHEET_HANDLE_WIDTH_PERCENT = 0.1f + +/** + * Top-level UI for the Review Quality Check feature. + * + * @param onRequestDismiss Invoked when a user actions requests dismissal of the bottom sheet. + * @param modifier The modifier to be applied to the Composable. + */ +@Composable +fun ReviewQualityCheckContent( + onRequestDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .background( + color = FirefoxTheme.colors.layer1, + shape = bottomSheetShape, + ) + .padding(16.dp), + ) { + BottomSheetHandle( + onRequestDismiss = onRequestDismiss, + contentDescription = stringResource(R.string.browser_menu_review_quality_check_close), + modifier = Modifier + .fillMaxWidth(BOTTOM_SHEET_HANDLE_WIDTH_PERCENT) + .align(Alignment.CenterHorizontally), + ) + + Spacer(modifier = Modifier.height(16.dp)) + + Header() + + Spacer(modifier = Modifier.height(16.dp)) + } +} + +@Composable +private fun Header() { + Row( + modifier = Modifier.semantics(mergeDescendants = true) {}, + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(id = R.drawable.ic_firefox), + contentDescription = null, + modifier = Modifier.size(24.dp), + ) + + Spacer(modifier = Modifier.width(10.dp)) + + Text( + text = stringResource(R.string.review_quality_check), + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline6, + ) + } +} + +@Composable +@LightDarkPreview +private fun ReviewQualityCheckContentPreview() { + FirefoxTheme { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.BottomCenter, + ) { + ReviewQualityCheckContent( + onRequestDismiss = {}, + modifier = Modifier.fillMaxWidth(), + ) + } + } +} diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 5baa98738..42d43267c 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -325,6 +325,9 @@ + + + Review quality check Close review quality check + Review quality check From 8376fed7b31cd38ff2b56c6d1503d18732aab05a Mon Sep 17 00:00:00 2001 From: Titouan Thibaud Date: Tue, 4 Jul 2023 18:15:05 +0200 Subject: [PATCH 003/207] Bug 1841651 - Start the Nightly 117 development cycle --- app/src/main/res/values/strings.xml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c116e6fd2..f911d9c9c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -407,18 +407,12 @@ Send request - Cookie Banner Reduction - Request support for this site? - Request to support site submitted. - Request sent On for this site - Request to support site submitted - Support request sent Site currently not supported @@ -426,8 +420,6 @@ Turn on Cookie banner reduction for %1$s? Turn off Cookie banner reduction for %1$s? - - This site is currently not supported by Cookie Banner Reduction. Would you like our team to review this website and add support in the future? %1$s can’t automatically reject cookie requests on this site. You can send a request to support this site in the future. @@ -1455,12 +1447,8 @@ Protection Settings Enhanced Tracking Protection - - Browse without being followed Now featuring Total Cookie Protection, our most powerful barrier yet against cross-site trackers. - - Keep your data to yourself. %s protects you from many of the most common trackers that follow what you do online. %s protects you from many of the most common trackers that follow what you do online. @@ -1468,16 +1456,12 @@ Standard (default) - Balanced for privacy and performance. Pages load normally. - Pages will load normally, but block fewer trackers. What’s blocked by standard tracking protection Strict - Blocks more trackers so pages load faster, but some on-page functionality may break. - Stronger tracking protection and faster performance, but some sites may not work properly. What’s blocked by strict tracking protection From 438ec53a20d6b1afa25a2903997475353556729a Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 5 Jul 2023 00:03:53 +0000 Subject: [PATCH 004/207] Import translations from android-l10n --- app/src/main/res/values-sat/strings.xml | 4 +++ app/src/main/res/values-trs/strings.xml | 46 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index a98d16aa2..1cfd6834b 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -1215,6 +1215,10 @@ PDF ᱞᱮᱠᱷᱟ ᱥᱟᱺᱪᱟᱣ ᱢᱮ PDF ᱛᱮᱭᱟᱨ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ + + ᱪᱷᱟᱯᱟ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ + + ᱪᱷᱟᱯᱟ ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱠᱩᱞ ᱢᱮ diff --git a/app/src/main/res/values-trs/strings.xml b/app/src/main/res/values-trs/strings.xml index 9b2eddb85..d188f7426 100644 --- a/app/src/main/res/values-trs/strings.xml +++ b/app/src/main/res/values-trs/strings.xml @@ -485,6 +485,8 @@ Nitāj si huā nî’nïnj riña sitiô dugumîn sò’ Si gūruhuaj nī nitāj si aran’ dugui’ sitiô web ngà HTTPS. + + Si gūruhuaj nī, huā ‘ngō sa yī’ìi gatûj riña aga’ nan. Sisī huā nï̀n’ gīnunt riña sitiô nan nī, sī gachrûnt à’ngō nuguan’ gā’hue gārasun nej si da’ gī’hiaj yī’ì nej si sò’. Sisī huā nï̀n’ gīnunt hiūj nan don nī, gī’hiaj desaktivando akuan’ HTTPS. Dàj gā gātū\' @@ -576,6 +578,9 @@ Sisi’hiaj yi’nïn’ nan (ID si’hija si) + + Nahuin nākà nej sa gā’hue nūtà’t doj. Gāhui akuanj riña aplikasiûn nan da’ nāhuin nākà riña man… + Gūej ñû @@ -708,6 +713,8 @@ Sa huā rayi\'î Marketin + + Dūyinga’ nej dato ngà Adjust, dadain’ huej huin sa nīkāj ñu’ūnj marketing móvil Nej ēstûdio @@ -778,6 +785,9 @@ Nā’nï̄n %d nej rakïj ñanj anj + + Si nā’nï̄nt gā’ì nej rakïj ñanj nī gā’hue nāhuin nāj %s. Gān’ānjt ne’ ñāan aj. Na\'nïn nej rakïj ñanj @@ -858,11 +868,16 @@ Dūre’ nej rakïj ñanj nitāj si arâj sunt ngà’ + + Nātū nej rakïj ñanj nitāj si gini’hiājt gachîn riña huìj semana riña mà nej sa nitāj si ni’ñānj an. + Nādure\' Ngà \'hiaj sunj + + %1$s gā’hue gà’nïn nī gāyi’ìj gi’hia estudio. Gāhuin chrūn doj @@ -1154,6 +1169,8 @@ Koleksiôn Si menû koleksiûn + + Nāgi’hiaj chrē’ nej sa ñā’an doj ruhuât.\n Nāgi’hiaj chrē’ nej sa nana’huî’t, nej sitio nī nej rakïj ñanj nīkò’ dugui’ hua da’ hìo doj gātūt ne’ ñān doj. Nāguī nej rakïj ñanj @@ -1266,6 +1283,23 @@ Ni’hiāj dàj ‘hiaj sun riña sa aché nu yītï̀njt + + Si ga’na’ nej kôki nī nej dukuán nej sa gini’hiājt riña %1$s + + Gachē nu nī gà’ si ‘ngō da’nga’a sī dunâjt + + Riña aché nun huìt riña %1$s nitāj si na’nḯn sà’aj nej nuguan’ huā rayi’ît. + + Gāyi’ì nānà’huì’t + + Narì’ ‘ngō sa huin nīchrù’un. Asi nārì’ ‘ngō sa gī’hiaj nāhuin nīhià’ ruhuât. + + + + Gī’hiaj ‘ngō sunūnj un, nāchra ‘ngō nej nuguan’ nan da’ nahuin hue’ê doj Firefox. Nātsij ēnkuêsta @@ -1305,6 +1339,8 @@ GĀ’HUE Huā yītïnj ruhuât nādure\'t %1$s anj + + Sisī nādurê’t rakïj ñanj nan nī, nārè da’ huā ngè koleksiôn. Gā’hue nāgi’hiát a’ngô koleksiôn ahuin mān’an diû garan’ ruhuât. Nādurê\'t %1$s raj @@ -1362,6 +1398,8 @@ Gāhuī + + Diû gāchīn da’ gā’hue nārè’ej Sa gahuin akuan\' @@ -1401,10 +1439,18 @@ Gāyi\'ì sēsiûn Ngà nanûn Sync + + Sa ‘na’ niñā da’ dūgumîn sò’ da’ gāchē nun huìt Sa huā chre\' (dàj huaj \'naj) Sa nùkuaj doj + + Nānà’huì’ riña ginun dukuá ‘na’ nej rasūun + + Dūnâj man ginùn man ne’ rīki asi dūguachîn man gān’an ne’ ràa. + + Sò’ ni’in dàj gī’hiaj sunt ngà nej si datôt Gahiā sa atāj na\'ānj ñûnj guendâ sa huìi From 23fe60edb9a9ee7c255902bf4ca9d77c42e407cf Mon Sep 17 00:00:00 2001 From: mike a Date: Thu, 29 Jun 2023 12:49:28 +0900 Subject: [PATCH 005/207] =?UTF-8?q?Bug=201840315=20=E2=80=93=C2=A0added=20?= =?UTF-8?q?telemetry=20to=20the=20splash=20screen=20data=20fetching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/metrics.yaml | 21 +++++++++++++++++++ .../java/org/mozilla/fenix/HomeActivity.kt | 9 +++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index f5bf6bf84..f1996e851 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -637,6 +637,27 @@ events: tags: - Search +splash_screen: + first_launch_extended: + type: event + description: | + The splash screen was shown for an extended period of time, providing more time + to download marketing and experiment data. + extra_keys: + data_fetched: + type: boolean + description: | + If the splash screen was closed due to data being fetched or due to the time running out. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1840315 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/2616 + data_sensitivity: + - technical + notification_emails: + - android-probes@mozilla.com + expires: 126 + onboarding: syn_cfr_shown: type: event diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 0daba1988..b9a612e7b 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -84,6 +84,7 @@ import mozilla.telemetry.glean.private.NoExtras import org.mozilla.experiments.nimbus.initializeTooling import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Metrics +import org.mozilla.fenix.GleanMetrics.SplashScreen import org.mozilla.fenix.GleanMetrics.StartOnHome import org.mozilla.fenix.addons.AddonDetailsFragmentDirections import org.mozilla.fenix.addons.AddonPermissionsDetailsFragmentDirections @@ -433,7 +434,13 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { splashScreen.setKeepOnScreenCondition { val dataFetched = components.settings.utmParamsKnown && components.settings.nimbusExperimentsFetched - !maxDurationReached && !dataFetched + val keepOnScreen = !maxDurationReached && !dataFetched + if (!keepOnScreen) { + SplashScreen.firstLaunchExtended.record( + SplashScreen.FirstLaunchExtendedExtra(dataFetched = dataFetched), + ) + } + keepOnScreen } MainScope().launch { delay(timeMillis = delay) From e36eeb60918aa816938b7816b907475445ebea90 Mon Sep 17 00:00:00 2001 From: mavduevskiy <92760693+mavduevskiy@users.noreply.github.com> Date: Thu, 6 Jul 2023 01:00:40 +0900 Subject: [PATCH 006/207] =?UTF-8?q?Bug=201841799=20=E2=80=93=C2=A0enabled?= =?UTF-8?q?=20unified=20search=20settings=20on=20all=20builds=20(#2720)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: mike a Co-authored-by: dsmithpadilla <88508950+dsmithpadilla@users.noreply.github.com> --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index e4c9ed334..dbd09b295 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -61,7 +61,7 @@ object FeatureFlags { * Enables new search settings UI with two extra fragments, for managing the default engine * and managing search shortcuts in the quick search menu. */ - val unifiedSearchSettings = Config.channel.isNightlyOrDebug + const val unifiedSearchSettings = true /** * Enables printing from the share and primary menu. From 427e39810ce2df273b51edd63c24ca6deb2ee112 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Wed, 5 Jul 2023 09:39:37 +0200 Subject: [PATCH 007/207] Bug 1841676 - Fix NavigationToolbarTest.swipeToSwitchTabInRTLTest failure --- .../mozilla/fenix/browser/BrowserFragment.kt | 23 +++---------- .../shopping/ReviewQualityCheckFragment.kt | 17 +++------- .../shopping/ReviewQualityCheckViewModel.kt | 34 ------------------- .../drawable/ic_shopping_cart_selected.xml | 23 ------------- 4 files changed, 9 insertions(+), 88 deletions(-) delete mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt delete mode 100644 app/src/main/res/drawable/ic_shopping_cart_selected.xml diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 690b5c5fc..e3fd70d8a 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -10,13 +10,11 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources -import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -37,7 +35,6 @@ import mozilla.components.lib.state.ext.consumeFlow import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper -import mozilla.components.support.ktx.android.view.toScope import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import org.mozilla.fenix.GleanMetrics.ReaderMode import org.mozilla.fenix.R @@ -54,7 +51,6 @@ import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.settings.quicksettings.protections.cookiebanners.dialog.CookieBannerReEngagementDialogUtils import org.mozilla.fenix.settings.quicksettings.protections.cookiebanners.getCookieBannerUIMode import org.mozilla.fenix.shopping.ReviewQualityCheckFeature -import org.mozilla.fenix.shopping.ReviewQualityCheckViewModel import org.mozilla.fenix.shortcut.PwaOnboardingObserver import org.mozilla.fenix.theme.ThemeManager @@ -67,7 +63,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val windowFeature = ViewBoundFeatureWrapper() private val openInAppOnboardingObserver = ViewBoundFeatureWrapper() private val reviewQualityCheckFeature = ViewBoundFeatureWrapper() - private val reviewQualityCheckViewModel: ReviewQualityCheckViewModel by activityViewModels() private var readerModeAvailable = false private var reviewQualityCheckAvailable = false @@ -204,17 +199,15 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { )!!, imageSelected = AppCompatResources.getDrawable( context, - R.drawable.ic_shopping_cart_selected, + R.drawable.ic_shopping_cart, )!!, contentDescription = context.getString(R.string.browser_menu_review_quality_check), contentDescriptionSelected = context.getString(R.string.browser_menu_review_quality_check_close), visible = { reviewQualityCheckAvailable }, - listener = { isSelected -> - if (isSelected) { - findNavController().navigate( - BrowserFragmentDirections.actionBrowserFragmentToReviewQualityCheckDialogFragment(), - ) - } + listener = { + findNavController().navigate( + BrowserFragmentDirections.actionBrowserFragmentToReviewQualityCheckDialogFragment(), + ) }, ) @@ -227,12 +220,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { owner = this, view = view, ) - - view.toScope().launch { - reviewQualityCheckViewModel.isBottomSheetVisible.collectLatest { - reviewQualityCheck.setSelected(selected = it, notifyListener = false) - } - } } override fun onUpdateToolbarForConfigurationChange(toolbar: BrowserToolbarView) { diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt index fb97b4377..18714750c 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckFragment.kt @@ -5,13 +5,14 @@ package org.mozilla.fenix.shopping import android.app.Dialog -import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.ComposeView -import androidx.fragment.app.activityViewModels +import androidx.compose.ui.platform.rememberNestedScrollInteropConnection import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.mozilla.fenix.shopping.ui.ReviewQualityCheckContent @@ -22,7 +23,6 @@ import org.mozilla.fenix.theme.FirefoxTheme */ class ReviewQualityCheckFragment : BottomSheetDialogFragment() { - private val viewModel: ReviewQualityCheckViewModel by activityViewModels() private var behavior: BottomSheetBehavior? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = @@ -46,18 +46,9 @@ class ReviewQualityCheckFragment : BottomSheetDialogFragment() { onRequestDismiss = { behavior?.state = BottomSheetBehavior.STATE_HIDDEN }, + modifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection()), ) } } } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - viewModel.onDialogCreated() - } - - override fun onDismiss(dialog: DialogInterface) { - super.onDismiss(dialog) - viewModel.onDialogDismissed() - } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt b/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt deleted file mode 100644 index 2954e9d2a..000000000 --- a/app/src/main/java/org/mozilla/fenix/shopping/ReviewQualityCheckViewModel.kt +++ /dev/null @@ -1,34 +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.shopping - -import androidx.lifecycle.ViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.update - -/** - * A ViewModel to communicate between ReviewQualityCheckFragment bottom sheet and the parent - * fragment. - */ -class ReviewQualityCheckViewModel : ViewModel() { - - private val _isBottomSheetVisible = MutableStateFlow(false) - val isBottomSheetVisible: StateFlow = _isBottomSheetVisible - - /** - * Invoked when bottom sheet dialog is created. - */ - fun onDialogCreated() { - _isBottomSheetVisible.update { true } - } - - /** - * Invoked when bottom sheet dialog is dismissed. - */ - fun onDialogDismissed() { - _isBottomSheetVisible.update { false } - } -} diff --git a/app/src/main/res/drawable/ic_shopping_cart_selected.xml b/app/src/main/res/drawable/ic_shopping_cart_selected.xml deleted file mode 100644 index 18e160d92..000000000 --- a/app/src/main/res/drawable/ic_shopping_cart_selected.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - From 537c34848c6a100776f9730ec35cce12a39a5a47 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 29 Jun 2023 15:21:10 -0700 Subject: [PATCH 008/207] Bug 1841171 - Convert `NavigationToolbarTest` to support the Tabs Tray rewrite --- .../fenix/ui/ComposeNavigationToolbarTest.kt | 267 ++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt new file mode 100644 index 000000000..c64ae7c03 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt @@ -0,0 +1,267 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.core.net.toUri +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.MatcherHelper.itemWithText +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar +import java.util.Locale + +/** + * Tests for verifying basic functionality of browser navigation and page related interactions + * + * Including: + * - Visiting a URL + * - Back and Forward navigation + * - Refresh + * - Find in page + */ + +class ComposeNavigationToolbarTest { + private lateinit var mDevice: UiDevice + private lateinit var mockWebServer: MockWebServer + + @get:Rule + val composeTestRule = + AndroidComposeTestRule( + HomeActivityTestRule.withDefaultSettingsOverrides( + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Before + fun setUp() { + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun goBackTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val nextWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(nextWebPage.url) { + verifyUrl(nextWebPage.url.toString()) + }.openThreeDotMenu { + }.goToPreviousPage { + mDevice.waitForIdle() + verifyUrl(defaultWebPage.url.toString()) + } + } + + @Test + fun goForwardTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val nextWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(nextWebPage.url) { + mDevice.waitForIdle() + verifyUrl(nextWebPage.url.toString()) + }.openThreeDotMenu { + }.goToPreviousPage { + mDevice.waitForIdle() + verifyUrl(defaultWebPage.url.toString()) + } + + // Re-open the three-dot menu for verification + navigationToolbar { + }.openThreeDotMenu { + verifyThreeDotMenuExists() + }.goForward { + verifyUrl(nextWebPage.url.toString()) + } + } + + // Swipes the nav bar left/right to switch between tabs + @SmokeTest + @Test + fun swipeToSwitchTabTest() { + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + swipeNavBarRight(secondWebPage.url.toString()) + verifyUrl(firstWebPage.url.toString()) + swipeNavBarLeft(firstWebPage.url.toString()) + verifyUrl(secondWebPage.url.toString()) + } + } + + // Because it requires changing system prefs, this test will run only on Debug builds + @Test + fun swipeToSwitchTabInRTLTest() { + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + val arabicLocale = Locale("ar", "AR") + + runWithSystemLocaleChanged(arabicLocale, composeTestRule.activityRule) { + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + swipeNavBarLeft(secondWebPage.url.toString()) + verifyUrl(firstWebPage.url.toString()) + swipeNavBarRight(firstWebPage.url.toString()) + verifyUrl(secondWebPage.url.toString()) + } + } + } + + // Test running on beta/release builds in CI: + // caution when making changes to it, so they don't block the builds + @Test + fun visitURLTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + verifyUrl(defaultWebPage.url.toString()) + } + } + + @Test + fun findInPageTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openThreeDotMenu { + verifyThreeDotMenuExists() + verifyFindInPageButton() + }.openFindInPage { + verifyFindInPageNextButton() + verifyFindInPagePrevButton() + verifyFindInPageCloseButton() + enterFindInPageQuery("a") + verifyFindNextInPageResult("1/3") + clickFindInPageNextButton() + verifyFindNextInPageResult("2/3") + clickFindInPageNextButton() + verifyFindNextInPageResult("3/3") + clickFindInPagePrevButton() + verifyFindPrevInPageResult("2/3") + clickFindInPagePrevButton() + verifyFindPrevInPageResult("1/3") + }.closeFindInPageWithCloseButton { + verifyFindInPageBar(false) + }.openThreeDotMenu { + }.openFindInPage { + enterFindInPageQuery("3") + verifyFindNextInPageResult("1/1") + }.closeFindInPageWithBackButton { + verifyFindInPageBar(false) + } + } + + @Test + fun pdfFindInPageTest() { + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericURL.url) { + clickPageObject(itemWithText("PDF form file")) + }.openThreeDotMenu { + verifyThreeDotMenuExists() + verifyFindInPageButton() + }.openFindInPage { + verifyFindInPageNextButton() + verifyFindInPagePrevButton() + verifyFindInPageCloseButton() + enterFindInPageQuery("l") + verifyFindNextInPageResult("1/2") + clickFindInPageNextButton() + verifyFindNextInPageResult("2/2") + clickFindInPagePrevButton() + verifyFindPrevInPageResult("1/2") + }.closeFindInPageWithCloseButton { + verifyFindInPageBar(false) + }.openThreeDotMenu { + }.openFindInPage { + enterFindInPageQuery("p") + verifyFindNextInPageResult("1/1") + }.closeFindInPageWithBackButton { + verifyFindInPageBar(false) + } + } + + @Test + fun verifySecurePageSecuritySubMenuTest() { + val defaultWebPage = "https://mozilla-mobile.github.io/testapp/loginForm" + val defaultWebPageTitle = "Login_form" + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.toUri()) { + }.openSiteSecuritySheet { + verifyQuickActionSheet(defaultWebPage, true) + openSecureConnectionSubMenu(true) + verifySecureConnectionSubMenu(defaultWebPageTitle, defaultWebPage, true) + } + } + + @Test + fun verifyInsecurePageSecuritySubMenuTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + waitForPageToLoad() + }.openSiteSecuritySheet { + verifyQuickActionSheet(defaultWebPage.url.toString(), false) + openSecureConnectionSubMenu(false) + verifySecureConnectionSubMenu(defaultWebPage.title, defaultWebPage.url.toString(), false) + } + } + + @Test + fun verifyClearCookiesFromQuickSettingsTest() { + val helpPageUrl = "mozilla.org" + + homeScreen { + }.openThreeDotMenu { + }.openHelp { + }.openSiteSecuritySheet { + clickQuickActionSheetClearSiteData() + verifyClearSiteDataPrompt(helpPageUrl) + } + } +} From 717b999ad323114140118ea5fde5779073e32e86 Mon Sep 17 00:00:00 2001 From: mike a Date: Wed, 5 Jul 2023 16:46:55 +0900 Subject: [PATCH 009/207] =?UTF-8?q?Bug=201826470=20=E2=80=93=20fixed=20an?= =?UTF-8?q?=20edge=20case=20when=20cached=20values=20affected=20unified=20?= =?UTF-8?q?search=20feature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fenix/search/SearchFragmentStore.kt | 3 +- .../fenix/search/SearchFragmentStoreTest.kt | 174 ++++++++++++++++++ 2 files changed, 176 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt index a508b781d..57f5a7243 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt @@ -261,7 +261,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen state.copy( searchEngineSource = SearchEngineSource.Default(action.engine), showSearchSuggestions = shouldShowSearchSuggestions(action.browsingMode, action.settings), - showSearchShortcuts = action.settings.shouldShowSearchShortcuts, + showSearchShortcuts = action.settings.shouldShowSearchShortcuts && + !action.settings.showUnifiedSearchFeature, showClipboardSuggestions = action.settings.shouldShowClipboardSuggestions, showSearchTermHistory = action.settings.showUnifiedSearchFeature && action.settings.shouldShowHistorySuggestions, diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt index 6c033db7d..2847305c4 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt @@ -177,6 +177,180 @@ class SearchFragmentStoreTest { assertEquals(query, store.state.query) } + @Test + fun `GIVEN search shortcuts are disabled and unified search is enabled in settings WHEN the default search engine is selected THEN search shortcuts are not displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.showUnifiedSearchFeature } returns true + every { settings.shouldShowSearchShortcuts } returns false + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSearchShortcuts) + } + + @Test + fun `GIVEN search shortcuts are enabled and unified search is disabled in settings WHEN the default search engine is selected THEN search shortcuts are displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.showUnifiedSearchFeature } returns false + every { settings.shouldShowSearchShortcuts } returns true + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertTrue(store.state.showSearchShortcuts) + } + + @Test + fun `GIVEN search shortcuts and unified search are both enabled in settings WHEN the default search engine is selected THEN search shortcuts are not displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.showUnifiedSearchFeature } returns true + every { settings.shouldShowSearchShortcuts } returns true + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSearchShortcuts) + } + + @Test + fun `GIVEN search shortcuts and unified search are both disabled in settings WHEN the default search engine is selected THEN search shortcuts are not displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.showUnifiedSearchFeature } returns true + every { settings.shouldShowSearchShortcuts } returns true + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = searchEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSearchShortcuts) + } + + // non default tests + + @Test + fun `GIVEN search shortcuts are disabled and unified search is enabled in settings WHEN the search engine shortcut is selected THEN search shortcuts are not displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.shouldShowSearchShortcuts } returns false + every { settings.showUnifiedSearchFeature } returns true + + val newEngine: SearchEngine = mockk { + every { id } returns "DuckDuckGo" + every { isGeneral } returns true + } + + store.dispatch( + SearchFragmentAction.SearchShortcutEngineSelected( + engine = newEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSearchShortcuts) + } + + @Test + fun `GIVEN search shortcuts are enabled and unified search is disabled in settings WHEN the search engine shortcut is selected THEN search shortcuts are displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.shouldShowSearchShortcuts } returns true + every { settings.showUnifiedSearchFeature } returns false + + val newEngine: SearchEngine = mockk { + every { id } returns "DuckDuckGo" + every { isGeneral } returns true + } + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = newEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertTrue(store.state.showSearchShortcuts) + } + + @Test + fun `GIVEN search shortcuts and unified search are both enabled in settings WHEN the search engine shortcut is selected THEN search shortcuts are not displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.shouldShowSearchShortcuts } returns true + every { settings.showUnifiedSearchFeature } returns true + + val newEngine: SearchEngine = mockk { + every { id } returns "DuckDuckGo" + every { isGeneral } returns true + } + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = newEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSearchShortcuts) + } + + @Test + fun `GIVEN search shortcuts and unified search are both disabled in settings WHEN the search engine shortcut is selected THEN search shortcuts are not displayed`() = runTest { + val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) + val store = SearchFragmentStore(initialState) + every { settings.shouldShowSearchShortcuts } returns true + every { settings.showUnifiedSearchFeature } returns true + + val newEngine: SearchEngine = mockk { + every { id } returns "DuckDuckGo" + every { isGeneral } returns true + } + + store.dispatch( + SearchFragmentAction.SearchDefaultEngineSelected( + engine = newEngine, + browsingMode = BrowsingMode.Normal, + settings = settings, + ), + ).join() + + assertNotSame(initialState, store.state) + assertFalse(store.state.showSearchShortcuts) + } + @Test fun `WHEN the search engine is the default one THEN search suggestions providers are updated`() = runTest { val initialState = emptyDefaultState(showHistorySuggestionsForCurrentEngine = false) From 6c5e8dbc95c0229a0943586ba196654a53721585 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 29 Jun 2023 15:34:54 -0700 Subject: [PATCH 010/207] Bug 1841175 - Convert `MenuScreenShotTest` to support the Tabs Tray rewrite --- .../screenshots/ComposeMenuScreenShotTest.kt | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/screenshots/ComposeMenuScreenShotTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/screenshots/ComposeMenuScreenShotTest.kt b/app/src/androidTest/java/org/mozilla/fenix/screenshots/ComposeMenuScreenShotTest.kt new file mode 100644 index 000000000..6111b39dd --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/screenshots/ComposeMenuScreenShotTest.kt @@ -0,0 +1,189 @@ +/* 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/. */ + +@file:Suppress("DEPRECATION") + +package org.mozilla.fenix.screenshots + +import android.os.SystemClock +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.ui.robots.bookmarksMenu +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.swipeToBottom +import tools.fastlane.screengrab.Screengrab +import tools.fastlane.screengrab.locale.LocaleTestRule + +class ComposeMenuScreenShotTest : ScreenshotTest() { + private lateinit var mockWebServer: MockWebServer + private lateinit var mDevice: UiDevice + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val composeTestRule = + AndroidComposeTestRule( + HomeActivityTestRule.withDefaultSettingsOverrides( + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Before + fun setUp() { + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + composeTestRule.activity.finishAndRemoveTask() + mockWebServer.shutdown() + } + + @Test + fun threeDotMenuTest() { + homeScreen { + }.openThreeDotMenu { + Screengrab.screenshot("ThreeDotMenuMainRobot_three-dot-menu") + } + } + + @Test + fun settingsTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + Screengrab.screenshot("SettingsRobot_settings-menu") + }.openTurnOnSyncMenu { + Screengrab.screenshot("AccountSettingsRobot_settings-account") + }.goBack { + }.openSearchSubMenu { + Screengrab.screenshot("SettingsSubMenuSearchRobot_settings-search") + }.goBack { + }.openCustomizeSubMenu { + Screengrab.screenshot("SettingsSubMenuThemeRobot_settings-theme") + }.goBack { + }.openAccessibilitySubMenu { + Screengrab.screenshot("SettingsSubMenuAccessibilityRobot_settings-accessibility") + }.goBack { + }.openLanguageSubMenu { + Screengrab.screenshot("SettingsSubMenuAccessibilityRobot_settings-language") + }.goBack { + // From about here we need to scroll up to ensure all settings options are visible. + }.openSetDefaultBrowserSubMenu { + Screengrab.screenshot("SettingsSubMenuDefaultBrowserRobot_settings-default-browser") + }.goBack { + // Disabled for Pixel 2 + // }.openEnhancedTrackingProtectionSubMenu { + // Screengrab.screenshot("settings-enhanced-tp") + // }.goBack { + }.openLoginsAndPasswordSubMenu { + Screengrab.screenshot("SettingsSubMenuLoginsAndPasswords-settings-logins-passwords") + }.goBack { + swipeToBottom() + Screengrab.screenshot("SettingsRobot_settings-scroll-to-bottom") + }.openSettingsSubMenuDataCollection { + Screengrab.screenshot("settings-telemetry") + }.goBack { + }.openAddonsManagerMenu { + Screengrab.screenshot("settings-addons") + } + } + + @Test + fun historyTest() { + homeScreen { + }.openThreeDotMenu { + } + openHistoryThreeDotMenu() + Screengrab.screenshot("HistoryRobot_history-menu") + } + + @Test + fun bookmarksManagementTest() { + homeScreen { + }.openThreeDotMenu { + } + openBookmarksThreeDotMenu() + Screengrab.screenshot("BookmarksRobot_bookmarks-menu") + bookmarksMenu { + clickAddFolderButtonUsingId() + Screengrab.screenshot("BookmarksRobot_add-folder-view") + saveNewFolder() + Screengrab.screenshot("BookmarksRobot_error-empty-folder-name") + addNewFolderName("test") + saveNewFolder() + }.openThreeDotMenu("test") { + Screengrab.screenshot("ThreeDotMenuBookmarksRobot_folder-menu") + } + editBookmarkFolder() + Screengrab.screenshot("ThreeDotMenuBookmarksRobot_edit-bookmark-folder-menu") + // It may be needed to wait here to have the screenshot + bookmarksMenu { + navigateUp() + }.openThreeDotMenu("test") { + deleteBookmarkFolder() + Screengrab.screenshot("ThreeDotMenuBookmarksRobot_delete-bookmark-folder-menu") + } + } + + @Test + fun collectionMenuTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + navigationToolbar { + Screengrab.screenshot("NavigationToolbarRobot_navigation-toolbar") + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + Screengrab.screenshot("BrowserRobot_enter-url") + }.openComposeTabDrawer(composeTestRule) { + TestAssetHelper.waitingTime + Screengrab.screenshot("TabDrawerRobot_one-tab-open") + }.openThreeDotMenu { + TestAssetHelper.waitingTime + Screengrab.screenshot("TabDrawerRobot_three-dot-menu") + } + } + + @Test + fun tabMenuTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + }.openThreeDotMenu { + Screengrab.screenshot("TabDrawerRobot_browser-tab-menu") + }.closeBrowserMenuToBrowser { + }.openComposeTabDrawer(composeTestRule) { + Screengrab.screenshot("TabDrawerRobot_tab-drawer-with-tabs") + closeTab() + TestAssetHelper.waitingTime + Screengrab.screenshot("TabDrawerRobot_remove-tab") + } + } + + @Test + fun saveLoginPromptTest() { + val saveLoginTest = + TestAssetHelper.getSaveLoginAsset(mockWebServer) + navigationToolbar { + }.enterURLAndEnterToBrowser(saveLoginTest.url) { + verifySaveLoginPromptIsShownNotSave() + SystemClock.sleep(TestAssetHelper.waitingTimeShort) + Screengrab.screenshot("save-login-prompt") + } + } +} From c52cb4f22779156002a6c2f0728d2de17bf33ae0 Mon Sep 17 00:00:00 2001 From: sarah541 Date: Fri, 30 Jun 2023 12:00:37 -0400 Subject: [PATCH 011/207] Bug 1841274 - Add Param to Nimbus SearchExtraParams --- app/.experimenter.yaml | 24 ++++++++++++------- app/nimbus.fml.yaml | 16 +++++++++---- .../java/org/mozilla/fenix/components/Core.kt | 19 ++++++++------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/app/.experimenter.yaml b/app/.experimenter.yaml index aca712aaf..f0c0b1eef 100644 --- a/app/.experimenter.yaml +++ b/app/.experimenter.yaml @@ -139,25 +139,31 @@ re-engagement-notification: type: type: int description: The type of re-engagement notification that is shown to the inactive user. -search-term-groups: - description: A feature allowing the grouping of URLs around the search term that it came from. +search-extra-params: + description: A feature that provides additional args for search. hasExposure: true exposureDescription: "" variables: + channel-id: + type: json + description: The channel Id param name with arg. enabled: type: boolean - description: "If true, the feature shows up on the homescreen and on the new tab screen." -search_extra_params: - description: A feature that provides a search engine name and a channel ID. + description: "If true, the feature is active." + feature-enabler: + type: json + description: "The feature enabler param name with arg, NOTE this map could be empty." + search-engine: + type: string + description: The search engine name. +search-term-groups: + description: A feature allowing the grouping of URLs around the search term that it came from. hasExposure: true exposureDescription: "" variables: enabled: type: boolean - description: "If true, the feature is active." - search_name_channel_id: - type: json - description: The search engine name and the channel ID. + description: "If true, the feature shows up on the homescreen and on the new tab screen." shopping-experience: description: A feature that shows product review quality information. hasExposure: true diff --git a/app/nimbus.fml.yaml b/app/nimbus.fml.yaml index f5ef65865..dacd4bfc7 100644 --- a/app/nimbus.fml.yaml +++ b/app/nimbus.fml.yaml @@ -342,15 +342,23 @@ features: value: enabled: true - search_extra_params: - description: A feature that provides a search engine name and a channel ID. + search-extra-params: + description: A feature that provides additional args for search. variables: enabled: description: If true, the feature is active. type: Boolean default: false - search_name_channel_id: - description: The search engine name and the channel ID. + search-engine: + description: The search engine name. + type: String + default: "" + feature-enabler: + description: The feature enabler param name with arg, NOTE this map could be empty. + type: Map + default: {} + channel-id: + description: The channel Id param name with arg. type: Map default: {} types: 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 f44d92868..f6d7a2b0d 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -248,6 +248,16 @@ class Core( * The [BrowserStore] holds the global [BrowserState]. */ val store by lazyMonitored { + val searchExtraParamsNimbus = FxNimbus.features.searchExtraParams.value() + val searchExtraParams = searchExtraParamsNimbus.takeIf { it.enabled }?.run { + SearchExtraParams( + searchEngine, + featureEnabler.keys.firstOrNull(), + featureEnabler.values.firstOrNull(), + channelId.keys.first(), + channelId.values.first(), + ) + } val middlewareList = mutableListOf( LastAccessMiddleware(), @@ -262,14 +272,7 @@ class Core( context = context, additionalBundledSearchEngineIds = listOf("reddit", "youtube"), migration = SearchMigration(context), - searchExtraParams = - FxNimbus.features.searchExtraParams.value().searchNameChannelId - .firstNotNullOfOrNull { - SearchExtraParams( - it.key, - it.value, - ) - }, + searchExtraParams = searchExtraParams, ), RecordingDevicesMiddleware(context, context.components.notificationsDelegate), PromptMiddleware(), From 5727cb9d127eeeb9505958cb8c0b0accd887cb61 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 29 Jun 2023 15:51:05 -0700 Subject: [PATCH 012/207] Bug 1841177 - Convert `ContextMenusTest` to support the Tabs Tray rewrite --- .../fenix/helpers/HomeActivityTestRule.kt | 3 +- .../fenix/ui/ComposeContextMenusTest.kt | 302 ++++++++++++++++++ 2 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt index 9f58f3da2..f0848e98b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt @@ -12,13 +12,14 @@ import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.test.espresso.intent.rule.IntentsTestRule import androidx.test.rule.ActivityTestRule import androidx.test.uiautomator.UiSelector +import org.junit.rules.TestRule import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.helpers.FeatureSettingsHelper.Companion.settings import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.onboarding.FenixOnboarding -typealias HomeActivityComposeTestRule = AndroidComposeTestRule +typealias HomeActivityComposeTestRule = AndroidComposeTestRule /** * A [org.junit.Rule] to handle shared test set up for tests on [HomeActivity]. diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt new file mode 100644 index 000000000..60e8390bd --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt @@ -0,0 +1,302 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.core.net.toUri +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText +import org.mozilla.fenix.helpers.MatcherHelper.itemWithText +import org.mozilla.fenix.helpers.RetryTestRule +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.assertYoutubeAppOpens +import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton +import org.mozilla.fenix.ui.robots.clickContextMenuItem +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.downloadRobot +import org.mozilla.fenix.ui.robots.longClickPageObject +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.shareOverlay + +/** + * Tests for verifying basic functionality of content context menus + * + * - Verifies long click "Open link in new tab" UI and functionality + * - Verifies long click "Open link in new Private tab" UI and functionality + * - Verifies long click "Copy Link" UI and functionality + * - Verifies long click "Share Link" UI and functionality + * - Verifies long click "Open image in new tab" UI and functionality + * - Verifies long click "Save Image" UI and functionality + * - Verifies long click "Copy image location" UI and functionality + * - Verifies long click items of mixed hypertext items + * + */ + +class ComposeContextMenusTest { + private lateinit var mDevice: UiDevice + private lateinit var mockWebServer: MockWebServer + + @get:Rule(order = 0) + val composeTestRule = + AndroidComposeTestRule( + HomeActivityIntentTestRule.withDefaultSettingsOverrides( + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Rule(order = 1) + @JvmField + val retryTestRule = RetryTestRule(3) + + @Before + fun setUp() { + composeTestRule.activity.applicationContext.settings().shouldShowJumpBackInCFR = false + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @SmokeTest + @Test + fun verifyContextOpenLinkNewTab() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("Link 1")) + verifyLinkContextMenuItems(genericURL.url) + clickContextMenuItem("Open link in new tab") + verifySnackBarText("New tab opened") + clickSnackbarButton("SWITCH") + verifyUrl(genericURL.url.toString()) + }.openComposeTabDrawer(composeTestRule) { + verifyNormalBrowsingButtonIsSelected() + verifyExistingOpenTabs("Test_Page_1") + verifyExistingOpenTabs("Test_Page_4") + } + } + + @SmokeTest + @Test + fun verifyContextOpenLinkPrivateTab() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("Link 2")) + verifyLinkContextMenuItems(genericURL.url) + clickContextMenuItem("Open link in private tab") + verifySnackBarText("New private tab opened") + clickSnackbarButton("SWITCH") + verifyUrl(genericURL.url.toString()) + }.openComposeTabDrawer(composeTestRule) { + verifyPrivateBrowsingButtonIsSelected() + verifyExistingOpenTabs("Test_Page_2") + } + } + + @Test + fun verifyContextCopyLink() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("Link 3")) + verifyLinkContextMenuItems(genericURL.url) + clickContextMenuItem("Copy link") + verifySnackBarText("Link copied to clipboard") + }.openNavigationToolbar { + }.visitLinkFromClipboard { + verifyUrl(genericURL.url.toString()) + } + } + + @Test + fun verifyContextCopyLinkNotDisplayedAfterApplied() { + val pageLinks = TestAssetHelper.getGenericAsset(mockWebServer, 4) + val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + longClickPageObject(itemWithText("Link 3")) + verifyLinkContextMenuItems(genericURL.url) + clickContextMenuItem("Copy link") + verifySnackBarText("Link copied to clipboard") + }.openNavigationToolbar { + }.visitLinkFromClipboard { + verifyUrl(genericURL.url.toString()) + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + } + navigationToolbar { + verifyClipboardSuggestionsAreDisplayed(shouldBeDisplayed = false) + } + } + + @Test + fun verifyContextShareLink() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("Link 1")) + verifyLinkContextMenuItems(genericURL.url) + clickContextMenuItem("Share link") + shareOverlay { + verifyShareLinkIntent(genericURL.url) + } + } + } + + @Test + fun verifyContextOpenImageNewTab() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val imageResource = + TestAssetHelper.getImageAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("test_link_image")) + verifyLinkImageContextMenuItems(imageResource.url) + clickContextMenuItem("Open image in new tab") + verifySnackBarText("New tab opened") + clickSnackbarButton("SWITCH") + verifyUrl(imageResource.url.toString()) + } + } + + @Test + fun verifyContextCopyImageLocation() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val imageResource = + TestAssetHelper.getImageAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("test_link_image")) + verifyLinkImageContextMenuItems(imageResource.url) + clickContextMenuItem("Copy image location") + verifySnackBarText("Link copied to clipboard") + }.openNavigationToolbar { + }.visitLinkFromClipboard { + verifyUrl(imageResource.url.toString()) + } + } + + @Test + fun verifyContextSaveImage() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val imageResource = + TestAssetHelper.getImageAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("test_link_image")) + verifyLinkImageContextMenuItems(imageResource.url) + clickContextMenuItem("Save image") + } + + downloadRobot { + verifyDownloadNotificationPopup() + }.clickOpen("image/jpeg") {} // verify open intent is matched with associated data type + downloadRobot { + verifyPhotosAppOpens() + } + } + + @Test + fun verifyContextMixedVariations() { + val pageLinks = + TestAssetHelper.getGenericAsset(mockWebServer, 4) + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 1) + val imageResource = + TestAssetHelper.getImageAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(pageLinks.url) { + mDevice.waitForIdle() + longClickPageObject(itemWithText("Link 1")) + verifyLinkContextMenuItems(genericURL.url) + dismissContentContextMenu() + longClickPageObject(itemWithText("test_link_image")) + verifyLinkImageContextMenuItems(imageResource.url) + dismissContentContextMenu() + longClickPageObject(itemWithText("test_no_link_image")) + verifyNoLinkImageContextMenuItems(imageResource.url) + } + } + + @Test + fun verifyContextMixedVariationsInPDFTest() { + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericURL.url) { + clickPageObject(itemWithText("PDF form file")) + waitForPageToLoad() + longClickPageObject(itemWithText("Wikipedia link")) + verifyLinkContextMenuItems("wikipedia.org".toUri(), false) + dismissContentContextMenu() + // Some options are missing from the linked and non liked images context menus in PDF files + // See https://bugzilla.mozilla.org/show_bug.cgi?id=1012805 for more details + longClickPDFImage() + verifyLinkContextMenuItems("wikipedia.org".toUri()) + dismissContentContextMenu() + } + } + + @Test + fun verifyContextOpenLinkInAppTest() { + val defaultWebPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + longClickPageObject(itemContainingText("Youtube link")) + clickContextMenuItem("Open link in external app") + assertYoutubeAppOpens() + } + } +} From d65da96bd003d7faf7308f8f8a7c8f9ba44a7653 Mon Sep 17 00:00:00 2001 From: gitstart Date: Fri, 17 Feb 2023 07:31:21 +0000 Subject: [PATCH 013/207] Bug 1813787 - Hide Add to shortcuts menu entry --- .../org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 21a798069..1c8e2b191 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -71,6 +71,7 @@ open class DefaultToolbarMenu( private val shouldDeleteDataOnQuit = context.settings().shouldDeleteBrowsingDataOnQuit private val shouldUseBottomToolbar = context.settings().shouldUseBottomToolbar + private val shouldShowTopSites = context.settings().showTopSitesFeature private val accountManager = FenixAccountManager(context) private val selectedSession: TabSessionState? @@ -388,7 +389,7 @@ open class DefaultToolbarMenu( BrowserMenuDivider(), addToHomeScreenItem.apply { visible = ::canAddToHomescreen }, installToHomescreen.apply { visible = ::canInstall }, - addRemoveTopSitesItem, + if (shouldShowTopSites) addRemoveTopSitesItem else null, saveToCollectionItem, if (FeatureFlags.print) printPageItem else null, BrowserMenuDivider(), From bbfd236a5190b3822eeb556cf6116a95422ccfb0 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 29 Jun 2023 15:06:44 -0700 Subject: [PATCH 014/207] Bug 1841168 - Convert `MediaNotificationTest` to support Tabs Tray rewrite --- .../fenix/ui/ComposeMediaNotificationTest.kt | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeMediaNotificationTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeMediaNotificationTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeMediaNotificationTest.kt new file mode 100644 index 000000000..c1279f94d --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeMediaNotificationTest.kt @@ -0,0 +1,173 @@ +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.concept.engine.mediasession.MediaSession +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.MatcherHelper +import org.mozilla.fenix.helpers.RetryTestRule +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText +import org.mozilla.fenix.ui.robots.browserScreen +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.notificationShade + +/** + * Tests for verifying basic functionality of media notifications: + * - video and audio playback system notifications appear and can pause/play the media content + * - a media notification icon is displayed on the homescreen for the tab playing media content + * Note: this test only verifies media notifications, not media itself + */ +class ComposeMediaNotificationTest { + private lateinit var mockWebServer: MockWebServer + private lateinit var mDevice: UiDevice + private lateinit var browserStore: BrowserStore + + @get:Rule(order = 0) + val composeTestRule = + AndroidComposeTestRule( + HomeActivityTestRule.withDefaultSettingsOverrides( + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Rule(order = 1) + @JvmField + val retryTestRule = RetryTestRule(3) + + @Before + fun setUp() { + // Initializing this as part of class construction, below the rule would throw a NPE + // So we are initializing this here instead of in all tests. + browserStore = composeTestRule.activity.components.core.store + + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @SmokeTest + @Test + fun videoPlaybackSystemNotificationTest() { + val videoTestPage = TestAssetHelper.getVideoPageAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(videoTestPage.url) { + mDevice.waitForIdle() + clickPageObject(MatcherHelper.itemWithText("Play")) + assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING) + }.openNotificationShade { + verifySystemNotificationExists(videoTestPage.title) + clickMediaNotificationControlButton("Pause") + verifyMediaSystemNotificationButtonState("Play") + } + + mDevice.pressBack() + + browserScreen { + assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED) + }.openComposeTabDrawer(composeTestRule) { + closeTab() + } + + mDevice.openNotification() + + notificationShade { + verifySystemNotificationDoesNotExist(videoTestPage.title) + } + + // close notification shade before the next test + mDevice.pressBack() + } + + @SmokeTest + @Test + fun audioPlaybackSystemNotificationTest() { + val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(audioTestPage.url) { + mDevice.waitForIdle() + clickPageObject(MatcherHelper.itemWithText("Play")) + assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING) + }.openNotificationShade { + verifySystemNotificationExists(audioTestPage.title) + clickMediaNotificationControlButton("Pause") + verifyMediaSystemNotificationButtonState("Play") + } + + mDevice.pressBack() + + browserScreen { + assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED) + }.openComposeTabDrawer(composeTestRule) { + closeTab() + } + + mDevice.openNotification() + + notificationShade { + verifySystemNotificationDoesNotExist(audioTestPage.title) + } + + // close notification shade before the next test + mDevice.pressBack() + } + + @Test + fun mediaSystemNotificationInPrivateModeTest() { + val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) + + homeScreen { + }.openComposeTabDrawer(composeTestRule) { + }.toggleToPrivateTabs { + }.openNewTab { + }.submitQuery(audioTestPage.url.toString()) { + mDevice.waitForIdle() + clickPageObject(MatcherHelper.itemWithText("Play")) + assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING) + }.openNotificationShade { + verifySystemNotificationExists("A site is playing media") + clickMediaNotificationControlButton("Pause") + verifyMediaSystemNotificationButtonState("Play") + } + + mDevice.pressBack() + + browserScreen { + assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED) + }.openComposeTabDrawer(composeTestRule) { + closeTab() + verifySnackBarText("Private tab closed") + } + + mDevice.openNotification() + + notificationShade { + verifySystemNotificationDoesNotExist("A site is playing media") + } + + // close notification shade before and go back to regular mode before the next test + mDevice.pressBack() + homeScreen { }.togglePrivateBrowsingMode() + } +} From 62731219f84000e58bb42132858d9a381f8ed1a0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 6 Jul 2023 00:04:11 +0000 Subject: [PATCH 015/207] Import translations from android-l10n --- app/src/main/res/values-cy/strings.xml | 21 +++-------- app/src/main/res/values-de/strings.xml | 21 +++-------- app/src/main/res/values-es-rAR/strings.xml | 21 +++-------- app/src/main/res/values-iw/strings.xml | 13 +++---- app/src/main/res/values-ko/strings.xml | 21 +++-------- app/src/main/res/values-tg/strings.xml | 2 +- app/src/main/res/values-trs/strings.xml | 43 ++++++++++++++++------ 7 files changed, 57 insertions(+), 85 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 5f3461cdd..9c7a925fd 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -424,18 +424,12 @@ Anfon cais - Cyfyngu Baneri Cwcis - Gwneud cais am gefnogaeth ar gyfer y wefan hon? - Cais i’r wefan cymorth wedi’i gyflwyno. - Cais wedi ei anfon Ymlaen ar gyfer y wefan hon - - Cais am gefnogaeth gwefan wedi’i gyflwyno Cais am gefnogaeth wedi’i anfon @@ -444,8 +438,6 @@ Troi Llai o Faneri Cwcis ymlaen ar %1$s? Diffodd Llai o Faneri Cwcis ar %1$s? - - Nid yw’r wefan hon yn cael ei chefnogi ar hyn o bryd gan Llai o Faneri Cwcis. Hoffech chi ofyn i’n tîm adolygu’r wefan hon ac ychwanegu cefnogaeth yn y dyfodol? Nid yw %1$s yn gallu gwrthod ceisiadau cwcis ar y wefan hon yn awtomatig. Gallwch anfon cais i gefnogi’r wefan hon yn y dyfodol. @@ -552,6 +544,11 @@ Byth Rheolwr llwytho i lawr allanol + + Galluogi logiau Gecko + + Yn gadael y rhaglen er mwyn gosod y newidiadau… + Ychwanegion @@ -1500,12 +1497,8 @@ Gosodiadau Diogelu Diogelwch Uwch Rhag Tracio - - Pori heb gael eich dilyn Nawr yn cynnwys Diogelwch Cwci Llwyr, ein rhwystr mwyaf pwerus eto yn erbyn tracwyr traws-gwefan. - - Cadwch eich data i chi’ch hun. Mae %s yn eich diogelu rhag llawer o’r tracwyr mwyaf cyffredin sy’n eich dilyn ar-lein. Mae %s yn eich diogelu rhag llawer o’r tracwyr mwyaf cyffredin sy’n dilyn yr hyn rydych chi’n ei wneud ar-lein. @@ -1513,16 +1506,12 @@ Safonol (rhagosodedig) - Cydbwysedd rhwng diogelwch a pherfformiad. Bydd tudalennau’n llwytho fel arfer. - Bydd tudalennau’n llwytho fel arfer, ond yn rhwystro llai o dracwyr. Beth sydd wedi’i rwystro gan ddiogelu tracio safonol Llym - Yn rhwystro mwy o dracwyr fel bod tudalennau’n llwytho’n gyflymach, ond gall dorri rhai swyddogaethau ar y dudalen. - Diogelwch tracio cryfach a pherfformiad cyflymach, ond efallai na fydd rhai gwefannau’n gweithio’n iawn. Beth sydd wedi’i rwystro gan ddiogelu tracio llym diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 06f9025b5..f5ce25d87 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -431,18 +431,12 @@ Anfrage senden - Reduzierung von Cookie-Bannern - Unterstützung für diese Website anfordern? - Anfrage an Hilfe-Website übermittelt. - Anfrage gesendet Für diese Website aktiviert - Anfrage an Hilfe-Website übermittelt - Hilfeanfrage gesendet Website derzeit nicht unterstützt @@ -450,8 +444,6 @@ Cookie-Banner-Reduzierung für %1$s aktivieren? Cookie-Banner-Reduzierung für %1$s deaktivieren? - - Diese Website wird derzeit nicht von der Cookie-Banner-Reduktion unterstützt. Soll unser Team diese Website zu überprüfen und in Zukunft Unterstützung hinzuzufügen? %1$s kann Cookie-Anfragen auf dieser Website nicht automatisch ablehnen. Sie können eine Anfrage senden, um diese Website in Zukunft zu unterstützen. @@ -557,6 +549,11 @@ Nie Externer Download-Manager + + Gecko-Protokolle aktivieren + + Beenden der Anwendung, um Änderungen zu übernehmen… + Add-ons @@ -1535,12 +1532,8 @@ Schutzeinstellungen Verbesserter Schutz vor Aktivitätenverfolgung - - Surfen Sie, ohne verfolgt zu werden Jetzt mit Total Cookie Protection, unserer bisher stärksten Barriere gegen website-übergreifendes Tracking. - - Behalten Sie Ihre Daten für sich. %s schützt Sie vor vielen der gängigsten Skripte, die Ihre Online-Aktivitäten verfolgen. %s schützt Sie vor vielen der gängigsten Skripte, die Ihre Online-Aktivitäten verfolgen. @@ -1548,16 +1541,12 @@ Standard - Ausgewogen zwischen Datenschutz und Leistung. Seiten laden normal. - Die Seiten werden normal geladen, aber weniger Tracker blockiert. Was wird durch den Standard-Tracking-Schutz blockiert? Streng - Blockiert weitere Elemente zur Aktivitätenverfolgung, sodass Seiten schneller geladen werden, aber einige Seiten funktionieren dann eventuell nicht richtig. - Stärkerer Tracking-Schutz und schnellere Leistung, aber einige Websites funktionieren möglicherweise nicht richtig. Was wird durch den strengen Tracking-Schutz blockiert? diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 76f2e0e2f..19bf762ef 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -431,18 +431,12 @@ Enviar solicitud - Reducción de mensajes de cookies - ¿Solicitar ayuda para este sitio? - Pedido para soporte del sitio enviado. - Solicitud enviada Habilitada para este sitio - Se envió la solicitud para soportar el sitio - Solicitud de ayuda enviada Sitio actualmente no soportado @@ -450,8 +444,6 @@ ¿Habilitar reducción de mensajes de cookies para %1$s? ¿Deshabilitar reducción de mensajes de cookies para %1$s? - - Este sitio no es compatible actualmente con la reducción de mensajes de cookies. ¿Te gustaría que nuestro equipo revise este sitio web y agregue soporte en el futuro? %1$s no puede rechazar automáticamente las solicitudes de cookies en este sitio. Podés enviar una solicitud para soportar a este sitio en el futuro. @@ -557,6 +549,11 @@ Nunca Administrador de descargas externo + + Habilitar registros de Gecko + + Saliendo de la aplicación para aplicar cambios… + Complementos @@ -1526,12 +1523,8 @@ Ajustes de protección Protección contra rastreo aumentada - - Navegá sin que te sigan Ahora con protección total de cookies, nuestra barrera más poderosa hasta hoy contra rastreadores de sitios cruzados. - - Guardá tus datos sólo para vos. %s te protege de muchos de los rastreadores más comunes que siguen lo que hacés en línea. %s te protege de muchos de los rastreadores más comunes que siguen lo que hacés en línea. @@ -1539,16 +1532,12 @@ Estándar (predeterminado) - Equilibrado para privacidad y rendimiento. Las páginas se cargan normalmente. - Las páginas se van a cargar normalmente, pero bloquean menos rastreadores. Qué es lo que está bloqueado por la protección de rastreo estándar Estricta - Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. - Mayor protección de rastreo y rendimiento más rápido, pero algunos sitios pueden no funcionar correctamente. Qué es lo que está bloqueado por la protección de rastreo estricta diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 9d5366e33..458a07382 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -479,6 +479,11 @@ לעולם לא מנהל הורדות חיצוני + + לאפשר יומני Gecko + + היישום ייסגר לצורך להחלת השינויים… + תוספות @@ -1432,12 +1437,8 @@ הגדרות הגנה הגנת מעקב מתקדמת - - לגלוש מבלי שעוקבים אחריך כעת כולל הגנת עוגיות מלאה, המחסום החזק ביותר שלנו עד כה נגד רכיבי מעקב חוצי אתרים. - - הנתונים שלך נשארים אצלך. %s מגן עליך מפני רוב רכיבי הריגול שעוקבים אחר הפעילות המקוונת שלך. ‏%s מגן עליך מפני רוב רכיבי הריגול שעוקבים אחר הפעילות המקוונת שלך. @@ -1445,16 +1446,12 @@ רגיל (ברירת מחדל) - מאוזן בין פרטיות לביצועים. דפים ייטענו כרגיל. - הדפים ייטענו כרגיל, אך פחות רכיבי מעקב ייחסמו. מה נחסם על־ידי הגנת מעקב רגילה מחמיר - חוסם יותר רכיבי מעקב כדי שדפים ייטענו מהר יותר, אך ייתכן שפונקציונליות בדפים מסויימים לא תעבוד. - הגנת מעקב חזקה יותר וביצועים מהירים יותר, אך מספר אתרים עשויים שלא לעבוד כראוי. מה נחסם על־ידי הגנת מעקב מחמירה diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d25d61208..877f5f471 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -433,18 +433,12 @@ 요청 보내기 - 쿠키 배너 감소 - 이 사이트에 대한 지원을 요청하시겠습니까? - 사이트 지원 요청이 제출되었습니다. - 요청 전송됨 이 사이트에서 켜짐 - 사이트 지원 요청이 제출됨 - 지원 요청 전송됨 현재 지원되지 않는 사이트 @@ -453,8 +447,6 @@ %1$s에 대해 쿠키 배너 감소를 끄시겠습니까? - - 이 사이트는 현재 쿠키 배너 감소가 지원되지 않습니다. 저희 팀이 이 웹 사이트를 검토하고 향후 지원을 추가하기를 원하십니까? %1$s는 이 사이트에서 쿠키 요청을 자동으로 거부할 수 없습니다. 나중에 이 사이트를 지원하도록 요청을 보낼 수 있습니다. @@ -561,6 +553,11 @@ 안 함 외부 다운로드 관리자 + + Gecko 로그 활성화 + + 변경 사항을 적용하기 위해 애플리케이션을 종료하는 중… + 부가 기능 @@ -1547,12 +1544,8 @@ 보호 설정 향상된 추적 방지 기능 - - 브라우저 추적 차단하기 이제 크로스 사이트 추적기에 대한 우리의 가장 강력한 기능인 전체 쿠키 보호 기능을 제공합니다. - - 자신의 데이터를 보호하세요. %s는 온라인에서 하는 일을 추적하는 가장 일반적인 많은 추적기로부터 사용자를 보호합니다. %s는 온라인 활동을 추적하는 가장 일반적인 여러 추적기로부터 사용자를 보호합니다. @@ -1560,16 +1553,12 @@ 표준 (기본값) - 개인 정보 보호와 성능사이의 균형이 잡혀 있습니다. 페이지가 정상적으로 로드됩니다. - 페이지는 정상적으로 로드되지만, 더 적은 추적기를 차단합니다. 표준 추적 방지 기능에 의해 차단된 것 엄격 - 더 많은 추적기를 차단하여 페이지가 더 빨리 로드되지만, 일부 페이지의 기능이 손상될 수 있습니다. - 더 강력한 추적 방지 기능과 더 빠른 성능을 사용하지만, 일부 사이트는 제대로 동작하지 않을 수 있습니다. 엄격 추적 방지 기능에 의해 차단된 것 diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 86ce051d1..9f138d414 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -741,7 +741,7 @@ - Барон нав кардан кашед + Барои нав кардан кашед Барои пинҳон кардани навори абзорҳо ҳаракат кунед diff --git a/app/src/main/res/values-trs/strings.xml b/app/src/main/res/values-trs/strings.xml index d188f7426..0f8c91dfc 100644 --- a/app/src/main/res/values-trs/strings.xml +++ b/app/src/main/res/values-trs/strings.xml @@ -429,18 +429,12 @@ Gā’nïnj si nùguàn’t gān’an - Nādugua\' si Banêr Kôki - Gāchìnj nan’ānj doj sa huā rayi’î sitiô nan ân. - Ngà ga’nïn sa gachín nī’hiát gan’ānj. - Ngà gan’ānj si nūguàn’t Huā nî’nïn guendâ sitiô nan - Ngà ga’nïn sa gachín nī’hiát gan’ānj - Ngà gan\’ānj si nūguàn\’t sa nutâ\'t Huā sa gāchin da’ gā’hue nāyi’nïn sitiô nan @@ -448,8 +442,6 @@ Nachrūn sa nadugua’ nej si banêr nej kôki guendâ %1$s aj. Dūnâ’àjt sa nadugua’ nej si banêr nej kôki guendâ %1$s aj - - Akuan’ nï̄, nitāj si â’nï̀nj sitiô nan da’ nāgà’ si banêr nej kôki. Ruhuât gāchìnj nīhiát da’ nātsij ñûnj sitiô nan nī gā’nïn ñûnj nej sa gàchin nan ne’ rūkù doj aj. %1$s na’hue gūxunj nej nuguan’ achín nì’hiaj nej kôki riña sitiô nan. Gā’hue gā’nïnjt ‘ngō nuguan’an riña sa nikāj ñu’ūnj sitiô nan. @@ -555,6 +547,11 @@ Nitāj āmān Sa ni’hiāj rayi’î nej sa nanïnj ânèj e + + Nāchrūn riña nāgimàn nej si dā’nga Gecko + + Gāhuī riña aplikasiûn nan da’ gā’hue nātū sa nākàa… + Sa gā\'ue nūtò\' @@ -1400,6 +1397,10 @@ Diû gāchīn da’ gā’hue nārè’ej + + Nādure’ riña ‘na’ nej sa gini’hiājt (ndà nej sa nagi’hiaj nūguan’ànt ngà a’ngô aga’a), nej kôki nī a’ngô nej sa huā ngà aché nunt. + + Nādure’ riña ‘na’ nej sa gini’hiājt (ndà nej sa nagi’hiaj nūguan’ànt ngà a’ngô aga’a) Sa gahuin akuan\' @@ -1435,31 +1436,47 @@ Guendâ guìi gurugui’ sa nana’hui’ nan, sê guendâ gīrij san’ānj an huin man. Nakāj danè’ gudunâjt + + Nāgi’hiaj nūguan’àn nej rakïj ñanj nī nej da’nga’ huì huā riña nej si āgâ’t da’ gā’hue nādunāt pāntâya. Gāyi\'ì sēsiûn Ngà nanûn Sync Sa ‘na’ niñā da’ dūgumîn sò’ da’ gāchē nun huìt + + Rugûñu’ūnj %1$s narán man riña nej hue’ yīru’hue nikò’ sò’ riña web. + + Nīka nej san arán riña nej kôki da’ nāran riña nej kôki gā’hue nāga’nāj sò’ riña nej sîtio. Sa huā chre\' (dàj huaj \'naj) + + Nda hue\'ê chre huaj da\' gī\hiaj sunj nī dūguminj da\’ gāchē nun huìt. Nej pâjina nī nayi\'nïn riña man dàj rû\' \'hiaj yitïn. Sa nùkuaj doj + + Naran riña nej sa naga’nāj a da’ nāyi’nï̄n hìo doj riña nej pâjina, sanī huā da’āj nej suun gā’hue gāhui a’nan’. Nānà’huì’ riña ginun dukuá ‘na’ nej rasūun Dūnâj man ginùn man ne’ rīki asi dūguachîn man gān’an ne’ ràa. Sò’ ni’in dàj gī’hiaj sunt ngà nej si datôt + + Narikî Firefox da’ gi’nï̄nj ra’ât nej sa duyingâ’t riña aché nunt nī nej sa duyingâ’t ngà nej ñûnj. Gahiā sa atāj na\'ānj ñûnj guendâ sa huìi + + Ngà huā yūguît da’ gāyi’ìt gī’hiaj sunt ngà ‘ngō internet nākàa bè’ej. Gāyi\'ì gāchē nunt Nāguī si temât + + Dūgumî dòj ña\'an arâj sun si āgâ\'t ngà rune ñant si nāchrūnt gā rūmī\' riña si āgâ\'t. Sa nañû ma\'an @@ -1490,6 +1507,8 @@ Gāyì\'ì sēsiûn ngà si kamarât Gārāsun si kōrreôt si lūgaj + + gīrī ‘ngòj a da’ nāgi’hiaj nūguan’ànt man ngà a’ngô nej si āgâ’t.]]> Dūnâj %s si nāgi\'iaj nūguàn\'anj si kuentât, sanī si dure\'ej nej datô râj sunt ngà aché nunt riña aga\' nan. @@ -1505,10 +1524,10 @@ Riña gā\'ue nāgi\'iát riña sa dugumî sò\' Sa huā hue\'ê doj guendâ nārán riña sa naga\'nāj a - - Nitāj gà\' \'ngō ganikò\' sò\' si gāchē nunt - - Duguminj nej si datôt. %s naran rayi\'ît riña nej sa naga\'nāj sa \'iát nga aché nunt. + + Ngà Total Cookie Protection hìaj, ‘ngō sa rugûñu’ūnj hīa sò’ da’ nārán man riña nej sa naga’nāj ahui riña nej sitio. + + %s naran rayi\'ît riña nej sa naga\'nāj sa \'iát nga aché nunt. Gāhuin chrūn doj From d603f84d287f96bfe383a59a1bdac42f60c12250 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 28 Jun 2023 14:33:38 +0300 Subject: [PATCH 016/207] Bug 1840561 - Fix and refactor verifyLoginWithoutPasswordCanNotBeSavedTest UI test --- .../java/org/mozilla/fenix/ui/LoginsTest.kt | 12 +++++++----- ...ingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt | 13 +++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt index e28ae05f6..d8ff4895f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt @@ -344,7 +344,7 @@ class LoginsTest { } @Test - fun verifyLoginWithNoUserNameCanBeSavedTest() { + fun verifyLoginWithNoUserNameCanNotBeSavedTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" val originWebsite = "mozilla-mobile.github.io" @@ -365,12 +365,13 @@ class LoginsTest { clickThreeDotButton(activityTestRule) clickEditLoginButton() clickClearUserNameButton() - saveEditedLogin() - verifyLoginItemUsername("") + verifyUserNameRequiredErrorMessage() + verifySaveLoginButtonIsEnabled(false) + clickGoBackButton() + verifyLoginItemUsername("mozilla") } } - @Ignore("https://bugzilla.mozilla.org/show_bug.cgi?id=1840561") @Test fun verifyLoginWithoutPasswordCanNotBeSavedTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" @@ -394,7 +395,8 @@ class LoginsTest { clickEditLoginButton() clickClearPasswordButton() verifyPasswordRequiredErrorMessage() - saveEditedLogin() + verifySaveLoginButtonIsEnabled(false) + clickGoBackButton() revealPassword() verifyPasswordSaved("firefox") } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt index 38e5dcb22..230d475ec 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt @@ -23,6 +23,8 @@ import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers.containsString import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.MatcherHelper.assertItemContainingTextExists @@ -156,11 +158,22 @@ class SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot { fun saveEditedLogin() = itemWithResId("$packageName:id/save_login_button").click() + fun verifySaveLoginButtonIsEnabled(isEnabled: Boolean) { + if (isEnabled) { + assertTrue(itemWithResId("$packageName:id/save_login_button").isChecked) + } else { + assertFalse(itemWithResId("$packageName:id/save_login_button").isChecked) + } + } + fun revealPassword() = onView(withId(R.id.revealPasswordButton)).click() fun verifyPasswordSaved(password: String) = onView(withId(R.id.passwordText)).check(matches(withText(password))) + fun verifyUserNameRequiredErrorMessage() = + assertItemContainingTextExists(itemContainingText(getStringResource(R.string.saved_login_username_required))) + fun verifyPasswordRequiredErrorMessage() = assertItemContainingTextExists(itemContainingText(getStringResource(R.string.saved_login_password_required))) From 158029070d6eb7ae3a42992a5fbbc5e93a69dc5d Mon Sep 17 00:00:00 2001 From: "alexandra.virvara" Date: Fri, 30 Jun 2023 13:53:38 +0300 Subject: [PATCH 017/207] Bug 1837986 - the number of the normal tabs has visual defects --- .../mozilla/fenix/tabstray/TabsTrayBanner.kt | 77 +++++++++++++++---- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt index 881602321..283c9d4d4 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt @@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.IconButton -import androidx.compose.material.LocalContentColor import androidx.compose.material.Tab import androidx.compose.material.TabRow import androidx.compose.material.Text @@ -42,6 +41,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import mozilla.components.browser.state.state.ContentState @@ -172,8 +172,9 @@ private fun SingleSelectBanner( contentColor = selectedColor, divider = {}, ) { + val isNormalTabsPageSelected = selectedPage == Page.NormalTabs Tab( - selected = selectedPage == Page.NormalTabs, + selected = isNormalTabsPageSelected, onClick = { onTabPageIndicatorClicked(Page.NormalTabs) }, modifier = Modifier .fillMaxHeight() @@ -181,7 +182,7 @@ private fun SingleSelectBanner( selectedContentColor = selectedColor, unselectedContentColor = inactiveColor, ) { - NormalTabsTabIcon(normalTabCount = normalTabCount) + NormalTabsTabIcon(normalTabCount = normalTabCount, selected = isNormalTabsPageSelected) } Tab( @@ -325,21 +326,64 @@ private fun generateSingleSelectBannerMenuItems( } } +private const val MAX_VISIBLE_TABS = 99 +private const val SO_MANY_TABS_OPEN = "∞" +private val NORMAL_TABS_BOTTOM_PADDING = 0.5.dp +private const val ONE_DIGIT_SIZE_RATIO = 0.5f +private const val TWO_DIGITS_SIZE_RATIO = 0.4f + @Composable -private fun NormalTabsTabIcon(normalTabCount: Int) { +@Suppress("MagicNumber") +private fun NormalTabsTabIcon(normalTabCount: Int, selected: Boolean) { val normalTabCountText: String - val normalTabCountTextModifier: Modifier - if (normalTabCount > TabCounter.MAX_VISIBLE_TABS) { - normalTabCountText = TabCounter.SO_MANY_TABS_OPEN - normalTabCountTextModifier = Modifier.padding(bottom = 1.dp) - } else { - normalTabCountText = normalTabCount.toString() - normalTabCountTextModifier = Modifier + val tabCountTextRatio: Float + val needsBottomPaddingForInfiniteTabs: Boolean + + when (normalTabCount) { + in 0..9 -> { + normalTabCountText = normalTabCount.toString() + tabCountTextRatio = ONE_DIGIT_SIZE_RATIO + needsBottomPaddingForInfiniteTabs = false + } + + in 10..MAX_VISIBLE_TABS -> { + normalTabCountText = normalTabCount.toString() + tabCountTextRatio = TWO_DIGITS_SIZE_RATIO + needsBottomPaddingForInfiniteTabs = false + } + + else -> { + normalTabCountText = SO_MANY_TABS_OPEN + tabCountTextRatio = ONE_DIGIT_SIZE_RATIO + needsBottomPaddingForInfiniteTabs = true + } } + val normalTabsContentDescription = if (normalTabCount == 1) { stringResource(id = R.string.mozac_tab_counter_open_tab_tray_single) } else { - stringResource(id = R.string.mozac_tab_counter_open_tab_tray_plural, normalTabCount.toString()) + stringResource( + id = R.string.mozac_tab_counter_open_tab_tray_plural, + normalTabCount.toString(), + ) + } + + val counterBoxWidthDp = + dimensionResource(id = mozilla.components.ui.tabcounter.R.dimen.mozac_tab_counter_box_width_height) + val counterBoxWidthPx = LocalDensity.current.run { counterBoxWidthDp.roundToPx() } + val counterTabsTextSize = (tabCountTextRatio * counterBoxWidthPx).toInt() + + val normalTabsCountTextColor = if (selected) { + FirefoxTheme.colors.iconActive + } else { + FirefoxTheme.colors.iconPrimaryInactive + } + + val normalTabsTextModifier = if (needsBottomPaddingForInfiniteTabs) { + val bottomPadding = with(LocalDensity.current) { counterTabsTextSize.toDp() / 4 } + Modifier.padding(bottom = bottomPadding) + } else { + Modifier.padding(bottom = NORMAL_TABS_BOTTOM_PADDING) } Box( @@ -347,21 +391,22 @@ private fun NormalTabsTabIcon(normalTabCount: Int) { .semantics(mergeDescendants = true) { testTag = TabsTrayTestTag.normalTabsCounter }, + contentAlignment = Alignment.Center, ) { Icon( painter = painterResource( id = mozilla.components.ui.tabcounter.R.drawable.mozac_ui_tabcounter_box, ), contentDescription = normalTabsContentDescription, - modifier = Modifier.align(Alignment.Center), ) Text( text = normalTabCountText, - modifier = normalTabCountTextModifier.align(Alignment.Center), - color = LocalContentColor.current, - fontSize = with(LocalDensity.current) { 12.dp.toSp() }, + modifier = normalTabsTextModifier, + color = normalTabsCountTextColor, + fontSize = with(LocalDensity.current) { counterTabsTextSize.toDp().toSp() }, fontWeight = FontWeight.W700, + textAlign = TextAlign.Center, ) } } From 0c4947c08bb3ec6fd2d1fd687721e5f0b840ef3b Mon Sep 17 00:00:00 2001 From: James Hugman Date: Fri, 30 Jun 2023 18:07:45 +0100 Subject: [PATCH 018/207] =?UTF-8?q?Bug=201841262=20=E2=80=94=20Add=20coenr?= =?UTF-8?q?olling=20features=20to=20NimbusBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit refactors the android-components implementations of `NimbusBuilder` and `Nimbus` to accommodate the new `getCoenrollingFeatureIds()` API. This API is internal to Application Services, but needs to be passed in via the constructor of the Nimbus object. --- .../mozilla/fenix/experiments/NimbusSetup.kt | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt index d7b24c15e..a9b7f6745 100644 --- a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt +++ b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt @@ -8,7 +8,6 @@ import android.content.Context import mozilla.components.service.nimbus.NimbusApi import mozilla.components.service.nimbus.NimbusAppInfo import mozilla.components.service.nimbus.NimbusBuilder -import mozilla.components.service.nimbus.loggingErrorReporter import mozilla.components.service.nimbus.messaging.FxNimbusMessaging import mozilla.components.service.nimbus.messaging.NimbusSystem import mozilla.components.support.base.log.logger.Logger @@ -30,6 +29,8 @@ import org.mozilla.fenix.utils.Settings */ private const val TIME_OUT_LOADING_EXPERIMENT_FROM_DISK_MS = 200L +private val logger = Logger("service/Nimbus") + /** * Create the Nimbus singleton object for the Fenix app. */ @@ -59,35 +60,32 @@ fun createNimbus(context: Context, urlString: String?): NimbusApi { return NimbusBuilder(context).apply { url = urlString - errorReporter = { message, e -> - if (BuildConfig.BUILD_TYPE == "debug") { - Logger.error("Nimbus error: $message", e) - } - if (e !is NimbusException || e.isReportableError()) { - @Suppress("TooGenericExceptionCaught") - try { - context.components.analytics.crashReporter.submitCaughtException(e) - } catch (e: Throwable) { - loggingErrorReporter(message, e) - } - } - } + errorReporter = context::reportError initialExperiments = R.raw.initial_experiments timeoutLoadingExperiment = TIME_OUT_LOADING_EXPERIMENT_FROM_DISK_MS usePreviewCollection = context.settings().nimbusUsePreview isFirstRun = isAppFirstRun - onCreateCallback = { nimbus -> - FxNimbus.initialize { nimbus } - } - onApplyCallback = { - FxNimbus.invalidateCachedValues() - } - onFetchedCallback = { + featureManifest = FxNimbus + onFetchCallback = { context.settings().nimbusExperimentsFetched = true } }.build(appInfo) } +private fun Context.reportError(message: String, e: Throwable) { + if (BuildConfig.BUILD_TYPE == "debug") { + logger.error("Nimbus error: $message", e) + } + if (e !is NimbusException || e.isReportableError()) { + @Suppress("TooGenericExceptionCaught") + try { + this.components.analytics.crashReporter.submitCaughtException(e) + } catch (e: Throwable) { + logger.error(message, e) + } + } +} + /** * Classifies which errors we should forward to our crash reporter or not. We want to filter out the * non-reportable ones if we know there is no reasonable action that we can perform. From ed2368a090dbfec10a09b8c0ed553adb80c3e549 Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Tue, 4 Jul 2023 11:09:51 -0400 Subject: [PATCH 019/207] Bug 1841361 - Add extra logs to the "Setting enable Gecko" logs. --- app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt b/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt index ccfd4cfa2..acf09af39 100644 --- a/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt @@ -56,6 +56,7 @@ object GeckoProvider { .crashHandler(CrashHandlerService::class.java) .telemetryDelegate(GeckoAdapter()) .contentBlocking(policy.toContentBlockingSetting()) + .consoleOutput(context.components.settings.enableGeckoLogs) .debugLogging(Config.channel.isDebug || context.components.settings.enableGeckoLogs) .aboutConfigEnabled(Config.channel.isBeta || Config.channel.isNightlyOrDebug) .build() From b01b55d19e20c919e7bbdf8e5d8acddf7d1d7a4a Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Mon, 26 Jun 2023 12:47:27 -0700 Subject: [PATCH 020/207] Bug 1839977 - Update architecture overview documentation. --- docs/architecture-overview.md | 192 ++++++++++++++++++---------------- 1 file changed, 100 insertions(+), 92 deletions(-) diff --git a/docs/architecture-overview.md b/docs/architecture-overview.md index b97acc6be..9fc12419d 100644 --- a/docs/architecture-overview.md +++ b/docs/architecture-overview.md @@ -2,145 +2,116 @@ ### Unidirectional data flow -Firefox Preview's presentation layer architecture is based on the concept of "unidirectional data flow." This is a popular approach in client side development, especially on the web, and is core to Redux, MVI, Elm Architecture, and Flux. Our architecture is not identical to any of these (and they are not identical to each other), but the base concepts are the same. For a basic understanding of the motivations and approach, see [the official Redux docs](https://redux.js.org/basics/data-flow). For an article on when unidirectional data flow is and is not a good approach, see [this](https://medium.com/swlh/the-case-for-flux-379b7d1982c6). These are both written from the perspective of React.js developers, but the concepts are largely the same. +Firefox for Android's presentation layer architecture is based on the concept of "unidirectional data flow." This is a popular approach in client side development, especially on the web, and is core to Redux, MVI, Elm Architecture, and Flux. Our architecture is not identical to any of these (and they are not identical to each other), but the base concepts are the same. For a basic understanding of the motivations and approach, see [the official Redux docs](https://redux.js.org/basics/data-flow). For an article on when unidirectional data flow is and is not a good approach, see [this](https://medium.com/swlh/the-case-for-flux-379b7d1982c6). These are both written from the perspective of React.js developers, but the concepts are largely the same. -Our largest deviation from these architectures is that while they each recommend one large, global store of data, we have a single store per screen. This carries both benefits and drawbacks, both of which will be covered later in this document. +Our largest deviation from these architectures is that while they each recommend one large, global store of data, we have a single store per screen and several other global stores. This carries both benefits and drawbacks, which will be covered later in this document. -### Important objects +### Important types -### Store -#### Overview -A store of state - -See [mozilla.components.lib.state.Store](https://github.com/mozilla-mobile/android-components/blob/main/components/lib/state/src/main/java/mozilla/components/lib/state/Store.kt) - -Pushes changes to: [View](#view) - -Receives [Actions](#action) from: [Controller](#controller) - -#### Description -Maintains a [State](#state) object and a [Reducer](#reducer). Whenever the Store receives a new [Action](#action) via `store.dispatch(action)`, it calls the [Reducer](#reducer) with the previous state and the new action. The result is then stored as the new State, and published to all consumers of the store. +### Store -It is recommended that consumers rely as much as possible on `consumeFrom(store)`, rather than querying `store.state`. `consumeBy` is called any time state is updated, ensuring that the most up to date data is always used. This can prevent subtle bugs around call order, as all observers are notified of the same state change before a new change is applied. +#### **Overview** -Note that there is one Store for any given screen, and only one will be active at any given time. Stores are persisted across configuration changes, but created and destroyed during fragment transactions. This means that data that must be shared across Stores must be passed as arguments to the new fragment. +A store of State. -Stores should be created using [StoreProvider#get](https://github.com/mozilla-mobile/fenix/blob/main/app/src/main/java/org/mozilla/fenix/components/StoreProvider.kt). +See [mozilla.components.lib.state.Store](https://github.com/mozilla-mobile/firefox-android/blob/main/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/Store.kt) -------- +Holds app State. -### Action -#### Overview -Simple description of a state change +Receives [Actions](#action), which are used to compute new State using [Reducers](#reducer) and can have [Middlewares](#middleware) attached which respond to and manipulate actions. -See [mozilla.components.lib.state.Action](https://github.com/mozilla-mobile/android-components/blob/main/components/lib/state/src/main/java/mozilla/components/lib/state/Action.kt) +#### **Description** +Maintains a [State](#state), a [Reducer](#reducer) to compute new State, and [Middleware](#middleware). Whenever the Store receives a new [Action](#action) via `store.dispatch(action)`, it will first pass the action through its chain of [Middleware](#middleware). These middleware can initiate side-effects in response, or even consume or change the action. Finally, the Store computes new State using previous State and the new action in the [Reducer](#reducer). The result is then stored as the new State, and published to all consumers of the store. -Created by: [Controller](#controller) +It is recommended that consumers rely as much as possible on observing State updates from the store instead of reading State directly. This ensures that the most up to date State is always used. This can prevent subtle bugs around call order, as all observers are notified of the same State change before a new change is applied. -Is pushed to: [Store](#store) +There are several global stores like `AppStore` and `BrowserStore`, as well as Stores scoped to individual screens. Screen-based Stores can be persisted across configuration changes, but are generally created and destroyed during fragment transactions. This means that data that must be shared across Stores should be lifted to a global Store or should be passed as arguments to the new fragment. -#### Description -Simple data object that carries information about a [State](#state) change to a [Store](#store). An Action describes _something that happened_, and carries any data relevant to that change. For example, `AccountSettingsFragmentAction.SyncFailed(val time: Long)`, which describes a sync that failed at a specific time. +Screen-based Stores should be created using [StoreProvider.get](https://github.com/mozilla-mobile/firefox-android/blob/main/fenix/app/src/main/java/org/mozilla/fenix/components/StoreProvider.kt). ------- -### State -#### Overview -Description of the state of a screen - -See [mozilla.components.lib.state.State](https://github.com/mozilla-mobile/android-components/blob/main/components/lib/state/src/main/java/mozilla/components/lib/state/State.kt) +### State +#### **Overview** +Description of the state of a screen or other area of the app. -Referenced by: [Store](#store) +See [mozilla.components.lib.state.State](https://github.com/mozilla-mobile/firefox-android/blob/main/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/State.kt) -#### Description -Simple, immutable data object that contains all of the backing data required to display a screen. This does not include style details like colors and view sizes, which are handled by the [View](#view). +#### **Description** +Simple, immutable data object that contains all of the backing data required to display a screen. This should ideally only include Kotlin/Java data types which can be easily tested, avoiding Android platform types. This is especially true of large, expensive types like `Context` or `View` which should never be included in State. As much as possible, the State object should be an accurate, 1:1 representation of what is actually shown on the screen. That is to say, the screen should look exactly the same any time a State with the same values is emitted, regardless of any previous changes. This is not always possible as Android UI elements are very stateful, but it is a good goal to aim for. One major benefit of rendering a screen based on a State object is its impact on testing. UI tests are notoriously difficult to build and maintain. If we are able to build a simple, reproducible [View](#view) (i.e., if we can trust that the View will render as expected), that allows us to test our UI by verifying the correctness of our State object. -This also gives us a major advantage when debugging. If the UI looks wrong, check the State object. If it's correct, the problem is in the View binding. If not, check that the correct [Action](#action) was sent. If so, the problem is in the reducer. If not, check the [Controller](#controller) that sent the Action. This helps us quickly narrow down problems. +This also gives us a major advantage when debugging. If the UI looks wrong, check the State object. If it's correct, the problem is in the View. If not, check that the correct [Action](#action) was sent. If so, the problem is in the reducer. If not, check the component that sent the Action. This helps us quickly narrow down problems. ------- -### Reducer -#### Overview -Pure function used to create new [State](#state) objects - -See [mozilla.components.lib.state.Reducer](https://github.com/mozilla-mobile/android-components/blob/main/components/lib/state/src/main/java/mozilla/components/lib/state/Store.kt) +### Action +#### **Overview** +Simple description of a State change or a user interaction. Dispatched to Stores. -Referenced by: [Store](#store) - -#### Description -A function that accepts the previous State and an [Action](#action), then combines them in order to return the new State. It is important that all Reducers remain [pure](https://en.wikipedia.org/wiki/Pure_function). This allows us to test Reducers based only on their inputs, without requiring that we take into account the state of the rest of the app. +See [mozilla.components.lib.state.Action](https://github.com/mozilla-mobile/firefox-android/blob/main/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/Action.kt) -Note that the Reducer is always called serially, as state could be lost if it were ever executed in parallel. +#### **Description** +Simple data object that carries information about a [State](#state) change to a [Store](#store). An Action describes _something that happened_, and carries any data relevant to that change. For example, `HistoryFragmentAction.ChangeEmptyState(isEmpty = true)`, captures that the State of the history fragment has become empty. ------- -### Interactor -#### Overview -Called in response to a direct user action. Delegates to something else +### Reducer +#### **Overview** +Pure function used to create new [State](#state) objects. -Called by: [View](#view) +See [mozilla.components.lib.state.Reducer](https://github.com/mozilla-mobile/firefox-android/blob/main/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/Reducer.kt) -Calls: [Controllers](#controller), other Interactors - -#### Description -This is the first object called whenever the user performs an action. Typically this will result in code in the [View](#view) that looks something like `some_button.onClickListener { interactor.onSomeButtonClicked() } `. It is the Interactors job to delegate this button click to whichever object should handle it. - -Interactors may hold references to multiple other Interactors and Controllers, in which case they delegate specific methods to their appropriate handlers. This helps prevent bloated Controllers that both perform logic and delegate to other objects. +Referenced by: [Store](#store) -Sometimes an Interactor will only reference a single Controller. In these cases, the Interactor will simply forward calls to equivalent calls on the Controller. The Interactor does very little in these cases, and exists only to be consistent with the rest of the app. +#### **Description** +A function that accepts the previous State and an [Action](#action), then combines them in order to return the new State. It is important that all Reducers remain [pure](https://en.wikipedia.org/wiki/Pure_function). This allows us to test Reducers based only on their inputs, without requiring that we take into account the state of the rest of the app. -Note that prior to the introduction of Controllers, Interactors handled the responsibilities of both objects. **You may still find this pattern in some parts of the codebase,** but it is being actively refactored out. +Note that the Reducer is always called serially, as state could be lost if it were ever executed in parallel. ------- -### Controller -#### Overview -Determines how the app should be updated whenever something happens +### Middleware +#### **Overview** +A Middleware sits between the store and the reducer. It provides an extension point between dispatching an action, and the moment it reaches the reducer. -Called by: [Interactor](#interactor) +#### **Description** -Calls: [Store](#store), library code (e.g., forward a back-press to Android, trigger an FxA login, navigate to a new Fragment, use an Android Components UseCase, etc) +A Middleware responds to actions by performing side-effects, and can also be used to rewrite an Action, intercept an Action, or dispatch additional Actions. -#### Description -This is where much of the business logic of the app lives. Whenever called by an Interactor, a Controller will do one of the three following things: -- Create a new [Action](#action) that describes the necessary change, and send it to the Store -- Navigate to a new fragment via the NavController. Optionally include any state necessary to create this new fragment -- Interact with some third party manager. Typically these will update their own internal state and then emit changes to an observer, which will be used to update our Store - -Controllers can become very complex, and should be unit tested thoroughly whenever their methods do more than delegate simple calls to other objects. +The Store will create a chain of Middleware instances and invoke them in order. Every Middleware can decide to continue the chain or disrupt the chain. A Middleware has no knowledge of what comes before or after it in the chain. ------- -### View -#### Overview +### View +#### **Overview** Initializes UI elements, then updates them in response to [State](#state) changes Observes: [Store](#store) -Calls: [Interactor](#interactor) +#### **Description** +The view defines the mapping of State to UI. This can include XML bindings, Composables, or anything in between. -#### Description -The view defines the mapping of State to UI. This includes initial setup of Views, and also typically includes an `update(state)` function that is called whenever State is changed. +Views should be as dumb as possible, and should include little or no conditional logic outside of determining which branch of a view tree to display based on State. Ideally, each primitive value in a State object is set on some field of a UI element. -Views should be as dumb as possible, and should include little or no conditional logic. Ideally, each primitive value in a State object is set on some field of a UI element, with no other logic included. +Views set listeners to UI elements, which trigger dispatches of [Actions](#action) to [Stores](#store). -Views set listeners on to UI elements, which trigger calls to one or more Interactors. +In some cases, it can be appropriate to initiate side-effects from the view when observing State updates from the Store. For example, a menu might be displayed. ------- ## Important notes -- Unlike other common implementations of unidirectional data flow, which typically have one global Store of data, we maintain a smaller Store for each screen. -- Stores and their State are persisted across configuration changes via an Architecture Components ViewModel. -- Whenever a fragment newly created or finished (by the ViewModel definition), its Store will also be created/destroyed -- Communication between Stores only happens by loading the appropriate data into arguments for the new fragment, which uses them to construct the initial state of the new Store. - - We currently violate this in a few places, but are actively refactoring out those violations +- Unlike other common implementations of unidirectional data flow, which typically have one global Store of data, we maintain smaller Stores for each screen and several global Stores. + - There is often no need to maintain UI state for views that are destroyed, and this allows us to to operate within the physical hardware constraints presented by Android development, such as having more limited memory resources. +- Stores that are local to a feature or screen should usually be persisted across configuration changes in a ViewModel by using [StoreProvider.get](https://github.com/mozilla-mobile/firefox-android/blob/main/fenix/app/src/main/java/org/mozilla/fenix/components/StoreProvider.kt). + +------- ## Simplified Example -When reading through live code trying to understand an architecture, it can be difficult to find canonical examples, and often hard to locate the most important aspects. This is a simplified example using a hypothetical app that should help clarify the above patterns. These patterns are overkill for the problems being solved, but keep in mind that the example is deliberately simplified. +When reading through live code trying to understand an architecture, it can be difficult to find canonical examples, and often hard to locate the most important aspects. This is a simplified example using a hypothetical app that should help clarify the above patterns. ![example app wireframe](./architectureexample/example-app-wireframe.png?raw=true) @@ -151,19 +122,56 @@ This app currently has three (wonderful) features. These link to the architectural code that accomplishes those features: - [ContactsView](./architectureexample/ContactsView.kt) -- [ContactsInteractor](./architectureexample/ContactsInteractor.kt) -- [ContactsController](./architectureexample/ContactsController.kt) -- [ThemeController](./architectureexample/ThemeController.kt) - [ContactsStore](./architectureexample/ContactsStore.kt) - [ContactsState](./architectureexample/ContactsStore.kt) - [ContactsReducer](./architectureexample/ContactsStore.kt) - [ContactsFragment](./architectureexample/ContactsFragment.kt) -## Known Limitations -There are a few known edge cases and potential problems with our architecture, that in certain circumstances can be confusing. +------- + +## Historical architecture components +There are some out-of-date architecture components that may still be seen throughout the app. The original documentation for these components is captured below in order to preserve context, but should be removed once these components are refactored out. -- Since [Stores](#store) live at the fragment level, our architecture does not define any way to set data outside of that scope. - - For example, if it is determined during application startup that we need to run in private mode, it must eventually be passed to a fragment, but we don't specify how it will be handled until that point. - - We have no defined way to set values shared by all fragments. They must either be passed as an argument to every individual fragment, or use some system outside of our architecture (e.g., by accessing SharedPreferences). -- There isn't always a clear logical distinction between what should provoke a state change (by dispatching an [Action](#action) to a [Store](#store)), and what should start a new fragment. Passing arguments while creating a new fragment causes changes to the new [State](#state) object, while taking a very different code path than the rest of our app would. +For more context on when and why these components were removed, see [the RFC proposing their removal](https://github.com/mozilla-mobile/firefox-android/pull/1466). + +### Known Limitations (of historical components, copied from above) - Many [Interactors](#interactor) have only one dependency, on a single [Controller](#controller). In these cases, they typically just forward each method call on and serve as a largely unnecessary layer. They do, however, 1) maintain consistency with the rest of the architecture, and 2) make it easier to add new Controllers in the future. + +------- + +### Interactor +#### Overview +Called in response to a direct user action. Delegates to something else + +Called by: [View](#view) + +Calls: [Controllers](#controller), other Interactors + +#### Description +This is the first object called whenever the user performs an action. Typically this will result in code in the [View](#view) that looks something like `some_button.onClickListener { interactor.onSomeButtonClicked() } `. It is the Interactors job to delegate this button click to whichever object should handle it. + +Interactors may hold references to multiple other Interactors and Controllers, in which case they delegate specific methods to their appropriate handlers. This helps prevent bloated Controllers that both perform logic and delegate to other objects. + +Sometimes an Interactor will only reference a single Controller. In these cases, the Interactor will simply forward calls to equivalent calls on the Controller. The Interactor does very little in these cases, and exists only to be consistent with the rest of the app. + +Note that prior to the introduction of Controllers, Interactors handled the responsibilities of both objects. **You may still find this pattern in some parts of the codebase,** but it is being actively refactored out. + +------- + +### Controller +#### Overview +Determines how the app should be updated whenever something happens + +Called by: [Interactor](#interactor) + +Calls: [Store](#store), library code (e.g., forward a back-press to Android, trigger an FxA login, navigate to a new Fragment, use an Android Components UseCase, etc) + +#### Description +This is where much of the business logic of the app lives. Whenever called by an Interactor, a Controller will do one of the three following things: +- Create a new [Action](#action) that describes the necessary change, and send it to the Store +- Navigate to a new fragment via the NavController. Optionally include any state necessary to create this new fragment +- Interact with some third party manager. Typically these will update their own internal state and then emit changes to an observer, which will be used to update our Store + +Controllers can become very complex, and should be unit tested thoroughly whenever their methods do more than delegate simple calls to other objects. + +------- From e058ba73c6c59106883d8f9bbec672e3db372a0c Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 7 Jul 2023 00:03:45 +0000 Subject: [PATCH 021/207] Import translations from android-l10n --- app/src/main/res/values-be/strings.xml | 21 +++------- app/src/main/res/values-el/strings.xml | 21 +++------- app/src/main/res/values-es-rCL/strings.xml | 21 +++------- app/src/main/res/values-fi/strings.xml | 21 +++------- app/src/main/res/values-fr/strings.xml | 21 +++------- app/src/main/res/values-ia/strings.xml | 22 +++------- app/src/main/res/values-it/strings.xml | 21 +++------- app/src/main/res/values-nl/strings.xml | 25 +++++------- app/src/main/res/values-pt-rBR/strings.xml | 21 +++------- app/src/main/res/values-ru/strings.xml | 27 ++++--------- app/src/main/res/values-sv-rSE/strings.xml | 21 +++------- app/src/main/res/values-tg/strings.xml | 21 +++------- app/src/main/res/values-tr/strings.xml | 23 ++++------- app/src/main/res/values-uk/strings.xml | 21 +++------- app/src/main/res/values-vi/strings.xml | 25 +++++------- app/src/main/res/values-zh-rCN/strings.xml | 25 +++++------- app/src/main/res/values-zh-rTW/strings.xml | 47 ++++++++++------------ 17 files changed, 118 insertions(+), 286 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 90a2d48ab..89bc6cc61 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -423,18 +423,12 @@ Адправіць запыт - Памяншэнне колькасці банераў кукі - Запытаць падтрымку для гэтага сайта? - Запыт на падтрымку сайта адпраўлены. - Запыт адпраўлены Уключана для гэтага сайта - - Запыт на падтрымку сайта адпраўлены Запыт на падтрымку адпраўлены @@ -444,8 +438,6 @@ Выключыць памяншэнне колькасці банераў кукі для %1$s? - - Гэты сайт у цяперашні час не падтрымліваецца функцыяй памяншэння колькасці банераў кукі. Хочаце, каб наша каманда прагледзела гэты сайт і дадала падтрымку ў будучыні? %1$s не можа аўтаматычна адхіляць запыты кукаў на гэтым сайце. Вы можаце адправіць запыт на падтрымку гэтага сайта ў будучыні. @@ -550,6 +542,11 @@ Ніколі Вонкавы менеджар сцягванняў + + Уключыць журналы Gecko + + Выхад з праграмы, каб прымяніць змены… + Дадаткі @@ -1516,12 +1513,8 @@ Налады аховы Узмоцненая ахова ад сачэння - - Аглядайце без старонніх вачэй Цяпер у нас ёсць поўная ахова кукаў, наш самы магутны бар\'ер супраць міжсайтавых трэкераў. - - Захоўвайце свае дадзеныя пры сабе. %s абараняе вас ад многіх самых распаўсюджаных трэкераў, якія сочаць за тым, што вы робіце ў інтэрнэце. %s абараняе вас ад многіх найбольш распаўсюджаных трэкераў, якія сочаць за тым, што вы робіце ў інтэрнэце. @@ -1529,16 +1522,12 @@ Стандартная (прадвызначана) - Збалансаваная прыватнасць і прадукцыйнасць. Старонкі загружаюцца нармальна. - Старонкі будуць загружацца нармальна, але блакаваць менш трэкераў. Што блакуецца стандартнай аховай ад сачэння Строгая - Блакуе больш трэкераў, так што старонкі атрымліваюцца хутчэй, але частка іх функцый можа парушыцца. - Мацнейшая ахова ад сачэння і лепшая хуткадзейнасць, але некаторыя сайты могуць не працаваць належным чынам. Што блакуецца строгай аховай ад сачэння diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index de8501ef2..aaed3b014 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -432,18 +432,12 @@ Αποστολή αιτήματος - Μείωση μηνυμάτων για cookies - Αίτημα υποστήριξης για αυτόν τον ιστότοπο; - Υποβλήθηκε αίτημα για υποστήριξη ιστοτόπου. - Το αίτημα απεστάλη Ενεργή για αυτόν τον ιστότοπο - Υποβλήθηκε αίτημα για υποστήριξη ιστοτόπου - Το αίτημα υποστήριξης απεστάλη Ο ιστότοπος δεν υποστηρίζεται @@ -452,8 +446,6 @@ Απενεργοποίηση μείωσης μηνυμάτων για cookies στο %1$s; - - Αυτός ο ιστότοπος δεν υποστηρίζεται προς το παρόν από τη Μείωση μηνυμάτων για cookies. Θα θέλατε η ομάδα μας να ελέγξει αυτόν τον ιστότοπο και να προσθέσει υποστήριξη στο μέλλον; Το %1$s δεν μπορεί να απορρίψει αυτόματα τα αιτήματα για cookies σε αυτόν τον ιστότοπο. Μπορείτε να στείλετε ένα αίτημα για υποστήριξη αυτού του ιστοτόπου στο μέλλον. @@ -558,6 +550,11 @@ Ποτέ Εξωτερική διαχείριση λήψεων + + Ενεργοποίηση αρχείων καταγραφής Gecko + + Κλείσιμο εφαρμογής για την εφαρμογή αλλαγών… + Πρόσθετα @@ -1517,12 +1514,8 @@ Ρυθμίσεις προστασίας Ενισχυμένη προστασία από καταγραφή - - Περιήγηση χωρίς παρακολούθηση Τώρα με Ολική προστασία cookie, η πιο ισχυρή μας φύλαξη ενάντια στους ιχνηλάτες μεταξύ ιστοτόπων. - - Κρατήστε τα δεδομένα σας για τον εαυτό σας. Το %s σας προστατεύει από πολλούς από τους πιο συνηθισμένους ιχνηλάτες που ακολουθούν ό,τι κάνετε στο διαδίκτυο. Το %s σάς προστατεύει από τους περισσότερους, συνηθισμένους ιχνηλάτες που ακολουθούν ό,τι κάνετε στο διαδίκτυο. @@ -1530,16 +1523,12 @@ Τυπική (προεπιλογή) - Ισορροπία μεταξύ απορρήτου και επιδόσεων. Οι σελίδες φορτώνονται κανονικά. - Οι σελίδες θα φορτώνονται κανονικά, αλλά θα αποκλείονται λιγότεροι ιχνηλάτες. Τι αποκλείει η τυπική προστασία από καταγραφή Αυστηρή - Φραγή περισσότερων ιχνηλατών για ταχύτερη φόρτωση σελίδων. Ορισμένες λειτουργίες της σελίδας ενδέχεται να δυσλειτουργούν. - Ισχυρότερη προστασία από καταγραφή και καλύτερες επιδόσεις, αλλά ορισμένοι ιστότοποι ενδέχεται να μη λειτουργούν σωστά. Τι αποκλείει η αυστηρή προστασία από καταγραφή diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index ed0659f11..eba2f439d 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -424,18 +424,12 @@ Enviar solicitud - Reducción de anuncios de cookies - ¿Solicitar soporte para este sitio? - Solicitud para compatibilizar el sitio enviada. - Solicitud enviada Activada para este sitio - Solicitud para compatibilizar el sitio enviada - Solicitud de soporte enviada Sitio actualmente no soportado @@ -443,8 +437,6 @@ ¿Activar la reducción de anuncios de cookies para %1$s? ¿Desactivar la reducción de anuncios de cookies para %1$s? - - Actualmente, este sitio no es compatible con la reducción de anuncios de cookies. ¿Te gustaría que nuestro equipo revise este sitio web y sea compatible en el futuro? %1$s no puede rechazar automáticamente las solicitudes de cookies en este sitio. Puedes enviar una solicitud para soportar este sitio en el futuro. @@ -550,6 +542,11 @@ Nunca Administrador de descargas externo + + Habilitar registros de Gecko + + Saliendo de la aplicación para aplicar cambios… + Complementos @@ -1499,12 +1496,8 @@ Ajustes de protección Protección de seguimiento mejorada - - Navega sin ser seguido Ahora con protección total contra cookies, nuestra barrera más poderosa hasta el momento contra los rastreadores entre sitios. - - Mantén tus datos privados. %s te protege de la mayoría de los rastreadores comunes que siguen lo que haces en línea. %s te protege de la mayoría de los rastreadores comunes que siguen lo que haces en línea. @@ -1512,16 +1505,12 @@ Estándar (por defecto) - Equilibrado para privacidad y rendimiento. Las páginas se cargan de forma normal. - Las páginas se cargarán adecuadamente, pero se bloquearán menos rastreadores. Qué bloquea la protección de seguimiento estándar Estricta - Bloquea más rastreadores para que las páginas se carguen más rápido, pero algunas funcionalidades de la página pueden fallar. - Una mayor protección de seguimiento y un mejor rendimiento, pero algunos sitios podrían no funcionar adecuadamente. Qué bloquea la protección de seguimiento estricta diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 746d153e9..c13e6a442 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -432,18 +432,12 @@ Lähetä pyyntö - Evästeilmoitusten vähennys - Haluatko pyytää tukea tälle sivustolle? - Pyyntö tukea tätä sivustoa lähetetty. - Pyyntö lähetetty Käytössä tällä sivustolla - Pyyntö tukea tätä sivustoa lähetetty - Tukipyyntö lähetetty Sivusto ei ole tuettu tällä hetkellä @@ -451,8 +445,6 @@ Haluatko ottaa evästeilmoitusten vähennystoiminnon käyttöön sivustolla %1$s? Haluatko poistaa evästeilmoitusten vähennystoiminnon käytöstä sivustolla %1$s? - - Evästeilmoitusten vähennys ei tällä hetkellä tue tätä sivustoa. Haluatko pyytää tiimiämme tarkistamaan tämän sivuston ja lisäämään tuen tulevaisuudessa? %1$s ei voi automaattisesti hylätä tämän sivuston evästepyyntöjä. Voit lähettää pyynnön ja pyytää tukea tälle sivustolle tulevaisuudessa. @@ -558,6 +550,11 @@ Ei koskaan Erillinen latausten hallinta + + Ota Gecko-lokit käyttöön + + Lopetetaan sovellus, jotta muutokset tulevat voimaan… + Lisäosat @@ -1520,12 +1517,8 @@ Suojauksen asetukset Tehostettu seurannan suojaus - - Selaa ilman seurantaa Sisältää nyt täydellisen evästesuojauksen, joka on toistaiseksi tehokkain esteemme sivustojen välistä seurantaa vastaan. - - Pidä tietosi itselläsi. %s suojaa sinua monilta yleisimmiltä verkossa tekemiäsi asioita jäljittäviltä seuraimilta. %s suojaa sinua monilta yleisimmiltä verkossa tekemiäsi asioita jäljittäviltä seuraimilta. @@ -1533,16 +1526,12 @@ Tavallinen (oletus) - Tasapainotettu yksityisyyden ja suorituskyvyn välillä. Sivut latautuvat normaalisti. - Sivut latautuvat normaalisti, mutta seuraimia estetään vähemmän. Mitä tavallinen seurannan suojaus estää Tiukka - Estää enemmän seuraimia, joten sivut latautuvat nopeammin, mutta jotkin sivujen toiminnot saattavat rikkoutua. - Vahvempi seurantasuojaus ja nopeampi suorituskyky, mutta jotkin sivustot eivät välttämättä toimi kunnolla. Mitä tiukka seurannan suojaus estää diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b744d5a81..d552429ed 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -429,18 +429,12 @@ Envoyer la demande - Réduction des bannières de cookies - Demander la prise en charge de ce site ? - La demande de prise en charge du site a été envoyée. - Demande envoyée Activée pour ce site - La demande de prise en charge du site a été envoyée - Demande de prise en charge envoyée Site actuellement non pris en charge @@ -448,8 +442,6 @@ Activer la réduction des bannières de cookies pour %1$s ? Désactiver la réduction des bannières de cookies pour %1$s ? - - Ce site n’est actuellement pas pris en charge par la réduction des bannières de cookies. Souhaitez-vous que notre équipe vérifie ce site et ajoute sa prise en charge ultérieurement ? %1$s ne peut pas refuser automatiquement les demandes de dépôt de cookies sur ce site. Vous pouvez envoyer une demande afin que ce site soit pris en charge ultérieurement. @@ -555,6 +547,11 @@ Jamais Gestionnaire de téléchargement externe + + Activer les journaux de Gecko + + Fermeture de l’application pour appliquer les modifications… + Modules complémentaires @@ -1532,12 +1529,8 @@ Paramètres de protection Protection renforcée contre le pistage - - Naviguez sans être suivi·e Maintenant avec la protection totale contre les cookies, notre plus puissante barrière contre les traqueurs intersites à ce jour. - - Gardez vos données pour vous. %s vous protège de la plupart des traqueurs les plus courants qui suivent ce que vous faites en ligne. %s vous protège de la plupart des traqueurs les plus courants qui pistent vos activités en ligne. @@ -1545,16 +1538,12 @@ Standard (par défaut) - Équilibré entre protection et performances. Les pages se chargent normalement. - Les pages se chargeront normalement, mais bloqueront moins de traqueurs. Ce qui est bloqué par la protection standard contre le pistage Stricte - Bloque davantage de traqueurs, accélérant le chargement des pages, mais quelques dysfonctionnements peuvent s’ensuivre. - Une protection renforcée contre le pistage et de meilleures performances, mais certains sites peuvent ne pas fonctionner correctement. Ce qui est bloqué par la protection stricte contre le pistage diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 9cda55d9c..2f45e6b80 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -431,18 +431,12 @@ Inviar requesta - Reduction de bandiera pro cookie - Requirer supporto pro iste sito? - Requesta supporto sito inviate. - Requesta inviate Activar pro iste sito - Requesta supporto sito inviate - Requesta de supporto inviate Sito actualmente non supportate @@ -450,8 +444,6 @@ Activar le reduction de banner pro cookie pro %1$s? Disactivar le reduction de banner pro cookie pro %1$s? - - Iste sito non es actualmente supportate per le Reduction del bandieras pro cookies. Vole vos que nostre equipa revide iste sito web e adde le supporto in le futuro? %1$s non pote automaticamente rejectar requestas de cookies sur iste sito. Tu pote inviar un requesta pro supportar iste sito in futuro. @@ -558,6 +550,11 @@ Jammais Gestor de discargamento externe + + Activar le registrationes de Gecko + + Quitante le application pro applicar le modificationes… + Additivos @@ -1548,13 +1545,8 @@ Parametros de protection Protection antitraciamento reinfortiate - - Naviga sin lassar te sequer Ora con le Protection total del cookies, nostre ancora plus potente barriera contra traciatores inter-sitos. - - Mantene tu datos pro te mesme. %s te protege contra le majoritate del traciatores commun que seque lo que tu face in linea. - %s te protege contra multe del traciatores commun que seque lo que tu face in linea. @@ -1563,15 +1555,11 @@ Standard (predefinite) - Equilibrio inter confidentialitate e prestation. Le paginas carga normalmente. - Le paginas cargara normalmente, ma blocara minus traciatores. Lo que es blocate per standard protection de traciamento Stricte - - Bloca plus traciatores assi que le paginas se carga plus veloce, ma alcun functionalitate sur le pagina pote corrumper se. Plus forte protection de traciamento e prestation plus veloce, ma alcun sitos pote non functionar correctemente. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 378a7a54e..da4d045d9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -430,18 +430,12 @@ Invia richiesta - Riduzione banner per i cookie - Richiedere il supporto per questo sito? - Richiesta di supportare il sito inviata. - Richiesta inviata Attiva per questo sito - Richiesta di supportare il sito inviata - Richiesta di supporto inviata Sito attualmente non supportato @@ -449,8 +443,6 @@ Attivare la riduzione banner per i cookie su %1$s? Disattivare la riduzione banner per i cookie su %1$s? - - Questo sito non è attualmente supportato dalla funzione per ridurre i banner per i cookie. Vuoi chiedere al nostro team di valutare questo sito web e aggiungere supporto in futuro? %1$s non può rifiutare automaticamente le richieste di cookie su questo sito. Puoi inviare una richiesta per supportare questo sito in futuro. @@ -557,6 +549,11 @@ Mai Gestore download esterno + + Attiva registri Gecko + + Chiusura in corso per applicare le modifiche… + Componenti aggiuntivi @@ -1538,12 +1535,8 @@ Impostazioni protezione Protezione antitracciamento avanzata - - Naviga senza lasciarti seguire Adesso con Protezione totale per i cookie, la barriera più potente che abbiamo finora realizzato contro gli elementi traccianti intersito. - - Mantieni i tuoi dati al riparo da occhi indiscreti. %s ti protegge dagli elementi traccianti più comuni che cercano di seguire le tue attività online. %s ti protegge dagli elementi traccianti più comuni che cercano di seguire le tue attività online. @@ -1551,16 +1544,12 @@ Normale (predefinita) - Equilibrio tra privacy e prestazioni. Le pagine verranno caricate normalmente. - Le pagine verranno caricate normalmente, ma verranno bloccati meno elementi traccianti. Elementi bloccati nella protezione antitracciamento normale Restrittiva - Blocca più elementi traccianti. Le pagine verranno caricate più velocemente, ma alcune caratteristiche della pagina potrebbero non funzionare correttamente. - Maggiore protezione dal tracciamento e prestazioni più veloci, alcuni siti potrebbero non funzionare correttamente. Elementi bloccati nella protezione antitracciamento restrittiva diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 6d05960de..3ad725424 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -432,18 +432,12 @@ Aanvraag verzenden - Reductie van cookiebanners - Ondersteuning aanvragen voor deze website? - Verzoek om websiteondersteuning ingediend. - Aanvraag verzonden Aan voor deze website - Verzoek om websiteondersteuning ingediend - Ondersteuningsaanvraag verzonden Website wordt momenteel niet ondersteund @@ -451,8 +445,6 @@ Reductie van cookiebanners inschakelen voor %1$s? Reductie van cookiebanners uitschakelen voor %1$s? - - Deze website wordt momenteel niet ondersteund door Reductie van cookiebanners. Wilt u dat ons team deze website beoordeelt en in de toekomst ondersteuning toevoegt? %1$s kan cookieverzoeken op deze website niet automatisch weigeren. U kunt een aanvraag sturen om deze website in de toekomst te ondersteunen. @@ -558,6 +550,11 @@ Nooit Externe downloadbeheerder + + Gecko-logboeken inschakelen + + De toepassing wordt afgesloten om wijzigingen toe te passen… + Add-ons @@ -1217,6 +1214,10 @@ Opslaan als PDF Kan PDF niet aanmaken + + Kan niet afdrukken + + Afdrukken Verzenden naar apparaat @@ -1508,12 +1509,8 @@ Beschermingsinstellingen Verbeterde bescherming tegen volgen - - Surf zonder te worden gevolgd Nu met Totale cookiebescherming, onze krachtigste barrière tot nu toe tegen cross-sitetrackers. - - Houd uw gegevens voor uzelf. %s beschermt u tegen veel van de meest voorkomende trackers die volgen wat u online doet. %s beschermt u tegen veel van de meest voorkomende trackers die volgen wat u online doet. @@ -1521,16 +1518,12 @@ Standaard (standaard) - Gebalanceerd voor privacy en prestaties. Pagina’s laden normaal. - Pagina’s worden normaal geladen, maar er worden minder trackers geblokkeerd. Wat wordt geblokkeerd door standaard bescherming tegen volgen Streng - Blokkeert meer trackers, zodat pagina’s sneller worden geladen, maar sommige functionaliteit op een pagina werkt mogelijk niet. - Sterkere bescherming tegen volgen en snellere prestaties, maar sommige websites werken mogelijk niet goed. Wat wordt geblokkeerd door strenge bescherming tegen volgen diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 986685779..c57c0937a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -426,18 +426,12 @@ Enviar pedido - Redução de avisos de cookies - Solicitar funcionar neste site? - Enviado pedido para funcionar neste site. - Pedido enviado Ativado neste site - Enviado pedido para funcionar neste site - Solicitação de funcionar enviada Site atualmente não suportado @@ -446,8 +440,6 @@ Desativar redução de avisos de cookies em %1$s? - - A redução de avisos de cookies atualmente não funciona neste site. Quer que nossa equipe revise este site para funcionar no futuro? O %1$s não pode rejeitar solicitações de cookies automaticamente neste site. Você pode enviar uma solicitação para passar a funcionar neste site. @@ -553,6 +545,11 @@ Nunca Gerenciador de downloads externo + + Ativar logs do Gecko + + Fechando o aplicativo para aplicar as alterações… + Extensões @@ -1507,13 +1504,9 @@ Configurações de proteção Proteção aprimorada contra rastreamento - - Navegue sem ser seguido Agora com a proteção total contra cookies, nossa mais poderosa barreira contra rastreadores entre sites. - - Defenda seus dados. O %s te protege de muitos dos rastreadores mais comuns que tentam seguir o que você faz online. O %s te protege de muitos dos rastreadores mais comuns que tentam seguir o que você faz online. @@ -1522,16 +1515,12 @@ Normal (padrão) - Balanceado entre privacidade e desempenho. Páginas são carregadas normalmente. - As páginas são carregadas normalmente, mas bloqueia menos rastreadores. O que é bloqueado pela proteção normal contra rastreamento Rigoroso - Bloqueia mais rastreadores, assim as páginas carregam mais rápido, mas pode atrapalhar algumas funcionalidades de páginas. - Proteção mais forte contra rastreamento e desempenho mais rápido, mas alguns sites podem não funcionar corretamente. O que é bloqueado pela proteção rigorosa contra rastreamento diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e28e47582..bfc3a5d8d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -436,18 +436,12 @@ Отправить запрос - Снижение числа уведомлений о куках - Запросить поддержку для этого сайта? - Запрос на поддержку сайта отправлен. - Запрос отправлен Включено для этого сайта - Запрос на поддержку сайта отправлен - Запрос на поддержку отправлен В настоящее время сайт не поддерживается @@ -455,8 +449,6 @@ Включить Снижение количества уведомлений о куках для %1$s? Отключить Снижение количества уведомлений о куках для %1$s? - - Этот сайт в настоящее время не поддерживается функцией снижения числа уведомлений о куках. Хотите ли вы, чтобы наша команда рассмотрела этот сайт и добавила поддержку в будущем? %1$s не может автоматически отклонять запросы на использование кук на этом сайте. Вы можете отправить запрос на поддержку этого сайта в будущем. @@ -562,6 +554,11 @@ Никогда Внешний менеджер загрузок + + Включить журналы Gecko + + Выход из приложения для применения изменений… + Дополнения @@ -1025,7 +1022,7 @@ Изменить - Копировать + Скопировать Поделиться @@ -1244,7 +1241,7 @@ Недавно использованные - Копировать в буфер обмена + Скопировать в буфер обмена Скопировано в буфер обмена @@ -1534,12 +1531,8 @@ Настройки защиты Улучшенная защита от отслеживания - - Используйте Интернет без слежки Теперь у нас есть полная защита от кук, наша самая крепкая преграда против межсайтовых трекеров. - - Храните свои данные при себе. %s защитит вас от многих наиболее известных трекеров, которые следят за вашим поведением в Интернете. %s защищает вас от многих наиболее распространённых трекеров, которые следят за вами, когда вы находитесь в сети. @@ -1547,16 +1540,12 @@ Обычная (по умолчанию) - Золотая середина: приватность и производительность. Страницы будут загружаться нормально. - Страницы будут загружаться нормально, но трекеров блокироваться будет меньше. Что блокируется обычной защитой от отслеживания Строгая - Блокирует больше трекеров, так что страницы загружаются быстрее, но некоторые страницы могут работать некорректно. - Строгая защита от отслеживания с увеличенной производительностью, некоторые сайты могут работать неправильно. Что блокируется строгой защитой от отслеживания @@ -1747,7 +1736,7 @@ Очистить пароль - Копировать имя пользователя + Скопировать имя пользователя Очистить имя пользователя diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index c68f20dfa..0e03316ab 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -431,18 +431,12 @@ Skicka begäran - Reducering av kakbanners - Begär support för den här webbplatsen? - Begäran om supportwebbplats har skickats. - Begäran skickad PÅ för denna webbplats - Begäran om supportwebbplats har skickats - Supportbegäran har skickats Webbplatsen stöds inte för närvarande @@ -450,8 +444,6 @@ Vill du aktivera reducering av kakbanners för %1$s? Vill du stänga av reducering av kakbanners för %1$s? - - Denna webbplats stöds för närvarande inte av reducering av kakbanners. Vill du att vårt team ska granska den här webbplatsen och lägga till support i framtiden? %1$s kan inte automatiskt avvisa kakförfrågningar på den här webbplatsen. Du kan skicka en begäran om att stödja den här webbplatsen i framtiden. @@ -557,6 +549,11 @@ Aldrig Extern filhämtare + + Aktivera Gecko-loggar + + Avslutar programmet för att tillämpa ändringar… + Tillägg @@ -1519,12 +1516,8 @@ Skyddsinställningar Förbättrat spårningsskydd - - Surfa utan att bli följd Nu med Totalt skydd mot kakor, vår mest kraftfulla barriär hittills mot spårare på flera webbplatser. - - Behåll dina data för dig själv. %s skyddar dig från många av de vanligaste spårarna som följer vad du gör online. %s skyddar dig från många av de vanligaste spårarna som följer vad du gör online. @@ -1532,16 +1525,12 @@ Standard - Balanserad för integritet och prestanda. Sidor laddas normalt. - Sidor laddas normalt men blockerar färre spårare. Vad blockeras av spårningsskydd standard Strikt - Blockerar fler spårare så att sidor laddas snabbare, men vissa sidor kanske inte fungerar ordentligt. - Starkare spårningsskydd och snabbare prestanda, men vissa webbplatser kanske inte fungerar korrekt. Vad blockeras av spårningsskydd strikt diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 9f138d414..cfbf6b48f 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -428,18 +428,12 @@ Фиристодани дархост - Маҳдудкунии баннери куки - Барои ин сомона дастгириро дархост мекунед? - Дархост барои дастгирӣ кардани сомонаи пешниҳодшуда. - Дархост фиристода шуд Барои ин сомона фаъол аст - Дархост барои дастгирӣ кардани сомонаи пешниҳодшуда - Дархости дастгирӣ фиристода шуд Ин сомона дар айни замон дастгирӣ намешавад @@ -448,8 +442,6 @@ «Маҳдудкунии баннери куки»-ро барои %1$s хомӯш месозед? - - Айни ҳол ин сомона аз тарафи «Маҳдудкунии баннери куки» дастгирӣ намешавад. Шумо мехоҳед, ки дастаи мо ин сомонаро бозбинӣ кунад ва онро барои дастгирӣ дар оянда илова намояд? «%1$s» наметавонад, ки дархостҳои кукиро барои ин сомона ба таври худкор рад кунад. Шумо метавонед барои дастгирӣ кардани ин сомона дар оянда дархостеро фиристонед. @@ -553,6 +545,11 @@ Ҳеҷ гоҳ Мудири берунии боргириҳо + + Фаъол кардани сабти рӯйдодҳои «Gecko» + + Барои татбиқ кардани тағйирот барнома хомӯш мешавад… + Ҷузъҳои иловагӣ @@ -1512,12 +1509,8 @@ Танзимоти муҳофизат Муҳофизати такмилёфта аз пайгирӣ - - Тамошокунӣ бе пайгирӣ Акнун браузери мо дорои хусусияти «Муҳофизати пурра аз кукиҳо» мебошад, ки барои васоити пайгирии байнисомонавӣ монеаи пурқувват мебошад. - - Маълумоти худро бо худ нигоҳ доред. %s шуморо аз бисёр васоити пайгирие, ки фаъолияти шуморо дар онлайн пайгирӣ мекунанд, муҳофизат менамояд. «%s» шуморо аз бисёр васоити пайгирие, ки фаъолияти шуморо дар онлайн пайгирӣ мекунанд, муҳофизат менамояд. @@ -1525,16 +1518,12 @@ Стандартӣ (пешфарз) - Мутаносиб барои махфият ва самаранокӣ. Саҳифаҳо ба таври муқаррар бор карда мешаванд. - Саҳифаҳо ба таври муқаррар кушода мешаванд, аммо баъзе васоити пайгирӣ манъ карда мешаванд. Ба воситаи муҳофизати стандартӣ аз пайгирӣ чӣ баста шудааст Ҷиддӣ - Васоити пайгирии бештарро қатъ мекунад, то ки саҳифаҳо тезтар кушода шаванд, аммо баъзеи функсияҳои саҳифа метавонанд вайрон шаванд. - Муҳофизати ҷиддӣ барои самаранокии тезтар ва бар зиддӣ васоити пайгирӣ, аммо баъзе сомонаҳо метавонанд ба таври дуруст кор накунанд. Ба воситаи муҳофизати ҷиддӣ аз пайгирӣ чӣ баста шудааст diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index ccd770b27..fc241f9bf 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -427,18 +427,12 @@ İstek gönder - Çerez Bildirimlerini Azalt - Bu site için destek istensin mi? - Destek sitesine istek gönderildi. - İstek gönderildi Bu sitede açık - Destek sitesine istek gönderildi - Destek isteği gönderildi Bu site şu anda desteklenmiyor @@ -446,8 +440,6 @@ %1$s için çerez bildirimlerini azaltma açılsın mı? %1$s için çerez bildirimlerini azaltma kapatılsın mı? - - Çerez bildirimlerini azaltma özelliği henüz bu siteyi desteklemiyor. Ekibimizin bu siteyi inceleyip gelecekte desteklemesini ister misiniz? %1$s bu sitedeki çerez isteklerini otomatik olarak reddedemiyor. İleride bu siteyi desteklememiz için istekte bulunabilirsiniz. @@ -553,6 +545,9 @@ Asla Harici indirme yöneticisi + + Değişiklikleri uygulamak için uygulamadan çıkılıyor… + Eklentiler @@ -1211,6 +1206,10 @@ PDF olarak kaydet PDF oluşturulamadı + + Yazdırılamadı + + Yazdır Cihaza gönder @@ -1502,12 +1501,8 @@ Koruma ayarları Gelişmiş izlenme koruması - - Takip edilmeden gezinin Siteler arası takip kodlarına karşı en güçlü korumamız olan Komple Çerez Koruması da içinde. - - Verileriniz sizde kalsın. %s, internette ne yaptığınızı öğrenmeye çalışan takip kodlarının çoğundan sizi korur. %s, internette ne yaptığınızı öğrenmeye çalışan takip kodlarının çoğundan sizi korur. @@ -1515,16 +1510,12 @@ Standart (varsayılan) - Dengeli gizlilik ve performans. Sayfalar normal şekilde yüklenir. - Sayfalar normal şekilde yüklenecek ama daha az takip kodu engellenecek. Standart izlenme korumasında neler engellenir? Sıkı - Sayfaların daha hızlı yüklenmesi için daha fazla takip kodunu engeller ancak bazı sayfa işlevleri bozulabilir. - Daha güçlü izlenme koruması ve daha hızlı performans, ancak bazı siteler düzgün çalışmayabilir. Sıkı izlenme korumasında neler engellenir? diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fcb9094ce..32b81085a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -430,18 +430,12 @@ Надіслати запит - Зменшення кількості банерів кук - Подати запит на підтримку цього сайту? - Запит на підтримку сайту надіслано. - Запит надіслано Увімкнено для цього сайту - Запит на підтримку сайту надіслано - Запит на підтримку сайту надіслано Сайт наразі не підтримується @@ -449,8 +443,6 @@ Увімкнути зменшення кількості банерів кук для %1$s? Вимкнути зменшення кількості банерів кук для %1$s? - - Цей сайт наразі не підтримується функцією зменшення кількості банерів кук. Бажаєте, щоб наша команда перевірила цей сайт і забезпечила його підтримку в майбутньому? %1$s не може автоматично відхиляти запити на розміщення кук на цьому сайті. Ви можете надіслати запит для підтримки цього сайту в майбутньому. @@ -558,6 +550,11 @@ Ніколи Зовнішній менеджер завантажень + + Увімкнути журнали Gecko + + Закриття програми для застосування змін… + Додатки @@ -1514,12 +1511,8 @@ Налаштування захисту Розширений захист від стеження - - Переглядайте без стеження Тепер із функцією Total Cookie Protection, наша найпотужніша перепона від стеження між сайтами. - - Зберігайте свої дані при собі. %s захищає вас від численних найпоширеніших елементів стеження, що переслідують вас в мережі. %s захищає вас від численних найпоширеніших елементів стеження, що переслідують вас в мережі. @@ -1527,16 +1520,12 @@ Стандартний (типово) - Баланс приватності та швидкодії. Сторінки завантажуються нормально. - Нормальне завантаження сторінок за меншого блокування елементів стеження. Що блокується стандартним рівнем захисту від стеження Надійний - Блокує більше стеження, тому сторінки завантажуються швидше, однак можливі порушення їх роботи. - Кращий захист від стеження і швидкодія, але деякі сайти можуть працювати неправильно. Що блокується надійним рівнем захисту від стеження diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cfc44b3b8..d74e339fd 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -424,18 +424,12 @@ Gửi yêu cầu - Giảm biểu ngữ cookie - Yêu cầu hỗ trợ cho trang web này? - Đã gửi yêu cầu hỗ trợ trang web. - Đã gửi yêu cầu Bật cho trang web này - Đã gửi yêu cầu hỗ trợ trang web - Đã gửi yêu cầu hỗ trợ Trang web hiện không được hỗ trợ @@ -443,8 +437,6 @@ Bật giảm biểu ngữ cookie cho %1$s? Tắt giảm biểu ngữ cookie cho %1$s? - - Trang web này hiện không được hỗ trợ bởi Giảm biểu ngữ cookie. Bạn có muốn nhóm của chúng tôi xem xét trang web này và thêm hỗ trợ trong tương lai không? %1$s không thể tự động từ chối yêu cầu cookie trên trang web này. Bạn có thể gửi yêu cầu hỗ trợ trang web này trong tương lai. @@ -549,6 +541,11 @@ Không bao giờ Trình quản lý tải xuống bên ngoài + + Bật nhật ký Gecko + + Đang thoát ứng dụng để áp dụng các thay đổi… + Tiện ích @@ -1203,6 +1200,10 @@ Lưu dưới dạng PDF Không thể tạo PDF + + Không thể in + + In Gửi đến thiết bị @@ -1490,12 +1491,8 @@ Cài đặt bảo vệ Trình chống theo dõi nâng cao - - Duyệt mà không bị theo dõi Hiện có tính năng Trình chống cookie chung, rào cản mạnh mẽ nhất của chúng tôi đối với các trình theo dõi trên nhiều trang web. - - Giữ dữ liệu của bạn cho chính mình. %s bảo vệ bạn khỏi nhiều trình theo dõi phổ biến nhất theo dõi những gì bạn làm trực tuyến. %s bảo vệ bạn khỏi nhiều trình theo dõi phổ biến nhất theo dõi những gì bạn làm trực tuyến. @@ -1503,16 +1500,12 @@ Tiêu chuẩn (mặc định) - Cân bằng cho sự riêng tư và hiệu suất. Các trang tải bình thường. - Các trang sẽ tải bình thường, nhưng chặn ít trình theo dõi hơn. Những gì bị chặn bởi trình chống theo dõi tiêu chuẩn Nghiêm ngặt - Chặn nhiều trình theo dõi hơn để các trang tải nhanh hơn, nhưng một số chức năng trên trang có thể bị hỏng. - Trình chống theo dõi mạnh mẽ hơn và hiệu suất nhanh hơn, nhưng một số trang web có thể không hoạt động đúng. Những gì bị chặn bởi trình chống theo dõi nghiêm ngặt diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4c40acfe3..d2634a65c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -434,18 +434,12 @@ 发送请求 - 减少 Cookie 横幅 - 需要技术支持? - 请求已提交。 - 请求已发送 在该网站开启 - 请求已提交。 - 请求已发送 目前不支持该网站 @@ -454,8 +448,6 @@ 要为 %1$s 关闭“减少 Cookie 横幅”功能吗? - - “减少 Cookie 横幅”功能暂不支持此网站。您希望我们的团队调查此网站以在将来完成支持吗? %1$s 无法自动拒绝此站点上的 Cookie 请求。您可以请求将来对此站点的支持。 @@ -561,6 +553,11 @@ 永不 外部下载管理器 + + 启用 Gecko 日志 + + 退出应用程序以应用更改… + 附加组件 @@ -1244,6 +1241,10 @@ 保存为 PDF 无法生成 PDF + + 无法打印 + + 打印 发送到设备 @@ -1542,12 +1543,8 @@ 保护设置 增强型跟踪保护 - - 自由上网,拒绝跟踪 现已支持“全方位 Cookie 保护”功能,这是我们迄今针对跨站跟踪器最为强大的屏障。 - - 你的数据只由你掌握。%s 可保护您免受大多数常见的跟踪器对您在线活动的窥视。 %s 保护您免受众多常见跟踪器对您在线活动的窥视。 @@ -1555,16 +1552,12 @@ 标准(默认) - 平衡隐私和性能。页面可正常加载。 - 页面将正常加载,但拦截的跟踪器少一些。 标准跟踪保护会拦截的内容 严格 - 拦截更多跟踪器,页面加载更快,但可能导致页面上某些功能异常。 - 更强的跟踪保护与更快的性能,但可导致某些网站的运作不正常。 严格跟踪保护会拦截的内容 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4aae9633e..23fe3fe57 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -371,13 +371,13 @@ 關於 - 選擇一套 + 選擇一套 - 管理搜尋捷徑 + 管理搜尋捷徑 - 編輯搜尋選單中要出現的搜尋引擎 + 編輯搜尋選單中要出現的搜尋引擎 - 要在搜尋選單中顯示的搜尋引擎 + 要在搜尋選單中顯示的搜尋引擎 預設搜尋引擎 @@ -430,18 +430,12 @@ 傳送請求 - 減少 Cookie 橫幅 - 要請求支援此網站嗎? - 已送出對此網站的需求。 - 已請求 對此網站開啟 - 已送出對此網站的需求 - 已送出支援請求 目前不支援的網站 @@ -449,8 +443,6 @@ 要為 %1$s 開啟減少 Cookie 橫幅功能嗎? 要為 %1$s 關閉減少 Cookie 橫幅功能嗎? - - 「減少 Cookie 橫幅」功能目前暫不支援此網站。您想要將此網站回報給我們的團隊,看看是否未來有機會支援嗎? %1$s 無法自動拒絕此網站上的 Cookie 請求。您可以請求我們未來支援此網站。 @@ -558,6 +550,11 @@ 永不 外部下載管理員 + + 啟用 Gecko 記錄 + + 結束應用程式讓變更生效… + 附加元件 @@ -642,6 +639,8 @@ 已經安裝的附加元件 + + 管理帳號 立即同步 @@ -1231,6 +1230,10 @@ 儲存為 PDF 無法產生 PDF + + 無法列印 + + 列印 傳送到裝置 @@ -1530,12 +1533,8 @@ 保護設定 加強型追蹤保護 - - 上網不被追蹤 現在提供 Total Cookie Protection 功能,這是我們針對跨網站追蹤器迄今最強大的屏障。 - - 自己保留自己的資料。%s 不讓常見的追蹤器記錄您的上網行為。 %s 不讓常見的追蹤器記錄您的上網行為。 @@ -1543,16 +1542,12 @@ 標準(預設) - 隱私權保護與效能兼顧。網站可正常運作。 - 頁面可正常載入,但封鎖少一點追蹤器。 標準追蹤保護會封鎖哪些內容 嚴格 - 封鎖更多追蹤器,讓網頁可以更快載入,但頁面上的某些功能可能會故障。 - 更強大的追蹤保護功能與更快的效能,但某些網站會無法正常運作。 嚴格追蹤保護會封鎖哪些內容 @@ -1910,7 +1905,7 @@ 新增搜尋引擎 - 新增搜尋引擎 + 新增搜尋引擎 編輯搜尋引擎 @@ -1925,17 +1920,17 @@ 其他 - 名稱 + 名稱 名稱 - 搜尋引擎名稱 + 搜尋引擎名稱 - 搜尋字串 + 搜尋字串 要使用的搜尋字串 - 用來搜尋的網址 + 用來搜尋的網址 用「%s」取代查詢關鍵字。例如:\nhttps://www.google.com/search?q=%s @@ -1943,7 +1938,7 @@ 自訂搜尋引擎詳細資訊 - 儲存 + 儲存 輸入搜尋引擎名稱 From 5fd4307d326ced334c7fd526d333a18f96e351c8 Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Thu, 6 Jul 2023 15:36:12 +0300 Subject: [PATCH 022/207] Bug 1841493 - Update search settings tests with new unified search UI --- .../fenix/helpers/FeatureSettingsHelper.kt | 5 + .../helpers/FeatureSettingsHelperDelegate.kt | 1 + .../fenix/helpers/HomeActivityTestRule.kt | 7 + .../java/org/mozilla/fenix/ui/SearchTest.kt | 13 + .../mozilla/fenix/ui/SettingsSearchTest.kt | 343 ++++++----------- .../mozilla/fenix/ui/robots/SearchRobot.kt | 95 ++--- .../ui/robots/SettingsSubMenuSearchRobot.kt | 360 ++++++++++-------- 7 files changed, 379 insertions(+), 445 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt index d5c6cc538..87444ff6f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt @@ -87,6 +87,11 @@ interface FeatureSettingsHelper { */ var isUnifiedSearchEnabled: Boolean + /** + * Enable or disable the Unified search settings feature. + */ + var newSearchSettingsEnabled: Boolean + fun applyFlagUpdates() fun resetAllFeatureFlags() diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt index eefa11bb5..ecc1c31d2 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt @@ -58,6 +58,7 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper { } override var isUnifiedSearchEnabled: Boolean by updatedFeatureFlags::isUnifiedSearchEnabled + override var newSearchSettingsEnabled: Boolean by updatedFeatureFlags::newSearchSettingsEnabled override var isPocketEnabled: Boolean by updatedFeatureFlags::isPocketEnabled override var isJumpBackInCFREnabled: Boolean by updatedFeatureFlags::isJumpBackInCFREnabled override var isWallpaperOnboardingEnabled: Boolean by updatedFeatureFlags::isWallpaperOnboardingEnabled diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt index f0848e98b..554bbda13 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt @@ -57,6 +57,7 @@ class HomeActivityTestRule( etpPolicy: ETPPolicy = getETPPolicy(settings), tabsTrayRewriteEnabled: Boolean = false, isUnifiedSearchEnabled: Boolean = false, + newSearchSettingsEnabled: Boolean = false, ) : this(initialTouchMode, launchActivity, skipOnboarding) { this.isHomeOnboardingDialogEnabled = isHomeOnboardingDialogEnabled this.isPocketEnabled = isPocketEnabled @@ -72,6 +73,7 @@ class HomeActivityTestRule( this.etpPolicy = etpPolicy this.tabsTrayRewriteEnabled = tabsTrayRewriteEnabled this.isUnifiedSearchEnabled = isUnifiedSearchEnabled + this.newSearchSettingsEnabled = newSearchSettingsEnabled } /** @@ -128,6 +130,7 @@ class HomeActivityTestRule( isCookieBannerReductionDialogEnabled = false, isOpenInAppBannerEnabled = false, isUnifiedSearchEnabled = false, + newSearchSettingsEnabled = false, ) } } @@ -162,6 +165,7 @@ class HomeActivityIntentTestRule internal constructor( isPWAsPromptEnabled: Boolean = !settings.userKnowsAboutPwas, isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR, isUnifiedSearchEnabled: Boolean = false, + newSearchSettingsEnabled: Boolean = false, isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding, isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions, isCookieBannerReductionDialogEnabled: Boolean = !settings.userOptOutOfReEngageCookieBannerDialog, @@ -177,6 +181,7 @@ class HomeActivityIntentTestRule internal constructor( this.isPWAsPromptEnabled = isPWAsPromptEnabled this.isTCPCFREnabled = isTCPCFREnabled this.isUnifiedSearchEnabled = isUnifiedSearchEnabled + this.newSearchSettingsEnabled = newSearchSettingsEnabled this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled this.isCookieBannerReductionDialogEnabled = isCookieBannerReductionDialogEnabled @@ -265,6 +270,7 @@ class HomeActivityIntentTestRule internal constructor( skipOnboarding: Boolean = false, tabsTrayRewriteEnabled: Boolean = false, isUnifiedSearchEnabled: Boolean = false, + newSearchSettingsEnabled: Boolean = false, ) = HomeActivityIntentTestRule( initialTouchMode = initialTouchMode, launchActivity = launchActivity, @@ -274,6 +280,7 @@ class HomeActivityIntentTestRule internal constructor( isPWAsPromptEnabled = false, isTCPCFREnabled = false, isUnifiedSearchEnabled = isUnifiedSearchEnabled, + newSearchSettingsEnabled = newSearchSettingsEnabled, isWallpaperOnboardingEnabled = false, isCookieBannerReductionDialogEnabled = false, isOpenInAppBannerEnabled = false, diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index b2c6a93d1..74fb656a8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -569,4 +569,17 @@ class SearchTest { verifyUrl(searchEngineCodes["DuckDuckGo"]!!) } } + + // Expected for en-us defaults + @Test + fun changeSearchEnginesBasedOnTextTest() { + homeScreen { + }.openSearch { + typeSearch("D") + verifySearchEnginePrompt(activityTestRule, "DuckDuckGo") + clickSearchEnginePrompt(activityTestRule, "DuckDuckGo") + }.submitQuery("firefox") { + verifyUrl("duckduckgo.com/?q=firefox") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index b2f33ac3b..3e811df44 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -1,6 +1,7 @@ package org.mozilla.fenix.ui import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.test.espresso.Espresso.pressBack import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before @@ -9,7 +10,6 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest -import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RecyclerViewIdlingResource @@ -18,19 +18,26 @@ import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestHelper.exitMenu -import org.mozilla.fenix.helpers.TestHelper.runWithCondition import org.mozilla.fenix.helpers.TestHelper.setTextToClipBoard +import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.searchScreen import org.mozilla.fenix.ui.util.ARABIC_LANGUAGE_HEADER class SettingsSearchTest { private lateinit var mockWebServer: MockWebServer private lateinit var searchMockServer: MockWebServer + private val defaultSearchEngineList = + listOf( + "Bing", + "DuckDuckGo", + "Google", + ) @get:Rule val activityTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule.withDefaultSettingsOverrides(), + HomeActivityIntentTestRule.withDefaultSettingsOverrides(isUnifiedSearchEnabled = true, newSearchSettingsEnabled = true), ) { it.activity } @Before @@ -52,28 +59,40 @@ class SettingsSearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - verifySearchToolbar() + verifySearchSettingsToolbar() + verifySearchEnginesSectionHeader() verifyDefaultSearchEngineHeader() - verifySearchEngineList() - verifyShowSearchSuggestions() - verifyShowSearchShortcuts() - verifySearchBrowsingHistory() - verifySearchBookmarks() - verifyShowClipboardSuggestionsDefault() + verifyDefaultSearchEngineSummary("Google") + verifyManageSearchShortcutsHeader() + verifyManageShortcutsSummary() + verifyAddressBarSectionHeader() + verifyAutocompleteURlsIsEnabled(true) + verifyShowClipboardSuggestionsEnabled(true) + verifySearchBrowsingHistoryEnabled(true) + verifySearchBookmarksEnabled(true) + verifySearchSyncedTabsEnabled(true) + verifyVoiceSearchEnabled(true) + verifyShowSearchSuggestionsEnabled(true) + verifyShowSearchSuggestionsInPrivateEnabled(false) } } + @SmokeTest @Test fun selectNewDefaultSearchEngine() { // Goes through the settings and changes the default search engine, then verifies it has changed. - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - changeDefaultSearchEngine("DuckDuckGo") - }.goBack { - }.goBack { - verifyDefaultSearchEngine("DuckDuckGo") + defaultSearchEngineList.forEach { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + openDefaultSearchEngineMenu() + changeDefaultSearchEngine(it) + exitMenu() + } + searchScreen { + verifySearchEngineIcon(it) + } } } @@ -98,11 +117,9 @@ class SettingsSearchTest { } } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test - fun toggleSearchBookmarksAndHistoryTest() { + fun toggleSearchHistoryTest() { val page1 = getGenericAsset(mockWebServer, 1) - val page2 = getGenericAsset(mockWebServer, 2) navigationToolbar { }.enterURLAndEnterToBrowser(page1.url) { @@ -125,8 +142,32 @@ class SettingsSearchTest { closeTab() } + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + switchSearchHistoryToggle() + exitMenu() + } + + homeScreen { + }.openSearch { + typeSearch("test") + verifyNoSuggestionsAreDisplayed( + activityTestRule, + "Firefox Suggest", + "Test_Page_1", + ) + } + } + + @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") + @Test + fun toggleSearchBookmarksTest() { + val website = getGenericAsset(mockWebServer, 1) + navigationToolbar { - }.enterURLAndEnterToBrowser(page2.url) { + }.enterURLAndEnterToBrowser(website.url) { }.openThreeDotMenu { }.bookmarkPage { }.openTabDrawer { @@ -137,11 +178,10 @@ class SettingsSearchTest { }.openThreeDotMenu { }.openHistory { verifyHistoryListExists() - clickDeleteHistoryButton("Test_Page_2") + clickDeleteHistoryButton("Test_Page_1") + exitMenu() } - exitMenu() - homeScreen { }.openSearch { typeSearch("test") @@ -149,10 +189,10 @@ class SettingsSearchTest { activityTestRule, "test", "Firefox Suggest", - "Test_Page_2", + "Test_Page_1", ) - }.clickSearchSuggestion("Test_Page_2") { - verifyUrl(page2.url.toString()) + }.clickSearchSuggestion("Test_Page_1") { + verifyUrl(website.url.toString()) }.openTabDrawer { closeTab() } @@ -161,12 +201,13 @@ class SettingsSearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - switchSearchHistoryToggle() switchSearchBookmarksToggle() + // We want to avoid confusion between history and bookmarks searches, + // so we'll disable this too. + switchSearchHistoryToggle() + exitMenu() } - exitMenu() - homeScreen { }.openSearch { typeSearch("test") @@ -174,48 +215,14 @@ class SettingsSearchTest { activityTestRule, "Firefox Suggest", "Test_Page_1", - "Test_Page_2", ) } } - // Ads a new search engine from the list of custom engines - @SmokeTest - @Test - fun addPredefinedSearchEngineTest() { - val searchEngine = "Reddit" - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - openAddSearchEngineMenu() - verifyAddSearchEngineList() - addNewSearchEngine(searchEngine) - verifyEngineListContains(searchEngine) - }.goBack { - }.goBack { - }.openSearch { - verifyKeyboardVisibility() - clickSearchEngineShortcutButton() - verifyEnginesListShortcutContains(activityTestRule, searchEngine) - changeDefaultSearchEngine(activityTestRule, searchEngine) - }.submitQuery("mozilla ") { - verifyUrl(searchEngine) - }.openThreeDotMenu { - }.openSettings { - verifySettingsOptionSummary("Search", "Google") - }.openSearchSubMenu { - changeDefaultSearchEngine(searchEngine) - }.goBack { - verifySettingsOptionSummary("Search", searchEngine) - } - } - // Verifies setting as default a customized search engine name and URL @SmokeTest @Test - fun editCustomSearchEngineTest() { + fun addCustomDefaultSearchEngineTest() { searchMockServer = MockWebServer().apply { dispatcher = SearchDispatcher() start() @@ -223,29 +230,33 @@ class SettingsSearchTest { val searchEngine = object { val title = "TestSearchEngine" val url = "http://localhost:${searchMockServer.port}/searchResults.html?search=%s" - val newTitle = "Test" } homeScreen { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { + openDefaultSearchEngineMenu() openAddSearchEngineMenu() - selectAddCustomSearchEngine() + verifySaveSearchEngineButtonEnabled(false) typeCustomEngineDetails(searchEngine.title, searchEngine.url) + verifySaveSearchEngineButtonEnabled(true) saveNewSearchEngine() + verifyEngineListContains(searchEngine.title) openEngineOverflowMenu(searchEngine.title) - clickEdit() - typeCustomEngineDetails(searchEngine.newTitle, searchEngine.url) - saveEditSearchEngine() - changeDefaultSearchEngine(searchEngine.newTitle) + pressBack() + changeDefaultSearchEngine(searchEngine.title) + pressBack() + openManageShortcutsMenu() + verifyEngineListContains(searchEngine.title) + pressBack() }.goBack { - verifySettingsOptionSummary("Search", searchEngine.newTitle) + verifySettingsOptionSummary("Search", searchEngine.title) }.goBack { }.openSearch { - verifyDefaultSearchEngine(searchEngine.newTitle) - clickSearchEngineShortcutButton() - verifyEnginesListShortcutContains(activityTestRule, searchEngine.newTitle) + verifySearchEngineIcon(searchEngine.title) + clickSearchSelectorButton() + verifySearchShortcutListContains(searchEngine.title) } } @@ -300,7 +311,7 @@ class SettingsSearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - toggleShowSuggestionsInPrivateSessions() + switchShowSuggestionsInPrivateSessionsToggle() }.goBack { }.goBack { }.openSearch { @@ -309,7 +320,6 @@ class SettingsSearchTest { } } - @SmokeTest @Test fun toggleVoiceSearchTest() { homeScreen { @@ -341,8 +351,9 @@ class SettingsSearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - verifyShowClipboardSuggestionsDefault() + verifyShowClipboardSuggestionsEnabled(true) toggleClipboardSuggestion() + verifyShowClipboardSuggestionsEnabled(false) exitMenu() } homeScreen { @@ -351,97 +362,37 @@ class SettingsSearchTest { } } - // Expected for en-us defaults @Test - fun undoDeleteSearchEngineTest() { - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - verifyEngineListContains("Bing") - openEngineOverflowMenu("Bing") - clickDeleteSearchEngine() - clickUndoSnackBarButton() - verifyEngineListContains("Bing") + fun deleteCustomSearchEngineTest() { + searchMockServer = MockWebServer().apply { + dispatcher = SearchDispatcher() + start() } - } - - // Expected for en-us defaults - @Test - fun deleteDefaultSearchEngineTest() { - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - verifyEngineListContains("Google") - verifyDefaultSearchEngine("Google") - openEngineOverflowMenu("Google") - clickDeleteSearchEngine() - verifyEngineListDoesNotContain("Google") - verifyDefaultSearchEngine("Bing") + val searchEngine = object { + val title = "TestSearchEngine" + val url = "http://localhost:${searchMockServer.port}/searchResults.html?search=%s" } - } - // Expected for en-us defaults - @Test - fun deleteAllSearchEnginesTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - runWithCondition(!appContext.settings().showUnifiedSearchFeature) { - // If the feature is disabled run old steps. - deleteMultipleSearchEngines( - "Google", - "Bing", - "Amazon.com", - "DuckDuckGo", - "eBay", - ) - verifyDefaultSearchEngine("Wikipedia") - verifyThreeDotButtonIsNotDisplayed("Wikipedia") - openAddSearchEngineMenu() - verifyAddSearchEngineListContains( - "Google", - "Bing", - "Amazon.com", - "DuckDuckGo", - "eBay", - ) - } - runWithCondition(appContext.settings().showUnifiedSearchFeature) { - // Run steps suitable for the enabled unified search feature. - deleteMultipleSearchEngines( - "Google", - "Bing", - "Amazon.com", - "eBay", - "Wikipedia", - ) - verifyDefaultSearchEngine("DuckDuckGo") - verifyThreeDotButtonIsNotDisplayed("DuckDuckGo") - openAddSearchEngineMenu() - verifyAddSearchEngineListContains( - "Google", - "Bing", - "Amazon.com", - "eBay", - "Wikipedia", - ) - } - } - } - - // Expected for en-us defaults - @Test - fun changeSearchEnginesBasedOnTextTest() { - homeScreen { - }.openSearch { - typeSearch("D") - verifySearchEnginePrompt(activityTestRule, "DuckDuckGo") - clickSearchEnginePrompt(activityTestRule, "DuckDuckGo") - }.submitQuery("firefox") { - verifyUrl("duckduckgo.com/?q=firefox") + openDefaultSearchEngineMenu() + openAddSearchEngineMenu() + verifySaveSearchEngineButtonEnabled(false) + typeCustomEngineDetails(searchEngine.title, searchEngine.url) + verifySaveSearchEngineButtonEnabled(true) + saveNewSearchEngine() + verifyEngineListContains(searchEngine.title) + openEngineOverflowMenu(searchEngine.title) + clickDeleteSearchEngine() + clickUndoSnackBarButton() + verifyEngineListContains(searchEngine.title) + changeDefaultSearchEngine(searchEngine.title) + openEngineOverflowMenu(searchEngine.title) + clickDeleteSearchEngine() + verifySnackBarText("Deleted ${searchEngine.title}") + verifyEngineListDoesNotContain(searchEngine.title) } } @@ -451,9 +402,6 @@ class SettingsSearchTest { homeScreen { }.openThreeDotMenu { }.openSettings { - }.openSearchSubMenu { - toggleShowSearchShortcuts() - }.goBack { }.openLanguageSubMenu { TestHelper.registerAndCleanupIdlingResources( RecyclerViewIdlingResource( @@ -471,74 +419,17 @@ class SettingsSearchTest { homeScreen { }.openSearch { verifyTranslatedFocusedNavigationToolbar("ابحث أو أدخِل عنوانا") - verifySearchEngineShortcuts( - activityTestRule, + clickSearchSelectorButton() + verifySearchShortcutListContains( "Google", "Bing", "Amazon.com", "DuckDuckGo", "ويكيبيديا (ar)", ) - changeDefaultSearchEngine(activityTestRule, "ويكيبيديا (ar)") + selectTemporarySearchMethod("ويكيبيديا (ar)") }.submitQuery("firefox") { - verifyUrl("ar.m.wikipedia.org") - } - } - - // Expected for en-us defaults - @Test - fun toggleSearchEnginesShortcutListTest() { - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - verifyShowSearchEnginesToggleState(false) - toggleShowSearchShortcuts() - verifyShowSearchEnginesToggleState(true) - } - - exitMenu() - - homeScreen { - }.openSearch { - verifySearchEngineShortcuts( - activityTestRule, - "Google", - "Bing", - "Amazon.com", - "DuckDuckGo", - "eBay", - "Wikipedia", - ) - scrollToSearchEngineSettings(activityTestRule) - }.clickSearchEngineSettings(activityTestRule) { - toggleShowSearchShortcuts() - verifyShowSearchEnginesToggleState(false) - } - - exitMenu() - - homeScreen { - }.openSearch { - verifySearchEngineShortcutsAreNotDisplayed( - activityTestRule, - "Google", - "Bing", - "Amazon.com", - "DuckDuckGo", - "eBay", - "Wikipedia", - ) - clickSearchEngineShortcutButton() - verifySearchEngineShortcuts( - activityTestRule, - "Google", - "Bing", - "Amazon.com", - "DuckDuckGo", - "eBay", - "Wikipedia", - ) + verifyUrl("firefox") } } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index 9b2869024..ded6da16c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -7,11 +7,9 @@ package org.mozilla.fenix.ui.robots import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.junit4.android.ComposeNotIdleException import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -24,7 +22,6 @@ import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.matcher.ViewMatchers -import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText @@ -188,15 +185,26 @@ class SearchRobot { ).click() } - fun verifySearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) = - assertSearchEnginePrompt(rule, searchEngineName) + fun verifySearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) { + rule.waitForIdle() + rule.onNodeWithText("Search $searchEngineName").assertIsDisplayed() + rule.onNodeWithText( + getStringResource(R.string.search_engine_suggestions_description), + ).assertIsDisplayed() + } + fun verifySearchBarEmpty() = assertSearchBarEmpty() fun verifyKeyboardVisibility() = assertKeyboardVisibility(isExpectedToBeVisible = true) fun verifySearchEngineList(rule: ComposeTestRule) = rule.assertSearchEngineList() fun verifySearchSelectorButton() { - assertTrue(itemWithResId("$packageName:id/search_selector").waitForExists(waitingTime)) + assertTrue(searchSelectorButton.waitForExists(waitingTime)) + } + + fun clickSearchSelectorButton() { + searchSelectorButton.waitForExists(waitingTime) + searchSelectorButton.click() } fun verifySearchEngineIcon(name: String) = @@ -209,13 +217,25 @@ class SearchRobot { ) } - fun verifyDefaultSearchEngine(expectedText: String) = assertDefaultSearchEngine(expectedText) - - fun verifyEnginesListShortcutContains(rule: ComposeTestRule, searchEngineName: String) = assertEngineListShortcutContains(rule, searchEngineName) + fun verifySearchShortcutListContains(vararg searchEngineName: String) { + searchEngineName.forEach { + assertTrue( + searchShortcutList.getChild(UiSelector().text(it)) + .waitForExists(waitingTimeShort), + ) + } + } + // Old search UI shortcut selector - to be removed. fun changeDefaultSearchEngine(rule: ComposeTestRule, searchEngineName: String) = rule.selectDefaultSearchEngine(searchEngineName) + // New unified search UI search selector. + fun selectTemporarySearchMethod(searchEngineName: String) { + searchShortcutList.getChild(UiSelector().text(searchEngineName)).click() + } + + // Old search UI shortcut selector - to be removed. fun clickSearchEngineShortcutButton() { itemWithResId("$packageName:id/search_engines_shortcut_button").also { it.waitForExists(waitingTime) @@ -317,17 +337,6 @@ class SearchRobot { } } - fun verifySearchEngineShortcutsAreNotDisplayed(rule: ComposeTestRule, vararg searchEngines: String) { - mDevice.findObject( - UiSelector().resourceId("$packageName:id/pill_wrapper_divider"), - ).waitForExists(waitingTime) - - for (searchEngine in searchEngines) { - rule.waitForIdle() - rule.onNodeWithText(searchEngine).assertDoesNotExist() - } - } - fun verifyTypedToolbarText(expectedText: String) { mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) .waitForExists(waitingTime) @@ -439,14 +448,6 @@ private fun clearButton() = private fun searchWrapper() = mDevice.findObject(UiSelector().resourceId("$packageName:id/search_wrapper")) -private fun assertSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) { - rule.waitForIdle() - rule.onNodeWithText("Search $searchEngineName").assertIsDisplayed() - rule.onNodeWithText( - getStringResource(R.string.search_engine_suggestions_description), - ).assertIsDisplayed() -} - private fun assertScanButton() = assertTrue( scanButton.waitForExists(waitingTime), @@ -459,6 +460,8 @@ private fun assertSearchButton() = ).waitForExists(waitingTime), ) +private val searchSelectorButton = itemWithResId("$packageName:id/search_selector") + private fun assertSearchBarEmpty() = assertTrue( mDevice.findObject( @@ -513,29 +516,8 @@ private fun ComposeTestRule.assertSearchEngineList() { .assertIsDisplayed() } -@OptIn(ExperimentalTestApi::class) -private fun assertEngineListShortcutContains(rule: ComposeTestRule, searchEngineName: String) { - try { - rule.waitForIdle() - } catch (e: ComposeNotIdleException) { - mDevice.pressBack() - navigationToolbar { - }.clickUrlbar { - clickSearchEngineShortcutButton() - } - } finally { - mDevice.findObject( - UiSelector().textContains("Google"), - ).waitForExists(waitingTime) - - rule.onNodeWithTag("mozac.awesomebar.suggestions") - .performScrollToNode(hasText(searchEngineName)) - - rule.onNodeWithText(searchEngineName) - .assertIsDisplayed() - .assertHasClickAction() - } -} +private val searchShortcutList = + mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_menu_recyclerView")) private fun ComposeTestRule.selectDefaultSearchEngine(searchEngine: String) { onNodeWithText(searchEngine) @@ -544,15 +526,6 @@ private fun ComposeTestRule.selectDefaultSearchEngine(searchEngine: String) { .performClick() } -private fun assertDefaultSearchEngine(expectedText: String) = - assertTrue( - mDevice.findObject( - UiSelector() - .resourceId("$packageName:id/mozac_browser_toolbar_edit_icon") - .descriptionContains(expectedText), - ).waitForExists(waitingTime), - ) - private fun assertTranslatedFocusedNavigationToolbar(toolbarHintString: String) = assertTrue( mDevice.findObject( @@ -566,5 +539,3 @@ private val awesomeBar = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")) private val voiceSearchButton = mDevice.findObject(UiSelector().description("Voice search")) - -private fun goBackButton() = onView(allOf(withContentDescription("Navigate up"))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index 5ba513173..775046a9f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -8,11 +8,13 @@ package org.mozilla.fenix.ui.robots import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.ViewInteraction import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.hasSibling import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.espresso.matcher.ViewMatchers.withClassName @@ -30,6 +32,7 @@ import org.hamcrest.Matchers.endsWith import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText +import org.mozilla.fenix.helpers.MatcherHelper.itemWithText import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper.getStringResource @@ -38,88 +41,134 @@ import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.isChecked +import org.mozilla.fenix.helpers.isEnabled /** * Implementation of Robot Pattern for the settings search sub menu. */ class SettingsSubMenuSearchRobot { - fun verifySearchToolbar() = assertSearchToolbar() - fun verifyDefaultSearchEngineHeader() = assertDefaultSearchEngineHeader() - fun verifySearchEngineList() = assertSearchEngineList() - - fun verifyShowSearchSuggestions() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show search suggestions")), + fun verifySearchSettingsToolbar() { + onView( + allOf( + withId(R.id.navigationToolbar), + hasDescendant(withContentDescription(R.string.action_bar_up_description)), + hasDescendant(withText(R.string.preferences_search)), ), - ) - onView(withText("Show search suggestions")) + ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + } + + fun verifySearchEnginesSectionHeader() { + onView(withText("Search Engines")).check(matches(isDisplayed())) + } + + fun verifyDefaultSearchEngineHeader() { + defaultSearchEngineHeader .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } - fun verifyShowSearchShortcuts() = assertShowSearchShortcuts() + fun verifyDefaultSearchEngineSummary(engineName: String) { + defaultSearchEngineHeader.check(matches(hasSibling(withText(engineName)))) + } - fun verifyShowClipboardSuggestionsDefault() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))), - ), - ) - onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))) + fun verifyManageSearchShortcutsHeader() { + manageSearchShortcutsHeader.check(matches(isDisplayed())) + } + + fun verifyManageShortcutsSummary() { + manageSearchShortcutsHeader + .check(matches(hasSibling(withText("Edit engines visible in the search menu")))) + } + + fun verifyAddressBarSectionHeader() { + onView(withText("Address bar")).check(matches(isDisplayed())) + } + + fun verifySearchEngineList() { + onView(withText("Google")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + onView(withText("Amazon.com")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + onView(withText("Bing")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + onView(withText("DuckDuckGo")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + onView(withText("Wikipedia")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + onView(withText("Add search engine")) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(true))))) } - fun toggleClipboardSuggestion() { - onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))) - .click() + fun verifyAutocompleteURlsIsEnabled(enabled: Boolean) { + autocompleteSwitchButton() + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) } - fun verifySearchBrowsingHistory() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Search browsing history")), - ), - ) - searchHistoryToggle + fun verifyShowSearchSuggestionsEnabled(enabled: Boolean) { + showSearchSuggestionSwitchButton() + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) + } + + fun verifyShowSearchSuggestionsInPrivateEnabled(enabled: Boolean) { + showSuggestionsInPrivateModeSwitch() + .check( + matches( + hasSibling( + withChild( + allOf( + withClassName(endsWith("CheckBox")), + isChecked(enabled), + ), + ), + ), + ), + ) + } + + fun verifyShowClipboardSuggestionsEnabled(enabled: Boolean) { + showClipboardSuggestionSwitch() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) } - fun verifySearchBookmarks() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Search bookmarks")), - ), - ) - searchBookmarksToggle + fun verifySearchBrowsingHistoryEnabled(enabled: Boolean) { + searchHistorySwitchButton() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) } - fun changeDefaultSearchEngine(searchEngineName: String) = - selectSearchEngine(searchEngineName) + fun verifySearchBookmarksEnabled(enabled: Boolean) { + searchBookmarksSwitchButton() + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) + } - fun toggleAutocomplete() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))), - ), - ) + fun verifySearchSyncedTabsEnabled(enabled: Boolean) { + searchSyncedTabsSwitchButton() + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) + } - onView(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))) - .click() + fun verifyVoiceSearchEnabled(enabled: Boolean) { + voiceSearchSwitchButton() + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) } - fun toggleShowSearchSuggestions() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show search suggestions")), - ), - ) + fun openDefaultSearchEngineMenu() { + defaultSearchEngineHeader.click() + } - onView(withText("Show search suggestions")) - .perform(click()) + fun openManageShortcutsMenu() { + manageSearchShortcutsHeader.click() } + fun changeDefaultSearchEngine(searchEngineName: String) = + selectSearchEngine(searchEngineName) + + fun toggleAutocomplete() = autocompleteSwitchButton().click() + + fun toggleShowSearchSuggestions() = showSearchSuggestionSwitchButton().click() + fun toggleShowSearchShortcuts() = itemContainingText(getStringResource(R.string.preferences_show_search_engines)) .also { @@ -128,60 +177,48 @@ class SettingsSubMenuSearchRobot { } fun toggleVoiceSearch() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show voice search")), - ), - ) - onView(withText("Show voice search")).perform(click()) + voiceSearchSwitchButton().perform(click()) } - fun switchSearchHistoryToggle() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Search browsing history")), - ), - ) - searchHistoryToggle.click() + fun toggleClipboardSuggestion() { + showClipboardSuggestionSwitch().click() } - fun switchSearchBookmarksToggle() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Search bookmarks")), - ), - ) - searchBookmarksToggle.click() - } + fun switchSearchHistoryToggle() = searchHistorySwitchButton().click() - fun toggleShowSuggestionsInPrivateSessions() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))), - ), - ) - onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))) - .click() - } + fun switchSearchBookmarksToggle() = searchBookmarksSwitchButton().click() - fun openAddSearchEngineMenu() = addSearchEngineButton().click() + fun switchShowSuggestionsInPrivateSessionsToggle() = showSuggestionsInPrivateModeSwitch().click() - fun verifyAddSearchEngineList() = assertAddSearchEngineList() + fun openAddSearchEngineMenu() = addSearchEngineButton().click() - fun verifyEngineListContains(searchEngineName: String) = assertEngineListContains(searchEngineName) + fun verifyEngineListContains(searchEngineName: String) { + assertTrue(itemWithText(searchEngineName).waitForExists(waitingTimeShort)) + } fun verifyEngineListDoesNotContain(searchEngineName: String) = assertEngineListDoesNotContain(searchEngineName) - fun verifyDefaultSearchEngine(searchEngineName: String) = assertDefaultSearchEngine(searchEngineName) + fun verifyDefaultSearchEngine(searchEngineName: String) { + onView( + allOf( + withId(R.id.radio_button), + withParent(withChild(withText(searchEngineName))), + ), + ).check(matches(isChecked(true))) + } fun verifyThreeDotButtonIsNotDisplayed(searchEngineName: String) = assertThreeDotButtonIsNotDisplayed(searchEngineName) fun verifyAddSearchEngineListContains(vararg searchEngines: String) { for (searchEngine in searchEngines) { - assertEngineListContains(searchEngine) + onView(withId(R.id.search_engine_group)).check(matches(hasDescendant(withText(searchEngine)))) } } + fun verifySaveSearchEngineButtonEnabled(enabled: Boolean) { + addSearchEngineSaveButton().check(matches(isEnabled(enabled))) + } + fun saveNewSearchEngine() { addSearchEngineSaveButton().click() assertTrue( @@ -191,20 +228,10 @@ class SettingsSubMenuSearchRobot { ) } - fun addNewSearchEngine(searchEngineName: String) { - selectSearchEngine(searchEngineName) - saveNewSearchEngine() - } - - fun selectAddCustomSearchEngine() = onView(withText("Other")).click() - fun typeCustomEngineDetails(engineName: String, engineURL: String) { - mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear() - mDevice.findObject(By.res("$packageName:id/edit_engine_name")).setText(engineName) - mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear() - mDevice.findObject(By.res("$packageName:id/edit_search_string")).setText(engineURL) - try { + mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear() + mDevice.findObject(By.res("$packageName:id/edit_engine_name")).text = engineName assertTrue( mDevice.findObject( UiSelector() @@ -213,6 +240,8 @@ class SettingsSubMenuSearchRobot { ).waitForExists(waitingTime), ) + mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear() + mDevice.findObject(By.res("$packageName:id/edit_search_string")).text = engineURL assertTrue( mDevice.findObject( UiSelector() @@ -222,17 +251,13 @@ class SettingsSubMenuSearchRobot { ) } catch (e: AssertionError) { println("The name or the search string were not set properly") - - // Lets again set both name and search string - goBackButton().click() - openAddSearchEngineMenu() - selectAddCustomSearchEngine() +// +// // Lets again set both name and search string +// goBackButton().click() +// openAddSearchEngineMenu() mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear() mDevice.findObject(By.res("$packageName:id/edit_engine_name")).setText(engineName) - mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear() - mDevice.findObject(By.res("$packageName:id/edit_search_string")).setText(engineURL) - assertTrue( mDevice.findObject( UiSelector() @@ -241,6 +266,8 @@ class SettingsSubMenuSearchRobot { ).waitForExists(waitingTime), ) + mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear() + mDevice.findObject(By.res("$packageName:id/edit_search_string")).setText(engineURL) assertTrue( mDevice.findObject( UiSelector() @@ -305,47 +332,84 @@ fun searchSettingsScreen(interact: SettingsSubMenuSearchRobot.() -> Unit): Setti return SettingsSubMenuSearchRobot.Transition() } -private fun assertSearchToolbar() = - onView( - allOf( - withId(R.id.navigationToolbar), - hasDescendant(withContentDescription(R.string.action_bar_up_description)), - hasDescendant(withText(R.string.preferences_search)), +private val defaultSearchEngineHeader = + onView(withText("Default search engine")) + +private val manageSearchShortcutsHeader = onView(withText("Manage search shortcuts")) + +private fun searchHistorySwitchButton(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Search browsing history")), ), - ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + ) + return onView(withText("Search browsing history")) +} -private fun assertDefaultSearchEngineHeader() = - onView(withText("Default search engine")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) +private fun searchBookmarksSwitchButton(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Search bookmarks")), + ), + ) + return onView(withText("Search bookmarks")) +} -private fun assertSearchEngineList() { - onView(withText("Google")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - onView(withText("Amazon.com")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - onView(withText("Bing")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - onView(withText("DuckDuckGo")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - onView(withText("Wikipedia")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - onView(withText("Add search engine")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) +private fun searchSyncedTabsSwitchButton(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Search synced tabs")), + ), + ) + return onView(withText("Search synced tabs")) } -private fun assertShowSearchShortcuts() { +private fun voiceSearchSwitchButton(): ViewInteraction { onView(withId(androidx.preference.R.id.recycler_view)).perform( RecyclerViewActions.scrollTo( - hasDescendant(withText("Show search engines")), + hasDescendant(withText("Show voice search")), ), ) - onView(withText("Show search engines")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + return onView(withText("Show voice search")) +} + +private fun autocompleteSwitchButton(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))), + ), + ) + + return onView(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))) } -private val searchHistoryToggle = onView(withText("Search browsing history")) +private fun showSearchSuggestionSwitchButton(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Show search suggestions")), + ), + ) -private val searchBookmarksToggle = onView(withText("Search bookmarks")) + return onView(withText("Show search suggestions")) +} + +private fun showClipboardSuggestionSwitch(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))), + ), + ) + return onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))) +} + +private fun showSuggestionsInPrivateModeSwitch(): ViewInteraction { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))), + ), + ) + return onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))) +} private fun selectSearchEngine(searchEngine: String) { onView(withText(searchEngine)) @@ -358,25 +422,7 @@ private fun goBackButton() = private fun addSearchEngineButton() = onView(withText("Add search engine")) -private fun assertAddSearchEngineList() { - onView(withText("Reddit")).check(matches(isDisplayed())) - onView(withText("YouTube")).check(matches(isDisplayed())) - onView(withText("Other")).check(matches(isDisplayed())) -} - -private fun addSearchEngineSaveButton() = onView(withId(R.id.add_search_engine)) - -private fun assertEngineListContains(searchEngineName: String) { - onView(withId(R.id.search_engine_group)).check(matches(hasDescendant(withText(searchEngineName)))) -} - -private fun assertDefaultSearchEngine(searchEngineName: String) = - onView( - allOf( - withId(R.id.radio_button), - withParent(withChild(withText(searchEngineName))), - ), - ).check(matches(isChecked(true))) +private fun addSearchEngineSaveButton() = onView(withId(R.id.save_button)) private fun assertEngineListDoesNotContain(searchEngineName: String) { onView(withId(R.id.search_engine_group)).check(matches(not(hasDescendant(withText(searchEngineName))))) From 3d1ed2735d743426ad64a831f7d13ad6dbb68bef Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 29 Jun 2023 12:08:12 +0300 Subject: [PATCH 023/207] Bug 1840995 - Fix flaky closePrivateTabTest UI test --- .../java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt index 5931e898a..ebadb175e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt @@ -30,6 +30,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import org.hamcrest.Matcher import org.mozilla.fenix.R import org.mozilla.fenix.helpers.HomeActivityComposeTestRule +import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.clickAtLocationInView import org.mozilla.fenix.helpers.idlingresource.BottomSheetBehaviorStateIdlingResource @@ -68,6 +70,7 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest fun verifyExistingOpenTabs(vararg titles: String) { titles.forEach { title -> + itemContainingText(title).waitForExists(waitingTime) composeTestRule.tabItem(title).assertExists() } } From cff76943687701e42c0372f6fbb3b93b24932bb4 Mon Sep 17 00:00:00 2001 From: iorgamgabriel Date: Thu, 6 Jul 2023 11:51:35 +0300 Subject: [PATCH 024/207] Bug 1837158 - Media playback should be stopped when the app is destroyed. --- .../main/java/org/mozilla/fenix/HomeActivity.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index b9a612e7b..ee1e24e24 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -49,6 +49,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.state.action.ContentAction +import mozilla.components.browser.state.action.MediaSessionAction import mozilla.components.browser.state.action.SearchAction import mozilla.components.browser.state.search.SearchEngine import mozilla.components.browser.state.selector.getNormalOrPrivateTabs @@ -602,6 +603,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { components.core.pocketStoriesService.stopPeriodicSponsoredStoriesRefresh() privateNotificationObserver?.stop() components.notificationsDelegate.unBindActivity(this) + stopMediaSession() } override fun onConfigurationChanged(newConfig: Configuration) { @@ -872,6 +874,21 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { themeManager.applyStatusBarTheme(this) } + // Stop active media when activity is destroyed. + private fun stopMediaSession() { + components.core.store.state.tabs.forEach { + it.mediaSessionState?.controller?.stop() + } + + components.core.store.state.findActiveMediaTab()?.let { + components.core.store.dispatch( + MediaSessionAction.DeactivatedMediaSessionAction( + it.id, + ), + ) + } + } + /** * Returns the [supportActionBar], inflating it if necessary. * Everyone should call this instead of supportActionBar. From 28612717251e0d4d355fd135da1d263f005fec57 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 5 Jul 2023 19:17:21 +0300 Subject: [PATCH 025/207] Bug 1841956 - New copy login credentials UI tests --- .../java/org/mozilla/fenix/ui/LoginsTest.kt | 41 +++++++++++++++++++ ...bMenuLoginsAndPasswordsSavedLoginsRobot.kt | 13 ++++++ 2 files changed, 54 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt index d8ff4895f..21b24b8cd 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt @@ -27,6 +27,7 @@ import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.restartApp import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText +import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.clearTextFieldItem import org.mozilla.fenix.ui.robots.clickPageObject @@ -792,4 +793,44 @@ class LoginsTest { verifyPrefilledLoginCredentials("mozilla", "firefox", true) } } + + @Test + fun verifyCopyUsernameTest() { + val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstLoginPage.url) { + clickSubmitLoginButton() + verifySaveLoginPromptIsDisplayed() + clickPageObject(itemWithText("Save")) + }.openThreeDotMenu { + }.openSettings { + }.openLoginsAndPasswordSubMenu { + }.openSavedLogins { + tapSetupLater() + viewSavedLoginDetails("test@example.com") + clickCopyUserNameButton() + verifySnackBarText("Username copied to clipboard") + } + } + + @Test + fun verifyCopyPasswordTest() { + val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstLoginPage.url) { + clickSubmitLoginButton() + verifySaveLoginPromptIsDisplayed() + clickPageObject(itemWithText("Save")) + }.openThreeDotMenu { + }.openSettings { + }.openLoginsAndPasswordSubMenu { + }.openSavedLogins { + tapSetupLater() + viewSavedLoginDetails("test@example.com") + clickCopyPasswordButton() + verifySnackBarText("Password copied to clipboard") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt index 230d475ec..bd1cd8717 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt @@ -33,6 +33,7 @@ import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName @@ -179,6 +180,18 @@ class SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot { fun clickGoBackButton() = goBackButton().click() + fun clickCopyUserNameButton() = + itemWithResId("$packageName:id/copyUsername").also { + it.waitForExists(waitingTime) + it.click() + } + + fun clickCopyPasswordButton() = + itemWithResId("$packageName:id/copyPassword").also { + it.waitForExists(waitingTime) + it.click() + } + class Transition { fun goBack(interact: SettingsSubMenuLoginsAndPasswordRobot.() -> Unit): SettingsSubMenuLoginsAndPasswordRobot.Transition { goBackButton().perform(ViewActions.click()) From 83b172afb57197bc67512d6f8dbf7ebbc0205114 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 6 Jul 2023 08:20:28 +0300 Subject: [PATCH 026/207] Bug 1841073 - Add missing conditions when verifying link related context menu options in UI tests --- .../fenix/ui/ComposeContextMenusTest.kt | 16 +-- .../org/mozilla/fenix/ui/ContextMenusTest.kt | 17 +-- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 113 ++++++++++-------- 3 files changed, 82 insertions(+), 64 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt index 60e8390bd..618dcd6f1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeContextMenusTest.kt @@ -87,7 +87,7 @@ class ComposeContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 1")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Open link in new tab") verifySnackBarText("New tab opened") clickSnackbarButton("SWITCH") @@ -111,7 +111,7 @@ class ComposeContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 2")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Open link in private tab") verifySnackBarText("New private tab opened") clickSnackbarButton("SWITCH") @@ -133,7 +133,7 @@ class ComposeContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 3")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Copy link") verifySnackBarText("Link copied to clipboard") }.openNavigationToolbar { @@ -150,7 +150,7 @@ class ComposeContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { longClickPageObject(itemWithText("Link 3")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Copy link") verifySnackBarText("Link copied to clipboard") }.openNavigationToolbar { @@ -175,7 +175,7 @@ class ComposeContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 1")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Share link") shareOverlay { verifyShareLinkIntent(genericURL.url) @@ -258,7 +258,7 @@ class ComposeContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 1")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) dismissContentContextMenu() longClickPageObject(itemWithText("test_link_image")) verifyLinkImageContextMenuItems(imageResource.url) @@ -278,12 +278,12 @@ class ComposeContextMenusTest { clickPageObject(itemWithText("PDF form file")) waitForPageToLoad() longClickPageObject(itemWithText("Wikipedia link")) - verifyLinkContextMenuItems("wikipedia.org".toUri(), false) + verifyContextMenuForLinksToOtherHosts("wikipedia.org".toUri()) dismissContentContextMenu() // Some options are missing from the linked and non liked images context menus in PDF files // See https://bugzilla.mozilla.org/show_bug.cgi?id=1012805 for more details longClickPDFImage() - verifyLinkContextMenuItems("wikipedia.org".toUri()) + verifyContextMenuForLinksToOtherHosts("wikipedia.org".toUri()) dismissContentContextMenu() } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt index e3f19dee0..6f59007eb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt @@ -81,7 +81,7 @@ class ContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 1")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Open link in new tab") verifySnackBarText("New tab opened") clickSnackbarButton("SWITCH") @@ -105,7 +105,7 @@ class ContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 2")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Open link in private tab") verifySnackBarText("New private tab opened") clickSnackbarButton("SWITCH") @@ -127,7 +127,7 @@ class ContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 3")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Copy link") verifySnackBarText("Link copied to clipboard") }.openNavigationToolbar { @@ -144,7 +144,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { longClickPageObject(itemWithText("Link 3")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Copy link") verifySnackBarText("Link copied to clipboard") }.openNavigationToolbar { @@ -169,7 +169,7 @@ class ContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 1")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) clickContextMenuItem("Share link") shareOverlay { verifyShareLinkIntent(genericURL.url) @@ -252,7 +252,7 @@ class ContextMenusTest { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() longClickPageObject(itemWithText("Link 1")) - verifyLinkContextMenuItems(genericURL.url) + verifyContextMenuForLocalHostLinks(genericURL.url) dismissContentContextMenu() longClickPageObject(itemWithText("test_link_image")) verifyLinkImageContextMenuItems(imageResource.url) @@ -272,12 +272,12 @@ class ContextMenusTest { clickPageObject(itemWithText("PDF form file")) waitForPageToLoad() longClickPageObject(itemWithText("Wikipedia link")) - verifyLinkContextMenuItems("wikipedia.org".toUri(), false) + verifyContextMenuForLinksToOtherHosts("wikipedia.org".toUri()) dismissContentContextMenu() // Some options are missing from the linked and non liked images context menus in PDF files // See https://bugzilla.mozilla.org/show_bug.cgi?id=1012805 for more details longClickPDFImage() - verifyLinkContextMenuItems("wikipedia.org".toUri()) + verifyContextMenuForLinksToOtherHosts("wikipedia.org".toUri()) dismissContentContextMenu() } } @@ -289,6 +289,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { longClickPageObject(itemContainingText("Youtube link")) + verifyContextMenuForLinksToOtherApps("youtube.com".toUri()) clickContextMenuItem("Open link in external app") assertYoutubeAppOpens() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 15a22edca..f9e2db00f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -178,55 +178,43 @@ class BrowserRobot { ) } - fun verifyLinkContextMenuItems(containsURL: Uri, isTheLinkLocal: Boolean = true) { + fun verifyContextMenuForLocalHostLinks(containsURL: Uri) { // If the link is directing to another local asset the "Download link" option is not available - if (isTheLinkLocal) { - mDevice.waitNotNull( - Until.findObject(By.textContains(containsURL.toString())), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_new_tab))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_private_tab))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_copy_link))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_share_link))), - waitingTime, - ) - } else { - mDevice.waitNotNull( - Until.findObject(By.textContains(containsURL.toString())), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_new_tab))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_private_tab))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_copy_link))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_download_link))), - waitingTime, - ) - mDevice.waitNotNull( - Until.findObject(text(getStringResource(R.string.mozac_feature_contextmenu_share_link))), - waitingTime, - ) - } + // If the link is not re-directing to an external app the "Open link in external app" option is not available + assertItemContainingTextExists( + contextMenuLinkUrl(containsURL.toString()), + contextMenuOpenLinkInNewTab, + contextMenuOpenLinkInPrivateTab, + contextMenuCopyLink, + contextMenuShareLink, + ) + } + + fun verifyContextMenuForLinksToOtherApps(containsURL: Uri) { + // If the link is re-directing to an external app the "Open link in external app" option is available + // If the link is not directing to another local asset the "Download link" option is not available + assertItemContainingTextExists( + contextMenuLinkUrl(containsURL.toString()), + contextMenuOpenLinkInNewTab, + contextMenuOpenLinkInPrivateTab, + contextMenuCopyLink, + contextMenuDownloadLink, + contextMenuShareLink, + contextMenuOpenInExternalApp, + ) + } + + fun verifyContextMenuForLinksToOtherHosts(containsURL: Uri) { + // If the link is re-directing to another host the "Download link" option is available + // If the link is not re-directing to an external app the "Open link in external app" option is not available + assertItemContainingTextExists( + contextMenuLinkUrl(containsURL.toString()), + contextMenuOpenLinkInNewTab, + contextMenuOpenLinkInPrivateTab, + contextMenuCopyLink, + contextMenuDownloadLink, + contextMenuShareLink, + ) } fun verifyLinkImageContextMenuItems(containsURL: Uri) { @@ -1308,3 +1296,32 @@ private val totalCookieProtectionHintLearnMoreLink = itemContainingText(getStringResource(R.string.tcp_cfr_learn_more)) private val totalCookieProtectionHintCloseButton = itemWithDescription(getStringResource(R.string.mozac_cfr_dismiss_button_content_description)) + +// Context menu items +// Link URL +private fun contextMenuLinkUrl(linkUrl: String) = + itemContainingText(linkUrl) + +// Open link in new tab option +private val contextMenuOpenLinkInNewTab = + itemContainingText(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_new_tab)) + +// Open link in private tab option +private val contextMenuOpenLinkInPrivateTab = + itemContainingText(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_private_tab)) + +// Copy link option +private val contextMenuCopyLink = + itemContainingText(getStringResource(R.string.mozac_feature_contextmenu_copy_link)) + +// Download link option +private val contextMenuDownloadLink = + itemContainingText(getStringResource(R.string.mozac_feature_contextmenu_download_link)) + +// Share link option +private val contextMenuShareLink = + itemContainingText(getStringResource(R.string.mozac_feature_contextmenu_share_link)) + +// Open in external app option +private val contextMenuOpenInExternalApp = + itemContainingText(getStringResource(R.string.mozac_feature_contextmenu_open_link_in_external_app)) From 7e0189a643b1abb9d3b732de89b52d875565d180 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 3 Jul 2023 13:57:47 -0400 Subject: [PATCH 027/207] Bug 1841542 - Update Gradle to version 7.6.2 Also pick up a basically no-op Kotlin and Compose compiler bump while we're updating things. --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e19e01584..2df4d9e70 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -4,7 +4,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip # this is the network timeout default value in ms. networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME From d895351be553b2b4890d3df89253eb79a3085b3b Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 8 Jul 2023 00:03:50 +0000 Subject: [PATCH 028/207] Import translations from android-l10n --- app/src/main/res/values-br/strings.xml | 425 ++++++++++++++++----- app/src/main/res/values-fy-rNL/strings.xml | 25 +- app/src/main/res/values-kk/strings.xml | 21 +- app/src/main/res/values-kmr/strings.xml | 90 ++--- app/src/main/res/values-th/strings.xml | 21 +- 5 files changed, 391 insertions(+), 191 deletions(-) diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index f88da4021..3e0a20620 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -12,8 +12,10 @@ Gweredekaat ar Merdeiñ Prevez Diweredekaat ar Merdeiñ Prevez - + Klask pe chomlecʼh + + Klask er web Klask er roll istor @@ -43,9 +45,6 @@ Diuzet - - Sinedoù nevez - Enrollet nevez ’zo @@ -66,11 +65,11 @@ - - Ouzhpennañ ur verradenn evit digeriñ ivinelloù prevez adalek ho skramm degemer. - - Ouzhpennañ ur verradenn - + + Lañsit hoc’h ivinell prevez a zeu en ur stokadenn. + + Ouzhpennañ dʼar skramm degemer + Ket, trugarez @@ -81,9 +80,6 @@ Argas - - Argas - Hor c’heweriuster prevezded araoketañ betek-hen a lak an heulierien a-gostez. @@ -127,6 +123,9 @@ Ivinell prevez nevez + + Berradennoù klavier + Distreiñ @@ -168,6 +167,8 @@ Paouez Askouezhioù + + Titouroù ar gont Nʼeus tamm askouezh ebet amañ @@ -247,7 +248,7 @@ %s a ranno ar pezh a vizskrivit er varrenn chomlecʼhioù gant ho lusker enklask dre ziouer. - + Klask %s Klask war-eeun eus ar varrenn chomlec’h @@ -256,41 +257,18 @@ Arventennoù ar c’hlask - Ar wech-mañ klaskit: + Evit ar c’hlask-mañ: + + Lusker klask %s - - Petra zo nevez e %1$s - - Aesoc’h eo adstagañ lec’h m’ho peus paouezet. - - Pajenn degemer %1$s personelaet - - Mont d’hoc’h ivinelloù digor, sinedoù ha roll istor merdeiñ. - - Ivinelloù naet ha renket mat - - - Tennañ an ivinelloù diezhomm gant an aozadur gwellaet hag an ivinelloù a serr o-unan. - - Klaskoù nevesañ - - Adweladennit ho klaskoù nevesañ diwar ho pajenn degemer hag ivinelloù. - - - Gant ho pajenn Firefox personelaet eo aesoc’h da adstagañ lec’h m’ho peus paouezet. Klaskit e-touez hoc’h ivinelloù nevez, sinedoù ha disoc’hoù enklask. - Kejit gant ho pajenn degemer personelaet. Ivinelloù nevez, sinedoù ha disoc’hoù enklask a vo diskouezet amañ. - Donemat war un internet dizalc’h - Donemat war un internet personeloc’h Muioc’h a livioù, muioc’h a brevezded. An hevelep youl da lakaat an dud a-raok ar gounidoù. - Tremenit deus ar pellgomz d’an urzhiataer hezoug hag ar c’hontrefed - Cheñch skrammoù a zo aesoc’h c’hoazh bremañ Adkemerit an traoù e lec’h m’ho poa laosket anezho war un trevnad all, dre ho pajenn degemer. @@ -305,6 +283,64 @@ Serriñ + + + Gant ar rebuzadurioù e c’hallit ober muioc’h a draoù gant %s + + Goubredit hoc’h ivinelloù etre ho trevnadoù, merit ho pellgargadurioù, lennit alioù evit tapout seizh gwellañ gwarez buhez prevez %s ha muioc’h c’hoazh. + + Kenderc’hel + + Ket bremañ + + + + Lakait %s da vezañ ho merdeer dre ziouer + + Lakait Firefox da vezañ ho merdeer dre ziouer + + %1$s a lak an dud a-raok an arc’hant ha difenn a ra ho puhez prevez en ur stankañ an heulierien etre al lec’hiennoù. \n\nDeskit hiroc’h en hor %2$s. + + Firefox a lak an dud a-raok an arc’hant ha difenn a ra ho puhez prevez en ur stankañ an heulierien etre al lec’hiennoù. \n\nDeskit hiroc’h en hor evezhiadennoù a-fet buhez prevez. + + evezhiadennoù a-fet buhez prevez + + Lakaat da verdeer dre ziouer + + Ket bremañ + + Tremenit deus ar pellgomz d’an urzhiataer hezoug hag ar c’hontrol + + Adtapit ivinelloù ha gerioù-tremen diouzh ho trevnadoù all evit distreiñ e-lec’h ma oac’h. + + Kennaskañ + + Ket bremañ + + Gant ar rebuzadurioù e c’hallit ober muioc’h a draoù gant %s + + Gant ar rebuzadurioù e c’hallit ober muioc’h a draoù gant Firefox + + Kasit ivinelloù etre ho trevnadoù, merit pellgargadurioù, lennit alioù evit tapout seizh gwellañ gwarez buhez prevez %s. + + Kasit ivinelloù etre ho trevnadoù, merit pellgargadurioù, lennit alioù evit tapout seizh gwellañ gwarez buhez prevez Firefox. + + Gweredekaat ar rebuzadurioù + + Ket bremañ + Digeriñ en un ivinell %1$s nevez @@ -322,6 +358,14 @@ Hollek A-zivout + + Dibabit unan + + Merañ ar berradennoù klask + + Embann al luskerioù a c’haller gwelet el lañser klask + + Luskerioù a c’haller gwelet el lañser klask Keflusker enklask dre ziouer @@ -353,12 +397,66 @@ Ouzhpennañ ur verradenn merdeiñ prevez Mod HTTPS-hepken + + + Bihanadur banniel an toupinoù + + Bihanaat banniel an toupinoù + + + Diweredekaet + + Gweredekaet + + %1$s a glask nac’hañ ar goulennoù toupinoù ent emgefreek pa vez skrammet ur banniel toupinoù. + + Diweredekaet evit al lec’hienn-mañ + + Nullañ + + Goulenn vefe skoret + + Kas ur goulenn + + Goulenn vefe skoret al lec’hienn-mañ? + + Goulenn kaset + + Gweredekaet evit al lec’hienn-mañ + + Goulenn skor kaset + + N’eo ket skoret al lec’hienn-mañ c’hoazh + + Gweredekaat bihanaat banniel an toupinoù evit %1$s? + + Diweredekaat bihanaat banniel an toupinoù evit %1$s? + + %1$s n’hall ket nac’hañ ar goulennoù toupinoù war al lec’hienn-mañ. Gallout a rit goulenn e vefe skoret al lec’hienn-mañ en dazont. + + + %1$s a skarzho toupinoù al lec’hienn-mañ hag adkargañ a raio ar bajenn. Skarzhañ an holl doupinoù a c’hallfe digennaskañ ac’hanoc’h pe goullonderiñ ho panerioù. + + %1$s a c’hall klask nac’hañ ent emgefreek ar goulennoù toupinoù war al lec’hiennoù skoret. + + Aotren %1$s da nac’hañ ar goulennoù toupinoù? + + %1$s a c’hall nac’hañ ent emgefreek goulennoù ar bannieloù toupinoù. + + Ket bremañ + + Nebeutoc’h a c’houlennoù toupinoù a vo gwelet ganeoc’h + + Aotren + Klask kennaskañ ent emgefreek gant ar c’homenad HTTPS evit muioc’h a surentez. - - Gweredekaet - + Diweredekaet + + Gweredekaet en holl ivinelloù + + Gweredekaet en ivinelloù prevez Gouzout hiroc’h @@ -427,14 +525,31 @@ Leuniañ an ereoù ent emgefreek Digeriñ ereoù en arloadoù + + Atav + + Goulenn a-raok digeriñ + + Morse Ardoer pellgargañ diavaez + + + Gweredekaat kerzhlevr Gecko + + O serriñ emañ an arload evit kemer e kont ar cheñchamantoù… + Askouezhioù Rebuzadurioù + + Aotreet + + N’int ket aotreet + Dastumad askouezhioù nevez @@ -459,8 +574,6 @@ Gweladennet nevez ’zo - - Pocket Boued spered @@ -495,6 +608,17 @@ Embannadur bevennet + + Dastumad nevez ar Mouezhioù Dizalc’h. %s + + Dastumad nevez ar Mouezhioù Dizalc’h. + + Klaskit un tachad liv + + Dibabit ur skeudenn drekleur a blij deoc’h. + + Dizoleiñ skeudennoù drekleur all + Ne vez skoret an enlugellad-mañ @@ -503,6 +627,8 @@ An enlugellad-mañ a zo bet staliet endeo + + Ardeiñ ar gont Goubredañ bremañ @@ -639,17 +765,20 @@ Digeriñ %d a ivinelloù? + + Digeriñ kement a ivinelloù a c’hallfe gorrekaat %s keit m’emañ ar pajennoù o kargañ. Sur oc’h e fell deoc’h kenderc’hel? Digeriñ ivinelloù Nullañ - - Lec’hienn %d - - Lec’hiennoù %d + + %d bajenn + + %d a bajennoù Ivinelloù serret nevez zo @@ -705,6 +834,13 @@ Serriñ goude ur miz + + Digeriñ er bennbajenn + + Digeriñ en ivinell ziwezhañ + + Digeriñ er bennbajenn goude peder eurvezh + Dilec’hiañ an ivinelloù kozh dioberiant @@ -873,6 +1009,8 @@ Digeriñ war un ivinell brevez Digeriñ an holl en ivinelloù nevez + + Digeriñ en holl ivinelloù prevez Dilemel @@ -964,10 +1102,14 @@ Stanket gant Android Nemedennoù - - Gweredekaet Diweredekaet + + Skoueriek + + Strizh + + Personelaet Aotren an aodio ha video @@ -1049,6 +1191,14 @@ Rannañ + + Enrollañ evel PDF + + N’haller ket sevel ar PDF + + N’haller ket moullañ + + Moullañ Kas dʼun trevnad @@ -1059,11 +1209,11 @@ Eilañ er golver Eilet er golver - - Kennaskañ evit goubredañ Kennaskañ ouzh Sync - + + Goubredañ hag enrollañ ar roadennoù + Kas dʼan holl drevnadoù Adkennaskañ da Sync @@ -1091,12 +1241,36 @@ Serriñ an ivinelloù prevez Marketing + - Prim ha prevez eo %1$s + The app name is in the text, due to limitations with localizing Nimbus experiments --> + Firefox a zo prim ha prevez - Lakaat %1$s da verdeer dre ziouer + The app name is in the text, due to limitations with localizing Nimbus experiments --> + Lakaat Firefox da vezañ ho merdeer dre ziouer + + Klask ar merdeiñ prevez + + Merdeiñ hep toupin enrollet pe roll istor e %1$s + + Merdeiñ hep roud ebet + + Ar merdeiñ prevez e %1$s ne enroll ket ho titouroù. + + Kregiñ gant ho klask kentañ + + Klask un dra nes. Pe dizoloit un dra bennak plijus. + + + + Sikourit da wellaat Firefox en ul leuniañ ur sontadegig. + + Kemer perzh er sontadeg + + Ket, trugarez @@ -1189,6 +1363,14 @@ Kuitaat + + Mare da zilemel + + Dilemel a ra ar roll istor (an hini goubredet eus trevnadoù all ivez), toupinoù ha roadennoù merdeiñ. + + Dilemel a ra ar roll istor (ar roll istor goubredet eus trevnadoù all en o zouez) + + An eurvezh tremenet Hiziv ha dec’h @@ -1215,21 +1397,24 @@ Strollad dilemet - - Donemat war %s! - - Goubredañ Firefox etre an trevnadoù - - Degasit sinedoù, ur roll-istor ha gerioù-tremen evit %1$s war an trevnad-mañ. - - En em rollañ + + Donemat war un internet gwelloc’h + + Ur merdeer savet evit an dud ha n’eo ket ar gounidoù. + + Adloc’hit el lec’h m’ho peus paouezet + + Goubredit an ivinelloù hag ar gerioù-tremen a-dreuz ho trevnadoù evit tremen eus ur skramm d’egile digudenn. + + Kennaskañ Enaouet eo Sync - - Prevezded gweredekaet bepred - - %1$s a harz en un doare emgefreek ouzh an embregerezhioù d’ho heuliañ dre guzh war ar web. + + Gwarez ar vuhez prevez dre ziouer + + %1$s a harz en un doare emgefreek ouzh an embregerezhioù d’ho heuliañ dre guzh war ar web. + + Gant ar gwarez a-enep an toupinoù e c’hallit harzañ heulierien da implij an toupinoù evit spiañ ac’hanoc’h a-dreuz al lec’hiennoù. Skoueriek (dre ziouer) @@ -1240,16 +1425,17 @@ Stankañ muioc’h a heulierien hag ar pajennoù da gargañ buanoc’h, met arc’hweladurioù zo a c’hallo mont a-dreuz. Dibabit e pelec’h lakaat ho parrenn ostilhoù - - Lakait ar varrenn ostilhoù en ul lec’h aes da dizhout. Dalc’hit hi en traoñ pe diblasit anezhi e-krec’h. - - Ho puhez prevez - - Savet hon eus %s evit ma c’hallfec’h reoliñ ar pezh a rannit enlinenn hag ar pezh a rannit ganeomp. + + Mirit anezhi en traoñ pe lakait anezhi en nec’h. + + Mestroniañ a rit ho roadennoù + + Firefox a ro deoc’h ar galloud war ar pezh a c’hallit rannañ enlinenn hag ar pezh a rannit ganeomp. Lennit hon evezhiadenn a-get buhez prevez + + Prest d’ober anaoudegezh gant un internet digredus? Kregiñ da verdeiñ @@ -1302,22 +1488,22 @@ Arventennoù gwarez Gwarez heuliañ araoket - - Merdeit hep bezañ heuliet - - Mirit ho roadennoù ganeoc’h. %s a warezo ac’hanoc’h a-enep d’an heulierien a sell ouzhoc’h enlinenn. + + Bremañ gant ar gwarez e-enep an toupinoù, an harz brasañ a-enep an heulierien etre al lec’hiennoù an hini eo. + + %s a warezo ac’hanoc’h a-enep d’an heulierien a sell ouzhoc’h enlinenn. Gouzout hiroc’h Skoueriek (dre ziouer) - Kempouezet evit prevezded hag efedusted. Ar pajennoù a garg en un doare ordinal. + Ar pajennoù a gargo evel boaz, met ne vo ket stanket kement a heulier. Ar pezh a zo stanket gant ar gwarez heuliañ skoueriek Strizh - Stankañ muioc’h a heulierien hag ar pajennoù da gargañ buanoc’h, met arc’hweladurioù zo a c’hallo mont a-dreuz. + Gwarez heuliañ kreñvoc’h ha digonusted gwelloc’h, met lec’hiennoù ’zo a c’hallo chom hep mont en-dro. Ar pezh a zo stanket gant ar gwarez heuliañ strizh @@ -1337,6 +1523,8 @@ Holl doupinoù an tredeoù (gallout a ra mirout lec’hiennoù ’zo da vont en-dro en un doare dereat) An holl doupinoù (gallout a ra terriñ lec’hiennoù) + + Digenvezañ an toupinoù etre-lec’hiennoù. Endalc’had heuliañ @@ -1359,8 +1547,12 @@ Bevenniñ a ra barregezh ar rouedadoù kevredadel da heuliañ hoc’h oberiantiz merdeiñ. Toupinoù heuliañ etre lec’hiennoù + + Toupinoù etrelec’hienn Stankañ a ra an toupinoù implijet gant ar rouedadoù bruderezh hag an embregerezhioù dielfennañ evit kempunañ ho roadennoù merdeiñ a-dreuz meur a lec’hienn. + + Ar gwarez toupinoù klok a vir toupinoù al lec’hienn m’emaoc’h warni, evel-se n’hall ket an heulierien ober ganto evit heuliañ ac’hanoc’h etre al lec’hiennoù. Kriptogleuzerien @@ -1400,6 +1592,10 @@ Gouzout hiroc’h + + Arlun gwellvezioù an nemedennoù evit ar gwarez kreñvaet a-enep an heuliañ + Skor @@ -1532,6 +1728,9 @@ Lañser rummañ an titouroù kennaskañ + + + Leuniañ ent emgefreek Chomlec’hioù @@ -1554,6 +1753,11 @@ Merañ ar chomlec’hioù + + Enrollañ ha leuniañ ar chomlec’hioù en un doare emgefreek + + Enkorfañ a ra titouroù evel niverennoù, posteloù ha chomlec’hioù + Ouzhpennañ ur gartenn @@ -1624,6 +1828,12 @@ Chomlec’h Kêr + + Stad + + Rannvro + + Zip Bro pe rannvro @@ -1650,6 +1860,8 @@ Ouzhpennañ ul lusker klask + + Ouzhpennañ ul lusker enklask nevez Embann al lusker klask @@ -1663,15 +1875,26 @@ All + + Anv Anv + + Anv ar c’heflusker enklask + + URL ar chadenn glask Testenn glask da implij + + URL da implij evit ar c’hlask - Amsaviñ ar gerioù klasket gant “%s”. Da skouer: \nhttps://www.google.com/search?q= %s + Amsaviñ ar gerioù klasket gant “%s”. Da skouer: \nhttps://www.google.com/search?q= %s Munudoù al lusker klask personelaet + + Enrollañ + Enankit anv al lusker klask @@ -1823,6 +2046,9 @@ Displegañ an ivinelloù dioberiant + + Bihanaat an ivinelloù dioberiant + Serriñ emgefreek goude ur miz? @@ -1834,6 +2060,15 @@ Em-serriñ enaouet + + + Firefox a ginnig + + + Klask Google + + Klask %s + Digeriñ liammoù al lec’hiennoù, posteloù ha kemennadennoù e Firefox en un doare emgefreek. @@ -1856,8 +2091,8 @@ Istorioù dre dem Dizoloiñ muioc’h - - Galloudekaet gant Pocket. + + Lusket gant %s. Ezel eus familh Firefox. %s @@ -1870,6 +2105,16 @@ Gweredekaet ar pellventerezh evit kas roadennoù. Mont d’an arventennoù - Firefox a ginnig - + + + bihanaat + + astenn + + digeriñ an ere evit gouzout hiroc’h diwar-benn an dastumad-mañ + + lenn ar pennad + + digeriñ an ere da c’houzout hiroc’h + diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 9856f47c9..69dfa83be 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -427,18 +427,12 @@ Oanfraach ferstjoere - Reduksje fan cookiebanners - Stipe oanfreegje foar dizze side? - Fersyk om te websitestipe yntsjinne. - Oanfraach ferstjoerd Oan foar dizze website - Fersyk om te websitestipe yntsjinne - Stipe-oanfraach ferstjoerd Website wurdt op dit stuit net stipe @@ -446,8 +440,6 @@ Reduksje fan cookiebanners ynskeakelje foar %1$s? Reduksje fan cookiebanners útskeakelje foar %1$s? - - Dizze website wurdt op it stuit net stipe troch Reduksje fan cookiebanners. Wolle jo dat ús team dizze website beoardielet en yn de takomst stipe tafoeget? %1$s kin cookiefersiken op dizze website net automatysk wegerje. Jo kinne in oanfraach stjoere om dizze website yn de takomst te stypjen. @@ -553,6 +545,11 @@ Nea Eksterne downloadbehearder + + Gecko-lochboeken ynskeakelje + + De tapassing wurdt ôfsluten om wizigingen ta te passen… + Add-ons @@ -1204,6 +1201,10 @@ Bewarje as PDF Kin PDF net oanmeitsje + + Kin net ôfdrukke + + Ofdrukke Ferstjoere nei apparaat @@ -1493,12 +1494,8 @@ Beskermingsynstellingen Ferbettere beskerming tsjin folgjen - - Sneup sûnder folge te wurden No mei Totale cookiebeskerming, ús krêftichste barriêre oant no ta tsjin cross-sitetrackers. - - Hâld jo gegevens foar josels. %s beskermet jo tsjin in protte fan de meast foarkommende trackers dy’t folgje wat jo online dogge. %s beskermet jo tsjin in protte fan de meast foarkommende trackers dy\’t folgje wat jo online dogge. @@ -1506,16 +1503,12 @@ Standert (standert) - Balansearre foar privacy en prestaasjes. Siden lade normaal. - Siden wurde normaal laden, mar der wurde minder trackers blokkearre. Wat wurdt blokkearre troch standert beskerming tsjin folgjen Strang - Blokkearret mear trackers, sadat siden rapper laden wurde, mar guon funksjonaliteit op in side wurket mooglik net. - Sterkere beskerming tsjin folgjen en fluggere prestaasjes, mar guon websites wurkje mooglik net goed. Wat wurdt blokkearre troch strange beskerming tsjin folgjen diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 00e0e7dbe..fadc33270 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -422,18 +422,12 @@ Сұранымды жіберу - Cookie баннерлерін азайту - Осы сайтқа қолдауды сұрау керек пе? - Сайтқа қолдау көрсетуге сұраным жіберілді. - Сұраным жіберілді Бұл сайт үшін іске қосылған - - Сайтқа қолдау көрсетуге сұраным жіберілді Қолдау көрсету сұрауы жіберілді @@ -443,8 +437,6 @@ %1$s үшін cookie баннерлерін азайту мүмкіндігін сөндіру керек пе? - - Бұл сайтқа қазіргі уақытта Cookie баннерлерін азайту қолдау көрсетпейді. Біздің топ осы веб-сайтты қарап шығуды және болашақта қолдау көрсетуді қалайсыз ба? %1$s бұл сайттағы cookie сұрауларын автоматты түрде қабылдамай алмайды. Болашақта осы сайтқа қолдау көрсету туралы сұраным жібере аласыз. @@ -549,6 +541,11 @@ Ешқашан Сыртқы жүктеу менеджері + + Gecko журналдарын іске қосу + + Өзгерістерді іске асыру үшін қолданбадан шығу… + Қосымшалар @@ -1496,12 +1493,8 @@ Қорғаныс баптаулары Бақылаудан кеңейтілген қорғаныс - - Бақылаусыз шолу Енді сайтаралық трекерлерге қарсы ең күшті тосқауыл болып табылатын Cookie файлдарынан Толық қорғаныс функциясы бар. - - Деректеріңізді тек өзіңіз үшін қалдырыңыз. %s желіде сіздің соңыңыздан еретін ең кең тараған трекерлердің көбінен қорғайды. %s желіде сіздің соңыңыздан еретін ең кең тараған трекерлердің көбінен қорғайды. @@ -1510,16 +1503,12 @@ Стандартты (бастапқы) - Жекелік және өнімділік теңгерімі. Беттер әдеттегідей жүктеледі. - Беттер қалыпты түрде жүктеледі, бірақ азырақ трекерлерді бұғаттайды. Бақылаудан қалыпты қорғаныс нені бұғаттайды Қатаң - - Беттерді тезірек жүктеу үшін көбірек трекерлерді блоктайды, бірақ кейбір беттер функционалдылығы бұзылуы мүмкін. Бақылаудан күшейтілген қорғаныс және жылдамырақ жұмыс істеу, бірақ кейбір сайттар дұрыс жұмыс істемеуі мүмкін. diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 78887a960..16db97f1b 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -68,8 +68,6 @@ - Hilpekîna din a veşartî bi destdanekê veke. - Hilpekîna din a nepen bi tiliyekê veke. Tevlî ekrana destpêkê bike @@ -129,6 +127,9 @@ Hilpekîna veşartî ya nû + + Kurterêya şîfreyan + vegere @@ -252,7 +253,7 @@ %s dê hemû tiştên tu li darika navnîşanan binivîsî bi motora te ya lêgerînê ya derbasdar re parve bike. - + Bi %s bigere Lêgerînê rasterast ji darikê navnîşanan bike @@ -260,12 +261,12 @@ Eyarên lêgerînê - - Lêgerîna niha: - Bi vê bigere: + + Motora lêgerînê ya %sê + Serrûpela xwe ya taybet nas bike. Tu yê li virê hilpekîn, bijare û encamên lêgerînên xwe yên dawiyê bibînî. @@ -305,6 +306,9 @@ %sê bike geroka xwe ya sereke + + Firefoxê bike geroka xwe ya sereke @@ -353,6 +357,10 @@ Giştî Derbar + + Yekê hilbijêre + + Kurterêyên lêgerînê bi rêve bibe Motora lêgerînê ya jixweber @@ -402,15 +410,17 @@ Betal - Piştgiriyê bixwaze + Piştgiriyê bixwaze + + Daxwazê bişîne - Kêmkirina Banerên Çerezan + Ji bo vê malperê piştgiriyê dixwazî? - Daxwaz ji malpera piştgiriyê re hate şandin. + Daxwaz hat şandin Ji bo vê malperê vekirî ye - Daxwaz ji malpera piştgiriyê re hate şandin + Daxwaza piştgiriyê hat şandin Malper niha nayê piştgirîkirin @@ -418,51 +428,25 @@ Bila ji bo %1$sê agahdariyên xurekê were girtin? - - Ev malper hê ji aliyê Kêmkirina Banerên Çerezan ve nayê piştgirîkirin. Tu dixwazî ku tîma me vê malperê lêkolîn bike û di demên pêş de piştgiriyê bidê? %1$s ew ê hemû xurekên malperê paqij bike û malperê nû bike. Paqijkirina hemû xurekan dibe ku têketina te bigire û sepeta te ya danûstandinê vala bike. - - %1$s dikare hewlê bide ku daxwazên çerezan bixweber red bike. %1$s hewlêdidebide ku daxwazên çerezan yên li ser malperên piştgirîkirî bixweber red bike. - - Destûrê didî Firefoxê ku banerên çerezan red bike? Destûrê didî %1$sê ku banerên çerezan red bike? - - Gava gengaz be daxwazên çerezan bixweber red bike. - - Destûrê bide %1$sê ku gava gengaz be daxwazên çerezan bixweber red bike? %1$s dikare gelek daxwazên banerên çerezan bixweber red bike. Ne niha - - Banerê bigire Tu yê hindiktir daxwazên çerezan bibînî - - Hindiktir pop-upên çerezan bibîne - - Ji bo gereka bibaldartir pop-upên çerezan xweber bibersivîne. Heke gengaz be %1$s dê hemû daxwazan red bike. - - Pop-ups bigire - - Kêmkirina Banerên Çerezan - - Destûrê didî ku %1$s gava gengaz be daxwaza razîbûna çerezan ya malperan red bike? - - Destûrê bide Destûrê bidê Ji bo ewlekariya zêdetir hewlê bide ku bi protokola şîfrekirî ya HTTPSê bi awayekî xweber têkeve malperan. - - Vekirî Girtî @@ -545,6 +529,7 @@ Ti caran Rêvebera daxistinê ya derveyî + Pêvek @@ -630,6 +615,8 @@ Pêvek jixwe sazkirî ye + + Hesabî bi rêve bibe Aniha senkronîze bike @@ -777,15 +764,9 @@ Betal bike - - %d malper %d rûpel - - %d malper @@ -1117,8 +1098,6 @@ Ji hêla Androidê ve hate astengkirin Istisna - - Vekirî Girtî @@ -1211,6 +1190,10 @@ Wekî PDF qeyd bike PDF nayê çêkirin + + Nehate çapkirin + + Çap bike Bişîne cîhazê @@ -1379,7 +1362,7 @@ Dema dê jê bê birin - Raboriyê (raboriya ji cîhazên din jî senkronîzekirî), çerezan û agahiyên din yên gerokê tên jêbirin. + Raboriyê (raboriya ji cîhazên din jî senkronîzekirî), çerezan û agahiyên din yên gerokê tên jêbirin. Demjimêra dawiyê @@ -1500,12 +1483,8 @@ Sazkariyên parastinê Parastina ji şopandinê ya pêşketî - - Bêyî ku tu werî şopandin bigere Niha taybetiya Parastina Tevahî ya Çerezan li dijî kodên şopandina navmalperî bariyera me ya herî xurt e. - - Bila daneyên te ji te re bimînin. %s te ji gelek şopdarên dilxerab diparêze û nahêle tiştên ku tu li ser înternetê dikî ji aliyê wan ve bên dîtin. %s te li hemberî piraniya şopgerên naskirî yên tevgerên te yên li ser înternetê dişopînin, diparêze. @@ -1513,16 +1492,12 @@ Standard (heyî) - Hevsengiya ji bo nepenî û performansê. Rûpel asayî tên barkirin. - Rûpel dê bi awayê asayî bên barkirin, lê dê hindiktir şopger bên astengkirin. Bi parastina ji şopandinê ya standard çi tên astengkirin? Tund - Ji bo rûpel zûtir bên vekirin zêdetir şopîneran asteng dike lê dibe ku hin fonksiyonên rûpelan xira bibin. - Parastina ji şopandinê ya bihêztir û performansa zûtir, lê dibe ku hin malper birêkûpêk nexebitin. Bi parastina ji şopandinê ya tund çi tên astengkirin? @@ -1877,6 +1852,8 @@ Motora lêgerînê tevlî bike + + Motora lêgerînê ya nû lê zêde bike Motora lêgerînê sererast bike @@ -1891,8 +1868,12 @@ Yên din + + Nav Nav + + Navê motora lêgerînê Rêzika lêgerînê ya ji bo bikaranînê @@ -1901,6 +1882,9 @@ Hûrgiliyên motora lêgerînê ya taybet + + Qeyd bike + Navê motora lêgerînê binivîse diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 6c0c1c0b5..ae37218ef 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -424,18 +424,12 @@ ส่งคำขอ - การลดแบนเนอร์คุกกี้ - ขอการรองรับไซต์นี้ไหม? - ส่งคำขอรองรับไซต์แล้ว - ส่งคำขอแล้ว เปิดสำหรับไซต์นี้ - - ส่งคำขอรองรับไซต์แล้ว ส่งคำขอรองรับแล้ว @@ -444,8 +438,6 @@ ต้องการเปิดการลดแบนเนอร์คุกกี้สำหรับ %1$s หรือไม่? ต้องการปิดการลดแบนเนอร์คุกกี้สำหรับ %1$s หรือไม่? - - ขณะนี้ไซต์นี้ไม่รองรับการลดแบนเนอร์คุกกี้ คุณต้องการให้ทีมงานของเราตรวจสอบเว็บไซต์นี้และเพิ่มการรองรับในอนาคตหรือไม่? %1$s ไม่สามารถปฏิเสธคำขอคุกกี้โดยอัตโนมัติบนไซต์นี้ คุณสามารถส่งคำขอให้รองรับไซต์นี้ในอนาคตได้ @@ -551,6 +543,11 @@ ไม่เลย ตัวจัดการการดาวน์โหลดภายนอก + + เปิดใช้งานปูม Gecko + + กำลังปิดแอปพลิเคชันเพื่อนำการเปลี่ยนแปลงไปใช้… + ส่วนเสริม @@ -1502,12 +1499,8 @@ การตั้งค่าการป้องกัน การป้องกันการติดตามแบบพิเศษ - - เรียกดูโดยไม่ต้องมีใครมาติดตาม ตอนนี้มีการป้องกันคุกกี้แบบทั้งหมด ซึ่งเป็นอุปสรรคต่อตัวติดตามข้ามไซต์ที่ทรงพลังที่สุดของเรา - - เก็บข้อมูลของคุณไว้กับตัวคุณเอง %s ปกป้องคุณจากตัวติดตามที่พบบ่อยที่สุดซึ่งติดตามสิ่งที่คุณทำทางออนไลน์ %s ปกป้องคุณจากตัวติดตามที่พบบ่อยที่สุดซึ่งติดตามสิ่งที่คุณทำทางออนไลน์ @@ -1515,16 +1508,12 @@ มาตรฐาน (ค่าเริ่มต้น) - ความเป็นส่วนตัวและประสิทธิภาพแบบสมดุล หน้าเว็บจะโหลดเป็นปกติ - หน้าเว็บต่างๆ จะโหลดตามปกติ แต่จะปิดกั้นตัวติดตามน้อยลง สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบมาตรฐาน เข้มงวด - ปิดกั้นตัวติดตามเพิ่มเติมเพื่อให้โหลดหน้าเว็บได้เร็วขึ้น แต่การทำงานบางอย่างในหน้าเว็บอาจพัง - การป้องกันการติดตามที่แข็งแกร่งขึ้นและประสิทธิภาพที่เร็วขึ้น แต่บางไซต์อาจทำงานไม่ถูกต้อง สิ่งที่ถูกปิดกั้นโดยการป้องกันการติดตามแบบเข้มงวด From 9dd3d257198dd5043021a5df26899c36c23b8f45 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 9 Jul 2023 00:03:53 +0000 Subject: [PATCH 029/207] Import translations from android-l10n --- app/src/main/res/values-hy-rAM/strings.xml | 21 +++++------------- app/src/main/res/values-pt-rPT/strings.xml | 25 ++++++++-------------- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index fec1b13bf..5a69c009f 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -423,18 +423,12 @@ Հարցում ուղարկել - Թխուկների դրոշակի կրճատում - Պահանջե՞լ աջակցություն այս կայքի համար: - Կայքին աջակցելու հայտ է ներկայացվել: - Հարցումն ուղարկված է Միացված է այս կայքի համար - Կայքին աջակցելու հայտ է ներկայացվել - Աջակցության հարցումն ուղարկվել է Կայքը ներկայումս չի աջակցվում @@ -442,8 +436,6 @@ Միացնե՞լ Cookie Banner կրճատումը %1$s-ի համար: Անջատե՞լ Cookie Banner կրճատումը %1$s-ի համար: - - Այս կայքը ներկայումս չի աջակցվում Թխուկների դրոշակի կրճատման կողմից: Ցանկանու՞մ եք, որ մեր թիմը վերանայի այս կայքը և հետագայում ավելացնի աջակցություն: %1$s-ը չի կարող ինքնաշխատ մերժել թխուկների հարցումներն այս կայքում: Դուք կարող եք հարցում ուղարկել այս կայքին ապագայում աջակցելու համար: @@ -549,6 +541,11 @@ Երբեք Ներբեռնումների արտաքին հավելված + + Միացնել Gecko մատյանները + + Փոփոխությունները գործադրելու համար դուրս է գալիս հավելվածից… + Հավելումներ @@ -1499,12 +1496,8 @@ Պաշտպանության կարգավորումներ Ուժեղացված հետագծման պաշտպանություն - - Դիտարկեք առանց Ձեզ հետևելու Այժմ գործում է Total Cookie Protection-ը, որը մեր ամենահզոր պատնեշն է միջկայքի հետագծերի դեմ: - - Ձեր տվյալները պահեք ձեզ մոտ: %s-ը պաշտպանում է ամենատարածված հետագծիչներից, որոնք հետևում են այն ամենին, ինչ որ անում եք առցանց: %s-ը պաշտպանում է ամենատարածված հետագծիչներից, որոնք հետևում են այն ամենին, ինչ որ անում եք առցանց: @@ -1512,16 +1505,12 @@ Ստանդարտ (սկզբնադիր) - Հավասարակշռված է գաղտնիության և արտադրողականության միջև: Էջերը նորմալ են բեռնվում: - Էջերը նորմալ կբեռնվեն, բայց արգելափակվելու են ավելի քիչ հետագծիչներ: Ինչն է արգելափակված հետագծման ստանդարտ պաշտպանությամբ Խիստ - - Արգելափակում է ավելի շատ հետագծիչներ, որ էջերը արագ բեռնվեն, բայց էջի որոշ գործույթներ կարող են ընդհատվեն: Ավելի ուժեղ հետագծման պաշտպանություն և ավելի արագ արտադրողականություն, բայց որոշ կայքեր, հնարավոր է, նորմալ չաշխատեն: diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 41f7d6d71..69ce6c2c6 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -427,18 +427,12 @@ Enviar pedido - Redução de Faixas de Cookies - Solicitar suporte para este site? - Pedido submetido ao site de apoio. - Pedido enviado Ativado para este site - Pedido submetido ao site de apoio - Pedido de suporte enviado Site atualmente não suportado @@ -446,8 +440,6 @@ Ativar Redução de Faixa de Cookie para %1$s? Desativar Redução de Faixa de Cookie para %1$s? - - Atualmente a Redução de Faixas de Cookies não é suportada para este site. Você gostaria que a nossa equipa fizesse uma análise a este site e adicionasse este suporte no futuro? %1$s não pode rejeitar automaticamente pedidos de cookies neste site. Pode enviar um pedido para suportar este site no futuro. @@ -552,6 +544,11 @@ Nunca Gestor de transferências externo + + Permitir registos Gecko + + A encerrar a aplicação para aplicar as alterações… + Extras @@ -1210,6 +1207,10 @@ Guardar como PDF Não foi possível gerar o PDF + + Não é possível imprimir + + Imprimir Enviar para o dispositivo @@ -1500,12 +1501,8 @@ Definições de proteção Proteção melhorada contra a monitorização - - Navegue sem ser seguido Agora apresentando a Proteção Total de Cookies, a nossa barreira mais poderosa contra rastreadores entre sites. - - Guarde os seus dados para si. O %s protege-o dos rastreadores mais comuns que monitorizam o que faz na Internet. O %s protege-o de muitos dos rastreadores mais comuns que monitorizam o que faz na Internet. @@ -1514,16 +1511,12 @@ Padrão (predefinição) - Equilibrado para privacidade e desempenho. As páginas serão carregadas normalmente. - As páginas serão carregadas normalmente, mas serão bloqueados menos rastreadores. O que é bloqueado pela proteção padrão contra a monitorização Rigorosa - Bloqueia mais rastreadores para que as páginas carreguem mais rapidamente, mas algumas funcionalidades das páginas podem ser perdidas. - Proteção contra a monitorização mais forte e um desempenho mais rápido, mas alguns sites podem não funcionar corretamente. O que é bloqueado pela proteção rigorosa contra a monitorização From 81a17af0eecd7e465d501ab9cdb1b1e4eae288a7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 10 Jul 2023 00:03:44 +0000 Subject: [PATCH 030/207] Import translations from android-l10n --- app/src/main/res/values-am/strings.xml | 21 +++++------------- app/src/main/res/values-co/strings.xml | 25 ++++++++-------------- app/src/main/res/values-en-rGB/strings.xml | 21 +++++------------- app/src/main/res/values-es-rES/strings.xml | 21 +++++------------- app/src/main/res/values-si/strings.xml | 21 +++++------------- app/src/main/res/values-sk/strings.xml | 21 +++++------------- app/src/main/res/values-sl/strings.xml | 19 +++------------- 7 files changed, 37 insertions(+), 112 deletions(-) diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index 5543ada96..4119114c0 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -418,18 +418,12 @@ ጥያቄ ላክ - የኩኪ ሰሌዳ ቅነሳ - ለዚህ ጣቢያ ድጋፍ ይጠይቁ? - የድረ-ገጽ ድጋፍ ጥያቄ ገብቷል። - ጥያቄው ተልኳል ለዚህ ድረ-ገፅ በርቷል - የድረ-ገጽ ድጋፍ ጥያቄ ገብቷል - የድጋፍ ጥያቄው ተልኳል በአሁኑ ጊዜ የማይደገፍ ድረ-ገፅ @@ -439,8 +433,6 @@ ለ%1$s የኩኪ ሰሌዳ ቅነሳ ይጥፋ? - - ይህ ጣቢያ በአሁኑ ጊዜ በኩኪ ሰሌዳ ቅነሳ አይደገፍም። ቡድናችን ይህንን ድህረ ገጽ እንዲገመግም እና ወደፊት ድጋፍ እንዲጨምር ይፈልጋሉ? %1$s በዚህ ጣቢያ ላይ የኩኪ ጥያቄዎችን በራስ ሰር ውድቅ ማድረግ አይችልም። ለወደፊቱ ይህንን ጣቢያ ለመደገፍ ጥያቄ መላክ ይችላሉ። @@ -546,6 +538,11 @@ በፍጹም የውጭ ማውረድ አስተዳዳሪ + + የGecko ምዝግብ ማስታወሻዎችን አንቃ + + ለውጦችን ለመተግበር መተግበሪያውን በማቆም ላይ… + ተጨማሪዎች @@ -1487,12 +1484,8 @@ የጥበቃ ቅንብሮች የተሻሻለ የመከታተያ ጥበቃ - - ያለተከታታይ ያስሱ አሁን አጠቃላይ የኩኪ ጥበቃን በማሳየት ላይ፣ የኛ እጅግ ኃይለኛው ድረ-ገጽ ተሻጋሪ መከታተያዎችን አጋጅ። - - ውሂብዎን ለራስዎ ያስቀምጡ። %s በመስመር ላይ የሚያደርጉትን ከሚከተሉ ብዙ በጣም የተለመዱ መከታተያዎች ይጠብቅዎታል። %s በመስመር ላይ የሚያደርጉትን ከሚከተሉ ብዙ በጣም የተለመዱ መከታተያዎች ይጠብቅዎታል። @@ -1500,16 +1493,12 @@ መደበኛ (ነባሪ) - ለግላዊነት እና ለአፈጻጸም የተመጣጠነ። ገጾች በመደበኛነት ይጫናሉ። - ገጾች በመደበኛነት ይጫናሉ፣ ነገር ግን ጥቂት መከታተያዎችን ያግዳል። በመደበኛ የመከታተያ ጥበቃ የታገደው ጥብቅ - ገፆች በፍጥነት እንዲጫኑ ተጨማሪ መከታተያዎችን ያግዳል፣ ነገር ግን አንዳንድ በገጽ ላይ ያሉ ተግባራት ላይሰሩ ይችላሉ። - ጠንካራ የመከታተያ ጥበቃ እና ፈጣን አፈጻጸም፣ ነገር ግን አንዳንድ ጣቢያዎች በትክክል ላይሰሩ ይችላሉ። በጥብቅ የመከታተያ ጥበቃ የታገደው diff --git a/app/src/main/res/values-co/strings.xml b/app/src/main/res/values-co/strings.xml index 0a7753152..c828b3676 100644 --- a/app/src/main/res/values-co/strings.xml +++ b/app/src/main/res/values-co/strings.xml @@ -430,18 +430,12 @@ Mandà a dumanda - Riduzzione di e striscie di cannistrelli - Richiede chì stu situ sia accettatu ? - A dumanda per chì u situ sia accettatu hè stata mandata. - Dumanda mandata Attivata per stu situ - A dumanda per chì u situ sia accettatu hè stata mandata - Dumanda mandata per chì u situ sia accettatu Attualmente u situ ùn hè micca accettatu @@ -450,8 +444,6 @@ Disattivà a riduzzione di e striscie di cannistrelli per %1$s ? - - Ora, stu situ ùn hè micca accettatu da a riduzzione di e striscie di cannistrelli. Vulete chì a nostra squadra verificheghji stu situ web è accettallu in u futuru ? %1$s ùn pò micca righjittà autumaticamente e dumande di canistrelli nant’à stu situ. Pudete mandà una richiesta per ch’ellu sia accettallu in u futuru. @@ -558,6 +550,11 @@ Mai Ghjestiunariu esternu di scaricamentu + + Attivà i ghjurnali di Gecko + + Chjusura di l’appiecazione per piglià i cambiamenti in contu… + Moduli addiziunali @@ -1223,6 +1220,10 @@ Arregistrà cum’è PDF Impussibule d’ingenerà un PDF + + Impussibule di stampà + + Stampà Mandà à l’apparechju @@ -1510,12 +1511,8 @@ Preferenze di prutezzione Prutezzione rinfurzata contr’à u spiunagiu - - Navigà senza esse seguitatu(a) Eccu a prutezzione tutale contr’à i canistrelli, a nostra chjudenda a più putente oghje contr’à l’elementi intersiti di spiunagiu. - - Guardate i vostri dati dapervoi. %s vi prutege da a maiò parte di i perseguitatori i più cunnisciuti chì seguitanu ciò chì vò fate in linea. %s vi prutege da a maiò parte di i perseguitatori i più cunnisciuti chì seguitanu ciò chì vo fate in linea. @@ -1523,16 +1520,12 @@ Classica (predefinita) - Equilibratu trà a cunfidenzialità è a perfurmenza. E pagine si caricanu nurmalmente. - E pagine si caricheranu nurmalmente, ma bluccheranu menu di perseguitatori. Ciò chì hè bluccatu da a prutezzione classica contr’à u spiunagiu Severa - Bluccheghja più di perseguitatori è cusì e pagine si caricanu piu prestu, ma certi siti puderianu ùn micca funziunà currettamente. - Una prutezzione più forte contr’à u spiunagiu è perfurmenze piu rapide, ma certi siti ponu ùn micca funziunà currettamente. Ciò chì hè bluccatu da a prutezzione severa contr’à u spiunagiu diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 7d5638e86..43d36895d 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -423,18 +423,12 @@ Send request - Cookie Banner Reduction - Request support for this site? - Request to support site submitted. - Request sent On for this site - Request to support site submitted - Support request sent Site currently not supported @@ -442,8 +436,6 @@ Turn on Cookie Banner Reduction for %1$s? Turn off Cookie Banner Reduction for %1$s? - - This site is currently not supported by Cookie Banner Reduction. Would you like our team to review this web site and add support in the future? %1$s can’t automatically reject cookie requests on this site. You can send a request to support this site in the future. @@ -549,6 +541,11 @@ Never External download manager + + Enable Gecko logs + + Quitting the application to apply changes… + Add-ons @@ -1494,12 +1491,8 @@ Protection Settings Enhanced Tracking Protection - - Browse without being followed Now featuring Total Cookie Protection, our most powerful barrier yet against cross-site trackers. - - Keep your data to yourself. %s protects you from many of the most common trackers that follow what you do online. %s protects you from many of the most common trackers that follow what you do online. @@ -1507,16 +1500,12 @@ Standard (default) - Balanced for privacy and performance. Pages load normally. - Pages will load normally, but block fewer trackers. What’s blocked by standard tracking protection Strict - Blocks more trackers so pages load faster, but some on-page functionality may break. - Stronger tracking protection and faster performance, but some sites may not work properly. What’s blocked by strict tracking protection diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 58b30d06d..243296e72 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -433,18 +433,12 @@ Enviar petición - Reducción de avisos de cookies - ¿Solicitar ayuda para este sitio? - La solicitud de soporte ha sido enviada. - Solicitud enviada Activada para este sitio - La solicitud de soporte ha sido enviada - Solicitud de ayuda enviada Sitio actualmente no compatible @@ -452,8 +446,6 @@ ¿Activar la reducción de aviso de cookies para %1$s? ¿Desactivar la reducción de aviso de cookies para %1$s? - - Este sitio actualmente no es compatible con la reducción de avisos de cookies. ¿Quieres pedirle a nuestro equipo que revise este sitio web y añada soporte en el futuro? %1$s no puede rechazar automáticamente los avisos de cookies en este sitio. Puede enviar una solicitud para admitir este sitio en el futuro. @@ -559,6 +551,11 @@ Nunca Administrador de descargas externo + + Habilitar registros de Gecko + + Saliendo de la aplicación para aplicar los cambios… + Complementos @@ -1534,12 +1531,8 @@ Ajustes de protección Protección contra rastreo mejorada - - Navega sin que te sigan Ahora con protección Total Cookie Protection, nuestra barrera más poderosa hasta hoy contra rastreadores de sitios cruzados. - - Protege tus datos. %s te protege de muchos de los rastreadores más comunes que siguen lo que haces en línea. %s te protege de muchos de los rastreadores más comunes que vigilan lo que haces en línea. @@ -1547,16 +1540,12 @@ Estándar (predeterminado) - Equilibrado para privacidad y rendimiento. Las páginas se cargarán normalmente. - Las páginas se cargarán como siempre, pero bloquearán menos rastreadores. Qué es lo que está bloqueado por la protección estándar contra el rastreo Estricto - Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. - Protección contra rastreo mejorada y mayor rendimiento, pero puede que algunos sitios no funcionen correctamente. Qué es lo que está bloqueado por la protección estricta contra el rastreo diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 0ae8c5e63..d45b03d1b 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -418,18 +418,12 @@ ඉල්ලීම යවන්න - දත්තකඩ පතාක අවකරණය - මෙම අඩවිය සඳහා සහාය ඉල්ලනවා ද? - අඩවිය සඳහා සහාය ඉල්ලීම යොමු කෙරිණි. - ඉල්ලීම යැවිණි මෙම අඩවියට සක්‍රියයි - අඩවිය සඳහා සහාය ඉල්ලීම යොමු කෙරිණි - සහාය ඉල්ලීම යැවිණි අඩවියට සහාය නොදක්වයි @@ -437,8 +431,6 @@ %1$s සඳහා දත්තකඩ පතාක අවකරණය සක්‍රිය කරන්නද? %1$s සඳහා දත්තකඩ පතාක අවකරණය අක්‍රිය කරන්නද? - - මෙම අඩවිය දැනට දත්තකඩ පතාක අවකරණයට සහාය නොදක්වයි. මෙම වියමන අඩවිය සමාලෝචනය කර අනාගතයේදී සහාය දක්වන ලෙස අපගේ කණ්ඩායමට දැන්වීමට කැමතිද? %1$s මඟින් මෙම අඩවියේ දත්තකඩ ඉල්ලීම් ස්වයංක්‍රීයව ඉවතලීමට නොහැක. ඉදිරියේ දී මෙම අඩවිය සඳහා සහාය දැක්වීමට ඉල්ලීමක් යැවීමට හැකිය. @@ -542,6 +534,11 @@ කවදාවත් බාහිර බාගැනීම් කළමනාකරු + + ගෙක්කෝ සටහන් සබල කරන්න + + වෙනස්කම් යෙදීමට යෙදුමෙන් ඉවත් වෙමින්… + එක්කහු @@ -1492,12 +1489,8 @@ රැකවරණ සැකසුම් දියුණු කළ ලුහුබැඳීමේ රැකවරණය - - ලුහුබැඳීම් මඟහැර පිරික්සන්න පූර්ණ දත්තකඩ රැකවරණ විශේෂාංගය, හරස්-අඩවි ලුහුබැඳීම් වලට එරෙහි වන අපගේ බලවත්ම බාධකය. - - ඔබගේ දත්ත ඔබම තබා ගන්න. ඔබ මාර්ගගතව කරන දෑ සොයන බොහෝ පොදු ලුහුබැඳීම් වලින් %s ඔබව ආරක්‍ෂා කරයි. ඔබ මාර්ගගතව කරන දෑ සොයන බොහෝ පොදු ලුහුබැඳීම් වලින් %s ඔබව ආරක්‍ෂා කරයි. @@ -1505,16 +1498,12 @@ සම්මත (පෙරනිමි) - ආරක්‍ෂාව හා කාර්ය සාධනය අතර සංතුලිතයි. පිටු සාමාන්‍ය ලෙස පූරණය වේ. - පිටු සුපුරුදු පරිදි පූරණය වුවත් ලුහුබැඳීම් අඩුවෙන් අවහිර කරයි. සම්මත ලුහුබැඳීමේ රැකවරණය මගින් අවහිර කළ දෑ දැඩි - බොහෝ දැන්වීම් අවහිර කරන විට පිටු වේගයෙන් පූරණය වේ, නමුත් ඇතැම් පිටු හරිහැටි ක්‍රියා නොකරනු ඇත. - ප්‍රබල ලුහුබැඳීමේ රැකවරණයක් හා වේගවත් ක්‍රියාකාරිත්‍වයක්, නමුත් ඇතැම් අඩවි හරිහැටි වැඩ නොකරනු ඇත. දැඩි ලුහුබැඳීමේ රැකවරණය මගින් අවහිර කළ දෑ diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 98252c7a1..649bf5720 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -431,18 +431,12 @@ Poslať žiadosť - Zníženie počtu bannerov k súborom cookie - Požiadať o podporu pre túto stránku? - Žiadosť o podporu stránky bola odoslaná. - Žiadosť bola odoslaná Zapnuté pre túto stránku - Žiadosť o podporu stránky bola odoslaná - Žiadosť o podporu bola odoslaná Stránka momentálne nie je podporovaná @@ -450,8 +444,6 @@ Zapnúť znižovanie počtu bannerov k súborom cookie pre %1$s? Vypnúť znižovanie počtu bannerov k súborom cookie pre %1$s? - - Na tejto stránke momentálne nie je podporované znižovanie počtu bannerov k súborom cookie. Chceli by ste, aby náš tím v budúcnosti skontroloval túto webovú stránku a pridal podporu? %1$s nemôže automaticky odmietnuť žiadosti o súbory cookie na tejto stránke. Môžete však poslať žiadosť o podporu tejto stránky v budúcnosti. @@ -558,6 +550,11 @@ Nikdy Externý správca sťahovania + + Povoliť denníky enginu Gecko + + Ukončuje sa aplikácia a aplikujú sa zmeny… + Doplnky @@ -1513,12 +1510,8 @@ Nastavenia ochrany Rozšírená ochrana pred sledovaním - - Nenechajte sa pri prehliadaní sledovať Teraz obsahuje Úplnú ochranu súborov cookie, našu doteraz najsilnejšiu bariéru proti sledovaciu medzi stránkami. - - %s vás chráni pred mnohými sledovacími prvkami, ktoré zbierajú informácie o tom, čo robíte na internete. %s vás chráni pred mnohými sledovacími prvkami, ktoré zbierajú informácie o tom, čo robíte na internete. @@ -1526,16 +1519,12 @@ Štandardná (predvolená) - Vyvážená ochrana a výkon. Neovplyvní načítanie webových stránok. - Stránky sa budú načítavať normálne, no budú obsahovať menej sledovacích prvkov. Čo blokuje štandardná ochrana pred sledovaním Prísna - Blokuje viac sledovacích prvkov. Stránky sa načítavajú rýchlejšie, ale niektoré funkcie na stránke môžu fungovať obmedzene. - Silnejšia ochrana, ktorá zrýchľuje načítavanie stránok. Môže však obmedziť ich fungovanie. Čo blokuje prísna ochrana pred sledovaním diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 8257212a6..bab0f9ad7 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -425,18 +425,12 @@ Pošlji zahtevek - Zmanjšanje števila pasic s piškotki - Zahtevam podporo za to spletno mesto? - Zahtevek spletnemu mestu za podporo poslan. - Zahtevek poslan Vključeno na tem spletnem mestu - Zahtevek spletnemu mestu za podporo poslan - Zahtevek za podporo je poslan Spletno mesto trenutno ni podprto @@ -444,8 +438,6 @@ Vključim zmanjšanje števila pasic s piškotki za %1$s? Izključim zmanjšanje števila pasic s piškotki za %1$s? - - Zmanjšanje pasic s piškotki zaenkrat ne podpira tega spletnega mesta. Ali želite, da spletno mesto pregleda naša ekipa in doda podporo v prihodnjih različicah? %1$s na tem spletnem mestu ni mogel samodejno zavrniti zahtev za shranjevanje piškotkov. Pošljete lahko zahtevek, naj se v prihodnosti uvede podpora za to spletno mesto. @@ -551,6 +543,9 @@ Nikoli Zunanji upravitelj prenosov + + Zapiranje aplikacije za uveljavitev sprememb … + Dodatki @@ -1510,12 +1505,8 @@ Nastavitve zaščite Izboljšana zaščita pred sledenjem - - Brskajte brez sledenja Zdaj vključuje Popolno zaščito pred piškotki, našo najzmogljivejšo oviro pred sledilci med spletnimi mesti. - - Obdržite svoje podatke zase. %s vas ščiti pred številnimi najpogostejšimi sledilci, ki sledijo vašemu brskanju po spletu. %s vas ščiti pred številnimi najpogostejšimi sledilci, ki sledijo vašemu brskanju po spletu. @@ -1523,16 +1514,12 @@ Običajno (privzeto) - Uravnotežena zasebnost in učinkovitost delovanja. Strani bodo delovale običajno. - Strani se bodo nalagale normalno, vendar bo zavrnjenih manj sledilcev. Kaj je zavrnjeno s standardno zaščito pred sledenjem Strogo - Zavrača več sledilcev in pospeši nalaganje strani, vendar deli strani lahko nehajo delovati. - Močnejša zaščita pred sledenjem in hitrejše delovanje, nekatere strani morda ne bodo delovale pravilno. Kaj je zavrnjeno s strogo zaščito pred sledenjem From 68116174f3188d1ec516f9f5cc12a07d1086e702 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Tue, 4 Jul 2023 19:11:57 +0200 Subject: [PATCH 031/207] Bug 1840095 - Add ReviewGrade UI component --- .../mozilla/fenix/shopping/ui/ReviewGrade.kt | 197 ++++++++++++++++++ app/src/main/res/values/static_strings.xml | 3 + 2 files changed, 200 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt new file mode 100644 index 000000000..317aef4d1 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt @@ -0,0 +1,197 @@ +/* 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.shopping.ui + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import mozilla.components.ui.colors.PhotonColors +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +private val height = 24.dp +private val borderColor = Color(0x26000000) +private val reviewGradeAColor = Color(0xFF10AD56) +private val reviewGradeBColor = Color(0xFF007DEC) +private val reviewGradeCColor = Color(0xFFF4A902) +private val reviewGradeDColor = Color(0xFFF27313) +private val reviewGradeFColor = Color(0xFFD51235) +private val reviewGradeAColorExpanded = Color(0xFFDBF3E6) +private val reviewGradeBColorExpanded = Color(0xFFD9ECFC) +private val reviewGradeCColorExpanded = Color(0xFFFDF2D9) +private val reviewGradeDColorExpanded = Color(0xFFFDEADC) +private val reviewGradeFColorExpanded = Color(0xFFF9DBE1) + +/** + * Review Grade of the product - A being the best and F being the worst. + */ +enum class ReviewGrade( + val stringResourceId: Int, + val backgroundColor: Color, + val expandedTextBackgroundColor: Color, +) { + A( + stringResourceId = R.string.review_quality_check_grade_a_b_description, + backgroundColor = reviewGradeAColor, + expandedTextBackgroundColor = reviewGradeAColorExpanded, + ), + B( + stringResourceId = R.string.review_quality_check_grade_a_b_description, + backgroundColor = reviewGradeBColor, + expandedTextBackgroundColor = reviewGradeBColorExpanded, + ), + C( + stringResourceId = R.string.review_quality_check_grade_c_description, + backgroundColor = reviewGradeCColor, + expandedTextBackgroundColor = reviewGradeCColorExpanded, + ), + D( + stringResourceId = R.string.review_quality_check_grade_d_f_description, + backgroundColor = reviewGradeDColor, + expandedTextBackgroundColor = reviewGradeDColorExpanded, + ), + F( + stringResourceId = R.string.review_quality_check_grade_d_f_description, + backgroundColor = reviewGradeFColor, + expandedTextBackgroundColor = reviewGradeFColorExpanded, + ), +} + +/** + * UI for displaying the review grade. + * + * @param modifier The modifier to be applied to the Composable. + * @param reviewGrade The grade of the product. + */ +@Composable +fun ReviewGradeCompact( + modifier: Modifier = Modifier, + reviewGrade: ReviewGrade, +) { + ReviewGradeLetter( + reviewGrade = reviewGrade, + modifier = modifier.border( + border = BorderStroke( + width = 1.dp, + color = borderColor, + ), + shape = MaterialTheme.shapes.small, + ), + ) +} + +/** + * UI for displaying the review grade with descriptive text. + * + * @param modifier The modifier to be applied to the Composable. + * @param reviewGrade The grade of the product. + */ +@Composable +fun ReviewGradeExpanded( + modifier: Modifier = Modifier, + reviewGrade: ReviewGrade, +) { + Row( + modifier = modifier + .background( + color = reviewGrade.expandedTextBackgroundColor, + shape = MaterialTheme.shapes.small, + ) + .border( + border = BorderStroke( + width = 1.dp, + color = borderColor, + ), + shape = MaterialTheme.shapes.small, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + val cornerSize = CornerSize(0.dp) + val shape = + MaterialTheme.shapes.small.copy(topEnd = cornerSize, bottomEnd = cornerSize) + + ReviewGradeLetter( + reviewGrade = reviewGrade, + shape = shape, + ) + + Text( + text = stringResource(id = reviewGrade.stringResourceId), + color = PhotonColors.DarkGrey90, + style = FirefoxTheme.typography.caption, + modifier = Modifier.padding(horizontal = 8.dp), + ) + } +} + +/** + * Common UI building block for the review grade. + */ +@Composable +private fun ReviewGradeLetter( + modifier: Modifier = Modifier, + reviewGrade: ReviewGrade, + shape: Shape = MaterialTheme.shapes.small, +) { + Box( + modifier = modifier + .size(height) + .background( + color = reviewGrade.backgroundColor, + shape = shape, + ) + .wrapContentSize(Alignment.Center), + ) { + Text( + text = reviewGrade.name, + color = PhotonColors.LightGrey05, + style = FirefoxTheme.typography.subtitle2, + ) + } +} + +@Composable +@LightDarkPreview +private fun ReviewGradePreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(FirefoxTheme.colors.layer1) + .padding(16.dp), + ) { + ReviewGrade.values().forEach { + Row( + horizontalArrangement = Arrangement.spacedBy(32.dp), + ) { + ReviewGradeCompact(reviewGrade = it) + + ReviewGradeExpanded(reviewGrade = it) + } + + Spacer(modifier = Modifier.height(16.dp)) + } + } + } +} diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 3039b2c33..c1abf8666 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -115,4 +115,7 @@ Close review quality check Review quality check + Reliable reviews + Only some reliable reviews + Unreliable reviews From f2d1485b2dd5fd7e02c6fb1ae80b78f5cbc08dd1 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 7 Jul 2023 12:48:32 +0300 Subject: [PATCH 032/207] Bug 1813521 - Fix flaky pauseResumeCancelDownloadTest UI test --- .../fenix/ui/robots/NotificationRobot.kt | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt index 01f89b093..6d7c5de1c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt @@ -10,12 +10,15 @@ import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue +import org.mozilla.fenix.helpers.Constants.RETRY_COUNT +import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdAndTextExists import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.appName import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.packageName import kotlin.AssertionError class NotificationRobot { @@ -67,18 +70,22 @@ class NotificationRobot { } fun clickDownloadNotificationControlButton(action: String) { - try { - assertTrue(downloadSystemNotificationButton(action).waitForExists(waitingTimeShort)) - } catch (e: AssertionError) { - notificationTray().flingToEnd(1) - } + for (i in 1..RETRY_COUNT) { + try { + assertItemWithResIdAndTextExists(downloadSystemNotificationButton(action)) + downloadSystemNotificationButton(action).clickAndWaitForNewWindow(waitingTimeShort) + assertItemWithResIdAndTextExists( + downloadSystemNotificationButton(action), + exists = false, + ) - downloadSystemNotificationButton(action).click() - // API 30 Bug? Sometimes a click doesn't register, try again - try { - assertTrue(downloadSystemNotificationButton(action).waitUntilGone(waitingTime)) - } catch (e: AssertionError) { - downloadSystemNotificationButton(action).click() + break + } catch (e: AssertionError) { + if (i == RETRY_COUNT) { + throw e + } + mDevice.waitForWindowUpdate(packageName, waitingTimeShort) + } } } From 5689fe037fa52c4f293e639677496b934e8cf26a Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Thu, 6 Jul 2023 16:07:03 -0400 Subject: [PATCH 033/207] Bug 1828454 - Add app links do not open cache in memory to avoid prompting user for the same app --- .../java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt index 597a41c9b..bc67b5531 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt @@ -179,6 +179,8 @@ class SettingsAdvancedTest { clickPageObject(itemWithResIdAndText("android:id/button2", "CANCEL")) waitForPageToLoad() verifyUrl("youtube.com") + }.openTabDrawer { + closeTab() } navigationToolbar { @@ -222,6 +224,8 @@ class SettingsAdvancedTest { clickPageObject(itemWithResIdAndText("android:id/button2", "CANCEL")) waitForPageToLoad() verifyUrl("youtube.com") + }.openTabDrawer { + closeTab() } navigationToolbar { From 662186e83e3f0739c4f8898f10af60d2d651c726 Mon Sep 17 00:00:00 2001 From: Harrison Oglesby Date: Fri, 7 Jul 2023 13:13:33 -0700 Subject: [PATCH 034/207] Bug 1841153 - new event telemetry for private tab open --- app/metrics.yaml | 38 +++++++++++++++++++ .../java/org/mozilla/fenix/HomeActivity.kt | 9 ++++- .../org/mozilla/fenix/home/HomeFragment.kt | 2 + 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index f1996e851..2283709a8 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -8881,6 +8881,25 @@ home_screen: - cgordon@mozilla.com expires: never +homepage: + private_mode_icon_tapped: + type: event + description: | + A user tapped the private browsing icon on the homepage. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1841153 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/2725 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - cgordon@mozilla.com + expires: never + metadata: + tags: + - Tabs + start_on_home: enter_home_screen: type: event @@ -9913,3 +9932,22 @@ pull_to_refresh_in_browser: notification_emails: - android-probes@mozilla.com expires: 126 + +app_icon: + new_private_tab_tapped: + type: event + description: | + A user tapped to open new private tab in Firefox Android app shortcuts menu. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1841153 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/2725 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - cgordon@mozilla.com + expires: never + metadata: + tags: + - Tabs diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index ee1e24e24..4db7bf1a9 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -83,6 +83,7 @@ import mozilla.components.support.utils.toSafeIntent import mozilla.components.support.webextensions.WebExtensionPopupFeature import mozilla.telemetry.glean.private.NoExtras import org.mozilla.experiments.nimbus.initializeTooling +import org.mozilla.fenix.GleanMetrics.AppIcon import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.SplashScreen @@ -150,6 +151,7 @@ import org.mozilla.fenix.settings.search.SaveSearchEngineFragmentDirections import org.mozilla.fenix.settings.studies.StudiesFragmentDirections import org.mozilla.fenix.settings.wallpaper.WallpaperSettingsFragmentDirections import org.mozilla.fenix.share.AddNewDeviceFragmentDirections +import org.mozilla.fenix.shortcut.NewTabShortcutIntentProcessor.Companion.ACTION_OPEN_PRIVATE_TAB import org.mozilla.fenix.tabhistory.TabHistoryDialogFragment import org.mozilla.fenix.tabstray.TabsTrayFragment import org.mozilla.fenix.tabstray.TabsTrayFragmentDirections @@ -328,6 +330,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { Events.appOpened.record(Events.AppOpenedExtra(it)) // This will record an event in Nimbus' internal event store. Used for behavioral targeting components.analytics.experiments.recordEvent("app_opened") + + if (safeIntent.action.equals(ACTION_OPEN_PRIVATE_TAB) && it == APP_ICON) { + AppIcon.newPrivateTabTapped.record(NoExtras()) + } } } supportActionBar?.hide() @@ -832,7 +838,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { @VisibleForTesting(otherwise = PROTECTED) internal open fun getIntentSource(intent: SafeIntent): String? { return when { - intent.isLauncherIntent -> "APP_ICON" + intent.isLauncherIntent -> APP_ICON intent.action == Intent.ACTION_VIEW -> "LINK" else -> null } @@ -1278,6 +1284,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { const val PRIVATE_BROWSING_MODE = "private_browsing_mode" const val START_IN_RECENTS_SCREEN = "start_in_recents_screen" const val OPEN_PASSWORD_MANAGER = "open_password_manager" + const val APP_ICON = "APP_ICON" // PWA must have been used within last 30 days to be considered "recently used" for the // telemetry purposes. diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 591f28bb2..f2d5f6943 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -62,6 +62,7 @@ import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import org.mozilla.fenix.GleanMetrics.HomeScreen +import org.mozilla.fenix.GleanMetrics.Homepage import org.mozilla.fenix.GleanMetrics.PrivateBrowsingShortcutCfr import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -552,6 +553,7 @@ class HomeFragment : Fragment() { newMode, userHasBeenOnboarded = true, ) + Homepage.privateModeIconTapped.record(mozilla.telemetry.glean.private.NoExtras()) } consumeFrom(requireComponents.core.store) { From 41b5b60608d3e4b7608818c78ddce84ff377dd08 Mon Sep 17 00:00:00 2001 From: James Hugman Date: Fri, 7 Jul 2023 18:27:56 +0100 Subject: [PATCH 035/207] =?UTF-8?q?Bug=201842242=20=E2=80=94=20Make=20mess?= =?UTF-8?q?aging=20feature=20coenrolling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.experimenter.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/.experimenter.yaml b/app/.experimenter.yaml index f0c0b1eef..d23824446 100644 --- a/app/.experimenter.yaml +++ b/app/.experimenter.yaml @@ -43,16 +43,13 @@ juno-onboarding: type: boolean description: "if true, juno onboarding is shown to the user." messaging: - description: "Configuration for the messaging system.\n\nIn practice this is a set of growable lookup tables for the\nmessage controller to piece together.\n" + description: "The in-app messaging system.\n" hasExposure: true exposureDescription: "" variables: actions: type: json description: A growable map of action URLs. - message-under-experiment: - type: string - description: Id or prefix of the message under experiment. messages: type: json description: A growable collection of messages From 14d036e6d712126591726bb5c3825538109082fe Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Fri, 7 Jul 2023 09:44:41 -0700 Subject: [PATCH 036/207] Bug 1841143 - Convert `CollectionTest` to support Tabs Tray rewrite --- .../mozilla/fenix/ui/ComposeCollectionTest.kt | 501 ++++++++++++++++++ .../fenix/ui/ComposeTabbedBrowsingTest.kt | 2 +- .../fenix/ui/robots/ComposeTabDrawerRobot.kt | 121 ++++- .../fenix/ui/robots/HomeScreenRobot.kt | 8 + .../fenix/compose/tabstray/TabGridItem.kt | 6 +- .../fenix/compose/tabstray/TabListItem.kt | 3 +- .../org/mozilla/fenix/tabstray/TabsTray.kt | 4 + .../mozilla/fenix/tabstray/TabsTrayBanner.kt | 27 +- .../fenix/tabstray/TabsTrayFragment.kt | 9 +- .../mozilla/fenix/tabstray/TabsTrayTestTag.kt | 6 +- 10 files changed, 662 insertions(+), 25 deletions(-) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt new file mode 100644 index 000000000..f81d54dca --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt @@ -0,0 +1,501 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset +import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton +import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText +import org.mozilla.fenix.ui.robots.browserScreen +import org.mozilla.fenix.ui.robots.collectionRobot +import org.mozilla.fenix.ui.robots.composeTabDrawer +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests for verifying basic functionality of tab collections + * + */ + +class ComposeCollectionTest { + private lateinit var mDevice: UiDevice + private lateinit var mockWebServer: MockWebServer + private val firstCollectionName = "testcollection_1" + private val secondCollectionName = "testcollection_2" + private val collectionName = "First Collection" + + @get:Rule + val composeTestRule = + AndroidComposeTestRule( + HomeActivityIntentTestRule( + isHomeOnboardingDialogEnabled = false, + isJumpBackInCFREnabled = false, + isRecentTabsFeatureEnabled = false, + isRecentlyVisitedFeatureEnabled = false, + isPocketEnabled = false, + isWallpaperOnboardingEnabled = false, + isTCPCFREnabled = false, + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Before + fun setUp() { + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @SmokeTest + @Test + fun createFirstCollectionTest() { + val firstWebPage = getGenericAsset(mockWebServer, 1) + val secondWebPage = getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + mDevice.waitForIdle() + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + mDevice.waitForIdle() + }.goToHomescreen { + }.clickSaveTabsToCollectionButton(composeTestRule) { + longClickTab(firstWebPage.title) + selectTab(secondWebPage.title) + verifyTabsMultiSelectionCounter(2) + }.clickSaveCollection { + typeCollectionNameAndSave(collectionName) + } + + composeTabDrawer(composeTestRule) { + verifySnackBarText("Collection saved!") + clickSnackbarButton("VIEW") + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + } + } + + @SmokeTest + @Test + fun verifyExpandedCollectionItemsTest() { + val webPage = getGenericAsset(mockWebServer, 1) + val webPageUrl = webPage.url.host.toString() + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = collectionName) + clickSnackbarButton("VIEW") + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + verifyTabSavedInCollection(webPage.title) + verifyCollectionTabUrl(true, webPageUrl) + verifyShareCollectionButtonIsVisible(true) + verifyCollectionMenuIsVisible(true, composeTestRule) + verifyCollectionItemRemoveButtonIsVisible(webPage.title, true) + }.collapseCollection(collectionName) {} + + collectionRobot { + verifyTabSavedInCollection(webPage.title, false) + verifyShareCollectionButtonIsVisible(false) + verifyCollectionMenuIsVisible(false, composeTestRule) + verifyCollectionTabUrl(false, webPageUrl) + verifyCollectionItemRemoveButtonIsVisible(webPage.title, false) + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + verifyTabSavedInCollection(webPage.title) + verifyCollectionTabUrl(true, webPageUrl) + verifyShareCollectionButtonIsVisible(true) + verifyCollectionMenuIsVisible(true, composeTestRule) + verifyCollectionItemRemoveButtonIsVisible(webPage.title, true) + }.collapseCollection(collectionName) {} + + collectionRobot { + verifyTabSavedInCollection(webPage.title, false) + verifyShareCollectionButtonIsVisible(false) + verifyCollectionMenuIsVisible(false, composeTestRule) + verifyCollectionTabUrl(false, webPageUrl) + verifyCollectionItemRemoveButtonIsVisible(webPage.title, false) + } + } + + @SmokeTest + @Test + fun openAllTabsInCollectionTest() { + val firstTestPage = getGenericAsset(mockWebServer, 1) + val secondTestPage = getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstTestPage.url) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondTestPage.url.toString()) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + createCollection( + firstTestPage.title, + secondTestPage.title, + collectionName = collectionName, + ) + }.openThreeDotMenu { + }.closeAllTabs { + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + clickCollectionThreeDotButton(composeTestRule) + selectOpenTabs(composeTestRule) + } + composeTabDrawer(composeTestRule) { + verifyExistingOpenTabs(firstTestPage.title, secondTestPage.title) + } + } + + @SmokeTest + @Test + fun shareCollectionTest() { + val firstWebsite = getGenericAsset(mockWebServer, 1) + val secondWebsite = getGenericAsset(mockWebServer, 2) + val sharingApp = "Gmail" + val urlString = "${secondWebsite.url}\n\n${firstWebsite.url}" + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebsite.url) { + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebsite.url.toString()) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + createCollection(firstWebsite.title, secondWebsite.title, collectionName = collectionName) + verifySnackBarText("Collection saved!") + }.openThreeDotMenu { + }.closeAllTabs { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + }.clickShareCollectionButton { + verifyShareTabsOverlay(firstWebsite.title, secondWebsite.title) + verifySharingWithSelectedApp(sharingApp, urlString, collectionName) + } + } + + // Test running on beta/release builds in CI: + // caution when making changes to it, so they don't block the builds + @SmokeTest + @Test + fun deleteCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = collectionName) + clickSnackbarButton("VIEW") + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + clickCollectionThreeDotButton(composeTestRule) + selectDeleteCollection(composeTestRule) + } + + homeScreen { + verifySnackBarText("Collection deleted") + verifyNoCollectionsText() + } + } + + // open a webpage, and add currently opened tab to existing collection + @Test + fun mainMenuSaveToExistingCollection() { + val firstWebPage = getGenericAsset(mockWebServer, 1) + val secondWebPage = getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(firstWebPage.title, collectionName = collectionName) + verifySnackBarText("Collection saved!") + }.closeTabDrawer {} + + navigationToolbar { + }.enterURLAndEnterToBrowser(secondWebPage.url) { + verifyPageContent(secondWebPage.content) + }.openThreeDotMenu { + }.openSaveToCollection { + }.selectExistingCollection(collectionName) { + verifySnackBarText("Tab saved!") + }.goToHomescreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + verifyTabSavedInCollection(firstWebPage.title) + verifyTabSavedInCollection(secondWebPage.title) + } + } + + @Test + fun verifyAddTabButtonOfCollectionMenu() { + val firstWebPage = getGenericAsset(mockWebServer, 1) + val secondWebPage = getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(firstWebPage.title, collectionName = collectionName) + verifySnackBarText("Collection saved!") + closeTab() + } + + navigationToolbar { + }.enterURLAndEnterToBrowser(secondWebPage.url) { + }.goToHomescreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + clickCollectionThreeDotButton(composeTestRule) + selectAddTabToCollection(composeTestRule) + verifyTabsSelectedCounterText(1) + saveTabsSelectedForCollection() + verifySnackBarText("Tab saved!") + verifyTabSavedInCollection(secondWebPage.title) + } + } + + @Test + fun renameCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = firstCollectionName) + verifySnackBarText("Collection saved!") + }.closeTabDrawer { + }.goToHomescreen { + verifyCollectionIsDisplayed(firstCollectionName) + }.expandCollection(firstCollectionName) { + clickCollectionThreeDotButton(composeTestRule) + selectRenameCollection(composeTestRule) + }.typeCollectionNameAndSave(secondCollectionName) {} + + homeScreen { + verifyCollectionIsDisplayed(secondCollectionName) + } + } + + @Test + fun createSecondCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = firstCollectionName) + verifySnackBarText("Collection saved!") + createCollection( + webPage.title, + collectionName = secondCollectionName, + firstCollection = false, + ) + verifySnackBarText("Collection saved!") + }.closeTabDrawer { + }.goToHomescreen { + verifyCollectionIsDisplayed(firstCollectionName) + verifyCollectionIsDisplayed(secondCollectionName) + } + } + + @Test + fun removeTabFromCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = collectionName) + closeTab() + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + verifyTabSavedInCollection(webPage.title, true) + removeTabFromCollection(webPage.title) + verifyTabSavedInCollection(webPage.title, false) + } + homeScreen { + verifyCollectionIsDisplayed(collectionName, false) + } + } + + @Test + fun swipeLeftToRemoveTabFromCollectionTest() { + val testPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(testPage.url) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + createCollection( + testPage.title, + collectionName = collectionName, + ) + closeTab() + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + swipeTabLeft(testPage.title, composeTestRule) + verifyTabSavedInCollection(testPage.title, false) + } + homeScreen { + verifyCollectionIsDisplayed(collectionName, false) + } + } + + @Test + fun swipeRightToRemoveTabFromCollectionTest() { + val testPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(testPage.url) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + createCollection( + testPage.title, + collectionName = collectionName, + ) + closeTab() + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + swipeTabRight(testPage.title, composeTestRule) + verifyTabSavedInCollection(testPage.title, false) + } + homeScreen { + verifyCollectionIsDisplayed(collectionName, false) + } + } + + @Test + fun selectTabOnLongTapTest() { + val firstWebPage = getGenericAsset(mockWebServer, 1) + val secondWebPage = getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + verifyExistingOpenTabs(firstWebPage.title, secondWebPage.title) + longClickTab(firstWebPage.title) + verifyTabsMultiSelectionCounter(1) + selectTab(secondWebPage.title) + verifyTabsMultiSelectionCounter(2) + }.clickSaveCollection { + typeCollectionNameAndSave(collectionName) + verifySnackBarText("Tabs saved!") + } + + composeTabDrawer(composeTestRule) { + }.closeTabDrawer { + }.goToHomescreen { + }.expandCollection(collectionName) { + verifyTabSavedInCollection(firstWebPage.title) + verifyTabSavedInCollection(secondWebPage.title) + } + } + + @Test + fun navigateBackInCollectionFlowTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = collectionName) + verifySnackBarText("Collection saved!") + }.closeTabDrawer { + }.openThreeDotMenu { + }.openSaveToCollection { + verifySelectCollectionScreen() + goBackInCollectionFlow() + } + + browserScreen { + }.openThreeDotMenu { + }.openSaveToCollection { + verifySelectCollectionScreen() + clickAddNewCollection() + verifyCollectionNameTextField() + goBackInCollectionFlow() + verifySelectCollectionScreen() + goBackInCollectionFlow() + } + // verify the browser layout is visible + browserScreen { + verifyMenuButton() + } + } + + @SmokeTest + @Test + fun undoDeleteCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = collectionName) + clickSnackbarButton("VIEW") + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + clickCollectionThreeDotButton(composeTestRule) + selectDeleteCollection(composeTestRule) + } + + homeScreen { + verifySnackBarText("Collection deleted") + clickSnackbarButton("UNDO") + verifyCollectionIsDisplayed(collectionName, true) + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt index 9b0717d75..208cbf5f0 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt @@ -336,7 +336,7 @@ class ComposeTabbedBrowsingTest { verifyFab() verifyTabThumbnail() verifyExistingOpenTabs(defaultWebPage.title) - verifyTabCloseButton(defaultWebPage.title) + verifyTabCloseButton() }.openTab(defaultWebPage.title) { verifyUrl(defaultWebPage.url.toString()) verifyTabCounter("1") diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt index ebadb175e..b3723735b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt @@ -7,16 +7,22 @@ package org.mozilla.fenix.ui.robots import android.view.View +import androidx.compose.ui.semantics.SemanticsActions +import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertIsNotSelected import androidx.compose.ui.test.assertIsSelected +import androidx.compose.ui.test.filter import androidx.compose.ui.test.hasAnyChild -import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.longClick +import androidx.compose.ui.test.onAllNodesWithTag +import androidx.compose.ui.test.onFirst import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performSemanticsAction import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.swipeLeft import androidx.compose.ui.test.swipeRight @@ -29,8 +35,10 @@ import androidx.test.espresso.matcher.ViewMatchers import com.google.android.material.bottomsheet.BottomSheetBehavior import org.hamcrest.Matcher import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.Constants import org.mozilla.fenix.helpers.HomeActivityComposeTestRule import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText +import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.clickAtLocationInView @@ -139,14 +147,10 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest } /** - * Verifies a tab with [title] has a close button. + * Verifies a tab's close button when there is only one tab open. */ - fun verifyTabCloseButton(title: String) { - composeTestRule.tabItem(title).assert( - hasAnyChild( - hasTestTag(TabsTrayTestTag.tabItemClose), - ), - ) + fun verifyTabCloseButton() { + composeTestRule.closeTabButton().assertExists() } fun verifyTabsTrayBehaviorState(expectedState: Int) { @@ -182,6 +186,54 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest composeTestRule.tabItem(title).performTouchInput { swipeRight() } } + /** + * Creates a collection from the provided [tabTitles]. + */ + fun createCollection( + vararg tabTitles: String, + collectionName: String, + firstCollection: Boolean = true, + ) { + composeTestRule.threeDotButton().performClick() + composeTestRule.dropdownMenuItemSelectTabs().performClick() + + for (tab in tabTitles) { + selectTab(tab) + } + + clickCollectionsButton(composeTestRule) { + if (!firstCollection) { + clickAddNewCollection() + } + typeCollectionNameAndSave(collectionName) + } + } + + /** + * Selects a tab with [title]. + */ + @OptIn(ExperimentalTestApi::class) + fun selectTab(title: String) { + composeTestRule.waitUntilExactlyOneExists(hasText(title), TestAssetHelper.waitingTime) + composeTestRule.tabItem(title).performClick() + } + + /** + * Performs a long click on a tab with [title]. + */ + fun longClickTab(title: String) { + composeTestRule.tabItem(title) + .performTouchInput { longClick(durationMillis = Constants.LONG_CLICK_DURATION) } + } + + /** + * Verifies the multi selection counter displays [numOfTabs]. + */ + fun verifyTabsMultiSelectionCounter(numOfTabs: Int) { + composeTestRule.multiSelectionCounter() + .assert(hasText("$numOfTabs selected")) + } + class Transition(private val composeTestRule: HomeActivityComposeTestRule) { fun openNewTab(interact: SearchRobot.() -> Unit): SearchRobot.Transition { @@ -283,9 +335,41 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest ComposeTabDrawerRobot(composeTestRule).interact() return Transition(composeTestRule) } + + fun closeTabDrawer(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + composeTestRule.bannerHandle().performSemanticsAction(SemanticsActions.OnClick) + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + + fun clickSaveCollection(interact: CollectionRobot.() -> Unit): CollectionRobot.Transition { + composeTestRule.collectionsButton().performClick() + + CollectionRobot().interact() + return CollectionRobot.Transition() + } } } +/** + * Opens a transition in the [ComposeTabDrawerRobot]. + */ +fun composeTabDrawer(composeTestRule: HomeActivityComposeTestRule, interact: ComposeTabDrawerRobot.() -> Unit): ComposeTabDrawerRobot.Transition { + ComposeTabDrawerRobot(composeTestRule).interact() + return ComposeTabDrawerRobot.Transition(composeTestRule) +} + +/** + * Clicks on the Collections button in the Tabs Tray banner and opens a transition in the [CollectionRobot]. + */ +private fun clickCollectionsButton(composeTestRule: HomeActivityComposeTestRule, interact: CollectionRobot.() -> Unit): CollectionRobot.Transition { + composeTestRule.collectionsButton().performClick() + + CollectionRobot().interact() + return CollectionRobot.Transition() +} + /** * Obtains the root [View] that wraps the Tabs Tray. */ @@ -344,7 +428,9 @@ private fun ComposeTestRule.emptyPrivateTabsList() = onNodeWithTag(TabsTrayTestT /** * Obtains the tab with the provided [title] */ -private fun ComposeTestRule.tabItem(title: String) = onNodeWithText(title) +private fun ComposeTestRule.tabItem(title: String) = onAllNodesWithTag(TabsTrayTestTag.tabItemRoot) + .filter(hasAnyChild(hasText(title))) + .onFirst() /** * Obtains an open tab's close button when there's only one tab open. @@ -395,3 +481,18 @@ private fun ComposeTestRule.dropdownMenuItemTabSettings() = onNodeWithTag(TabsTr * Obtains the normal tabs counter. */ private fun ComposeTestRule.normalTabsCounter() = onNodeWithTag(TabsTrayTestTag.normalTabsCounter) + +/** + * Obtains the Tabs Tray banner collections button. + */ +private fun ComposeTestRule.collectionsButton() = onNodeWithTag(TabsTrayTestTag.collectionsButton) + +/** + * Obtains the Tabs Tray banner multi selection counter. + */ +private fun ComposeTestRule.multiSelectionCounter() = onNodeWithTag(TabsTrayTestTag.selectionCounter) + +/** + * Obtains the Tabs Tray banner handle. + */ +private fun ComposeTestRule.bannerHandle() = onNodeWithTag(TabsTrayTestTag.bannerHandle) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index c1f199e1e..a49b5c2f2 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -784,6 +784,14 @@ class HomeScreenRobot { return TabDrawerRobot.Transition() } + fun clickSaveTabsToCollectionButton(composeTestRule: HomeActivityComposeTestRule, interact: ComposeTabDrawerRobot.() -> Unit): ComposeTabDrawerRobot.Transition { + scrollToElementByText(getStringResource(R.string.no_collections_description2)) + saveTabsToCollectionButton().click() + + ComposeTabDrawerRobot(composeTestRule).interact() + return ComposeTabDrawerRobot.Transition(composeTestRule) + } + fun expandCollection(title: String, interact: CollectionRobot.() -> Unit): CollectionRobot.Transition { assertItemContainingTextExists(itemContainingText(title)) itemContainingText(title).clickAndWaitForNewWindow(waitingTimeShort) diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt index 0ede9ca9a..2c25e59d8 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt @@ -133,7 +133,11 @@ fun TabGridItem( }, ), ) { - Box(modifier = Modifier.wrapContentSize()) { + Box( + modifier = Modifier + .wrapContentSize() + .testTag(TabsTrayTestTag.tabItemRoot), + ) { Card( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt index 7340e74fd..ceb161d64 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt @@ -124,7 +124,8 @@ fun TabListItem( onLongClick = { onLongClick(tab) }, onClick = { onClick(tab) }, ) - .padding(start = 16.dp, top = 8.dp, bottom = 8.dp), + .padding(start = 16.dp, top = 8.dp, bottom = 8.dp) + .testTag(TabsTrayTestTag.tabItemRoot), verticalAlignment = Alignment.CenterVertically, ) { Thumbnail( diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt index f6a2c6b30..288a7b9b1 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt @@ -84,6 +84,7 @@ import mozilla.components.browser.storage.sync.Tab as SyncTab * @param onBookmarkSelectedTabsClick Invoked when the user clicks on the bookmark banner menu item. * @param onDeleteSelectedTabsClick Invoked when the user clicks on the close selected tabs banner menu item. * @param onForceSelectedTabsAsInactiveClick Invoked when the user clicks on the make inactive banner menu item. + * @param onTabsTrayDismiss Invoked when accessibility services or UI automation requests dismissal. */ @Suppress("LongMethod", "LongParameterList", "ComplexMethod") @Composable @@ -117,6 +118,7 @@ fun TabsTray( onBookmarkSelectedTabsClick: () -> Unit, onDeleteSelectedTabsClick: () -> Unit, onForceSelectedTabsAsInactiveClick: () -> Unit, + onTabsTrayDismiss: () -> Unit, ) { val multiselectMode = tabsTrayStore .observeAsComposableState { state -> state.mode }.value ?: TabsTrayState.Mode.Normal @@ -157,6 +159,7 @@ fun TabsTray( onBookmarkSelectedTabsClick = onBookmarkSelectedTabsClick, onDeleteSelectedTabsClick = onDeleteSelectedTabsClick, onForceSelectedTabsAsInactiveClick = onForceSelectedTabsAsInactiveClick, + onDismissClick = onTabsTrayDismiss, ) } @@ -534,6 +537,7 @@ private fun TabsTrayPreviewRoot( onDeleteSelectedTabsClick = {}, onBookmarkSelectedTabsClick = {}, onForceSelectedTabsAsInactiveClick = {}, + onTabsTrayDismiss = {}, ) } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt index 283c9d4d4..ea5fe0732 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt @@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.Tab @@ -49,6 +48,7 @@ import mozilla.components.browser.state.state.TabSessionState import mozilla.components.lib.state.ext.observeAsComposableState import mozilla.components.ui.tabcounter.TabCounter import org.mozilla.fenix.R +import org.mozilla.fenix.compose.BottomSheetHandle import org.mozilla.fenix.compose.ContextualMenu import org.mozilla.fenix.compose.MenuItem import org.mozilla.fenix.compose.annotation.LightDarkPreview @@ -56,6 +56,7 @@ import org.mozilla.fenix.theme.FirefoxTheme private val ICON_SIZE = 24.dp private const val MAX_WIDTH_TAB_ROW_PERCENT = 0.5f +private const val BOTTOM_SHEET_HANDLE_WIDTH_PERCENT = 0.1f /** * Top-level UI for displaying the banner in [TabsTray]. @@ -74,6 +75,7 @@ private const val MAX_WIDTH_TAB_ROW_PERCENT = 0.5f * @param onDeleteSelectedTabsClick Invoked when user interacts with the close menu item. * @param onBookmarkSelectedTabsClick Invoked when user interacts with the bookmark menu item. * @param onForceSelectedTabsAsInactiveClick Invoked when user interacts with the make inactive menu item. + * @param onDismissClick Invoked when accessibility services or UI automation requests dismissal. */ @Suppress("LongParameterList") @Composable @@ -91,6 +93,7 @@ fun TabsTrayBanner( onDeleteSelectedTabsClick: () -> Unit, onBookmarkSelectedTabsClick: () -> Unit, onForceSelectedTabsAsInactiveClick: () -> Unit, + onDismissClick: () -> Unit, ) { val normalTabCount = tabsTrayStore.observeAsComposableState { state -> state.normalTabs.size + state.inactiveTabs.size @@ -125,6 +128,7 @@ fun TabsTrayBanner( onRecentlyClosedClick = onRecentlyClosedClick, onAccountSettingsClick = onAccountSettingsClick, onDeleteAllTabsClick = onDeleteAllTabsClick, + onDismissClick = onDismissClick, ) } } @@ -142,6 +146,7 @@ private fun SingleSelectBanner( onRecentlyClosedClick: () -> Unit, onAccountSettingsClick: () -> Unit, onDeleteAllTabsClick: () -> Unit, + onDismissClick: () -> Unit, ) { val selectedColor = FirefoxTheme.colors.iconActive val inactiveColor = FirefoxTheme.colors.iconPrimaryInactive @@ -150,12 +155,13 @@ private fun SingleSelectBanner( Column(modifier = Modifier.background(color = FirefoxTheme.colors.layer1)) { Spacer(modifier = Modifier.height(dimensionResource(id = R.dimen.bottom_sheet_handle_top_margin))) - Divider( + BottomSheetHandle( + onRequestDismiss = onDismissClick, + contentDescription = stringResource(R.string.a11y_action_label_collapse), modifier = Modifier - .fillMaxWidth(DRAG_INDICATOR_WIDTH_PERCENT) - .align(Alignment.CenterHorizontally), - color = FirefoxTheme.colors.textSecondary, - thickness = dimensionResource(id = R.dimen.bottom_sheet_handle_height), + .fillMaxWidth(BOTTOM_SHEET_HANDLE_WIDTH_PERCENT) + .align(Alignment.CenterHorizontally) + .testTag(TabsTrayTestTag.bannerHandle), ) Row( @@ -472,13 +478,17 @@ private fun MultiSelectBanner( Text( text = stringResource(R.string.tab_tray_multi_select_title, selectedTabCount), + modifier = Modifier.testTag(TabsTrayTestTag.selectionCounter), style = FirefoxTheme.typography.headline6, color = FirefoxTheme.colors.textOnColorPrimary, ) Spacer(modifier = Modifier.weight(1.0f)) - IconButton(onClick = onSaveToCollectionsClick) { + IconButton( + onClick = onSaveToCollectionsClick, + modifier = Modifier.testTag(TabsTrayTestTag.collectionsButton), + ) { Icon( painter = painterResource(id = R.drawable.ic_tab_collection), contentDescription = stringResource( @@ -592,13 +602,12 @@ private fun TabsTrayBannerPreviewRoot( onBookmarkSelectedTabsClick = {}, onDeleteSelectedTabsClick = {}, onForceSelectedTabsAsInactiveClick = {}, + onDismissClick = {}, ) } } } -private const val DRAG_INDICATOR_WIDTH_PERCENT = 0.1f - private object DisabledRippleTheme : RippleTheme { @Composable override fun defaultColor() = Color.Unspecified diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index 01a660f41..ca477e72a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -281,6 +281,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { onDeleteSelectedTabsClick = tabsTrayInteractor::onDeleteSelectedTabsClicked, onBookmarkSelectedTabsClick = tabsTrayInteractor::onBookmarkSelectedTabsClicked, onForceSelectedTabsAsInactiveClick = tabsTrayInteractor::onForceSelectedTabsAsInactiveClicked, + onTabsTrayDismiss = ::onTabsTrayDismissed, ) } } @@ -372,8 +373,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { ) setupBackgroundDismissalListener { - TabsTray.closed.record(NoExtras()) - dismissAllowingStateLoss() + onTabsTrayDismissed() } if (!requireContext().settings().enableTabsTrayToCompose) { @@ -749,6 +749,11 @@ class TabsTrayFragment : AppCompatDialogFragment() { snackbar.show() } + private fun onTabsTrayDismissed() { + TabsTray.closed.record(NoExtras()) + dismissAllowingStateLoss() + } + companion object { private const val DOWNLOAD_CANCEL_DIALOG_FRAGMENT_TAG = "DOWNLOAD_CANCEL_DIALOG_FRAGMENT_TAG" diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTestTag.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTestTag.kt index de9f182b7..baa586e97 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTestTag.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTestTag.kt @@ -9,11 +9,15 @@ internal object TabsTrayTestTag { // Tabs Tray Banner private const val bannerTestTagRoot = "$tabsTray.banner" + const val bannerHandle = "$bannerTestTagRoot.handle" const val normalTabsPageButton = "$bannerTestTagRoot.normalTabsPageButton" const val normalTabsCounter = "$normalTabsPageButton.counter" const val privateTabsPageButton = "$bannerTestTagRoot.privateTabsPageButton" const val syncedTabsPageButton = "$bannerTestTagRoot.syncedTabsPageButton" + const val selectionCounter = "$bannerTestTagRoot.selectionCounter" + const val collectionsButton = "$bannerTestTagRoot.collections" + // Tabs Tray Banner three dot menu const val threeDotButton = "$bannerTestTagRoot.threeDotButton" @@ -37,7 +41,7 @@ internal object TabsTrayTestTag { const val emptyPrivateTabsList = "$privateTabsList.empty" // Tab items - private const val tabItemRoot = "$tabsTray.tabItem" + const val tabItemRoot = "$tabsTray.tabItem" const val tabItemClose = "$tabItemRoot.close" const val tabItemThumbnail = "$tabItemRoot.thumbnail" } From 5702aacbbbb1021cc7463a8502c234459287f1ef Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 00:51:48 -0400 Subject: [PATCH 037/207] Bug 1840210 - Rename mozac_ic_add_to_homescreen to mozac_ic_add_to_homescreen_24 --- .../mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 4 ++-- app/src/main/res/layout/fragment_pwa_onboarding.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 1c8e2b191..2f2e9bfd3 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -181,7 +181,7 @@ open class DefaultToolbarMenu( private val installToHomescreen = BrowserMenuHighlightableItem( label = context.getString(R.string.browser_menu_install_on_homescreen), - startImageResource = R.drawable.mozac_ic_add_to_home_screen, + startImageResource = R.drawable.mozac_ic_add_to_home_screen_24, iconTintColorResource = primaryTextColor(), highlight = BrowserMenuHighlight.LowPriority( label = context.getString(R.string.browser_menu_install_on_homescreen), @@ -270,7 +270,7 @@ open class DefaultToolbarMenu( private val addToHomeScreenItem = BrowserMenuImageText( label = context.getString(R.string.browser_menu_add_to_homescreen), - imageResource = R.drawable.mozac_ic_add_to_home_screen, + imageResource = R.drawable.mozac_ic_add_to_home_screen_24, iconTintColorResource = primaryTextColor(), isCollapsingMenuLimit = true, ) { diff --git a/app/src/main/res/layout/fragment_pwa_onboarding.xml b/app/src/main/res/layout/fragment_pwa_onboarding.xml index 2ee142cbb..cbe2268a4 100644 --- a/app/src/main/res/layout/fragment_pwa_onboarding.xml +++ b/app/src/main/res/layout/fragment_pwa_onboarding.xml @@ -47,7 +47,7 @@ app:layout_constraintEnd_toStartOf="@id/description" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/dialog_title" - app:srcCompat="@drawable/mozac_ic_add_to_home_screen" /> + app:srcCompat="@drawable/mozac_ic_add_to_home_screen_24" /> Date: Sat, 24 Jun 2023 00:57:01 -0400 Subject: [PATCH 038/207] Bug 1840210 - Rename mozac_ic_close to mozac_ic_cross_24 --- .../main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt | 2 +- .../main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt | 2 +- .../java/org/mozilla/fenix/onboarding/view/OnboardingPage.kt | 2 +- .../dialog/CookieBannerReEngagementDialogCompose.kt | 2 +- .../org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt | 2 +- .../java/org/mozilla/fenix/wallpapers/WallpaperOnboarding.kt | 2 +- app/src/main/res/layout/start_download_dialog_layout.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt index 2c25e59d8..6c59aa2c6 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt @@ -205,7 +205,7 @@ fun TabGridItem( if (!multiSelectionEnabled) { Icon( - painter = painterResource(id = R.drawable.mozac_ic_close), + painter = painterResource(id = R.drawable.mozac_ic_cross_24), contentDescription = stringResource(id = R.string.close_tab), tint = FirefoxTheme.colors.iconPrimary, modifier = Modifier diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt index ceb161d64..e603f40b0 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt @@ -168,7 +168,7 @@ fun TabListItem( .testTag(TabsTrayTestTag.tabItemClose), ) { Icon( - painter = painterResource(id = R.drawable.mozac_ic_close), + painter = painterResource(id = R.drawable.mozac_ic_cross_24), contentDescription = stringResource( id = R.string.close_tab_title, tab.content.title, diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingPage.kt b/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingPage.kt index 25368cd41..9593e99ff 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingPage.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/view/OnboardingPage.kt @@ -104,7 +104,7 @@ fun OnboardingPage( modifier = Modifier.align(Alignment.End), ) { Icon( - painter = painterResource(id = R.drawable.mozac_ic_close), + painter = painterResource(id = R.drawable.mozac_ic_cross_24), contentDescription = stringResource(R.string.onboarding_home_content_description_close_button), tint = FirefoxTheme.colors.iconPrimary, ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt index 6b564ba0a..79a93c243 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt @@ -89,7 +89,7 @@ fun CookieBannerReEngagementDialogCompose( onClick = onCloseButtonClicked, ) { Icon( - painter = painterResource(R.drawable.mozac_ic_close), + painter = painterResource(R.drawable.mozac_ic_cross_24), contentDescription = stringResource(R.string.content_description_close_button), tint = FirefoxTheme.colors.iconPrimary, ) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt b/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt index 8152b9e05..64357dd93 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt @@ -114,7 +114,7 @@ fun InactiveTabsList( faviconPainter = faviconPainter, onClick = { onTabClick(tab) }, url = tabUrl, - iconPainter = painterResource(R.drawable.mozac_ic_close), + iconPainter = painterResource(R.drawable.mozac_ic_cross_24), iconDescription = stringResource(R.string.content_description_close_button), onIconClick = { onTabCloseClick(tab) }, ) diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperOnboarding.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperOnboarding.kt index 36d56da61..916d34e55 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperOnboarding.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperOnboarding.kt @@ -61,7 +61,7 @@ fun WallpaperOnboarding( horizontalAlignment = Alignment.CenterHorizontally, ) { Icon( - painter = painterResource(id = R.drawable.mozac_ic_close), + painter = painterResource(id = R.drawable.mozac_ic_cross_24), contentDescription = stringResource(id = R.string.close_tab), tint = FirefoxTheme.colors.iconPrimary, modifier = Modifier diff --git a/app/src/main/res/layout/start_download_dialog_layout.xml b/app/src/main/res/layout/start_download_dialog_layout.xml index 186778e45..0ac7400fd 100644 --- a/app/src/main/res/layout/start_download_dialog_layout.xml +++ b/app/src/main/res/layout/start_download_dialog_layout.xml @@ -56,7 +56,7 @@ android:scaleType="centerInside" android:background="@null" android:contentDescription="@string/mozac_feature_downloads_button_close" - app:srcCompat="@drawable/mozac_ic_close" + app:srcCompat="@drawable/mozac_ic_cross_24" app:tint="?android:attr/textColorPrimary" tools:textColor="#000000" /> From 078b16849ab2f963ccbe47b4a323aa6b5db9d782 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 01:26:37 -0400 Subject: [PATCH 039/207] Bug 1840210 - Rename mozac_ic_check to mozac_ic_checkmark_24 --- .../main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt | 2 +- .../main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt | 2 +- app/src/main/res/layout/checkbox_item.xml | 2 +- app/src/main/res/layout/library_site_item.xml | 2 +- app/src/main/res/layout/locale_settings_item.xml | 2 +- app/src/main/res/menu/add_custom_searchengine_menu.xml | 2 +- app/src/main/res/menu/address_editor.xml | 2 +- app/src/main/res/menu/bookmarks_add_folder.xml | 2 +- app/src/main/res/menu/bookmarks_edit.xml | 2 +- app/src/main/res/menu/credit_card_editor.xml | 2 +- app/src/main/res/menu/edit_custom_searchengine_menu.xml | 2 +- app/src/main/res/menu/login_save.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt index 6c59aa2c6..335aeec56 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt @@ -279,7 +279,7 @@ private fun Thumbnail( backgroundColor = FirefoxTheme.colors.layerAccent, ) { Icon( - painter = painterResource(id = R.drawable.mozac_ic_check), + painter = painterResource(id = R.drawable.mozac_ic_checkmark_24), modifier = Modifier .matchParentSize() .padding(all = 8.dp), diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt index e603f40b0..0a115c545 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt @@ -218,7 +218,7 @@ private fun Thumbnail( backgroundColor = FirefoxTheme.colors.layerAccent, ) { Icon( - painter = painterResource(id = R.drawable.mozac_ic_check), + painter = painterResource(id = R.drawable.mozac_ic_checkmark_24), modifier = Modifier .matchParentSize() .padding(all = 8.dp), diff --git a/app/src/main/res/layout/checkbox_item.xml b/app/src/main/res/layout/checkbox_item.xml index 1d5780290..8caebc2b7 100644 --- a/app/src/main/res/layout/checkbox_item.xml +++ b/app/src/main/res/layout/checkbox_item.xml @@ -21,6 +21,6 @@ android:backgroundTint="@color/fx_mobile_layer_color_accent" android:elevation="1dp" android:padding="8dp" - app:srcCompat="@drawable/mozac_ic_check" + app:srcCompat="@drawable/mozac_ic_checkmark_24" app:tint="@color/photonWhite" /> diff --git a/app/src/main/res/layout/library_site_item.xml b/app/src/main/res/layout/library_site_item.xml index 91cab3c35..8a4faa3ce 100644 --- a/app/src/main/res/layout/library_site_item.xml +++ b/app/src/main/res/layout/library_site_item.xml @@ -36,7 +36,7 @@ android:padding="10dp" android:background="@drawable/favicon_background" android:backgroundTint="?accent" - app:srcCompat="@drawable/mozac_ic_check" /> + app:srcCompat="@drawable/mozac_ic_checkmark_24" /> diff --git a/app/src/main/res/menu/address_editor.xml b/app/src/main/res/menu/address_editor.xml index 88b4be47f..16b64a50f 100644 --- a/app/src/main/res/menu/address_editor.xml +++ b/app/src/main/res/menu/address_editor.xml @@ -13,7 +13,7 @@ app:showAsAction="ifRoom" /> diff --git a/app/src/main/res/menu/bookmarks_add_folder.xml b/app/src/main/res/menu/bookmarks_add_folder.xml index 562c39a4a..97cb03fe0 100644 --- a/app/src/main/res/menu/bookmarks_add_folder.xml +++ b/app/src/main/res/menu/bookmarks_add_folder.xml @@ -6,7 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/bookmarks_edit.xml b/app/src/main/res/menu/bookmarks_edit.xml index da0c6fa16..2a46445c0 100644 --- a/app/src/main/res/menu/bookmarks_edit.xml +++ b/app/src/main/res/menu/bookmarks_edit.xml @@ -13,7 +13,7 @@ app:showAsAction="ifRoom" /> diff --git a/app/src/main/res/menu/edit_custom_searchengine_menu.xml b/app/src/main/res/menu/edit_custom_searchengine_menu.xml index 65d30eaea..dc31229f4 100644 --- a/app/src/main/res/menu/edit_custom_searchengine_menu.xml +++ b/app/src/main/res/menu/edit_custom_searchengine_menu.xml @@ -6,7 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/login_save.xml b/app/src/main/res/menu/login_save.xml index 644dbf941..4fdd47495 100644 --- a/app/src/main/res/menu/login_save.xml +++ b/app/src/main/res/menu/login_save.xml @@ -7,7 +7,7 @@ android:id="@+id/login_save"> From 082104417a200239fe3d59213029eca6e2e73957 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 02:07:18 -0400 Subject: [PATCH 040/207] Bug 1840210 - Rename mozac_ic_back to mozac_ic_back_24 --- .../main/java/org/mozilla/fenix/browser/BrowserFragment.kt | 2 +- .../mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- .../java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt | 2 +- app/src/main/res/layout/component_collection_creation.xml | 2 +- .../layout/component_collection_creation_name_collection.xml | 2 +- .../component_collection_creation_select_collection.xml | 2 +- .../main/res/layout/component_cookie_banner_details_panel.xml | 2 +- .../main/res/layout/component_tracking_protection_panel.xml | 4 ++-- app/src/main/res/layout/connection_details_website_info.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index e3fd70d8a..5f03ab3ff 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -250,7 +250,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { backAction = BrowserToolbar.TwoStateButton( primaryImage = AppCompatResources.getDrawable( context, - R.drawable.mozac_ic_back, + R.drawable.mozac_ic_back_24, )!!, primaryContentDescription = context.getString(R.string.browser_menu_back), primaryImageTintResource = enableTint, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 2f2e9bfd3..3a0b68158 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -95,7 +95,7 @@ open class DefaultToolbarMenu( override val menuToolbar by lazy { val back = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back, + primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back_24, primaryContentDescription = context.getString(R.string.browser_menu_back), primaryImageTintResource = primaryTextColor(), isInPrimaryState = { 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 189834719..5b46f4ed9 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -55,7 +55,7 @@ class CustomTabToolbarMenu( override val menuToolbar by lazy { val back = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back, + primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back_24, primaryContentDescription = context.getString(R.string.browser_menu_back), primaryImageTintResource = primaryTextColor(), isInPrimaryState = { diff --git a/app/src/main/res/layout/component_collection_creation.xml b/app/src/main/res/layout/component_collection_creation.xml index e621d9000..fafa997bf 100644 --- a/app/src/main/res/layout/component_collection_creation.xml +++ b/app/src/main/res/layout/component_collection_creation.xml @@ -25,7 +25,7 @@ android:textAppearance="@style/HeaderTextStyle" android:textColor="@color/fx_mobile_text_color_oncolor_primary" android:textSize="20sp" - app:drawableStartCompat="@drawable/mozac_ic_back" + app:drawableStartCompat="@drawable/mozac_ic_back_24" app:drawableTint="@color/fx_mobile_icon_color_oncolor" app:layout_constrainedWidth="true" app:layout_constraintEnd_toStartOf="@+id/guideline" diff --git a/app/src/main/res/layout/component_collection_creation_name_collection.xml b/app/src/main/res/layout/component_collection_creation_name_collection.xml index edc793f12..c734f6d4a 100644 --- a/app/src/main/res/layout/component_collection_creation_name_collection.xml +++ b/app/src/main/res/layout/component_collection_creation_name_collection.xml @@ -22,7 +22,7 @@ android:textAppearance="@style/HeaderTextStyle" android:textColor="@color/fx_mobile_text_color_oncolor_primary" android:textSize="20sp" - app:drawableStartCompat="@drawable/mozac_ic_back" + app:drawableStartCompat="@drawable/mozac_ic_back_24" app:drawableTint="@color/fx_mobile_icon_color_oncolor" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/component_collection_creation_select_collection.xml b/app/src/main/res/layout/component_collection_creation_select_collection.xml index 75521a7a7..fbd52d883 100644 --- a/app/src/main/res/layout/component_collection_creation_select_collection.xml +++ b/app/src/main/res/layout/component_collection_creation_select_collection.xml @@ -22,7 +22,7 @@ android:textAppearance="@style/HeaderTextStyle" android:textColor="@color/fx_mobile_text_color_oncolor_primary" android:textSize="20sp" - app:drawableStartCompat="@drawable/mozac_ic_back" + app:drawableStartCompat="@drawable/mozac_ic_back_24" app:drawableTint="@color/fx_mobile_icon_color_oncolor" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/component_cookie_banner_details_panel.xml b/app/src/main/res/layout/component_cookie_banner_details_panel.xml index 0d43f249e..6c8a734f8 100644 --- a/app/src/main/res/layout/component_cookie_banner_details_panel.xml +++ b/app/src/main/res/layout/component_cookie_banner_details_panel.xml @@ -18,7 +18,7 @@ android:scaleType="center" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/mozac_ic_back" + app:srcCompat="@drawable/mozac_ic_back_24" app:tint="?attr/textPrimary" /> + app:srcCompat="@drawable/mozac_ic_back_24" /> + app:srcCompat="@drawable/mozac_ic_back_24" /> Date: Sat, 24 Jun 2023 02:46:55 -0400 Subject: [PATCH 041/207] Bug 1840210 - Rename mozac_ic_clear to mozac_ic_cross_circle_fill_24 --- .../main/java/org/mozilla/fenix/utils/ClearableEditText.kt | 2 +- app/src/main/res/layout/fragment_add_login.xml | 6 +++--- app/src/main/res/layout/fragment_edit_login.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/ClearableEditText.kt b/app/src/main/java/org/mozilla/fenix/utils/ClearableEditText.kt index c297b0724..f8bc5752d 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/ClearableEditText.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/ClearableEditText.kt @@ -53,7 +53,7 @@ class ClearableEditText @JvmOverloads constructor( // lengthAfter has inconsistent behaviour when there are spaces in the entered text, so we'll use text.length. val textLength = text?.length ?: 0 val drawable = if (shouldShowClearButton(textLength)) { - AppCompatResources.getDrawable(context, R.drawable.mozac_ic_clear)?.apply { + AppCompatResources.getDrawable(context, R.drawable.mozac_ic_cross_circle_fill_24)?.apply { colorFilter = createBlendModeColorFilterCompat(context.getColorFromAttr(R.attr.textPrimary), SRC_IN) } } else { diff --git a/app/src/main/res/layout/fragment_add_login.xml b/app/src/main/res/layout/fragment_add_login.xml index 90be1a52f..17425800f 100644 --- a/app/src/main/res/layout/fragment_add_login.xml +++ b/app/src/main/res/layout/fragment_add_login.xml @@ -84,7 +84,7 @@ app:tint="@color/saved_login_clear_edit_text_tint" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/inputLayoutHostname" - app:srcCompat="@drawable/mozac_ic_clear" /> + app:srcCompat="@drawable/mozac_ic_cross_circle_fill_24" /> + app:srcCompat="@drawable/mozac_ic_cross_circle_fill_24" /> diff --git a/app/src/main/res/layout/fragment_edit_login.xml b/app/src/main/res/layout/fragment_edit_login.xml index 67834702f..9dd736eb1 100644 --- a/app/src/main/res/layout/fragment_edit_login.xml +++ b/app/src/main/res/layout/fragment_edit_login.xml @@ -142,7 +142,7 @@ app:layout_constraintBottom_toBottomOf="@id/inputLayoutUsername" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/inputLayoutUsername" - app:srcCompat="@drawable/mozac_ic_clear" /> + app:srcCompat="@drawable/mozac_ic_cross_circle_fill_24" /> + app:srcCompat="@drawable/mozac_ic_cross_circle_fill_24" /> From 32ec361c46e97c62519717dcd0b6d014ff66aa64 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 11:54:50 -0400 Subject: [PATCH 042/207] Bug 1840210 - Rename mozac_ic_delete to mozac_ic_delete_24 --- app/src/main/res/menu/bookmarks_select_multi_not_item.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/menu/bookmarks_select_multi_not_item.xml b/app/src/main/res/menu/bookmarks_select_multi_not_item.xml index e6930e99f..2e872c284 100644 --- a/app/src/main/res/menu/bookmarks_select_multi_not_item.xml +++ b/app/src/main/res/menu/bookmarks_select_multi_not_item.xml @@ -6,7 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> From ee51792f12ef19ec0f570d0bb7293ea57c79b5a4 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 12:03:07 -0400 Subject: [PATCH 043/207] Bug 1840210 - Rename mozac_ic_device_desktop to mozac_ic_device_desktop_24 --- .../mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index 56ddbd526..681efca8c 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -99,7 +99,7 @@ class AccountDeviceViewHolder( ) else -> Triple( option.device.displayName, - R.drawable.mozac_ic_device_desktop, + R.drawable.mozac_ic_device_desktop_24, R.color.device_type_desktop_background, ) } From fed84ff6b437141730aa505cc82fde145dcb1449 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 12:11:23 -0400 Subject: [PATCH 044/207] Bug 1840210 - Rename mozac_ic_device_mobile to mozac_ic_device_mobile_24 --- .../mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index 681efca8c..7f51a744e 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -94,7 +94,7 @@ class AccountDeviceViewHolder( is SyncShareOption.SingleDevice -> when (option.device.deviceType) { DeviceType.MOBILE -> Triple( option.device.displayName, - R.drawable.mozac_ic_device_mobile, + R.drawable.mozac_ic_device_mobile_24, R.color.device_type_mobile_background, ) else -> Triple( From 804e589262f7ae331c310f6ade64947c61153951 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 12:49:22 -0400 Subject: [PATCH 045/207] Bug 1840210 - Rename mozac_ic_forward to mozac_ic_forward_24 --- app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt | 2 +- .../org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- .../java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 5f03ab3ff..8396ff1d1 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -278,7 +278,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { forwardAction = BrowserToolbar.TwoStateButton( primaryImage = AppCompatResources.getDrawable( context, - R.drawable.mozac_ic_forward, + R.drawable.mozac_ic_forward_24, )!!, primaryContentDescription = context.getString(R.string.browser_menu_forward), primaryImageTintResource = enableTint, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 3a0b68158..79ed51f52 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -109,7 +109,7 @@ open class DefaultToolbarMenu( } val forward = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward, + primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward_24, primaryContentDescription = context.getString(R.string.browser_menu_forward), primaryImageTintResource = primaryTextColor(), isInPrimaryState = { 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 5b46f4ed9..06b042d83 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -72,7 +72,7 @@ class CustomTabToolbarMenu( } val forward = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward, + primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward_24, primaryContentDescription = context.getString(R.string.browser_menu_forward), primaryImageTintResource = primaryTextColor(), isInPrimaryState = { From cc4f1c3d52455bf4319503883cfa7e90ab2f3ab5 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 13:13:19 -0400 Subject: [PATCH 046/207] Bug 1840210 - Rename mozac_ic_help to mozac_ic_help_circle_24 --- app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt index 1588f03a8..af617a695 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt @@ -169,7 +169,7 @@ class HomeMenu( val helpItem = BrowserMenuImageText( context.getString(R.string.browser_menu_help), - R.drawable.mozac_ic_help, + R.drawable.mozac_ic_help_circle_24, primaryTextColor, ) { onItemTapped.invoke(Item.Help) From d6d5fb91e18d631aa2cec1df3ba12259d70fbaf5 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 13:15:48 -0400 Subject: [PATCH 047/207] Bug 1840210 - Rename mozac_ic_home to mozac_ic_home_24 --- app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 8396ff1d1..020f496dc 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -96,7 +96,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { val homeAction = BrowserToolbar.Button( imageDrawable = AppCompatResources.getDrawable( context, - R.drawable.mozac_ic_home, + R.drawable.mozac_ic_home_24, )!!, contentDescription = context.getString(R.string.browser_toolbar_home), iconTintColorResource = ThemeManager.resolveAttribute(R.attr.textPrimary, context), From dc171688773682a1eea72dda5f9347a27295f370 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 13:56:42 -0400 Subject: [PATCH 048/207] Bug 1840210 - Rename mozac_ic_close_20 to mozac_ic_cross_20 --- app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt | 2 +- .../org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt | 2 +- app/src/main/res/layout/download_dialog_layout.xml | 2 +- app/src/main/res/layout/no_collections_message.xml | 2 +- app/src/main/res/layout/onboarding_inactive_tabs_cfr.xml | 2 +- app/src/main/res/layout/tab_tray_grid_item.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt b/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt index e94b73947..28bc15d29 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt @@ -145,7 +145,7 @@ private fun MessageCardIconButton( onClick = onCloseButtonClick, ) { Icon( - painter = painterResource(R.drawable.mozac_ic_close_20), + painter = painterResource(R.drawable.mozac_ic_cross_20), contentDescription = stringResource( R.string.content_description_close_button, ), diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt b/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt index 64357dd93..27ad2c1b6 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt @@ -202,7 +202,7 @@ private fun InactiveTabsAutoClosePrompt( modifier = Modifier.size(20.dp), ) { Icon( - painter = painterResource(R.drawable.mozac_ic_close_20), + painter = painterResource(R.drawable.mozac_ic_cross_20), contentDescription = stringResource(R.string.tab_tray_inactive_auto_close_button_content_description), tint = FirefoxTheme.colors.iconPrimary, diff --git a/app/src/main/res/layout/download_dialog_layout.xml b/app/src/main/res/layout/download_dialog_layout.xml index 822df92e9..69d3b5f90 100644 --- a/app/src/main/res/layout/download_dialog_layout.xml +++ b/app/src/main/res/layout/download_dialog_layout.xml @@ -50,7 +50,7 @@ android:contentDescription="@string/mozac_feature_downloads_button_close" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/mozac_ic_close_20" + app:srcCompat="@drawable/mozac_ic_cross_20" app:tint="?attr/textPrimary" /> 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 f606d701c..f75817495 100644 --- a/app/src/main/res/layout/tab_tray_grid_item.xml +++ b/app/src/main/res/layout/tab_tray_grid_item.xml @@ -77,7 +77,7 @@ A FrameLayout here is an efficient way of having a views stack while allowing: app:layout_constraintBottom_toTopOf="@+id/horizonatal_divider" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/mozac_ic_close_20" + app:srcCompat="@drawable/mozac_ic_cross_20" app:tint="@color/fx_mobile_text_color_primary" /> Date: Sat, 24 Jun 2023 14:22:52 -0400 Subject: [PATCH 049/207] Bug 1840210 - Rename mozac_ic_lock to mozac_ic_lock_24 --- app/src/main/res/layout/connection_details_website_info.xml | 2 +- app/src/main/res/layout/quicksettings_website_info.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/connection_details_website_info.xml b/app/src/main/res/layout/connection_details_website_info.xml index 6ee3302ad..0ebfb6386 100644 --- a/app/src/main/res/layout/connection_details_website_info.xml +++ b/app/src/main/res/layout/connection_details_website_info.xml @@ -78,7 +78,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:importantForAccessibility="no" - app:srcCompat="@drawable/mozac_ic_lock"/> + app:srcCompat="@drawable/mozac_ic_lock_24"/> + app:srcCompat="@drawable/mozac_ic_lock_24"/> Date: Sat, 24 Jun 2023 17:40:31 -0400 Subject: [PATCH 050/207] Bug 1840210 - Rename mozac_ic_microphone to mozac_ic_microphone_24 --- app/src/main/res/layout/search_widget_large.xml | 2 +- app/src/main/res/layout/search_widget_medium.xml | 2 +- app/src/main/res/layout/search_widget_small.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/search_widget_large.xml b/app/src/main/res/layout/search_widget_large.xml index bb4a588ea..8c003ab2f 100644 --- a/app/src/main/res/layout/search_widget_large.xml +++ b/app/src/main/res/layout/search_widget_large.xml @@ -41,7 +41,7 @@ android:background="@android:color/transparent" android:contentDescription="@string/search_widget_voice" android:scaleType="centerInside" - android:src="@drawable/mozac_ic_microphone" + android:src="@drawable/mozac_ic_microphone_24" android:tint="@color/fx_mobile_icon_color_primary" tools:ignore="AndroidSrcXmlDetector,UseAppTint" /> diff --git a/app/src/main/res/layout/search_widget_medium.xml b/app/src/main/res/layout/search_widget_medium.xml index e2e805fe0..2a0cab437 100644 --- a/app/src/main/res/layout/search_widget_medium.xml +++ b/app/src/main/res/layout/search_widget_medium.xml @@ -41,7 +41,7 @@ android:background="@android:color/transparent" android:contentDescription="@string/search_widget_voice" android:scaleType="centerInside" - android:src="@drawable/mozac_ic_microphone" + android:src="@drawable/mozac_ic_microphone_24" android:tint="@color/fx_mobile_icon_color_primary" tools:ignore="AndroidSrcXmlDetector,UseAppTint" /> diff --git a/app/src/main/res/layout/search_widget_small.xml b/app/src/main/res/layout/search_widget_small.xml index e8e25ca2d..c4a6df1b6 100644 --- a/app/src/main/res/layout/search_widget_small.xml +++ b/app/src/main/res/layout/search_widget_small.xml @@ -23,7 +23,7 @@ android:contentDescription="@string/search_widget_voice" android:padding="10dp" android:scaleType="centerInside" - android:src="@drawable/mozac_ic_microphone" + android:src="@drawable/mozac_ic_microphone_24" android:tint="@color/fx_mobile_icon_color_primary" tools:ignore="AndroidSrcXmlDetector,UseAppTint" /> From 8237b6474c262a1a562356b55562550fca135f01 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 18:10:40 -0400 Subject: [PATCH 051/207] Bug 1840210 - Rename mozac_ic_new to mozac_ic_plus_24 --- .../mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index 7f51a744e..cab6dfcce 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -83,7 +83,7 @@ class AccountDeviceViewHolder( ) SyncShareOption.AddNewDevice -> Triple( context.getText(R.string.sync_connect_device), - R.drawable.mozac_ic_new, + R.drawable.mozac_ic_plus_24, R.color.default_share_background, ) is SyncShareOption.SendAll -> Triple( From f83e001250713eccd261668902bb342622df81ca Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 19:20:19 -0400 Subject: [PATCH 052/207] Bug 1840210 - Rename mozac_ic_password_hide to mozac_ic_eye_slash_24 --- .../org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt index 2267ee690..df39e0fdb 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt @@ -21,7 +21,7 @@ fun togglePasswordReveal(passwordText: TextView, revealPasswordButton: ImageButt Logins.viewPasswordLogin.record(NoExtras()) passwordText.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD revealPasswordButton.setImageDrawable( - AppCompatResources.getDrawable(context, R.drawable.mozac_ic_password_hide), + AppCompatResources.getDrawable(context, R.drawable.mozac_ic_eye_slash_24), ) revealPasswordButton.contentDescription = context.getString(R.string.saved_login_hide_password) From 297fed67ab25a143a431a10ddb4c0234ad071ed9 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sat, 24 Jun 2023 19:22:44 -0400 Subject: [PATCH 053/207] Bug 1840210 - Rename mozac_ic_password_reveal to mozac_ic_eye_24 --- .../org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt | 2 +- app/src/main/res/layout/fragment_edit_login.xml | 2 +- app/src/main/res/layout/fragment_login_detail.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt index df39e0fdb..8660ac188 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/PasswordRevealHelper.kt @@ -29,7 +29,7 @@ fun togglePasswordReveal(passwordText: TextView, revealPasswordButton: ImageButt passwordText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD revealPasswordButton.setImageDrawable( - AppCompatResources.getDrawable(context, R.drawable.mozac_ic_password_reveal), + AppCompatResources.getDrawable(context, R.drawable.mozac_ic_eye_24), ) revealPasswordButton.contentDescription = context.getString(R.string.saved_login_reveal_password) diff --git a/app/src/main/res/layout/fragment_edit_login.xml b/app/src/main/res/layout/fragment_edit_login.xml index 9dd736eb1..988330420 100644 --- a/app/src/main/res/layout/fragment_edit_login.xml +++ b/app/src/main/res/layout/fragment_edit_login.xml @@ -214,7 +214,7 @@ app:layout_constraintBottom_toBottomOf="@id/inputLayoutPassword" app:layout_constraintEnd_toStartOf="@id/clearPasswordTextButton" app:layout_constraintTop_toTopOf="@id/inputLayoutPassword" - app:srcCompat="@drawable/mozac_ic_password_reveal" /> + app:srcCompat="@drawable/mozac_ic_eye_24" /> Date: Sat, 24 Jun 2023 22:31:49 -0400 Subject: [PATCH 054/207] Bug 1840210 - Rename mozac_ic_quit to mozac_ic_cross_circle_24 --- .../org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 79ed51f52..80c7ed03f 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -354,7 +354,7 @@ open class DefaultToolbarMenu( private val deleteDataOnQuit = BrowserMenuImageText( label = context.getString(R.string.delete_browsing_data_on_quit_action), - imageResource = R.drawable.mozac_ic_quit, + imageResource = R.drawable.mozac_ic_cross_circle_24, iconTintColorResource = primaryTextColor(), ) { onItemTapped.invoke(ToolbarMenu.Item.Quit) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt index af617a695..6ab2af549 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt @@ -91,7 +91,7 @@ class HomeMenu( private val quitItem by lazy { BrowserMenuImageText( context.getString(R.string.delete_browsing_data_on_quit_action), - R.drawable.mozac_ic_quit, + R.drawable.mozac_ic_cross_circle_24, primaryTextColor, ) { onItemTapped.invoke(Item.Quit) From 6a6c73b86ad55d914e546d94ffd01b7327d947b1 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sun, 25 Jun 2023 12:54:01 -0400 Subject: [PATCH 055/207] Bug 1840210 - Rename mozac_ic_refresh to mozac_ic_arrow_clockwise_24 --- app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt | 2 +- .../org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- .../java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 020f496dc..4e183572d 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -306,7 +306,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { refreshAction = BrowserToolbar.TwoStateButton( primaryImage = AppCompatResources.getDrawable( context, - R.drawable.mozac_ic_refresh, + R.drawable.mozac_ic_arrow_clockwise_24, )!!, primaryContentDescription = context.getString(R.string.browser_menu_refresh), primaryImageTintResource = enableTint, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 80c7ed03f..a9936b1a0 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -123,7 +123,7 @@ open class DefaultToolbarMenu( } val refresh = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_refresh, + primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_arrow_clockwise_24, primaryContentDescription = context.getString(R.string.browser_menu_refresh), primaryImageTintResource = primaryTextColor(), isInPrimaryState = { 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 06b042d83..9d6148834 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -89,7 +89,7 @@ class CustomTabToolbarMenu( } val refresh = BrowserMenuItemToolbar.TwoStateButton( - primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_refresh, + primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_arrow_clockwise_24, primaryContentDescription = context.getString(R.string.browser_menu_refresh), primaryImageTintResource = primaryTextColor(), isInPrimaryState = { From 8e5c1b6de835f745fa567a7d808732d24bd870b5 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sun, 25 Jun 2023 18:10:22 -0400 Subject: [PATCH 056/207] Bug 1840210 - Rename mozac_ic_search to mozac_ic_search_24 --- .../org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- .../java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt | 2 +- app/src/main/res/menu/bookmarks_menu.xml | 2 +- app/src/main/res/menu/history_menu.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index a9936b1a0..01397d20c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -226,7 +226,7 @@ open class DefaultToolbarMenu( private val findInPageItem = BrowserMenuImageText( label = context.getString(R.string.browser_menu_find_in_page), - imageResource = R.drawable.mozac_ic_search, + imageResource = R.drawable.mozac_ic_search_24, iconTintColorResource = primaryTextColor(), ) { onItemTapped.invoke(ToolbarMenu.Item.FindInPage) 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 9d6148834..deb96f911 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -144,7 +144,7 @@ class CustomTabToolbarMenu( private val findInPage = BrowserMenuImageText( label = context.getString(R.string.browser_menu_find_in_page), - imageResource = R.drawable.mozac_ic_search, + imageResource = R.drawable.mozac_ic_search_24, iconTintColorResource = primaryTextColor(), ) { onItemTapped.invoke(ToolbarMenu.Item.FindInPage) diff --git a/app/src/main/res/menu/bookmarks_menu.xml b/app/src/main/res/menu/bookmarks_menu.xml index 4714ee3d2..515898b6a 100644 --- a/app/src/main/res/menu/bookmarks_menu.xml +++ b/app/src/main/res/menu/bookmarks_menu.xml @@ -6,7 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/history_menu.xml b/app/src/main/res/menu/history_menu.xml index 8ddcffce2..fb6254505 100644 --- a/app/src/main/res/menu/history_menu.xml +++ b/app/src/main/res/menu/history_menu.xml @@ -6,7 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> From 2c2f961358e9f07e6a54f1bd96360adee96bbf12 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Mon, 26 Jun 2023 12:12:55 -0400 Subject: [PATCH 057/207] Bug 1840210 - Rename mozac_ic_warning to mozac_ic_warning_fill_24 --- .../fenix/share/viewholders/AccountDeviceViewHolder.kt | 4 ++-- .../res/drawable/mozac_ic_warning_with_bottom_padding.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index cab6dfcce..595b2900a 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -73,12 +73,12 @@ class AccountDeviceViewHolder( ) SyncShareOption.Reconnect -> Triple( context.getText(R.string.sync_reconnect), - R.drawable.mozac_ic_warning, + R.drawable.mozac_ic_warning_fill_24, R.color.default_share_background, ) SyncShareOption.Offline -> Triple( context.getText(R.string.sync_offline), - R.drawable.mozac_ic_warning, + R.drawable.mozac_ic_warning_fill_24, R.color.default_share_background, ) SyncShareOption.AddNewDevice -> Triple( diff --git a/app/src/main/res/drawable/mozac_ic_warning_with_bottom_padding.xml b/app/src/main/res/drawable/mozac_ic_warning_with_bottom_padding.xml index d285b129b..5f7d397bc 100644 --- a/app/src/main/res/drawable/mozac_ic_warning_with_bottom_padding.xml +++ b/app/src/main/res/drawable/mozac_ic_warning_with_bottom_padding.xml @@ -4,6 +4,6 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> From b552a13cdea1ceaee21d23a7c4785a47ac2e6f1f Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Mon, 26 Jun 2023 12:34:56 -0400 Subject: [PATCH 058/207] Bug 1840210 - Rename mozac_ic_settings to mozac_ic_settings_24 --- .../org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt | 2 +- .../fenix/search/awesomebar/ShortcutsSuggestionProvider.kt | 2 +- .../java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt | 2 +- app/src/main/res/layout/component_tracking_protection_panel.xml | 2 +- app/src/main/res/layout/fragment_installed_add_on_details.xml | 2 +- .../fenix/search/awesomebar/ShortcutsSuggestionProviderTest.kt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 01397d20c..3ed4a7261 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -314,7 +314,7 @@ open class DefaultToolbarMenu( @VisibleForTesting internal val settingsItem = BrowserMenuHighlightableItem( label = context.getString(R.string.browser_menu_settings), - startImageResource = R.drawable.mozac_ic_settings, + startImageResource = R.drawable.mozac_ic_settings_24, iconTintColorResource = if (hasAccountProblem) { ThemeManager.resolveAttribute(R.attr.syncDisconnected, context) } else { diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt index 6ab2af549..991b2929e 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt @@ -187,7 +187,7 @@ class HomeMenu( val nimbusValidation = FxNimbus.features.nimbusValidation.value() val settingsItem = BrowserMenuImageText( nimbusValidation.settingsTitle, - R.drawable.mozac_ic_settings, + R.drawable.mozac_ic_settings_24, primaryTextColor, ) { onItemTapped.invoke(Item.Settings) diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/ShortcutsSuggestionProvider.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/ShortcutsSuggestionProvider.kt index 230c1c960..36b72aab7 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/ShortcutsSuggestionProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/ShortcutsSuggestionProvider.kt @@ -29,7 +29,7 @@ class ShortcutsSuggestionProvider( override val id: String = UUID.randomUUID().toString() private val settingsIcon by lazy { - AppCompatResources.getDrawable(context, R.drawable.mozac_ic_settings)?.apply { + AppCompatResources.getDrawable(context, R.drawable.mozac_ic_settings_24)?.apply { colorFilter = createBlendModeColorFilterCompat( context.getColorFromAttr(R.attr.textPrimary), SRC_IN, diff --git a/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt b/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt index 34157a54b..2f29c73a7 100644 --- a/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt @@ -69,7 +69,7 @@ class SearchSelectorMenu( start = DrawableMenuIcon( drawable = AppCompatResources.getDrawable( context, - R.drawable.mozac_ic_settings, + R.drawable.mozac_ic_settings_24, ), tint = context.getColorFromAttr(R.attr.textPrimary), ), diff --git a/app/src/main/res/layout/component_tracking_protection_panel.xml b/app/src/main/res/layout/component_tracking_protection_panel.xml index 5d8364c47..9c95a1776 100644 --- a/app/src/main/res/layout/component_tracking_protection_panel.xml +++ b/app/src/main/res/layout/component_tracking_protection_panel.xml @@ -190,7 +190,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/tracking_protection_item_height" android:text="@string/etp_settings" - app:drawableStartCompat="@drawable/mozac_ic_settings" + app:drawableStartCompat="@drawable/mozac_ic_settings_24" app:drawableTint="?attr/textPrimary" app:layout_constraintTop_toBottomOf="@id/line_divider" /> diff --git a/app/src/main/res/layout/fragment_installed_add_on_details.xml b/app/src/main/res/layout/fragment_installed_add_on_details.xml index 5a252b600..b7b3b865c 100644 --- a/app/src/main/res/layout/fragment_installed_add_on_details.xml +++ b/app/src/main/res/layout/fragment_installed_add_on_details.xml @@ -63,7 +63,7 @@ android:text="@string/mozac_feature_addons_settings" android:textSize="16sp" android:textColor="?attr/textPrimary" - app:drawableStartCompat="@drawable/mozac_ic_settings" + app:drawableStartCompat="@drawable/mozac_ic_settings_24" app:drawableTint="?attr/textPrimary" /> Date: Tue, 11 Jul 2023 00:04:04 +0000 Subject: [PATCH 059/207] Import translations from android-l10n --- app/src/main/res/values-cy/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 21 +- app/src/main/res/values-fur/strings.xml | 25 +-- app/src/main/res/values-pa-rIN/strings.xml | 25 +-- app/src/main/res/values-szl/strings.xml | 201 +++++++++++++---- app/src/main/res/values-trs/strings.xml | 242 ++++++++++++++++++++- 6 files changed, 425 insertions(+), 91 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 9c7a925fd..715c235da 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -545,7 +545,7 @@ Rheolwr llwytho i lawr allanol - Galluogi logiau Gecko + Galluogi cofnodion Gecko Yn gadael y rhaglen er mwyn gosod y newidiadau… diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 58b30d06d..243296e72 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -433,18 +433,12 @@ Enviar petición - Reducción de avisos de cookies - ¿Solicitar ayuda para este sitio? - La solicitud de soporte ha sido enviada. - Solicitud enviada Activada para este sitio - La solicitud de soporte ha sido enviada - Solicitud de ayuda enviada Sitio actualmente no compatible @@ -452,8 +446,6 @@ ¿Activar la reducción de aviso de cookies para %1$s? ¿Desactivar la reducción de aviso de cookies para %1$s? - - Este sitio actualmente no es compatible con la reducción de avisos de cookies. ¿Quieres pedirle a nuestro equipo que revise este sitio web y añada soporte en el futuro? %1$s no puede rechazar automáticamente los avisos de cookies en este sitio. Puede enviar una solicitud para admitir este sitio en el futuro. @@ -559,6 +551,11 @@ Nunca Administrador de descargas externo + + Habilitar registros de Gecko + + Saliendo de la aplicación para aplicar los cambios… + Complementos @@ -1534,12 +1531,8 @@ Ajustes de protección Protección contra rastreo mejorada - - Navega sin que te sigan Ahora con protección Total Cookie Protection, nuestra barrera más poderosa hasta hoy contra rastreadores de sitios cruzados. - - Protege tus datos. %s te protege de muchos de los rastreadores más comunes que siguen lo que haces en línea. %s te protege de muchos de los rastreadores más comunes que vigilan lo que haces en línea. @@ -1547,16 +1540,12 @@ Estándar (predeterminado) - Equilibrado para privacidad y rendimiento. Las páginas se cargarán normalmente. - Las páginas se cargarán como siempre, pero bloquearán menos rastreadores. Qué es lo que está bloqueado por la protección estándar contra el rastreo Estricto - Bloquea más rastreadores para que las páginas se carguen más rápido, pero pueden fallar algunas funcionalidades de la página. - Protección contra rastreo mejorada y mayor rendimiento, pero puede que algunos sitios no funcionen correctamente. Qué es lo que está bloqueado por la protección estricta contra el rastreo diff --git a/app/src/main/res/values-fur/strings.xml b/app/src/main/res/values-fur/strings.xml index a9146f6b0..c55a8e2b8 100644 --- a/app/src/main/res/values-fur/strings.xml +++ b/app/src/main/res/values-fur/strings.xml @@ -422,18 +422,12 @@ Invie richieste - Riduzion strissons pai cookies - Domandâ il supuart par chest sît? - Richieste di supuart pal sît inviade. - Richieste inviade Ative par chest sît - Richieste par supuartâ il sît inviade - Richieste di supuart inviade Sît pal moment no supuartât @@ -441,8 +435,6 @@ Ativâ la riduzion strissons dai cookies par %1$s? Disativâ la riduzion strissons dai cookies par %1$s? - - Chest sît pal moment nol è supuartât de riduzion dai strissons pai cookies. Desideristu che il nestri grup al valuti chest sît web e che in futûr al zonti il supuart? %1$s nol pues refudâ in automatic lis richiestis dai cookies su chest sît. Tu puedis inviâ une richieste par supuartâ un doman chest sît. @@ -552,6 +544,11 @@ Mai Gjestôr esterni dai discjariaments + + Ative i regjistris Gecko + + Daûr a sierâ la aplicazion par aplicâ lis modifichis… + Components adizionâi @@ -1212,6 +1209,10 @@ Salve come PDF Impussibil gjenerâ il PDF + + Impussibil stampâ + + Stampe Invie a dispositîf @@ -1504,13 +1505,9 @@ Impostazions di protezion Protezion miorade da lis spiis - - Navighe cence vê nissun che ti stâ daûr Cumò cu la Protezion Totâl dai Cookies, fin cumò la nestre bariere plui potente cuintri lis spiis inter-sît. - - Ten i tiei dâts par to cont. %s ti protêç di tantis des plui comuns spiis che ti stan daûr a ce che tu fasis in rêt. %s ti protêç des tantis e plui comunis spiis che a cirin di stâti daûr a ce che tu fasis in rêt. @@ -1518,16 +1515,12 @@ Standard (predefinide) - Belançade tra riservatece e prestazions. Lis pagjinis a vignaran cjamadis normalmentri. - Lis pagjinis a vignaran cjariadis in mût normâl, ma a vignaran blocadis mancul spiis. Elements blocâts de protezion standard da lis spiis Restritive - Al bloche plui spiis, duncje lis pagjinis si cjariaran plui sveltis, ma al è pussibil che cualchi funzionalitât te pagjine no funzioni. - Protezion da lis spiis plui fuarte e prestazions plui sveltis, ma al è pussibil che cualchi sît nol funzioni ben. Elements blocâts de protezion restritive da lis spiis diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 328d3a90d..5bdbb7e33 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -434,18 +434,12 @@ ਬੇਨਤੀ ਭੇਜੀ - ਕੂਕੀ ਬੈਨਰ ਘਟਾਉਣਾ - ਇਸ ਸਾਈਟ ਲਈ ਸਹਾਇਤਾ ਦੀ ਬੇਨਤੀ ਕਰਨੀ ਹੈ? - ਸਹਿਯੋਗ ਸਾਈਟ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਗਈ ਹੈ। - ਬੇਨਤੀ ਭੇਜੀ ਗਈ ਇਸ ਸਾਈਟ ਲਈ ਚਾਲੂ - - ਸਾਈਟ ਲਈ ਸਹਿਯੋਗ ਦੀ ਬੇਨਤੀ ਭੇਜੀ ਗਈ ਹੈ ਸਹਾਇਤਾ ਬੇਨਤੀ ਭੇਜੀ @@ -455,8 +449,6 @@ %1$s ਲਈ ਕੁਕੀ ਬੈਨਰ ਘਟਾਉਣੇ ਬੰਦ ਕਰਨੇ ਹਨ? - - ਇਹ ਸਾਈਟ ਇਸ ਵੇਲੇ ਕੂਕੀ ਬੈਨਰ ਘਟਾਉਣ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। ਕੀ ਤੁਸੀਂ ਸਾਡੀ ਟੀਮ ਨੂੰ ਇਸ ਦੀ ਪੜਤਾਲ ਕਰਨ ਅਤੇ ਭਵਿੱਖ ਵਿੱਚ ਸਹਿਯੋਗ ਲਈ ਜੋੜਨਾ ਚਾਹੁੰਦੇ ਹੋ? %1$s ਇਸ ਸਾਈਟ ਲਈ ਆਪਣੇ-ਆਪ ਕੂਕੀ ਬੇਨਤੀਆਂ ਨੂੰ ਰੱਦ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ। ਤੁਸੀਂ ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਸਾਈਟ ਵਾਸਤੇ ਸਹਾਇਤਾ ਲਈ ਬੇਨਤੀ ਕਰ ਸਕਦੇ ਹੋ। @@ -562,6 +554,11 @@ ਕਦੇ ਨਹੀਂ ਬਾਹਰੀ ਡਾਊਨਲੋਡ ਮੈਨੇਜਰ + + Gecko ਲਾਗ ਸਮਰੱਥ ਕਰੋ + + ਤਬਦੀਲੀਆਂ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ… + ਐਡ-ਆਨ @@ -1227,6 +1224,10 @@ PDF ਵਜੋਂ ਸੰਭਾਲੋ PDF ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ + + ਛਾਪਣ ਲਈ ਅਸਮਰੱਥ ਹੈ + + ਪਰਿੰਟ ਕਰੋ ਡਿਵਾਈਸ ‘ਤੇ ਭੇਜੋ @@ -1521,12 +1522,8 @@ ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ ਟਰੈਕ ਹੋਣ ਤੋਂ ਵਾਧਾ ਕੀਤੀ ਸੁਰੱਖਿਆ - - ਬਿਨਾਂ ਪਿੱਛੇ ਕੀਤੇ ਜਾਣ ਤੋਂ ਬਰਾਊਜ਼ ਕਰੋ ਨਵੀਂ ਆਈ ਕੁੱਲ ਕੂਕੀ ਸੁਰੱਖਿਆ, ਅੰਤਰ-ਸਾਈਟ ਟਰੈਕਰਾਂ ਖ਼ਿਲਾਫ਼ ਸਾਡੀ ਸਭ ਤੋਂ ਮਜ਼ਬੂਤ ਢਾਲ ਹੈ। - - ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਆਪਣੇ ਕੋਲ ਰੱਖੋ। %s ਤੁਹਾਨੂੰ ਬਹੁਤੇ ਆਮ ਟਰੈਕਰਾਂ ਤੋਂ ਸੁਰ਼ਖਿਅਤ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ ਆਨਲਾਈਨ ਤੁਹਾਡਾ ਪਿੱਛਾ ਕਰਦੇ ਹਨ। %s ਤੁਹਾਨੂੰ ਬਹੁਤੇ ਆਮ ਟਰੈਕਰਾਂ ਤੋਂ ਸੁਰੱਖਿਅਤ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ ਆਨਲਾਈਨ ਤੁਹਾਡਾ ਪਿੱਛਾ ਕਰਦੇ ਹਨ। @@ -1534,16 +1531,12 @@ ਸਟੈਂਡਰਡ (ਮੂਲ) - ਪਰਦੇਦਾਰੀ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿਚਾਲੇ ਸੰਤੁਲਨ ਹੈ। ਸਫ਼ੇ ਆਮ ਨਾਲੋਂ ਤੇਜ਼ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ। - ਸਫ਼ਿਆਂ ਨੂੰ ਆਮ ਵਾਂਗ ਲੋਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਈ ਜਾਂਦੀ ਹੈ। ਮਿਆਰੀ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਰਾਹੀਂ ਕਿਸ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਈ ਜਾਂਦੀ ਹੈ ਸਖ਼ਤ - ਹੋਰ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਉਂਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਸਫ਼ੇ ਤੇਜ਼ੀ ਨਾਲ ਲੋਡ ਹੁੰਦੇ ਹਨ, ਪਰ ਕੁਝ ਸਫ਼ੇ ਸ਼ਾਇਦ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰਨ। - ਮਜ਼ਬੂਤ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਅਤੇ ਵੱਧ ਤੇਜ਼ ਕਾਰਗੁਜ਼ਜਾਰੀ, ਪਰ ਕੁਝ ਸਾਈਟਾਂ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ। ਸਖ਼ਤ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਰਾਹੀਂ ਕਿਸ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਈ ਜਾਂਦੀ ਹੈ diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml index 0ae7ce263..3cf04ec2d 100644 --- a/app/src/main/res/values-szl/strings.xml +++ b/app/src/main/res/values-szl/strings.xml @@ -12,10 +12,18 @@ Załōncz prywatne przeglōndanie Wyłōncz prywatne przeglōndanie - + Szukej abo wkludź adresa + + Szukej w internecie + + Szukej w historyji + + Szukej w zokłodkach + + Szukej po kartach Wkludź szukane słowa @@ -59,13 +67,12 @@ Czynste mity ô prywatnym przeglōndaniu - - - Przidej skrōt do ôtwiyranio prywatnych kart z dōmowego ekranu. - - Przidej skrōt - + + + Ôdewrzij nastympno prywatno karta jednym tykniyńciym. + + Przidej do dōmowego ekranu Niy, dziynkuja @@ -77,11 +84,14 @@ Ôdkoż - - Zawrzij + + + Nasza nojsiylniyjszo funkcyjo ôchrōny prywatności izoluje elymynty, co śledzōm miyndzy strōnami. + + Przewiydz sie wiyncyj ô totalnyj ôchrōnie przed cookies - Trza dostympu do kamery. Idź doo sztalōnkōw Androidaa, tyknij "dozwolyństwa" i tyknij "zgoda". + Trza dostympu do kamery. Idź do sztalōnkōw Androida, tyknij "dozwolyństwa" i tyknij "zgoda". Idź do sztalōnkōw @@ -117,6 +127,9 @@ Nowo prywatno karta + + Skrōt do haseł + Idź nazod @@ -128,6 +141,8 @@ Ôbocz wszyske synchrōnizowane karty Synchrōnizowano maszina + + Skasuj Skasuj @@ -153,6 +168,8 @@ Sztopnij Rozszyrzynia + + Infōrmacyje ô kōncie Niy ma sam żodnych rozszyrzyń @@ -233,7 +250,7 @@ Pokazować dorady szukanio we prywatnych ôknach? %s bydzie przekazowoł bazowyj wyszukowarce wszysko, co wkludzosz we posku z adresōm. - + Szukej na %s Szukej zaroz na posku z adresōm @@ -241,6 +258,86 @@ Sztalōnki szukanio + + Tyn roz poszukej we: + + Wyszukowarka %s + + + + Poznej swoja spersōnalizowano dōmowo strōna. Niydowne karty, zokłodki i wyniki wyszukowanio bydōm sie sam pokazować. + + Witej we prywatniyjszym internecie + + Wiyncyj farbōw. Lepszo prywatnoś. Te same stowianie ludzi nad profitym. + + + Przełōnczanie ekranōw jeszcze żodyn roz niy było take leke + + Na swojij dōmowyj strōnie rōb dalij na kartach, co mosz ôtwarte na inkszych maszinach. + + Zaczynōmy + + Wloguj sie + + Przeskocz + + Twoje karty sie synchrōnizujōm! Rōb dalij na kartach, co mosz ôtwarte na inkszyj maszinie. + + Zawrzij + + + + Powiadōmiynia pōmogajōm ci lepij używać aplikacyjo %s + + Synchrōnizuj karty miyndzy maszinami, regyruj pobraniami, zbiyrej dorady ô nojlepszym używaniu ôchrōny prywatności z aplikacyjōm %s, i jeszcze wiyncyj. + + Dalij + + Niy teroz + + + + Dej rokić aplikacyji %s za twoja nojlepszo przeglōndarka + + Dej robić aplikacyji Firefox za twoja nojlepszo przeglōndarka + + ô prywatności + + Nastow za bazowo przeglōndarka + + Niy teroz + + Skokej miyndzy telefōnym a laptopym a nazod + + Ôtwiyrej karty i hasła z inkszych maszin, coby robić dalij z tego samego miejsca. + + Wloguj sie + + Niy teroz + + Powiadōmiynia pōmogajōm ci lepij używać aplikacyjo %s + + + Powiadōmiynia pōmogajōm ci lepij używać aplikacyjo Firefox + + Posyłej karty miyndzy maszinami, regyruj pobraniami i zbiyrej dorady, jak nojlepij używać aplikacyjo %s. + + Posyłej karty miyndzy maszinami, regyruj pobraniami i zbiyrej dorady, jak nojlepij używać aplikacyjo Firefox. + + Załōncz powiadōmiynia + + Niy teroz + Ôdewrzij w nowyj karcie aplikacyje %1$s @@ -258,6 +355,14 @@ Ôgōlne Ô aplikacyji + + Ôbier jedna + + Regyruj skrōtami wyszukowanio + + Zmiyniej wyszukowarki pokozane w menu wyszukowanio + + Wyszukowarki pokozane w menu wyszukowanio Bazowo wyszukowarka @@ -292,12 +397,53 @@ Tryb "Ino HTTPS" + + Redukcyjo bannera cookie + + Zredukuj banner cookie + + Wyłōnczōne + + Załōnczōne + + %1$s autōmatycznie prōbuje ôdkozać prośby ô przituplowanie cookies na bannerach cookie. + + Wyłōnczōne do tyj strōny + + Pociep + + Zażōndej sparcio + + Poślij prośba + + Zarzōndać sparcio do tyj strōny? + + Prośba posłano + + Załōnczōne do tyj strōny + + Prośba ô sparcie je posłano + + Strōna niy ma teroz ôbsugowano + + Załōnczyć redukcyjo banneru cookie do %1$s? + + Wyłōnczyć redukcyjo banneru cookie do %1$s? + + Niy teroz + + Bydziesz widzieć mynij prōśb ô przituplowanie cookies + + Przizwōl + Autōmatycznie prōbuje łōnczyć sie ze strōnami z protokołym kodowanio HTTPS, coby zwiynkszyć bezpieczyństwo. - - Załōnczōne - + Wyłōnczōne + + Załōnczōne na wszyskich kartach + + Załōnczōne na wszyskich prywatnych kartach Przewiydz sie wiyncyj @@ -374,6 +520,7 @@ Zewnyntrzny menedżer pobiyranio + Rozszyrzynia @@ -403,8 +550,6 @@ Niydowno nawiedzōne - - Pocket Tapety @@ -424,7 +569,6 @@ Rozszyrzynie je już zainstalowane - Synchrōnizuj teroz @@ -557,13 +701,6 @@ Zawrzij - - Strōny: %d - - Strōny: %d - Niydowno zawarte karty @@ -878,8 +1015,6 @@ Zaszperowane ôd Androida Wyjōntki - - Załōnczōne Wyłōnczōne @@ -1003,12 +1138,6 @@ Zawrzij prywatne karty Marketing - - %1$s je gibki i prywatny - - Nastow %1$s za bazowo przeglōndarka @@ -1186,22 +1315,14 @@ Sztalōnki ôchrōny Polepszōno ôchrōna ôd śledzynio - - Przeglōndej tak, coby żodyn na ciebie niy filowoł - - Trzimej swoje dane ino do sia. %s brōni cie ôd mocki śledzōncych elemyntōw, co filujōm na ciebie, jak żeś je w internecie. Przewiydz sie wiyncyj Standardowo (bazowe) - - Zbalansowane podug prywatności i sprowności. Strōny bydōm sie normalnie ladować. Co je szperowane przi standardowyj ôchrōnie ôd śledzynio Surowo - - Szperuje wiyncyj śledzōncych elymyntōw, tōż strōny gibcyj sie ladujō, ale niykere jejich fōnkcyje mogōm niy fungować. Co je szperowane przi surowyj ôchrōnie ôd śledzynio diff --git a/app/src/main/res/values-trs/strings.xml b/app/src/main/res/values-trs/strings.xml index 0f8c91dfc..22ace2bb7 100644 --- a/app/src/main/res/values-trs/strings.xml +++ b/app/src/main/res/values-trs/strings.xml @@ -1533,11 +1533,15 @@ Sa huā chre\' (dàj huaj \'naj) + + Nāyi’nï̄n nej pâjina dàj rû’ nayi’nï̀nj nīñanj, sanī si narán nìko man riña nej sa naga’nāj a. Ahuin si riñā narán sa dugumî sò\' \'na\' niñā guendâ nej sa naga\'nāj a Sa nùkuaj doj + + Dugumîn doj sò’ nī hìo doj ‘hiaj sunj, sanī ga’hue sisī sī gi’hiaj sun hue’ê da’āj sitio. Ahuin si riñā narán sa nùkuaj doj dugumî sò\' \'na\' niñā guendâ nej sa naga\'nāj a @@ -1557,6 +1561,8 @@ Daran\' nej kokî ânej e (ga\'ue gī\'iaj sun a\'nan\' web gī\'ia) Daran\' nej kokî (ga\'ue dūre\'ej dā\'āj sîtio) + + Gi’hiaj anêj nej kôki riña nej sitio Sa nīkāj sa naga\'nāj a @@ -1582,8 +1588,12 @@ Nej kokî naga\'nāj riña nej dūguì\' nej sîtio + + Si kokî nej sitio nadunâ dugui’i Nārán riña nej kokî arâj sun nej rêd duyinga\' sa ane\'e nī nej dukuâ sun nadigi\'ñûn sa anïn ruhuâ guìi da\' si naga\'nāj nìko man nej sa \'iát nga aché nunt. + + Sa gū’nàj Total Cookie Protection narán man riña nej kokî nīkāj sa naga’nāj a, dàj rû’ nej nuguan’ duyinga’ nej si da’ gūdu’huē nej si rasūun, ô nī siganikò’ nej man sò’ ngà’. Nej kriptominêro @@ -1613,9 +1623,20 @@ The first parameter is the app name --> %s Dukuâ ñanj OSS + + Nej sa naga’nāj nadunâ mān’an + + Nādure’ nej kokî ni’înt natûj mān’an riña nej sitio. + + Nayi’nï̀nj akuan’ riña nej sa naga’nāj sò’ ‘na’ riña pajinâ nan dadin’ natsí rè’ man ni’hiāj rè’ *. Gāhuin chrūn doj + + Nahuin sà’ doj ikonô arâj sun rè’ doj da’ narán riña sa naga’nāj sò’ + Sa rugûñu\'ūnj un @@ -1657,6 +1678,9 @@ Si yūgui aksêso dīrêkto + + Gā\'hue nāchrūnt sitiô nan riña pajinâ ayi\'ìt riña aga\' sikà\' rà nīkājt da\' ga\'hue hìo gātūt riñanj dàj rû\' \'hiaj \'ngō aplikāsiûn. + Nej riña gayi\'ìt sēsiûn nī nej da\'nga\' huìi @@ -1666,9 +1690,23 @@ Nitāj āmān nā\'nïnj sà\'t + + Dūsìj mān’an %1$s + + Nāchra nāhuij man nī nā’nï̀nj sà’ si yūgui sa arâj suun ngà nej da’nga’ huìi riña nej sitio ngà aràj sunt %1$s. + + Nāchra mān’an man riña a’ngô nej aplikasiûn + + + Nāchra nāhuij nej si yūgui sa arâj suun ngà nej da’nga’ huìi riña na’ngô nej aplikasiûn riña si āgâ’t nan. + + Nutà’ sa ayi’ìt sesión + Nāgi\'iaj nūguàn\'àn nej riña ayì\'ìt sēsiûn + + Nāgi’hiaj nūguan’àn nej riña ayi’ìt sēsiûn riña nej si āgâ’t Sa gayi\'ìt sesiûn ngà naginu sà\' @@ -1681,6 +1719,8 @@ Hiūj nan gūruguì\' nej riña gayì\'ìt sēsiûn ngà nej da\'nga\' huì na\'nïn sà\'t. Sê sī nānun sà\' nej riña gayi\'ît sēsiûn nī nej da\'nga\' huìi guiendâ nej sitiô nan. + + Nādure’ daran’ nej sa nitāj si ni’ñānj an Nānà\'uì\' nej riña gayi\'ît sēsiûn @@ -1750,6 +1790,46 @@ Nā’nïn sà’ nī nachra mā’an riña tārjêta + + Ngà huā chì’ nej nuguan’an da’ gārasunt + + Nāgi’hiaj nūguan’àn nej si tarjetât riña nej si āgâ’t + + Nej tarjeta ngà nahuin nūguan’àan + + Nūtà’ a’ngô tarjeta san’ānj an + + Gi’nï̄nj ra’a nej tarjeta ngà nūn sà’a + + Nūtà’ a’ngô dīreksiûn + + Ni’hiāj dàj gā nej dīreksiûn + + Nā’nïn sà’ nī nachra mā’an riña nej dīreksiûn + + + Gāchrūn nuguan’ achin dàj rû’ nej número, kōrrêo nī dàj gū’nàj riña gùchij + + + Nūtà’ a’ngô tarjeta + + Nādunā sa ‘na’ riña tarjeta + + Da’nga’ nīkāj tarjeta + + Diû gīrè’ man + + Diû gīrè’ man Ahuii + + Diû gīrè\’ man Hio\'o + + Si yūgui tarjeta + + Nādure’ tarjeta + + Nādure’ tarjeta + + Huā yītïnj ruhuât nādure\'t tarjeta nan anj. Nādūre\' @@ -1758,8 +1838,36 @@ Nā\'nïnj sà\' Dūyichin\' + + Nej tarjeta ngà nū sà’a + + Gī\'hiaj \'ngō sunūj u nī gāchrūn da\'nga’ nīkāj si tarjetât + + Nāchra hiūj nan gī\'hiát \‘ngō sunūj u + + Gā\'nïn riñanj da\' gā\'hue gini\'hiājt riña nū sà\' nej si tarjetât + + Nāgi’hiaj ran yi’î nej si tarjetât + + Nāchrūn \'ngō da\'nga\' huì duyâ ra\'ât riña si āgâ\'t, \'ngō PIN asi \'ngō da\'nga\' huì achrûnt da\' si ga\'hue gīni\'hiāj nej duguî\' riñā rûgûñu\'ūnjt si āgâ\'t nej riña màn si tarjetât. + + À\' \'ngō nāgi\'iát riñanj Ne\' rūkù doj + + Nā\'nïn riña si āgâ\'t + + Nā’nï̄n riñanj da’ gā’hue gārasunt nej nuguan’ màn riña si tarjetât + + Nūtà’ a’ngô dīreksiûn + + Nādunā sa ‘na’ riña dīreksiûn + + Ni’hiāj dàj gā nej dīreksiûn + + Si yūgui + + A’ngô si yūgui Sa nata\' ràt @@ -1772,17 +1880,34 @@ Proviciâ Zip + + País nêt + + Si telefonôt + + Korrêo Nā\'nïnj sà\' Dūyichin\' + + Nādure’ dīreksiûn + + Huā yītïnj ruhuât nādure\'t dīreksiûn nan anj. Nādūre\' Dūyichin\' + + Nā’nï̀nj sà’ dīreksiûn + + Nādure’ dīreksiûn + Nūtà\' a\'ngô sa riñā nānà\'uì\'t + + Nūtà’ a’ngô sa rūgûñu’ūnj nānà’huì’t Nāgi\'iaj riña sa riñā nānà\'uì\'t @@ -1797,17 +1922,28 @@ A\'ngoj + + Si yugui Si yugui + + Si yugui sa nana\'ui\' + + URL nīkāj sa nana’huî’ Kadenâ nana\'ui\' huū gārasunt + + URL gārasunt guendâ nānà’huì’t Nādūnā sa nana\'uî\'t ngà “%s”. dàj rû\':\nhttps://www.google.com/search?q=%s Sa huā riña sa nana\'uî\'t nagi\'iaj man\'ânt + + Nā\'nïnj sà\' + Gāchrūn si yūgui riña sā nana\'uî\'t @@ -1834,6 +1970,14 @@ %1$s]]> + + Huā seguridâ nikāj koneksiôn + + Nitāj seguridâ nikāj koneksiôn + + Nādure’ nej kôki nī nej si datô sîtio + + %sanj]]> Huin hīa ruhuât nādurê\' nej sa achín nì\'iaj nīkāj daran\' nej sitio aj. @@ -1844,6 +1988,10 @@ Nitāj à\'ngō nej sîtio gūnàj Huā yītïnj ruhuât nādure\'t markadô nan anj. + + Nā’nïnj man riña āksêso dīrêkto + + Nādure’ āsìj riña āksêso dīrêkto Ngà ganatsij sa gu\'nàj: %1$s @@ -1889,6 +2037,11 @@ https://www.example.com + + Da\’hui dīreksiûn nan gānika "https:/" asi "http://" + + Nāchrūn ‘ngō si yūgui host huā hue’ê + Gātū ngà a\'ngô aga\'a. @@ -1906,10 +2059,23 @@ Nitāj si huā ni\’nïnj riña nej rakïj ñanj + + Nāgi’hiaj yāchìj nej yi’nïn’ rakïj ñanj huā nūguan’àan + + + Gāchrī huì nej yi’nïn’ rakïj ñanj huā nūguan’àan + + + + Ngà gachra riña āksêso dīrêkto + + Da’ nūtà’t a’ngô atâjo, da’huît nādurê’t ‘ngòj. Gūru’man ra’a riña sitio nī gūru’man ra’a riña tāj nādurê’t. Ga\'ue, ngà garâj da\'nga\' ruhuâj - + + Nānà\'uì\' a\'ngô hiūj u + Si yūgui Si yūgui aksêso dīrêkto @@ -1921,13 +2087,85 @@ Nādūnō’ sa huāa + + Nej duguî\' rugûñu\'unj ni sa tna\'huej rayi\'ît + + Sa rugûñu’ūnj rukû nan + + + + Nej rakïj ñanj nitāj si ‘hiaj suun + + Nārán riña nej rakïj ñanj nitāj si ‘hiaj suun + + Yānïn nej rakïj ñanj nitāj si ‘hiaj suun + + Gāchrī huì nej rakïj ñanj nitāj si ‘hiaj suun + + + + Ngà gachîn ‘ngō ahuii nī nārán mā’an riñanj anj. + + Nārán Firefox riña nej rakïj ñanj nu ni’hiājt gachîn ‘ngō ahuii. + + NĀCHRŪN DA’ NĀRÁN MĀN’AN MAN + + Ngà huā sa nārán mān’an man + + + + Si nūguan’ Firefox + + Si’hiaj Google sa nana’hui’i + + Nānà\'uì\' ngà %s + + + Nāgi’hiaj nej enlasê sitiô web, nej korrêo nī nej nuguan’ huāa da’ nāyi’nïn man’an nej man riña Firefox. + Nādure\' + + Gā’huì’ klik da’ gīni’înt doj sa huāa + + + Gāchē nun gan’ānj nāhuīt + Nārán + + + Nuguan ‘hiaj nadigi’ñûn’ ‘ngō sa huāa + + Nej nuguan’ nīkāj da’ têma + + Gīni’in doj sa huāa + + Rugûñu\'ūnj sa gu\'nàj %s. + + Dugui’ yi’nïn’ Firefox huin. %s Gāhuin chrūn doj - + + Sa rugûñu’ūnj rukû nan + + + Nāchrūn telemetrîa da’ gā’hue gā’nïnjt nej dato. + + Gūij riña gā\'ue nāgi\'hiô\' + + + + nāgi’hiaj lij + + nāgi’hiaj yāchìj + + nā’nïn riña enlâse da’ gīni’înt doj dàj hua rayi’î yi’nïn’ nan + + gāhiā riña ñanj dan + + nā’nïn riña enlâse da’ gīni’înt doj + From 7ae5f443803bd6c5754c0b1b8bc12954df90ea05 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 11 Jul 2023 10:12:15 +0300 Subject: [PATCH 060/207] Bug 1807268 - Disable failing toggleSearchHistoryTest UI test --- .../androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 3e811df44..5044ad3a9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -117,6 +117,7 @@ class SettingsSearchTest { } } + @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test fun toggleSearchHistoryTest() { val page1 = getGenericAsset(mockWebServer, 1) From b477c4524535f8af3e427633c823ff3fec3ede7b Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Fri, 7 Jul 2023 11:05:41 +0200 Subject: [PATCH 061/207] Bug 1840097 - Add StarRating UI component --- .../mozilla/fenix/shopping/ui/StarRating.kt | 121 ++++++++++++++++++ app/src/main/res/drawable/ic_star_half.xml | 17 +++ app/src/main/res/values/static_strings.xml | 1 + .../fenix/shopping/ui/StarRatingKtTest.kt | 31 +++++ 4 files changed, 170 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ui/StarRating.kt create mode 100644 app/src/main/res/drawable/ic_star_half.xml create mode 100644 app/src/test/java/org/mozilla/fenix/shopping/ui/StarRatingKtTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/StarRating.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/StarRating.kt new file mode 100644 index 000000000..8543dd842 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/StarRating.kt @@ -0,0 +1,121 @@ +/* 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.shopping.ui + +import androidx.annotation.VisibleForTesting +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import kotlin.math.max +import kotlin.math.min +import kotlin.math.round +import kotlin.math.roundToInt + +private const val NUM_STARS = 5 +private const val MAX_RATING = 5f +private const val MIN_RATING = 0f + +/** + * UI for displaying star rating bar with maximum 5 stars. + * + * @param value The rating to be displayed as filled stars. + * @param modifier The modifier to be applied to the composable. + */ +@Composable +fun StarRating( + value: Float, + modifier: Modifier = Modifier, +) { + val rating: Float = remember(value) { + max(min(MAX_RATING, value), MIN_RATING).roundToNearestHalf() + } + val contentDescription = contentDescription(rating = value) + + Row( + modifier = modifier.semantics { + this.contentDescription = contentDescription + }, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + repeat(NUM_STARS) { + val starId = if (it < rating && it + 1 > rating) { + R.drawable.ic_star_half + } else if (it < rating) { + R.drawable.ic_bookmark_filled + } else { + R.drawable.ic_bookmark_outline + } + + Image( + painter = painterResource(id = starId), + colorFilter = ColorFilter.tint(FirefoxTheme.colors.iconPrimary), + contentDescription = null, + ) + } + } +} + +@Composable +private fun contentDescription(rating: Float): String { + val formattedRating: Number = remember(rating) { rating.removeDecimalZero() } + + return stringResource( + R.string.review_quality_check_star_rating_content_description, + formattedRating, + ) +} + +/** + * Removes decimal zero if present and returns an Int, otherwise returns the same float as Number. + * e.g.4.0 becomes 4, 3.4 stays 3.4. + */ +@VisibleForTesting +fun Float.removeDecimalZero(): Number = + if (this % 1 == 0f) { + roundToInt() + } else { + this + } + +/** + * Rounds the float to the nearest half instead of the whole number. + * e.g 4.6 becomes 4.5 instead of 5. + */ +@VisibleForTesting +fun Float.roundToNearestHalf(): Float = + round(this * 2) / 2f + +@LightDarkPreview +@Composable +@Suppress("MagicNumber") +private fun StarRatingPreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(FirefoxTheme.colors.layer1) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + listOf(0.4f, 0.9f, 1.6f, 2.2f, 3f, 3.6f, 4.1f, 4.65f, 4.9f).forEach { + StarRating(value = it) + } + } + } +} diff --git a/app/src/main/res/drawable/ic_star_half.xml b/app/src/main/res/drawable/ic_star_half.xml new file mode 100644 index 000000000..002412ec8 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_half.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index c1abf8666..3a06998b3 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -118,4 +118,5 @@ Reliable reviews Only some reliable reviews Unreliable reviews + %1$s out of 5 stars diff --git a/app/src/test/java/org/mozilla/fenix/shopping/ui/StarRatingKtTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/ui/StarRatingKtTest.kt new file mode 100644 index 000000000..6dc1f064a --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/shopping/ui/StarRatingKtTest.kt @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.shopping.ui + +import junit.framework.TestCase.assertEquals +import org.junit.Test + +class StarRatingKtTest { + + @Test + fun `GIVEN a float with a decimal THEN remove the zero if present`() { + assertEquals(3, 3.0f.removeDecimalZero()) + assertEquals(4.5f, 4.5f.removeDecimalZero()) + assertEquals(5, 5.0f.removeDecimalZero()) + assertEquals(0.2f, 0.2f.removeDecimalZero()) + assertEquals(1.00001f, 1.00001f.removeDecimalZero()) + assertEquals(4.999f, 4.999f.removeDecimalZero()) + } + + @Test + fun `GIVEN a float with a decimal THEN round its value to the nearest half`() { + assertEquals(3.0f, 3.1f.roundToNearestHalf()) + assertEquals(4.5f, 4.6f.roundToNearestHalf()) + assertEquals(5.0f, 4.9f.roundToNearestHalf()) + assertEquals(0.5f, 0.3f.roundToNearestHalf()) + assertEquals(2.5f, 2.26f.roundToNearestHalf()) + assertEquals(2.0f, 2.25f.roundToNearestHalf()) + } +} From eb7b137ee9639d006556216ae12b3e788ed9bd7e Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 11 Jul 2023 12:59:21 +0300 Subject: [PATCH 062/207] Bug 1842719 - disable failing report site issue related UI tests --- app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt | 2 ++ .../java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt index 576e11a5c..c4a7f8f0d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt @@ -6,6 +6,7 @@ import mozilla.components.concept.engine.utils.EngineReleaseChannel import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -153,6 +154,7 @@ class MainMenuTest { } } + @Ignore("Failing, see https://bugzilla.mozilla.org/show_bug.cgi?id=1842719") @SmokeTest @Test fun mainMenuReportSiteIssueTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 3ab1f69fe..44ee9a947 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -98,7 +98,7 @@ class ThreeDotMenuMainRobot { syncAndSaveDataButton, findInPageButton, desktopSiteButton, - reportSiteIssueButton, + // reportSiteIssueButton, addToHomeScreenButton, addToShortcutsButton, saveToCollectionButton, From 920e7c4131499d8828d6af72337ad5ec83d01826 Mon Sep 17 00:00:00 2001 From: JohanLorenzo Date: Mon, 10 Jul 2023 17:02:49 +0000 Subject: [PATCH 063/207] Update Fenix initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 188 ++++++++++++------ 1 file changed, 122 insertions(+), 66 deletions(-) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index e9249d49b..60470e541 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -30,23 +30,37 @@ "slug": "control", "ratio": 1, "feature": { - "featureId": "toolbar", - "enabled": true, - "value": { - "toolbar-position-top": false + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "toolbar", + "enabled": true, + "value": { + "toolbar-position-top": false + } } - } + ] }, { "slug": "treatment-a", "ratio": 1, "feature": { - "featureId": "toolbar", - "enabled": true, - "value": { - "toolbar-position-top": true + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "toolbar", + "enabled": true, + "value": { + "toolbar-position-top": true + } } - } + ] } ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('115.!') >= 0)))", @@ -90,24 +104,38 @@ "slug": "control-off-branch", "ratio": 1, "feature": { - "featureId": "re-engagement-notification", - "enabled": true, - "value": { - "enabled": false + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "re-engagement-notification", + "enabled": true, + "value": { + "enabled": false + } } - } + ] }, { "slug": "treatment-privacy-notification", "ratio": 1, "feature": { - "featureId": "re-engagement-notification", - "enabled": true, - "value": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "re-engagement-notification", "enabled": true, - "type": 0 + "value": { + "enabled": true, + "type": 0 + } } - } + ] } ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('115.!') >= 0)))", @@ -156,37 +184,51 @@ "slug": "control", "ratio": 1, "feature": { - "featureId": "juno-onboarding", - "enabled": true, - "value": { - "enabled": true + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "juno-onboarding", + "enabled": true, + "value": { + "enabled": true + } } - } + ] }, { "slug": "treatment-a", "ratio": 1, "feature": { - "featureId": "juno-onboarding", - "enabled": true, - "value": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "juno-onboarding", "enabled": true, - "cards": { - "default-browser": { - "image-res": "onboarding_default_browser", - "image-is-illustration": false - }, - "sync-sign-in": { - "image-res": "onboarding_sync", - "image-is-illustration": false - }, - "notification-permission": { - "image-res": "onboarding_notification", - "image-is-illustration": false + "value": { + "enabled": true, + "cards": { + "default-browser": { + "image-res": "onboarding_default_browser", + "image-is-illustration": false + }, + "sync-sign-in": { + "image-res": "onboarding_sync", + "image-is-illustration": false + }, + "notification-permission": { + "image-res": "onboarding_notification", + "image-is-illustration": false + } } } } - } + ] } ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('114.!') >= 0) && (language in ['en'])))", @@ -235,41 +277,55 @@ "slug": "control", "ratio": 1, "feature": { - "featureId": "juno-onboarding", - "enabled": true, - "value": { - "enabled": true + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "juno-onboarding", + "enabled": true, + "value": { + "enabled": true + } } - } + ] }, { "slug": "treatment-a", "ratio": 1, "feature": { - "featureId": "juno-onboarding", - "enabled": true, - "value": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "juno-onboarding", "enabled": true, - "cards": { - "default-browser": { - "title": "Du entscheidest, was Standard ist", - "body": "Nimm nicht das Erstbeste, sondern das Beste für dich: Firefox schützt deine Privatsphäre.\n\nLies unseren Datenschutzhinweis.", - "link-text": "Datenschutzhinweis", - "image-res": "onboarding_ctd_default_browser" - }, - "sync-sign-in": { - "title": "Alles ist dort, wo du es brauchst", - "body": "Wenn du willst, bringt Firefox deine Tabs und Passwörter auf all deine Geräte.", - "image-res": "onboarding_ctd_sync" - }, - "notification-permission": { - "title": "Du bestimmst, was Firefox kann", - "body": "Benachrichtigungen helfen dabei, Downloads zu managen und Tabs zwischen Geräten zu senden.", - "image-res": "onboarding_ctd_notification" + "value": { + "enabled": true, + "cards": { + "default-browser": { + "title": "Du entscheidest, was Standard ist", + "body": "Nimm nicht das Erstbeste, sondern das Beste für dich: Firefox schützt deine Privatsphäre.\n\nLies unseren Datenschutzhinweis.", + "link-text": "Datenschutzhinweis", + "image-res": "onboarding_ctd_default_browser" + }, + "sync-sign-in": { + "title": "Alles ist dort, wo du es brauchst", + "body": "Wenn du willst, bringt Firefox deine Tabs und Passwörter auf all deine Geräte.", + "image-res": "onboarding_ctd_sync" + }, + "notification-permission": { + "title": "Du bestimmst, was Firefox kann", + "body": "Benachrichtigungen helfen dabei, Downloads zu managen und Tabs zwischen Geräten zu senden.", + "image-res": "onboarding_ctd_notification" + } } } } - } + ] } ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('115.!') >= 0) && (language in ['de']) && (region in ['DE'])))", From 20f3002e80e6a9fc4b600b17819bb9e17de31527 Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Tue, 11 Jul 2023 17:16:02 -0400 Subject: [PATCH 064/207] Bug 1839239 - Add crash bread crumbs for dialogs. --- .../org/mozilla/fenix/FenixApplication.kt | 1 + .../fenix/android/FenixDialogFragment.kt | 5 ++ .../fenix/browser/BaseBrowserFragment.kt | 13 +++++ .../org/mozilla/fenix/components/Analytics.kt | 5 ++ .../fenix/crashes/CrashFactCollector.kt | 57 +++++++++++++++++++ .../fenix/downloads/StartDownloadDialog.kt | 8 +++ .../org/mozilla/fenix/share/ShareFragment.kt | 11 ++++ .../fenix/tabstray/TabsTrayFragment.kt | 26 ++++++++- .../downloads/StartDownloadDialogTest.kt | 20 +++++-- .../view/RecentBookmarksViewHolderTest.kt | 2 +- .../fenix/tabstray/TabsTrayFragmentTest.kt | 8 ++- 11 files changed, 145 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/crashes/CrashFactCollector.kt diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index ed9424100..0f8268d2d 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -442,6 +442,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { private fun startMetricsIfEnabled() { if (settings().isTelemetryEnabled) { components.analytics.metrics.start(MetricServiceType.Data) + components.analytics.crashFactCollector.start() } if (settings().isMarketingTelemetryEnabled) { diff --git a/app/src/main/java/org/mozilla/fenix/android/FenixDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/android/FenixDialogFragment.kt index d3841a7ba..06dc61344 100644 --- a/app/src/main/java/org/mozilla/fenix/android/FenixDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/android/FenixDialogFragment.kt @@ -19,7 +19,9 @@ import androidx.appcompat.view.ContextThemeWrapper import com.google.android.material.R import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog +import mozilla.components.concept.base.crash.Breadcrumb import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.ext.components /** * Base [AppCompatDialogFragment] that adds behaviour to create a top or bottom dialog. @@ -36,6 +38,9 @@ abstract class FenixDialogFragment : AppCompatDialogFragment() { abstract val layoutId: Int override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("FenixDialogFragment onCreateDialog Gravity $gravity"), + ) return if (gravity == Gravity.BOTTOM) { BottomSheetDialog(requireContext(), this.theme).apply { setOnShowListener { 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 210b93a7a..8e69e6361 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -57,6 +57,7 @@ import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.thumbnails.BrowserThumbnails +import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.accounts.FxaCapability @@ -550,6 +551,9 @@ abstract class BaseBrowserFragment : customFirstPartyDownloadDialog = { filename, contentSize, positiveAction, negativeAction -> run { if (currentStartDownloadDialog == null) { + context.components.analytics.crashReporter.recordCrashBreadcrumb( + Breadcrumb("FirstPartyDownloadDialog created"), + ) FirstPartyDownloadDialog( activity = requireActivity(), filename = filename.value, @@ -557,6 +561,9 @@ abstract class BaseBrowserFragment : positiveButtonAction = positiveAction.value, negativeButtonAction = negativeAction.value, ).onDismiss { + context.components.analytics.crashReporter.recordCrashBreadcrumb( + Breadcrumb("FirstPartyDownloadDialog onDismiss"), + ) currentStartDownloadDialog = null }.show(binding.startDownloadDialogContainer) .also { @@ -568,12 +575,18 @@ abstract class BaseBrowserFragment : customThirdPartyDownloadDialog = { downloaderApps, onAppSelected, negativeActionCallback -> run { if (currentStartDownloadDialog == null) { + context.components.analytics.crashReporter.recordCrashBreadcrumb( + Breadcrumb("ThirdPartyDownloadDialog created"), + ) ThirdPartyDownloadDialog( activity = requireActivity(), downloaderApps = downloaderApps.value, onAppSelected = onAppSelected.value, negativeButtonAction = negativeActionCallback.value, ).onDismiss { + context.components.analytics.crashReporter.recordCrashBreadcrumb( + Breadcrumb("ThirdPartyDownloadDialog onDismiss"), + ) currentStartDownloadDialog = null }.show(binding.startDownloadDialogContainer).also { currentStartDownloadDialog = it diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt index 1e68b0c47..3cd954a5b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt @@ -30,6 +30,7 @@ import org.mozilla.fenix.components.metrics.GleanMetricsService import org.mozilla.fenix.components.metrics.InstallReferrerMetricsService import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricsStorage +import org.mozilla.fenix.crashes.CrashFactCollector import org.mozilla.fenix.experiments.createNimbus import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings @@ -120,6 +121,10 @@ class Analytics( ) } + val crashFactCollector: CrashFactCollector by lazyMonitored { + CrashFactCollector(crashReporter) + } + val metricsStorage: MetricsStorage by lazyMonitored { DefaultMetricsStorage( context = context, diff --git a/app/src/main/java/org/mozilla/fenix/crashes/CrashFactCollector.kt b/app/src/main/java/org/mozilla/fenix/crashes/CrashFactCollector.kt new file mode 100644 index 000000000..ae0070a46 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/crashes/CrashFactCollector.kt @@ -0,0 +1,57 @@ +/* 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.crashes + +import mozilla.components.concept.base.crash.Breadcrumb +import mozilla.components.concept.base.crash.CrashReporting +import mozilla.components.feature.contextmenu.facts.ContextMenuFacts +import mozilla.components.feature.downloads.facts.DownloadsFacts +import mozilla.components.feature.prompts.facts.AddressAutofillDialogFacts +import mozilla.components.feature.prompts.facts.CreditCardAutofillDialogFacts +import mozilla.components.feature.prompts.facts.PromptFacts +import mozilla.components.feature.sitepermissions.SitePermissionsFacts +import mozilla.components.support.base.Component +import mozilla.components.support.base.facts.Fact +import mozilla.components.support.base.facts.FactProcessor +import mozilla.components.support.base.facts.Facts + +/** + * Collects facts and record bread crumbs for the events. + */ +class CrashFactCollector( + private val crashReporter: CrashReporting, +) { + + /** + * Starts collecting facts. + */ + fun start() { + Facts.registerProcessor( + object : FactProcessor { + override fun process(fact: Fact) { + fact.process() + } + }, + ) + } + + internal fun Fact.process(): Unit = when (component to item) { + Component.FEATURE_CONTEXTMENU to ContextMenuFacts.Items.MENU, + Component.FEATURE_DOWNLOADS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_SHOWN, + Component.FEATURE_DOWNLOADS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_SAVE_PROMPT_SHOWN, + Component.FEATURE_DOWNLOADS to CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_PROMPT_DISMISSED, + Component.FEATURE_DOWNLOADS to AddressAutofillDialogFacts.Items.AUTOFILL_ADDRESS_PROMPT_SHOWN, + Component.FEATURE_DOWNLOADS to AddressAutofillDialogFacts.Items.AUTOFILL_ADDRESS_PROMPT_DISMISSED, + Component.FEATURE_DOWNLOADS to DownloadsFacts.Items.PROMPT, + Component.FEATURE_SITEPERMISSIONS to SitePermissionsFacts.Items.PERMISSIONS, + Component.FEATURE_PROMPTS to PromptFacts.Items.PROMPT, + -> { + crashReporter.recordCrashBreadcrumb(Breadcrumb("$component $action $value")) + } + else -> { + // no-op + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt b/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt index c2eeec492..6ed2c57fb 100644 --- a/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt +++ b/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt @@ -20,6 +20,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.viewbinding.ViewBinding +import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.feature.downloads.databinding.MozacDownloaderChooserPromptBinding import mozilla.components.feature.downloads.toMegabyteOrKilobyteString import mozilla.components.feature.downloads.ui.DownloaderApp @@ -27,6 +28,7 @@ import mozilla.components.feature.downloads.ui.DownloaderAppAdapter import org.mozilla.fenix.R import org.mozilla.fenix.databinding.DialogScrimBinding import org.mozilla.fenix.databinding.StartDownloadDialogLayoutBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings /** @@ -54,6 +56,9 @@ abstract class StartDownloadDialog( * @param container The [ViewGroup] in which the download view will be inflated. */ fun show(container: ViewGroup): StartDownloadDialog { + activity.components.analytics.crashReporter.recordCrashBreadcrumb( + Breadcrumb("StartDownloadDialog show"), + ) this.container = container val dialogParent = container.parent as? ViewGroup @@ -89,6 +94,9 @@ abstract class StartDownloadDialog( * @param callback The callback for when the view is dismissed. */ fun onDismiss(callback: () -> Unit): StartDownloadDialog { + activity.components.analytics.crashReporter.recordCrashBreadcrumb( + Breadcrumb("StartDownloadDialog onDismiss"), + ) this.onDismiss = callback return this } diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt index a0b8fc19f..5a66baf7f 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt @@ -19,6 +19,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.selector.findTabOrCustomTab +import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.concept.engine.prompt.PromptRequest import mozilla.components.feature.accounts.push.SendTabUseCases import mozilla.components.feature.share.RecentAppsStorage @@ -26,6 +27,7 @@ import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.databinding.FragmentShareBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.theme.FirefoxTheme @@ -49,11 +51,17 @@ class ShareFragment : AppCompatDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("ShareFragment onCreate"), + ) setStyle(STYLE_NO_TITLE, R.style.ShareDialogStyle) } override fun onPause() { super.onPause() + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("ShareFragment dismiss"), + ) consumePrompt { onDismiss() } dismiss() } @@ -150,6 +158,9 @@ class ShareFragment : AppCompatDialogFragment() { } override fun onDestroy() { + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("ShareFragment onDestroy"), + ) setFragmentResult(RESULT_KEY, Bundle()) // Clear the stored result in case there is no listener with the same key set. clearFragmentResult(RESULT_KEY) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index ca477e72a..3dbdcae14 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -29,6 +29,7 @@ import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.state.selector.normalTabs import mozilla.components.browser.state.selector.privateTabs import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.feature.downloads.ui.DownloadCancelDialogFragment import mozilla.components.feature.tabs.tabstray.TabsFeature import mozilla.components.support.base.feature.ViewBoundFeatureWrapper @@ -125,6 +126,9 @@ class TabsTrayFragment : AppCompatDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment dismissTabsTray"), + ) setStyle(STYLE_NO_TITLE, R.style.TabTrayDialogStyle) } @@ -190,13 +194,18 @@ class TabsTrayFragment : AppCompatDialogFragment() { controller = tabsTrayController, ) + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment onCreateDialog"), + ) tabsTrayDialog = TabsTrayDialog(requireContext(), theme) { tabsTrayInteractor } return tabsTrayDialog } override fun onPause() { super.onPause() - + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment onPause"), + ) dialog?.window?.setWindowAnimations(R.style.DialogFragmentRestoreAnimation) } @@ -314,6 +323,9 @@ class TabsTrayFragment : AppCompatDialogFragment() { override fun onStart() { super.onStart() + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment onStart"), + ) findPreviousDialogFragment()?.let { dialog -> dialog.onAcceptClicked = ::onCancelDownloadWarningAccepted } @@ -321,6 +333,9 @@ class TabsTrayFragment : AppCompatDialogFragment() { override fun onDestroyView() { super.onDestroyView() + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment onDestroyView"), + ) _tabsTrayBinding = null _tabsTrayDialogBinding = null _fabButtonBinding = null @@ -551,6 +566,9 @@ class TabsTrayFragment : AppCompatDialogFragment() { @VisibleForTesting internal fun showCancelledDownloadWarning(downloadCount: Int, tabId: String?, source: String?) { + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("DownloadCancelDialogFragment show"), + ) val dialog = DownloadCancelDialogFragment.newInstance( downloadCount = downloadCount, tabId = tabId, @@ -687,6 +705,9 @@ class TabsTrayFragment : AppCompatDialogFragment() { internal fun dismissTabsTray() { // This should always be the last thing we do because nothing (e.g. telemetry) // is guaranteed after that. + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment dismissTabsTray"), + ) dismissAllowingStateLoss() } @@ -750,6 +771,9 @@ class TabsTrayFragment : AppCompatDialogFragment() { } private fun onTabsTrayDismissed() { + context?.components?.analytics?.crashReporter?.recordCrashBreadcrumb( + Breadcrumb("TabsTrayFragment onTabsTrayDismissed"), + ) TabsTray.closed.record(NoExtras()) dismissAllowingStateLoss() } diff --git a/app/src/test/java/org/mozilla/fenix/downloads/StartDownloadDialogTest.kt b/app/src/test/java/org/mozilla/fenix/downloads/StartDownloadDialogTest.kt index 058250fad..00e3f7cef 100644 --- a/app/src/test/java/org/mozilla/fenix/downloads/StartDownloadDialogTest.kt +++ b/app/src/test/java/org/mozilla/fenix/downloads/StartDownloadDialogTest.kt @@ -25,6 +25,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.R import org.mozilla.fenix.databinding.StartDownloadDialogLayoutBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings @@ -44,6 +45,7 @@ class StartDownloadDialogTest { mockkStatic("mozilla.components.support.ktx.android.view.WindowKt", "org.mozilla.fenix.ext.ContextKt") { every { any().settings() } returns mockk(relaxed = true) + every { any().components } returns mockk(relaxed = true) val fluentDialog = dialog.show(dialogContainer) val scrim = dialogParent.children.first { it.id == R.id.scrim } @@ -66,13 +68,16 @@ class StartDownloadDialogTest { @Test fun `GIVEN a dismiss callback WHEN the dialog is dismissed THEN the callback is informed`() { var wasDismissCalled = false - val dialog = TestDownloadDialog(mockk(relaxed = true)) - - val fluentDialog = dialog.onDismiss { wasDismissCalled = true } - dialog.onDismiss() + val activity = Robolectric.buildActivity(Activity::class.java).create().get() + val dialog = TestDownloadDialog(activity) + mockkStatic("org.mozilla.fenix.ext.ContextKt") { + every { any().components } returns mockk(relaxed = true) + val fluentDialog = dialog.onDismiss { wasDismissCalled = true } + dialog.onDismiss() - assertTrue(wasDismissCalled) - assertEquals(dialog, fluentDialog) + assertTrue(wasDismissCalled) + assertEquals(dialog, fluentDialog) + } } @Test @@ -86,6 +91,7 @@ class StartDownloadDialogTest { val dialog = TestDownloadDialog(activity) mockkStatic("mozilla.components.support.ktx.android.view.WindowKt", "org.mozilla.fenix.ext.ContextKt") { every { any().settings() } returns mockk(relaxed = true) + every { any().components } returns mockk(relaxed = true) dialog.show(dialogContainer) dialog.binding = StartDownloadDialogLayoutBinding .inflate(LayoutInflater.from(activity), dialogContainer, true) @@ -161,6 +167,7 @@ class StartDownloadDialogTest { every { accessibilityServicesEnabled } returns false } every { any().settings() } returns settings + every { any().components } returns mockk(relaxed = true) dialog.show(dialogContainer) assertEquals(2, dialogParent.children.count { it.isImportantForAccessibility }) @@ -189,6 +196,7 @@ class StartDownloadDialogTest { every { accessibilityServicesEnabled } returns true } every { any().settings() } returns settings + every { any().components } returns mockk(relaxed = true) val dialog = TestDownloadDialog(activity) dialog.show(dialogContainer) dialog.binding = StartDownloadDialogLayoutBinding diff --git a/app/src/test/java/org/mozilla/fenix/home/recentvisits/view/RecentBookmarksViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/recentvisits/view/RecentBookmarksViewHolderTest.kt index 13d299e30..4d67bc9c7 100644 --- a/app/src/test/java/org/mozilla/fenix/home/recentvisits/view/RecentBookmarksViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/recentvisits/view/RecentBookmarksViewHolderTest.kt @@ -33,5 +33,5 @@ class RecentBookmarksViewHolderTest { verify { interactor.onRemoveGroups(setOf(group)) } } - */ + */ } diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt index 9289f1d2d..746859b91 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt @@ -363,10 +363,12 @@ class TabsTrayFragmentTest { @Test fun `WHEN dismissTabsTray is called THEN it dismisses the tray`() { every { fragment.dismissAllowingStateLoss() } just Runs + mockkStatic("org.mozilla.fenix.ext.ContextKt") { + every { any().components } returns mockk(relaxed = true) + fragment.dismissTabsTray() - fragment.dismissTabsTray() - - verify { fragment.dismissAllowingStateLoss() } + verify { fragment.dismissAllowingStateLoss() } + } } @Test From f0f5e57ff6d1854cf312c812d6a6d33a7450403f Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Mon, 10 Jul 2023 15:56:54 -0700 Subject: [PATCH 065/207] Bug 1815001 - Enable the Tabs Tray to Compose rewrite in Nightly --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index dbd09b295..11f9a01b7 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -50,7 +50,7 @@ object FeatureFlags { /** * Enables compose on the tabs tray items. */ - const val composeTabsTray = false + val composeTabsTray = Config.channel.isNightlyOrDebug /** * Enables compose on the top sites. From 1c91b0613a1fda0226beb53628ecabf8be9a4f92 Mon Sep 17 00:00:00 2001 From: Olivia Hall Date: Tue, 11 Jul 2023 10:12:17 -0400 Subject: [PATCH 066/207] Bug 1837517 - Additional Print Telmetry and Nimbus setup This bug adds telemetry for the print from menu feature. It adds the probes print_failure, print_completed, print_tapped (for both share and browsr menu), and share_menu_action for the print button on the share sheet only. browser_menu_action for the print button was added in bug 1836780. Additionally, Nimbus control for the browser print button and share print button was added as browser-print-enabled and share-print-enabled. --- app/.experimenter.yaml | 11 ++ app/metrics.yaml | 89 +++++++++++ app/nimbus.fml.yaml | 12 ++ .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 3 +- .../components/toolbar/DefaultToolbarMenu.kt | 4 +- .../fenix/share/SaveToPDFMiddleware.kt | 142 ++++++++++++------ .../mozilla/fenix/share/ShareController.kt | 1 + .../org/mozilla/fenix/share/ShareFragment.kt | 4 +- .../fenix/share/SaveToPDFMiddlewareTest.kt | 132 ++++++++++++++++ .../fenix/share/ShareControllerTest.kt | 7 +- 10 files changed, 358 insertions(+), 47 deletions(-) diff --git a/app/.experimenter.yaml b/app/.experimenter.yaml index d23824446..0b51d040d 100644 --- a/app/.experimenter.yaml +++ b/app/.experimenter.yaml @@ -125,6 +125,17 @@ pre-permission-notification-prompt: enabled: type: boolean description: "if true, the pre-permission notification prompt is shown to the user." +print: + description: A feature for printing from the share or browser menu. + hasExposure: true + exposureDescription: "" + variables: + browser-print-enabled: + type: boolean + description: "If true, a print button from the browser menu is available." + share-print-enabled: + type: boolean + description: "If true, a print button from the share menu is available." re-engagement-notification: description: A feature that shows the re-engagement notification if the user is inactive. hasExposure: true diff --git a/app/metrics.yaml b/app/metrics.yaml index 2283709a8..ba3a52413 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -563,6 +563,95 @@ events: metadata: tags: - Sharing + print_failure: + type: event + description: | + A user tapped the print in the menu or share sheet but an error occurred + and the process failed. + extra_keys: + source: + type: string + description: | + A string that indicates the type of document of pdf, non-pdf or unknown. + The default is unknown. + reason: + type: string + description: | + An error occurred while setting up for printing. + Default option is unknown, other options are no_settings_service, no_settings, + no_canonical_context, no_activity_context_delegate, no_activity_context, + no_print_delegate, and io_error. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517#c3 + data_sensitivity: + - technical + notification_emails: + - android-probes@mozilla.com + expires: 122 + print_completed: + type: event + description: | + Printing from the share sheet or menu successfully completed. + extra_keys: + source: + type: string + description: | + A string that indicates the type of document of pdf, non-pdf or unknown. + The default is unknown. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517#c3 + data_sensitivity: + - technical + notification_emails: + - android-probes@mozilla.com + expires: 122 + print_tapped: + type: event + description: | + A user tapped the print option in the menu or share sheet. + extra_keys: + source: + type: string + description: | + A string that indicates the type of document of pdf, non-pdf or unknown. + The default is unknown. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517#c5 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 122 + share_menu_action: + type: event + description: | + A share menu item was tapped. + The name of the item that the user tapped is stored in extras with the + key `item`. + extra_keys: + item: + description: | + A string containing the name of the item the user tapped. These items + currently include: print + type: string + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1837517#c5 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 122 + metadata: + tags: + - Sharing share_to_app: type: event description: | diff --git a/app/nimbus.fml.yaml b/app/nimbus.fml.yaml index dacd4bfc7..71bd89ba3 100644 --- a/app/nimbus.fml.yaml +++ b/app/nimbus.fml.yaml @@ -342,6 +342,18 @@ features: value: enabled: true + print: + description: A feature for printing from the share or browser menu. + variables: + share-print-enabled: + description: If true, a print button from the share menu is available. + type: Boolean + default: true + browser-print-enabled: + description: If true, a print button from the browser menu is available. + type: Boolean + default: true + search-extra-params: description: A feature that provides additional args for search. variables: diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 44ee9a947..73eb16c22 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -47,6 +47,7 @@ import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull +import org.mozilla.fenix.nimbus.FxNimbus /** * Implementation of Robot Pattern for the three dot (main) menu. @@ -110,7 +111,7 @@ class ThreeDotMenuMainRobot { assertItemContainingTextExists( settingsButton(), ) - if (FeatureFlags.print) { + if (FeatureFlags.print && FxNimbus.features.print.value().browserPrintEnabled) { assertItemContainingTextExists(printContentButton) } assertItemWithDescriptionExists( diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 3ed4a7261..2fbb407e1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -40,6 +40,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.accounts.FenixAccountManager import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.theme.ThemeManager /** @@ -78,6 +79,7 @@ open class DefaultToolbarMenu( get() = store.state.selectedTab override val menuBuilder by lazy { + FxNimbus.features.print.recordExposure() WebExtensionBrowserMenuBuilder( items = coreMenuItems, endOfMenuAlwaysVisible = shouldUseBottomToolbar, @@ -391,7 +393,7 @@ open class DefaultToolbarMenu( installToHomescreen.apply { visible = ::canInstall }, if (shouldShowTopSites) addRemoveTopSitesItem else null, saveToCollectionItem, - if (FeatureFlags.print) printPageItem else null, + if (FeatureFlags.print && FxNimbus.features.print.value().browserPrintEnabled) printPageItem else null, BrowserMenuDivider(), settingsItem, if (shouldDeleteDataOnQuit) deleteDataOnQuit else null, diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt index e8ae89af9..e040eb3e3 100644 --- a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -48,13 +48,13 @@ class SaveToPDFMiddleware( ) { when (action) { is EngineAction.SaveToPdfAction -> { - postTelemetryTapped(ctx.state.findTab(action.tabId)) + postTelemetryTapped(ctx.state.findTab(action.tabId), isPrint = false) // Continue to generate the PDF, passing through here to add telemetry next(action) } is EngineAction.SaveToPdfCompleteAction -> { - postTelemetryCompleted(ctx.state.findTab(action.tabId)) + postTelemetryCompleted(ctx.state.findTab(action.tabId), isPrint = false) } is EngineAction.SaveToPdfExceptionAction -> { @@ -64,21 +64,24 @@ class SaveToPDFMiddleware( Toast.makeText(context, R.string.unable_to_save_to_pdf_error, LENGTH_LONG).show() } - postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable) + postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable, isPrint = false) } is EngineAction.PrintContentAction -> { + postTelemetryTapped(ctx.state.findTab(action.tabId), isPrint = true) + // Continue to print, passing through here to add telemetry next(action) - // Reserved for telemetry in bug 1837517 } is EngineAction.PrintContentCompletedAction -> { - // No-op, reserved for telemetry in bug 1837517 + postTelemetryCompleted(ctx.state.findTab(action.tabId), isPrint = true) } is EngineAction.PrintContentExceptionAction -> { // Bug 1840894 - will update this toast to a snackbar with new snackbar error component ThreadUtils.runOnUiThread { Toast.makeText(context, R.string.unable_to_print_error, LENGTH_LONG).show() } + + postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable, isPrint = true) } else -> { next(action) @@ -130,82 +133,135 @@ class SaveToPDFMiddleware( } /** - * Indicates the Save As PDF action was requested and posts telemetry via Glean. + * Indicates the Print or Save As PDF action was requested and posts telemetry via Glean. * + * @param isPrint - if the telemetry is for printing * @param tab - tab state to use for page source category */ - private fun postTelemetryTapped(tab: TabSessionState?) { + private fun postTelemetryTapped(tab: TabSessionState?, isPrint: Boolean) { mainScope.launch { tab?.engineState?.engineSession?.checkForPdfViewer( onResult = { isPdf -> - Events.saveToPdfTapped.record( - Events.SaveToPdfTappedExtra( - source = telemetrySource(isPdf), - ), - ) + if (isPrint) { + Events.printTapped.record( + Events.PrintTappedExtra( + source = telemetrySource(isPdf), + ), + ) + } else { + Events.saveToPdfTapped.record( + Events.SaveToPdfTappedExtra( + source = telemetrySource(isPdf), + ), + ) + } }, onException = { - Events.saveToPdfTapped.record( - Events.SaveToPdfTappedExtra( - source = telemetrySource(null), - ), - ) + if (isPrint) { + Events.printTapped.record( + Events.PrintTappedExtra( + source = telemetrySource(null), + ), + ) + } else { + Events.saveToPdfTapped.record( + Events.SaveToPdfTappedExtra( + source = telemetrySource(null), + ), + ) + } }, ) } } /** - * Indicates the Save As PDF action completed and generated a PDF and posts telemetry via Glean. + * Indicates the Print or Save As PDF action completed and generated a PDF and posts telemetry via Glean. * + * @param isPrint - if the telemetry is for printing * @param tab - tab state to use for page source category */ - private fun postTelemetryCompleted(tab: TabSessionState?) { + private fun postTelemetryCompleted(tab: TabSessionState?, isPrint: Boolean) { mainScope.launch { tab?.engineState?.engineSession?.checkForPdfViewer( onResult = { isPdf -> - Events.saveToPdfCompleted.record( - Events.SaveToPdfCompletedExtra( - source = telemetrySource(isPdf), - ), - ) + if (isPrint) { + Events.printCompleted.record( + Events.PrintCompletedExtra( + source = telemetrySource(isPdf), + ), + ) + } else { + Events.saveToPdfCompleted.record( + Events.SaveToPdfCompletedExtra( + source = telemetrySource(isPdf), + ), + ) + } }, onException = { - Events.saveToPdfCompleted.record( - Events.SaveToPdfCompletedExtra( - source = telemetrySource(null), - ), - ) + if (isPrint) { + Events.printCompleted.record( + Events.PrintCompletedExtra( + source = telemetrySource(null), + ), + ) + } else { + Events.saveToPdfCompleted.record( + Events.SaveToPdfCompletedExtra( + source = telemetrySource(null), + ), + ) + } }, ) } } /** - * Indicates the Save As PDF action failed and the reason for failure and posts telemetry via Glean. + * Indicates the Print or Save As PDF action failed and the reason for failure and posts telemetry via Glean. * + * @param isPrint - if the telemetry is for printing * @param tab - tab state to use for page source category * @param throwable - failure state to use for failure reason category */ - private fun postTelemetryFailed(tab: TabSessionState?, throwable: Throwable) { + private fun postTelemetryFailed(tab: TabSessionState?, throwable: Throwable, isPrint: Boolean) { val telFailureReason = telemetryErrorReason(throwable as Exception) mainScope.launch { tab?.engineState?.engineSession?.checkForPdfViewer( onResult = { isPdf -> - Events.saveToPdfFailure.record( - Events.SaveToPdfFailureExtra( - source = telemetrySource(isPdf), - reason = telFailureReason, - ), - ) + if (isPrint) { + Events.printFailure.record( + Events.PrintFailureExtra( + source = telemetrySource(isPdf), + reason = telFailureReason, + ), + ) + } else { + Events.saveToPdfFailure.record( + Events.SaveToPdfFailureExtra( + source = telemetrySource(isPdf), + reason = telFailureReason, + ), + ) + } }, onException = { - Events.saveToPdfFailure.record( - Events.SaveToPdfFailureExtra( - source = telemetrySource(null), - reason = telFailureReason, - ), - ) + if (isPrint) { + Events.printFailure.record( + Events.PrintFailureExtra( + source = telemetrySource(null), + reason = telFailureReason, + ), + ) + } else { + Events.saveToPdfFailure.record( + Events.SaveToPdfFailureExtra( + source = telemetrySource(null), + reason = telFailureReason, + ), + ) + } }, ) } diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt index c43b55599..2ac1a18df 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt @@ -157,6 +157,7 @@ class DefaultShareController( } override fun handlePrint(tabId: String?) { + Events.shareMenuAction.record(Events.ShareMenuActionExtra("print")) handleShareClosed() printUseCase.invoke(tabId) } diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt index 5a66baf7f..da28d9b58 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt @@ -30,6 +30,7 @@ import org.mozilla.fenix.databinding.FragmentShareBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme @@ -132,7 +133,8 @@ class ShareFragment : AppCompatDialogFragment() { } } - if (FeatureFlags.print) { + FxNimbus.features.print.recordExposure() + if (FeatureFlags.print && FxNimbus.features.print.value().sharePrintEnabled) { binding.print.setContent { FirefoxTheme(theme = Theme.getTheme(allowPrivateTheme = false)) { PrintItem { diff --git a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt index b20425afc..2a931b83c 100644 --- a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt @@ -225,4 +225,136 @@ class SaveToPDFMiddlewareTest { assertEquals("non-pdf", middleware.telemetrySource(isPdfViewer = false)) assertEquals("unknown", middleware.telemetrySource(isPdfViewer = null)) } + + @Test + fun `GIVEN a print request WHEN it fails unexpectedly THEN unknown failure telemetry is sent`() = runTestOnMain { + val exceptionToThrow = RuntimeException("No Print Spooler") + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + } + } + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), + ), + ), + ) + browserStore.dispatch( + EngineAction.PrintContentExceptionAction("14", true, exceptionToThrow), + ) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.printFailure.testGetValue()?.firstOrNull() + assertNotNull(response) + val reason = response?.extra?.get("reason") + assertEquals("unknown", reason) + val source = response?.extra?.get("source") + assertEquals("unknown", source) + } + + @Test + fun `GIVEN a print request WHEN it fails due to print exception THEN print exception failure telemetry is sent`() = runTestOnMain { + val exceptionToThrow = MockGeckoPrintException() + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + } + } + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), + ), + ), + ) + browserStore.dispatch(EngineAction.PrintContentExceptionAction("14", true, exceptionToThrow)) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.printFailure.testGetValue()?.firstOrNull() + assertNotNull(response) + val reason = response?.extra?.get("reason") + assertEquals("no_settings_service", reason) + val source = response?.extra?.get("source") + assertEquals("unknown", source) + } + + @Test + fun `GIVEN a print request WHEN it completes THEN completed telemetry is sent`() = runTestOnMain { + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + firstArg<(Boolean) -> Unit>().invoke(true) + } + } + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), + ), + ), + ) + browserStore.dispatch(EngineAction.PrintContentCompletedAction("14")) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.printCompleted.testGetValue() + assertNotNull(response) + val source = response?.firstOrNull()?.extra?.get("source") + assertEquals("pdf", source) + } + + @Test + fun `GIVEN a print request WHEN it the action begins THEN tapped telemetry is sent`() = runTestOnMain { + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + firstArg<(Boolean) -> Unit>().invoke(false) + } + } + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), + ), + ), + ) + browserStore.dispatch(EngineAction.PrintContentAction("14")) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.printTapped.testGetValue() + assertNotNull(response) + val source = response?.firstOrNull()?.extra?.get("source") + assertEquals("non-pdf", source) + } } diff --git a/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt b/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt index 17e9f91ee..a99701404 100644 --- a/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt @@ -293,7 +293,7 @@ class ShareControllerTest { } @Test - fun `WHEN handlePrint close the dialog and print the page`() { + fun `WHEN handlePrint close the dialog and print the page AND send tapped telemetry`() { val testController = DefaultShareController( context = mockk(), shareSubject = shareSubject, @@ -315,6 +315,11 @@ class ShareControllerTest { printUseCase.invoke("tabID") dismiss(ShareController.Result.DISMISSED) } + + assertNotNull(Events.shareMenuAction.testGetValue()) + val printTapped = Events.shareMenuAction.testGetValue()!! + assertEquals(1, printTapped.size) + assertEquals("print", printTapped.single().extra?.getValue("item")) } @Test From e8b0f5879f79c06db9d6dfbe64932909a0ed2275 Mon Sep 17 00:00:00 2001 From: JohanLorenzo Date: Wed, 12 Jul 2023 22:02:54 +0000 Subject: [PATCH 067/207] Update Fenix initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 60470e541..6cca59d34 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -11,7 +11,7 @@ "channel": "release", "userFacingName": "Android default toolbar placement", "userFacingDescription": "Testing default position of toolbar.", - "isEnrollmentPaused": false, + "isEnrollmentPaused": true, "isRollout": false, "bucketConfig": { "randomizationUnit": "nimbus_id", @@ -338,6 +338,67 @@ "featureValidationOptOut": false, "localizations": null, "locales": null + }, + { + "schemaVersion": "1.12.0", + "slug": "release-android-onboarding-redesign-treatment-a-rollout", + "id": "release-android-onboarding-redesign-treatment-a-rollout", + "arguments": {}, + "application": "org.mozilla.firefox", + "appName": "fenix", + "appId": "org.mozilla.firefox", + "channel": "release", + "userFacingName": "[release] Android Onboarding Redesign - Treatment A Rollout", + "userFacingDescription": "Testing a new onboarding experience.", + "isEnrollmentPaused": false, + "isRollout": true, + "bucketConfig": { + "randomizationUnit": "nimbus_id", + "namespace": "fenix-juno-onboarding-release-mobile_first_run-rollout-1", + "start": 0, + "count": 10000, + "total": 10000 + }, + "featureIds": [ + "juno-onboarding" + ], + "probeSets": [], + "outcomes": [ + { + "slug": "default-browser", + "priority": "primary" + } + ], + "branches": [ + { + "slug": "treatment-a", + "ratio": 1, + "feature": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "juno-onboarding", + "enabled": true, + "value": { + "enabled": true + } + } + ] + } + ], + "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('116.!') >= 0)))", + "startDate": "2023-07-12", + "enrollmentEndDate": "2023-08-08", + "endDate": null, + "proposedDuration": 28, + "proposedEnrollment": 7, + "referenceBranch": "treatment-a", + "featureValidationOptOut": false, + "localizations": null, + "locales": null } ] } From 735db97731d2eced215d2a0901198c127a72f272 Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Tue, 11 Jul 2023 15:12:23 -0600 Subject: [PATCH 068/207] Bug 1825116 - Reformat some python files with black and avoid 'bare except' ruff warnings --- .../fenix/syncintegration/gradlewbuild.py | 20 ++-- .../org/mozilla/fenix/syncintegration/tps.py | 37 ++++---- .../taskcluster/androidTest/parse-ui-test.py | 14 ++- tools/data_renewal_generate.py | 12 ++- tools/data_renewal_request.py | 2 +- tools/setup-startup-profiling.py | 95 ++++++++++++------- 6 files changed, 111 insertions(+), 69 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/gradlewbuild.py b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/gradlewbuild.py index ebe0a6ba5..1cd65a6f4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/gradlewbuild.py +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/gradlewbuild.py @@ -9,7 +9,7 @@ logging.getLogger(__name__).addHandler(logging.NullHandler()) class GradlewBuild(object): - binary = './gradlew' + binary = "./gradlew" logger = logging.getLogger() adbrun = ADBrun() @@ -20,17 +20,19 @@ class GradlewBuild(object): self.adbrun.launch() # Change path accordingly to go to root folder to run gradlew - os.chdir('../../../../../../../..') - cmd = './gradlew ' + 'app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=org.mozilla.fenix.syncintegration.SyncIntegrationTest#{}'.format(identifier) + os.chdir("../../../../../../../..") + cmd = ( + "./gradlew " + + "app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=org.mozilla.fenix.syncintegration.SyncIntegrationTest#{}".format( + identifier + ) + ) - self.logger.info('Running cmd: {}'.format(cmd)) + self.logger.info("Running cmd: {}".format(cmd)) out = "" try: - out = subprocess.check_output( - cmd, - shell=True, - stderr=subprocess.STDOUT) + out = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: out = e.output raise @@ -39,5 +41,5 @@ class GradlewBuild(object): testsPath = "app/src/androidTest/java/org/mozilla/fenix/syncintegration/" os.chdir(testsPath) - with open(self.log, 'w') as f: + with open(self.log, "w") as f: f.write(str(out)) diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/tps.py b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/tps.py index d61617d3a..af3204c79 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/tps.py +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/tps.py @@ -13,39 +13,42 @@ class TPS(object): def __init__(self, firefox, firefox_log, tps_log, profile): self.firefox = firefox - self.firefox_log = open(firefox_log, 'w') + self.firefox_log = open(firefox_log, "w") self.tps_log = tps_log self.profile = profile def _log(self, line): - self.firefox_log.write(line + '\n') - - def run(self, test, phase='phase1', ignore_unused_engines=True): - self.profile.set_preferences({ - 'testing.tps.testFile': os.path.abspath(test), - 'testing.tps.testPhase': phase, - 'testing.tps.ignoreUnusedEngines': ignore_unused_engines, - }) - args = ['-marionette'] - process_args = {'processOutputLine': [self._log]} - self.logger.info('Running: {} {}'.format(self.firefox, ' '.join(args))) - self.logger.info('Using profile at: {}'.format(self.profile.profile)) + self.firefox_log.write(line + "\n") + + def run(self, test, phase="phase1", ignore_unused_engines=True): + self.profile.set_preferences( + { + "testing.tps.testFile": os.path.abspath(test), + "testing.tps.testPhase": phase, + "testing.tps.ignoreUnusedEngines": ignore_unused_engines, + } + ) + args = ["-marionette"] + process_args = {"processOutputLine": [self._log]} + self.logger.info("Running: {} {}".format(self.firefox, " ".join(args))) + self.logger.info("Using profile at: {}".format(self.profile.profile)) runner = FirefoxRunner( binary=self.firefox, cmdargs=args, profile=self.profile, - process_args=process_args) + process_args=process_args, + ) runner.start(timeout=TIMEOUT) runner.wait(timeout=TIMEOUT) self.firefox_log.close() with open(self.tps_log) as f: for line in f.readlines(): - if 'CROSSWEAVE ERROR: ' in line: - raise TPSError(line.partition('CROSSWEAVE ERROR: ')[-1]) + if "CROSSWEAVE ERROR: " in line: + raise TPSError(line.partition("CROSSWEAVE ERROR: ")[-1]) with open(self.tps_log) as f: - assert 'test phase {}: PASS'.format(phase) in f.read() + assert "test phase {}: PASS".format(phase) in f.read() class TPSError(Exception): diff --git a/automation/taskcluster/androidTest/parse-ui-test.py b/automation/taskcluster/androidTest/parse-ui-test.py index 2f67ccbe7..80b84b778 100644 --- a/automation/taskcluster/androidTest/parse-ui-test.py +++ b/automation/taskcluster/androidTest/parse-ui-test.py @@ -56,12 +56,18 @@ def main(): print("| --- | --- | --- | --- |\n") for matrix, matrix_result in matrix_ids.items(): for axis in matrix_result["axes"]: - print(f"| {matrix_result['matrixId']} | {matrix_result['outcome']}" - f"| [Firebase Test Lab]({matrix_result['webLink']}) | {axis['details']}\n") + print( + f"| {matrix_result['matrixId']} | {matrix_result['outcome']}" + f"| [Firebase Test Lab]({matrix_result['webLink']}) | {axis['details']}\n" + ) print("---\n") print("# References & Documentation\n") - print("* [Automated UI Testing Documentation](https://github.com/mozilla-mobile/shared-docs/blob/main/android/ui-testing.md)\n") - print("* Mobile Test Engineering on [Mana](https://mana.mozilla.org/wiki/display/MTE/Mobile+Test+Engineering) | [Slack](https://mozilla.slack.com/archives/C02KDDS9QM9) | [Alerts](https://mozilla.slack.com/archives/C0134KJ4JHL)\n") + print( + "* [Automated UI Testing Documentation](https://github.com/mozilla-mobile/shared-docs/blob/main/android/ui-testing.md)\n" + ) + print( + "* Mobile Test Engineering on [Mana](https://mana.mozilla.org/wiki/display/MTE/Mobile+Test+Engineering) | [Slack](https://mozilla.slack.com/archives/C02KDDS9QM9) | [Alerts](https://mozilla.slack.com/archives/C0134KJ4JHL)\n" + ) if __name__ == "__main__": diff --git a/tools/data_renewal_generate.py b/tools/data_renewal_generate.py index 754c4bb78..4a4f2390a 100755 --- a/tools/data_renewal_generate.py +++ b/tools/data_renewal_generate.py @@ -65,8 +65,14 @@ def response(last_key, content, expire_version, writer, renewal): total_count += 1 # name of the telemtry - dictionary_url = GLEAN_DICTIONARY_PREFIX + last_key.lstrip(".").replace(".", "_") - result = {"#": total_count, "name": last_key.lstrip("."), "glean dictionary": dictionary_url} + dictionary_url = GLEAN_DICTIONARY_PREFIX + last_key.lstrip(".").replace( + ".", "_" + ) + result = { + "#": total_count, + "name": last_key.lstrip("."), + "glean dictionary": dictionary_url, + } result.update(content) # add columns for product to fille out, these should always be added at the end @@ -108,7 +114,7 @@ def response(last_key, content, expire_version, writer, renewal): with open(METRICS_FILENAME, "r") as f: try: arg1 = sys.argv[1] - except: + except Exception: print("usage is to include argument of the form `100`") quit() diff --git a/tools/data_renewal_request.py b/tools/data_renewal_request.py index 8df0c72ee..5f14292b0 100755 --- a/tools/data_renewal_request.py +++ b/tools/data_renewal_request.py @@ -14,7 +14,7 @@ import sys try: version = sys.argv[1] -except: +except Exception: print("usage is to include arguments of the form ") quit() diff --git a/tools/setup-startup-profiling.py b/tools/setup-startup-profiling.py index 293974bb4..d11fcdb0f 100755 --- a/tools/setup-startup-profiling.py +++ b/tools/setup-startup-profiling.py @@ -14,32 +14,53 @@ import os import tempfile from subprocess import run -PATH_PREFIX = '/data/local/tmp' +PATH_PREFIX = "/data/local/tmp" -PROD_FENIX = 'fenix' -PROD_GVE = 'geckoview_example' +PROD_FENIX = "fenix" +PROD_GVE = "geckoview_example" PRODUCTS = [PROD_FENIX, PROD_GVE] -GV_CONFIG = b'''env: +GV_CONFIG = b"""env: MOZ_PROFILER_STARTUP: 1 MOZ_PROFILER_STARTUP_INTERVAL: 5 MOZ_PROFILER_STARTUP_FEATURES: js,stackwalk,leaf,screenshots,ipcmessages,java,cpu MOZ_PROFILER_STARTUP_FILTERS: GeckoMain,Compositor,Renderer,IPDL Background -''' +""" def parse_args(): p = argparse.ArgumentParser( - description=("Easily enable start up profiling using the Firefox Profiler. Finish capturing the profile in " - "about:debugging on desktop. See " - "https://profiler.firefox.com/docs/#/./guide-remote-profiling?id=startup-profiling for " - "details.")) - p.add_argument('command', choices=['activate', 'deactivate'], help=("whether to activate or deactive start up " - "profiling for the given release channel")) - p.add_argument('release_channel', choices=['nightly', 'beta', 'release', 'debug'], help=("the release channel to " - "change the startup profiling state of the command on")) - - p.add_argument('-p', '--product', choices=PRODUCTS, default=PROD_FENIX, help="which product to work on") + description=( + "Easily enable start up profiling using the Firefox Profiler. Finish capturing the profile in " + "about:debugging on desktop. See " + "https://profiler.firefox.com/docs/#/./guide-remote-profiling?id=startup-profiling for " + "details." + ) + ) + p.add_argument( + "command", + choices=["activate", "deactivate"], + help=( + "whether to activate or deactive start up " + "profiling for the given release channel" + ), + ) + p.add_argument( + "release_channel", + choices=["nightly", "beta", "release", "debug"], + help=( + "the release channel to " + "change the startup profiling state of the command on" + ), + ) + + p.add_argument( + "-p", + "--product", + choices=PRODUCTS, + default=PROD_FENIX, + help="which product to work on", + ) return p.parse_args() @@ -51,48 +72,52 @@ def push(id, filename): with config.file as f: f.write(GV_CONFIG) - print('Pushing {} to device.'.format(filename)) - run(['adb', 'push', config.name, os.path.join(PATH_PREFIX, filename)]) - run(['adb', 'shell', 'am', 'set-debug-app', '--persistent', id]) - print('\nStartup profiling enabled on all future start ups, possibly even after reinstall.') - print('Call script with `deactivate` to disable it.') - print('DISABLE \'Remote debugging via USB\' IN THE APP SETTINGS BEFORE STARTING THE APP & RE-ENABLE TO CAPTURE THE PROFILE.', - 'This avoids the additional overhead added when \'Remote debugging via USB\' is enabled during start up.', - sep=os.linesep) + print("Pushing {} to device.".format(filename)) + run(["adb", "push", config.name, os.path.join(PATH_PREFIX, filename)]) + run(["adb", "shell", "am", "set-debug-app", "--persistent", id]) + print( + "\nStartup profiling enabled on all future start ups, possibly even after reinstall." + ) + print("Call script with `deactivate` to disable it.") + print( + "DISABLE 'Remote debugging via USB' IN THE APP SETTINGS BEFORE STARTING THE APP & RE-ENABLE TO CAPTURE THE PROFILE.", + "This avoids the additional overhead added when 'Remote debugging via USB' is enabled during start up.", + sep=os.linesep, + ) finally: os.remove(config.name) def remove(filename): - print('Removing {} from device.'.format(filename)) - run(['adb', 'shell', 'rm', PATH_PREFIX + '/' + filename]) - run(['adb', 'shell', 'am', 'clear-debug-app']) + print("Removing {} from device.".format(filename)) + run(["adb", "shell", "rm", PATH_PREFIX + "/" + filename]) + run(["adb", "shell", "am", "clear-debug-app"]) def convert_channel_to_id(product, channel): if product == PROD_FENIX: mapping = { - 'release': 'org.mozilla.firefox', - 'beta': 'org.mozilla.firefox_beta', - 'nightly': 'org.mozilla.fenix', - 'debug': 'org.mozilla.fenix.debug' + "release": "org.mozilla.firefox", + "beta": "org.mozilla.firefox_beta", + "nightly": "org.mozilla.fenix", + "debug": "org.mozilla.fenix.debug", } return mapping[channel] elif product == PROD_GVE: - return 'org.mozilla.geckoview_example' + return "org.mozilla.geckoview_example" def main(): args = parse_args() id = convert_channel_to_id(args.product, args.release_channel) - filename = id + '-geckoview-config.yaml' + filename = id + "-geckoview-config.yaml" - if args.command == 'activate': + if args.command == "activate": push(id, filename) - elif args.command == 'deactivate': + elif args.command == "deactivate": remove(filename) -if __name__ == '__main__': +if __name__ == "__main__": main() From 081d0019937bff5dbf9810fb1eaf11a5eafbfb8d Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Wed, 12 Jul 2023 12:15:33 -0400 Subject: [PATCH 069/207] Bug 1842916 - Expose WebExtensionInstallException.UserCancelled. --- .../java/org/mozilla/fenix/addons/AddonsManagementFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index f6d41095b..6f831415e 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -20,6 +20,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch +import mozilla.components.concept.engine.webextension.WebExtensionInstallException import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.AddonManagerException import mozilla.components.feature.addons.ui.AddonsManagerAdapter @@ -219,7 +220,7 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) onError = { _, e -> this@AddonsManagementFragment.view?.let { view -> // No need to display an error message if installation was cancelled by the user. - if (e !is CancellationException) { + if (e !is CancellationException && e !is WebExtensionInstallException.UserCancelled) { val rootView = activity?.getRootView() ?: view context?.let { showSnackBar( From 7f8bff037029e3c32340fc9e175889ff12658e9f Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Thu, 13 Jul 2023 10:28:26 +0200 Subject: [PATCH 070/207] Bug 1843243 - Mark nimbus onboarding strings as unused --- app/src/main/res/values/strings.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f911d9c9c..4b39d6bf4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -285,51 +285,51 @@ Not now - + - Make %s your go-to browser + Make %s your go-to browser Make Firefox your go-to browser - %1$s puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our %2$s. + %1$s puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our %2$s. Firefox puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our privacy notice. - privacy notice + privacy notice - Set as default browser + Set as default browser - Not now + Not now - Hop from phone to laptop and back + Hop from phone to laptop and back - Grab tabs and passwords from your other devices to pick up where you left off. + Grab tabs and passwords from your other devices to pick up where you left off. - Sign in + Sign in - Not now + Not now - Notifications help you do more with %s + Notifications help you do more with %s Notifications help you do more with Firefox - Send tabs between devices, manage downloads, and get tips on getting the most out of %s. + Send tabs between devices, manage downloads, and get tips on getting the most out of %s. Send tabs between devices, manage downloads, and get tips on getting the most out of Firefox. - Turn on notifications + Turn on notifications - Not now + Not now From 451e2a5dcd39adcc272f26f87eb057b77460d0ab Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 13 Jul 2023 00:03:36 +0000 Subject: [PATCH 071/207] Import translations from android-l10n --- app/src/main/res/values-dsb/strings.xml | 25 ++-- app/src/main/res/values-gn/strings.xml | 19 +-- app/src/main/res/values-hsb/strings.xml | 25 ++-- app/src/main/res/values-is/strings.xml | 21 +--- app/src/main/res/values-lo/strings.xml | 25 ++-- app/src/main/res/values-oc/strings.xml | 21 +--- app/src/main/res/values-rm/strings.xml | 25 ++-- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sq/strings.xml | 151 +++++++++++++----------- 9 files changed, 133 insertions(+), 181 deletions(-) diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index a362d362c..6915eb71f 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -424,18 +424,12 @@ Napšašowanje pósłaś - Reducěrowanje cookiejowych chórgojow - Wó pódpěru za toś to sedło pšosyś? - Napšašowanje na sedło pomocy jo se wótpósłało. - Napšašowanje pósłane Za toś to sedło zmóžnjony - Napšašowanje na sedło pomocy jo se wótpósłało - Pšosba wó pódpěru pósłana Sedło se tuchylu njepódpěra @@ -443,8 +437,6 @@ Reducěrowanje cookiejowych chórgojow za %1$s zmóžniś? Reducěrowanje cookiejowych chórgojow za %1$s znjemóžniś? - - Toś to sedło se tuchylu pśez redukciju cookiejowych chórgojow. Cośo, až naš team toś to websedło pśeglědujo a pomoc w pśichoźe pśidawa? %1$s njamóžo cookiejowe napšašowanja na toś tom sedle awtomatiski wótpokazaś. Móžośo pšosbu wó pódpěru toś togo sedła w pśichoźe pósłaś. @@ -548,6 +540,11 @@ Nigda Eksterny zastojnik ześěgnjenjow + + Protokole Gecko zmóžniś + + Nałoženje se kóńcy, aby se změny wustatkowali … + Dodanki @@ -1207,6 +1204,10 @@ Ako PDF składowaś PDF njedajo se napóraś + + Njedajo se śišćaś + + Śišćaś Rědoju pósłaś @@ -1495,12 +1496,8 @@ Šćitowe nastajenja Pólěpšony slědowański šćit - - Pśeglědujśo bźez togo, aby wam slědowało Něnto z dospołnm šćitom pśeśiwo cookiejam, našeju nejmócnjejšeju barieru pśeśiwo sedła pśesegajucym slědowakam. - - Wobchowajśo swóje daty za sebje. %s was pśed wjele z nejcesćejych pśeslědowakow šćita, kótarež slěduju, což online gótujośo. %s was pśed wjele z nejcesćejych pśeslědowakow šćita, kótarež slěduju, což online gótujośo. @@ -1508,16 +1505,12 @@ Standard - Wuwažony za priwatnosć a wugbaśe. Boki se normalnje zacytaju. - Boki se normalnje zacytaju, ale blokěrujo se mjenjej pśeslědowakow. Co se pśez standardny slědowański šćit blokěrujo? Striktny - Blokěrujo dalšne pśeslědowaki, aby se boki malsnjej zacytali, ale někotare boki snaź korektnje njefunkcioněruju. - Mócnjejšy slědowański šćit a malsnjejše wugbaśe, ale někotare sedła snaź pórědnje njefunlcioněruju. Co se pśez striktny slědowański šćit blokěrujo? diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 3d35b5242..16ad2bbd6 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -429,18 +429,12 @@ Emondo mba’ejerure - Kookie Banner Ñemomichĩ - ¿Ejerure pytyvõ ko tendápe g̃uara? - Emba’ejerure oñepytyvõ hag̃ua tenda. - Mba’ejerure mondopyre Hendy ko tendápe - Emba’ejerure oñepytyvõ hag̃ua tenda - Mba’ejerure pytyvõrã mondopyre Tenda ko’ág̃a ojokupyty’ỹva @@ -449,8 +443,6 @@ ¿Embogue kookie ñemurã momichĩ %1$s peg̃uarã? - - Ko tenda ndojokupytýi ko’ág̃a kookie marandu ñemomichĩre. ¿Ejeruresépa ore atýpe tohecha ñanduti renda ha embojuaju ñepytyvõ tenonderã gotyo? %1$s nomboykekuaái ijehegui kookie marandu ñemurã ko tendápe. Emba’ejerurekuaa omoneĩ hag̃ua ko tenda tenonderãve. @@ -554,6 +546,7 @@ Araka’eve Mboguejy okaygua ñangarekoha + Moĩmbaha @@ -1227,6 +1220,8 @@ Eñongatu PDF ramo Nderejapokuaái PDF + + Mbokuatia Emondo mba’e’okápe @@ -1526,12 +1521,8 @@ Ñemboheko ñemo’ãgua Tapykueho mo’ãha iporãvéva - - Eikundaha ejehapykueho’ỹre Ko’ág̃a Total Cookie Protection ñemo’ã ndive, ore mba’ejokoha imbaretevéva jehapykueho tenda juasapyréva rovake. - - Emo’ã ne mba’ekuaarã. %s nemo’ãta heta tapykuehohágui ohecháva mba’etépa ejapo ñandutípe. %s nemo’ãta heta tapykuehohágui ohecháva mba’etépa ejapohína ñandutípe. @@ -1540,16 +1531,12 @@ Ypyguaite (ijypygua) - Imbytéva ñemo’ã ha tembiapokuépe g̃uarã. Umi kuatiarogue henyhẽta hekoitépe. - Kuatiarogue henyhẽta tapiaguáicha, hákatu ojoko’ivéta tapykuehoha. Mba’e umi ojokóva tapykuehoha moãha ypyguáva renondépe Mbaretépe - Ejoko tapykuehoha kuatiarogue henyhẽ pya’eve hag̃ua, hákatu ojavykuaa peteĩva kuatiarogue rembiapoite. - Tapykuehoha iporãvéva ñemo’ã rovake ha apopykuaave, hákatu ikatu heta tenda nomba’poporãi. Mba’e umi ojokóva tapykuehoha mo’ãha imbaretéva diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index b857bd2ba..a82f6ab7e 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -424,18 +424,12 @@ Naprašowanje pósłać - Redukowanje plackowych chorhojow - Wo podpěru za tute sydło prosyć? - Naprašowanje na sydło pomocy je so wotpósłało. - Naprašowanje pósłane Za tute sydło zmóžnjeny - Naprašowanje na sydło pomocy je so wotpósłało - Próstwa wo podpěru pósłana Sydło so tuchwilu njepodpěruje @@ -443,8 +437,6 @@ Redukowanje plackowych chorhojow za %1$s zmóžnić? Redukowanje plackowych chorhojow za %1$s znjemóžnić? - - Tute sydło so tuchwilu přez redukciju plackowych chorhojow. Chceće, zo naš team tute websydło přepruwuje a pomoc w přichodźe přidawa? %1$s njemóže plackowe naprašowanja na tutym sydle awtomatisce wotpokazać. Móžeće próstwu wo podpěru tutoho sydła w přichodźe pósłać. @@ -549,6 +541,11 @@ Ženje Eksterny zrjadowak sćehnjenjow + + Protokole Gecko zmóžnić + + Nałoženje so kónči, zo bychu so změny wuskutkowali … + Přidatki @@ -1211,6 +1208,10 @@ Jako PDF składować PDF njeda so wutworić + + Njeda so ćišćeć + + Ćišćeć Na grat pósłać @@ -1502,12 +1503,8 @@ Škitne nastajenja Polěpšeny slědowanski škit - - Přehladujće bjez toho, zo by wam slědowało Nětko z dospołnym škitom přećiwo plackam, našej najmócnišej barjeru přećiwo sydła přesahowacym slědowakam. - - Wobchowajće swoje daty za sebje. %s was před wjele z najhusćišich přesćěhowakow škita, kotrež slěduja, štož online činiće. %s was před wjele z najhusćišich přesćěhowakow škita, kotrež slěduja, štož online činiće. @@ -1515,16 +1512,12 @@ Standard - Wuwaženy za priwatnosć a wukon. Strony so normalnje začitaja. - Strony so normalnje začitaja, ale blokuje so mjenje přesćěhowakow. Što so přez standardny slědowanski škit blokuje? Striktny - Blokuje dalše přesćěhowaki, zo bych so strony spěšnišo začitali, ale někotre strony snano korektnje njefunguja. - Sylniši slědowanski škit a spěšniši wukon, ale někotre sydła snano porjadnje njefunguja. Što so přez striktny slědowanski škit blokuje? diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 55bb968f0..5196a414a 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -424,18 +424,12 @@ Senda beiðni - Fækkun vefkökuborða - Biðja um stuðning við þessa síðu? - Beiðni um stuðning við vefsvæði lögð fram. - Beiðni send Kveikt fyrir þetta vefsvæði - Beiðni um stuðning við vefsvæði lögð fram - Stuðningsbeiðni send Vefsvæðið er ekki stutt í augnablikinu @@ -444,8 +438,6 @@ Viltu slökkva á fækkun vefkökuborða fyrir %1$s? - - Þetta vefsvæði styður ekki sem stendur fækkun vefkökuborða. Viltu biðja um að teymið okkar skoði þetta vefsvæði og bæti við stuðningi í framtíðinni? %1$s getur ekki hafnað sjálfvirkt vefkökubeiðnum á þessari síðu. Þú getur sent beiðni um stuðning við þessa síðu. @@ -549,6 +541,11 @@ Aldrei Utanaðkomandi niðurhalsstjóri + + Virkja Gecko-atvikaskráningar + + Hætti í forritinu til að virkja breytingar… + Viðbætur @@ -1497,12 +1494,8 @@ Verndarstillingar Aukin rakningarvörn - - Vafraðu án þess að fylgst sé með þér Er nú með allsherjar vefkökuvörn (Total Cookie Protection), öflugustu hindrun okkar hingað til gegn rakningu á milli vefsvæða. - - Haltu þínum gögnum fyrir sjálfan þig. %s verndar þig fyrir mörgum algengustu rekjurum sem fylgjast með því sem þú gerir á netinu. %s verndar þig fyrir mörgum algengustu rekjurum sem fylgjast með því sem þú gerir á netinu. @@ -1510,16 +1503,12 @@ Staðlað (sjálfgefið) - Jafnvægi milli næðis og afkasta. Síður hlaðast eðlilega. - Síður hlaðast eðlilega en loka á færri rekjara. Hvað er útilokað með stöðluðum rekjaravörnum Strangt - Lokar fyrir fleiri rekjara svo síður hlaðast hraðar, en einhver virkni á síðunni gæti rofnað. - Sterkari varnir gegn rekjurum og meiri afköst, en sumar síður virka kannski ekki eðlilega. Hvað er útilokað með strangari rekjaravörnum diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 34388a34a..18b038c83 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -424,18 +424,12 @@ ສົ່ງ​ຄໍາ​ຂໍ - ການຫຼຸດປ້າຍໂຄສະນາຄຸກກີ - ຮ້ອງຂໍການສະຫນັບສະຫນູນສໍາລັບເວັບໄຊທ໌ນີ້ບໍ? - ຮ້ອງຂໍໃຫ້ສະຫນັບສະຫນູນເວັບໄຊທີ່ສົ່ງ. - ສົ່ງຄຳຮ້ອງຂໍແລ້ວ ເປິດສຳລັບເວັບໄຊນີ້ - ຮ້ອງຂໍໃຫ້ສະຫນັບສະຫນູນເວັບໄຊທີ່ສົ່ງ - ສົ່ງຄຳຮ້ອງຂໍການຊ່ວຍເຫຼືອແລ້ວ ຕອນນີ້ບໍ່ຮອງຮັບເວັບໄຊ @@ -443,8 +437,6 @@ ເປີດໃຊ້ການຫຼຸດປ້າຍໂຄສະນາຄຸກກີສຳລັບ %1$s ບໍ? ປິດການຫຼຸດປ້າຍໂຄສະນາຄຸກກີສຳລັບ %1$s ບໍ? - - ຕອນນີ້ເວັບໄຊນີ້ບໍ່ຮອງຮັບການຫຼຸດປ້າຍໂຄສະນາຄຸກກີ. ທ່ານຕ້ອງການໃຫ້ທີມງານຂອງພວກເຮົາທົບທວນຄືນເວັບໄຊທ໌ນີ້ແລະເພີ່ມການສະຫນັບສະຫນູນໃນອະນາຄົດບໍ? %1$s ບໍ່ສາມາດປະຕິເສດຄຳຮ້ອງຂໍຄຸກກີໃນເວັບໄຊນີ້ໄດ້ໂດຍອັດຕະໂນມັດ. ທ່ານສາມາດສົ່ງຄໍາຮ້ອງຂໍເພື່ອສະຫນັບສະຫນູນເວັບໄຊທ໌ນີ້ໃນອະນາຄົດ. @@ -550,6 +542,11 @@ ບໍ່ເຄີຍ ຕົວຈັດການດາວໂຫລດພາຍນອກ + + ເປີດໃຊ້ບັນທຶກ Gecko + + ກຳລັງອອກຈາກແອັບພລິເຄຊັນເພື່ອນຳໃຊ້ການປ່ຽນແປງ… + Add-ons @@ -1219,6 +1216,10 @@ ບັກທຶກເປັນ PDF ບໍ່ສາມາດສ້າງ PDF ໄດ້ + + ບໍ່ສາມາດພິມໄດ້ + + ພິມ ສົ່ງໄປຫາອຸປະກອນ @@ -1518,12 +1519,8 @@ ຕັ້ງຄ່າການປ້ອງກັນ ເພີ່ມການປ້ອງກັນການຕິດຕາມ - - ທ່ອງເວັບໂດຍບໍ່ມີການຕິດຕາມ ຕອນນີ້ມີການປົກປ້ອງຄຸກກີ້ທັງໝົດ, ເປັນອຸປະສັກທີ່ມີປະສິດທິພາບທີ່ສຸດຂອງພວກເຮົາຕໍ່ກັບຕົວຕິດຕາມຂ້າມເວັບໄຊ. - - ຮັກສາຂໍ້ມູນຂອງທ່ານໃຫ້ກັບຕົວທ່ານເອງ. %s ປົກປ້ອງທ່ານຈາກຫຼາຍຕົວຕິດຕາມທົ່ວໄປທີ່ສຸດທີ່ຕິດຕາມສິ່ງທີ່ທ່ານເຮັດອອນໄລນ໌. %s ປົກປ້ອງທ່ານຈາກຫຼາຍຕົວຕິດຕາມທົ່ວໄປທີ່ສຸດທີ່ຕິດຕາມສິ່ງທີ່ທ່ານເຮັດອອນໄລນ໌. @@ -1531,16 +1528,12 @@ ມາດຕະຖານ (ຄ່າພື້ນຖານ) - ຄວາມເປັນສ່ວນຕົວ ແລະ ປະສິດທິພາບແບບສົມດຸ່ນ. ໜ້າເວັບຈະໂຫຼດເປັນປົກະຕິ. - ຫນ້າຕ່າງໆຈະໂຫລດຕາມປົກກະຕິ, ແຕ່ບລັອກຕົວຕິດຕາມຫນ້ອຍລົງ. ສິ່ງທີ່ຈະຖືກບັອກໂດຍການປ້ອງກັນການຕິດຕາມແບບມາດຕະຖານ ເຂັ້ມງວດ - ປິດກັ້ນຕົວຕິດຕາມຫຼາຍຂຶ້ນເພື່ອໃຫ້ຫນ້າໂຫລດໄວຂຶ້ນ, ແຕ່ບາງຫນ້າທີ່ຢູ່ໃນຫນ້າອາດຈະພັງ. - ການປ້ອງກັນການຕິດຕາມທີ່ເຂັ້ມແຂງແລະປະສິດທິພາບໄວຂຶ້ນ, ແຕ່ບາງສະຖານທີ່ອາດຈະເຮັດວຽກບໍ່ຖືກຕ້ອງ. ສິ່ງທີ່ຈະຖືກບັອກໂດຍການປ້ອງກັນການຕິດຕາມຢ່າງເຂັ້ມງວດ diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 4f2b198a7..23130f3fe 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -425,18 +425,12 @@ Enviar la demanda - Reduccion de las bandièras de cookies - Demandar la presa en carga d’aqueste site ? - La demanda de presa en carga es estada enviada. - Demanda enviada Activada per aqueste site - La demanda de presa en carga del site es estada enviada - Demanda de presa en carga enviada Site actualament pas pres en carga @@ -445,8 +439,6 @@ Desactivar la reduccion de las bandièras de cookies per %1$s ? - - Aqueste site es actualament pas pres en carga per la reduccion de banièras de cookies. Volètz que nòstra còla verifique aqueste site e d’apondre sa compatibilitat pel futur ? %1$s pòt pas refusar automaticament las demandas de cookies per aqueste site. Podètz enviar una demanda de presa en carga d’aqueste site pel futur. @@ -552,6 +544,11 @@ Pas jamai Gestionari de telecargament extèrn + + Activar los jornals Gecko + + Tampadura de l’aplicacion per aplicar las modificacions… + Moduls complementaris @@ -1522,12 +1519,8 @@ Paramètres de proteccion Proteccion renfortida contra lo seguiment - - Navegatz sens èsser seguit Ara amb una proteccion totala de cookies, nòstra barrièra mai potenta pel moment contra los traçadors intersites. - - Gardatz vòstras donadas per vos. %s vos protegís de la màger part dels traçadors mai comuns que vos seguisson en linha. %s vos protegís de la màger part dels traçadors mai comuns que vos seguisson en linha. @@ -1535,16 +1528,12 @@ Estandarda (per defaut) - Equilibri entre confidencialitat e performança. Las pagina cargaràn normalament. - Se cargaràn normalament las paginas mas blocaràn mens de traçadors. Çò que la proteccion contra lo seguiment estandarda bloca Estricta - Bloca mai de traçadors, accelèra la cargament de las paginas mas d’unas pòdon quitar de foncionar. - Una proteccion renfortida contra lo seguiment e de performanças melhoras, mas d’unes sites pòdon quitar de foncionar. Çò que la proteccion contra lo seguiment estricta bloca diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index e4853fe82..6fdcd558c 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -420,18 +420,12 @@ Trametter la dumonda - Reducziun da bandieras da cookies - Dumandar da sustegnair era questa website? - La dumonda da sustegnair la website è tramessa. - Tramess la dumonda Activà per questa website - Tramess la dumonda da sustegnair la website - Tramess la dumonda da sustegnair Questa website na vegn actualmain betg sustegnida @@ -440,8 +434,6 @@ Activar la reducziun da bandieras da cookies per %1$s? Deactivar la reducziun da bandieras da cookies per %1$s? - - Questa website na vegn actualmain betg sustegnida da la reducziun da bandieras da cookies. Vuls ti che noss team intercureschia questa website per la sustegnair en l\'avegnir? %1$s na po betg refusar automaticamain dumondas da deponer cookies da questa website. Ti pos trametter ina dumonda da sustegnair questa website en avegnir. @@ -544,6 +536,11 @@ Mai Administraziun da telechargiadas externa + + Activar la protocollaziun da Gecko + + Serrar l\'applicaziun per applitgar las midadas… + Supplements @@ -1195,6 +1192,10 @@ Memorisar sco PDF Impussibel da generar il PDF + + Impussibel da stampar + + Stampar Trametter a l\'apparat @@ -1490,13 +1491,9 @@ Parameters da protecziun Protecziun avanzada cunter il fastizar - - Navighescha senza persequitaders Ussa cun la protecziun totala cunter cookies, enfin ussa nossa bloccada la pli effectiva da cookies che vulan ta persequitar sur pliras websites. - - Tegna per tai tias datas. %s ta protegia da blers dals fastizaders ils pli frequents che registreschan tias activitads online. %s ta protegia da blers dals fastizaders ils pli frequents che registreschan tias activitads online. @@ -1505,16 +1502,12 @@ Standard (predefinì) - Equiliber tranter protecziun da datas e prestaziun. Paginas chargian normal. - Paginas vegnan chargiadas normal, ma damain fastizaders vegnan bloccads. Quai che vegn bloccà da la protecziun normala cunter il fastizar Restrictiv - Blochescha ulteriurs fastizaders, uschia che paginas chargian pli svelt, ma tschertas paginas na funcziunan eventualmain betg pli endretg. - Ina protecziun pli severa cunter il fastizar e meglra prestaziun, ma tschertas paginas na funcziunan eventualmain betg endretg. Quai che vegn bloccà da la protecziun restrictiva cunter il fastizar diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 649bf5720..73f5088be 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -1943,7 +1943,7 @@ Pripojenie nie je zabezpečené - Vymazať cookies a údaje stránok + Vymazať cookies a údaje stránky %s?]]> diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 8c0a54f41..cade8bcca 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -67,8 +67,6 @@ - Skedën pasuese private hape me një prekje. - Skedën tuaj pasuese private hape me një prekje. Shtoje te skena e Kreut @@ -125,6 +123,9 @@ Skedë e re private + + Shkurtore fjalëkalimesh + Hidhu mbrapa @@ -248,7 +249,7 @@ %s do të ndajë gjithçka shtypni te shtylla e adresave me motorin tuaj parazgjedhje të kërkimeve. - + Kërko me %s Kërkoni drejt e nga shtylla e adresave @@ -256,12 +257,12 @@ Rregullime mbi kërkimin - - Kërkimi këtë herë: - Këtë herë kërko te: + + Motor kërkimesh %s + Njihuni me faqen tuaj hyrëse të personalizuar. Këtu do të shfaqen skeda të hapura së fundi, faqerojtës dhe përfundime kërkimi. @@ -299,37 +300,49 @@ - Bëjeni %s shfletuesin tuaj të zemrës + Bëjeni %s shfletuesin tuaj të zemrës + + Bëjeni Firefox-in shfletuesin tuaj të zemrës - %1$s vë njerëzit mbi fitimet dhe mbron privatësinë tuaj duke bllokuar gjurmues nga sajti në sajt.\n\nMësoni më tepër te %2$s ynë. + %1$s vë njerëzit mbi fitimet dhe mbron privatësinë tuaj duke bllokuar gjurmues nga sajti në sajt.\n\nMësoni më tepër te %2$s ynë. + + Firefox-i vë njerëzit mbi fitimet dhe mbron privatësinë tuaj duke bllokuar gjurmues nga sajti në sajt.\n\nMësoni më tepër te shënimi ynë mbi privatësinë. - shënim mbi privatësinë + shënim mbi privatësinë - Vëre si shfletuesin parazgjedhje + Vëre si shfletuesin parazgjedhje - Jo tani + Jo tani - Kaloni nga telefoni në portativ, ose anasjelltas + Kaloni nga telefoni në portativ, ose anasjelltas - Merrni skeda dhe fjalëkalim nga pajisjet tuaja të tjera, për të vazhduar atje ku e latë. + Merrni skeda dhe fjalëkalim nga pajisjet tuaja të tjera, për të vazhduar atje ku e latë. - Hyni + Hyni - Jo tani + Jo tani - Njoftimet ju ndihmojnë të arrini më tepër gjëra me %s + Njoftimet ju ndihmojnë të arrini më tepër gjëra me %s + + Njoftimet ju ndihmojnë të arrini më tepër gjëra me Firefox-in - Dërgoni skeda nga pajisje në pajisje, administroni shkarkime dhe merrni ndihmëza se si të përfitoni maksimumin nga %s. + Dërgoni skeda nga pajisje në pajisje, administroni shkarkime dhe merrni ndihmëza se si të përfitoni maksimumin nga %s. + + Dërgoni skeda nga pajisje në pajisje, administroni shkarkime dhe merrni ndihmëza se si të përfitoni maksimumin nga Firefox-i. - Aktivizoni njoftimet + Aktivizoni njoftimet - Jo tani + Jo tani @@ -350,6 +363,14 @@ Të përgjithshme Mbi + + Përzgjidhni një + + Administroni shkurtore kërkimi + + Përpunoni dukshmëri motorësh te menuja e kërkimeve + + Motorë të dukshëm te menuja e kërkimeve Motor parazgjedhje kërkimesh @@ -395,11 +416,23 @@ %1$s provon vetvetiu të hedhë oshtë kërkesa depozitimi cookie -sh nga banderola cookie-sh. Çaktivizuar për këtë sajt + + Anuloje + + Kërkoni asistencë + + Dërgo kërkesë + + Të kërkohet asistencë për këtë sajt? + + Kërkesa u dërgua Aktivizuar për këtë sajt + + Kërkesa për asistencë u dërgua - Sajt aktualisht i pambuluar + Sajt aktualisht i pambuluar Të aktivizohet Reduktim Banderolash Cookie-sh për %1$s? @@ -407,46 +440,22 @@ %1$s do të spastrojë cookie-t për këtë sajt dhe do të rifreskojë faqen. Spastrimi i krejt cookie-ve mund të sjellë nxjerrjen tuaj nga llogaria, ose zbrazje shportash blerjesh. - - %1$s mund të provojë vetvetiu të hedhë poshtë kërkesa depozitimi cookie-sh. %1$s provon të hedhë poshtë automatikisht krejt kërkesat për cookies, në sajtet që e mbulojnë. - - Lamtumirë banderola cookie-sh! Të lejohet %1$s të hedhë poshtë banderola cookie-sh? - - Hidh vetvetiu tej kërkesa për depozitim cookie-sh, kur është e mundur. - - Të lejohet %1$s të hedhë tej vetvetiu kërkesa për depozitim cookie-sh, kur është e mundur? %1$s mund të hedhë vetvetiu poshtë mjaft kërkesa banderolash cookie-sh. Jo Tani - - Hidh tej banderola Do të shihni më pak kërkesa depozitimi cookie-sh - - Shihni më pak flluska cookie-sh - - Përgjigju vetvetiu flluskave për cookie, për shfletim pa bezdisje. %1$s do të hedhë poshtë krejt kërkesat, në qoftë e mundur. - - Hidh tej Flluska - - Reduktim Banderolash Për Cookie-t - - Të lejohet %1$s të hedhë poshtë kërkesa pranimi cookie-sh nëse është e mundur? - - Lejoje Lejoje Përpiqet automatikisht të lidhet me sajtet duke përdorur protokollin HTTPS të fshehtëzimit, për më tepër siguri. - - On Off @@ -530,6 +539,7 @@ Kurrë Përgjegjës i jashtëm shkarkimesh + Shtesa @@ -613,6 +623,8 @@ Shtesa është tashmë e instaluar + + Administroni llogarinë Njëkohësoje tani @@ -757,15 +769,9 @@ Anuloje - - %d sajt %d faqe - - %d sajte @@ -1095,8 +1101,6 @@ E bllokuar nga Android Përjashtime - - On Off @@ -1190,6 +1194,10 @@ Ruaje si PDF S’arrihet të prodhohet PDF + + S’arrihet të shtypet + + Shtypni Dërgojeni në pajisje @@ -1259,11 +1267,11 @@ - Ju lutemi, ndihmoni të bëhet Firefox-i më i mirë, duke plotësuar këtë pyetësor të shkurtër. + Ju lutemi, ndihmoni të bëhet Firefox-i më i mirë, duke plotësuar këtë pyetësor të shkurtër. - Plotësoni Pyetësorin + Plotësoni Pyetësorin - Jo, Faleminderit + Jo, Faleminderit @@ -1358,7 +1366,9 @@ Interval kohor për t’u fshirë - Heq historikun (përfshi historik të njëkohësuar prej pajisjesh të tjera), cookie-t dhe të tjera të dhëna shfletimi. + Heq historikun (përfshi historik të njëkohësuar prej pajisjesh të tjera), cookie-t dhe të tjera të dhëna shfletimi. + + Heq historikun (përfshi historik të njëkohësuar prej pajisjesh të tjera) Orën e fundit @@ -1480,30 +1490,22 @@ Rregullime për Mbrojtje Mbrojtje e Thelluar Nga Gjurmimi - - Shfletoni pa qenë i ndjekur - Tashmë me Mbrojtje Totale Nga Cookie-t, barriera jonë më e fuqishme deri më sot kundër gjurmuesve nga sajti në sajt. - - Mbajini për vete të dhënat tuaja. %s ju mbron nga shumë prej gjurmuesve më të rëndomtë që ndjekin ç’bëni në internet. + Tashmë me Mbrojtje Totale Nga Cookie-t, barriera jonë më e fuqishme deri më sot kundër gjurmuesve nga sajti në sajt. - %s ju mbron nga shumë prej gjurmuesve më të rëndomtë që ndjekin ç’bëni në internet. + %s ju mbron nga shumë prej gjurmuesve më të rëndomtë që ndjekin ç’bëni në internet. Mësoni më tepër Standarde (parazgjedhje) - I baraspeshuar për privatësi dhe funksionim. Faqet do të ngarkohen normalisht. - - Faqet do të ngarkohen normalisht, por blloko më pak gjurmues. + Faqet do të ngarkohen normalisht, por blloko më pak gjurmues. Ç’bllokohet nga mbrojtje standarde kundër gjurmimit Strikte - Bllokon më shumë gjurmues, ndaj faqet ngarkohen më shpejt, por disa anë, pjesë e faqes, mund të mos punojnë. - - Mbrojtje më e fortë kundër gjurmimit dhe punim më i shpejtë, por disa sajte mund të mos funksionojnë siç duhet. + Mbrojtje më e fortë kundër gjurmimit dhe punim më i shpejtë, por disa sajte mund të mos funksionojnë siç duhet. Ç’bllokohet nga mbrojtje strikte kundër gjurmimit @@ -1854,6 +1856,8 @@ Shtoni motor kërkimesh + + Shtoni motor të ri kërkimesh Përpunoni motor kërkimesh @@ -1867,16 +1871,27 @@ Tjetër + + Emër Emër + + Emër motori kërkimesh + + URL vargu kërkimi Varg kërkimi për t’u përdorur + + URL për t’u përdorur për kërkim Zëvendësoni kërkesën me “%s”. Shembull:\nhttps://www.google.com/search?q=%s Hollësi motori vetjak kërkimesh + + Ruaje + Jepni emër motori kërkimesh From b2792835680f2061ea21c0d7c33b6a077d6dc317 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Thu, 13 Jul 2023 12:02:56 +0200 Subject: [PATCH 072/207] Bug 1843245 - Mark unused onboarding strings for removal --- app/src/main/res/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b39d6bf4..ccf80a418 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -288,14 +288,14 @@ - Make %s your go-to browser + Make %s your go-to browser Make Firefox your go-to browser - %1$s puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our %2$s. + %1$s puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our %2$s. Firefox puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our privacy notice. @@ -316,13 +316,13 @@ Not now - Notifications help you do more with %s + Notifications help you do more with %s Notifications help you do more with Firefox - Send tabs between devices, manage downloads, and get tips on getting the most out of %s. + Send tabs between devices, manage downloads, and get tips on getting the most out of %s. Send tabs between devices, manage downloads, and get tips on getting the most out of Firefox. From c12f7e6c03bfbbc50999b96a1207b3545a24f9a8 Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Thu, 13 Jul 2023 11:33:34 +0300 Subject: [PATCH 073/207] Bug 1842768 - Enable 'Report site issue' related tests --- app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt | 2 -- .../java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt index c4a7f8f0d..576e11a5c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTest.kt @@ -6,7 +6,6 @@ import mozilla.components.concept.engine.utils.EngineReleaseChannel import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -154,7 +153,6 @@ class MainMenuTest { } } - @Ignore("Failing, see https://bugzilla.mozilla.org/show_bug.cgi?id=1842719") @SmokeTest @Test fun mainMenuReportSiteIssueTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 73eb16c22..0847cd718 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -99,7 +99,7 @@ class ThreeDotMenuMainRobot { syncAndSaveDataButton, findInPageButton, desktopSiteButton, - // reportSiteIssueButton, + reportSiteIssueButton, addToHomeScreenButton, addToShortcutsButton, saveToCollectionButton, From 4a1ece8611ffaa06975dd38e4a0a21f98344e70f Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Tue, 11 Jul 2023 18:10:11 +0300 Subject: [PATCH 074/207] Bug 1842177 - Update search engines tests with new unified search UI --- .../org/mozilla/fenix/helpers/TestHelper.kt | 13 ++ .../fenix/ui/ComposeTabbedBrowsingTest.kt | 13 +- .../org/mozilla/fenix/ui/OnboardingTest.kt | 2 +- .../java/org/mozilla/fenix/ui/SearchTest.kt | 153 +++++++++------ .../java/org/mozilla/fenix/ui/SmokeTest.kt | 19 -- .../mozilla/fenix/ui/TabbedBrowsingTest.kt | 13 +- .../mozilla/fenix/ui/robots/HistoryRobot.kt | 50 +---- .../fenix/ui/robots/HomeScreenRobot.kt | 7 +- .../fenix/ui/robots/NavigationToolbarRobot.kt | 30 ++- .../mozilla/fenix/ui/robots/SearchRobot.kt | 179 +++--------------- .../ui/robots/SettingsSubMenuSearchRobot.kt | 13 +- 11 files changed, 194 insertions(+), 298 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt index 6e6d43443..a598a2c5f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -57,6 +57,7 @@ import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers.allOf import org.hamcrest.Matcher import org.junit.Assert +import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.Config @@ -485,4 +486,16 @@ object TestHelper { mDevice.pressRecentApps() mDevice.findObject(UiSelector().resourceId("$packageName:id/container")).waitForExists(waitingTime) } + + fun verifyKeyboardVisibility(isExpectedToBeVisible: Boolean = true) { + mDevice.waitForIdle() + + assertEquals( + "Keyboard not shown", + isExpectedToBeVisible, + mDevice + .executeShellCommand("dumpsys input_method | grep mInputShown") + .contains("mInputShown=true"), + ) + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt index 208cbf5f0..12d554f8a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt @@ -18,6 +18,7 @@ import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton +import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.homeScreen @@ -355,10 +356,10 @@ class ComposeTabbedBrowsingTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openTabButtonShortcutsMenu { }.openNewPrivateTabFromShortcutsMenu { - verifyKeyboardVisible() - verifyFocusedNavigationToolbar() + verifyKeyboardVisibility() + verifySearchBarPlaceholder("Search or enter address") // dismiss search dialog - homeScreen { }.pressBack() + }.dismissSearchBar { verifyCommonMythsLink() verifyNavigationToolbar() } @@ -366,10 +367,10 @@ class ComposeTabbedBrowsingTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openTabButtonShortcutsMenu { }.openTabFromShortcutsMenu { - verifyKeyboardVisible() - verifyFocusedNavigationToolbar() + verifyKeyboardVisibility() + verifySearchBarPlaceholder("Search or enter address") // dismiss search dialog - homeScreen { }.pressBack() + }.dismissSearchBar { verifyHomeWordmark() verifyNavigationToolbar() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt index 9e79b229c..6d08bd5a5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt @@ -14,6 +14,7 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper.verifyDarkThemeApplied +import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility import org.mozilla.fenix.helpers.TestHelper.verifyLightThemeApplied import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar @@ -131,7 +132,6 @@ class OnboardingTest { homeScreen { verifyStartBrowsingButton() }.openSearch { - verifyScanButton() verifySearchEngineButton() verifyKeyboardVisibility() }.dismissSearchBar { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 74fb656a8..c384a1b50 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -37,11 +37,14 @@ import org.mozilla.fenix.helpers.TestHelper.grantSystemPermission import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.setCustomSearchEngine +import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility import org.mozilla.fenix.ui.robots.clickContextMenuItem import org.mozilla.fenix.ui.robots.clickPageObject import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.longClickPageObject import org.mozilla.fenix.ui.robots.multipleSelectionToolbar +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.searchScreen /** * Tests for verifying the search fragment @@ -66,6 +69,8 @@ class SearchTest { isRecentTabsFeatureEnabled = false, isTCPCFREnabled = false, isWallpaperOnboardingEnabled = false, + isUnifiedSearchEnabled = true, + newSearchSettingsEnabled = true, ), ) { it.activity } @@ -83,13 +88,37 @@ class SearchTest { } @Test - fun searchScreenItemsTest() { + fun searchBarItemsTest() { + navigationToolbar { + verifyDefaultSearchEngine("Google") + verifySearchBarPlaceholder("Search or enter address") + }.clickUrlbar { + verifyKeyboardVisibility(isExpectedToBeVisible = true) + verifyScanButtonVisibility(visible = true) + verifyVoiceSearchButtonVisibility(enabled = true) + verifySearchBarPlaceholder("Search or enter address") + typeSearch("mozilla ") + verifyScanButtonVisibility(visible = false) + verifyVoiceSearchButtonVisibility(enabled = true) + clickClearButton() + clickSearchSelectorButton() + selectTemporarySearchMethod("Amazon.com") + verifyScanButtonVisibility(visible = false) + verifyVoiceSearchButtonVisibility(enabled = true) + } + } + + @Test + fun searchSelectorMenuItemsTest() { homeScreen { }.openSearch { verifySearchView() - verifySearchToolbar(true) - verifyScanButton() - verifySearchEngineButton() + verifySearchToolbar(isDisplayed = true) + clickSearchSelectorButton() + verifySearchShortcutListContains( + "DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay", + "Bookmarks", "Tabs", "History", "Search settings", + ) } } @@ -128,29 +157,41 @@ class SearchTest { } } + // Verifies a temporary change of search engine from the Search shortcut menu + @SmokeTest + @Test + fun selectSearchEnginesShortcutTest() { + val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay") + + enginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + verifySearchShortcutListContains(it) + selectTemporarySearchMethod(it) + verifySearchEngineIcon(it) + }.submitQuery("mozilla ") { + verifyUrl("mozilla") + }.goToHomescreen {} + } + } + @Test - fun setDefaultSearchEngineFromShortcutsTest() { + fun accessSearchSettingFromSearchSelectorMenuTest() { queryString = "firefox" - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - toggleShowSearchShortcuts() - }.goBack { - }.goBack { - }.openSearch { - scrollToSearchEngineSettings(activityTestRule) - }.clickSearchEngineSettings(activityTestRule) { + searchScreen { + clickSearchSelectorButton() + }.clickSearchEngineSettings { + verifySearchSettingsToolbar() + openDefaultSearchEngineMenu() changeDefaultSearchEngine("DuckDuckGo") + exitMenu() } - - exitMenu() - homeScreen { }.openSearch { }.submitQuery(queryString) { - verifyUrl("duckduckgo.com/?q=firefox") + verifyUrl("firefox") } } @@ -162,7 +203,7 @@ class SearchTest { }.openSearch { typeSearch(queryString) clickClearButton() - verifySearchBarEmpty() + verifySearchBarPlaceholder("Search or enter address") } } @@ -197,7 +238,7 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) } } @@ -245,7 +286,7 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { verifyTestPageUrl(firstPageUrl) verifyTestPageUrl(secondPageUrl) @@ -279,7 +320,7 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) } } @@ -314,10 +355,10 @@ class SearchTest { }.openTabsListThreeDotMenu { }.closeAllTabs { togglePrivateBrowsingModeOnOff() - verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 3) }.openThreeDotMenu { }.openHistory { - verifyHistoryItemExists(false, "3 sites") + verifyHistoryItemExists(shouldExist = false, item = "3 sites") } } @@ -354,7 +395,7 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { clickDeleteHistoryButton(firstPageUrl.toString()) longTapSelectItem(secondPageUrl) @@ -366,7 +407,7 @@ class SearchTest { } homeScreen { // checking that the group is removed when only 1 item is left - verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 1) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 1) } } @@ -401,18 +442,18 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { clickDeleteAllHistoryButton() confirmDeleteAllHistory() verifyDeleteSnackbarText("Group deleted") - verifyHistoryItemExists(false, firstPageUrl.toString()) + verifyHistoryItemExists(shouldExist = false, firstPageUrl.toString()) }.goBack {} homeScreen { - verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3) }.openThreeDotMenu { }.openHistory { - verifySearchGroupDisplayed(false, queryString, 3) + verifySearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3) verifyEmptyHistoryView() } } @@ -449,7 +490,7 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { }.openWebsite(firstPageUrl) { verifyUrl(firstPageUrl.toString()) @@ -502,7 +543,7 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { longTapSelectItem(firstPageUrl) } @@ -524,7 +565,11 @@ class SearchTest { homeScreen { }.openSearch { }.submitQuery(queryString) { - verifyUrl(searchEngineCodes["Google"]!!) + waitForPageToLoad() + }.openThreeDotMenu { + }.openHistory { + // Full URL no longer visible in the nav bar, so we'll check the history record + verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Google"]!!) } } @@ -537,15 +582,19 @@ class SearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { + openDefaultSearchEngineMenu() changeDefaultSearchEngine("Bing") + exitMenu() } - exitMenu() - homeScreen { }.openSearch { }.submitQuery(queryString) { - verifyUrl(searchEngineCodes["Bing"]!!) + waitForPageToLoad() + }.openThreeDotMenu { + }.openHistory { + // Full URL no longer visible in the nav bar, so we'll check the history record + verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Bing"]!!) } } @@ -558,28 +607,24 @@ class SearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { + openDefaultSearchEngineMenu() changeDefaultSearchEngine("DuckDuckGo") + exitMenu() } - - exitMenu() - homeScreen { }.openSearch { }.submitQuery(queryString) { - verifyUrl(searchEngineCodes["DuckDuckGo"]!!) - } - } - - // Expected for en-us defaults - @Test - fun changeSearchEnginesBasedOnTextTest() { - homeScreen { - }.openSearch { - typeSearch("D") - verifySearchEnginePrompt(activityTestRule, "DuckDuckGo") - clickSearchEnginePrompt(activityTestRule, "DuckDuckGo") - }.submitQuery("firefox") { - verifyUrl("duckduckgo.com/?q=firefox") + waitForPageToLoad() + }.openThreeDotMenu { + }.openHistory { + // Full URL no longer visible in the nav bar, so we'll check the history record + // A search group is sometimes created when searching with DuckDuckGo + try { + verifyHistoryItemExists(shouldExist = true, item = searchEngineCodes["DuckDuckGo"]!!) + } catch (e: AssertionError) { + openSearchGroup(queryString) + verifyHistoryItemExists(shouldExist = true, item = searchEngineCodes["DuckDuckGo"]!!) + } } } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 83376ad65..e522d715c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -129,25 +129,6 @@ class SmokeTest { } } - // Verifies changing the default engine from the Search Shortcut menu - @Test - fun selectSearchEnginesShortcutTest() { - val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay") - - for (searchEngine in enginesList) { - homeScreen { - }.openSearch { - verifyKeyboardVisibility() - clickSearchEngineShortcutButton() - verifySearchEngineList(activityTestRule) - changeDefaultSearchEngine(activityTestRule, searchEngine) - verifySearchEngineIcon(searchEngine) - }.submitQuery("mozilla ") { - verifyUrl(searchEngine) - }.goToHomescreen { } - } - } - // Verifies that deleting a Bookmarks folder also removes the item from inside it. @Test fun deleteNonEmptyBookmarkFolderTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt index 2e486874f..0ff24a5a8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt @@ -16,6 +16,7 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar @@ -343,10 +344,10 @@ class TabbedBrowsingTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openTabButtonShortcutsMenu { }.openNewPrivateTabFromShortcutsMenu { - verifyKeyboardVisible() - verifyFocusedNavigationToolbar() + verifyKeyboardVisibility() + verifySearchBarPlaceholder("Search or enter address") // dismiss search dialog - homeScreen { }.pressBack() + }.dismissSearchBar { verifyCommonMythsLink() verifyNavigationToolbar() } @@ -354,10 +355,10 @@ class TabbedBrowsingTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openTabButtonShortcutsMenu { }.openTabFromShortcutsMenu { - verifyKeyboardVisible() - verifyFocusedNavigationToolbar() + verifyKeyboardVisibility() + verifySearchBarPlaceholder("Search or enter address") // dismiss search dialog - homeScreen { }.pressBack() + }.dismissSearchBar { verifyHomeWordmark() verifyNavigationToolbar() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt index 2553b5395..dcf4a8c88 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt @@ -24,9 +24,6 @@ import org.hamcrest.Matchers.allOf import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.R -import org.mozilla.fenix.helpers.Constants -import org.mozilla.fenix.helpers.MatcherHelper.assertItemContainingTextExists -import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort @@ -63,7 +60,13 @@ class HistoryRobot { assertVisitedTimeTitle() } - fun verifyHistoryItemExists(shouldExist: Boolean, item: String) = assertHistoryItemExists(shouldExist, item) + fun verifyHistoryItemExists(shouldExist: Boolean, item: String) { + if (shouldExist) { + assertTrue(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTime)) + } else { + assertFalse(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTimeShort)) + } + } fun verifyFirstTestPageTitle(title: String) = assertTestPageTitle(title) @@ -122,36 +125,11 @@ class HistoryRobot { } } - fun dismissHistorySearchBarUsingBackButton() { - for (i in 1..Constants.RETRY_COUNT) { - try { - mDevice.pressBack() - assertTrue( - itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view") - .waitUntilGone(waitingTime), - ) - break - } catch (e: AssertionError) { - if (i == Constants.RETRY_COUNT) { - throw e - } - } - } + fun openSearchGroup(searchTerm: String) { + mDevice.findObject(UiSelector().text(searchTerm)).waitForExists(waitingTime) + mDevice.findObject(UiSelector().text(searchTerm)).click() } - fun searchForHistoryItem(vararg historyItems: String) { - for (historyItem in historyItems) { - itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view").also { - it.waitForExists(waitingTime) - it.setText(historyItem) - } - mDevice.waitForWindowUpdate(packageName, waitingTimeShort) - } - } - - fun verifySearchedHistoryItemExists(historyItemUrl: String, exists: Boolean = true) = - assertItemContainingTextExists(itemContainingText(historyItemUrl), exists = exists) - class Transition { fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { onView(withContentDescription("Navigate up")).click() @@ -220,14 +198,6 @@ private fun assertEmptyHistoryView() = private fun assertHistoryListExists() = mDevice.findObject(UiSelector().resourceId("$packageName:id/history_list")).waitForExists(waitingTime) -private fun assertHistoryItemExists(shouldExist: Boolean, item: String) { - if (shouldExist) { - assertTrue(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTime)) - } else { - assertFalse(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTimeShort)) - } -} - private fun assertVisitedTimeTitle() = onView(withId(R.id.header_title)).check(matches(withText("Today"))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index a49b5c2f2..a12fb339b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -35,7 +35,6 @@ import androidx.test.espresso.matcher.ViewMatchers.Visibility import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility -import androidx.test.espresso.matcher.ViewMatchers.withHint import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By @@ -94,7 +93,7 @@ class HomeScreenRobot { " else who uses this device." fun verifyNavigationToolbar() = assertItemWithResIdExists(navigationToolbar) - fun verifyFocusedNavigationToolbar() = assertFocusedNavigationToolbar() + fun verifyHomeScreen() = assertItemWithResIdExists(homeScreen) fun verifyPrivateBrowsingHomeScreen() { @@ -919,10 +918,6 @@ private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean) = .contains("mInputShown=true"), ) -private fun assertFocusedNavigationToolbar() = - onView(allOf(withHint("Search or enter address"))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - private fun assertTabButton() = onView(allOf(withId(R.id.tab_button), isDisplayed())) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt index 6c3d26053..445e88297 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt @@ -117,6 +117,24 @@ class NavigationToolbarRobot { getStringResource(R.string.search_hint), ) + // New unified search UI selector + fun verifySearchBarPlaceholder(text: String) { + urlBar().waitForExists(waitingTime) + assertTrue( + urlBar().text == text, + ) + } + + // New unified search UI selector + fun verifyDefaultSearchEngine(engineName: String) = + assertTrue( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/search_selector") + .childSelector(UiSelector().description(engineName)), + ).waitForExists(waitingTime), + ) + fun verifyTextSelectionOptions(vararg textSelectionOptions: String) { for (textSelectionOption in textSelectionOptions) { mDevice.waitNotNull(Until.findObject(textContains(textSelectionOption)), waitingTime) @@ -257,7 +275,7 @@ class NavigationToolbarRobot { return NavigationToolbarRobot.Transition() } - fun openTabFromShortcutsMenu(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { + fun openTabFromShortcutsMenu(interact: SearchRobot.() -> Unit): SearchRobot.Transition { mDevice.waitForIdle(waitingTime) onView(withId(R.id.mozac_browser_menu_recyclerView)) @@ -270,11 +288,11 @@ class NavigationToolbarRobot { ), ) - HomeScreenRobot().interact() - return HomeScreenRobot.Transition() + SearchRobot().interact() + return SearchRobot.Transition() } - fun openNewPrivateTabFromShortcutsMenu(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { + fun openNewPrivateTabFromShortcutsMenu(interact: SearchRobot.() -> Unit): SearchRobot.Transition { mDevice.waitForIdle(waitingTime) onView(withId(R.id.mozac_browser_menu_recyclerView)) @@ -287,8 +305,8 @@ class NavigationToolbarRobot { ), ) - HomeScreenRobot().interact() - return HomeScreenRobot.Transition() + SearchRobot().interact() + return SearchRobot.Transition() } fun clickUrlbar(interact: SearchRobot.() -> Unit): SearchRobot.Transition { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index ded6da16c..999de1f16 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -6,14 +6,9 @@ package org.mozilla.fenix.ui.robots -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.performScrollToIndex import androidx.compose.ui.test.performScrollToNode import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.closeSoftKeyboard @@ -28,7 +23,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import org.hamcrest.CoreMatchers.allOf -import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.R @@ -39,7 +33,6 @@ import org.mozilla.fenix.helpers.Constants.SPEECH_RECOGNITION import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists import org.mozilla.fenix.helpers.MatcherHelper.itemWithDescription import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId -import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText import org.mozilla.fenix.helpers.SessionLoadedIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort @@ -49,7 +42,6 @@ import org.mozilla.fenix.helpers.TestHelper.isPackageInstalled import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.waitForObjects -import org.mozilla.fenix.helpers.click /** * Implementation of Robot Pattern for the search fragment. @@ -68,7 +60,17 @@ class SearchRobot { exists = isDisplayed, ) - fun verifyScanButton() = assertScanButton() + fun verifyScanButtonVisibility(visible: Boolean = true) { + if (visible) { + assertTrue( + scanButton.waitForExists(waitingTime), + ) + } else { + assertTrue( + scanButton.waitUntilGone(waitingTime), + ) + } + } fun verifyVoiceSearchButtonVisibility(enabled: Boolean) { if (enabled) { @@ -185,19 +187,6 @@ class SearchRobot { ).click() } - fun verifySearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) { - rule.waitForIdle() - rule.onNodeWithText("Search $searchEngineName").assertIsDisplayed() - rule.onNodeWithText( - getStringResource(R.string.search_engine_suggestions_description), - ).assertIsDisplayed() - } - - fun verifySearchBarEmpty() = assertSearchBarEmpty() - - fun verifyKeyboardVisibility() = assertKeyboardVisibility(isExpectedToBeVisible = true) - fun verifySearchEngineList(rule: ComposeTestRule) = rule.assertSearchEngineList() - fun verifySearchSelectorButton() { assertTrue(searchSelectorButton.waitForExists(waitingTime)) } @@ -211,9 +200,9 @@ class SearchRobot { assertTrue(itemWithDescription(name).waitForExists(waitingTime)) fun verifySearchBarPlaceholder(text: String) { + browserToolbarEditView().waitForExists(waitingTime) assertTrue( - itemWithResIdAndText("$packageName:id/mozac_browser_toolbar_edit_url_view", text) - .waitForExists(waitingTime), + browserToolbarEditView().text == text, ) } @@ -226,24 +215,11 @@ class SearchRobot { } } - // Old search UI shortcut selector - to be removed. - fun changeDefaultSearchEngine(rule: ComposeTestRule, searchEngineName: String) = - rule.selectDefaultSearchEngine(searchEngineName) - // New unified search UI search selector. fun selectTemporarySearchMethod(searchEngineName: String) { searchShortcutList.getChild(UiSelector().text(searchEngineName)).click() } - // Old search UI shortcut selector - to be removed. - fun clickSearchEngineShortcutButton() { - itemWithResId("$packageName:id/search_engines_shortcut_button").also { - it.waitForExists(waitingTime) - it.click() - } - mDevice.waitForIdle(waitingTimeShort) - } - fun clickScanButton() = scanButton.also { it.waitForExists(waitingTime) @@ -263,7 +239,10 @@ class SearchRobot { fun verifyScannerOpen() { assertTrue( mDevice.findObject(UiSelector().resourceId("$packageName:id/view_finder")) - .waitForExists(waitingTime), + .waitForExists(waitingTime) || + // In case there is no camera available, an error will be shown. + mDevice.findObject(UiSelector().resourceId("$packageName:id/camera_error")) + .exists(), ) } @@ -277,20 +256,6 @@ class SearchRobot { mDevice.waitForIdle() } - @OptIn(ExperimentalTestApi::class) - fun scrollToSearchEngineSettings(rule: ComposeTestRule) { - // Soft keyboard is visible on screen on view access; hide it - onView(allOf(withId(R.id.search_wrapper))).perform( - closeSoftKeyboard(), - ) - - mDevice.findObject(UiSelector().text("Google")) - .waitForExists(waitingTime) - - rule.onNodeWithTag("mozac.awesomebar.suggestions") - .performScrollToIndex(5) - } - fun clickClearButton() { clearButton().click() } @@ -317,25 +282,15 @@ class SearchRobot { pasteText.click() } - fun clickSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) = - rule.onNodeWithText("Search $searchEngineName").performClick() - fun expandSearchSuggestionsList() { onView(allOf(withId(R.id.search_wrapper))).perform( closeSoftKeyboard(), ) - awesomeBar.swipeUp(2) + browserToolbarEditView().swipeUp(2) } fun verifyTranslatedFocusedNavigationToolbar(toolbarHintString: String) = - assertTranslatedFocusedNavigationToolbar(toolbarHintString) - - fun verifySearchEngineShortcuts(rule: ComposeTestRule, vararg searchEngines: String) { - for (searchEngine in searchEngines) { - rule.waitForIdle() - rule.onNodeWithText(searchEngine).assertIsDisplayed() - } - } + assertTrue(browserToolbarEditView().text.contains(toolbarHintString)) fun verifyTypedToolbarText(expectedText: String) { mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) @@ -406,11 +361,8 @@ class SearchRobot { return BrowserRobot.Transition() } - fun clickSearchEngineSettings( - rule: ComposeTestRule, - interact: SettingsSubMenuSearchRobot.() -> Unit, - ): SettingsSubMenuSearchRobot.Transition { - rule.onNodeWithText("Search engine settings").performClick() + fun clickSearchEngineSettings(interact: SettingsSubMenuSearchRobot.() -> Unit): SettingsSubMenuSearchRobot.Transition { + searchShortcutList.getChild(UiSelector().text("Search settings")).click() SettingsSubMenuSearchRobot().interact() return SettingsSubMenuSearchRobot.Transition() @@ -428,6 +380,11 @@ class SearchRobot { } } +fun searchScreen(interact: SearchRobot.() -> Unit): SearchRobot.Transition { + SearchRobot().interact() + return SearchRobot.Transition() +} + private fun browserToolbarEditView() = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")) @@ -437,22 +394,13 @@ private val dismissPermissionButton = private val goToPermissionsSettingsButton = mDevice.findObject(UiSelector().text("GO TO SETTINGS")) -private val scanButton = - itemWithResIdAndText( - "$packageName:id/qr_scan_button", - getStringResource(R.string.search_scan_button), - ) +private val scanButton = itemWithDescription("Scan") private fun clearButton() = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_clear_view")) private fun searchWrapper() = mDevice.findObject(UiSelector().resourceId("$packageName:id/search_wrapper")) -private fun assertScanButton() = - assertTrue( - scanButton.waitForExists(waitingTime), - ) - private fun assertSearchButton() = assertTrue( mDevice.findObject( @@ -462,80 +410,7 @@ private fun assertSearchButton() = private val searchSelectorButton = itemWithResId("$packageName:id/search_selector") -private fun assertSearchBarEmpty() = - assertTrue( - mDevice.findObject( - UiSelector() - .resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view") - .textContains(""), - ).waitForExists(waitingTime), - ) - -fun searchScreen(interact: SearchRobot.() -> Unit): SearchRobot.Transition { - SearchRobot().interact() - return SearchRobot.Transition() -} - -private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean): () -> Unit = { - searchWrapper().waitForExists(waitingTime) - - assertEquals( - "Keyboard not shown", - isExpectedToBeVisible, - mDevice - .executeShellCommand("dumpsys input_method | grep mInputShown") - .contains("mInputShown=true"), - ) -} - -private fun ComposeTestRule.assertSearchEngineList() { - onView(withId(R.id.mozac_browser_toolbar_edit_icon)).click() - - onNodeWithText("Google") - .assertExists() - .assertIsDisplayed() - - onNodeWithText("Amazon.com") - .assertExists() - .assertIsDisplayed() - - onNodeWithText("Bing") - .assertExists() - .assertIsDisplayed() - - onNodeWithText("DuckDuckGo") - .assertExists() - .assertIsDisplayed() - - onNodeWithText("Wikipedia") - .assertExists() - .assertIsDisplayed() - - onNodeWithText("eBay") - .assertExists() - .assertIsDisplayed() -} - private val searchShortcutList = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_menu_recyclerView")) -private fun ComposeTestRule.selectDefaultSearchEngine(searchEngine: String) { - onNodeWithText(searchEngine) - .assertExists() - .assertIsDisplayed() - .performClick() -} - -private fun assertTranslatedFocusedNavigationToolbar(toolbarHintString: String) = - assertTrue( - mDevice.findObject( - UiSelector() - .resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view") - .textContains(toolbarHintString), - ).waitForExists(waitingTime), - ) - -private val awesomeBar = - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")) - private val voiceSearchButton = mDevice.findObject(UiSelector().description("Voice search")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index 775046a9f..14db71df6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -162,8 +162,11 @@ class SettingsSubMenuSearchRobot { manageSearchShortcutsHeader.click() } - fun changeDefaultSearchEngine(searchEngineName: String) = - selectSearchEngine(searchEngineName) + fun changeDefaultSearchEngine(searchEngineName: String) { + onView(withText(searchEngineName)) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .perform(click()) + } fun toggleAutocomplete() = autocompleteSwitchButton().click() @@ -411,12 +414,6 @@ private fun showSuggestionsInPrivateModeSwitch(): ViewInteraction { return onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))) } -private fun selectSearchEngine(searchEngine: String) { - onView(withText(searchEngine)) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - .perform(click()) -} - private fun goBackButton() = onView(CoreMatchers.allOf(withContentDescription("Navigate up"))) From 2773bf7f30c2453838474df7a90b835b0eb68904 Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Thu, 13 Jul 2023 12:50:02 -0400 Subject: [PATCH 075/207] Reverts "Bug 1815637 - Add rtl support." --- .../java/org/mozilla/fenix/browser/BaseBrowserFragment.kt | 3 +-- .../java/org/mozilla/fenix/collections/CollectionsDialog.kt | 5 ++--- .../fenix/components/toolbar/BrowserToolbarMenuController.kt | 3 +-- .../fenix/home/mozonline/PrivacyContentDisplayHelper.kt | 3 +-- .../fenix/home/sessioncontrol/SessionControlController.kt | 3 +-- .../org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt | 5 ++--- .../fenix/library/bookmarks/edit/EditBookmarkFragment.kt | 3 +-- .../org/mozilla/fenix/library/history/HistoryFragment.kt | 3 +-- .../library/historymetadata/HistoryMetadataGroupFragment.kt | 3 +-- .../java/org/mozilla/fenix/search/SearchDialogController.kt | 3 +-- .../java/org/mozilla/fenix/search/SearchDialogFragment.kt | 5 ++--- .../main/java/org/mozilla/fenix/settings/SettingsFragment.kt | 3 +-- .../mozilla/fenix/settings/about/AboutLibrariesFragment.kt | 2 -- .../fenix/settings/account/AccountSettingsFragment.kt | 3 +-- .../mozilla/fenix/settings/account/DefaultSyncController.kt | 3 +-- .../mozilla/fenix/settings/address/view/AddressEditorView.kt | 3 +-- .../fenix/settings/autofill/AutofillSettingFragment.kt | 3 +-- .../fenix/settings/creditcards/CreditCardEditorFragment.kt | 3 +-- .../deletebrowsingdata/DeleteBrowsingDataFragment.kt | 3 +-- .../fenix/settings/logins/fragment/LoginDetailFragment.kt | 3 +-- .../settings/logins/fragment/SavedLoginsAuthFragment.kt | 3 +-- .../fenix/settings/quicksettings/ClearSiteDataView.kt | 3 +-- .../SitePermissionsDetailsExceptionsFragment.kt | 3 +-- .../sitepermissions/SitePermissionsExceptionsFragment.kt | 3 +-- .../SitePermissionsManageExceptionsPhoneFeatureFragment.kt | 3 +-- .../org/mozilla/fenix/settings/studies/StudiesAdapter.kt | 3 +-- .../java/org/mozilla/fenix/settings/studies/StudiesView.kt | 3 +-- .../java/org/mozilla/fenix/share/AddNewDeviceFragment.kt | 3 +-- app/src/main/res/layout/about_list_item.xml | 1 - app/src/main/res/layout/component_collection_creation.xml | 1 - .../layout/component_collection_creation_name_collection.xml | 2 -- .../component_collection_creation_select_collection.xml | 2 -- app/src/main/res/layout/component_downloads.xml | 1 - app/src/main/res/layout/component_history.xml | 1 - app/src/main/res/layout/component_history_metadata_group.xml | 1 - app/src/main/res/layout/fenix_snackbar.xml | 2 +- app/src/main/res/layout/fragment_add_ons_management.xml | 1 - app/src/main/res/layout/fragment_address_editor.xml | 2 -- app/src/main/res/layout/fragment_credit_card_editor.xml | 2 -- app/src/main/res/layout/fragment_pwa_onboarding.xml | 1 - app/src/main/res/layout/fragment_sign_out.xml | 1 - .../main/res/layout/fragment_site_permissions_exceptions.xml | 1 - app/src/main/res/layout/fragment_turn_on_sync.xml | 4 +--- app/src/main/res/layout/normal_browser_tray_list.xml | 2 +- app/src/main/res/layout/private_browser_tray_list.xml | 2 +- app/src/main/res/layout/start_download_dialog_layout.xml | 1 - app/src/main/res/values/styles.xml | 3 --- 47 files changed, 34 insertions(+), 86 deletions(-) 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 8e69e6361..f8ebc8f9b 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -104,7 +104,6 @@ import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.kotlin.getOrigin import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import mozilla.components.support.locale.ActivityContextWrapper -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.MediaState @@ -1000,7 +999,7 @@ abstract class BaseBrowserFragment : } create() - }.show().withCenterAlignedButtons().secure(activity) + }.show().secure(activity) context.settings().incrementSecureWarningCount() } diff --git a/app/src/main/java/org/mozilla/fenix/collections/CollectionsDialog.kt b/app/src/main/java/org/mozilla/fenix/collections/CollectionsDialog.kt index 683d45862..6b859c769 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CollectionsDialog.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CollectionsDialog.kt @@ -15,7 +15,6 @@ import kotlinx.coroutines.launch import mozilla.components.browser.state.state.TabSessionState import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.support.ktx.android.view.showKeyboard -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.ext.getDefaultCollectionNumber @@ -80,7 +79,7 @@ fun CollectionsDialog.show( dialog.cancel() } - val dialog = builder.create().withCenterAlignedButtons() + val dialog = builder.create() val collectionNames = arrayOf(context.getString(R.string.tab_tray_add_new_collection)) + collections val collectionsListAdapter = CollectionsListAdapter(collectionNames) { @@ -127,7 +126,7 @@ internal fun CollectionsDialog.showAddNewDialog( onNegativeButtonClick.invoke() dialog.cancel() } - .create().withCenterAlignedButtons() + .create() .show() collectionNameEditText.setSelection(0, collectionNameEditText.text.length) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt index de1cbf824..f343c7cd8 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt @@ -29,7 +29,6 @@ import mozilla.components.feature.top.sites.PinnedSiteStorage import mozilla.components.feature.top.sites.TopSite import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.ViewBoundFeatureWrapper -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.GleanMetrics.AppMenu import org.mozilla.fenix.GleanMetrics.Collections import org.mozilla.fenix.GleanMetrics.Events @@ -267,7 +266,7 @@ class DefaultBrowserToolbarMenuController( setPositiveButton(R.string.top_sites_max_limit_confirmation_button) { dialog, _ -> dialog.dismiss() } - create().withCenterAlignedButtons() + create() }.show() } else { ioScope.launch { diff --git a/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt b/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt index e22522e51..fa5cd45bb 100644 --- a/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt +++ b/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt @@ -12,7 +12,6 @@ import android.text.Spanned import android.text.method.LinkMovementMethod import android.widget.TextView import androidx.appcompat.app.AlertDialog -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.MetricServiceType @@ -80,7 +79,7 @@ fun showPrivacyPopWindow(context: Context, activity: Activity) { .setTitle(context.getString(R.string.privacy_notice_title)) .setMessage(messageSpannable) .setCancelable(false) - val alertDialog: AlertDialog = builder.create().withCenterAlignedButtons() + val alertDialog: AlertDialog = builder.create() alertDialog.show() alertDialog.findViewById(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance() } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 0cfecbeca..b27d1664e 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -28,7 +28,6 @@ import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.top.sites.TopSite import mozilla.components.service.nimbus.messaging.Message import mozilla.components.support.ktx.android.view.showKeyboard -import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Collections @@ -313,7 +312,7 @@ class DefaultSessionControlController( setNegativeButton(R.string.top_sites_rename_dialog_cancel) { dialog, _ -> dialog.cancel() } - }.show().withCenterAlignedButtons().also { + }.show().also { topSiteLabelEditText.setSelection(0, topSiteLabelEditText.text.length) topSiteLabelEditText.showKeyboard() } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 5d75bb79f..2f9c498d6 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -40,7 +40,6 @@ import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.ktx.kotlin.toShortUrl -import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.HomeActivity @@ -305,7 +304,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan dialog.dismiss() } setCancelable(false) - create().withCenterAlignedButtons() + create() show() } } @@ -410,7 +409,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan operation = getDeleteOperation(BookmarkRemoveType.FOLDER), ) } - create().withCenterAlignedButtons() + create() } .show() } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt index b80b013eb..27a551f84 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt @@ -37,7 +37,6 @@ import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.showKeyboard import mozilla.components.support.ktx.kotlin.toShortUrl -import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.NavHostActivity @@ -247,7 +246,7 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark), MenuProv } dialog.dismiss() } - create().withCenterAlignedButtons() + create() }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index a1962bbf6..c518ee0a3 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -39,7 +39,6 @@ import mozilla.components.service.fxa.SyncEngine import mozilla.components.service.fxa.sync.SyncReason import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.ktx.kotlin.toShortUrl -import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity @@ -421,7 +420,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler, } GleanHistory.removePromptOpened.record(NoExtras()) - }.create().withCenterAlignedButtons() + }.create() } @Suppress("UnusedPrivateMember") diff --git a/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt b/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt index 49891f1c9..34a3a94d2 100644 --- a/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt @@ -28,7 +28,6 @@ import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.lib.state.ext.flowScoped import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.ktx.kotlin.toShortUrl -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.addons.showSnackBar @@ -276,7 +275,7 @@ class HistoryMetadataGroupFragment : interactor.onDeleteAllConfirmed() dialog.dismiss() } - .create().withCenterAlignedButtons() + .create() companion object { const val TAG = "DELETE_CONFIRMATION_DIALOG_FRAGMENT" diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt index 89018d378..f926d0df5 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt @@ -18,7 +18,6 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.EngineSession.LoadUrlFlags import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.ktx.kotlin.isUrl -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.SearchShortcuts @@ -319,7 +318,7 @@ class SearchDialogController( dialog.cancel() activity.startActivity(intent) } - create().withCenterAlignedButtons() + create() } } } diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index bc8d1991f..e9377a221 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -71,7 +71,6 @@ import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.kotlin.toNormalizedUrl import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import mozilla.components.ui.autocomplete.InlineAutocompleteEditText -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Awesomebar import org.mozilla.fenix.GleanMetrics.VoiceSearch @@ -695,7 +694,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { setPositiveButton(R.string.qr_scanner_dialog_invalid_ok) { dialog: DialogInterface, _ -> dialog.dismiss() } - create().withCenterAlignedButtons() + create() }.show() } } else { @@ -720,7 +719,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { ) dialog.dismiss() } - create().withCenterAlignedButtons() + create() }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 8f79f49c5..1d1e161b0 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -38,7 +38,6 @@ import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.ktx.android.view.showKeyboard -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags @@ -422,7 +421,7 @@ class SettingsFragment : PreferenceFragmentCompat() { binding.customAmoUser.setText(context.settings().overrideAmoUser) binding.customAmoUser.requestFocus() binding.customAmoUser.showKeyboard() - create().withCenterAlignedButtons() + create() }.show() null diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutLibrariesFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutLibrariesFragment.kt index 98a3a11b9..d9721705a 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutLibrariesFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutLibrariesFragment.kt @@ -13,7 +13,6 @@ import android.widget.ListView import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentAboutLibrariesBinding import org.mozilla.fenix.ext.showToolbar @@ -99,7 +98,6 @@ class AboutLibrariesFragment : Fragment(R.layout.fragment_about_libraries) { .setTitle(libraryItem.name) .setMessage(libraryItem.license) .create() - .withCenterAlignedButtons() dialog.show() val textView = dialog.findViewById(android.R.id.message)!! 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 6ea35ea09..4539374d3 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 @@ -34,7 +34,6 @@ import mozilla.components.service.fxa.sync.SyncReason import mozilla.components.service.fxa.sync.SyncStatusObserver import mozilla.components.service.fxa.sync.getLastSynced import mozilla.components.support.ktx.android.content.getColorFromAttr -import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags @@ -294,7 +293,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { ) startActivity(intent) } - create().withCenterAlignedButtons() + create() }.show().secure(activity) it.settings().incrementShowLoginsSecureWarningSyncCount() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/DefaultSyncController.kt b/app/src/main/java/org/mozilla/fenix/settings/account/DefaultSyncController.kt index e7c4323f5..b04373308 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/DefaultSyncController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/DefaultSyncController.kt @@ -12,7 +12,6 @@ import android.provider.Settings import android.text.SpannableString import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AlertDialog -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.settings.SupportUtils @@ -69,7 +68,7 @@ class DefaultSyncController( dialog.cancel() activity.startActivity(intent) } - create().withCenterAlignedButtons() + create() } } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt b/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt index 18858e0ce..517e73f2d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt @@ -16,7 +16,6 @@ import mozilla.components.concept.storage.Address import mozilla.components.concept.storage.UpdatableAddressFields import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.showKeyboard -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.GleanMetrics.Addresses import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentAddressEditorBinding @@ -121,7 +120,7 @@ class AddressEditorView( interactor.onDeleteAddress(guid) Addresses.deleted.add() } - create().withCenterAlignedButtons() + create() }.show() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt index 382f33162..839666f98 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt @@ -26,7 +26,6 @@ import kotlinx.coroutines.launch import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.service.fxa.SyncEngine import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.R import org.mozilla.fenix.components.StoreProvider @@ -292,7 +291,7 @@ class AutofillSettingFragment : BiometricPromptPreferenceFragment() { startActivity(intent) } - create().withCenterAlignedButtons() + create() }.show().secure(activity) context.settings().incrementSecureWarningCount() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt index 5e16987b8..b71f5a631 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt @@ -22,7 +22,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.showKeyboard -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.SecureFragment import org.mozilla.fenix.databinding.FragmentCreditCardEditorBinding @@ -156,7 +155,7 @@ class CreditCardEditorFragment : dialog.cancel() } setPositiveButton(R.string.credit_cards_delete_dialog_button, onPositiveClickListener) - create().withCenterAlignedButtons() + create() }.show() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataFragment.kt index 6a578ef0b..d31ff2a63 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataFragment.kt @@ -20,7 +20,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.components.lib.state.ext.flowScoped -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.databinding.FragmentDeleteBrowsingDataBinding @@ -151,7 +150,7 @@ class DeleteBrowsingDataFragment : Fragment(R.layout.fragment_delete_browsing_da it.dismiss() deleteSelected() } - create().withCenterAlignedButtons() + create() }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt index ddfe391a1..ad9994b8f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt @@ -23,7 +23,6 @@ import androidx.navigation.fragment.navArgs import com.google.android.material.snackbar.Snackbar import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.service.glean.private.NoExtras -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Logins import org.mozilla.fenix.HomeActivity @@ -221,7 +220,7 @@ class LoginDetailFragment : SecureFragment(R.layout.fragment_login_detail), Menu interactor.onDeleteLogin(args.savedLoginId) dialog.dismiss() } - create().withCenterAlignedButtons() + create() }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt index 1dc5496a6..58acc1c73 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt @@ -26,7 +26,6 @@ import mozilla.components.feature.autofill.preference.AutofillPreference import mozilla.components.service.fxa.SyncEngine import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.ViewBoundFeatureWrapper -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.GleanMetrics.Logins import org.mozilla.fenix.R import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint @@ -216,7 +215,7 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { val intent = Intent(ACTION_SECURITY_SETTINGS) startActivity(intent) } - create().withCenterAlignedButtons() + create() }.show().secure(activity) context.settings().incrementSecureWarningCount() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/ClearSiteDataView.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/ClearSiteDataView.kt index 7f9e3e7ff..bd123de81 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/ClearSiteDataView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/ClearSiteDataView.kt @@ -18,7 +18,6 @@ import androidx.navigation.NavController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.databinding.QuicksettingsClearSiteDataBinding import org.mozilla.fenix.ext.components @@ -108,7 +107,7 @@ class ClearSiteDataView( it.dismiss() interactor.onClearSiteDataClicked(baseDomain) } - create().withCenterAlignedButtons() + create() }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt index addf2d85d..9b7dbc997 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt @@ -19,7 +19,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.support.ktx.kotlin.stripDefaultPort -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents @@ -146,7 +145,7 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { setNegativeButton(R.string.clear_permissions_negative) { dialog: DialogInterface, _ -> dialog.cancel() } - }.show().withCenterAlignedButtons() + }.show() true } diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt index 613f86e07..99388b9fe 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt @@ -30,7 +30,6 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.support.ktx.kotlin.stripDefaultPort -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.NavHostActivity import org.mozilla.fenix.R import org.mozilla.fenix.ext.components @@ -120,7 +119,7 @@ class SitePermissionsExceptionsFragment : setNegativeButton(R.string.clear_permissions_negative) { dialog: DialogInterface, _ -> dialog.cancel() } - }.show().withCenterAlignedButtons() + }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt index f7c35ecf9..739b7eb62 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt @@ -26,7 +26,6 @@ import kotlinx.coroutines.launch import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.permission.SitePermissions.Status.ALLOWED import mozilla.components.concept.engine.permission.SitePermissions.Status.BLOCKED -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.R import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings @@ -163,7 +162,7 @@ class SitePermissionsManageExceptionsPhoneFeatureFragment : Fragment() { setNegativeButton(R.string.clear_permission_negative) { dialog: DialogInterface, _ -> dialog.cancel() } - }.show().withCenterAlignedButtons() + }.show() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt b/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt index 7a82c9a88..39b87b0fd 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt @@ -19,7 +19,6 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.google.android.material.button.MaterialButton import mozilla.components.service.nimbus.messaging.MESSAGING_FEATURE_ID -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.experiments.nimbus.internal.EnrolledExperiment import org.mozilla.fenix.R import org.mozilla.fenix.settings.studies.CustomViewHolder.SectionViewHolder @@ -142,7 +141,7 @@ class StudiesAdapter( .setTitle(R.string.preference_experiments_2) .setMessage(R.string.studies_restart_app) .setCancelable(false) - val alertDialog: AlertDialog = builder.create().withCenterAlignedButtons() + val alertDialog: AlertDialog = builder.create() alertDialog.show() return alertDialog } diff --git a/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesView.kt b/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesView.kt index f9ee948f8..077e618e8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesView.kt @@ -22,7 +22,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.service.nimbus.NimbusApi import mozilla.components.support.base.log.logger.Logger -import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.experiments.nimbus.internal.EnrolledExperiment import org.mozilla.fenix.GleanMetrics.Preferences @@ -83,7 +82,7 @@ class StudiesView( .setTitle(R.string.preference_experiments_2) .setMessage(R.string.studies_restart_app) .setCancelable(false) - val alertDialog: AlertDialog = builder.create().withCenterAlignedButtons() + val alertDialog: AlertDialog = builder.create() alertDialog.show() } bindDescription() diff --git a/app/src/main/java/org/mozilla/fenix/share/AddNewDeviceFragment.kt b/app/src/main/java/org/mozilla/fenix/share/AddNewDeviceFragment.kt index 3c5150c32..1172ad883 100644 --- a/app/src/main/java/org/mozilla/fenix/share/AddNewDeviceFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/share/AddNewDeviceFragment.kt @@ -8,7 +8,6 @@ import android.os.Bundle import android.view.View import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -45,7 +44,7 @@ class AddNewDeviceFragment : Fragment(R.layout.fragment_add_new_device) { AlertDialog.Builder(requireContext()).apply { setMessage(R.string.sync_connect_device_dialog) setPositiveButton(R.string.sync_confirmation_button) { dialog, _ -> dialog.cancel() } - create().withCenterAlignedButtons() + create() }.show() } } diff --git a/app/src/main/res/layout/about_list_item.xml b/app/src/main/res/layout/about_list_item.xml index 184d7c686..c27d7d3bb 100644 --- a/app/src/main/res/layout/about_list_item.xml +++ b/app/src/main/res/layout/about_list_item.xml @@ -17,7 +17,6 @@ android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" - android:textAlignment="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/component_collection_creation.xml b/app/src/main/res/layout/component_collection_creation.xml index fafa997bf..438b6f564 100644 --- a/app/src/main/res/layout/component_collection_creation.xml +++ b/app/src/main/res/layout/component_collection_creation.xml @@ -179,7 +179,6 @@ android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" android:text="@string/create_collection_save" - android:textAlignment="center" android:textColor="?textActionPrimary" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/component_collection_creation_name_collection.xml b/app/src/main/res/layout/component_collection_creation_name_collection.xml index c734f6d4a..443b8d2c5 100644 --- a/app/src/main/res/layout/component_collection_creation_name_collection.xml +++ b/app/src/main/res/layout/component_collection_creation_name_collection.xml @@ -36,7 +36,6 @@ android:alpha="0" android:background="?android:attr/selectableItemBackgroundBorderless" android:text="@string/create_collection_select_all" - android:textAlignment="center" android:textAllCaps="false" android:textColor="@color/fx_mobile_text_color_oncolor_primary" android:textSize="16sp" @@ -154,7 +153,6 @@ android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" android:text="@string/create_collection_save" - android:textAlignment="center" android:textAppearance="@style/TextAppearance.MaterialComponents.Button" android:textColor="?textActionPrimary" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/component_collection_creation_select_collection.xml b/app/src/main/res/layout/component_collection_creation_select_collection.xml index fbd52d883..74e08de7f 100644 --- a/app/src/main/res/layout/component_collection_creation_select_collection.xml +++ b/app/src/main/res/layout/component_collection_creation_select_collection.xml @@ -36,7 +36,6 @@ android:alpha="0" android:background="?android:attr/selectableItemBackgroundBorderless" android:text="@string/create_collection_select_all" - android:textAlignment="center" android:textAllCaps="false" android:textColor="@color/fx_mobile_text_color_oncolor_primary" android:textSize="16sp" @@ -159,7 +158,6 @@ android:alpha="0.0" android:background="?android:attr/selectableItemBackground" android:text="@string/create_collection_save" - android:textAlignment="center" android:textAppearance="@style/TextAppearance.MaterialComponents.Button" android:textColor="?textActionPrimary" android:visibility="gone" diff --git a/app/src/main/res/layout/component_downloads.xml b/app/src/main/res/layout/component_downloads.xml index c8a802b44..8a0e809d3 100644 --- a/app/src/main/res/layout/component_downloads.xml +++ b/app/src/main/res/layout/component_downloads.xml @@ -26,7 +26,6 @@ android:layout_height="0dp" android:gravity="center" android:text="@string/download_empty_message_1" - android:textAlignment="center" android:textColor="?attr/textSecondary" android:textSize="16sp" android:visibility="gone" diff --git a/app/src/main/res/layout/component_history.xml b/app/src/main/res/layout/component_history.xml index 26ec21397..30f8831b9 100644 --- a/app/src/main/res/layout/component_history.xml +++ b/app/src/main/res/layout/component_history.xml @@ -40,7 +40,6 @@ android:layout_height="0dp" android:gravity="center" android:text="@string/history_empty_message" - android:textAlignment="center" android:textColor="?attr/textSecondary" android:textSize="16sp" android:visibility="gone" diff --git a/app/src/main/res/layout/component_history_metadata_group.xml b/app/src/main/res/layout/component_history_metadata_group.xml index 50526f763..2bd63c648 100644 --- a/app/src/main/res/layout/component_history_metadata_group.xml +++ b/app/src/main/res/layout/component_history_metadata_group.xml @@ -14,7 +14,6 @@ android:layout_height="0dp" android:gravity="center" android:text="@string/history_empty_message" - android:textAlignment="center" android:textColor="?attr/textSecondary" android:textSize="16sp" android:visibility="gone" diff --git a/app/src/main/res/layout/fenix_snackbar.xml b/app/src/main/res/layout/fenix_snackbar.xml index 9364f7bdc..c4757c35b 100644 --- a/app/src/main/res/layout/fenix_snackbar.xml +++ b/app/src/main/res/layout/fenix_snackbar.xml @@ -51,7 +51,7 @@ android:minHeight="48dp" android:paddingTop="8dp" android:paddingBottom="8dp" - android:textAlignment="center" + android:textAlignment="textEnd" android:textAllCaps="true" android:textColor="@color/photonWhite" android:textSize="14sp" diff --git a/app/src/main/res/layout/fragment_add_ons_management.xml b/app/src/main/res/layout/fragment_add_ons_management.xml index 36a28f233..433d4f4d6 100644 --- a/app/src/main/res/layout/fragment_add_ons_management.xml +++ b/app/src/main/res/layout/fragment_add_ons_management.xml @@ -29,7 +29,6 @@ android:layout_gravity="center" android:gravity="center" android:text="@string/no_add_ons" - android:textAlignment="center" android:textColor="?attr/textSecondary" android:textSize="16sp" android:visibility="gone"/> diff --git a/app/src/main/res/layout/fragment_address_editor.xml b/app/src/main/res/layout/fragment_address_editor.xml index 82d559b65..7c16e56e9 100644 --- a/app/src/main/res/layout/fragment_address_editor.xml +++ b/app/src/main/res/layout/fragment_address_editor.xml @@ -438,7 +438,6 @@ android:letterSpacing="0" android:padding="10dp" android:text="@string/addressess_delete_address_button" - android:textAlignment="center" android:textAllCaps="false" android:textColor="@color/fx_mobile_text_color_warning" android:visibility="gone" @@ -454,7 +453,6 @@ android:letterSpacing="0" android:padding="10dp" android:text="@string/addresses_cancel_button" - android:textAlignment="center" android:textAllCaps="false" android:textColor="?attr/textPrimary" android:textStyle="bold" diff --git a/app/src/main/res/layout/fragment_credit_card_editor.xml b/app/src/main/res/layout/fragment_credit_card_editor.xml index 76211b90b..c5b94bb7b 100644 --- a/app/src/main/res/layout/fragment_credit_card_editor.xml +++ b/app/src/main/res/layout/fragment_credit_card_editor.xml @@ -178,7 +178,6 @@ android:letterSpacing="0" android:padding="10dp" android:text="@string/credit_cards_delete_card_button" - android:textAlignment="center" android:textAllCaps="false" android:textColor="@color/fx_mobile_text_color_warning" android:visibility="gone" @@ -193,7 +192,6 @@ android:letterSpacing="0" android:padding="10dp" android:text="@string/credit_cards_cancel_button" - android:textAlignment="center" android:textAllCaps="false" android:textColor="?attr/textPrimary" android:textStyle="bold" diff --git a/app/src/main/res/layout/fragment_pwa_onboarding.xml b/app/src/main/res/layout/fragment_pwa_onboarding.xml index cbe2268a4..f10fde42f 100644 --- a/app/src/main/res/layout/fragment_pwa_onboarding.xml +++ b/app/src/main/res/layout/fragment_pwa_onboarding.xml @@ -84,7 +84,6 @@ android:layout_height="wrap_content" android:letterSpacing="0" android:text="@string/add_to_homescreen_continue" - android:textAlignment="center" android:textAllCaps="false" android:textColor="?attr/textPrimary" android:textSize="16sp" diff --git a/app/src/main/res/layout/fragment_sign_out.xml b/app/src/main/res/layout/fragment_sign_out.xml index 792e7162f..c0cbe1de8 100644 --- a/app/src/main/res/layout/fragment_sign_out.xml +++ b/app/src/main/res/layout/fragment_sign_out.xml @@ -32,7 +32,6 @@ android:padding="10dp" android:scrollbars="none" android:text="@string/sign_out_cancel" - android:textAlignment="center" android:textAllCaps="false" android:textColor="?attr/textPrimary" android:textStyle="bold" diff --git a/app/src/main/res/layout/fragment_site_permissions_exceptions.xml b/app/src/main/res/layout/fragment_site_permissions_exceptions.xml index 433ccaae3..3c74d3c81 100644 --- a/app/src/main/res/layout/fragment_site_permissions_exceptions.xml +++ b/app/src/main/res/layout/fragment_site_permissions_exceptions.xml @@ -37,7 +37,6 @@ android:layout_height="0dp" android:gravity="center" android:text="@string/no_site_exceptions" - android:textAlignment="center" android:textColor="?attr/textPrimary" android:textSize="20sp" android:visibility="gone" diff --git a/app/src/main/res/layout/fragment_turn_on_sync.xml b/app/src/main/res/layout/fragment_turn_on_sync.xml index 682cea71e..90b4dc98a 100644 --- a/app/src/main/res/layout/fragment_turn_on_sync.xml +++ b/app/src/main/res/layout/fragment_turn_on_sync.xml @@ -21,7 +21,6 @@ android:layout_height="wrap_content" android:gravity="center" android:text="@string/sign_in_with_camera" - android:textAlignment="center" android:textAppearance="@style/Header16TextStyle" android:textColor="?attr/textPrimary" android:textSize="20sp" @@ -49,7 +48,6 @@ android:layout_marginTop="16dp" android:gravity="center" tools:text="@string/sign_in_instructions" - android:textAlignment="center" android:textColor="?attr/textPrimary" android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" @@ -80,7 +78,7 @@ android:id="@+id/createAccount" android:layout_width="0dp" android:layout_height="wrap_content" - android:textAlignment="center" + android:gravity="center" android:textAppearance="@style/Body14TextStyle" app:layout_constraintTop_toBottomOf="@id/signInEmailButton" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/normal_browser_tray_list.xml b/app/src/main/res/layout/normal_browser_tray_list.xml index a225e1768..5f2484445 100644 --- a/app/src/main/res/layout/normal_browser_tray_list.xml +++ b/app/src/main/res/layout/normal_browser_tray_list.xml @@ -21,9 +21,9 @@ android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" + android:gravity="center_horizontal" android:paddingTop="80dp" android:text="@string/no_open_tabs_description" - android:textAlignment="center" android:textColor="?attr/textSecondary" android:textSize="16sp" android:visibility="visible" /> diff --git a/app/src/main/res/layout/private_browser_tray_list.xml b/app/src/main/res/layout/private_browser_tray_list.xml index 5ada3e7ca..b59252edf 100644 --- a/app/src/main/res/layout/private_browser_tray_list.xml +++ b/app/src/main/res/layout/private_browser_tray_list.xml @@ -21,9 +21,9 @@ android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" + android:gravity="center_horizontal" android:paddingTop="80dp" android:text="@string/no_open_tabs_description" - android:textAlignment="center" android:textColor="?attr/textSecondary" android:textSize="16sp" android:visibility="visible" /> diff --git a/app/src/main/res/layout/start_download_dialog_layout.xml b/app/src/main/res/layout/start_download_dialog_layout.xml index 0ac7400fd..8456ec9f6 100644 --- a/app/src/main/res/layout/start_download_dialog_layout.xml +++ b/app/src/main/res/layout/start_download_dialog_layout.xml @@ -91,7 +91,6 @@ android:paddingStart="8dp" android:paddingEnd="8dp" android:text="@string/mozac_feature_downloads_dialog_download" - android:textAlignment="center" android:background="@drawable/download_dialog_download_button_background" android:textColor="?attr/textOnColorPrimary" android:textAllCaps="false" diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index aeaa71917..028a415b8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -15,7 +15,6 @@ @style/SearchViewStyle @style/AutoCompleteTextViewStyle - viewStart true @style/WindowAnimationTransition @style/progressBarStyleHorizontal @@ -217,7 +216,6 @@ @style/SearchViewStyle @style/AutoCompleteTextViewStyle - viewStart true @style/WindowAnimationTransition @style/progressBarStyleHorizontal @@ -599,7 +597,6 @@ wrap_content 40dp 32dp - center ?accentUsedOnDarkBackground @integer/font_weight_medium @integer/font_weight_medium From ac136c07cd75d9c2e2d72d32a08811a13fac5f75 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 14 Jul 2023 00:04:11 +0000 Subject: [PATCH 076/207] Import translations from android-l10n --- app/src/main/res/values-hu/strings.xml | 48 +++++------ app/src/main/res/values-skr/strings.xml | 19 +---- app/src/main/res/values-szl/strings.xml | 108 +++++++++++++++++++++++- 3 files changed, 132 insertions(+), 43 deletions(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3f512614c..05151c847 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -368,13 +368,13 @@ Névjegy - Válasszon egyet + Válasszon egyet - Keresési gyorsparancsok kezelése + Keresési gyorsparancsok kezelése - A keresés menüben látható keresőszolgáltatások szerkesztése + A keresés menüben látható keresőszolgáltatások szerkesztése - A keresés menüben látható keresőszolgáltatások + A keresés menüben látható keresőszolgáltatások Alapértelmezett keresőszolgáltatás @@ -427,18 +427,12 @@ Kérés küldése - Sütibannerek számának csökkentése - Támogatást kér ehhez az oldalhoz? - A kérés elküldve a támogatási webhelynek. - Kérés elküldve Bekapcsolva erre az oldalra - A kérés elküldve a támogatási webhelynek - Támogatási kérés elküldve A webhely jelenleg nem támogatott @@ -446,8 +440,6 @@ Bekapcsolja a sütibanner-csökkentést a következőnél: %1$s? Kikapcsolja a sütibanner-csökkentést a következőnél: %1$s? - - Ez az oldalt jelenleg nem támogatja a sütibannerek számának csökkentését. Szeretné kérni, hogy csapatunk vizsgálja felül ezt a webhelyet, és támogassa a jövőben? A %1$s nem tudja automatikusan elutasítani a sütikéréseket ezen az oldalon. Küldhet egy kérést, hogy támogassák ezt az oldalt a jövőben. @@ -553,6 +545,12 @@ Soha Külső letöltéskezelő + + Gecko naplók engedélyezése + + + Kilépés az alkalmazásból a módosítások alkalmazásához… + Kiegészítők @@ -637,6 +635,8 @@ A kiegészítő már telepítve van. + + Fiók kezelése Szinkronizálás most @@ -1212,6 +1212,10 @@ Mentés PDF-ként A PDF nem állítható elő + + Nem lehet kinyomtatni + + Nyomtatás Küldés eszközre @@ -1506,12 +1510,8 @@ Védelmi beállítások Fokozott követés elleni védelem - - Böngésszen anélkül, hogy követnék Mostantól Teljes sütivédelem funkcióval, amely az eddigi legerősebb akadály a webhelyek közti nyomkövetők ellen. - - Tartsa meg az adatait. A %s megvédi a leggyakoribb nyomkövetőktől, amelyek követik az online tevékenységét. A %s megvédi a leggyakoribb nyomkövetőktől, amelyek követik az online tevékenységét. @@ -1519,16 +1519,12 @@ Normál (alapértelmezett) - Kiegyensúlyozott adatvédelem és teljesítmény. Az oldalak normálisan fognak betölteni. - A lapok normálisan betöltenek, de néhány nyomkövető blokkolása. Mit blokkol a szokásos követésvédelem Szigorú - Több nyomkövetőt blokkol, így az oldalak gyorsabban töltenek be, de egyes oldalfunkciók meghibásodhatnak. - Erősebb követésvédelem és jobb teljesítmény, de előfordulhat, hogy egyes oldalak nem fognak megfelelően működni. Mit blokkol a szigorú követésvédelem @@ -1887,7 +1883,7 @@ Keresőszolgáltatás hozzáadása - Új keresőszolgáltatás hozzáadása + Új keresőszolgáltatás hozzáadása Keresőszolgáltatás szerkesztése @@ -1902,17 +1898,17 @@ Egyéb - Név + Név Név - Keresőszolgáltatás neve + Keresőszolgáltatás neve - Kereső webcíme + Kereső webcíme Használandó keresőkifejezés - A kereséshez használandó webcím + A kereséshez használandó webcím A keresés cseréje erre: „%s”. Példa:\nhttps://www.google.com/search?q=%s @@ -1920,7 +1916,7 @@ Egyéni keresőszolgáltatás részletei - Mentés + Mentés Adja meg a keresőszolgáltatás nevét diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 878450ad1..5e3a966e7 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -417,17 +417,11 @@ سپورٹ کیتے ارداس کرو ارداس پٹھو - - کوکی بینر گھٹاوݨ - - سپورٹ سائٹ دی ارداس جمع کرا ݙتی ڳئی ہے۔ ارداس بھیڄ ڈتی ایں سائٹ کیتے چالو کرو - - سپورٹ سائٹ دی ارداس جمع کرا ݙتی ڳئی ہے سائٹ فی الحال سہارا تھئی کائنی @@ -435,8 +429,6 @@ %1$s کیتے کوکی بینر گھٹاوݨ بند کروں؟ - - ایہ سائٹ کوکی بینر گھٹاوݨ ولوں حمایت یافتہ کائنی۔ بھلا تساں ساݙی ٹیم کوں ایں ویب سائٹ تے نظرثانی کرݨ تے مستقبل وچ سپورٹ شامل کرݨ پسند کریسو؟ %1$s ایں سائٹ دیاں کوکیاں صاف کریسی تے ورقہ تازہ کریسی۔ساریاں کوکیاں صاف کرݨ نال تساں سائن آوٹ تھی سڳدے ہو یا تہاݙی خریداری ریڑھی خالی تھی ویسی۔ @@ -539,6 +531,7 @@ کݙاہیں نہ ٻاہرلا ڈاؤن لوڈ منیجر + ایڈ ــ آن @@ -1508,12 +1501,8 @@ حفاظتی ترتیباں بہتر ٹریکنگ حفاظت - - بغیر فالو تھئے براؤز کرو ہݨ پوری کوکی حفاظت دی خاصیت، کراس سائٹ ٹریکراں دے خلاف ساݙی سب کنوں تکڑی رکاوٹ۔ - - آپݨاں ڈیٹا آپݨے کول رکھو۔ %s تہاکوں ٻہوں سارے ݙاڈھے عام ٹریکراں کنوں بچیندے، جہڑے تہاݙے آن لائن کم کوں فالو کریندن۔ %s تہاکوں ٻہوں سارے ݙاڈھے عام ٹریکراں کنوں بچیندے، جہڑے تہاݙے آن لائن کم کوں فالو کریندن۔ @@ -1521,16 +1510,12 @@ معیاری (پہلے کنوں مقرر) - کارکردگی تے رازداری کیتے متوازن تھیا، ورقے معمول دے مطابق لوڈ تھیندن۔ - ورقے ٹھیک لوڈ تھیسن، پر کجھ ٹریکرز بلاک ہوسن۔ معیاری ٹریکنگ تحفظ نال کیا بلاک ہے سخت - ورقیاں کوں تکھیرا لوڈ کرݨ سانگے ٻئے ٹریکراں کوں بلاک کریندے، پر ورقے تے کجھ فعالت ترٹ سڳدی ہے۔ - مظبوط ٹریکنگ تحفظ تے تکھیری کارکردگی، پر کجھ سائٹاں ٹھیک کم کائناں کریسن۔ سخت ٹریکنگ تحفظ نال کیا بلاک ہے @@ -1910,6 +1895,8 @@ تند یوآرایل ڳولو ورتݨ کیتے تند ڳولو + + ڳولݨ دے ورتݨ کیتے یوآرایل “%s” نال سوال وٹاؤ۔ مثال:\nhttps://www.google.com/search?q=%s diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml index 3cf04ec2d..701225174 100644 --- a/app/src/main/res/values-szl/strings.xml +++ b/app/src/main/res/values-szl/strings.xml @@ -478,6 +478,8 @@ Gesty Przipasuj + + Wluguj sie, coby synchrōnizować karty, zokłodki, hasła i inksze. Kōnto Firefox @@ -518,14 +520,30 @@ Ôtwiyrej linki w aplikacyjach + + Dycki + + Pytej przed ôtwarciym + + Żodyn roz Zewnyntrzny menedżer pobiyranio + + Załōncz protokōł Gecko + + Zawiyranie aplikacyje, coby przidać zmiany… + Rozszyrzynia Powiadōmiynia + + Przizwōlōne + + Niyprzizwolōne + Włosno kolekcyjo rozszyrzyń @@ -550,6 +568,12 @@ Niydowno nawiedzōne + + Historyje do pōmedykowanio + + Historyje z usugi %s + + Spōnsorowane nowiny Tapety @@ -563,12 +587,39 @@ Pokoż + + Niy szło pobrać tapety + + Sprōbuj jeszcze roz + + Niy szło zmiynić tapety + + Przewiydz sie wiyncyj + + Klasyczny %s + + + Limitowano edycyjo + + Nowo kolekcyjo niyznoleżnych głosōw. %s + + Nowo kolekcyjo niyznoleżnych głosōw. + + Sprōbuj kapki farby + + Ôbier se tapeta, co ci pasuje. + + Wezdrzij na inksze tapety + Rozszyrzynie niy ma ôbsugowane Rozszyrzynie je już zainstalowane + + + Regiyruj kōntym Synchrōnizuj teroz @@ -701,6 +752,24 @@ Zawrzij + + Ôdwrzić %d kart? + + Jak ôdewrzisz tela kart, to aplikacyjo %s sie spōmali przi ladowaniu tych strōn. Na zicher ôdewrzić tela kart? + + Ôdewrzij karty + + Pociep + + + Strōny: %d + + Strōny: %d + Niydowno zawarte karty @@ -755,6 +824,13 @@ Zawiyrej po miesiōncu + + Ôdewrzij na dōmowyj strōnie + + Ôdewrzij na ôstatnij karcie + + Ôdewrzij na dōmowyj strōnie po sztyrech godzinach + Dej stare karty do niyaktywnych @@ -923,6 +999,10 @@ Ôdewrzij w nowyj karcie Ôdewrzij we prywatnyj karcie + + Ôdwerzij wszyske w nowych kartach + + Ôdewrzij wszyske we prywatnych kartach Skasuj @@ -1017,6 +1097,12 @@ Wyjōntki Wyłōnczōne + + Sztandardowe + + Surowe + + Włosne Zgoda na klang i video @@ -1097,6 +1183,14 @@ Udostympnij + + Spamiyntej za PDF + + Niy szło wygynerować PDFa + + Niy idzie wydurkować + + Durkuj Poślij na maszina @@ -1109,7 +1203,9 @@ Skopiowane do skrytki Wloguj sie do synchrōnizacyje - + + Synchrōnizuj i spamiyntej dane + Poślij na wszyske masziny Połōncz zaś ze synchrōnizacyjōm @@ -1139,6 +1235,16 @@ Marketing + + Firefox je gibki i prywatny + + + Nastow Firefox za bazowo przeglōndarka + + Sprōbuj prywatnego przeglōndanio + Kolekcyjo je skasowano From 2eb91b600fcebbe217fbc968dab324d6455883eb Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Wed, 12 Jul 2023 18:09:05 +0300 Subject: [PATCH 077/207] Bug 1842179 - Enable Unified Search in all UI tests --- .../fenix/helpers/FeatureSettingsHelper.kt | 10 --------- .../helpers/FeatureSettingsHelperDelegate.kt | 8 ------- .../fenix/helpers/HomeActivityTestRule.kt | 14 ------------- .../org/mozilla/fenix/ui/BookmarksTest.kt | 2 +- .../java/org/mozilla/fenix/ui/HistoryTest.kt | 2 +- .../org/mozilla/fenix/ui/HomeScreenTest.kt | 1 - .../org/mozilla/fenix/ui/OnboardingTest.kt | 2 +- .../java/org/mozilla/fenix/ui/SearchTest.kt | 2 -- .../mozilla/fenix/ui/SettingsSearchTest.kt | 2 +- .../fenix/ui/SponsoredShortcutsTest.kt | 21 ------------------- .../org/mozilla/fenix/ui/TextSelectionTest.kt | 8 +++---- .../fenix/ui/robots/HomeScreenRobot.kt | 16 +------------- 12 files changed, 9 insertions(+), 79 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt index 87444ff6f..a95fb9216 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt @@ -82,16 +82,6 @@ interface FeatureSettingsHelper { */ var tabsTrayRewriteEnabled: Boolean - /** - * Enable or disable the Unified search feature. - */ - var isUnifiedSearchEnabled: Boolean - - /** - * Enable or disable the Unified search settings feature. - */ - var newSearchSettingsEnabled: Boolean - fun applyFlagUpdates() fun resetAllFeatureFlags() diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt index ecc1c31d2..cf1828002 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt @@ -31,14 +31,12 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper { isRecentlyVisitedFeatureEnabled = settings.historyMetadataUIFeature, isPWAsPromptEnabled = !settings.userKnowsAboutPwas, isTCPCFREnabled = settings.shouldShowTotalCookieProtectionCFR, - isUnifiedSearchEnabled = false, isWallpaperOnboardingEnabled = settings.showWallpaperOnboarding, isDeleteSitePermissionsEnabled = settings.deleteSitePermissions, isCookieBannerReductionDialogEnabled = !settings.userOptOutOfReEngageCookieBannerDialog, isOpenInAppBannerEnabled = settings.shouldShowOpenInAppBanner, etpPolicy = getETPPolicy(settings), tabsTrayRewriteEnabled = settings.enableTabsTrayToCompose, - newSearchSettingsEnabled = false, ) /** @@ -57,8 +55,6 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper { } } - override var isUnifiedSearchEnabled: Boolean by updatedFeatureFlags::isUnifiedSearchEnabled - override var newSearchSettingsEnabled: Boolean by updatedFeatureFlags::newSearchSettingsEnabled override var isPocketEnabled: Boolean by updatedFeatureFlags::isPocketEnabled override var isJumpBackInCFREnabled: Boolean by updatedFeatureFlags::isJumpBackInCFREnabled override var isWallpaperOnboardingEnabled: Boolean by updatedFeatureFlags::isWallpaperOnboardingEnabled @@ -90,13 +86,11 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper { settings.historyMetadataUIFeature = featureFlags.isRecentlyVisitedFeatureEnabled settings.userKnowsAboutPwas = !featureFlags.isPWAsPromptEnabled settings.shouldShowTotalCookieProtectionCFR = featureFlags.isTCPCFREnabled - settings.showUnifiedSearchFeature = featureFlags.isUnifiedSearchEnabled settings.showWallpaperOnboarding = featureFlags.isWallpaperOnboardingEnabled settings.deleteSitePermissions = featureFlags.isDeleteSitePermissionsEnabled settings.userOptOutOfReEngageCookieBannerDialog = !featureFlags.isCookieBannerReductionDialogEnabled settings.shouldShowOpenInAppBanner = featureFlags.isOpenInAppBannerEnabled settings.enableTabsTrayToCompose = featureFlags.tabsTrayRewriteEnabled - settings.enableUnifiedSearchSettingsUI = featureFlags.newSearchSettingsEnabled setETPPolicy(featureFlags.etpPolicy) } } @@ -110,14 +104,12 @@ private data class FeatureFlags( var isRecentlyVisitedFeatureEnabled: Boolean, var isPWAsPromptEnabled: Boolean, var isTCPCFREnabled: Boolean, - var isUnifiedSearchEnabled: Boolean, var isWallpaperOnboardingEnabled: Boolean, var isDeleteSitePermissionsEnabled: Boolean, var isCookieBannerReductionDialogEnabled: Boolean, var isOpenInAppBannerEnabled: Boolean, var etpPolicy: ETPPolicy, var tabsTrayRewriteEnabled: Boolean, - var newSearchSettingsEnabled: Boolean, ) internal fun getETPPolicy(settings: Settings): ETPPolicy { diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt index 554bbda13..dd8b13e14 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt @@ -56,8 +56,6 @@ class HomeActivityTestRule( isOpenInAppBannerEnabled: Boolean = settings.shouldShowOpenInAppBanner, etpPolicy: ETPPolicy = getETPPolicy(settings), tabsTrayRewriteEnabled: Boolean = false, - isUnifiedSearchEnabled: Boolean = false, - newSearchSettingsEnabled: Boolean = false, ) : this(initialTouchMode, launchActivity, skipOnboarding) { this.isHomeOnboardingDialogEnabled = isHomeOnboardingDialogEnabled this.isPocketEnabled = isPocketEnabled @@ -72,8 +70,6 @@ class HomeActivityTestRule( this.isOpenInAppBannerEnabled = isOpenInAppBannerEnabled this.etpPolicy = etpPolicy this.tabsTrayRewriteEnabled = tabsTrayRewriteEnabled - this.isUnifiedSearchEnabled = isUnifiedSearchEnabled - this.newSearchSettingsEnabled = newSearchSettingsEnabled } /** @@ -129,8 +125,6 @@ class HomeActivityTestRule( isWallpaperOnboardingEnabled = false, isCookieBannerReductionDialogEnabled = false, isOpenInAppBannerEnabled = false, - isUnifiedSearchEnabled = false, - newSearchSettingsEnabled = false, ) } } @@ -164,8 +158,6 @@ class HomeActivityIntentTestRule internal constructor( isRecentlyVisitedFeatureEnabled: Boolean = settings.historyMetadataUIFeature, isPWAsPromptEnabled: Boolean = !settings.userKnowsAboutPwas, isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR, - isUnifiedSearchEnabled: Boolean = false, - newSearchSettingsEnabled: Boolean = false, isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding, isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions, isCookieBannerReductionDialogEnabled: Boolean = !settings.userOptOutOfReEngageCookieBannerDialog, @@ -180,8 +172,6 @@ class HomeActivityIntentTestRule internal constructor( this.isRecentlyVisitedFeatureEnabled = isRecentlyVisitedFeatureEnabled this.isPWAsPromptEnabled = isPWAsPromptEnabled this.isTCPCFREnabled = isTCPCFREnabled - this.isUnifiedSearchEnabled = isUnifiedSearchEnabled - this.newSearchSettingsEnabled = newSearchSettingsEnabled this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled this.isCookieBannerReductionDialogEnabled = isCookieBannerReductionDialogEnabled @@ -269,8 +259,6 @@ class HomeActivityIntentTestRule internal constructor( launchActivity: Boolean = true, skipOnboarding: Boolean = false, tabsTrayRewriteEnabled: Boolean = false, - isUnifiedSearchEnabled: Boolean = false, - newSearchSettingsEnabled: Boolean = false, ) = HomeActivityIntentTestRule( initialTouchMode = initialTouchMode, launchActivity = launchActivity, @@ -279,8 +267,6 @@ class HomeActivityIntentTestRule internal constructor( isJumpBackInCFREnabled = false, isPWAsPromptEnabled = false, isTCPCFREnabled = false, - isUnifiedSearchEnabled = isUnifiedSearchEnabled, - newSearchSettingsEnabled = newSearchSettingsEnabled, isWallpaperOnboardingEnabled = false, isCookieBannerReductionDialogEnabled = false, isOpenInAppBannerEnabled = false, diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index aaa463850..11a72b6e5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -50,7 +50,7 @@ class BookmarksTest { @get:Rule(order = 0) val activityTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule.withDefaultSettingsOverrides(isUnifiedSearchEnabled = true), + HomeActivityIntentTestRule.withDefaultSettingsOverrides(), ) { it.activity } @Rule(order = 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt index dcf50b85b..aeaf73c99 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt @@ -45,7 +45,7 @@ class HistoryTest { @get:Rule val activityTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule.withDefaultSettingsOverrides(isUnifiedSearchEnabled = true), + HomeActivityIntentTestRule.withDefaultSettingsOverrides(), ) { it.activity } @Before diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt index 96bf01118..eaa55e433 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt @@ -71,7 +71,6 @@ class HomeScreenTest { verifyStoriesByTopicItems() verifyCustomizeHomepageButton(true) verifyNavigationToolbar() - verifyDefaultSearchEngine("Google") verifyHomeMenuButton() verifyTabButton() verifyTabCounter("0") diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt index 6d08bd5a5..68e044c31 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt @@ -132,7 +132,7 @@ class OnboardingTest { homeScreen { verifyStartBrowsingButton() }.openSearch { - verifySearchEngineButton() + verifySearchView() verifyKeyboardVisibility() }.dismissSearchBar { verifyStartBrowsingButton() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index c384a1b50..6c8e51ff3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -69,8 +69,6 @@ class SearchTest { isRecentTabsFeatureEnabled = false, isTCPCFREnabled = false, isWallpaperOnboardingEnabled = false, - isUnifiedSearchEnabled = true, - newSearchSettingsEnabled = true, ), ) { it.activity } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 5044ad3a9..f2849fdfd 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -37,7 +37,7 @@ class SettingsSearchTest { @get:Rule val activityTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule.withDefaultSettingsOverrides(isUnifiedSearchEnabled = true, newSearchSettingsEnabled = true), + HomeActivityIntentTestRule.withDefaultSettingsOverrides(), ) { it.activity } @Before diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt index bdf2a2211..0f6e0522a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt @@ -17,7 +17,6 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.Constants.defaultTopSitesList import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper -import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.helpers.TestHelper.getSponsoredShortcutTitle import org.mozilla.fenix.ui.robots.homeScreen @@ -120,26 +119,6 @@ class SponsoredShortcutsTest { } } - // The default search engine should not be displayed as a sponsored shortcut - @Test - fun defaultSearchEngineIsNotDisplayedAsSponsoredShortcutTest() { - val sponsoredShortcutTitle = "Amazon" - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - changeDefaultSearchEngine(defaultSearchEngine) - } - - exitMenu() - - homeScreen { - verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle, 2) - verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle, 3) - } - } - // 1 sponsored shortcut should be displayed if there are 7 pinned top sites @Test fun verifySponsoredShortcutsListWithSevenPinnedSitesTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TextSelectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TextSelectionTest.kt index 7f53a9205..4c3d5f516 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TextSelectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TextSelectionTest.kt @@ -118,7 +118,7 @@ class TextSelectionTest { clickContextMenuItem("Search") mDevice.waitForIdle() verifyTabCounter("2") - verifyUrl("google") + verifyUrl("content") } } @@ -136,7 +136,7 @@ class TextSelectionTest { clickContextMenuItem("Private Search") mDevice.waitForIdle() verifyTabCounter("2") - verifyUrl("google") + verifyUrl("content") } } @@ -214,7 +214,7 @@ class TextSelectionTest { longClickPageObject(itemContainingText("Crossing")) clickContextMenuItem("Search") verifyTabCounter("2") - verifyUrl("google") + verifyUrl("Crossing") } } @@ -233,7 +233,7 @@ class TextSelectionTest { longClickPageObject(itemContainingText("Crossing")) clickContextMenuItem("Private Search") verifyTabCounter("2") - verifyUrl("google") + verifyUrl("Crossing") } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index a12fb339b..e96fdc0b4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -6,7 +6,6 @@ package org.mozilla.fenix.ui.robots -import android.graphics.Bitmap import android.view.View import android.widget.EditText import android.widget.TextView @@ -78,7 +77,6 @@ import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull -import org.mozilla.fenix.helpers.withBitmapDrawable import org.mozilla.fenix.tabstray.TabsTrayTestTag import org.mozilla.fenix.utils.Settings @@ -207,10 +205,9 @@ class HomeScreenRobot { assertItemWithResIdExists(homepageWordmark) } fun verifyHomeComponent() = assertHomeComponent() - fun verifyDefaultSearchEngine(searchEngine: String) = verifySearchEngineIcon(searchEngine) + fun verifyTabCounter(numberOfOpenTabs: String) = assertItemWithResIdAndTextExists(tabCounter(numberOfOpenTabs)) - fun verifyKeyboardVisible() = assertKeyboardVisibility(isExpectedToBeVisible = true) fun verifyWallpaperImageApplied(isEnabled: Boolean) { if (isEnabled) { @@ -942,20 +939,9 @@ private fun assertHomeComponent() = private fun threeDotButton() = onView(allOf(withId(R.id.menuButton))) -private fun verifySearchEngineIcon(searchEngineIcon: Bitmap, searchEngineName: String) { - onView(withId(R.id.search_engine_icon)) - .check(matches(withBitmapDrawable(searchEngineIcon, searchEngineName))) -} - private fun getSearchEngine(searchEngineName: String) = appContext.components.core.store.state.search.searchEngines.find { it.name == searchEngineName } -private fun verifySearchEngineIcon(searchEngineName: String) { - val defaultSearchEngine = getSearchEngine(searchEngineName) - ?: throw AssertionError("No search engine with name $searchEngineName") - verifySearchEngineIcon(defaultSearchEngine.icon, defaultSearchEngine.name) -} - private fun collectionTitle(title: String, rule: ComposeTestRule) = rule.onNode(hasText(title)) From 9371840058353c00136f5743ff81a918543af199 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Mon, 10 Jul 2023 14:13:08 -0700 Subject: [PATCH 078/207] Bug 1842257 - Convert `SettingsDeleteBrowsingDataTest` to support Tabs Tray rewrite --- .../ComposeSettingsDeleteBrowsingDataTest.kt | 269 ++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt new file mode 100644 index 000000000..d9b2eacd3 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataTest.kt @@ -0,0 +1,269 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.R +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset +import org.mozilla.fenix.helpers.TestHelper.exitMenu +import org.mozilla.fenix.helpers.TestHelper.getStringResource +import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.restartApp +import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled +import org.mozilla.fenix.ui.robots.browserScreen +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.settingsScreen + +/** + * Tests for verifying the Settings for: + * Delete Browsing Data + */ + +class ComposeSettingsDeleteBrowsingDataTest { + private lateinit var mockWebServer: MockWebServer + + @get:Rule + val composeTestRule = + AndroidComposeTestRule( + HomeActivityIntentTestRule.withDefaultSettingsOverrides( + skipOnboarding = true, + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Before + fun setUp() { + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun deleteBrowsingDataOptionStatesTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + verifyAllCheckBoxesAreChecked() + switchBrowsingHistoryCheckBox() + switchCachedFilesCheckBox() + verifyOpenTabsCheckBox(true) + verifyBrowsingHistoryDetails(false) + verifyCookiesCheckBox(true) + verifyCachedFilesCheckBox(false) + verifySitePermissionsCheckBox(true) + verifyDownloadsCheckBox(true) + } + + restartApp(composeTestRule.activityRule) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + verifyOpenTabsCheckBox(true) + verifyBrowsingHistoryDetails(false) + verifyCookiesCheckBox(true) + verifyCachedFilesCheckBox(false) + verifySitePermissionsCheckBox(true) + verifyDownloadsCheckBox(true) + switchOpenTabsCheckBox() + switchBrowsingHistoryCheckBox() + switchCookiesCheckBox() + switchCachedFilesCheckBox() + switchSitePermissionsCheckBox() + switchDownloadsCheckBox() + verifyOpenTabsCheckBox(false) + verifyBrowsingHistoryDetails(true) + verifyCookiesCheckBox(false) + verifyCachedFilesCheckBox(true) + verifySitePermissionsCheckBox(false) + verifyDownloadsCheckBox(false) + } + + restartApp(composeTestRule.activityRule) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + verifyOpenTabsCheckBox(false) + verifyBrowsingHistoryDetails(true) + verifyCookiesCheckBox(false) + verifyCachedFilesCheckBox(true) + verifySitePermissionsCheckBox(false) + verifyDownloadsCheckBox(false) + } + } + + @Test + fun deleteTabsDataWithNoOpenTabsTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + verifyAllCheckBoxesAreChecked() + selectOnlyOpenTabsCheckBox() + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + confirmDeletionAndAssertSnackbar() + } + settingsScreen { + verifyGeneralHeading() + } + } + + @SmokeTest + @Test + fun deleteTabsDataTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + verifyAllCheckBoxesAreChecked() + selectOnlyOpenTabsCheckBox() + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + clickDialogCancelButton() + verifyOpenTabsCheckBox(true) + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + confirmDeletionAndAssertSnackbar() + } + settingsScreen { + verifyGeneralHeading() + }.openSettingsSubMenuDeleteBrowsingData { + verifyOpenTabsDetails("0") + }.goBack { + }.goBack { + }.openComposeTabDrawer(composeTestRule) { + verifyNoOpenTabsInNormalBrowsing() + } + } + + @SmokeTest + @Test + fun deleteBrowsingHistoryAndSiteDataTest() { + val storageWritePage = getStorageTestAsset(mockWebServer, "storage_write.html").url + val storageCheckPage = getStorageTestAsset(mockWebServer, "storage_check.html").url + + navigationToolbar { + }.enterURLAndEnterToBrowser(storageWritePage) { + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(storageCheckPage) { + verifyPageContent("Session storage has value") + verifyPageContent("Local storage has value") + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + verifyBrowsingHistoryDetails("2") + selectOnlyBrowsingHistoryCheckBox() + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + clickDialogCancelButton() + verifyBrowsingHistoryDetails(true) + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + confirmDeletionAndAssertSnackbar() + verifyBrowsingHistoryDetails("0") + exitMenu() + } + navigationToolbar { + }.openThreeDotMenu { + }.openHistory { + verifyEmptyHistoryView() + mDevice.pressBack() + } + navigationToolbar { + }.enterURLAndEnterToBrowser(storageCheckPage) { + verifyPageContent("Session storage empty") + verifyPageContent("Local storage empty") + } + } + + @SmokeTest + @Test + fun deleteCookiesTest() { + val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val cookiesTestPage = getStorageTestAsset(mockWebServer, "storage_write.html").url + + // Browsing a generic page to allow GV to load on a fresh run + navigationToolbar { + }.enterURLAndEnterToBrowser(genericPage.url) { + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(cookiesTestPage) { + verifyPageContent("No cookies set") + clickPageObject(itemWithResId("setCookies")) + verifyPageContent("user=android") + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + selectOnlyCookiesCheckBox() + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + confirmDeletionAndAssertSnackbar() + exitMenu() + } + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + verifyPageContent("No cookies set") + } + } + + @SmokeTest + @Test + fun deleteCachedFilesTest() { + val pocketTopArticles = getStringResource(R.string.pocket_pinned_top_articles) + + homeScreen { + verifyExistingTopSitesTabs(pocketTopArticles) + }.openTopSiteTabWithTitle(pocketTopArticles) { + waitForPageToLoad() + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery("about:cache") { + // disabling wifi to prevent downloads in the background + setNetworkEnabled(enabled = false) + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingData { + selectOnlyCachedFilesCheckBox() + clickDeleteBrowsingDataButton() + verifyDeleteBrowsingDataDialog() + confirmDeletionAndAssertSnackbar() + exitMenu() + } + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + verifyNetworkCacheIsEmpty("memory") + verifyNetworkCacheIsEmpty("disk") + } + setNetworkEnabled(enabled = true) + } +} From a9f6299b0518ad7156ffd2bc06a4d1b558eb80ec Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Mon, 10 Jul 2023 12:13:39 -0700 Subject: [PATCH 079/207] Bug 1842095 - Convert `SettingsDeleteBrowsingDataOnQuitTest` to support Tabs Tray rewrite --- ...oseSettingsDeleteBrowsingDataOnQuitTest.kt | 260 ++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataOnQuitTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataOnQuitTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataOnQuitTest.kt new file mode 100644 index 000000000..1f8997236 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSettingsDeleteBrowsingDataOnQuitTest.kt @@ -0,0 +1,260 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import android.Manifest +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.core.net.toUri +import androidx.test.espresso.Espresso.pressBack +import androidx.test.rule.GrantPermissionRule +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.R +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.MatcherHelper +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset +import org.mozilla.fenix.helpers.TestHelper +import org.mozilla.fenix.helpers.TestHelper.deleteDownloadedFileOnStorage +import org.mozilla.fenix.helpers.TestHelper.exitMenu +import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.restartApp +import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests for verifying the Settings for: + * Delete Browsing Data on quit + * + */ +class ComposeSettingsDeleteBrowsingDataOnQuitTest { + private lateinit var mockWebServer: MockWebServer + + @get:Rule(order = 0) + val composeTestRule = + AndroidComposeTestRule( + HomeActivityIntentTestRule.withDefaultSettingsOverrides( + skipOnboarding = true, + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + // Automatically allows app permissions, avoiding a system dialog showing up. + @get:Rule(order = 1) + val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant( + Manifest.permission.RECORD_AUDIO, + ) + + @Before + fun setUp() { + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun deleteBrowsingDataOnQuitSettingsItemsTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingDataOnQuit { + verifyNavigationToolBarHeader() + verifyDeleteBrowsingOnQuitEnabled(false) + verifyDeleteBrowsingOnQuitButtonSummary() + verifyDeleteBrowsingOnQuitEnabled(false) + clickDeleteBrowsingOnQuitButtonSwitch() + verifyDeleteBrowsingOnQuitEnabled(true) + verifyAllTheCheckBoxesText() + verifyAllTheCheckBoxesChecked(true) + }.goBack { + verifySettingsOptionSummary("Delete browsing data on quit", "On") + }.goBack { + }.openThreeDotMenu { + verifyQuitButtonExists() + pressBack() + } + navigationToolbar { + }.enterURLAndEnterToBrowser("test".toUri()) { + }.openThreeDotMenu { + verifyQuitButtonExists() + } + } + + @Test + fun deleteOpenTabsOnQuitTest() { + val testPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingDataOnQuit { + clickDeleteBrowsingOnQuitButtonSwitch() + exitMenu() + } + navigationToolbar { + }.enterURLAndEnterToBrowser(testPage.url) { + }.goToHomescreen { + }.openThreeDotMenu { + clickQuit() + restartApp(composeTestRule.activityRule) + } + homeScreen { + }.openComposeTabDrawer(composeTestRule) { + verifyNoOpenTabsInNormalBrowsing() + } + } + + @Test + fun deleteHistoryAndSiteStorageOnQuitTest() { + val storageWritePage = + getStorageTestAsset(mockWebServer, "storage_write.html") + val storageCheckPage = + getStorageTestAsset(mockWebServer, "storage_check.html") + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingDataOnQuit { + clickDeleteBrowsingOnQuitButtonSwitch() + exitMenu() + } + navigationToolbar { + }.enterURLAndEnterToBrowser(storageWritePage.url) { + clickPageObject(MatcherHelper.itemWithText("Set cookies")) + verifyPageContent("Values written to storage") + }.goToHomescreen { + }.openThreeDotMenu { + clickQuit() + restartApp(composeTestRule.activityRule) + } + + homeScreen { + }.openThreeDotMenu { + }.openHistory { + verifyEmptyHistoryView() + exitMenu() + } + navigationToolbar { + }.enterURLAndEnterToBrowser(storageCheckPage.url) { + verifyPageContent("Session storage empty") + verifyPageContent("Local storage empty") + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(storageWritePage.url) { + verifyPageContent("No cookies set") + } + } + + @SmokeTest + @Test + fun deleteDownloadsOnQuitTest() { + val downloadTestPage = "https://storage.googleapis.com/mobile_test_assets/test_app/downloads.html" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingDataOnQuit { + clickDeleteBrowsingOnQuitButtonSwitch() + exitMenu() + } + navigationToolbar { + }.enterURLAndEnterToBrowser(downloadTestPage.toUri()) { + }.clickDownloadLink("smallZip.zip") { + verifyDownloadPrompt("smallZip.zip") + }.clickDownload { + verifyDownloadNotificationPopup() + }.closeCompletedDownloadPrompt { + }.goToHomescreen { + }.openThreeDotMenu { + clickQuit() + mDevice.waitForIdle() + } + restartApp(composeTestRule.activityRule) + homeScreen { + }.openThreeDotMenu { + }.openDownloadsManager { + verifyEmptyDownloadsList() + } + deleteDownloadedFileOnStorage("smallZip.zip") + } + + @SmokeTest + @Test + fun deleteSitePermissionsOnQuitTest() { + val testPage = "https://mozilla-mobile.github.io/testapp/permissions" + val testPageSubstring = "https://mozilla-mobile.github.io:443" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingDataOnQuit { + clickDeleteBrowsingOnQuitButtonSwitch() + exitMenu() + } + navigationToolbar { + }.enterURLAndEnterToBrowser(testPage.toUri()) { + waitForPageToLoad() + }.clickStartMicrophoneButton { + verifyMicrophonePermissionPrompt(testPageSubstring) + selectRememberPermissionDecision() + }.clickPagePermissionButton(false) { + verifyPageContent("Microphone not allowed") + }.goToHomescreen { + }.openThreeDotMenu { + clickQuit() + mDevice.waitForIdle() + } + restartApp(composeTestRule.activityRule) + navigationToolbar { + }.enterURLAndEnterToBrowser(testPage.toUri()) { + waitForPageToLoad() + }.clickStartMicrophoneButton { + verifyMicrophonePermissionPrompt(testPageSubstring) + } + } + + @Test + fun deleteCachedFilesOnQuitTest() { + val pocketTopArticles = TestHelper.getStringResource(R.string.pocket_pinned_top_articles) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSettingsSubMenuDeleteBrowsingDataOnQuit { + clickDeleteBrowsingOnQuitButtonSwitch() + exitMenu() + } + homeScreen { + verifyExistingTopSitesTabs(pocketTopArticles) + }.openTopSiteTabWithTitle(pocketTopArticles) { + waitForPageToLoad() + }.goToHomescreen { + }.openThreeDotMenu { + clickQuit() + mDevice.waitForIdle() + } + // disabling wifi to prevent downloads in the background + setNetworkEnabled(enabled = false) + restartApp(composeTestRule.activityRule) + navigationToolbar { + }.enterURLAndEnterToBrowser("about:cache".toUri()) { + verifyNetworkCacheIsEmpty("memory") + verifyNetworkCacheIsEmpty("disk") + } + setNetworkEnabled(enabled = true) + } +} From ccd775b5cd1d82accdafd6496ca7ec0e1360bad0 Mon Sep 17 00:00:00 2001 From: Harrison Oglesby Date: Fri, 14 Jul 2023 11:49:30 -0700 Subject: [PATCH 080/207] Bug 1842082 - Standard home screen view count telemetry --- app/metrics.yaml | 18 ++++++++++++++++++ .../org/mozilla/fenix/home/HomeFragment.kt | 3 +++ 2 files changed, 21 insertions(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index ba3a52413..6e5d27485 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -8940,6 +8940,24 @@ home_screen: metadata: tags: - HomeScreen + standard_homepage_view_count: + type: counter + description: | + The number of times the standard browsing mode home screen was + displayed to the user. (for tile counts) + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1842082 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/2841 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + - cgordon@mozilla.com + expires: never + metadata: + tags: + - HomeScreen home_screen_view_count: type: counter description: | diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index f2d5f6943..a73dfcd8a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -526,6 +526,9 @@ class HomeFragment : Fragment() { super.onViewCreated(view, savedInstanceState) HomeScreen.homeScreenDisplayed.record(NoExtras()) HomeScreen.homeScreenViewCount.add() + if (!browsingModeManager.mode.isPrivate) { + HomeScreen.standardHomepageViewCount.add() + } observeSearchEngineNameChanges() observeWallpaperUpdates() From 36414d3632c55ff4c296e5d0f837d4d5933dda89 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 14 Jul 2023 14:19:52 -0400 Subject: [PATCH 081/207] Bug 1843610 - Add telemetry for deferred deep link test --- app/metrics.yaml | 21 +++++++++++++++++++ app/src/main/AndroidManifest.xml | 2 ++ .../java/org/mozilla/fenix/HomeActivity.kt | 4 ++++ .../intent/HomeDeepLinkIntentProcessor.kt | 5 +++++ 4 files changed, 32 insertions(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index 6e5d27485..0e1d4851b 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -7359,6 +7359,27 @@ play_store_attribution: tags: - Attribution - Performance + deferred_deeplink_time: + type: timespan + time_unit: millisecond + send_in_pings: + - metrics + description: | + The time that it takes to receive deferred deeplink from the Google Play Store. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1843610 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/2851 + data_sensitivity: + - technical + notification_emails: + - android-probes@mozilla.com + expires: 128 + metadata: + tags: + - Attribution + - Performance + browser.search: with_ads: type: labeled_counter diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 05cee9eab..302b5ed10 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -146,6 +146,8 @@ android:host="urls_bookmarks"/> + diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 4db7bf1a9..f31547987 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -86,6 +86,7 @@ import org.mozilla.experiments.nimbus.initializeTooling import org.mozilla.fenix.GleanMetrics.AppIcon import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Metrics +import org.mozilla.fenix.GleanMetrics.PlayStoreAttribution import org.mozilla.fenix.GleanMetrics.SplashScreen import org.mozilla.fenix.GleanMetrics.StartOnHome import org.mozilla.fenix.addons.AddonDetailsFragmentDirections @@ -235,6 +236,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { components.strictMode.attachListenerToDisablePenaltyDeath(supportFragmentManager) MarkersFragmentLifecycleCallbacks.register(supportFragmentManager, components.core.engine) + PlayStoreAttribution.deferredDeeplinkTime.start() maybeShowSplashScreen() // There is disk read violations on some devices such as samsung and pixel for android 9/10 @@ -545,6 +547,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { "finishing" to isFinishing.toString(), ), ) + + PlayStoreAttribution.deferredDeeplinkTime.cancel() } final override fun onPause() { diff --git a/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt b/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt index 8900a0a9d..bf926efcf 100644 --- a/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt @@ -15,6 +15,7 @@ import mozilla.components.concept.engine.EngineSession import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.BuildConfig +import org.mozilla.fenix.GleanMetrics.PlayStoreAttribution import org.mozilla.fenix.GlobalDirections import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.browser.browsingmode.BrowsingMode @@ -61,6 +62,10 @@ class HomeDeepLinkIntentProcessor( "settings_privacy" -> GlobalDirections.Settings "settings_wallpapers" -> GlobalDirections.WallpaperSettings "home_collections" -> GlobalDirections.Home + "test_deferred_deep_link" -> { + PlayStoreAttribution.deferredDeeplinkTime.stop() + return + } else -> return } From 185179a4aeab96516cb6381aafc1cf85f44bf29a Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 15 Jul 2023 00:03:27 +0000 Subject: [PATCH 082/207] Import translations from android-l10n --- app/src/main/res/values-gl/strings.xml | 49 ++++++++++--------------- app/src/main/res/values-skr/strings.xml | 33 ++++++++++------- 2 files changed, 38 insertions(+), 44 deletions(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 06aa8b546..47c452d54 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -296,52 +296,52 @@ Agora non - + - Faga de %s o seu navegador de referencia + Faga de %s o seu navegador de referencia Faga de Firefox o seu navegador de referencia - %1$s pon á xente por riba dos beneficios e defende a súa privacidade bloqueando os rastrexadores entre sitios.\n\nMáis información no noso %2$s. + %1$s pon á xente por riba dos beneficios e defende a súa privacidade bloqueando os rastrexadores entre sitios.\n\nMáis información no noso %2$s. Firefox pon ás persoas por riba dos beneficios e defende a súa privacidade bloqueando os rastrexadores entre sitios.\n\nMáis información no noso aviso de privacidade. - política de privacidade + política de privacidade - Estabelecer como navegador predeterminado + Estabelecer como navegador predeterminado - Agora non + Agora non - Alterne entre o teléfono e o portátil + Alterne entre o teléfono e o portátil - Recupere as lapelas e os contrasinais dos seus outros dispositivos para retomalo onde o deixou. + Recupere as lapelas e os contrasinais dos seus outros dispositivos para retomalo onde o deixou. - Acceder + Acceder - Agora non + Agora non - As notificacións axúdanlle a facer máis con %s + As notificacións axúdanlle a facer máis con %s As notificacións axúdanlle a facer máis con Firefox - Envía lapelas entre dispositivos, xestiona as descargas e recibe consellos para sacar o máximo proveito de %s. + Envía lapelas entre dispositivos, xestiona as descargas e recibe consellos para sacar o máximo proveito de %s. Envía lapelas entre dispositivos, xestiona as descargas e recibe consellos para sacar o máximo proveito de Firefox. - Activar as notificacións + Activar as notificacións - Agora non + Agora non @@ -421,18 +421,12 @@ Enviar solicitude - Redución do aviso de cookies - Quere solicitar soporte para este sitio? - A solicitude de soporte enviouse. - Solicitude enviada Activado para este sitio - A solicitude de soporte enviouse - Solicitude de soporte enviada Sitio actualmente non soportado @@ -440,8 +434,6 @@ Quere activar a redución do aviso de cookies para %1$s? Quere desactivar a redución do aviso de cookies para %1$s? - - Este sitio actualmente non é compatible coa Redución de Avisos de Cookies. Gustaríallee que o noso equipo revise este sitio web e engada soporte no futuro? %1$s non pode rexeitar automaticamente as solicitudes de cookies neste sitio. Pode enviar unha solicitude para soportar este sitio no futuro. @@ -543,6 +535,11 @@ Nunca Xestor de descargas externo + + Activar os rexistros de Gecko + + Saíndo da aplicación para aplicar os cambios… + Complementos @@ -1490,12 +1487,8 @@ Configuración da protección Protección mellorada contra o rastrexo - - Navegue sen que lle fagan seguimento Agora con Total Cookie Protection, a nosa barreira máis poderosa ata agora contra os rastrexadores entre sitios. - - Manteña os seus datos para si mesmo. %s protexe de moitos dos rastreadores máis comúns que seguen o que vostede fai na Rede. %s protéxeo de moitos dos rastrexadores máis comúns que seguen o que fas en liña. @@ -1503,16 +1496,12 @@ Estándar (predeterminado) - Equilibrado para privacidade e rendemento. As páxinas cargan con normalidade. - As páxinas cargarán normalmente, pero bloquearán menos rastrexadores. O que resulta bloqueado pola protección de seguimento estándar Estrito - Bloquea máis rastreadores para que as páxinas carguen máis rápido, pero pode romper algunhas funcionalidades de páxinas. - Maior protección contra o rastrexo e mellor rendemento, pero é posible que algúns sitios non funcionen correctamente. O que resulta bloqueado pola protección de seguimento estrita diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 5e3a966e7..e11a2cafa 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -297,51 +297,51 @@ ہݨ کائناں - + - %s کوں آپݨاں ون٘ڄݨ آلا براؤزر بݨاؤ + %s کوں آپݨاں ون٘ڄݨ آلا براؤزر بݨاؤ فائرفوکس کوں آپݨاں ون٘ڄݨ آلا براؤزر بݨاؤ - %1$s لوکاں کوں منافع کنوں ودھ رکھیندا ہے تے کراس سائٹ ٹریکراں کوں بلاک کر تے تہاݙی رازداری دا دفاع کریند ہے۔\n\nساݙے %2$s وچ ٻیا ڄاݨو۔ + %1$s لوکاں کوں منافع کنوں ودھ رکھیندا ہے تے کراس سائٹ ٹریکراں کوں بلاک کر تے تہاݙی رازداری دا دفاع کریند ہے۔\n\nساݙے %2$s وچ ٻیا ڄاݨو۔ فائرفوکس لوکاں کوں منافع کنوں ودھ رکھیندا ہے تے کراس سائٹ ٹریکراں کوں بلاک کر تے تہاݙی رازداری دا دفاع کریند ہے۔\n\nساݙے رازداری نوٹس وچ ٻیا ڄاݨو۔ - رازداری نوٹس + رازداری نوٹس - پہلوں مقرر براؤز تے طور تے سیٹ کرو + پہلوں مقرر براؤز تے طور تے سیٹ کرو - ہݨ کائناں + ہݨ کائناں - فون سیٹ کنوں لیپ ٹاپ تے ہاپ کرو تے ولدا واپس وی + فون سیٹ کنوں لیپ ٹاپ تے ہاپ کرو تے ولدا واپس وی - تساں آپݨیاں ٻیاں ݙیوائساں نال ٹیباں تے پاس ورڈ گھنو، جتھوں تساں چھوڑیا ہائی۔ + تساں آپݨیاں ٻیاں ݙیوائساں نال ٹیباں تے پاس ورڈ گھنو، جتھوں تساں چھوڑیا ہائی۔ - سائن ان + سائن ان - ہݨ کائناں + ہݨ کائناں - اطلاع نامے %s نال ودھیک کرݨ وچ تہاݙی مدد کریندن۔ + اطلاع نامے %s نال ودھیک کرݨ وچ تہاݙی مدد کریندن۔ اطلاع نامے فائرفوکس نال ودھیک کرݨ وچ تہاݙی مدد کریندن۔ - ڈیوائساں دے درمیان ٹیباں بھیڄو، ڈاؤن لوڈ منیج کرو، تے %s کنوں ودھ کنوں ودھ فائدہ چاوݨ کیتے گُر گھنو۔ + ڈیوائساں دے درمیان ٹیباں بھیڄو، ڈاؤن لوڈ منیج کرو، تے %s کنوں ودھ کنوں ودھ فائدہ چاوݨ کیتے گُر گھنو۔ ڈیوائساں دے درمیان ٹیباں بھیڄو، ڈاؤن لوڈ منیج کرو، تے فائرفوکس کنوں ودھ کنوں ودھ فائدہ چاوݨ کیتے گُر گھنو۔ - اطلاع نامے چالو کرو + اطلاع نامے چالو کرو - ہݨ کائناں + ہݨ کائناں @@ -532,6 +532,11 @@ ٻاہرلا ڈاؤن لوڈ منیجر + + Gecko لاگ فعال کرو + + تبدیلیاں لاگو کرݨ کیتے ایپ چھوڑیندے پئے ہو۔۔۔ + ایڈ ــ آن From 8ebdc7c3ef0faf170c296729125bdecd28cdd2fa Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 16 Jul 2023 00:03:59 +0000 Subject: [PATCH 083/207] Import translations from android-l10n --- app/src/main/res/values-eu/strings.xml | 55 +++++++------- app/src/main/res/values-nb-rNO/strings.xml | 55 ++++++-------- app/src/main/res/values-nn-rNO/strings.xml | 49 +++++-------- app/src/main/res/values-su/strings.xml | 83 +++++++++++++++++----- 4 files changed, 132 insertions(+), 110 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 9fc453eaf..05cb07c21 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -304,51 +304,51 @@ Une honetan ez - + - Egizu %s zure lehenengo nabigatzailea + Egizu %s zure lehenengo nabigatzailea Egizu Firefox zure lehenengo nabigatzailea - %1$s(e)k jendea jartzen du irabazi-asmoen aurretik eta zure pribatutasuna defendatzen du guneen arteko jarraipen-elementuak blokeatuz.\n\nArgibide gehiago gure %2$s. + %1$s(e)k jendea jartzen du irabazi-asmoen aurretik eta zure pribatutasuna defendatzen du guneen arteko jarraipen-elementuak blokeatuz.\n\nArgibide gehiago gure %2$s. Firefoxek jendea jartzen du irabazi-asmoen aurretik eta zure pribatutasuna defendatzen du guneen arteko jarraipen-elementuak blokeatuz.\n\nArgibide gehiago gure pribatutasun-oharrean. - pribatutasun-oharrean + pribatutasun-oharrean - Ezarri nabigatzaile lehenetsi gisa + Ezarri nabigatzaile lehenetsi gisa - Une honetan ez + Une honetan ez - Egin salto telefonotik ordenagailu eramangarrira eta atzera + Egin salto telefonotik ordenagailu eramangarrira eta atzera - Erabili zure beste gailuetako fitxak eta pasahitzak, utzitako lekutik jarraitu ahal izateko. + Erabili zure beste gailuetako fitxak eta pasahitzak, utzitako lekutik jarraitu ahal izateko. - Hasi saioa + Hasi saioa - Une honetan ez + Une honetan ez - Jakinarazpenek %s(r)i zuku gehiago ateratzen laguntzen dute + Jakinarazpenek %s(r)i zuku gehiago ateratzen laguntzen dute Jakinarazpenek Firefoxi zuku gehiago ateratzen laguntzen dizute - Bidali fitxak gailuen artean, kudeatu deskargak eta eskuratu %s(r)i zuku gehien ateratzeko aholkuak. + Bidali fitxak gailuen artean, kudeatu deskargak eta eskuratu %s(r)i zuku gehien ateratzeko aholkuak. Bidali fitxak gailuen artean, kudeatu deskargak eta eskuratu Firefoxi zuku gehien ateratzeko aholkuak. - Aktibatu jakinarazpenak + Aktibatu jakinarazpenak - Une honetan ez + Une honetan ez @@ -429,18 +429,12 @@ Bidali eskaera - Cookie iragarki-banden murrizpena - Eskatu gune honetarako euskarria? - Gunearen euskarria gehitzeko eskaera bidalita. - Eskaera bidalita Aktibatuta gune honetarako - Gunearen euskarria gehitzeko eskaera bidalita - Euskarri-eskaera bidalita Une honetan gune honetarako euskarririk ez @@ -448,8 +442,6 @@ Aktibatu cookie iragarki-banden murrizpena %1$s gunerako? Desaktibatu cookie iragarki-banden murrizpena %1$s gunerako? - - Cookie iragarki-banden murrizpenak oraindik ez du gune honetarako euskarririk. Gure taldeak webgune hau berrikusi eta etorkizunean bere euskarria gehitzea nahi duzu? %1$s(e)k ezin ditu cookie-eskaerak automatikoki baztertu gune honetan. Etorkizunean gune honetarako euskarria gehitzeko eskaera bidal dezakezu. @@ -555,6 +547,11 @@ Inoiz ez Kanpoko deskarga-kudeatzailea + + Gaitu Gecko erregistroak + + Aplikaziotik irteten aldaketak aplikatzeko… + Gehigarriak @@ -638,6 +635,8 @@ Gehigarria instalatuta dago jada + + Kudeatu kontua Sinkronizatu orain @@ -1214,6 +1213,10 @@ Gorde PDF gisa Ezin da PDFa sortu + + Ezin da inprimatu + + Inprimatu Bidali gailura @@ -1506,12 +1509,8 @@ Babesaren ezarpenak Jarraipenaren babes hobetua - - Nabigatu inor segika izan gabe Orain cookien erabateko babesarekin, guneen arteko jarraipen-elementuetarako gure oztopo boteretsuena. - - Mantendu zure datuak zuretzat. Lineako zure jardueraren jarraipena egiten duten elementu ohikoenetatik babesten zaitu %s(e)k. Lineako zure jardueraren jarraipena egiten duten elementu ohikoenetatik babesten zaitu %s(e)k. @@ -1519,16 +1518,12 @@ Oinarrizkoa (lehenetsia) - Pribatutasunerako eta errendimendurako orekatua. Orriak ohi bezala kargatuko dira. - Orriak ohi bezala kargatuko dira baina jarraipen-elementu gutxiago blokeatuko dira. Jarraipenaren oinarrizko babesak blokeatzen duena Zorrotza - Jarraipen-elementu gehiago blokeatzen ditu orriak azkarrago karga daitezen baina orriko zenbait eginbide hauts litezke. - Jarraipenaren babes sendoagoa eta errendimendu hobea baina baliteke zenbait gune ondo ez ibiltzea. Jarraipenaren babes zorrotzak blokeatzen duena diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 8cb19ffa9..73dfc304d 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -302,51 +302,51 @@ Ikke nå - + - Gjør %s til din nettleser + Gjør %s til din nettleser Bruk Firefox som din favorittnettleser - %1$s setter mennesker over fortjeneste og forsvarer personvernet ditt ved å blokkere sporere på tvers av nettsteder.\n\nFinn ut mer i %2$s. + %1$s setter mennesker over fortjeneste og forsvarer personvernet ditt ved å blokkere sporere på tvers av nettsteder.\n\nFinn ut mer i %2$s. Firefox setter mennesker over fortjeneste og forsvarer personvernet ditt ved å blokkere sporere på tvers av nettsteder.\n\nFinn ut mer i personvernerklæringen vår. - personvernerklæring + personvernerklæring - Bruk som standard nettleser + Bruk som standard nettleser - Ikke nå + Ikke nå - Bytt fra telefon til bærbar PC og tilbake + Bytt fra telefon til bærbar PC og tilbake - Hent faner og passord fra de andre enhetene dine for å fortsette der du sluttet. + Hent faner og passord fra de andre enhetene dine for å fortsette der du sluttet. - Logg inn + Logg inn - Ikke nå + Ikke nå - Varsler hjelper deg å gjøre mer med %s + Varsler hjelper deg å gjøre mer med %s Varsler hjelper deg å gjøre mer med Firefox - Send faner mellom enheter, behandle nedlastinger og få tips om hvordan du får mest mulig ut av %s. + Send faner mellom enheter, behandle nedlastinger og få tips om hvordan du får mest mulig ut av %s. Send faner mellom enheter, behandle nedlastinger og få tips om hvordan du får mest mulig ut av Firefox. - Slå på varsler + Slå på varsler - Ikke nå + Ikke nå @@ -426,18 +426,12 @@ Send forespørsel - Redusering av infokapselbanner - Be om støtte for dette nettstedet? - Forespørsel om støtte av nettsted er sendt inn. - Forespørsel sendt På for dette nettstedet - Forespørsel om støtte av nettsted er sendt inn - Støtteforespørsel sendt Nettstedet støttes for øyeblikket ikke @@ -445,8 +439,6 @@ Vil du slå på reduksjon av infokapselbannere for %1$s? Vil du slå av reduksjon av infokapselbannere for %1$s? - - Dette nettstedet er for tiden ikke støttet av Redusering av infokapselbanner. Vil du at teamet vårt skal vurdere dette nettstedet og legge til støtte i fremtiden? %1$s kan ikke automatisk avvise forespørsler om infokapsler på dette nettstedet. Du kan sende en forespørsel om å støtte dette nettstedet i fremtiden. @@ -493,7 +485,7 @@ Selvvalgt synkroniseringsserver - Firefox-konto/synkroniseringsserver endret. Avslutter applikasjonen for å bruke endringer… + Firefox-konto/synkroniseringsserver endret. Avslutter applikasjonen for å legge til endringer… Konto @@ -551,6 +543,11 @@ Aldri Ekstern nedlastingsbehandler + + Slå på Gecko-logger + + Avslutter applikasjonen for å legge til endringer… + Utvidelser @@ -575,7 +572,7 @@ Samlingseier (bruker-ID) - Tilleggssamling endret. Avslutter applikasjonen for å bruke endringer… + Tilleggssamling endret. Avslutter applikasjonen for å legge til endringer… @@ -875,7 +872,7 @@ Avbryt - Avslutter applikasjonen for å iverksette endringer … + Avslutter applikasjonen for å legge til endringer… @@ -1509,13 +1506,9 @@ Innstillinger for beskyttelse Utvidet sporingsbeskyttelse - - Bruk nettet uten å bli overvåket Nå med total beskyttelse mot infokapsler, vår kraftigste barriere til nå mot sporing på tvers av nettsteder. - - Hold dataene for deg selv. %s beskytter deg mot mange av de vanligste sporingsteknologier som følger det du gjør på nettet. %s beskytter deg mot mange av de vanligste sporingsteknologier som følger det du gjør på nettet. @@ -1523,16 +1516,12 @@ Standard (standard) - Balansert mellom personvern og ytelse. Sider lastes normalt. - Sider lastes normalt, men færre sporings-metoder blokkeres. Hva er blokkert av standard sporingsbeskyttelse Streng - - Blokkerer flere sporings-mekanismer. Sider lastes inn raskere, men enkelte sider fungerer kanskje ikke. Sterkere sporingsbeskyttelse og raskere ytelse, men noen nettsteder fungerer kanskje ikke ordentlig. diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 7fc532186..a953b36c3 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -304,51 +304,51 @@ Ikkje no - + - Bruk %s som favorittnettlesar + Bruk %s som favorittnettlesar Bruk Firefox som din faforittnettlesar - %1$s set menneske over forteneste og forsvarar retten din til personvern ved å blokkere sporarar på fleire nettstadar.\n\nLes meir i %2$s. + %1$s set menneske over forteneste og forsvarar retten din til personvern ved å blokkere sporarar på fleire nettstadar.\n\nLes meir i %2$s. Firefox set menneske over forteneste og forsvarar retten din til personvern ved å blokkere sporarar på fleire nettstadar.\n\nLes meir i personvernerklæringa vår. - peronvernerklæring + peronvernerklæring - Bruk som standard nettleser + Bruk som standard nettleser - Ikkje no + Ikkje no - Hopp frå telefonen til datamaskina og tilbake + Hopp frå telefonen til datamaskina og tilbake - Hent faner og passord frå dei andre einingane dine for å halde fram der du slapp. + Hent faner og passord frå dei andre einingane dine for å halde fram der du slapp. - Logg inn + Logg inn - Ikkje no + Ikkje no - Varsel hjelper deg å gjere meir med %s + Varsel hjelper deg å gjere meir med %s Varsel hjelper deg å gjere meir med Firefox - Send faner mellom einingar, administrer nedlastingar og få tips om korleis du får mest muleg ut av %s. + Send faner mellom einingar, administrer nedlastingar og få tips om korleis du får mest muleg ut av %s. Send faner mellom einingar, administrer nedlastingar og få tips om korleis du får mest muleg ut av Firefox. - Slå på varsel + Slå på varsel - Ikkje no + Ikkje no @@ -428,18 +428,12 @@ Send førespurnad - Redusering av infokapselbanner - Be om støtte for denne nettstaden? - Førespurnad om støtte av nettstad er sendt inn. - Førespurnad sendt På for denne nettstaden - - Førespurnad om støtte av nettstad er sendt inn Støtteførespurnad sendt @@ -448,8 +442,6 @@ Vill du aktivere reduksjon av infokapselbanner for %1$s? Vil du deaktivere reduksjon av infokapselbanner for %1$s? - - Denne nettstaden er for tida ikkje støtta av Redusering av infokapselbanner. Vil du at teamet vårt vurderer denne nettsida og legg til støtte i framtida? %1$s kan ikkje automatisk avvise førespurnadar om infokapslar på denne nettstaden. Du kan sende ein førespurnad om å støtte denne nettstaden i framtida. @@ -554,6 +546,7 @@ Aldri Ekstern nedlastingshandsamar + Tillegg @@ -1217,6 +1210,10 @@ Lagre som PDF Klarte ikkje å generere PDF + + Klarte ikkje å skrive ut + + Skriv ut Send til eining @@ -1510,12 +1507,8 @@ Innstillingar for vern Utvida sporingsvern - - Bruk nettet utan å bli overvaka No med totalt vern mot infokapslar, den mest kraftfulle barrieren vår til no mot sporarar på fleire nettstadar. - - Behald dine data for deg sjølv. %s beskyttear deg mot mange av dei vanlegaste sporingsteknologiar som følgjer det du gjer på nettet. %s vernar deg frå mange av dei vanlegaste sporarane som følgjer det du gjer på nettet. @@ -1523,16 +1516,12 @@ Standard (standard) - Balansert mellom privatliv og yting. Sider vil laste normalt. - Sider vil normalt laste inn, men blokkerer færre sporfølgjarar. Kva er blokkert av standard sporingsvern Streng - Blokkerer fleire sporings-mekanismar. Sider vert lasta inn raskare, men enkelte sider fungerer kanskje ikkje skikkeleg. - Sterkare sporingsvern og raskare yting, men nokre nettstadar fungerer kanskje ikkje slik dei skal. Kva er blokkert av strengt sporingsvern? diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 3fe178dab..6cb357308 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -123,6 +123,9 @@ Tab nyamuni anyar + + Takulan kecap sandi + Asup deui @@ -293,23 +296,23 @@ - wawar pripasi + wawar pripasi - Jadikeun panyungsi baku + Jadikeun panyungsi baku - Moal waka + Moal waka - Luncat tina telepon ka laptop jeung sabalikna + Luncat tina telepon ka laptop jeung sabalikna - Cokot tab jeung kecap sandi ti parabot anjeun lianna anu panungtung dipaké. + Cokot tab jeung kecap sandi ti parabot anjeun lianna anu panungtung dipaké. - Asup + Asup - Moal waka + Moal waka - Hurungkeun iber + Hurungkeun iber - Moal waka + Moal waka @@ -333,6 +336,8 @@ Pilih salasahiji Kokolakeun takulan pamaluruhan + + Mesin édit némbongan dina menu pamaluruhan Mesin pamaluruh baku @@ -378,12 +383,25 @@ Pareum jang ieu loka Bolay + + Rekés dukungan + + Kirim rekés + + Rekés dukungan pikeun ieu loka? + + Rekés dikirim Hurungkeun jang ieu loka + + Rekés dukungan dikirim Moal Waka + + Idinan + Otomatis nyoba nyambung ka loka maké protokol énkripsi HTTPS pikeun ngaronjatkeun kaamanan. @@ -463,8 +481,15 @@ Otokumplit URLs Buka tutumbu dina aplikasi + + Matuh + + Tanya saméméh muka + + Ulah Manajer undeuran éksternal + Émbohan @@ -551,6 +576,9 @@ Émboh geus dipasang + + + Kokolakeun akun Singkronkeun ayeuna @@ -1123,6 +1151,10 @@ Simpen salaku PDF Teu bisa nyieun PDF + + Teu bisa nyitak + + Citak Kirim ka parangkat @@ -1166,12 +1198,28 @@ Pamasaran + + Firefox gancang jeung rikip + + Jadikeun Firefox panyungsi baku Cobaan nyungsi nyamuni Nyungsi tanpa neundeun réréméh atawa jujutan dina %1$s + + Kotéktak tanpa tapak + + Mitembeyan maluruh + + + Eusi Surpéy + + Moal, nuhun + Mupus koléksi @@ -1390,22 +1438,14 @@ Setélan Kilung Protéksi Palacakan Tingkat Lanjut - - Nyungsi bari teu dituturkeun - - Jaga data anjeun keur sorangan. %s ngajaga anjeun ti kalolobaan palacak anu nunutur lalampahan anjeun jering. Lenyepan Baku (bawaan) - - Siger tengah pikeun pripasi jeung kinerja. Kaca dimuat sacara normal. Naon anu dipeungpeuk ku perlindungan pelacakan baku Pereketkeun - - Meungpeuk palacak leuwih loba sangkan kaca dimuat leuwih gancang, tapi sababaraha fungsionalitas dina kaca bisa gagal. Naon anu dipeungpeuk ku perlindungan palacak rékép @@ -1760,6 +1800,8 @@ Tambah mesin pamaluruh + + Tambah mesin pamaluruh anyar Ropéa mesin pamaluruh @@ -1773,8 +1815,12 @@ Lianna + + Ngaran Ngaran + + Ngaran mesin pamaluruh Paluruh string pakéeun @@ -1783,6 +1829,9 @@ Wincikan mesin pamaluruh sakahayang + + Teundeun + Asupkeun ngaran mesin pamaluruh From b39a71c0a6fd9cac6dfaa4dcfd3c6cad80ac1ab6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 17 Jul 2023 00:04:01 +0000 Subject: [PATCH 084/207] Import translations from android-l10n --- app/src/main/res/values-sl/strings.xml | 32 ++--- app/src/main/res/values-szl/strings.xml | 148 +++++++++++++++++++++--- 2 files changed, 153 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index bab0f9ad7..e24fb0c3f 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -301,51 +301,51 @@ Ne zdaj - + - Nastavite %s kot brskalnik za svoja vsakodnevna opravila + Nastavite %s kot brskalnik za svoja vsakodnevna opravila Naj bo Firefox vaš brskalnik za vsakodnevna opravila - %1$s daje ljudem prednost pred dobičkom in ščiti vašo zasebnost, tako da zavrača medspletne sledilce.\n\nPreberite več v našem %2$s. + %1$s daje ljudem prednost pred dobičkom in ščiti vašo zasebnost, tako da zavrača medspletne sledilce.\n\nPreberite več v našem %2$s. Firefox daje ljudem prednost pred dobičkom in ščiti vašo zasebnost, tako da zavrača medspletne sledilce.\n\nPreberite več v našem obvestilu o zasebnosti. - obvestilu o zasebnosti + obvestilu o zasebnosti - Nastavi kot privzeti brskalnik + Nastavi kot privzeti brskalnik - Ne zdaj + Ne zdaj - Skočite s telefona na računalnik in nazaj + Skočite s telefona na računalnik in nazaj - Zajemite zavihke in gesla iz drugih naprav, da nadaljujete tam, kjer ste končali. + Zajemite zavihke in gesla iz drugih naprav, da nadaljujete tam, kjer ste končali. - Prijava + Prijava - Ne zdaj + Ne zdaj - Obvestila vam pomagajo pri delu z aplikacijo %s + Obvestila vam pomagajo pri delu z aplikacijo %s Obvestila vam pomagajo pri delu s Firefoxom - Pošiljajte zavihke med napravami, upravljajte prenose in prejemajte nasvete, kako kar najbolje izkoristiti %s. + Pošiljajte zavihke med napravami, upravljajte prenose in prejemajte nasvete, kako kar najbolje izkoristiti %s. Pošiljajte zavihke med napravami, upravljajte prenose in prejemajte nasvete, kako kar najbolje izkoristiti Firefox. - Vklopi obvestila + Vklopi obvestila - Ne zdaj + Ne zdaj @@ -1212,6 +1212,10 @@ Shrani kot PDF Datoteke PDF ni mogoče ustvariti + + Tiskanje ni mogoče + + Natisni Pošlji na napravo diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml index 701225174..e19057f86 100644 --- a/app/src/main/res/values-szl/strings.xml +++ b/app/src/main/res/values-szl/strings.xml @@ -298,45 +298,45 @@ Niy teroz - + - Dej rokić aplikacyji %s za twoja nojlepszo przeglōndarka + Dej rokić aplikacyji %s za twoja nojlepszo przeglōndarka Dej robić aplikacyji Firefox za twoja nojlepszo przeglōndarka - ô prywatności + ô prywatności - Nastow za bazowo przeglōndarka + Nastow za bazowo przeglōndarka - Niy teroz + Niy teroz - Skokej miyndzy telefōnym a laptopym a nazod + Skokej miyndzy telefōnym a laptopym a nazod - Ôtwiyrej karty i hasła z inkszych maszin, coby robić dalij z tego samego miejsca. + Ôtwiyrej karty i hasła z inkszych maszin, coby robić dalij z tego samego miejsca. - Wloguj sie + Wloguj sie - Niy teroz + Niy teroz - Powiadōmiynia pōmogajōm ci lepij używać aplikacyjo %s + Powiadōmiynia pōmogajōm ci lepij używać aplikacyjo %s Powiadōmiynia pōmogajōm ci lepij używać aplikacyjo Firefox - Posyłej karty miyndzy maszinami, regyruj pobraniami i zbiyrej dorady, jak nojlepij używać aplikacyjo %s. + Posyłej karty miyndzy maszinami, regyruj pobraniami i zbiyrej dorady, jak nojlepij używać aplikacyjo %s. Posyłej karty miyndzy maszinami, regyruj pobraniami i zbiyrej dorady, jak nojlepij używać aplikacyjo Firefox. - Załōncz powiadōmiynia + Załōncz powiadōmiynia - Niy teroz + Niy teroz @@ -1333,6 +1333,19 @@ Skōńcz + + Czas do skasowanio + + Kasuje historyjo (społym z historyjōm synchrōnizowanōm na inkszych maszinach), cookies i inksze dane przeglōndanio. + + Kasuje historyjo (społym z historyjōm synchrōnizowanōm na inkszych maszinach) + + Ôstatnio godzina + + Dzisio a wczora + + Wszysko + %s skasuje ôbrane dane przeglōndanio. @@ -1345,6 +1358,8 @@ Kasowanie danych przeglōndanio… + + Skasuj wszystkie strōny we %s Pociep @@ -1352,9 +1367,26 @@ Grupa skasowano + + + Witej w lepszym internecie + + Przeglōndarka zbudowano do ludzi, a niy do profitu. + + Przeglōndej ôd miejsca, kaj sie skōńczyło + + Synchrōnizuj karty i hasła miyndzy maszinami, coby snadnie przełōnczać ekrany. + + Wloguj sie Synchrōnizacyjo je załōnczōno + + Ôchrōna prywatności w bazowych sztalōnkach + + %1$s autōmatycznie niy dowo fyrmōm śledzic cie po kryjōmu po necu. + + Z pōłnōm ôchrōnōm cookies, co zastawio śledzōnce elymynty, coby niy używały cookies do śledzynio cie po internecie. Standardowo (bazowe) @@ -1366,9 +1398,17 @@ Ôbier, kaj mo być posek z noczyniami + + Miyj go na dole, abo pōnknij na gōra. + + Mosz kōntrola nad swojimi danymi + + Firefox dowo ci kōntrola nad tym, co udostympniosz online i co udostympniosz nōm. Poczytej ô naszych prawidłach prywatności + + Jeześ fertich, coby ôdewrzić cudny internet? Zacznij przeglōndać internet @@ -1421,14 +1461,22 @@ Sztalōnki ôchrōny Polepszōno ôchrōna ôd śledzynio + + Teroz z pōłnym ôchrōnōm cookies, naszōm nojsiylniyjszōm baryjerōm przeciw elymyntōm, co śledzōm miyndzy strōnami. + + %s brōni cie przed mockōm nojpopularniyjszych śledzōncych elymyntōw, kere badajōm, co robisz online. Przewiydz sie wiyncyj Standardowo (bazowe) + + Strōny bydōm sie normalnie ladować, ale zaszperujōm mynij śledzōncych elymyntōw. Co je szperowane przi standardowyj ôchrōnie ôd śledzynio Surowo + + Lepszo ôchrōna przed śłedzōncymi elymyntami i lepszo sprowność, ale niykere strōny mogōm niy fungować dobrze. Co je szperowane przi surowyj ôchrōnie ôd śledzynio @@ -1448,6 +1496,8 @@ Wszyske śledzōnce elymynta z inkszych firmōw (niykere strōny mogōm niy fungować dobrze) Wszyskie cookies (niykere strōny mogōm niy fungować dobrze) + + Izolacyjo cookies miyndzy strōnami Śledzōnco zawartość @@ -1467,9 +1517,81 @@ Elymynty śledzōnce ôd społecznościowych serwisōw + + Ôbgraniczo możnoś społecznościowych serwisōw do śledzynio twojij aktywności w necu. Cookies elymyntōw, co śledzōm miyndzy strōnami + + Cookies, co śledzōm miyndzy strōnami + + Szperuje cookies, kerych reklamowe nece i analityczne firmy używajōm do zbiyranio informacyjōw ô twojim przeglōndaniu po roztōmajtych strōnach. + + Połno ôchrōna cookies izoluje cookies na strōnie, na keryj żeś je, tak co elymynty śledzōnce, bez przikłod reklamowe nece, niy idōm za tobōm miyndzy strōnami. Elymynty, co fedrujōm kryptopiniōndze + + Niy dowo ôszydnym skryptōm fedrować cyfrowych piniyndzy na twojij maszinie. + + Elymynty, co rychtujōm ôdcisk ôd przeglōndarki + + Niy dowo zbiyrać danych ô twojij maszinie, z kerymi idzie jōm zidyntyfikować i użyć do śledzynio. + + Śledzōnco zawartość + + Przewiydz sie wiyncyj + + + Sparcie + + Awaryje + + Ô prywatności + + Poznej swoje prawa + + Informacyjo ô licyncyji + + Biblioteki, kerych używōmy + + Myni debugowanio: do załōnczynio ôstały kliki: %1$d + Myni debugowanio je załōnczōne + + + + Kopiuj + + Wraź i idź + + Wraź + + + URL je skopiowane do kamerlika + + + Przedej na dōmowy ekran + + Pociep + + Przidej + + Idź dalij do stōny + + Miano ôd skrōtu + + + Idzie leko przidać ta strōna na dōmowy ekran swojij masziny, coby mieć snadny dostymp i gibcyj przeglōndać internet choby bez aplikacyjo. + + + Dane logowanio i hasła + + Spamiyntane dane logowanio i hasła + + Pytej sie przed spamiyntaniym + + Żodyn roz niy spamiyntuj + + Autōmatycznie wypōłnianie w aplikacyji %1$s + From b8077418ce64eb9d20ace2c035655799c93ed655 Mon Sep 17 00:00:00 2001 From: "alexandra.virvara" Date: Tue, 11 Jul 2023 09:38:24 +0300 Subject: [PATCH 085/207] Bug 1842223 - the color of normal open tabs has a flicker --- .../mozilla/fenix/tabstray/TabsTrayBanner.kt | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt index ea5fe0732..fd518dd5a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayBanner.kt @@ -17,6 +17,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.Icon import androidx.compose.material.IconButton +import androidx.compose.material.LocalContentAlpha +import androidx.compose.material.LocalContentColor import androidx.compose.material.Tab import androidx.compose.material.TabRow import androidx.compose.material.Text @@ -178,9 +180,8 @@ private fun SingleSelectBanner( contentColor = selectedColor, divider = {}, ) { - val isNormalTabsPageSelected = selectedPage == Page.NormalTabs Tab( - selected = isNormalTabsPageSelected, + selected = selectedPage == Page.NormalTabs, onClick = { onTabPageIndicatorClicked(Page.NormalTabs) }, modifier = Modifier .fillMaxHeight() @@ -188,7 +189,7 @@ private fun SingleSelectBanner( selectedContentColor = selectedColor, unselectedContentColor = inactiveColor, ) { - NormalTabsTabIcon(normalTabCount = normalTabCount, selected = isNormalTabsPageSelected) + NormalTabsTabIcon(normalTabCount = normalTabCount) } Tab( @@ -340,7 +341,7 @@ private const val TWO_DIGITS_SIZE_RATIO = 0.4f @Composable @Suppress("MagicNumber") -private fun NormalTabsTabIcon(normalTabCount: Int, selected: Boolean) { +private fun NormalTabsTabIcon(normalTabCount: Int) { val normalTabCountText: String val tabCountTextRatio: Float val needsBottomPaddingForInfiniteTabs: Boolean @@ -379,12 +380,6 @@ private fun NormalTabsTabIcon(normalTabCount: Int, selected: Boolean) { val counterBoxWidthPx = LocalDensity.current.run { counterBoxWidthDp.roundToPx() } val counterTabsTextSize = (tabCountTextRatio * counterBoxWidthPx).toInt() - val normalTabsCountTextColor = if (selected) { - FirefoxTheme.colors.iconActive - } else { - FirefoxTheme.colors.iconPrimaryInactive - } - val normalTabsTextModifier = if (needsBottomPaddingForInfiniteTabs) { val bottomPadding = with(LocalDensity.current) { counterTabsTextSize.toDp() / 4 } Modifier.padding(bottom = bottomPadding) @@ -409,7 +404,7 @@ private fun NormalTabsTabIcon(normalTabCount: Int, selected: Boolean) { Text( text = normalTabCountText, modifier = normalTabsTextModifier, - color = normalTabsCountTextColor, + color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current), fontSize = with(LocalDensity.current) { counterTabsTextSize.toDp().toSp() }, fontWeight = FontWeight.W700, textAlign = TextAlign.Center, From d3ee4c4d82c51e8b41fa795574fae76aa6cc18e4 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Mon, 10 Jul 2023 14:18:58 +0200 Subject: [PATCH 086/207] Bug 1841639 - Add common Switch composable --- .../mozilla/fenix/compose/SwitchWithLabel.kt | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/compose/SwitchWithLabel.kt diff --git a/app/src/main/java/org/mozilla/fenix/compose/SwitchWithLabel.kt b/app/src/main/java/org/mozilla/fenix/compose/SwitchWithLabel.kt new file mode 100644 index 000000000..d2a8ce38a --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/compose/SwitchWithLabel.kt @@ -0,0 +1,181 @@ +/* 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.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.SwitchDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import androidx.compose.material.Switch as MaterialSwitch + +private const val DISABLED_ALPHA = 0.5f + +/** + * UI for a switch with label that can be on or off. + * + * @param label Text to be displayed next to the switch. + * @param checked Whether or not the switch is checked. + * @param onCheckedChange Invoked when Switch is being clicked, therefore the change of checked + * state is requested. + * @param modifier Modifier to be applied to the switch layout. + * @param enabled Whether the switch is enabled or grayed out. + */ +@Composable +fun SwitchWithLabel( + label: String, + checked: Boolean, + onCheckedChange: ((Boolean) -> Unit), + modifier: Modifier = Modifier, + enabled: Boolean = true, +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = label, + color = if (enabled) { + FirefoxTheme.colors.textPrimary + } else { + FirefoxTheme.colors.textDisabled + }, + style = FirefoxTheme.typography.subtitle1, + modifier = Modifier.weight(1f), + ) + + Switch( + checked = checked, + onCheckedChange = onCheckedChange, + enabled = enabled, + ) + } +} + +/** + * UI for a switch that can be on or off. + * + * @param checked Whether or not the switch is checked. + * @param onCheckedChange Invoked when Switch is being clicked, therefore the change of checked + * state is requested. + * @param modifier Modifier to be applied to the switch layout. + * @param enabled Whether the switch is enabled or grayed out. + */ +@Composable +private fun Switch( + checked: Boolean, + onCheckedChange: ((Boolean) -> Unit), + modifier: Modifier = Modifier, + enabled: Boolean = true, +) { + MaterialSwitch( + checked = checked, + onCheckedChange = onCheckedChange, + modifier = modifier, + enabled = enabled, + colors = SwitchDefaults.colors( + uncheckedThumbColor = FirefoxTheme.colors.formOff, + uncheckedTrackColor = FirefoxTheme.colors.formSurface, + checkedThumbColor = FirefoxTheme.colors.formOn, + checkedTrackColor = FirefoxTheme.colors.formSurface, + disabledUncheckedThumbColor = FirefoxTheme.colors.formOff + .copy(alpha = DISABLED_ALPHA) + .compositeOver(FirefoxTheme.colors.formSurface), + disabledUncheckedTrackColor = FirefoxTheme.colors.formSurface.copy(alpha = DISABLED_ALPHA), + disabledCheckedThumbColor = FirefoxTheme.colors.formOn + .copy(alpha = DISABLED_ALPHA) + .compositeOver(FirefoxTheme.colors.formSurface), + disabledCheckedTrackColor = FirefoxTheme.colors.formSurface.copy(alpha = DISABLED_ALPHA), + ), + ) +} + +@LightDarkPreview +@Composable +private fun SwitchWithLabelPreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(FirefoxTheme.colors.layer1) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + Text( + text = "Enabled", + style = FirefoxTheme.typography.headline7, + color = FirefoxTheme.colors.textPrimary, + ) + + Spacer(Modifier.height(8.dp)) + + var enabledSwitchState by remember { mutableStateOf(false) } + SwitchWithLabel( + label = if (enabledSwitchState) "On" else "Off", + checked = enabledSwitchState, + onCheckedChange = { enabledSwitchState = it }, + ) + + Text( + text = "Disabled", + style = FirefoxTheme.typography.headline7, + color = FirefoxTheme.colors.textPrimary, + ) + + Spacer(Modifier.height(8.dp)) + + var disabledSwitchStateOff by remember { mutableStateOf(false) } + SwitchWithLabel( + label = "Off", + checked = disabledSwitchStateOff, + enabled = false, + onCheckedChange = { disabledSwitchStateOff = it }, + ) + + var disabledSwitchStateOn by remember { mutableStateOf(true) } + SwitchWithLabel( + label = "On", + checked = disabledSwitchStateOn, + enabled = false, + onCheckedChange = { disabledSwitchStateOn = it }, + ) + + Text( + text = "Nested", + style = FirefoxTheme.typography.headline7, + color = FirefoxTheme.colors.textPrimary, + ) + + Spacer(Modifier.height(8.dp)) + + Row { + Spacer(Modifier.weight(1f)) + + var nestedSwitchState by remember { mutableStateOf(false) } + SwitchWithLabel( + label = "Nested", + checked = nestedSwitchState, + onCheckedChange = { nestedSwitchState = it }, + modifier = Modifier.weight(1f), + ) + } + } + } +} From 38807f3590a793896c2ae1773a4d8dbf4563ec7d Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 6 Jul 2023 16:44:15 +0300 Subject: [PATCH 087/207] Bug 1843008 - New custom tabs related UI tests --- .../mozilla/fenix/helpers/TestAssetHelper.kt | 6 + .../org/mozilla/fenix/ui/CustomTabsTest.kt | 118 ++++++++++++++++++ .../java/org/mozilla/fenix/ui/SmokeTest.kt | 47 ------- .../mozilla/fenix/ui/robots/CustomTabRobot.kt | 52 +++++++- 4 files changed, 173 insertions(+), 50 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt index d7094a669..91522d4e5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt @@ -81,6 +81,12 @@ object TestAssetHelper { return TestAsset(url, "", "") } + fun getPdfFormAsset(server: MockWebServer): TestAsset { + val url = server.url("resources/pdfForm.pdf").toString().toUri()!! + + return TestAsset(url, "", "") + } + fun getSaveLoginAsset(server: MockWebServer): TestAsset { val url = server.url("pages/password.html").toString().toUri()!! diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt index 567c13f0f..fd211832c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt @@ -25,6 +25,7 @@ import org.mozilla.fenix.helpers.TestHelper.openAppFromExternalLink import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.clickPageObject import org.mozilla.fenix.ui.robots.customTabScreen +import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.longClickPageObject import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.notificationShade @@ -35,6 +36,7 @@ class CustomTabsTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer private val customMenuItem = "TestMenuItem" + private val customTabActionButton = "CustomActionButton" /* Updated externalLinks.html to v2.0, changed the hypertext reference to mozilla-mobile.github.io/testapp/downloads for "External link" @@ -204,4 +206,120 @@ class CustomTabsTest { verifySystemNotificationExists("Download completed") } } + + // Verifies the main menu of a custom tab with a custom menu item + @SmokeTest + @Test + fun customTabMenuItemsTest() { + val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + intentReceiverActivityTestRule.launchActivity( + createCustomTabIntent( + customTabPage.url.toString(), + customMenuItem, + ), + ) + + customTabScreen { + verifyCustomTabCloseButton() + }.openMainMenu { + verifyPoweredByTextIsDisplayed() + verifyCustomMenuItem(customMenuItem) + verifyDesktopSiteButtonExists() + verifyFindInPageButtonExists() + verifyOpenInBrowserButtonExists() + verifyBackButtonExists() + verifyForwardButtonExists() + verifyRefreshButtonExists() + } + } + + // The test opens a link in a custom tab then sends it to the browser + @Test + fun openCustomTabInBrowserTest() { + val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + intentReceiverActivityTestRule.launchActivity( + createCustomTabIntent( + customTabPage.url.toString(), + ), + ) + + customTabScreen { + verifyCustomTabCloseButton() + }.openMainMenu { + }.clickOpenInBrowserButton { + verifyTabCounter("1") + } + } + + @Test + fun shareCustomTabTest() { + val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + intentReceiverActivityTestRule.launchActivity( + createCustomTabIntent( + customTabPage.url.toString(), + ), + ) + + customTabScreen { + }.clickShareButton { + verifyShareTabLayout() + } + } + + @Test + fun verifyCustomTabViewTest() { + val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + intentReceiverActivityTestRule.launchActivity( + createCustomTabIntent( + pageUrl = customTabPage.url.toString(), + customActionButtonDescription = customTabActionButton, + ), + ) + + customTabScreen { + verifyCustomTabCloseButton() + verifyCustomTabsSiteInfoButton() + verifyCustomTabToolbarTitle(customTabPage.title) + verifyCustomTabUrl(customTabPage.url.toString()) + verifyCustomTabActionButton(customTabActionButton) + verifyCustomTabsShareButton() + verifyMainMenuButton() + clickCustomTabCloseButton() + } + homeScreen { + verifyHomeScreenAppBarItems() + } + } + + @Test + fun verifyPdfCustomTabViewTest() { + val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 3) + val pdfFormResource = TestAssetHelper.getPdfFormAsset(mockWebServer) + + intentReceiverActivityTestRule.launchActivity( + createCustomTabIntent( + customTabPage.url.toString(), + ), + ) + + customTabScreen { + clickPageObject(itemWithText("PDF form file")) + waitForPageToLoad() + verifyPDFReaderToolbarItems() + verifyCustomTabCloseButton() + verifyCustomTabsSiteInfoButton() + verifyCustomTabToolbarTitle("pdfForm.pdf") + verifyCustomTabUrl(pdfFormResource.url.toString()) + verifyCustomTabsShareButton() + verifyMainMenuButton() + clickCustomTabCloseButton() + } + homeScreen { + verifyHomeScreenAppBarItems() + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index e522d715c..8b8d7d44b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -29,12 +29,10 @@ import org.mozilla.fenix.helpers.MatcherHelper.itemWithText import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper.assertYoutubeAppOpens -import org.mozilla.fenix.helpers.TestHelper.createCustomTabIntent import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.clickPageObject -import org.mozilla.fenix.ui.robots.customTabScreen import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar @@ -323,51 +321,6 @@ class SmokeTest { } } - // Verifies the main menu of a custom tab with a custom menu item - @Test - fun customTabMenuItemsTest() { - val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - - intentReceiverActivityTestRule.launchActivity( - createCustomTabIntent( - customTabPage.url.toString(), - customMenuItem, - ), - ) - - customTabScreen { - verifyCustomTabCloseButton() - }.openMainMenu { - verifyPoweredByTextIsDisplayed() - verifyCustomMenuItem(customMenuItem) - verifyDesktopSiteButtonExists() - verifyFindInPageButtonExists() - verifyOpenInBrowserButtonExists() - verifyBackButtonExists() - verifyForwardButtonExists() - verifyRefreshButtonExists() - } - } - - // The test opens a link in a custom tab then sends it to the browser - @Test - fun openCustomTabInBrowserTest() { - val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - - intentReceiverActivityTestRule.launchActivity( - createCustomTabIntent( - customTabPage.url.toString(), - ), - ) - - customTabScreen { - verifyCustomTabCloseButton() - }.openMainMenu { - }.clickOpenInBrowserButton { - verifyTabCounter("1") - } - } - @Test fun tabMediaControlButtonTest() { val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt index 4dfc40229..31cc5ae6f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt @@ -15,18 +15,38 @@ import androidx.test.uiautomator.UiSelector import junit.framework.TestCase.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.Constants.LONG_CLICK_DURATION +import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithDescriptionExists +import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdAndTextExists +import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists +import org.mozilla.fenix.helpers.MatcherHelper.itemWithDescription import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId +import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText +import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.appName +import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.waitForObjects +import org.mozilla.fenix.helpers.click /** * Implementation of the robot pattern for Custom tabs */ class CustomTabRobot { + fun verifyCustomTabsSiteInfoButton() = + assertItemWithResIdExists( + itemWithResId("$packageName:id/mozac_browser_toolbar_security_indicator"), + ) + + fun verifyCustomTabsShareButton() = + assertItemWithDescriptionExists( + itemWithDescription(getStringResource(R.string.mozac_feature_customtabs_share_link)), + ) + + fun verifyMainMenuButton() = assertItemWithResIdExists(mainMenuButton) + fun verifyDesktopSiteButtonExists() { desktopSiteButton().check(matches(isDisplayed())) } @@ -84,6 +104,12 @@ class CustomTabRobot { ) } + fun verifyCustomTabUrl(Url: String) { + assertItemWithResIdAndTextExists( + itemWithResIdContainingText("$packageName:id/mozac_browser_toolbar_url_view", Url.drop(7)), + ) + } + fun longCLickAndCopyToolbarUrl() { mDevice.waitForObjects( mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")), @@ -106,10 +132,23 @@ class CustomTabRobot { fun waitForPageToLoad() = progressBar.waitUntilGone(waitingTime) + fun clickCustomTabCloseButton() = closeButton().click() + + fun verifyCustomTabActionButton(customTabActionButtonDescription: String) = + assertItemWithDescriptionExists(itemWithDescription(customTabActionButtonDescription)) + + fun verifyPDFReaderToolbarItems() = + assertItemWithResIdAndTextExists( + itemWithResIdAndText("download", "Download"), + itemWithResIdAndText("openInApp", "Open in app"), + ) + class Transition { fun openMainMenu(interact: CustomTabRobot.() -> Unit): Transition { - mainMenuButton().waitForExists(waitingTime) - mainMenuButton().click() + mainMenuButton.also { + it.waitForExists(waitingTime) + it.click() + } CustomTabRobot().interact() return Transition() @@ -122,6 +161,13 @@ class CustomTabRobot { return BrowserRobot.Transition() } + fun clickShareButton(interact: ShareOverlayRobot.() -> Unit): ShareOverlayRobot.Transition { + itemWithDescription(getStringResource(R.string.mozac_feature_customtabs_share_link)).click() + + ShareOverlayRobot().interact() + return ShareOverlayRobot.Transition() + } + fun goBackToOnboardingScreen(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { mDevice.pressBack() @@ -136,7 +182,7 @@ fun customTabScreen(interact: CustomTabRobot.() -> Unit): CustomTabRobot.Transit return CustomTabRobot.Transition() } -private fun mainMenuButton() = mDevice.findObject(UiSelector().description("Menu")) +private val mainMenuButton = itemWithResId("$packageName:id/mozac_browser_toolbar_menu") private fun desktopSiteButton() = onView(withId(R.id.switch_widget)) From 5939948b61df0c2ce2ce7e7e34bdc685757d6318 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Mon, 17 Jul 2023 14:23:06 +0300 Subject: [PATCH 088/207] Bug 1807268 - Disable failing verifyContextCopyLinkNotDisplayedAfterApplied UI test --- .../androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt index 6f59007eb..b2bbe5ea5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt @@ -10,6 +10,7 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -136,6 +137,7 @@ class ContextMenusTest { } } + @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test fun verifyContextCopyLinkNotDisplayedAfterApplied() { val pageLinks = TestAssetHelper.getGenericAsset(mockWebServer, 4) From 0075b81dd8dd413788128e97cb6a982c4e033625 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Mon, 17 Jul 2023 14:24:39 +0300 Subject: [PATCH 089/207] Bug 1840994 - Disable failing systemNotificationCantBeDismissedWhileDownloadingTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index 5b3c2de7c..53d0e3e12 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -8,6 +8,7 @@ import androidx.core.net.toUri import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -350,6 +351,7 @@ class DownloadTest { deleteDownloadedFileOnStorage(secondDownloadedFile) } + @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1840994") @Test fun systemNotificationCantBeDismissedWhileDownloadingTest() { // Clear the "Firefox Fenix default browser notification" From 74744b5d20d0b7e44e459f4e183e5f8e001915de Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 14 Jul 2023 17:50:08 -0400 Subject: [PATCH 090/207] Bug 1842890 - Add splash screen animation --- .../res/drawable/animated_splash_screen.xml | 836 ++++++ .../res/drawable/animated_splash_screen.xml | 2515 +++++++++++++++++ .../main/res/drawable-v23/splash_screen.xml | 11 - .../main/res/drawable-v24/splash_screen.xml | 7 - app/src/main/res/values-night/styles.xml | 6 +- app/src/main/res/values/dimens.xml | 4 + app/src/main/res/values/styles.xml | 7 +- .../res/drawable/animated_splash_screen.xml | 817 ++++++ .../res/drawable/animated_splash_screen.xml | 742 +++++ 9 files changed, 4922 insertions(+), 23 deletions(-) create mode 100644 app/src/beta/res/drawable/animated_splash_screen.xml create mode 100644 app/src/debug/res/drawable/animated_splash_screen.xml delete mode 100644 app/src/main/res/drawable-v23/splash_screen.xml delete mode 100644 app/src/main/res/drawable-v24/splash_screen.xml create mode 100644 app/src/nightly/res/drawable/animated_splash_screen.xml create mode 100644 app/src/release/res/drawable/animated_splash_screen.xml diff --git a/app/src/beta/res/drawable/animated_splash_screen.xml b/app/src/beta/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..9ca0de2a3 --- /dev/null +++ b/app/src/beta/res/drawable/animated_splash_screen.xml @@ -0,0 +1,836 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/debug/res/drawable/animated_splash_screen.xml b/app/src/debug/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..7dfabc0ee --- /dev/null +++ b/app/src/debug/res/drawable/animated_splash_screen.xml @@ -0,0 +1,2515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v23/splash_screen.xml b/app/src/main/res/drawable-v23/splash_screen.xml deleted file mode 100644 index 74d441577..000000000 --- a/app/src/main/res/drawable-v23/splash_screen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-v24/splash_screen.xml b/app/src/main/res/drawable-v24/splash_screen.xml deleted file mode 100644 index 56f7a470f..000000000 --- a/app/src/main/res/drawable-v24/splash_screen.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index f615fe796..dce770124 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -4,8 +4,10 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0e14424b4..89d07914c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -186,6 +186,10 @@ 16dp 48dp + + + 12000 + 48dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 028a415b8..6d49465d4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,9 +5,10 @@ diff --git a/app/src/nightly/res/drawable/animated_splash_screen.xml b/app/src/nightly/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..0701c810d --- /dev/null +++ b/app/src/nightly/res/drawable/animated_splash_screen.xml @@ -0,0 +1,817 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/release/res/drawable/animated_splash_screen.xml b/app/src/release/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..8e8a4ae49 --- /dev/null +++ b/app/src/release/res/drawable/animated_splash_screen.xml @@ -0,0 +1,742 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d0dfd3878b8019695a1af29db0758c9b2df26c7d Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Fri, 14 Jul 2023 12:22:34 -0700 Subject: [PATCH 091/207] Bug 1842258 - Convert `SearchTest` to support the Tabs Tray rewrite --- .../org/mozilla/fenix/ui/ComposeSearchTest.kt | 617 ++++++++++++++++++ .../fenix/ui/robots/ComposeTabDrawerRobot.kt | 19 + ...rySubMenusMultipleSelectionToolbarRobot.kt | 11 + 3 files changed, 647 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt new file mode 100644 index 000000000..5d01078e6 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt @@ -0,0 +1,617 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import android.content.Context +import android.hardware.camera2.CameraManager +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.core.net.toUri +import androidx.test.espresso.Espresso +import mozilla.components.browser.icons.IconRequest +import mozilla.components.browser.icons.generator.DefaultIconGenerator +import mozilla.components.feature.search.ext.createSearchEngine +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Assume +import org.junit.Before +import org.junit.Ignore +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.Constants +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.MatcherHelper +import org.mozilla.fenix.helpers.SearchDispatcher +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper +import org.mozilla.fenix.ui.robots.clickContextMenuItem +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.longClickPageObject +import org.mozilla.fenix.ui.robots.multipleSelectionToolbar +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.searchScreen + +/** + * Tests for verifying the search fragment + * + * Including: + * - Verify the toolbar, awesomebar, and shortcut bar are displayed + * - Select shortcut button + * - Select scan button + * + */ + +class ComposeSearchTest { + lateinit var searchMockServer: MockWebServer + lateinit var queryString: String + + @get:Rule + val activityTestRule = AndroidComposeTestRule( + HomeActivityTestRule( + skipOnboarding = true, + isPocketEnabled = false, + isJumpBackInCFREnabled = false, + isRecentTabsFeatureEnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Before + fun setUp() { + searchMockServer = MockWebServer().apply { + dispatcher = SearchDispatcher() + start() + } + } + + @After + fun tearDown() { + searchMockServer.shutdown() + } + + @Test + fun searchBarItemsTest() { + navigationToolbar { + verifyDefaultSearchEngine("Google") + verifySearchBarPlaceholder("Search or enter address") + }.clickUrlbar { + TestHelper.verifyKeyboardVisibility(isExpectedToBeVisible = true) + verifyScanButtonVisibility(visible = true) + verifyVoiceSearchButtonVisibility(enabled = true) + verifySearchBarPlaceholder("Search or enter address") + typeSearch("mozilla ") + verifyScanButtonVisibility(visible = false) + verifyVoiceSearchButtonVisibility(enabled = true) + clickClearButton() + clickSearchSelectorButton() + selectTemporarySearchMethod("Amazon.com") + verifyScanButtonVisibility(visible = false) + verifyVoiceSearchButtonVisibility(enabled = true) + } + } + + @Test + fun searchSelectorMenuItemsTest() { + homeScreen { + }.openSearch { + verifySearchView() + verifySearchToolbar(isDisplayed = true) + clickSearchSelectorButton() + verifySearchShortcutListContains( + "DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay", + "Bookmarks", "Tabs", "History", "Search settings", + ) + } + } + + @SmokeTest + @Test + fun scanButtonDenyPermissionTest() { + val cameraManager = TestHelper.appContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager + Assume.assumeTrue(cameraManager.cameraIdList.isNotEmpty()) + + homeScreen { + }.openSearch { + clickScanButton() + TestHelper.denyPermission() + clickScanButton() + clickDismissPermissionRequiredDialog() + } + homeScreen { + }.openSearch { + clickScanButton() + clickGoToPermissionsSettings() + TestHelper.assertNativeAppOpens(Constants.PackageName.ANDROID_SETTINGS) + } + } + + @SmokeTest + @Test + fun scanButtonAllowPermissionTest() { + val cameraManager = TestHelper.appContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager + Assume.assumeTrue(cameraManager.cameraIdList.isNotEmpty()) + + homeScreen { + }.openSearch { + clickScanButton() + TestHelper.grantSystemPermission() + verifyScannerOpen() + } + } + + // Verifies a temporary change of search engine from the Search shortcut menu + @SmokeTest + @Test + fun selectSearchEnginesShortcutTest() { + val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay") + + enginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + verifySearchShortcutListContains(it) + selectTemporarySearchMethod(it) + verifySearchEngineIcon(it) + }.submitQuery("mozilla ") { + verifyUrl("mozilla") + }.goToHomescreen {} + } + } + + @Test + fun accessSearchSettingFromSearchSelectorMenuTest() { + queryString = "firefox" + + searchScreen { + clickSearchSelectorButton() + }.clickSearchEngineSettings { + verifySearchSettingsToolbar() + openDefaultSearchEngineMenu() + changeDefaultSearchEngine("DuckDuckGo") + TestHelper.exitMenu() + } + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + verifyUrl("firefox") + } + } + + @Test + fun clearSearchTest() { + queryString = "test" + + homeScreen { + }.openSearch { + typeSearch(queryString) + clickClearButton() + verifySearchBarPlaceholder("Search or enter address") + } + } + + @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") + @SmokeTest + @Test + fun searchGroupShowsInRecentlyVisitedTest() { + queryString = "test search" + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + Espresso.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + } + } + + @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") + @Test + fun verifySearchGroupHistoryWithNoDuplicatesTest() { + val firstPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 1).url + val secondPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 2).url + val originPageUrl = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search=test%20search".toUri() + queryString = "test search" + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + Espresso.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + Espresso.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + Espresso.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { + verifyTestPageUrl(firstPageUrl) + verifyTestPageUrl(secondPageUrl) + verifyTestPageUrl(originPageUrl) + } + } + + @Ignore("Failing due to known bug, see https://github.com/mozilla-mobile/fenix/issues/23818") + @Test + fun searchGroupGeneratedInTheSameTabTest() { + queryString = "test search" + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + clickPageObject(MatcherHelper.itemContainingText("Link 1")) + waitForPageToLoad() + Espresso.pressBack() + clickPageObject(MatcherHelper.itemContainingText("Link 2")) + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + } + } + + @SmokeTest + @Test + fun noSearchGroupFromPrivateBrowsingTest() { + queryString = "test search" + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in private tab") + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in private tab") + }.openComposeTabDrawer(activityTestRule) { + }.toggleToPrivateTabs { + }.openPrivateTab(0) { + }.openComposeTabDrawer(activityTestRule) { + }.openPrivateTab(1) { + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + togglePrivateBrowsingModeOnOff() + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 3) + }.openThreeDotMenu { + }.openHistory { + verifyHistoryItemExists(shouldExist = false, item = "3 sites") + } + } + + @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") + @SmokeTest + @Test + fun deleteItemsFromSearchGroupHistoryTest() { + queryString = "test search" + val firstPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 1).url + val secondPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 2).url + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + TestHelper.mDevice.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { + clickDeleteHistoryButton(firstPageUrl.toString()) + TestHelper.longTapSelectItem(secondPageUrl) + multipleSelectionToolbar { + Espresso.openActionBarOverflowOrOptionsMenu(activityTestRule.activity) + clickMultiSelectionDelete() + } + TestHelper.exitMenu() + } + homeScreen { + // checking that the group is removed when only 1 item is left + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 1) + } + } + + @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") + @Test + fun deleteSearchGroupFromHistoryTest() { + queryString = "test search" + val firstPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 1).url + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + TestHelper.mDevice.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { + clickDeleteAllHistoryButton() + confirmDeleteAllHistory() + verifyDeleteSnackbarText("Group deleted") + verifyHistoryItemExists(shouldExist = false, firstPageUrl.toString()) + }.goBack {} + homeScreen { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3) + }.openThreeDotMenu { + }.openHistory { + verifySearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3) + verifyEmptyHistoryView() + } + } + + @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") + @Test + fun reopenTabsFromSearchGroupTest() { + val firstPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 1).url + val secondPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 2).url + queryString = "test search" + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + TestHelper.mDevice.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { + }.openWebsite(firstPageUrl) { + verifyUrl(firstPageUrl.toString()) + }.goToHomescreen { + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { + TestHelper.longTapSelectItem(firstPageUrl) + TestHelper.longTapSelectItem(secondPageUrl) + Espresso.openActionBarOverflowOrOptionsMenu(activityTestRule.activity) + } + + multipleSelectionToolbar { + }.clickOpenNewTab(activityTestRule) { + verifyNormalBrowsingButtonIsSelected() + }.closeTabDrawer {} + Espresso.openActionBarOverflowOrOptionsMenu(activityTestRule.activity) + multipleSelectionToolbar { + }.clickOpenPrivateTab { + verifyPrivateModeSelected() + } + } + + @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") + @Test + fun sharePageFromASearchGroupTest() { + val firstPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 1).url + queryString = "test search" + // setting our custom mockWebServer search URL + val searchString = + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search={searchTerms}" + val customSearchEngine = createSearchEngine( + name = "TestSearchEngine", + url = searchString, + icon = DefaultIconGenerator().generate(TestHelper.appContext, IconRequest(searchString)).bitmap, + ) + TestHelper.setCustomSearchEngine(customSearchEngine) + + // Performs a search and opens 2 dummy search results links to create a search group + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + longClickPageObject(MatcherHelper.itemWithText("Link 1")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + TestHelper.mDevice.pressBack() + longClickPageObject(MatcherHelper.itemWithText("Link 2")) + clickContextMenuItem("Open link in new tab") + TestHelper.clickSnackbarButton("SWITCH") + waitForPageToLoad() + }.openComposeTabDrawer(activityTestRule) { + }.openThreeDotMenu { + }.closeAllTabs { + verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { + TestHelper.longTapSelectItem(firstPageUrl) + } + + multipleSelectionToolbar { + clickShareHistoryButton() + verifyShareOverlay() + verifyShareTabFavicon() + verifyShareTabTitle() + verifyShareTabUrl() + } + } + + // Default search code for Google-US + @Test + fun defaultSearchCodeGoogleUS() { + queryString = "firefox" + + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + waitForPageToLoad() + }.openThreeDotMenu { + }.openHistory { + // Full URL no longer visible in the nav bar, so we'll check the history record + verifyHistoryItemExists(shouldExist = true, Constants.searchEngineCodes["Google"]!!) + } + } + + // Default search code for Bing-US + @Test + fun defaultSearchCodeBingUS() { + queryString = "firefox" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + openDefaultSearchEngineMenu() + changeDefaultSearchEngine("Bing") + TestHelper.exitMenu() + } + + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + waitForPageToLoad() + }.openThreeDotMenu { + }.openHistory { + // Full URL no longer visible in the nav bar, so we'll check the history record + verifyHistoryItemExists(shouldExist = true, Constants.searchEngineCodes["Bing"]!!) + } + } + + // Default search code for DuckDuckGo-US + @Test + fun defaultSearchCodeDuckDuckGoUS() { + queryString = "firefox" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + openDefaultSearchEngineMenu() + changeDefaultSearchEngine("DuckDuckGo") + TestHelper.exitMenu() + } + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + waitForPageToLoad() + }.openThreeDotMenu { + }.openHistory { + // Full URL no longer visible in the nav bar, so we'll check the history record + // A search group is sometimes created when searching with DuckDuckGo + try { + verifyHistoryItemExists(shouldExist = true, item = Constants.searchEngineCodes["DuckDuckGo"]!!) + } catch (e: AssertionError) { + openSearchGroup(queryString) + verifyHistoryItemExists(shouldExist = true, item = Constants.searchEngineCodes["DuckDuckGo"]!!) + } + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt index b3723735b..0dda88bff 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.longClick import androidx.compose.ui.test.onAllNodesWithTag +import androidx.compose.ui.test.onChildren import androidx.compose.ui.test.onFirst import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.performClick @@ -277,6 +278,24 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest return BrowserRobot.Transition() } + fun openPrivateTab(position: Int, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + composeTestRule.privateTabsList() + .onChildren()[position] + .performClick() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + + fun openNormalTab(position: Int, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + composeTestRule.normalTabsList() + .onChildren()[position] + .performClick() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun clickTopBar(interact: ComposeTabDrawerRobot.() -> Unit): Transition { // The topBar contains other views. // Don't do the default click in the middle, rather click in some free space - top right. diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt index 02277d6c3..be7488616 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.ui.robots import android.net.Uri import android.widget.TextView +import androidx.compose.ui.test.onNodeWithTag import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -19,12 +20,14 @@ import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.Matchers.allOf import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.HomeActivityComposeTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull +import org.mozilla.fenix.tabstray.TabsTrayTestTag /* * Implementation of Robot Pattern for the multiple selection toolbar of History and Bookmarks menus. @@ -110,6 +113,14 @@ class LibrarySubMenusMultipleSelectionToolbarRobot { return TabDrawerRobot.Transition() } + fun clickOpenNewTab(composeTestRule: HomeActivityComposeTestRule, interact: ComposeTabDrawerRobot.() -> Unit): ComposeTabDrawerRobot.Transition { + openInNewTabButton().click() + composeTestRule.onNodeWithTag(TabsTrayTestTag.tabsTray).assertExists() + + ComposeTabDrawerRobot(composeTestRule).interact() + return ComposeTabDrawerRobot.Transition(composeTestRule) + } + fun clickOpenPrivateTab(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { openInPrivateTabButton().click() mDevice.waitNotNull( From 162cf483fb4af8306b4679a770f08465ed74f696 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Sun, 16 Jul 2023 14:27:40 -0400 Subject: [PATCH 092/207] Bug 1843811 - Update Protobuf Gradle Plugin to version 0.9.4 --- .../fenixdependencies/src/main/java/FenixDependenciesPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt b/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt index 26a360276..ec836735a 100644 --- a/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt +++ b/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt @@ -44,7 +44,7 @@ object FenixVersions { // keep in sync with the versions used in AS. const val protobuf = "3.21.10" - const val protobuf_plugin = "0.9.3" + const val protobuf_plugin = "0.9.4" } @Suppress("unused") From e6065694bf94a3bbe5afbb09738bb26ae6fa2137 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 18 Jul 2023 00:04:04 +0000 Subject: [PATCH 093/207] Import translations from android-l10n --- app/src/main/res/values-nn-rNO/strings.xml | 5 +++++ app/src/main/res/values-skr/strings.xml | 2 ++ 2 files changed, 7 insertions(+) diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index a953b36c3..747e647ec 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -547,6 +547,11 @@ Ekstern nedlastingshandsamar + + Slå på Gecko-loggar + + Avsluttar applikasjonen for å leggje til endringar… + Tillegg diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index e11a2cafa..b22f776c1 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -422,6 +422,8 @@ ایں سائٹ کیتے چالو کرو + + سہارا ارداس بھیڄ ݙتی سائٹ فی الحال سہارا تھئی کائنی From 8014ef7673e00c559533085d6dcfe35b25d7e031 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 17 Jul 2023 21:53:18 -0400 Subject: [PATCH 094/207] Revert "Bug 1842890 - Add splash screen animation" for breaking gradle-dependencies jobs. This reverts commit 5c6d56c352c059806ae0e9c7ad829e421d22df3a. --- .../res/drawable/animated_splash_screen.xml | 836 ------ .../res/drawable/animated_splash_screen.xml | 2515 ----------------- .../main/res/drawable-v23/splash_screen.xml | 11 + .../main/res/drawable-v24/splash_screen.xml | 7 + app/src/main/res/values-night/styles.xml | 6 +- app/src/main/res/values/dimens.xml | 4 - app/src/main/res/values/styles.xml | 7 +- .../res/drawable/animated_splash_screen.xml | 817 ------ .../res/drawable/animated_splash_screen.xml | 742 ----- 9 files changed, 23 insertions(+), 4922 deletions(-) delete mode 100644 app/src/beta/res/drawable/animated_splash_screen.xml delete mode 100644 app/src/debug/res/drawable/animated_splash_screen.xml create mode 100644 app/src/main/res/drawable-v23/splash_screen.xml create mode 100644 app/src/main/res/drawable-v24/splash_screen.xml delete mode 100644 app/src/nightly/res/drawable/animated_splash_screen.xml delete mode 100644 app/src/release/res/drawable/animated_splash_screen.xml diff --git a/app/src/beta/res/drawable/animated_splash_screen.xml b/app/src/beta/res/drawable/animated_splash_screen.xml deleted file mode 100644 index 9ca0de2a3..000000000 --- a/app/src/beta/res/drawable/animated_splash_screen.xml +++ /dev/null @@ -1,836 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/debug/res/drawable/animated_splash_screen.xml b/app/src/debug/res/drawable/animated_splash_screen.xml deleted file mode 100644 index 7dfabc0ee..000000000 --- a/app/src/debug/res/drawable/animated_splash_screen.xml +++ /dev/null @@ -1,2515 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable-v23/splash_screen.xml b/app/src/main/res/drawable-v23/splash_screen.xml new file mode 100644 index 000000000..74d441577 --- /dev/null +++ b/app/src/main/res/drawable-v23/splash_screen.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable-v24/splash_screen.xml b/app/src/main/res/drawable-v24/splash_screen.xml new file mode 100644 index 000000000..56f7a470f --- /dev/null +++ b/app/src/main/res/drawable-v24/splash_screen.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index dce770124..f615fe796 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -4,10 +4,8 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 89d07914c..0e14424b4 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -186,10 +186,6 @@ 16dp 48dp - - - 12000 - 48dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6d49465d4..028a415b8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,10 +5,9 @@ diff --git a/app/src/nightly/res/drawable/animated_splash_screen.xml b/app/src/nightly/res/drawable/animated_splash_screen.xml deleted file mode 100644 index 0701c810d..000000000 --- a/app/src/nightly/res/drawable/animated_splash_screen.xml +++ /dev/null @@ -1,817 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/release/res/drawable/animated_splash_screen.xml b/app/src/release/res/drawable/animated_splash_screen.xml deleted file mode 100644 index 8e8a4ae49..000000000 --- a/app/src/release/res/drawable/animated_splash_screen.xml +++ /dev/null @@ -1,742 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From a08c399631e9a9c8fe152563af9327be94c6a4bf Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Mon, 17 Jul 2023 21:31:42 -0600 Subject: [PATCH 095/207] Bug 1843157 - Correct link to Mobile Test Engineering (#2854) Co-authored-by: dsmithpadilla <88508950+dsmithpadilla@users.noreply.github.com> --- automation/taskcluster/androidTest/parse-ui-test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automation/taskcluster/androidTest/parse-ui-test.py b/automation/taskcluster/androidTest/parse-ui-test.py index 80b84b778..5ea932d7d 100644 --- a/automation/taskcluster/androidTest/parse-ui-test.py +++ b/automation/taskcluster/androidTest/parse-ui-test.py @@ -66,7 +66,7 @@ def main(): "* [Automated UI Testing Documentation](https://github.com/mozilla-mobile/shared-docs/blob/main/android/ui-testing.md)\n" ) print( - "* Mobile Test Engineering on [Mana](https://mana.mozilla.org/wiki/display/MTE/Mobile+Test+Engineering) | [Slack](https://mozilla.slack.com/archives/C02KDDS9QM9) | [Alerts](https://mozilla.slack.com/archives/C0134KJ4JHL)\n" + "* Mobile Test Engineering on [Confluence](https://mozilla-hub.atlassian.net/wiki/spaces/MTE/overview) | [Slack](https://mozilla.slack.com/archives/C02KDDS9QM9) | [Alerts](https://mozilla.slack.com/archives/C0134KJ4JHL)\n" ) From c0292f38464bdceefc2f29f36edbbd58df31e6ae Mon Sep 17 00:00:00 2001 From: iorgamgabriel Date: Mon, 19 Jun 2023 17:38:33 +0300 Subject: [PATCH 096/207] Bug 1823367 - Show snackbar instead of toast when save to PDF error appears. --- .../mozilla/fenix/browser/BrowserFragment.kt | 10 + .../browser/StandardSnackbarErrorBinding.kt | 89 +++++ .../mozilla/fenix/components/FenixSnackbar.kt | 27 ++ .../fenix/components/appstate/AppAction.kt | 8 + .../fenix/components/appstate/AppState.kt | 2 + .../components/appstate/AppStoreReducer.kt | 4 + .../fenix/share/SaveToPDFMiddleware.kt | 18 +- .../standard_snackbar_error_background.xml | 9 + app/src/main/res/values/strings.xml | 4 +- .../StandardSnackbarErrorBindingTest.kt | 137 ++++++++ .../fenix/share/SaveToPDFMiddlewareTest.kt | 329 ++++++++++-------- 11 files changed, 487 insertions(+), 150 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt create mode 100644 app/src/main/res/drawable/standard_snackbar_error_background.xml create mode 100644 app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 4e183572d..6d81542ec 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -62,6 +62,8 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val windowFeature = ViewBoundFeatureWrapper() private val openInAppOnboardingObserver = ViewBoundFeatureWrapper() + private val standardSnackbarErrorBinding = + ViewBoundFeatureWrapper() private val reviewQualityCheckFeature = ViewBoundFeatureWrapper() private var readerModeAvailable = false @@ -188,6 +190,14 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { if (!context.settings().shouldUseCookieBanner && !context.settings().userOptOutOfReEngageCookieBannerDialog) { observeCookieBannerHandlingState(context.components.core.store) } + standardSnackbarErrorBinding.set( + feature = StandardSnackbarErrorBinding( + requireActivity(), + requireActivity().components.appStore, + ), + owner = viewLifecycleOwner, + view = binding.root, + ) } private fun initReviewQualityCheck(context: Context, view: View) { diff --git a/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt b/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt new file mode 100644 index 000000000..1465da2f1 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt @@ -0,0 +1,89 @@ +/* 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.browser + +import android.app.Activity +import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.ContextCompat +import com.google.android.material.snackbar.Snackbar +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import mozilla.components.lib.state.helpers.AbstractBinding +import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore +import org.mozilla.fenix.components.FenixSnackbar +import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.components.appstate.AppState +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.getRootView + +/** + * A binding that shows standard snackbar error. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class StandardSnackbarErrorBinding( + private val activity: Activity, + appStore: AppStore, +) : AbstractBinding(appStore) { + + override suspend fun onState(flow: Flow) { + flow.map { state -> state.standardSnackbarError } + .distinctUntilChanged() + .collect { + it?.let { standardSnackbarError -> + activity.getRootView()?.let { view -> + val snackBar = FenixSnackbar.make( + view = view, + duration = Snackbar.LENGTH_INDEFINITE, + isDisplayedWithBrowserToolbar = true, + ) + snackBar.setText( + standardSnackbarError.message, + ) + snackBar.setButtonTextColor( + ContextCompat.getColor( + activity, + R.color.fx_mobile_text_color_primary, + ), + ) + snackBar.setBackground( + AppCompatResources.getDrawable( + activity, + R.drawable.standard_snackbar_error_background, + ), + ) + snackBar.setSnackBarTextColor( + ContextCompat.getColor( + activity, + R.color.fx_mobile_text_color_warning, + ), + ) + snackBar.setAction( + text = activity.getString(R.string.standard_snackbar_error_dismiss), + action = { + view.context.components.appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + null, + ), + ) + }, + ) + snackBar.show() + } + } + } + } +} + +/** + * Standard Snackbar Error data class. + * + * @param message that will appear on the snackbar. + */ +data class StandardSnackbarError( + val message: String, +) diff --git a/app/src/main/java/org/mozilla/fenix/components/FenixSnackbar.kt b/app/src/main/java/org/mozilla/fenix/components/FenixSnackbar.kt index 8d6dd4a6a..9bbc4d0b6 100644 --- a/app/src/main/java/org/mozilla/fenix/components/FenixSnackbar.kt +++ b/app/src/main/java/org/mozilla/fenix/components/FenixSnackbar.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.components import android.graphics.Color +import android.graphics.drawable.Drawable import android.util.TypedValue import android.view.LayoutInflater import android.view.View @@ -54,6 +55,27 @@ class FenixSnackbar private constructor( } } + /** + * Set FenixSnackBar background. + */ + fun setBackground(backgroundDrawable: Drawable?) = this.apply { + binding.snackbarLayout.background = backgroundDrawable + } + + /** + * Set FenixSnackBar button text color. + */ + fun setButtonTextColor(textColor: Int) = this.apply { + binding.snackbarBtn.setTextColor(textColor) + } + + /** + * Set FenixSnackBarText text color. + */ + fun setSnackBarTextColor(textColor: Int) = this.apply { + binding.snackbarText.setTextColor(textColor) + } + fun setText(text: String) = this.apply { binding.snackbarText.text = text } @@ -62,6 +84,11 @@ class FenixSnackbar private constructor( this.duration = duration } + /** + * Set snackBar button action + * @param text that should appear on snackBar button. + * @param action callback when user presses snackBar button. + */ fun setAction(text: String, action: () -> Unit) = this.apply { binding.snackbarBtn.apply { setText(text) diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt index c1bd2c6d4..10a8eddaf 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt @@ -12,6 +12,7 @@ import mozilla.components.service.nimbus.messaging.Message import mozilla.components.service.nimbus.messaging.MessageSurfaceId import mozilla.components.service.pocket.PocketStory import mozilla.components.service.pocket.PocketStory.PocketSponsoredStory +import org.mozilla.fenix.browser.StandardSnackbarError import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory @@ -208,4 +209,11 @@ sealed class AppAction : Action { */ object PauseAction : AppLifecycleAction() } + + /** + * State of standard error snackBar has changed. + */ + data class UpdateStandardSnackbarErrorAction( + val standardSnackbarError: StandardSnackbarError?, + ) : AppAction() } diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt index 465dbdbc7..416d83ab2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt @@ -12,6 +12,7 @@ import mozilla.components.lib.state.State import mozilla.components.service.pocket.PocketStory import mozilla.components.service.pocket.PocketStory.PocketRecommendedStory import mozilla.components.service.pocket.PocketStory.PocketSponsoredStory +import org.mozilla.fenix.browser.StandardSnackbarError import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory @@ -71,4 +72,5 @@ data class AppState( val messaging: MessagingState = MessagingState(), val pendingDeletionHistoryItems: Set = emptySet(), val wallpaperState: WallpaperState = WallpaperState.default, + val standardSnackbarError: StandardSnackbarError? = null, ) : State diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt index d51e7ae1c..dd583a9f9 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt @@ -227,6 +227,10 @@ internal object AppStoreReducer { is AppAction.AppLifecycleAction.PauseAction -> { state.copy(isForeground = false) } + + is AppAction.UpdateStandardSnackbarErrorAction -> state.copy( + standardSnackbarError = action.standardSnackbarError, + ) } } diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt index e040eb3e3..827478389 100644 --- a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -16,11 +16,13 @@ import mozilla.components.browser.state.action.EngineAction import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.TabSessionState -import mozilla.components.lib.state.Action import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.R +import org.mozilla.fenix.browser.StandardSnackbarError +import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.ext.components import org.mozilla.gecko.util.ThreadUtils import org.mozilla.geckoview.GeckoSession import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_NO_ACTIVITY_CONTEXT @@ -30,7 +32,6 @@ import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_PRINT_SETTIN import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_UNABLE_TO_CREATE_PRINT_SETTINGS import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_UNABLE_TO_RETRIEVE_CANONICAL_BROWSING_CONTEXT import java.io.IOException -import java.lang.Exception /** * [BrowserAction] middleware reacting in response to Save to PDF related [Action]s. @@ -58,12 +59,13 @@ class SaveToPDFMiddleware( } is EngineAction.SaveToPdfExceptionAction -> { - // See https://github.com/mozilla-mobile/fenix/issues/27649 for more details, - // why a Toast is used here. - ThreadUtils.runOnUiThread { - Toast.makeText(context, R.string.unable_to_save_to_pdf_error, LENGTH_LONG).show() - } - + context.components.appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + context.getString(R.string.unable_to_save_to_pdf_error), + ), + ), + ) postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable, isPrint = false) } diff --git a/app/src/main/res/drawable/standard_snackbar_error_background.xml b/app/src/main/res/drawable/standard_snackbar_error_background.xml new file mode 100644 index 000000000..5cd676eae --- /dev/null +++ b/app/src/main/res/drawable/standard_snackbar_error_background.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ccf80a418..9e483f0b8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1158,8 +1158,10 @@ Share Save as PDF - + Unable to generate PDF + + Dismiss Unable to print diff --git a/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt b/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt new file mode 100644 index 000000000..f102eafbb --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt @@ -0,0 +1,137 @@ +/* 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.browser + +import android.app.Activity +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.ContextCompat +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import mozilla.components.support.test.robolectric.testContext +import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore +import org.mozilla.fenix.components.FenixSnackbar +import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.ext.getRootView +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class StandardSnackbarErrorBindingTest { + + @OptIn(ExperimentalCoroutinesApi::class) + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + + private lateinit var activity: Activity + private lateinit var snackbar: FenixSnackbar + private lateinit var rootView: View + + @Before + fun setup() { + MockKAnnotations.init(this) + mockkObject(FenixSnackbar) + + mockkStatic(AppCompatResources::class) + every { AppCompatResources.getDrawable(any(), any()) } returns mockk(relaxed = true) + + snackbar = mockk(relaxed = true) + every { FenixSnackbar.make(any(), any(), any(), any()) } returns snackbar + rootView = mockk(relaxed = true) + activity = mockk(relaxed = true) { + every { findViewById(android.R.id.content) } returns rootView + every { getRootView() } returns rootView + } + } + + @After + fun teardown() { + unmockkStatic(AppCompatResources::class) + } + + @Test + fun `WHEN show standard snackbar error action dispatched THEN fenix snackbar should appear`() { + val appStore = AppStore() + val standardSnackbarError = StandardSnackbarErrorBinding( + activity, + appStore, + ) + + standardSnackbarError.start() + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_save_to_pdf_error), + ), + ), + ) + appStore.waitUntilIdle() + + verify { + snackbar.setText(testContext.getString(R.string.unable_to_save_to_pdf_error)) + snackbar.setButtonTextColor( + ContextCompat.getColor( + activity, + R.color.fx_mobile_text_color_primary, + ), + ) + snackbar.setBackground( + any(), + ) + snackbar.setSnackBarTextColor( + ContextCompat.getColor( + activity, + R.color.fx_mobile_text_color_warning, + ), + ) + snackbar.setAction( + text = activity.getString(R.string.standard_snackbar_error_dismiss), + any(), + ) + snackbar.show() + } + } + + @Test + fun `WHEN show standard snackbar error action dispatched and binding is stopped THEN fenix snackbar should appear when binding is again started`() { + val appStore = AppStore() + val standardSnackbarError = StandardSnackbarErrorBinding( + activity, + appStore, + ) + + standardSnackbarError.start() + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_save_to_pdf_error), + ), + ), + ) + appStore.waitUntilIdle() + + standardSnackbarError.stop() + + standardSnackbarError.start() + + verify { + snackbar.show() + } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt index 2a931b83c..da1028caa 100644 --- a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt @@ -3,9 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.share + import android.content.Context import io.mockk.every import io.mockk.mockk +import io.mockk.verify import mozilla.components.browser.state.action.EngineAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.createTab @@ -19,16 +21,23 @@ import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.runTestOnMain import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull +import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.R +import org.mozilla.fenix.browser.StandardSnackbarError +import org.mozilla.fenix.components.AppStore +import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.geckoview.GeckoSession import java.io.IOException @RunWith(FenixRobolectricTestRunner::class) class SaveToPDFMiddlewareTest { + private lateinit var appStore: AppStore @get:Rule val gleanTestRule = GleanTestRule(testContext) @@ -39,171 +48,209 @@ class SaveToPDFMiddlewareTest { // Only ERROR_PRINT_SETTINGS_SERVICE_NOT_AVAILABLE is available for testing class MockGeckoPrintException() : GeckoSession.GeckoPrintException() + @Before + fun setup() { + appStore = mockk(relaxed = true) + every { testContext.components.appStore } returns appStore + } + @Test - fun `GIVEN a save to pdf request WHEN it fails unexpectedly THEN unknown failure telemetry is sent`() = runTestOnMain { - val exceptionToThrow = RuntimeException("reader save to pdf failed") - val middleware = SaveToPDFMiddleware(testContext) - val mockEngineSession: EngineSession = mockk().apply { - every { - checkForPdfViewer(any(), any()) - } answers { - secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + fun `GIVEN a save to pdf request WHEN it fails unexpectedly THEN unknown failure telemetry is sent AND a snackbar error is shown`() = + runTestOnMain { + val exceptionToThrow = RuntimeException("reader save to pdf failed") + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + } } - } - val browserStore = BrowserStore( - middleware = listOf(middleware), - initialState = BrowserState( - tabs = listOf( - createTab( - url = "https://mozilla.org", - id = "14", - engineSession = mockEngineSession, + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), ), ), - ), - ) - browserStore.dispatch( - EngineAction.SaveToPdfExceptionAction("14", exceptionToThrow), - ) - browserStore.waitUntilIdle() - testScheduler.advanceUntilIdle() - val response = Events.saveToPdfFailure.testGetValue()?.firstOrNull() - assertNotNull(response) - val reason = response?.extra?.get("reason") - assertEquals("unknown", reason) - val source = response?.extra?.get("source") - assertEquals("unknown", source) - } + ) + browserStore.dispatch( + EngineAction.SaveToPdfExceptionAction("14", exceptionToThrow), + ) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.saveToPdfFailure.testGetValue()?.firstOrNull() + assertNotNull(response) + val reason = response?.extra?.get("reason") + assertEquals("unknown", reason) + val source = response?.extra?.get("source") + assertEquals("unknown", source) + verify { + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_save_to_pdf_error), + ), + ), + ) + } + } @Test - fun `GIVEN a save to pdf request WHEN it fails due to io THEN io failure telemetry is sent`() = runTestOnMain { - val exceptionToThrow = IOException() - val middleware = SaveToPDFMiddleware(testContext) - val mockEngineSession: EngineSession = mockk().apply { - every { - checkForPdfViewer(any(), any()) - } answers { - secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + fun `GIVEN a save to pdf request WHEN it fails due to io THEN io failure telemetry is sent AND a snackbar error is shown`() = + runTestOnMain { + val exceptionToThrow = IOException() + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + } } - } - val browserStore = BrowserStore( - middleware = listOf(middleware), - initialState = BrowserState( - tabs = listOf( - createTab( - url = "https://mozilla.org", - id = "14", - engineSession = mockEngineSession, + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), ), ), - ), - ) - browserStore.dispatch(EngineAction.SaveToPdfExceptionAction("14", exceptionToThrow)) - browserStore.waitUntilIdle() - testScheduler.advanceUntilIdle() - val response = Events.saveToPdfFailure.testGetValue()?.firstOrNull() - assertNotNull(response) - val reason = response?.extra?.get("reason") - assertEquals("io_error", reason) - val source = response?.extra?.get("source") - assertEquals("unknown", source) - } + ) + browserStore.dispatch(EngineAction.SaveToPdfExceptionAction("14", exceptionToThrow)) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.saveToPdfFailure.testGetValue()?.firstOrNull() + assertNotNull(response) + val reason = response?.extra?.get("reason") + assertEquals("io_error", reason) + val source = response?.extra?.get("source") + assertEquals("unknown", source) + verify { + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_save_to_pdf_error), + ), + ), + ) + } + } @Test - fun `GIVEN a save to pdf request WHEN it fails due to print exception THEN print exception failure telemetry is sent`() = runTestOnMain { - val exceptionToThrow = MockGeckoPrintException() - val middleware = SaveToPDFMiddleware(testContext) - val mockEngineSession: EngineSession = mockk().apply { - every { - checkForPdfViewer(any(), any()) - } answers { - secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + fun `GIVEN a save to pdf request WHEN it fails due to print exception THEN print exception failure telemetry is sent AND a snackbar error is shown`() = + runTestOnMain { + val exceptionToThrow = MockGeckoPrintException() + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + secondArg<(Throwable) -> Unit>().invoke(exceptionToThrow) + } } - } - val browserStore = BrowserStore( - middleware = listOf(middleware), - initialState = BrowserState( - tabs = listOf( - createTab( - url = "https://mozilla.org", - id = "14", - engineSession = mockEngineSession, + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), ), ), - ), - ) - browserStore.dispatch(EngineAction.SaveToPdfExceptionAction("14", exceptionToThrow)) - browserStore.waitUntilIdle() - testScheduler.advanceUntilIdle() - val response = Events.saveToPdfFailure.testGetValue()?.firstOrNull() - assertNotNull(response) - val reason = response?.extra?.get("reason") - assertEquals("no_settings_service", reason) - val source = response?.extra?.get("source") - assertEquals("unknown", source) - } + ) + browserStore.dispatch(EngineAction.SaveToPdfExceptionAction("14", exceptionToThrow)) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.saveToPdfFailure.testGetValue()?.firstOrNull() + assertNotNull(response) + val reason = response?.extra?.get("reason") + assertEquals("no_settings_service", reason) + val source = response?.extra?.get("source") + assertEquals("unknown", source) + verify { + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_save_to_pdf_error), + ), + ), + ) + } + } @Test - fun `GIVEN a save to pdf request WHEN it completes THEN completed telemetry is sent`() = runTestOnMain { - val middleware = SaveToPDFMiddleware(testContext) - val mockEngineSession: EngineSession = mockk().apply { - every { - checkForPdfViewer(any(), any()) - } answers { - firstArg<(Boolean) -> Unit>().invoke(false) + fun `GIVEN a save to pdf request WHEN it completes THEN completed telemetry is sent`() = + runTestOnMain { + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + firstArg<(Boolean) -> Unit>().invoke(false) + } } - } - val browserStore = BrowserStore( - middleware = listOf(middleware), - initialState = BrowserState( - tabs = listOf( - createTab( - url = "https://mozilla.org", - id = "14", - engineSession = mockEngineSession, + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), ), ), - ), - ) - browserStore.dispatch(EngineAction.SaveToPdfCompleteAction("14")) - browserStore.waitUntilIdle() - testScheduler.advanceUntilIdle() - val response = Events.saveToPdfCompleted.testGetValue() - assertNotNull(response) - val source = response?.firstOrNull()?.extra?.get("source") - assertEquals("non-pdf", source) - } + ) + browserStore.dispatch(EngineAction.SaveToPdfCompleteAction("14")) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.saveToPdfCompleted.testGetValue() + assertNotNull(response) + val source = response?.firstOrNull()?.extra?.get("source") + assertEquals("non-pdf", source) + } @Test - fun `GIVEN a save to pdf request WHEN it the action begins THEN tapped telemetry is sent`() = runTestOnMain { - val middleware = SaveToPDFMiddleware(testContext) - val mockEngineSession: EngineSession = mockk().apply { - every { - checkForPdfViewer(any(), any()) - } answers { - firstArg<(Boolean) -> Unit>().invoke(false) + fun `GIVEN a save to pdf request WHEN it the action begins THEN tapped telemetry is sent`() = + runTestOnMain { + val middleware = SaveToPDFMiddleware(testContext) + val mockEngineSession: EngineSession = mockk().apply { + every { + checkForPdfViewer(any(), any()) + } answers { + firstArg<(Boolean) -> Unit>().invoke(false) + } } - } - val browserStore = BrowserStore( - middleware = listOf(middleware), - initialState = BrowserState( - tabs = listOf( - createTab( - url = "https://mozilla.org", - id = "14", - engineSession = mockEngineSession, + val browserStore = BrowserStore( + middleware = listOf(middleware), + initialState = BrowserState( + tabs = listOf( + createTab( + url = "https://mozilla.org", + id = "14", + engineSession = mockEngineSession, + ), ), ), - ), - ) - browserStore.dispatch(EngineAction.SaveToPdfAction("14")) - browserStore.waitUntilIdle() - testScheduler.advanceUntilIdle() - val response = Events.saveToPdfTapped.testGetValue() - assertNotNull(response) - val source = response?.firstOrNull()?.extra?.get("source") - assertEquals("non-pdf", source) - } + ) + browserStore.dispatch(EngineAction.SaveToPdfAction("14")) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + val response = Events.saveToPdfTapped.testGetValue() + assertNotNull(response) + val source = response?.firstOrNull()?.extra?.get("source") + assertEquals("non-pdf", source) + } @Test fun `GIVEN a save as pdf exception THEN should calculate the correct failure reason for telemetry`() = runTestOnMain { From 095a0ec50bf9291ea03048a3d393a05f466572e3 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Wed, 12 Jul 2023 13:28:31 +0200 Subject: [PATCH 097/207] Bug 1840332 - Create ReviewQualityCheckState --- .../state/ReviewQualityCheckAction.kt | 12 ++ .../shopping/state/ReviewQualityCheckState.kt | 138 ++++++++++++++++++ .../shopping/state/ReviewQualityCheckStore.kt | 15 ++ .../mozilla/fenix/shopping/ui/ReviewGrade.kt | 33 +++-- 4 files changed, 189 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckState.kt create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt new file mode 100644 index 000000000..30b57a109 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt @@ -0,0 +1,12 @@ +/* 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.shopping.state + +import mozilla.components.lib.state.Action + +/** + * Actions for review quality check feature. + */ +sealed interface ReviewQualityCheckAction : Action diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckState.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckState.kt new file mode 100644 index 000000000..dcfe27ef0 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckState.kt @@ -0,0 +1,138 @@ +/* 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.shopping.state + +import mozilla.components.lib.state.State + +/** + * UI state of the review quality check feature. + */ +sealed interface ReviewQualityCheckState : State { + /** + * The initial state of the feature, it's also the default state set in the store. + */ + object Initial : ReviewQualityCheckState + + /** + * The state when the user has not opted in for the feature. + */ + object NotOptedIn : ReviewQualityCheckState + + /** + * The state when the user has opted in for the feature. + * + * @property productReviewState The state of the product the user is browsing. + * @property productRecommendationsPreference User preference whether to show product + * recommendations. True if product recommendations should be shown. + */ + data class OptedIn( + val productReviewState: ProductReviewState = ProductReviewState.Loading, + val productRecommendationsPreference: Boolean, + ) : ReviewQualityCheckState { + + /** + * The state of the product the user is browsing. + */ + sealed interface ProductReviewState { + /** + * Denotes content is loading. + */ + object Loading : ProductReviewState + + /** + * Denotes an error has occurred. + */ + object Error : ProductReviewState + + /** + * Denotes no analysis is present for the product the user is browsing. + * + * @property productUrl The url of the product the user is browsing. + */ + data class NoAnalysisPresent( + val productUrl: String, + ) : ProductReviewState + + /** + * Denotes the state where analysis of the product is fetched and available. + * + * @property productId The id of the product, e.g ASIN, SKU. + * @property reviewGrade The review grade of the product. + * @property needsAnalysis If true, the analysis is stale and that to get the fresh + * data, re–analysis is needed. + * @property adjustedRating The adjusted rating taking review quality into consideration. + * @property productUrl The url of the product the user is browsing. + * @property highlights Optional highlights based on recent reviews of the product. + * @property recommendedProductState The state of the recommended product. + */ + data class ProductAnalysis( + val productId: String, + val reviewGrade: Grade, + val needsAnalysis: Boolean, + val adjustedRating: Float, + val productUrl: String, + val highlights: Map>?, + val recommendedProductState: RecommendedProductState = RecommendedProductState.Initial, + ) : ProductReviewState + } + } + + /** + * Review Grade of the product - A being the best and F being the worst. There is no grade E. + */ + enum class Grade { + A, B, C, D, F + } + + /** + * Factors for which highlights are available based on recent reviews of the product. + */ + enum class HighlightType { + QUALITY, PRICE, SHIPPING, PACKAGING_AND_APPEARANCE, COMPETITIVENESS + } + + /** + * The state of the recommended product. + */ + sealed interface RecommendedProductState { + /** + * The initial state of the recommended product. + */ + object Initial : RecommendedProductState + + /** + * The state when the recommended product is loading. + */ + object Loading : RecommendedProductState + + /** + * The state when an error has occurred while fetching the recommended product. + */ + object Error : RecommendedProductState + + /** + * The state when the recommended product is available. + * + * @property name The name of the product. + * @property productUrl The url of the product. + * @property imageUrl The url of the image of the product. + * @property formattedPrice The formatted price of the product. + * @property reviewGrade The review grade of the product. + * @property adjustedRating The adjusted rating of the product. + * @property isSponsored True if the product is sponsored. + * @property analysisUrl The url of the analysis of the product. + */ + data class Product( + val name: String, + val productUrl: String, + val imageUrl: String, + val formattedPrice: String, + val reviewGrade: Grade, + val adjustedRating: Float, + val isSponsored: Boolean, + val analysisUrl: String, + ) : RecommendedProductState + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt new file mode 100644 index 000000000..aab0d57ee --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt @@ -0,0 +1,15 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.shopping.state + +import mozilla.components.lib.state.Store + +/** + * Store for review quality check feature. + */ +class ReviewQualityCheckStore : Store( + initialState = ReviewQualityCheckState.Initial, + reducer = { _, _ -> ReviewQualityCheckState.Initial }, +) diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt index 317aef4d1..9ce9ce6d9 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewGrade.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.unit.dp import mozilla.components.ui.colors.PhotonColors import org.mozilla.fenix.R import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.shopping.state.ReviewQualityCheckState.Grade import org.mozilla.fenix.theme.FirefoxTheme private val height = 24.dp @@ -47,7 +48,7 @@ private val reviewGradeFColorExpanded = Color(0xFFF9DBE1) /** * Review Grade of the product - A being the best and F being the worst. */ -enum class ReviewGrade( +private enum class ReviewGrade( val stringResourceId: Int, val backgroundColor: Color, val expandedTextBackgroundColor: Color, @@ -83,15 +84,15 @@ enum class ReviewGrade( * UI for displaying the review grade. * * @param modifier The modifier to be applied to the Composable. - * @param reviewGrade The grade of the product. + * @param grade The grade of the product. */ @Composable fun ReviewGradeCompact( modifier: Modifier = Modifier, - reviewGrade: ReviewGrade, + grade: Grade, ) { ReviewGradeLetter( - reviewGrade = reviewGrade, + reviewGrade = grade.toReviewGrade(), modifier = modifier.border( border = BorderStroke( width = 1.dp, @@ -106,13 +107,15 @@ fun ReviewGradeCompact( * UI for displaying the review grade with descriptive text. * * @param modifier The modifier to be applied to the Composable. - * @param reviewGrade The grade of the product. + * @param grade The grade of the product. */ @Composable fun ReviewGradeExpanded( modifier: Modifier = Modifier, - reviewGrade: ReviewGrade, + grade: Grade, ) { + val reviewGrade = grade.toReviewGrade() + Row( modifier = modifier .background( @@ -172,6 +175,18 @@ private fun ReviewGradeLetter( } } +/** + * Maps [Grade] to [ReviewGrade]. + */ +private fun Grade.toReviewGrade(): ReviewGrade = + when (this) { + Grade.A -> ReviewGrade.A + Grade.B -> ReviewGrade.B + Grade.C -> ReviewGrade.C + Grade.D -> ReviewGrade.D + Grade.F -> ReviewGrade.F + } + @Composable @LightDarkPreview private fun ReviewGradePreview() { @@ -181,13 +196,13 @@ private fun ReviewGradePreview() { .background(FirefoxTheme.colors.layer1) .padding(16.dp), ) { - ReviewGrade.values().forEach { + Grade.values().forEach { Row( horizontalArrangement = Arrangement.spacedBy(32.dp), ) { - ReviewGradeCompact(reviewGrade = it) + ReviewGradeCompact(grade = it) - ReviewGradeExpanded(reviewGrade = it) + ReviewGradeExpanded(grade = it) } Spacer(modifier = Modifier.height(16.dp)) From fcf397a118a70b0dfc838b998da89499a730fc81 Mon Sep 17 00:00:00 2001 From: James Hugman Date: Tue, 18 Jul 2023 13:47:56 +0100 Subject: [PATCH 098/207] =?UTF-8?q?Bug=201843546=20=E2=80=94=20Fixup=20mes?= =?UTF-8?q?sage-under-experiment=20while=20experimenter=20doesn't=20do=20f?= =?UTF-8?q?eature=20versioning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.experimenter.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/.experimenter.yaml b/app/.experimenter.yaml index 0b51d040d..11acd1f2e 100644 --- a/app/.experimenter.yaml +++ b/app/.experimenter.yaml @@ -50,6 +50,9 @@ messaging: actions: type: json description: A growable map of action URLs. + message-under-experiment: + type: string + description: "Deprecated in favor of `MessageData#experiment`. This will be removed in future releases." messages: type: json description: A growable collection of messages From 003bb94cddd07dce3a78182bacb9f2e9a02a080f Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Tue, 18 Jul 2023 13:43:07 +0300 Subject: [PATCH 099/207] Bug 1843864 - Fenix: Add tests for unified search bar placeholder --- .../org/mozilla/fenix/ui/ComposeSearchTest.kt | 74 +++++++++++++++++-- .../java/org/mozilla/fenix/ui/SearchTest.kt | 73 ++++++++++++++++-- .../mozilla/fenix/ui/robots/SearchRobot.kt | 9 --- 3 files changed, 137 insertions(+), 19 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt index 5d01078e6..f29a808bb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt @@ -26,6 +26,7 @@ import org.mozilla.fenix.helpers.MatcherHelper import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper +import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.ui.robots.clickContextMenuItem import org.mozilla.fenix.ui.robots.clickPageObject import org.mozilla.fenix.ui.robots.homeScreen @@ -47,6 +48,8 @@ import org.mozilla.fenix.ui.robots.searchScreen class ComposeSearchTest { lateinit var searchMockServer: MockWebServer lateinit var queryString: String + private val generalEnginesList = listOf("DuckDuckGo", "Google", "Bing") + private val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") @get:Rule val activityTestRule = AndroidComposeTestRule( @@ -87,11 +90,6 @@ class ComposeSearchTest { typeSearch("mozilla ") verifyScanButtonVisibility(visible = false) verifyVoiceSearchButtonVisibility(enabled = true) - clickClearButton() - clickSearchSelectorButton() - selectTemporarySearchMethod("Amazon.com") - verifyScanButtonVisibility(visible = false) - verifyVoiceSearchButtonVisibility(enabled = true) } } @@ -109,6 +107,51 @@ class ComposeSearchTest { } } + @Test + fun searchPlaceholderForDefaultEnginesTest() { + generalEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + }.clickSearchEngineSettings { + openDefaultSearchEngineMenu() + changeDefaultSearchEngine(it) + exitMenu() + } + navigationToolbar { + verifySearchBarPlaceholder("Search or enter address") + } + } + } + + @Test + fun searchPlaceholderForOtherGeneralSearchEnginesTest() { + val generalEnginesList = listOf("DuckDuckGo", "Bing") + + generalEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifySearchBarPlaceholder("Search the web") + }.dismissSearchBar {} + } + } + + @Test + fun searchPlaceholderForTopicSearchEngineTest() { + val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") + + topicEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifySearchBarPlaceholder("Enter search terms") + }.dismissSearchBar {} + } + } + @SmokeTest @Test fun scanButtonDenyPermissionTest() { @@ -144,6 +187,27 @@ class ComposeSearchTest { } } + @Test + fun scanButtonAvailableOnlyForGeneralSearchEnginesTest() { + generalEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifyScanButtonVisibility(visible = true) + }.dismissSearchBar {} + } + + topicEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifyScanButtonVisibility(visible = false) + }.dismissSearchBar {} + } + } + // Verifies a temporary change of search engine from the Search shortcut menu @SmokeTest @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 6c8e51ff3..14282ec50 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -59,6 +59,8 @@ import org.mozilla.fenix.ui.robots.searchScreen class SearchTest { lateinit var searchMockServer: MockWebServer lateinit var queryString: String + private val generalEnginesList = listOf("DuckDuckGo", "Google", "Bing") + private val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") @get:Rule val activityTestRule = AndroidComposeTestRule( @@ -98,11 +100,6 @@ class SearchTest { typeSearch("mozilla ") verifyScanButtonVisibility(visible = false) verifyVoiceSearchButtonVisibility(enabled = true) - clickClearButton() - clickSearchSelectorButton() - selectTemporarySearchMethod("Amazon.com") - verifyScanButtonVisibility(visible = false) - verifyVoiceSearchButtonVisibility(enabled = true) } } @@ -120,6 +117,51 @@ class SearchTest { } } + @Test + fun searchPlaceholderForDefaultEnginesTest() { + generalEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + }.clickSearchEngineSettings { + openDefaultSearchEngineMenu() + changeDefaultSearchEngine(it) + exitMenu() + } + navigationToolbar { + verifySearchBarPlaceholder("Search or enter address") + } + } + } + + @Test + fun searchPlaceholderForOtherGeneralSearchEnginesTest() { + val generalEnginesList = listOf("DuckDuckGo", "Bing") + + generalEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifySearchBarPlaceholder("Search the web") + }.dismissSearchBar {} + } + } + + @Test + fun searchPlaceholderForTopicSearchEngineTest() { + val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") + + topicEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifySearchBarPlaceholder("Enter search terms") + }.dismissSearchBar {} + } + } + @SmokeTest @Test fun scanButtonDenyPermissionTest() { @@ -155,6 +197,27 @@ class SearchTest { } } + @Test + fun scanButtonAvailableOnlyForGeneralSearchEnginesTest() { + generalEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifyScanButtonVisibility(visible = true) + }.dismissSearchBar {} + } + + topicEnginesList.forEach { + homeScreen { + }.openSearch { + clickSearchSelectorButton() + selectTemporarySearchMethod(it) + verifyScanButtonVisibility(visible = false) + }.dismissSearchBar {} + } + } + // Verifies a temporary change of search engine from the Search shortcut menu @SmokeTest @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index 999de1f16..7fed3edfe 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -90,8 +90,6 @@ class SearchRobot { } } - fun verifySearchEngineButton() = assertSearchButton() - fun verifySearchEngineSuggestionResults(rule: ComposeTestRule, searchSuggestion: String) { rule.waitForIdle() for (i in 1..RETRY_COUNT) { @@ -401,13 +399,6 @@ private fun clearButton() = private fun searchWrapper() = mDevice.findObject(UiSelector().resourceId("$packageName:id/search_wrapper")) -private fun assertSearchButton() = - assertTrue( - mDevice.findObject( - UiSelector().resourceId("$packageName:id/search_engines_shortcut_button"), - ).waitForExists(waitingTime), - ) - private val searchSelectorButton = itemWithResId("$packageName:id/search_selector") private val searchShortcutList = From 068c2c8fbe0fb36962858531b16a1bd5655c84a3 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Tue, 18 Jul 2023 10:43:11 -0400 Subject: [PATCH 100/207] Bug 1842890 - Add splash screen animation --- .../res/drawable/animated_splash_screen.xml | 836 ++++++ .../res/drawable/animated_splash_screen.xml | 2515 +++++++++++++++++ .../main/res/drawable-v23/splash_screen.xml | 11 - .../main/res/drawable-v24/splash_screen.xml | 7 - .../res/drawable/animated_splash_screen.xml | 2515 +++++++++++++++++ app/src/main/res/values-night/styles.xml | 7 +- app/src/main/res/values/styles.xml | 8 +- .../res/drawable/animated_splash_screen.xml | 817 ++++++ .../res/drawable/animated_splash_screen.xml | 742 +++++ 9 files changed, 7435 insertions(+), 23 deletions(-) create mode 100644 app/src/beta/res/drawable/animated_splash_screen.xml create mode 100644 app/src/debug/res/drawable/animated_splash_screen.xml delete mode 100644 app/src/main/res/drawable-v23/splash_screen.xml delete mode 100644 app/src/main/res/drawable-v24/splash_screen.xml create mode 100644 app/src/main/res/drawable/animated_splash_screen.xml create mode 100644 app/src/nightly/res/drawable/animated_splash_screen.xml create mode 100644 app/src/release/res/drawable/animated_splash_screen.xml diff --git a/app/src/beta/res/drawable/animated_splash_screen.xml b/app/src/beta/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..9ca0de2a3 --- /dev/null +++ b/app/src/beta/res/drawable/animated_splash_screen.xml @@ -0,0 +1,836 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/debug/res/drawable/animated_splash_screen.xml b/app/src/debug/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..7dfabc0ee --- /dev/null +++ b/app/src/debug/res/drawable/animated_splash_screen.xml @@ -0,0 +1,2515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v23/splash_screen.xml b/app/src/main/res/drawable-v23/splash_screen.xml deleted file mode 100644 index 74d441577..000000000 --- a/app/src/main/res/drawable-v23/splash_screen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-v24/splash_screen.xml b/app/src/main/res/drawable-v24/splash_screen.xml deleted file mode 100644 index 56f7a470f..000000000 --- a/app/src/main/res/drawable-v24/splash_screen.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/animated_splash_screen.xml b/app/src/main/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..7dfabc0ee --- /dev/null +++ b/app/src/main/res/drawable/animated_splash_screen.xml @@ -0,0 +1,2515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index f615fe796..d4dc7b291 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -4,8 +4,11 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 028a415b8..30520ab7c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,9 +5,11 @@ diff --git a/app/src/nightly/res/drawable/animated_splash_screen.xml b/app/src/nightly/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..0701c810d --- /dev/null +++ b/app/src/nightly/res/drawable/animated_splash_screen.xml @@ -0,0 +1,817 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/release/res/drawable/animated_splash_screen.xml b/app/src/release/res/drawable/animated_splash_screen.xml new file mode 100644 index 000000000..8e8a4ae49 --- /dev/null +++ b/app/src/release/res/drawable/animated_splash_screen.xml @@ -0,0 +1,742 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 75b757fb0ecc8b7d7f6a7ae0bb0d4ca90063ec1e Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 19 Jul 2023 00:03:22 +0000 Subject: [PATCH 101/207] Import translations from android-l10n --- app/src/main/res/values-cy/strings.xml | 32 +++++++------ app/src/main/res/values-de/strings.xml | 32 +++++++------ app/src/main/res/values-es-rAR/strings.xml | 32 +++++++------ app/src/main/res/values-fa/strings.xml | 53 ++++++++++------------ app/src/main/res/values-ko/strings.xml | 32 +++++++------ app/src/main/res/values-sat/strings.xml | 49 ++++++++------------ app/src/main/res/values-su/strings.xml | 4 ++ 7 files changed, 114 insertions(+), 120 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 715c235da..208060cfb 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -299,51 +299,51 @@ Nid nawr - + - Gwnewch %s eich hoff borwr + Gwnewch %s eich hoff borwr Gwnewch Firefox yn borwr i chi - Mae %1$s yn rhoi pobl dros elw ac yn diogelu eich preifatrwydd drwy rwystro tracwyr traws-gwefan.\n\nDysgu rhagor yn ein %2$s. + Mae %1$s yn rhoi pobl dros elw ac yn diogelu eich preifatrwydd drwy rwystro tracwyr traws-gwefan.\n\nDysgu rhagor yn ein %2$s. Mae Firefox yn rhoi pobl o flaen elw ac yn diogelu eich preifatrwydd trwy rwystro tracwyr traws-gwefan.\n\nDysgwch ragor yn ein hysbysiad preifatrwydd. - hysbysiad preifatrwydd + hysbysiad preifatrwydd - Gosod fel y porwr ragosodedig + Gosod fel y porwr ragosodedig - Nid nawr + Nid nawr - Ewch o’r ffôn i’r gliniadur ac yn ôl + Ewch o’r ffôn i’r gliniadur ac yn ôl - Cipiwch dabiau a chyfrineiriau o’ch dyfeisiau eraill i barhau lle roeddech chi gynt. + Cipiwch dabiau a chyfrineiriau o’ch dyfeisiau eraill i barhau lle roeddech chi gynt. - Mewngofnodi + Mewngofnodi - Nid nawr + Nid nawr - Mae hysbysiadau yn eich helpu i wneud mwy gyda %s + Mae hysbysiadau yn eich helpu i wneud mwy gyda %s Mae hysbysiadau yn eich helpu i wneud rhagor gyda Firefox - Anfonwch dabiau rhwng dyfeisiau, rheoli llwytho a chael awgrymiadau ar sut i gael y gorau o %s. + Anfonwch dabiau rhwng dyfeisiau, rheoli llwytho a chael awgrymiadau ar sut i gael y gorau o %s. Yn anfon tabiau rhwng dyfeisiau, rheoli llwythi, a chael awgrymiadau am sut i gael y gorau o Firefox. - Troi hysbysiadau ymlaen + Troi hysbysiadau ymlaen - Nid nawr + Nid nawr @@ -1203,8 +1203,10 @@ Rhannu Cadw fel PDF - + Methu cynhyrchu PDF + + Cau Methu argraffu diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f5ce25d87..4cb73ee56 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -306,51 +306,51 @@ Nicht jetzt - + - Machen Sie %s zu Ihrem Browser Nr. 1. + Machen Sie %s zu Ihrem Browser Nr. 1. Machen Sie Firefox zu Ihrem Browser Nr. 1. - %1$s stellt Menschen über Gewinne und schützt Ihre Privatsphäre, indem er websiteübergreifende Tracker blockiert.\n\nErfahren Sie mehr in unserem %2$s. + %1$s stellt Menschen über Gewinne und schützt Ihre Privatsphäre, indem er websiteübergreifende Tracker blockiert.\n\nErfahren Sie mehr in unserem %2$s. Firefox stellt Menschen über Gewinne und schützt Ihre Privatsphäre, indem er websiteübergreifende Tracker blockiert.\n\nErfahren Sie mehr in unserem Datenschutzhinweis. - Datenschutzhinweis + Datenschutzhinweis - Als Standardbrowser festlegen + Als Standardbrowser festlegen - Nicht jetzt + Nicht jetzt - Wechseln Sie vom Handy zum Laptop und zurück + Wechseln Sie vom Handy zum Laptop und zurück - Holen Sie sich die Tabs und Passwörter von Ihren anderen Geräten, um dort weiterzumachen, wo Sie aufgehört haben. + Holen Sie sich die Tabs und Passwörter von Ihren anderen Geräten, um dort weiterzumachen, wo Sie aufgehört haben. - Anmelden + Anmelden - Nicht jetzt + Nicht jetzt - Benachrichtigungen helfen Ihnen, mehr aus %s zu machen + Benachrichtigungen helfen Ihnen, mehr aus %s zu machen Benachrichtigungen helfen Ihnen, mehr aus Firefox zu machen - Versenden Sie Tabs zwischen Geräten, verwalten Sie Downloads und erhalten Sie Tipps zur optimalen Nutzung von %s. + Versenden Sie Tabs zwischen Geräten, verwalten Sie Downloads und erhalten Sie Tipps zur optimalen Nutzung von %s. Versenden Sie Tabs zwischen Geräten, verwalten Sie Downloads und erhalten Sie Tipps zur optimalen Nutzung von Firefox. - Benachrichtigungen aktivieren + Benachrichtigungen aktivieren - Nicht jetzt + Nicht jetzt @@ -1230,8 +1230,10 @@ Teilen Als PDF speichern - + PDF kann nicht generiert werden + + Schließen Drucken nicht möglich diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 19bf762ef..554ba5965 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -307,51 +307,51 @@ No ahora - + - Hacer que %s sea tu navegador habitual + Hacer que %s sea tu navegador habitual Hacé de Firefox tu navegador favorito - %1$s pone a las personas por sobre las ganancias y defiende tu privacidad bloqueando rastreadores de sitios cruzados.\n\nConocé más en nuestra %2$s. + %1$s pone a las personas por sobre las ganancias y defiende tu privacidad bloqueando rastreadores de sitios cruzados.\n\nConocé más en nuestra %2$s. Firefox pone a las personas por encima de las ganancias y defiende tu privacidad bloqueando los rastreadores entre sitios.\n\nMás información en nuestra nota de privacidad. - nota de privacidad + nota de privacidad - Establecer como navegador predeterminado + Establecer como navegador predeterminado - No ahora + No ahora - Cambiá de teléfono a computadora y viceversa + Cambiá de teléfono a computadora y viceversa - Traé las pestañas y contraseñas de tus otros dispositivos para continuar donde lo habías dejado. + Traé las pestañas y contraseñas de tus otros dispositivos para continuar donde lo habías dejado. - Iniciar sesión + Iniciar sesión - No ahora + No ahora - Las notificaciones te ayudan a hacer más con %s + Las notificaciones te ayudan a hacer más con %s Las notificaciones te ayudan a hacer más con Firefox - Enviá pestañas entre dispositivos, admisistrá descargas y recibí consejos para obtener el máximo de %s. + Enviá pestañas entre dispositivos, admisistrá descargas y recibí consejos para obtener el máximo de %s. Enviá pestañas entre dispositivos, administrá descargas y recibí consejos para sacar el máximo provecho de Firefox. - Habilitar notificaciones + Habilitar notificaciones - No ahora + No ahora @@ -1223,8 +1223,10 @@ Compartir Guardar como PDF - + No se pudo generar el PDF + + Descartar No se puede imprimir diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 2b89720ab..7212d3288 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -297,52 +297,52 @@ هم‌اکنون نه - + - ‏%s را مروگر پیش‌فرض‌تان کنید + ‏%s را مروگر پیش‌فرض‌تان کنید ‏Firefox را مروگر پیش‌فرض‌تان کنید - ‏%1$s مردم را به سود خود ترجیح می‌دهد و با مسدود کردن ردیاب‌های میان‌پایگاهی، از حریم خصوصی شما دفاع می‌کند.\n\nدر %2$s بیش‌تر بیاموزید. + ‏%1$s مردم را به سود خود ترجیح می‌دهد و با مسدود کردن ردیاب‌های میان‌پایگاهی، از حریم خصوصی شما دفاع می‌کند.\n\nدر %2$s بیش‌تر بیاموزید. ‏‏Firefox مردم را به سود خود ترجیح می‌دهد و با مسدود کردن ردیاب‌های میان‌پایگاهی، از حریم خصوصی شما دفاع می‌کند.\n\nدر نکات حفظ حریم خصوصی ما بیش‌تر بیاموزید. - نکات حریم خصوصی + نکات حریم خصوصی - تنظیم به عنوان مرورگر پیش‌فرض + تنظیم به عنوان مرورگر پیش‌فرض - اکنون نه + اکنون نه - از تلفن همراه به رایانهٔ تاشو بپرید و برعکس + از تلفن همراه به رایانهٔ تاشو بپرید و برعکس - زبانه‌ها و گذرواژه‌ها را از افزاره‌های دیگرتان بگیرید تا از جایی که رها کرده‌اید، ادامه دهید. + زبانه‌ها و گذرواژه‌ها را از افزاره‌های دیگرتان بگیرید تا از جایی که رها کرده‌اید، ادامه دهید. - ورود + ورود - اکنون نه + اکنون نه - آگاهی‌ها کمک می‌کنند تا با %s کار‌های بیش‌تری بکنید + آگاهی‌ها کمک می‌کنند تا با %s کار‌های بیش‌تری بکنید آگاهی‌ها کمک می‌کنند تا با Firefox کار‌های بیش‌تری بکنید - ارسال زبانه‌ها میان افزاره‌ها، مدیریت بارگیری‌ها، و دریافت نکاتی راجع به بهره‌گیری هر چه بیش‌تر از %s. + ارسال زبانه‌ها میان افزاره‌ها، مدیریت بارگیری‌ها، و دریافت نکاتی راجع به بهره‌گیری هر چه بیش‌تر از %s. ارسال زبانه‌ها میان افزاره‌ها، مدیریت بارگیری‌ها، و دریافت نکاتی راجع به بهره‌گیری هر چه بیش‌تر از Firefox. - روشن کردن آگاهی‌ها + روشن کردن آگاهی‌ها - اکنون نه + اکنون نه @@ -423,18 +423,12 @@ ارسال درخواست - کاهش برنمای کلوچک - درخواست پشتیبانی برای این پایگاه؟ - درخواست برای پشتیبانی پایگاه ثبت شد. - درخواست ارسال شد روشن برای این پایگاه - درخواست برای پشتیبانی پایگاه ثبت شد - درخواست پشتیبانی ارسال شد پایگاه هم‌اکنون پشتیبانی نمی‌شود @@ -442,8 +436,6 @@ روشن کردن کاهش برنمای کلوچک برای %1$s؟ خاموش کردن کاهش برنمای کلوچک برای %1$s؟ - - این پایگاه هم‌اکنون از کاهش برنمای کلوچک پشتیبانی نمی‌کند. آیا می‌خواهید گروه ما این وبگاه را بازبینی کند و پشتیبانی از آن را در آینده اضافه کند؟ ‏%1$s نمی‌تواند درخواست‌های کلوچک این پایگاه را خودکار رد کند. می‌توانید درخواستی برای پشتیانی از این پایگاه در آینده ارسال کنید. @@ -547,6 +539,11 @@ هرگز مدیریت بارگیری خارجی + + به کار انداختن گزارش‌ها گکو + + خروج از برنامه برای اعمال تغییرات… + افزونه‌ها @@ -1203,6 +1200,10 @@ ذخیره به صورت PDF ناتوانی در تولید PDF + + ناتوانی در چاپ + + چاپ ارسال به دستگاه @@ -1493,12 +1494,8 @@ تنظیمات حفاظتی محافظت پیشرفته در برابر ردیابی - - بدون دنبال شدن مرور کنید هم‌اکنون دارای محافظت کامل در برابر کلوچک است؛ قدرتمندترین سد ما بر ضدّ ردیاب‌های میان‌پایگاهی. - - داده‌های خود را نزد خود نگه دارید.%s شما را از بسیاری از متداول‌ترین ردیاب‌هایی که شما را به صورت برخط دنبال می‌کنند محافظت می‌کند. ‏%s شما را از بسیاری از ردیاب‌های رایج که فعالیت‌های برخط‌تان را پی می‌گیرند، محافظت می‌کند. @@ -1506,16 +1503,12 @@ استاندارد (پیش‌فرض) - تعادل بین کارآیی و حریم‌خصوصی. بارگیری صفحات با سرعتی عادی. - صفحات به طور معمولی بار می‌شوند؛ اما تعداد کمی ردیاب را مسدود می‌کند. آنچه توسط حفاظت ردیابی استاندارد مسدود شده است سخت‌گیرانه - مسدودسازی ردیاب‌های بیشتر، اما برخی امکانات داخل صفحات ممکن است از کار بیافتند. - محافظت از ردیابی قوی‌تر و کارایی سریع‌تر ، اما برخی از پایگاه‌ها ممکن است به درستی کار نکنند. آنچه توسط حفاظت ردیابی سخت‌گیرانه مسدود شده است diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 877f5f471..02a7a39e8 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -308,51 +308,51 @@ 나중에 - + - %s를 기본 브라우저로 설정해 보세요 + %s를 기본 브라우저로 설정해 보세요 Firefox를 기본 브라우저로 설정해 보세요 - %1$s는 이익보다 사람을 우선시하고 교차 사이트 추적기를 차단하여 개인 정보를 보호합니다.\n\n%2$s에서 더 알아보세요. + %1$s는 이익보다 사람을 우선시하고 교차 사이트 추적기를 차단하여 개인 정보를 보호합니다.\n\n%2$s에서 더 알아보세요. Firefox는 이익보다 사람을 우선시하고 교차 사이트 추적기를 차단하여 개인 정보를 보호합니다.\n\n개인정보처리방침에서 더 알아보세요. - 개인정보처리방침 + 개인정보처리방침 - 기본 브라우저로 설정 + 기본 브라우저로 설정 - 나중에 + 나중에 - 휴대전화에서 노트북으로 왔다가 다시 돌아가기 + 휴대전화에서 노트북으로 왔다가 다시 돌아가기 - 다른 기기에서 탭과 비밀번호를 가져와 중단한 부분부터 다시 시작하세요. + 다른 기기에서 탭과 비밀번호를 가져와 중단한 부분부터 다시 시작하세요. - 로그인 + 로그인 - 나중에 + 나중에 - 알림은 %s로 더 많은 작업을 수행하는 데 도움이 됩니다 + 알림은 %s로 더 많은 작업을 수행하는 데 도움이 됩니다 알림은 Firefox로 더 많은 작업을 수행하는 데 도움이 됩니다 - 기기 간에 탭을 보내고, 다운로드를 관리하고, %s를 최대한 활용하기 위한 팁을 얻으세요. + 기기 간에 탭을 보내고, 다운로드를 관리하고, %s를 최대한 활용하기 위한 팁을 얻으세요. 기기 간에 탭을 보내고, 다운로드를 관리하고, Firefox를 최대한 활용하기 위한 팁을 얻으세요. - 알림 켜기 + 알림 켜기 - 나중에 + 나중에 @@ -1236,8 +1236,10 @@ 공유 PDF로 저장 - + PDF를 생성할 수 없음 + + 닫기 인쇄할 수 없음 diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 1cfd6834b..7d8431393 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -300,51 +300,51 @@ ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ - + - %s ᱟᱢᱟᱜ ᱠᱩᱥᱤ ᱵᱽᱨᱟᱣᱡᱚᱨ ᱛᱮᱭᱟᱨ ᱢᱮ + %s ᱟᱢᱟᱜ ᱠᱩᱥᱤ ᱵᱽᱨᱟᱣᱡᱚᱨ ᱛᱮᱭᱟᱨ ᱢᱮ Firefox ᱫᱚ ᱟᱢᱟᱜ ᱱᱤᱡᱚᱨᱟᱜ ᱵᱽᱨᱟᱣᱡᱚᱨ ᱦᱟᱛᱟᱣ ᱢᱮ - %1$s ᱫᱚ ᱦᱚᱲ ᱠᱚ ᱵᱮᱯᱟᱨ ᱠᱷᱚᱱ ᱢᱩᱬᱩᱛ ᱨᱮ ᱫᱚᱦᱚᱭᱟ ᱟᱨ ᱠᱨᱚᱥ-ᱥᱟᱭᱤᱴ ᱴᱨᱮᱠᱚᱨ ᱵᱞᱚᱠ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱯᱨᱟᱵᱷᱮᱴᱤ ᱫᱚᱦᱚᱭᱟ ᱾\n\n ᱟᱞᱮᱭᱟᱜ %2$s ᱨᱮ ᱰᱷᱮᱨ ᱵᱟᱲᱟᱭ ᱢᱮ ᱾ + %1$s ᱫᱚ ᱦᱚᱲ ᱠᱚ ᱵᱮᱯᱟᱨ ᱠᱷᱚᱱ ᱢᱩᱬᱩᱛ ᱨᱮ ᱫᱚᱦᱚᱭᱟ ᱟᱨ ᱠᱨᱚᱥ-ᱥᱟᱭᱤᱴ ᱴᱨᱮᱠᱚᱨ ᱵᱞᱚᱠ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱯᱨᱟᱵᱷᱮᱴᱤ ᱫᱚᱦᱚᱭᱟ ᱾\n\n ᱟᱞᱮᱭᱟᱜ %2$s ᱨᱮ ᱰᱷᱮᱨ ᱵᱟᱲᱟᱭ ᱢᱮ ᱾ Firefox ᱫᱚ ᱦᱚᱲ ᱠᱚ ᱵᱮᱯᱟᱨ ᱠᱷᱚᱱ ᱢᱩᱬᱩᱛ ᱨᱮ ᱫᱚᱦᱚᱭᱟ ᱟᱨ ᱠᱨᱚᱥ-ᱥᱟᱭᱤᱴ ᱴᱨᱮᱠᱚᱨ ᱵᱞᱚᱠ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱯᱨᱟᱵᱷᱮᱴᱤ ᱫᱚᱦᱚᱭᱟ ᱾\n\n ᱟᱞᱮᱭᱟᱜ ᱫᱟᱱᱟᱝ ᱠᱷᱚᱵᱚᱨ ᱨᱮ ᱰᱷᱮᱨ ᱵᱟᱲᱟᱭ ᱢᱮ ᱾ - ᱱᱤᱥᱚᱱ ᱨᱮᱭᱟᱜ ᱱᱚᱴᱤᱥ + ᱱᱤᱥᱚᱱ ᱨᱮᱭᱟᱜ ᱱᱚᱴᱤᱥ - ᱢᱩᱞ ᱵᱽᱨᱟᱣᱩᱡᱟᱹᱨ ᱞᱮᱠᱷᱟ ᱥᱟᱡᱟᱣ ᱢᱮ + ᱢᱩᱞ ᱵᱽᱨᱟᱣᱩᱡᱟᱹᱨ ᱞᱮᱠᱷᱟ ᱥᱟᱡᱟᱣ ᱢᱮ - ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ + ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ - ᱯᱷᱚᱱ ᱠᱷᱚᱱ ᱞᱮᱯᱴᱚᱯ ᱛᱮ ᱩᱪᱟᱹᱲ ᱢᱮ ᱵᱟᱨ ᱯᱟᱦᱴᱮ ᱞᱮᱠᱟᱛᱮ + ᱯᱷᱚᱱ ᱠᱷᱚᱱ ᱞᱮᱯᱴᱚᱯ ᱛᱮ ᱩᱪᱟᱹᱲ ᱢᱮ ᱵᱟᱨ ᱯᱟᱦᱴᱮ ᱞᱮᱠᱟᱛᱮ - ᱴᱮᱵᱽ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱫᱚ ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱡᱟᱦᱟᱸ ᱨᱮ ᱟᱲᱟᱜ ᱞᱮᱫᱟᱢ ᱚᱱᱰᱮ ᱠᱷᱚᱱ ᱯᱟᱧᱡᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ + ᱴᱮᱵᱽ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱫᱚ ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱡᱟᱦᱟᱸ ᱨᱮ ᱟᱲᱟᱜ ᱞᱮᱫᱟᱢ ᱚᱱᱰᱮ ᱠᱷᱚᱱ ᱯᱟᱧᱡᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ - ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ + ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ - ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ + ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ - %s ᱮᱛᱞᱟᱤᱭᱟᱹ ᱥᱟᱞᱟᱜ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱹᱢᱤ ᱠᱚᱨᱟᱣ ᱨᱮ ᱜᱚᱲᱚ ᱮᱢᱚᱜᱼᱟᱭ + %s ᱮᱛᱞᱟᱤᱭᱟᱹ ᱥᱟᱞᱟᱜ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱹᱢᱤ ᱠᱚᱨᱟᱣ ᱨᱮ ᱜᱚᱲᱚ ᱮᱢᱚᱜᱼᱟᱭ Firefox ᱮᱛᱞᱟᱤᱭᱟᱹ ᱥᱟᱞᱟᱜ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱹᱢᱤ ᱠᱚᱨᱟᱣ ᱨᱮ ᱜᱚᱲᱚ ᱮᱢᱚᱜᱼᱟᱭ - ᱥᱟᱫᱷᱚᱱ ᱠᱚ ᱛᱟᱞᱟᱨᱮ ᱴᱟᱵᱽ ᱠᱚ ᱩᱪᱟᱹᱲ ᱢᱮ, ᱰᱟᱣᱩᱱᱞᱚᱰ ᱠᱚ ᱢᱮᱱᱮᱡᱽ ᱢᱮ, ᱟᱨ %s ᱠᱷᱚᱱ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱡᱟᱹᱥᱛᱤ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱴᱤᱯᱥ ᱧᱟᱢ ᱢᱮ ᱾ + ᱥᱟᱫᱷᱚᱱ ᱠᱚ ᱛᱟᱞᱟᱨᱮ ᱴᱟᱵᱽ ᱠᱚ ᱩᱪᱟᱹᱲ ᱢᱮ, ᱰᱟᱣᱩᱱᱞᱚᱰ ᱠᱚ ᱢᱮᱱᱮᱡᱽ ᱢᱮ, ᱟᱨ %s ᱠᱷᱚᱱ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱡᱟᱹᱥᱛᱤ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱴᱤᱯᱥ ᱧᱟᱢ ᱢᱮ ᱾ ᱥᱟᱫᱷᱚᱱ ᱠᱚ ᱛᱟᱞᱟᱨᱮ ᱴᱟᱵᱽ ᱠᱚ ᱩᱪᱟᱹᱲ ᱢᱮ, ᱰᱟᱣᱩᱱᱞᱚᱰ ᱠᱚ ᱢᱮᱱᱮᱡᱽ ᱢᱮ, ᱟᱨ Firefox ᱠᱷᱚᱱ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱡᱟᱹᱥᱛᱤ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱴᱤᱯᱥ ᱧᱟᱢ ᱢᱮ ᱾ - ᱠᱷᱚᱵᱚᱨ ᱠᱚ ᱦᱮᱡ ᱪᱷᱚᱭ ᱢᱮ + ᱠᱷᱚᱵᱚᱨ ᱠᱚ ᱦᱮᱡ ᱪᱷᱚᱭ ᱢᱮ - ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ + ᱱᱤᱛᱚᱜ ᱫᱚ ᱵᱟᱝᱟ @@ -423,18 +423,12 @@ ᱱᱮᱦᱚᱨ ᱵᱷᱮᱡᱟᱭ ᱢᱮ - ᱠᱩᱠᱤ ᱵᱮᱱᱚᱨ ᱠᱷᱟᱴᱚ - ᱱᱚᱶᱟ ᱥᱟᱭᱤ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚ ᱱᱮᱦᱚᱨᱟᱢ ᱥᱮ ? - ᱥᱟᱭᱤᱴ ᱥᱚᱦᱚᱫ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚ ᱡᱚᱢᱟ ᱟᱠᱟᱱᱟ ᱾ - ᱱᱮᱦᱚᱨ ᱵᱷᱮᱡᱟ ᱮᱱᱟ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱪᱷᱚ ᱜᱮᱭᱟ - ᱥᱟᱭᱤᱴ ᱥᱚᱦᱚᱫ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚ ᱡᱚᱢᱟ ᱟᱠᱟᱱᱟ - ᱜᱚᱲᱚ ᱱᱮᱦᱚᱨ ᱵᱷᱮᱡᱟ ᱮᱱᱟ ᱥᱟᱭᱟᱴ ᱱᱤᱛᱚᱜ ᱥᱟᱵ ᱨᱮ ᱵᱟᱹᱱᱩᱜᱼᱟ @@ -444,8 +438,6 @@ %1$s ᱞᱟᱹᱜᱤᱫ ᱠᱩᱠᱤ ᱵᱮᱱᱚᱨ ᱨᱮᱰᱟᱹᱠᱥᱚᱱ ᱵᱚᱱᱫᱚᱭᱟᱢ ᱥᱮ? - - ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱫᱚ ᱱᱤᱛᱚᱜ ᱠᱩᱠᱤ ᱵᱮᱱᱚᱨ ᱨᱤᱰᱩᱠᱥᱚᱱ ᱵᱟᱭ ᱥᱚᱦᱚᱫᱟᱭ ᱾ ᱟᱢ ᱱᱚᱶᱟ ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱫᱚ ᱵᱷᱚᱵᱤᱥᱚᱛ ᱨᱮ ᱜᱚᱲᱚ ᱮᱢ ᱪᱷᱚ ᱞᱟᱹᱜᱤᱫ ᱟᱞᱮ ᱫᱳᱞᱟᱜ ᱜᱚᱲᱚ ᱤᱫᱤ ᱥᱮᱱᱮ ᱮᱫ ᱢᱮᱭᱟ ᱥᱮ ? ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱨᱮ %1$s ᱫᱚ ᱟᱡ ᱛᱮ ᱠᱩᱠᱤ ᱱᱚᱦᱚᱨ ᱵᱟᱝ ᱢᱟᱱᱟ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟᱭ ᱾ ᱵᱷᱚᱵᱤᱥᱚᱛ ᱨᱮ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱜᱚᱲᱚ ᱮᱢ ᱞᱟᱹᱜᱤᱫ ᱱᱮᱦᱚᱨ ᱵᱷᱮᱡᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ @@ -551,6 +543,11 @@ ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝ ᱵᱟᱦᱨᱮ ᱨᱮᱭᱟᱜ ᱰᱟᱣᱱᱞᱳᱰ ᱢᱮᱱᱮᱡᱟᱹᱨ + + Gecko ᱞᱚᱜᱽ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ + + ᱵᱚᱫᱚᱞ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱸᱫᱚᱜ ᱠᱟᱱᱟ… + ᱮᱰ-ᱟᱸᱱᱥ @@ -1510,12 +1507,8 @@ ᱨᱚᱯᱷᱟ ᱥᱟᱡᱟᱣ ᱠᱚ ᱵᱟᱲᱦᱟᱣᱟᱠᱟᱱ ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ - - ᱯᱟᱸᱡᱟ ᱵᱮᱜᱚᱨ ᱵᱽᱨᱟᱣᱩᱡ ᱢᱮ ᱱᱤᱛᱚᱜ ᱢᱩᱴ ᱜᱚᱴᱟ ᱥᱟᱦᱴᱟ ᱠᱩᱠᱤ ᱦᱮᱡ ᱥᱮᱴᱮᱨ ᱮᱱᱟ, ᱱᱚᱣᱟ ᱫᱚ ᱠᱨᱚᱥ-ᱥᱟᱭᱤᱴ ᱴᱨᱮᱠᱚᱨ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱢᱟᱨᱟᱝ ᱟᱠᱚᱴ ᱥᱟᱫᱷᱚᱱ ᱠᱟᱱᱟ ᱾ - - ᱟᱢᱟᱜᱽ ᱰᱟᱴᱟ ᱟᱢ ᱴᱷᱮᱱ ᱜᱮ ᱫᱚᱦᱚᱭ ᱢᱮ ᱾ %s ᱫᱚ ᱟᱭᱢᱟ ᱥᱚᱢᱟᱱ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱴᱷᱮᱱ ᱠᱷᱚᱱ ᱚᱱᱞᱟᱭᱤᱱ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮᱟᱭ ᱾ ​%s​ ᱫᱚ ᱟᱭᱢᱟ ᱥᱚᱢᱟᱱ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱴᱷᱮᱱ ᱠᱷᱚᱱ ᱚᱱᱞᱟᱭᱤᱱ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮᱟᱭ ᱾ @@ -1523,16 +1516,12 @@ ᱱᱟᱯ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) - ᱯᱨᱟᱭᱣᱮᱥᱭ ᱟᱨ ᱯᱚᱨᱯᱷᱚᱨᱢᱮᱱᱥ ᱞᱟᱹᱜᱤᱫ ᱥᱚᱢᱟᱱ ᱾ ᱥᱟᱦᱴᱟ ᱢᱩᱞ ᱞᱮᱠᱷᱟᱛᱮ ᱞᱟᱫᱮᱜᱼᱟ ᱾ - ᱥᱟᱦᱴᱚ ᱫᱚ ᱴᱷᱤᱠ ᱛᱮ ᱞᱟᱫᱮᱜᱼᱟ, ᱢᱮᱱᱠᱷᱟᱱ ᱴᱨᱚᱠᱚᱨ ᱠᱚᱢ ᱵᱞᱚᱠᱚᱜᱼᱟ ᱾ ᱢᱩᱞ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱨᱚᱠᱷᱭᱟ ᱫᱚ ᱪᱮᱫ ᱮ ᱵᱞᱚᱠ ᱪᱷᱚ ᱠᱮᱜᱼᱟᱭ ᱱᱤᱦᱟᱹᱛ - ᱥᱟᱦᱴᱟ ᱞᱚᱜᱚᱱ ᱞᱳᱰ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱵᱞᱚᱠ ᱠᱚᱟᱭ, ᱦᱮᱞᱮ ᱥᱟᱦᱴᱟ ᱞᱳᱰ ᱨᱮ ᱰᱤᱜᱟᱹᱣ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ - ᱠᱚᱴᱮᱡ ᱯᱟᱧᱡᱟ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱟᱨ ᱞᱚᱜᱚᱱ ᱜᱮ ᱠᱟᱹᱢᱤᱭᱟᱭ, ᱢᱮᱱᱠᱷᱟᱱ ᱡᱷᱚᱛᱚ ᱥᱟᱭᱤᱴ ᱠᱚᱨᱮ ᱫᱚ ᱵᱟᱭ ᱠᱟᱹᱢᱤᱭᱟ ᱾ ᱴᱷᱤᱴ ᱜᱷᱮᱨ ᱮᱥᱮᱫ ᱨᱩᱠᱷᱭᱟ ᱫᱚ ᱪᱮᱫ ᱵᱞᱚᱠ ᱠᱮᱜᱼᱟᱭ diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 6cb357308..f78e05dd8 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -396,6 +396,10 @@ Rekés dukungan dikirim + + Hurungkeun Reduksi spanduk réréméh pikeun %1$s? + + Pareuman Reduksi spanduk réréméh pikeun %1$s? Moal Waka From 0006ea16e727aa5435f96a99990c03f2692b7612 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jun 2023 12:20:39 +0000 Subject: [PATCH 102/207] Bump requests Bumps [requests](https://github.com/psf/requests) from 2.28.1 to 2.31.0. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.28.1...v2.31.0) --- updated-dependencies: - dependency-name: requests dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../fenix/syncintegration/Pipfile.lock | 303 +++++++++++------- 1 file changed, 185 insertions(+), 118 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock index e1e11b39f..8acc6e7b2 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock @@ -26,11 +26,11 @@ }, "attrs": { "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", + "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" + "markers": "python_version >= '3.7'", + "version": "==23.1.0" }, "blessed": { "hashes": [ @@ -42,11 +42,11 @@ }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", + "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2023.5.7" }, "cffi": { "hashes": [ @@ -119,40 +119,109 @@ }, "charset-normalizer": { "hashes": [ - "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", - "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" + "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", + "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", + "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", + "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", + "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", + "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", + "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", + "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", + "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", + "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", + "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", + "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", + "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", + "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", + "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", + "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", + "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", + "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", + "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", + "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", + "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", + "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", + "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", + "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", + "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", + "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", + "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", + "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", + "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", + "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", + "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", + "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", + "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", + "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", + "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", + "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", + "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", + "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", + "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", + "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", + "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", + "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", + "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", + "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", + "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", + "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", + "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", + "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", + "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", + "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", + "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", + "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", + "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", + "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", + "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", + "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", + "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", + "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", + "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", + "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", + "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", + "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", + "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", + "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", + "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", + "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", + "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", + "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", + "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", + "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", + "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", + "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", + "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", + "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" ], - "markers": "python_version >= '3.6'", - "version": "==2.1.1" + "markers": "python_version >= '3.7'", + "version": "==3.1.0" }, "cryptography": { "hashes": [ - "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4", - "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f", - "sha256:4789d1e3e257965e960232345002262ede4d094d1a19f4d3b52e48d4d8f3b885", - "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502", - "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41", - "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965", - "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e", - "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc", - "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad", - "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505", - "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388", - "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6", - "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2", - "sha256:c5caeb8188c24888c90b5108a441c106f7faa4c4c075a2bcae438c6e8ca73cef", - "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac", - "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695", - "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6", - "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336", - "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0", - "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c", - "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106", - "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a", - "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8" + "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db", + "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a", + "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039", + "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c", + "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3", + "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485", + "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c", + "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca", + "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5", + "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5", + "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3", + "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb", + "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43", + "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31", + "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc", + "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b", + "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006", + "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a", + "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699" ], - "index": "pypi", - "version": "==39.0.1" + "markers": "python_version >= '3.7'", + "version": "==41.0.1" }, "distro": { "hashes": [ @@ -164,11 +233,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e", - "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23" + "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", + "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" ], "markers": "python_version < '3.11'", - "version": "==1.1.0" + "version": "==1.1.1" }, "fxapom": { "hashes": [ @@ -247,10 +316,9 @@ }, "mozlog": { "hashes": [ - "sha256:080c0a7fdf01cc9a3c9dc8dc527ec8adfb447ca0cd05c5f5fe5c944ceeaec3ff", - "sha256:dc389dc861be3fe9ad1db561893a34015935bd203548685000c84ee5177ce05a" + "sha256:26e5e9586afe2d6359a3d75aa6ea25aa2904d0062d0a158418682e44458d98e9" ], - "version": "==7.1.1" + "version": "==8.0.0" }, "mozprocess": { "hashes": [ @@ -300,19 +368,19 @@ }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.1" }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", + "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.7'", + "version": "==1.2.0" }, "progressbar2": { "hashes": [ @@ -352,11 +420,11 @@ }, "pyjwt": { "hashes": [ - "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd", - "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14" + "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", + "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074" ], "markers": "python_version >= '3.7'", - "version": "==2.6.0" + "version": "==2.7.0" }, "pypom": { "hashes": [ @@ -407,11 +475,11 @@ }, "python-utils": { "hashes": [ - "sha256:68198854fc276bc4b2403b261703c218e01ef564dcb072a7096ed9ea7aa5130c", - "sha256:8bfefc3430f1c48408fa0e5958eee51d39840a5a987c2181a579e99ab6fe5ca6" + "sha256:1970468fff1c0adbd60b9a751e6a786223a9f0373c954571912d9cf4be49b552", + "sha256:e31c1187168c314c984932e99c2d3f973465443493869ae041dd9e2e18e998aa" ], - "markers": "python_version >= '3.7'", - "version": "==3.5.2" + "markers": "python_version >= '3.9'", + "version": "==3.7.0" }, "redo": { "hashes": [ @@ -422,27 +490,27 @@ }, "requests": { "hashes": [ - "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", - "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], "index": "pypi", - "version": "==2.28.1" + "version": "==2.31.0" }, "selenium": { "hashes": [ - "sha256:bd04eb41395605d9b2b65fe587f3fed21431da75512985c52772529e5e210c60", - "sha256:c48372905bffcc3b24bd55ab4683a07ee5e1f30fe918c59558ea5ee44cedf6c3" + "sha256:40241b9d872f58959e9b34e258488bf11844cd86142fd68182bd41db9991fc5c", + "sha256:871bf800c4934f745b909c8dfc7d15c65cf45bd2e943abd54451c810ada395e3" ], "markers": "python_version >= '3.7'", - "version": "==4.8.2" + "version": "==4.10.0" }, "setuptools": { "hashes": [ - "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330", - "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251" + "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f", + "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235" ], "markers": "python_version >= '3.7'", - "version": "==67.4.0" + "version": "==68.0.0" }, "six": { "hashes": [ @@ -492,22 +560,27 @@ }, "trio-websocket": { "hashes": [ - "sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc", - "sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe" + "sha256:1a748604ad906a7dcab9a43c6eb5681e37de4793ba0847ef0bc9486933ed027b", + "sha256:a9937d48e8132ebf833019efde2a52ca82d223a30a7ea3e8d60a7d28f75a4e3a" ], - "markers": "python_version >= '3.5'", - "version": "==0.9.2" + "markers": "python_version >= '3.7'", + "version": "==0.10.3" }, - "urllib3": { - "extras": [ - + "typing-extensions": { + "hashes": [ + "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", + "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" ], + "markers": "python_version >= '3.7'", + "version": "==4.6.3" + }, + "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", + "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "markers": "python_version >= '3.7'", + "version": "==2.0.3" }, "wcwidth": { "hashes": [ @@ -534,11 +607,11 @@ }, "zope.component": { "hashes": [ - "sha256:a508f9fef1b6f5286462d3340cd89ffab5c7899dca0401337239cb6ba7c6bb0a", - "sha256:cbd279e15a959f35a813b64ec4f1027c08b86fcca26f73250c0c912251df90dd" + "sha256:96d0a04db39643caf2dfaec152340f3e914df1dc3fa32fbb913782620dc6c3c6", + "sha256:9a0a0472ad201b94b4fe6741ce9ac2c30b8bb22c516077bf03692dec4dfb6906" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==5.1.0" + "markers": "python_version >= '3.7'", + "version": "==6.0" }, "zope.event": { "hashes": [ @@ -591,45 +664,39 @@ }, "zope.interface": { "hashes": [ - "sha256:008b0b65c05993bb08912f644d140530e775cf1c62a072bf9340c2249e613c32", - "sha256:0217a9615531c83aeedb12e126611b1b1a3175013bbafe57c702ce40000eb9a0", - "sha256:0fb497c6b088818e3395e302e426850f8236d8d9f4ef5b2836feae812a8f699c", - "sha256:17ebf6e0b1d07ed009738016abf0d0a0f80388e009d0ac6e0ead26fc162b3b9c", - "sha256:311196634bb9333aa06f00fc94f59d3a9fddd2305c2c425d86e406ddc6f2260d", - "sha256:3218ab1a7748327e08ef83cca63eea7cf20ea7e2ebcb2522072896e5e2fceedf", - "sha256:404d1e284eda9e233c90128697c71acffd55e183d70628aa0bbb0e7a3084ed8b", - "sha256:4087e253bd3bbbc3e615ecd0b6dd03c4e6a1e46d152d3be6d2ad08fbad742dcc", - "sha256:40f4065745e2c2fa0dff0e7ccd7c166a8ac9748974f960cd39f63d2c19f9231f", - "sha256:5334e2ef60d3d9439c08baedaf8b84dc9bb9522d0dacbc10572ef5609ef8db6d", - "sha256:604cdba8f1983d0ab78edc29aa71c8df0ada06fb147cea436dc37093a0100a4e", - "sha256:6373d7eb813a143cb7795d3e42bd8ed857c82a90571567e681e1b3841a390d16", - "sha256:655796a906fa3ca67273011c9805c1e1baa047781fca80feeb710328cdbed87f", - "sha256:65c3c06afee96c654e590e046c4a24559e65b0a87dbff256cd4bd6f77e1a33f9", - "sha256:696f3d5493eae7359887da55c2afa05acc3db5fc625c49529e84bd9992313296", - "sha256:6e972493cdfe4ad0411fd9abfab7d4d800a7317a93928217f1a5de2bb0f0d87a", - "sha256:7579960be23d1fddecb53898035a0d112ac858c3554018ce615cefc03024e46d", - "sha256:765d703096ca47aa5d93044bf701b00bbce4d903a95b41fff7c3796e747b1f1d", - "sha256:7e66f60b0067a10dd289b29dceabd3d0e6d68be1504fc9d0bc209cf07f56d189", - "sha256:8a2ffadefd0e7206adc86e492ccc60395f7edb5680adedf17a7ee4205c530df4", - "sha256:959697ef2757406bff71467a09d940ca364e724c534efbf3786e86eee8591452", - "sha256:9d783213fab61832dbb10d385a319cb0e45451088abd45f95b5bb88ed0acca1a", - "sha256:a16025df73d24795a0bde05504911d306307c24a64187752685ff6ea23897cb0", - "sha256:a2ad597c8c9e038a5912ac3cf166f82926feff2f6e0dabdab956768de0a258f5", - "sha256:bfee1f3ff62143819499e348f5b8a7f3aa0259f9aca5e0ddae7391d059dce671", - "sha256:d169ccd0756c15bbb2f1acc012f5aab279dffc334d733ca0d9362c5beaebe88e", - "sha256:d514c269d1f9f5cd05ddfed15298d6c418129f3f064765295659798349c43e6f", - "sha256:d692374b578360d36568dd05efb8a5a67ab6d1878c29c582e37ddba80e66c396", - "sha256:dbaeb9cf0ea0b3bc4b36fae54a016933d64c6d52a94810a63c00f440ecb37dd7", - "sha256:dc26c8d44472e035d59d6f1177eb712888447f5799743da9c398b0339ed90b1b", - "sha256:e1574980b48c8c74f83578d1e77e701f8439a5d93f36a5a0af31337467c08fcf", - "sha256:e74a578172525c20d7223eac5f8ad187f10940dac06e40113d62f14f3adb1e8f", - "sha256:e945de62917acbf853ab968d8916290548df18dd62c739d862f359ecd25842a6", - "sha256:f0980d44b8aded808bec5059018d64692f0127f10510eca71f2f0ace8fb11188", - "sha256:f98d4bd7bbb15ca701d19b93263cc5edfd480c3475d163f137385f49e5b3a3a7", - "sha256:fb68d212efd057596dee9e6582daded9f8ef776538afdf5feceb3059df2d2e7b" + "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373", + "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb", + "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446", + "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8", + "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c", + "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8", + "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2", + "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f", + "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f", + "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5", + "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85", + "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc", + "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788", + "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518", + "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410", + "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464", + "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5", + "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d", + "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52", + "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca", + "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8", + "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2", + "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f", + "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58", + "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a", + "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d", + "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28", + "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990", + "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995", + "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==5.5.2" + "markers": "python_version >= '3.7'", + "version": "==6.0" } }, "develop": {} From 1a27d9bf6c733d1b309cb47c816be388055a1439 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:22:33 +0000 Subject: [PATCH 103/207] Bump cryptography Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.1 to 41.0.2. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/41.0.1...41.0.2) --- updated-dependencies: - dependency-name: cryptography dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../fenix/syncintegration/Pipfile.lock | 249 +++++++++--------- 1 file changed, 123 insertions(+), 126 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock index 8acc6e7b2..56a2d0ecb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/Pipfile.lock @@ -16,14 +16,6 @@ ] }, "default": { - "async-generator": { - "hashes": [ - "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", - "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144" - ], - "markers": "python_version >= '3.5'", - "version": "==1.10" - }, "attrs": { "hashes": [ "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", @@ -119,109 +111,113 @@ }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" ], "markers": "python_version >= '3.7'", - "version": "==3.1.0" + "version": "==3.2.0" }, "cryptography": { "hashes": [ - "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db", - "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a", - "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039", - "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c", - "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3", - "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485", - "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c", - "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca", - "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5", - "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5", - "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3", - "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb", - "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43", - "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31", - "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc", - "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b", - "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006", - "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a", - "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699" + "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", + "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", + "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", + "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", + "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", + "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", + "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", + "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", + "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", + "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", + "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", + "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", + "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", + "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", + "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", + "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", + "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", + "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", + "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", + "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", + "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", + "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" ], - "markers": "python_version >= '3.7'", - "version": "==41.0.1" + "index": "pypi", + "version": "==41.0.2" }, "distro": { "hashes": [ @@ -233,11 +229,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5", + "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f" ], "markers": "python_version < '3.11'", - "version": "==1.1.1" + "version": "==1.1.2" }, "fxapom": { "hashes": [ @@ -280,10 +276,10 @@ }, "mozdevice": { "hashes": [ - "sha256:8005df3c77bcb50e7b110ce75310ba11aaab44d550dbbe36d30e82f920ea551a", - "sha256:9a55047998fdffc00c0de2587fd818a5083520b60ce662036a2134515d485f84" + "sha256:0f33260e74d734d5f3ac277b28064bac0f5bd1ecce111fe1a73ca61eb3e4b524", + "sha256:ff0e0d4c618a595c26d9d1a9a071db1f5c5383b4c5cb9e7889019bd13885825b" ], - "version": "==4.1.0" + "version": "==4.1.1" }, "mozdownload": { "hashes": [ @@ -322,10 +318,10 @@ }, "mozprocess": { "hashes": [ - "sha256:e64591d02899f6fd50fe391f5635236c5c604d8faae08ab4aafed9c3a66e3966", - "sha256:e8093fe990bafd4ff3e2e49641b182c8085ea9cee2a28c7bdf9fabc2ff9f618f" + "sha256:7dc38ec3c11693e9944ade1558392c04f37fd8df68d3ec7a20372dfe96b2e5bb", + "sha256:ae343fabb72840195278b73ad426fb04d35d66b15a664f5c47221f4e4f0842e5" ], - "version": "==1.3.0" + "version": "==1.3.1" }, "mozprofile": { "hashes": [ @@ -420,11 +416,11 @@ }, "pyjwt": { "hashes": [ - "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", - "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074" + "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" ], "markers": "python_version >= '3.7'", - "version": "==2.7.0" + "version": "==2.8.0" }, "pypom": { "hashes": [ @@ -552,11 +548,11 @@ }, "trio": { "hashes": [ - "sha256:ce68f1c5400a47b137c5a4de72c7c901bd4e7a24fbdebfe9b41de8c6c04eaacf", - "sha256:f1dd0780a89bfc880c7c7994519cb53f62aacb2c25ff487001c0052bd721cdf0" + "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3", + "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38" ], "markers": "python_version >= '3.7'", - "version": "==0.22.0" + "version": "==0.22.2" }, "trio-websocket": { "hashes": [ @@ -568,11 +564,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", - "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" ], "markers": "python_version >= '3.7'", - "version": "==4.6.3" + "version": "==4.7.1" }, "urllib3": { "hashes": [ @@ -615,10 +611,11 @@ }, "zope.event": { "hashes": [ - "sha256:73d9e3ef750cca14816a9c322c7250b0d7c9dbc337df5d1b807ff8d3d0b9e97c", - "sha256:81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80" + "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", + "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd" ], - "version": "==4.6" + "markers": "python_version >= '3.7'", + "version": "==5.0" }, "zope.hookable": { "hashes": [ From 6b53dd0ada1fb803e98cf071dc55e234a22c465b Mon Sep 17 00:00:00 2001 From: Olivia Hall Date: Tue, 18 Jul 2023 10:20:18 -0400 Subject: [PATCH 104/207] Bug 1840894 - Adjust Print Error UI to use Snackbars This bug adjusts print errors to use the new snackbar component and removes the prior toast used for errors. --- .../fenix/share/SaveToPDFMiddleware.kt | 15 ++++++------- .../fenix/share/SaveToPDFMiddlewareTest.kt | 22 +++++++++++++++++-- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt index 827478389..9953892bb 100644 --- a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -5,8 +5,6 @@ package org.mozilla.fenix.share import android.content.Context -import android.widget.Toast -import android.widget.Toast.LENGTH_LONG import androidx.annotation.VisibleForTesting import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -23,7 +21,6 @@ import org.mozilla.fenix.R import org.mozilla.fenix.browser.StandardSnackbarError import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.ext.components -import org.mozilla.gecko.util.ThreadUtils import org.mozilla.geckoview.GeckoSession import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_NO_ACTIVITY_CONTEXT import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_NO_ACTIVITY_CONTEXT_DELEGATE @@ -78,11 +75,13 @@ class SaveToPDFMiddleware( postTelemetryCompleted(ctx.state.findTab(action.tabId), isPrint = true) } is EngineAction.PrintContentExceptionAction -> { - // Bug 1840894 - will update this toast to a snackbar with new snackbar error component - ThreadUtils.runOnUiThread { - Toast.makeText(context, R.string.unable_to_print_error, LENGTH_LONG).show() - } - + context.components.appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + context.getString(R.string.unable_to_print_error), + ), + ), + ) postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable, isPrint = true) } else -> { diff --git a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt index da1028caa..2a4ba1d1a 100644 --- a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt @@ -274,7 +274,7 @@ class SaveToPDFMiddlewareTest { } @Test - fun `GIVEN a print request WHEN it fails unexpectedly THEN unknown failure telemetry is sent`() = runTestOnMain { + fun `GIVEN a print request WHEN it fails unexpectedly THEN unknown failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = RuntimeException("No Print Spooler") val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk().apply { @@ -307,10 +307,19 @@ class SaveToPDFMiddlewareTest { assertEquals("unknown", reason) val source = response?.extra?.get("source") assertEquals("unknown", source) + verify { + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_print_error), + ), + ), + ) + } } @Test - fun `GIVEN a print request WHEN it fails due to print exception THEN print exception failure telemetry is sent`() = runTestOnMain { + fun `GIVEN a print request WHEN it fails due to print exception THEN print exception failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = MockGeckoPrintException() val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk().apply { @@ -341,6 +350,15 @@ class SaveToPDFMiddlewareTest { assertEquals("no_settings_service", reason) val source = response?.extra?.get("source") assertEquals("unknown", source) + verify { + appStore.dispatch( + AppAction.UpdateStandardSnackbarErrorAction( + StandardSnackbarError( + testContext.getString(R.string.unable_to_print_error), + ), + ), + ) + } } @Test From 7f498db9e4d577b2f0c5fc94b21b6a39293495ab Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 19 Jul 2023 16:58:04 -0400 Subject: [PATCH 105/207] Bug 1844386 - Update splash screen animation --- .../res/drawable/animated_splash_screen.xml | 715 ++--- .../res/drawable/animated_splash_screen.xml | 2860 ++++------------- .../res/drawable/animated_splash_screen.xml | 2860 ++++------------- app/src/main/res/values-night/styles.xml | 9 - app/src/main/res/values/styles.xml | 6 +- .../res/drawable/animated_splash_screen.xml | 678 ++-- .../res/drawable/animated_splash_screen.xml | 582 ++-- 7 files changed, 1989 insertions(+), 5721 deletions(-) diff --git a/app/src/beta/res/drawable/animated_splash_screen.xml b/app/src/beta/res/drawable/animated_splash_screen.xml index 9ca0de2a3..5d0d00b8e 100644 --- a/app/src/beta/res/drawable/animated_splash_screen.xml +++ b/app/src/beta/res/drawable/animated_splash_screen.xml @@ -1,8 +1,6 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:pivotX="216" + android:pivotY="216"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -670,14 +397,14 @@ diff --git a/app/src/debug/res/drawable/animated_splash_screen.xml b/app/src/debug/res/drawable/animated_splash_screen.xml index 7dfabc0ee..4e96325db 100644 --- a/app/src/debug/res/drawable/animated_splash_screen.xml +++ b/app/src/debug/res/drawable/animated_splash_screen.xml @@ -1,2180 +1,698 @@ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:pivotX="216" + android:pivotY="216"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/animated_splash_screen.xml b/app/src/main/res/drawable/animated_splash_screen.xml index 7dfabc0ee..4e96325db 100644 --- a/app/src/main/res/drawable/animated_splash_screen.xml +++ b/app/src/main/res/drawable/animated_splash_screen.xml @@ -1,2180 +1,698 @@ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:pivotX="216" + android:pivotY="216"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index d4dc7b291..0baef7182 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -3,15 +3,6 @@ - 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/. --> - - + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 63a2cda06..779f0761f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,12 +4,11 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - From 0c7dfb888101a0117d5580c50f994ec9bcacee78 Mon Sep 17 00:00:00 2001 From: JohanLorenzo Date: Thu, 20 Jul 2023 15:32:26 +0000 Subject: [PATCH 116/207] Update Fenix initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 95 +------------------ 1 file changed, 1 insertion(+), 94 deletions(-) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 6cca59d34..9acd7b5aa 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -85,7 +85,7 @@ "channel": "release", "userFacingName": "Android re-engagement notifications timing v2", "userFacingDescription": "Testing timing of how we enable re-engagement notifications.", - "isEnrollmentPaused": false, + "isEnrollmentPaused": true, "isRollout": false, "bucketConfig": { "randomizationUnit": "nimbus_id", @@ -149,99 +149,6 @@ "localizations": null, "locales": null }, - { - "schemaVersion": "1.12.0", - "slug": "lifestyles-images-onboarding-experiment-v3", - "id": "lifestyles-images-onboarding-experiment-v3", - "arguments": {}, - "application": "org.mozilla.firefox", - "appName": "fenix", - "appId": "org.mozilla.firefox", - "channel": "release", - "userFacingName": "Lifestyles images onboarding experiment v3", - "userFacingDescription": "This experiment tests different sets of images for the same onboarding card messages to see if one is preferred.", - "isEnrollmentPaused": true, - "isRollout": false, - "bucketConfig": { - "randomizationUnit": "nimbus_id", - "namespace": "fenix-juno-onboarding-release-2", - "start": 0, - "count": 10000, - "total": 10000 - }, - "featureIds": [ - "juno-onboarding" - ], - "probeSets": [], - "outcomes": [ - { - "slug": "default-browser", - "priority": "primary" - } - ], - "branches": [ - { - "slug": "control", - "ratio": 1, - "feature": { - "featureId": "this-is-included-for-mobile-pre-96-support", - "enabled": false, - "value": {} - }, - "features": [ - { - "featureId": "juno-onboarding", - "enabled": true, - "value": { - "enabled": true - } - } - ] - }, - { - "slug": "treatment-a", - "ratio": 1, - "feature": { - "featureId": "this-is-included-for-mobile-pre-96-support", - "enabled": false, - "value": {} - }, - "features": [ - { - "featureId": "juno-onboarding", - "enabled": true, - "value": { - "enabled": true, - "cards": { - "default-browser": { - "image-res": "onboarding_default_browser", - "image-is-illustration": false - }, - "sync-sign-in": { - "image-res": "onboarding_sync", - "image-is-illustration": false - }, - "notification-permission": { - "image-res": "onboarding_notification", - "image-is-illustration": false - } - } - } - } - ] - } - ], - "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('114.!') >= 0) && (language in ['en'])))", - "startDate": "2023-06-09", - "enrollmentEndDate": "2023-06-21", - "endDate": null, - "proposedDuration": 35, - "proposedEnrollment": 14, - "referenceBranch": "control", - "featureValidationOptOut": false, - "localizations": null, - "locales": null - }, { "schemaVersion": "1.12.0", "slug": "on-boarding-challenge-the-default", From 94c13fcb207d38f32f635fb15949f655d10cb25d Mon Sep 17 00:00:00 2001 From: JohanLorenzo Date: Thu, 20 Jul 2023 19:32:30 +0000 Subject: [PATCH 117/207] Update Fenix initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 9acd7b5aa..68f403d9e 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -140,7 +140,7 @@ ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('115.!') >= 0)))", "startDate": "2023-06-28", - "enrollmentEndDate": "2023-07-18", + "enrollmentEndDate": "2023-07-20", "endDate": null, "proposedDuration": 30, "proposedEnrollment": 14, From 330a758e82de56aa786502c44718fc64431218b1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 21 Jul 2023 00:03:10 +0000 Subject: [PATCH 118/207] Import translations from android-l10n --- app/src/main/res/values-am/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-el/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-es-rCL/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-fa/strings.xml | 4 ++- app/src/main/res/values-hr/strings.xml | 6 ++-- app/src/main/res/values-hy-rAM/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-si/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-sv-rSE/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-tg/strings.xml | 32 ++++++++++++---------- 9 files changed, 125 insertions(+), 109 deletions(-) diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index 4119114c0..50e0db75b 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -294,52 +294,52 @@ አሁን አይሆንም - + - %sን ነባሪ አሳሽዎ ያድርጉ + %sን ነባሪ አሳሽዎ ያድርጉ ፋየርፎክስን ነባሪ አሳሽዎ ያድርጉ - %1$s ሰዎችን ከትርፍ በላይ ያስቀምጣቸዋል እና ድረ-ገጽ ተሻጋሪ መከታተያዎችን በማገድ የእርስዎን ግላዊነት ይጠብቃል።\n\nበእኛ %2$s ውስጥ የበለጠ ይወቁ። + %1$s ሰዎችን ከትርፍ በላይ ያስቀምጣቸዋል እና ድረ-ገጽ ተሻጋሪ መከታተያዎችን በማገድ የእርስዎን ግላዊነት ይጠብቃል።\n\nበእኛ %2$s ውስጥ የበለጠ ይወቁ። ፋየርፎክስ ሰዎችን ከትርፍ በላይ ያስቀድማል እና ድረ-ገጽ ተሻጋሪ መከታተያዎችን በማገድ የእርስዎን ግላዊነት ይጠብቃል።\n\nበግላዊነት ማስታወቂያችን ውስጥ የበለጠ ይረዱ። - የግላዊነት ማስታወቂያ + የግላዊነት ማስታወቂያ - ነባሪ አሳሽ አድርገህ አስቀምጥ + ነባሪ አሳሽ አድርገህ አስቀምጥ - አሁን አይሆንም + አሁን አይሆንም - ከስልክ ወደ ላፕቶፕ ይዝለሉ እና ይመለሱ + ከስልክ ወደ ላፕቶፕ ይዝለሉ እና ይመለሱ - ካቆሙበት ለመቀጠል ከሌሎች መሳሪያዎችዎ ትሮችን እና የይለፍ ቃሎችን ይያዙ። + ካቆሙበት ለመቀጠል ከሌሎች መሳሪያዎችዎ ትሮችን እና የይለፍ ቃሎችን ይያዙ። - ይግቡ + ይግቡ - አሁን አይሆንም + አሁን አይሆንም - ማሳወቂያዎች በ%s የበለጠ እንዲከውኑ ያግዝዎታል + ማሳወቂያዎች በ%s የበለጠ እንዲከውኑ ያግዝዎታል ማሳወቂያዎች በፋየርፎክስ የበለጠ እንዲሰሩ ያግዝዎታል - በመሳሪያዎች መካከል ትሮችን ይላኩ፣ ውርዶችን ያስተዳድሩ እና %sን የበለጠ ለመጠቀም ምክሮችን ያግኙ። + በመሳሪያዎች መካከል ትሮችን ይላኩ፣ ውርዶችን ያስተዳድሩ እና %sን የበለጠ ለመጠቀም ምክሮችን ያግኙ። በመሳሪያዎች መካከል ትሮችን ይላኩ፣ ውርዶችን ያስተዳድሩ እና ከፋየርፎክስ የበለጠ ለመጠቀም ምክሮችን ያግኙ። - ማሳወቂያዎችን ያብሩ + ማሳወቂያዎችን ያብሩ - አሁን አይሆንም + አሁን አይሆንም @@ -1190,8 +1190,10 @@ አጋራ እንደ PDF አስቀምጥ - + PDF መፍጠር አልተቻለም + + አሰናብት ማተም አልተቻለም diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index aaed3b014..755a84a76 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -307,51 +307,51 @@ Όχι τώρα - + - Ορίστε το %s ως το προεπιλεγμένο πρόγραμμα περιήγησής σας + Ορίστε το %s ως το προεπιλεγμένο πρόγραμμα περιήγησής σας Ορίστε το FIrefox ως το προεπιλεγμένο πρόγραμμα περιήγησής σας - Το %1$s θέτει σε προτεραιότητα τους ανθρώπους και όχι τα κέρδη, προστατεύοντας το απόρρητό σας με αποκλεισμό των ιχνηλατών μεταξύ ιστοτόπων.\n\nΜάθετε περισσότερα στη %2$s μας. + Το %1$s θέτει σε προτεραιότητα τους ανθρώπους και όχι τα κέρδη, προστατεύοντας το απόρρητό σας με αποκλεισμό των ιχνηλατών μεταξύ ιστοτόπων.\n\nΜάθετε περισσότερα στη %2$s μας. Το Firefox θέτει σε προτεραιότητα τους ανθρώπους και όχι τα κέρδη, προστατεύοντας το απόρρητό σας με αποκλεισμό των ιχνηλατών μεταξύ ιστοτόπων.\n\nΜάθετε περισσότερα στη σημείωση απορρήτου μας. - σημείωση απορρήτου + σημείωση απορρήτου - Ορισμός ως προεπιλογή + Ορισμός ως προεπιλογή - Όχι τώρα + Όχι τώρα - Εναλλαγή από τηλέφωνο σε υπολογιστή και αντίστροφα + Εναλλαγή από τηλέφωνο σε υπολογιστή και αντίστροφα - Λάβετε καρτέλες και κωδικούς πρόσβασης από τις άλλες συσκευές σας για να συνεχίσετε από εκεί που σταματήσατε. + Λάβετε καρτέλες και κωδικούς πρόσβασης από τις άλλες συσκευές σας για να συνεχίσετε από εκεί που σταματήσατε. - Σύνδεση + Σύνδεση - Όχι τώρα + Όχι τώρα - Οι ειδοποιήσεις σάς βοηθούν να κάνετε περισσότερα με το %s + Οι ειδοποιήσεις σάς βοηθούν να κάνετε περισσότερα με το %s Οι ειδοποιήσεις σάς βοηθούν να κάνετε περισσότερα με το Firefox - Αποστολή καρτελών μεταξύ συσκευών, διαχείριση λήψεων και λήψη συμβουλών για την αξιοποίηση του %s στο έπακρο. + Αποστολή καρτελών μεταξύ συσκευών, διαχείριση λήψεων και λήψη συμβουλών για την αξιοποίηση του %s στο έπακρο. Αποστολή καρτελών μεταξύ συσκευών, διαχείριση λήψεων και λήψη συμβουλών για την αξιοποίηση του Firefox στο έπακρο. - Ενεργοποίηση ειδοποιήσεων + Ενεργοποίηση ειδοποιήσεων - Όχι τώρα + Όχι τώρα @@ -1214,8 +1214,10 @@ Κοινή χρήση Αποθήκευση ως PDF - + Δεν είναι δυνατή η δημιουργία PDF + + Απόρριψη Αδυναμία εκτύπωσης diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index eba2f439d..d8e609016 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -300,51 +300,51 @@ Ahora no - + - Haz de %s tu navegador para todo + Haz de %s tu navegador para todo Haz de Firefox tu navegador para todo - %1$s pone a las personas por encima de las ganancias y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestro %2$s. + %1$s pone a las personas por encima de las ganancias y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestro %2$s. Firefox pone a las personas por encima de las ganancias y defiende tu privacidad al bloquear los rastreadores entre sitios.\n\nObtén más información en nuestra política de privacidad. - política de privacidad + política de privacidad - Establecer como navegador predeterminado + Establecer como navegador predeterminado - Ahora no + Ahora no - Salta del teléfono al computador y viceversa + Salta del teléfono al computador y viceversa - Recupera las pestañas y contraseñas de tus otros dispositivos para continuar desde donde quedaste. + Recupera las pestañas y contraseñas de tus otros dispositivos para continuar desde donde quedaste. - Conectarse + Conectarse - Ahora no + Ahora no - Las notificaciones te ayudan a hacer más con %s + Las notificaciones te ayudan a hacer más con %s Las notificaciones te ayudan a hacer más con Firefox - Envía pestañas entre dispositivos, administra las descargas y obtén sugerencias para aprovechar %s al máximo. + Envía pestañas entre dispositivos, administra las descargas y obtén sugerencias para aprovechar %s al máximo. Envía pestañas entre dispositivos, administra las descargas y obtén sugerencias para aprovechar Firefox al máximo. - Activar notificaciones + Activar notificaciones - Ahora no + Ahora no @@ -1201,8 +1201,10 @@ Compartir Guardar como PDF - + No se pudo generar el PDF + + Ocultar No se pudo imprimir diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 7212d3288..fffb59d18 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1198,8 +1198,10 @@ اشتراک‌گذاری ذخیره به صورت PDF - + ناتوانی در تولید PDF + + رد کردن ناتوانی در چاپ diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 12ecd1bb4..20a7c0a5a 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -36,7 +36,7 @@ Dodaj novu zbirku - Ime + Naziv Odaberi zbirku @@ -372,7 +372,7 @@ Standardna tražilica - Traži + Tražilica Traka adrese @@ -1898,7 +1898,7 @@ Naziv - Ime + Naziv Naziv pretraživača diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index 5a69c009f..c0e180837 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -299,51 +299,51 @@ Ոչ հիմա - + - Դարձրեք %s-ը ձեր հիմնական դիտարկիչը + Դարձրեք %s-ը ձեր հիմնական դիտարկիչը Դարձրեք Firefox-ը ձեր հիմնական դիտարկիչը - %1$s-ը մարդկանց վեր է դասում շահույթից և պաշտպանում է ձեր գաղտնիությունը՝ արգելափակելով միջկայքի հետագծիչները:\n\nԻմացեք ավելին մեր %2$s-ում: + %1$s-ը մարդկանց վեր է դասում շահույթից և պաշտպանում է ձեր գաղտնիությունը՝ արգելափակելով միջկայքի հետագծիչները:\n\nԻմացեք ավելին մեր %2$s-ում: Firefox-ը մարդկանց վեր է դասում շահույթից և պաշտպանում է ձեր գաղտնիությունը՝ արգելափակելով միջկայքի հետագծիչները:\n\nԻմացեք ավելին մեր գաղտնիության ծանուցումներում: - գաղտնիության ծանուցում + գաղտնիության ծանուցում - Կայել որպես սկզբնադիր դիտարկիչ + Կայել որպես սկզբնադիր դիտարկիչ - Ոչ հիմա + Ոչ հիմա - Անցեք հեռախոսից նոութբուք և հետ + Անցեք հեռախոսից նոութբուք և հետ - Ձեռք բերեք ներդիրներն ու գաղտնաբառերը ձեր մյուս սարքերից՝ շարունակելու այնտեղից, որտեղ թողել եք: + Ձեռք բերեք ներդիրներն ու գաղտնաբառերը ձեր մյուս սարքերից՝ շարունակելու այնտեղից, որտեղ թողել եք: - Մուտք գործել + Մուտք գործել - Ոչ հիմա + Ոչ հիմա - Ծանուցումներն օգնում են ձեզ ավելին անել %s-ի հետ + Ծանուցումներն օգնում են ձեզ ավելին անել %s-ի հետ Ծանուցումներն օգնում են ձեզ ավելին անել Firefox-ի հետ - Ուղարկեք ներդիրներ սարքերի միջև, կառավարեք ներբեռնումները և ստացեք խորհուրդներ %s-ից առավելագույնը քաղելու վերաբերյալ: + Ուղարկեք ներդիրներ սարքերի միջև, կառավարեք ներբեռնումները և ստացեք խորհուրդներ %s-ից առավելագույնը քաղելու վերաբերյալ: Ուղարկեք ներդիրներ սարքերի միջև, կառավարեք ներբեռնումները և ստացեք խորհուրդներ Firefox-ից առավելագույնը քաղելու վերաբերյալ: - Միացնել ծանուցումները + Միացնել ծանուցումները - Ոչ հիմա + Ոչ հիմա @@ -1200,8 +1200,10 @@ Պահել որպես PDF - + Անհնար է ստեղծել PDF + + Բաց թողնել Անհնար է տպել diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index d45b03d1b..a37135943 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -294,51 +294,51 @@ දැන් නොවේ - + - %s පෙරනිමි අතිරික්සුව කරන්න + %s පෙරනිමි අතිරික්සුව කරන්න ෆයර්ෆොක්ස් ප්‍රධාන අතිරික්සුව කරන්න - %1$s සැමවිට ලාභයට ඉහළින් මිනිසුන්ව තබයි. හරස්-අඩවි ලුහුබැඳීම් අවහිර කර ඔබගේ පෞද්ගලිකත්‍වය රැක දෙයි.\n\nඅපගේ %2$s හරහා තව දැනගන්න. + %1$s සැමවිට ලාභයට ඉහළින් මිනිසුන්ව තබයි. හරස්-අඩවි ලුහුබැඳීම් අවහිර කර ඔබගේ පෞද්ගලිකත්‍වය රැක දෙයි.\n\nඅපගේ %2$s හරහා තව දැනගන්න. %1$s සැමවිට ලාභයට ඉහළින් මිනිසුන්ව තබයි. හරස්-අඩවි ලුහුබැඳීම් අවහිර කර ඔබගේ පෞද්ගලිකත්‍වය රැක දෙයි.\n\nඅපගේ පෞද්ගලිකත්‍ව දැන්වීම හරහා තව දැනගන්න. - පෞද්ගලිකත්‍ව දැන්වීම + පෞද්ගලිකත්‍ව දැන්වීම - පෙරනිමි අතිරික්සුව කරන්න + පෙරනිමි අතිරික්සුව කරන්න - දැන් නොවේ + දැන් නොවේ - දුරකථනයෙන් පරිගණකයට සහ ආපසු + දුරකථනයෙන් පරිගණකයට සහ ආපසු - ඔබ නතර කළ තැනින් අතට ගැනීමට ඔබගේ අනෙකුත් උපාංගවලින් පටිති සහ මුරපද ගන්න. + ඔබ නතර කළ තැනින් අතට ගැනීමට ඔබගේ අනෙකුත් උපාංගවලින් පටිති සහ මුරපද ගන්න. - පිවිසෙන්න + පිවිසෙන්න - දැන් නොවේ + දැන් නොවේ - %s සමඟ බොහෝ දෑ කිරීමට දැනුම්දීම් උපකාරී වේ + %s සමඟ බොහෝ දෑ කිරීමට දැනුම්දීම් උපකාරී වේ ෆයර්ෆොක්ස් සමඟ බොහෝ දෑ කිරීමට දැනුම්දීම් උපකාරී වේ - උපාංග අතර පටිති යැවීමට, බාගැනීම් කළමනාකරණයට මෙන්ම %s වෙතින් බොහෝ ප්‍රතිලාභ අත්විඳීම සඳහා ඉඟි ලබා ගන්න. + උපාංග අතර පටිති යැවීමට, බාගැනීම් කළමනාකරණයට මෙන්ම %s වෙතින් බොහෝ ප්‍රතිලාභ අත්විඳීම සඳහා ඉඟි ලබා ගන්න. උපාංග අතර පටිති යැවීමට, බාගැනීම් කළමනාකරණයට මෙන්ම ෆයර්ෆොක්ස් වෙතින් බොහෝ ප්‍රතිලාභ අත්විඳීම සඳහා ඉඟි ලබා ගන්න. - දැනුම්දීම් සක්‍රිය කරන්න + දැනුම්දීම් සක්‍රිය කරන්න - දැන් නොවේ + දැන් නොවේ @@ -1188,8 +1188,10 @@ බෙදාගන්න පීඩීඑෆ් ලෙස සුරකින්න - + පීඩීඑෆ් උත්පාදනය කිරීමට නොහැකිය + + ඉවතලන්න මුද්‍රණයට නොහැකිය diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 0e03316ab..1282629f2 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -306,52 +306,52 @@ Inte nu - + - Gör %s till din favoritwebbläsare + Gör %s till din favoritwebbläsare Gör Firefox till din favoritwebbläsare - %1$s sätter människor före vinster och försvarar din integritet genom att blockera spårare på flera webbplatser.\n\nLäs mer i vårt %2$s. + %1$s sätter människor före vinster och försvarar din integritet genom att blockera spårare på flera webbplatser.\n\nLäs mer i vårt %2$s. Firefox sätter människor före vinster och försvarar din integritet genom att blockera spårare på flera webbplatser.\n\nLäs mer i vårt sekretessmeddelande. - sekretessmeddelande + sekretessmeddelande - Ange som standardwebbläsare + Ange som standardwebbläsare - Inte nu + Inte nu - Hoppa från telefon till laptop och tillbaka + Hoppa från telefon till laptop och tillbaka - Hämta flikar och lösenord från dina andra enheter för att fortsätta där du slutade. + Hämta flikar och lösenord från dina andra enheter för att fortsätta där du slutade. - Logga in + Logga in - Inte nu + Inte nu - Aviseringar hjälper dig att göra mer med %s + Aviseringar hjälper dig att göra mer med %s Aviseringar hjälper dig att göra mer med Firefox - Skicka flikar mellan enheter, hantera nedladdningar och få tips om hur du får ut det mesta av %s. + Skicka flikar mellan enheter, hantera nedladdningar och få tips om hur du får ut det mesta av %s. Skicka flikar mellan enheter, hantera nedladdningar och få tips om hur du får ut det mesta av Firefox. - Slå på aviseringar + Slå på aviseringar - Inte nu + Inte nu @@ -1213,8 +1213,10 @@ Dela Spara som PDF - + Det går inte att generera PDF + + Ignorera Det går inte att skriva ut diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index cfbf6b48f..b88324d68 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -303,10 +303,10 @@ Ҳоло не - + - «%s»-ро ба браузери ҳамешагии худ табдил диҳед + «%s»-ро ба браузери ҳамешагии худ табдил диҳед @@ -314,41 +314,41 @@ - «%1$s» одамгариро нисбат ба фоидаоварӣ ба ҷойи аввал мегузорад ва махфияти шуморо тавассути манъкунии пайгирикунандаҳои байнисомонавӣ муҳофизат мекунад.\n\nМаълумоти бештар дар «%2$s»-и мо дастрас аст. + «%1$s» одамгариро нисбат ба фоидаоварӣ ба ҷойи аввал мегузорад ва махфияти шуморо тавассути манъкунии пайгирикунандаҳои байнисомонавӣ муҳофизат мекунад.\n\nМаълумоти бештар дар «%2$s»-и мо дастрас аст. «Firefox» одамгариро нисбат ба фоидаоварӣ ба ҷойи аввал мегузорад ва махфияти шуморо тавассути манъкунии пайгирикунандаҳои байнисомонавӣ муҳофизат мекунад.\n\nМаълумоти бештар дар «Огоҳномаи махфият»-и мо дастрас аст. - огоҳномаи махфият + огоҳномаи махфият - Гузоштан ҳамчун браузери пешфарз + Гузоштан ҳамчун браузери пешфарз - Ҳоло не + Ҳоло не - Аз телефон ба ноутбук ва баръакс гузаред + Аз телефон ба ноутбук ва баръакс гузаред - Барои идомаи кор аз он ҷое, ки шумо ба қарибӣ тамошо кардаед, варақаҳо ва ниҳонвожаҳоро аз дастгоҳҳои дигари худ ба даст оред. + Барои идомаи кор аз он ҷое, ки шумо ба қарибӣ тамошо кардаед, варақаҳо ва ниҳонвожаҳоро аз дастгоҳҳои дигари худ ба даст оред. - Ворид шудан + Ворид шудан - Ҳоло не + Ҳоло не - Огоҳиҳо барои кори бештар бо «%s» ба шумо кумак мекунанд + Огоҳиҳо барои кори бештар бо «%s» ба шумо кумак мекунанд Огоҳиҳо барои кори бештар бо «Firefox» ба шумо кумак мекунанд - Варақаҳоро байни дастгоҳҳо интиқол диҳед, боргириҳоро идора кунед ва барои истифодаи бештари «%s» маслиҳат гиред. + Варақаҳоро байни дастгоҳҳо интиқол диҳед, боргириҳоро идора кунед ва барои истифодаи бештари «%s» маслиҳат гиред. Варақаҳоро байни дастгоҳҳо интиқол диҳед, боргириҳоро идора кунед ва барои истифодаи бештари «Firefox» маслиҳат гиред. - Хомӯш кардани огоҳномаҳо + Хомӯш кардани огоҳномаҳо - Ҳоло не + Ҳоло не @@ -1208,8 +1208,10 @@ Мубодила кардан Нигоҳ доштан ҳамчун PDF - + Файли PDF эҷод карда нашуд + + Нодида гузарондан Чоп ғайриимкон аст From a7674bdcac741f171d2f24933da2760697ea7891 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 19 Jul 2023 13:50:44 +0300 Subject: [PATCH 119/207] Bug 1844312 - Remove verifyOpenLinkInAppViewInPrivateBrowsingTest UI test --- .../org/mozilla/fenix/ui/SettingsAdvancedTest.kt | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt index bc67b5531..c63d7c595 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt @@ -84,22 +84,6 @@ class SettingsAdvancedTest { } } - @SmokeTest - @Test - fun verifyOpenLinkInAppViewInPrivateBrowsingTest() { - homeScreen { - }.togglePrivateBrowsingMode() - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Never") - }.openOpenLinksInAppsMenu { - verifyPrivateOpenLinksInAppsView("Never") - } - } - // Assumes Youtube is installed and enabled @Test fun neverOpenLinkInAppTest() { From 4a4838adf6b696dba6cb96d8a0b3e399fec5cda0 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 19 Jul 2023 12:22:15 +0300 Subject: [PATCH 120/207] Bug 1844330 - Add missing steps to verifyShortcutOptionTest UI test --- .../org/mozilla/fenix/ui/SettingsHomepageTest.kt | 8 ++++++++ .../java/org/mozilla/fenix/ui/TopSitesTest.kt | 14 +++++++------- .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 3 ++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt index 6b7852757..b462746bd 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt @@ -67,6 +67,7 @@ class SettingsHomepageTest { "Wikipedia", "Google", ) + val genericURL = getGenericAsset(mockWebServer, 1) homeScreen { defaultTopSites.forEach { item -> @@ -80,6 +81,13 @@ class SettingsHomepageTest { verifyNotExistingTopSitesList(item) } } + // Disabling the "Shortcuts" homepage setting option should remove the "Add to shortcuts" from main menu option + navigationToolbar { + }.enterURLAndEnterToBrowser(genericURL.url) { + }.openThreeDotMenu { + expandMenu() + verifyAddToShortcutsButton(shouldExist = false) + } } @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt index 8d9eeccf1..d1ceacf79 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt @@ -68,7 +68,7 @@ class TopSitesTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { @@ -85,7 +85,7 @@ class TopSitesTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { @@ -112,7 +112,7 @@ class TopSitesTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { @@ -135,7 +135,7 @@ class TopSitesTest { waitForPageToLoad() }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { @@ -157,7 +157,7 @@ class TopSitesTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { @@ -178,7 +178,7 @@ class TopSitesTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { @@ -200,7 +200,7 @@ class TopSitesTest { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() - verifyAddToShortcutsButton() + verifyAddToShortcutsButton(shouldExist = true) }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 0847cd718..ba0dba2ab 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -79,7 +79,8 @@ class ThreeDotMenuMainRobot { fun verifySelectTabs() = assertSelectTabsButton() fun verifyFindInPageButton() = assertItemContainingTextExists(findInPageButton) - fun verifyAddToShortcutsButton() = assertItemContainingTextExists(addToShortcutsButton) + fun verifyAddToShortcutsButton(shouldExist: Boolean) = + assertItemContainingTextExists(addToShortcutsButton, exists = shouldExist) fun verifyRemoveFromShortcutsButton() = assertRemoveFromShortcutsButton() fun verifyShareTabsOverlay() = assertShareTabsOverlay() From b069d71b54e98334205ad59b4e9d27da89c34f9c Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 18 Jul 2023 16:49:15 +0300 Subject: [PATCH 121/207] Bug 1844305 - Add snackbar verification in UI tests when removing tabs from a collection --- .../org/mozilla/fenix/ui/CollectionTest.kt | 29 +++++++++++++++++++ .../mozilla/fenix/ui/ComposeCollectionTest.kt | 29 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt index 3df3e7aeb..ad0572471 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt @@ -353,6 +353,31 @@ class CollectionTest { } } + @Test + fun undoTabRemovalFromCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openTabDrawer { + createCollection(webPage.title, collectionName = collectionName) + closeTab() + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + verifyTabSavedInCollection(webPage.title, true) + removeTabFromCollection(webPage.title) + } + homeScreen { + verifySnackBarText("Collection deleted") + clickSnackbarButton("UNDO") + verifyCollectionIsDisplayed(collectionName, true) + verifyCollectionIsDisplayed(collectionName, true) + } + } + @Test fun swipeLeftToRemoveTabFromCollectionTest() { val testPage = getGenericAsset(mockWebServer, 1) @@ -375,6 +400,8 @@ class CollectionTest { verifyTabSavedInCollection(testPage.title, false) } homeScreen { + verifySnackBarText("Collection deleted") + verifySnackBarText("UNDO") verifyCollectionIsDisplayed(collectionName, false) } } @@ -401,6 +428,8 @@ class CollectionTest { verifyTabSavedInCollection(testPage.title, false) } homeScreen { + verifySnackBarText("Collection deleted") + verifySnackBarText("UNDO") verifyCollectionIsDisplayed(collectionName, false) } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt index f81d54dca..696873d50 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCollectionTest.kt @@ -357,6 +357,31 @@ class ComposeCollectionTest { } } + @Test + fun undoTabRemovalFromCollectionTest() { + val webPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(webPage.url) { + }.openComposeTabDrawer(composeTestRule) { + createCollection(webPage.title, collectionName = collectionName) + closeTab() + } + + homeScreen { + verifyCollectionIsDisplayed(collectionName) + }.expandCollection(collectionName) { + verifyTabSavedInCollection(webPage.title, true) + removeTabFromCollection(webPage.title) + } + homeScreen { + verifySnackBarText("Collection deleted") + clickSnackbarButton("UNDO") + verifyCollectionIsDisplayed(collectionName, true) + verifyCollectionIsDisplayed(collectionName, true) + } + } + @Test fun swipeLeftToRemoveTabFromCollectionTest() { val testPage = getGenericAsset(mockWebServer, 1) @@ -379,6 +404,8 @@ class ComposeCollectionTest { verifyTabSavedInCollection(testPage.title, false) } homeScreen { + verifySnackBarText("Collection deleted") + verifySnackBarText("UNDO") verifyCollectionIsDisplayed(collectionName, false) } } @@ -405,6 +432,8 @@ class ComposeCollectionTest { verifyTabSavedInCollection(testPage.title, false) } homeScreen { + verifySnackBarText("Collection deleted") + verifySnackBarText("UNDO") verifyCollectionIsDisplayed(collectionName, false) } } From 7b50a43c5aefb2b4eda6e3f39553a761798b6028 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 18 Jul 2023 15:47:23 +0300 Subject: [PATCH 122/207] Bug 1840994 - Fix systemNotificationCantBeDismissedWhileDownloadingTest UI test --- .../java/org/mozilla/fenix/ui/DownloadTest.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index 53d0e3e12..c8437a1ac 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -8,7 +8,6 @@ import androidx.core.net.toUri import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -351,7 +350,6 @@ class DownloadTest { deleteDownloadedFileOnStorage(secondDownloadedFile) } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1840994") @Test fun systemNotificationCantBeDismissedWhileDownloadingTest() { // Clear the "Firefox Fenix default browser notification" @@ -373,13 +371,6 @@ class DownloadTest { verifySystemNotificationExists("Firefox Fenix") expandNotificationMessage() swipeDownloadNotification("Left", false) - verifySystemNotificationExists("Firefox Fenix") - }.closeNotificationTray { - }.openNotificationShade { - verifySystemNotificationExists("Firefox Fenix") - expandNotificationMessage() - swipeDownloadNotification("Right", false) - verifySystemNotificationExists("Firefox Fenix") clickDownloadNotificationControlButton("CANCEL") } deleteDownloadedFileOnStorage(downloadFile) From c8382c0cfaa2b759077d8edc7501517770b605e0 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 21 Jul 2023 11:02:16 +0300 Subject: [PATCH 123/207] Bug 1844580 - Re-enable pocket related UI tests --- .../androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt index bf22a5e89..eaa55e433 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt @@ -10,7 +10,6 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher @@ -56,7 +55,6 @@ class HomeScreenTest { mockWebServer.shutdown() } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1844580") @Test fun homeScreenItemsTest() { homeScreen {}.dismissOnboarding() @@ -141,7 +139,6 @@ class HomeScreenTest { } } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1844580") @Test fun verifyPocketHomepageStoriesTest() { activityTestRule.activityRule.applySettingsExceptions { @@ -171,7 +168,6 @@ class HomeScreenTest { } } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1844580") @Test fun openPocketStoryItemTest() { activityTestRule.activityRule.applySettingsExceptions { @@ -209,7 +205,6 @@ class HomeScreenTest { } } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1844580") @Test fun selectStoriesByTopicItemTest() { activityTestRule.activityRule.applySettingsExceptions { From f6c639f61e1bc69d99dfc7166aff1b9b38a8cd2d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 22 Jul 2023 00:03:09 +0000 Subject: [PATCH 124/207] Import translations from android-l10n --- app/src/main/res/values-en-rGB/strings.xml | 32 ++++++++++---------- app/src/main/res/values-pa-rIN/strings.xml | 32 ++++++++++---------- app/src/main/res/values-tr/strings.xml | 34 ++++++++++++---------- app/src/main/res/values-uk/strings.xml | 32 ++++++++++---------- 4 files changed, 70 insertions(+), 60 deletions(-) diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 43d36895d..810884590 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -299,51 +299,51 @@ Not now - + - Make %s your go-to browser + Make %s your go-to browser Make Firefox your go-to browser - %1$s puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our %2$s. + %1$s puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our %2$s. Firefox puts people over profits and defends your privacy by blocking cross-site trackers.\n\nLearn more in our privacy notice. - privacy notice + privacy notice - Set as default browser + Set as default browser - Not now + Not now - Hop from phone to laptop and back + Hop from phone to laptop and back - Grab tabs and passwords from your other devices to pick up where you left off. + Grab tabs and passwords from your other devices to pick up where you left off. - Sign in + Sign in - Not now + Not now - Notifications help you do more with %s + Notifications help you do more with %s Notifications help you do more with Firefox - Send tabs between devices, manage downloads, and get tips on getting the most out of %s. + Send tabs between devices, manage downloads, and get tips on getting the most out of %s. Send tabs between devices, manage downloads, and get tips on getting the most out of Firefox. - Turn on notifications + Turn on notifications - Not now + Not now @@ -1199,8 +1199,10 @@ Share Save as PDF - + Unable to generate PDF + + Dismiss Unable to print diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 5bdbb7e33..0ccd162c7 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -308,52 +308,52 @@ ਹੁਣੇ ਨਹੀਂ - + - %s ਨੂੰ ਆਪਣਾ ਪੱਕਾ ਬਰਾਊਜ਼ਰ ਬਣਾਓ + %s ਨੂੰ ਆਪਣਾ ਪੱਕਾ ਬਰਾਊਜ਼ਰ ਬਣਾਓ Firefox ਨੂੰ ਆਪਣਾ ਪੱਕਾ ਬਰਾਊਜ਼ਰ ਬਣਾਓ - %1$s ਫ਼ਾਇਦੇ ਤੋਂ ਪਹਿਲਾਂ ਲੋਕਾਂ ਨੂੰ ਰੱਖਦਾ ਹੈ ਅਤੇ ਅੰਤਰ-ਸਾਈਟ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾ ਕੇ ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਦੀ ਰੱਖਿਆ ਕਰਦਾ ਹੈ।\n\nਸਾਡੇ %2$s ਬਾਰੇ ਹੋਰ ਜਾਣੋ। + %1$s ਫ਼ਾਇਦੇ ਤੋਂ ਪਹਿਲਾਂ ਲੋਕਾਂ ਨੂੰ ਰੱਖਦਾ ਹੈ ਅਤੇ ਅੰਤਰ-ਸਾਈਟ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾ ਕੇ ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਦੀ ਰੱਖਿਆ ਕਰਦਾ ਹੈ।\n\nਸਾਡੇ %2$s ਬਾਰੇ ਹੋਰ ਜਾਣੋ। Firefox ਫ਼ਾਇਦੇ ਨਾਲੋਂ ਲੋਕਾਂ ਨੂੰ ਪਹਿਲ ਦਿੰਦਾ ਹੈ ਅਤੇ ਅੰਤਰ-ਸਾਈਟ ਟਰੈਕਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾ ਕੇ ਤੁਹਾਡੇ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਚਾਉਂਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਸਾਡੀ ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ ਨੂੰ ਪੜ੍ਹੋ। - ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ + ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ - ਮੂਲ ਬਰਾਊਜ਼ਰ ਬਣਾਓ + ਮੂਲ ਬਰਾਊਜ਼ਰ ਬਣਾਓ - ਹੁਣੇ ਨਹੀਂ + ਹੁਣੇ ਨਹੀਂ - ਫ਼ੋਨ ਤੋਂ ਲੈਪਟਾਪ ਉੱਤੇ ਜਾਓ ਤੇ ਵਾਪਸ ਆਓ + ਫ਼ੋਨ ਤੋਂ ਲੈਪਟਾਪ ਉੱਤੇ ਜਾਓ ਤੇ ਵਾਪਸ ਆਓ - ਆਪਣੇ ਹੋਰ ਡਿਵਾਈਸਾਂ ਉੱਤੇ ਜਿੱਥੇ ਤੁਸੀਂ ਟੈਬਾਂ ਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਜਿੱਥੇ ਛੱਡਿਆ ਸੀ, ਓਥੋਂ ਹੀ ਲਵੋ। + ਆਪਣੇ ਹੋਰ ਡਿਵਾਈਸਾਂ ਉੱਤੇ ਜਿੱਥੇ ਤੁਸੀਂ ਟੈਬਾਂ ਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਜਿੱਥੇ ਛੱਡਿਆ ਸੀ, ਓਥੋਂ ਹੀ ਲਵੋ। - ਸਾਈਨ ਇਨ + ਸਾਈਨ ਇਨ - ਹੁਣੇ ਨਹੀਂ + ਹੁਣੇ ਨਹੀਂ - ਨੋਟੀਫ਼ਿਕੇਸ਼ਨ ਤੁਹਾਨੂੰ %s ਨਾਲ ਹੋਰ ਕਰਨ ਦੀ ਮਦਦ ਕਰਦੇ ਹਨ + ਨੋਟੀਫ਼ਿਕੇਸ਼ਨ ਤੁਹਾਨੂੰ %s ਨਾਲ ਹੋਰ ਕਰਨ ਦੀ ਮਦਦ ਕਰਦੇ ਹਨ ਨੋਟੀਫ਼ਿਕੇਸ਼ਨ ਤੁਹਾਨੂੰ Firefox ਨਾਲ ਵੱਧ ਕੰਮ ਦੀ ਮਦਦ ਕਰਦੇ ਹਨ - ਡਿਵਾਈਸਾਂ ਵਿੱਚ ਟੈਬਾਂ ਭੇਜੋ, ਡਾਊਨਲੋਡਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ ਅਤੇ %s ਦਾ ਭਰਪੂਰ ਫ਼ਾਇਦਾ ਲੈਣ ਲਈ ਹੋਰ ਸੁਝਾਅ ਲਵੋ। + ਡਿਵਾਈਸਾਂ ਵਿੱਚ ਟੈਬਾਂ ਭੇਜੋ, ਡਾਊਨਲੋਡਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ ਅਤੇ %s ਦਾ ਭਰਪੂਰ ਫ਼ਾਇਦਾ ਲੈਣ ਲਈ ਹੋਰ ਸੁਝਾਅ ਲਵੋ। ਟੈਬਾਂ ਨੂੰ ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਭੇਜੋ, ਡਾਊਨਲੋਡ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ ਅਤੇ Firefox ਦਾ ਪੂਰਾ ਫ਼ਾਇਦਾ ਲੈਣ ਲਈ ਸੁਝਾਅ ਲਵੋ। - ਸੂਚਨਾਵਾਂ ਚਾਲੂ ਕਰੋ + ਸੂਚਨਾਵਾਂ ਚਾਲੂ ਕਰੋ - ਹੁਣੇ ਨਹੀਂ + ਹੁਣੇ ਨਹੀਂ @@ -1222,8 +1222,10 @@ ਸਾਂਝਾ ਕਰੋ PDF ਵਜੋਂ ਸੰਭਾਲੋ - + PDF ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ + + ਖ਼ਾਰਜ ਕਰੋ ਛਾਪਣ ਲਈ ਅਸਮਰੱਥ ਹੈ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index fc241f9bf..eba9186e1 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -302,52 +302,52 @@ Şimdi değil - + - %s varsayılan tarayıcınız olsun + %s varsayılan tarayıcınız olsun Firefox varsayılan tarayıcınız olsun - %1$s için paradan önce insanlık gelir. Siteler arası takip kodlarını engelleyerek gizliliğinizi koruyoruz.\n\nAyrıntıları %2$s bulabilirsiniz. + %1$s için paradan önce insanlık gelir. Siteler arası takip kodlarını engelleyerek gizliliğinizi koruyoruz.\n\nAyrıntıları %2$s bulabilirsiniz. Firefox için paradan önce insanlık gelir. Siteler arası takip kodlarını engelleyerek gizliliğinizi koruyoruz.\n\nAyrıntıları gizlilik bildirimimizde bulabilirsiniz. - gizlilik bildirimimizde + gizlilik bildirimimizde - Varsayılan tarayıcı yap + Varsayılan tarayıcı yap - Şimdi değil + Şimdi değil - Telefondan bilgisayara, bilgisayardan telefona geçin + Telefondan bilgisayara, bilgisayardan telefona geçin - Diğer cihazlarınızdaki sekmeleri ve parolaları alın, kaldığınız yerden devam edin. + Diğer cihazlarınızdaki sekmeleri ve parolaları alın, kaldığınız yerden devam edin. - Giriş yap + Giriş yap - Şimdi değil + Şimdi değil - Bildirimler sayesinde %s ile daha fazlasını yapın + Bildirimler sayesinde %s ile daha fazlasını yapın Bildirimler sayesinde Firefox ile daha fazlasını yapın - Sekmelerinizi cihazdan cihaza gönderin, indirmelerinizi yönetin ve %s ile ilgili ipuçları alın. + Sekmelerinizi cihazdan cihaza gönderin, indirmelerinizi yönetin ve %s ile ilgili ipuçları alın. Sekmelerinizi cihazdan cihaza gönderin, indirmelerinizi yönetin ve Firefox ile ilgili ipuçları alın. - Bildirimleri aç + Bildirimleri aç - Şimdi değil + Şimdi değil @@ -545,6 +545,8 @@ Asla Harici indirme yöneticisi + + Gecko günlük kaydını etkinleştir Değişiklikleri uygulamak için uygulamadan çıkılıyor… @@ -1204,8 +1206,10 @@ Paylaş PDF olarak kaydet - + PDF oluşturulamadı + + Kapat Yazdırılamadı diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 32b81085a..779c5d436 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -303,10 +303,10 @@ Не зараз - + - Зробіть %s своїм щоденним браузером + Зробіть %s своїм щоденним браузером @@ -314,42 +314,42 @@ - %1$s цінує людей понад прибуток і захищає вашу приватність, блокуючи стеження між сайтами.\n\nДізнайтеся більше у нашій %2$s. + %1$s цінує людей понад прибуток і захищає вашу приватність, блокуючи стеження між сайтами.\n\nДізнайтеся більше у нашій %2$s. Firefox цінує людей понад прибуток і захищає вашу приватність, блокуючи стеження між сайтами.\n\nДізнайтеся більше у нашому положенні про приватність. - політиці приватності + політиці приватності - Встановити типовим браузером + Встановити типовим браузером - Не зараз + Не зараз - Перемикайтеся між телефоном і комп’ютером + Перемикайтеся між телефоном і комп’ютером - Продовжуйте роботу зі своїми вкладками та паролями з інших пристроїв. + Продовжуйте роботу зі своїми вкладками та паролями з інших пристроїв. - Увійти + Увійти - Не зараз + Не зараз - Сповіщення допомагають вам ефективніше взаємодіяти з %s + Сповіщення допомагають вам ефективніше взаємодіяти з %s Сповіщення допомагають вам ефективніше взаємодіяти з Firefox - Надсилайте вкладки на інші пристрої, керуйте завантаженнями, а також отримуйте поради про можливості %s. + Надсилайте вкладки на інші пристрої, керуйте завантаженнями, а також отримуйте поради про можливості %s. Надсилайте вкладки на інші пристрої, керуйте завантаженнями, а також отримуйте поради про можливості Firefox. - Увімкнути сповіщення + Увімкнути сповіщення - Не зараз + Не зараз @@ -1213,8 +1213,10 @@ Поділитися Зберегти як PDF - + Неможливо створити PDF + + Відхилити Не вдалося надрукувати From e2b6ff072a0a49173bf314bc7423656ce263ecc7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 23 Jul 2023 00:03:45 +0000 Subject: [PATCH 125/207] Import translations from android-l10n --- app/src/main/res/values-sk/strings.xml | 32 +++++---- app/src/main/res/values-su/strings.xml | 83 +++++++++++++++++++++- app/src/main/res/values-zh-rCN/strings.xml | 32 +++++---- 3 files changed, 115 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 73f5088be..b0c7b1315 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -305,51 +305,51 @@ Teraz nie - + - Nastavte si %s ako svoj predvolený prehliadač + Nastavte si %s ako svoj predvolený prehliadač Nastavte si Firefox ako svoj obľúbený prehliadač - %1$s uprednostňuje ľudí pred ziskami a chráni vaše súkromie blokovaním nástrojov tretích strán na sledovanie na stránkach.\n\nĎalšie informácie nájdete v našom %2$s. + %1$s uprednostňuje ľudí pred ziskami a chráni vaše súkromie blokovaním nástrojov tretích strán na sledovanie na stránkach.\n\nĎalšie informácie nájdete v našom %2$s. Firefox upredňostňuje ľudí pred ziskami a chráni vaše súkromie blokovaním sledovacích prvkov tretích strán.\n\nĎalšie informácie nájdete v našom Vyhlásení o ochrane osobných údajov. - Vyhlásení o ochrane osobných údajov + Vyhlásení o ochrane osobných údajov - Nastaviť ako predvolený prehliadač + Nastaviť ako predvolený prehliadač - Teraz nie + Teraz nie - Preskočte z telefónu na laptop a späť + Preskočte z telefónu na laptop a späť - Vezmite karty a heslá z ostatných zariadení a pokračujte tam, kde ste prestali. + Vezmite karty a heslá z ostatných zariadení a pokračujte tam, kde ste prestali. - Prihlásiť sa + Prihlásiť sa - Teraz nie + Teraz nie - Upozornenia vám pomôžu vyťažiť z prehliadača %s ešte viac + Upozornenia vám pomôžu vyťažiť z prehliadača %s ešte viac Upozornenia vám pomôžu vyťažiť z prehliadača Firefox ešte viac - Posielajte karty medzi zariadeniami, spravujte sťahovanie súborov a získajte tipy, ako prehliadač %s využiť čo najlepšie. + Posielajte karty medzi zariadeniami, spravujte sťahovanie súborov a získajte tipy, ako prehliadač %s využiť čo najlepšie. Posielajte karty medzi zariadeniami, spravujte sťahovanie súborov a získajte tipy, ako prehliadač Firefox využiť čo najlepšie. - Zapnúť upozornenia + Zapnúť upozornenia - Teraz nie + Teraz nie @@ -1213,8 +1213,10 @@ Zdieľať Uložiť ako PDF - + Nedá sa vygenerovať PDF + + Zavrieť Chyba tlače diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index f78e05dd8..853b5bb8f 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -289,11 +289,32 @@ Tutup + + + Iber mantuan anjeun barang gawé jeung %s + + Singkronkeun tab antarpiranti anjeun, kokolakeun undeuran, baca cara nyieun panyalindungan pripasi %s, jst. Tuluykeun Moal waka + + + Jadikeun %s panyungsi ider anjeun + + Jadikeun Firefox panyungsi ider anjeun + + %1$s mernahkeun jalma luhureun kauntungan sarta mélaan pripasi anjeun ku cara meungpeuk palacak meuntas-loka.\n\nLenyepan di %2$s. + + Firefox mernahkeun jalma luhureun kauntungan sarta mélaan pripasi anjeun ku cara meungpeuk palacak meuntas-loka.\n\nLenyepan dina wawar pripasi. wawar pripasi @@ -309,6 +330,18 @@ Asup Moal waka + + Iber mantuan anjeun barang gawé jeung %s + + Iber mantuan anjeun barang gawé jeung Firefox + + Kirim tab antarpiranti, atur undeuran, baca cara ngadayagunakeun %s. + + Kirim tab antarpiranti, atur undeuran, baca cara ngadayagunakeun Firefox. Hurungkeun iber @@ -379,6 +412,8 @@ Hurung + + %1$s otomatis nyoba nolak rekés réréméh dina spanduk réréméh. Pareum jang ieu loka @@ -396,13 +431,23 @@ Rekés dukungan dikirim + + Kiwari loka teu didukung Hurungkeun Reduksi spanduk réréméh pikeun %1$s? Pareuman Reduksi spanduk réréméh pikeun %1$s? + + %1$s nyoba sacara otomatis nolak sakur rekés réréméh di loka anu didukung. + + Idinan %1$s nampik spanduk réréméh? + + %1$s bisa otomatis nampik loba rekés spanduk réréméh. Moal Waka + + Anjeun bakal leuwih saeutik nempo rekés réréméh Idinan @@ -494,6 +539,11 @@ Manajer undeuran éksternal + + Aktipkeun log Gecko + + Ninggalkeun aplikasi pikeun nerapkeun parobahan… + Émbohan @@ -798,6 +848,9 @@ Buka dina tab panungtung + + Buka dina tepaskaca sanggeus opat jam + Pindahkeun tab heubeul ka nganggur @@ -1153,8 +1206,10 @@ Bagikeun Simpen salaku PDF - + Teu bisa nyieun PDF + + Tutup Teu bisa nyitak @@ -1216,9 +1271,19 @@ Kotéktak tanpa tapak + + Nyungsi nyamuni dina %1$s moal neundeun iber anjeun. Mitembeyan maluruh + + Balangsiar di nu deukeut. Atawa manggihan nu pikaresepeun. + + + + Bantuan Firefox sangkan leuwih hadé ku miluan surpéy pondok. Eusi Surpéy @@ -1320,6 +1385,8 @@ Rentang waktu pikeun mupus Mupus jujutan (kaasup jujutan anu disingkronkeun ti séjén parabot), réréméh, jeung data nyungsi lianna. + + Ngahapus jujutan (kaasup jujutan anu disingkronkeun tina séjén piranti) Jam panungtung @@ -1367,6 +1434,8 @@ Salindung pripasi sacara baku + + %1$s otomatis megat maskapé rerencepan nunutur anjeun ngalanglang raramat. Miturkeun Total Cookie Protection pikeun ngeureunkeun palacak tina maké réréméh pikeun ngintip anjeun meuntas loka. @@ -1442,10 +1511,14 @@ Setélan Kilung Protéksi Palacakan Tingkat Lanjut + + %s ngajaga anjeun ti kalolobaan palacak anu nunutur lalampahan anjeun jero jaringan. Lenyepan Baku (bawaan) + + Kaca loka bakal muka sakumaha biasa, ngan meungpeuk leuwih saeutik palacak. Naon anu dipeungpeuk ku perlindungan pelacakan baku @@ -1825,8 +1898,12 @@ Ngaran Ngaran mesin pamaluruh + + URL string pamaluruhan Paluruh string pakéeun + + URL pikeun maluruh Ganti kueri ku “%s”. Conto:\nhttps://www.google.com/search?q=%s @@ -2056,4 +2133,6 @@ buka tutumbu pikeun leuwih teleb ngeunaan ieu koléksi baca artikel - + + buka tutumbu pikeun ngalenyepan + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d2634a65c..93149d1b5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -309,51 +309,51 @@ 暂时不要 - + - 将 %s 设为主力浏览器。 + 将 %s 设为主力浏览器。 将 Firefox 设为主力浏览器 - %1$s 始终以人为本,并通过拦截跨站跟踪器等机制保护您的隐私。\n\n可阅读我们的%2$s详细了解 + %1$s 始终以人为本,并通过拦截跨站跟踪器等机制保护您的隐私。\n\n可阅读我们的%2$s详细了解 Firefox 始终以人为本,并通过拦截跨站跟踪器等机制保护您的隐私。\n\n可阅读我们的隐私声明详细了解 - 隐私声明 + 隐私声明 - 设为默认浏览器 + 设为默认浏览器 - 暂时不要 + 暂时不要 - 全平台快速切换 + 全平台快速切换 - 同步您其他设备上的标签页和密码,从中断的地方继续浏览。 + 同步您其他设备上的标签页和密码,从中断的地方继续浏览。 - 登录 + 登录 - 暂时不要 + 暂时不要 - 允许通知可以让 %s 更贴心好用 + 允许通知可以让 %s 更贴心好用 允许通知可以让 Firefox 更贴心好用 - 在设备之间传输标签页、管理下载,解锁 %s 完整体验。 + 在设备之间传输标签页、管理下载,解锁 %s 完整体验。 在设备之间传输标签页、管理下载,解锁 Firefox 完整体验。 - 开启通知 + 开启通知 - 暂时不要 + 暂时不要 @@ -1239,8 +1239,10 @@ 分享 保存为 PDF - + 无法生成 PDF + + 消除 无法打印 From 978e1bc4fe1d7f5bd54625070077044d71818a1a Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 24 Jul 2023 00:03:37 +0000 Subject: [PATCH 126/207] Import translations from android-l10n --- app/src/main/res/values-cs/strings.xml | 53 +++++++++------------- app/src/main/res/values-nb-rNO/strings.xml | 4 +- app/src/main/res/values-nn-rNO/strings.xml | 4 +- app/src/main/res/values-sat/strings.xml | 4 +- app/src/main/res/values-vi/strings.xml | 32 +++++++------ 5 files changed, 48 insertions(+), 49 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index efd5e3b8b..16fa59bcb 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -305,51 +305,51 @@ Teď ne - + - Používejte aplikaci %s jako svůj hlavní prohlížeč + Používejte aplikaci %s jako svůj hlavní prohlížeč Používejte Firefox jako svůj hlavní prohlížeč - %1$s upřednostňuje lidi před ziskem a chrání vaše soukromí blokováním cross-site sledovacích prvků.\n\nZjistěte více v našich %2$s. + %1$s upřednostňuje lidi před ziskem a chrání vaše soukromí blokováním cross-site sledovacích prvků.\n\nZjistěte více v našich %2$s. Firefox upřednostňuje lidi před ziskem a chrání vaše soukromí blokováním cross-site sledovacích prvků.\n\nZjistěte více v našich zásadách ochrany osobních údajů. - zásadách ochrany osobních údajů + zásadách ochrany osobních údajů - Nastavit jako výchozí prohlížeč + Nastavit jako výchozí prohlížeč - Teď ne + Teď ne - Přeskočte z telefonu na notebook a zpět + Přeskočte z telefonu na notebook a zpět - Získejte panely a hesla z ostatních zařízení a pokračujte tam, kde jste skončili. + Získejte panely a hesla z ostatních zařízení a pokračujte tam, kde jste skončili. - Přihlásit se + Přihlásit se - Teď ne + Teď ne - Oznámení vám pomohou s aplikací %s udělat více + Oznámení vám pomohou s aplikací %s udělat více Oznámení vám pomohou s Firefoxem udělat více - Posílejte si panely mezi zařízeními, spravujte stahování a získejte tipy, jak co nejlépe využít aplikaci %s. + Posílejte si panely mezi zařízeními, spravujte stahování a získejte tipy, jak co nejlépe využít aplikaci %s. Posílejte si panely mezi zařízeními, spravujte stahování a získejte tipy, jak co nejlépe Firefox využít. - Zapnout oznámení + Zapnout oznámení - Teď ne + Teď ne @@ -428,18 +428,12 @@ Poslat žádost - Omezení cookie lišt - Požádat o podporu této stránky? - Žádost o přidání podpory tohoto serveru byla odeslána. - Žádost byla odeslána Zapnuto pro tento web - Žádost o přidání podpory tohoto serveru odeslána - Žádost o podporu byla odeslána Server není aktuálně podporován @@ -447,8 +441,6 @@ Chcete zapnout omezení cookie lišt pro %1$s? Chcete vypnout omezení cookie lišt pro %1$s? - - Na tomto webu v tuto chvíli není omezení cookie lišt podporováno. Chcete, aby náš tým tuto stránku zkontroloval za účelem budoucího přidání podpory? %1$s nemůže pro tuto stránku automaticky blokovat lištu s žádostí ohledně souborů cookie. Můžete však poslat žádost o podporu této stránky do budoucna. @@ -553,6 +545,11 @@ Nikdy Externí správce stahování + + Povolit protokol jádra Gecko + + Ukončování aplikace pro použití změn… + Doplňky @@ -1218,8 +1215,10 @@ Sdílet Uložit jako PDF - + PDF se nepodařilo vygenerovat + + Zavřít Nelze tisknout @@ -1517,12 +1516,8 @@ Nastavení ochrany Rozšířená ochrana proti sledování - - Nenechte se sledovat při prohlížení Nyní s funkcí úplné ochrany před cookies, dosud nejsilnější bariéry proti cross-site sledovacím prvkům. - - %s vás chrání před nejběžnějšími sledovacími prvky, které sbírají informace o tom, co děláte na internetu. %s vás chrání před nejběžnějšími sledovacími prvky, které sbírají informace o tom, co děláte na internetu. @@ -1530,16 +1525,12 @@ Standardní (výchozí) - Vyvážené soukromí a výkon. Neovlivní správné načítání webových stránek. - Stránky se načítají normálně s výjimkou některých sledovacích prvků. Co blokuje běžné nastavení ochrany proti sledování Přísná - Blokuje více sledovacích prvků. Zrychlí i načítání stránek, ale může omezit jejich fungování. - Silnější ochrana, která zlepšuje rychlost načítání stránek. Může ale omezit jejich fungování. Co blokuje přísné nastavení ochrany proti sledování diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 73dfc304d..44ad85ae8 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1207,8 +1207,10 @@ Del Lagre som PDF - + Klarte ikke å generere PDF + + Ignorer Kan ikke å skrive ut diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 747e647ec..9ec0134bf 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -1213,8 +1213,10 @@ Del Lagre som PDF - + Klarte ikkje å generere PDF + + Ignorer Klarte ikkje å skrive ut diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 7d8431393..8e8fddb83 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -1210,8 +1210,10 @@ PDF ᱞᱮᱠᱷᱟ ᱥᱟᱺᱪᱟᱣ ᱢᱮ - + PDF ᱛᱮᱭᱟᱨ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ + + ᱵᱚᱸᱫ ᱪᱷᱟᱯᱟ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index d74e339fd..8b381a042 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -300,51 +300,51 @@ Không phải bây giờ - + - Đặt %s làm trình duyệt mặc định của bạn + Đặt %s làm trình duyệt mặc định của bạn Đặt Firefox làm trình duyệt của bạn - %1$s đặt mọi người lên trên lợi nhuận và bảo vệ quyền riêng tư của bạn bằng cách chặn các trình theo dõi trên nhiều trang web.\n\nTìm hiểu thêm trong %2$s của chúng tôi. + %1$s đặt mọi người lên trên lợi nhuận và bảo vệ quyền riêng tư của bạn bằng cách chặn các trình theo dõi trên nhiều trang web.\n\nTìm hiểu thêm trong %2$s của chúng tôi. Firefox đặt mọi người lên trên lợi nhuận và bảo vệ quyền riêng tư của bạn bằng cách chặn các trình theo dõi trên nhiều trang web.\n\nTìm hiểu thêm trong thông báo về quyền riêng tư của chúng tôi. - thông báo bảo mật + thông báo bảo mật - Đặt làm trình duyệt mặc định + Đặt làm trình duyệt mặc định - Không phải bây giờ + Không phải bây giờ - Chuyển từ điện thoại sang máy tính xách tay và ngược lại + Chuyển từ điện thoại sang máy tính xách tay và ngược lại - Lấy các thẻ và mật khẩu từ các thiết bị khác của bạn để tiếp tục nơi bạn đã dừng lại. + Lấy các thẻ và mật khẩu từ các thiết bị khác của bạn để tiếp tục nơi bạn đã dừng lại. - Đăng nhập + Đăng nhập - Không phải bây giờ + Không phải bây giờ - Thông báo giúp bạn làm được nhiều việc hơn với %s + Thông báo giúp bạn làm được nhiều việc hơn với %s Thông báo giúp bạn làm được nhiều việc hơn với Firefox - Gửi các thẻ giữa các thiết bị, quản lý tải xuống và nhận các mẹo để tận dụng tối đa %s. + Gửi các thẻ giữa các thiết bị, quản lý tải xuống và nhận các mẹo để tận dụng tối đa %s. Gửi các thẻ giữa các thiết bị, quản lý tải xuống và nhận các mẹo để tận dụng tối đa Firefox. - Bật thông báo + Bật thông báo - Không phải bây giờ + Không phải bây giờ @@ -1198,8 +1198,10 @@ Chia sẻ Lưu dưới dạng PDF - + Không thể tạo PDF + + Bỏ qua Không thể in From 95c54fba5b5958d7cc1dae3b991132a48be8b937 Mon Sep 17 00:00:00 2001 From: t-p-white Date: Fri, 21 Jul 2023 16:40:42 +0100 Subject: [PATCH 127/207] Bug 1844804 - If wallpaper has already been changed don't show the Wallpaper prompt --- .../fenix/settings/wallpaper/WallpaperSettingsFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt index 4bff3b615..f2b3ae444 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt @@ -24,6 +24,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.wallpapers.Wallpaper @@ -68,6 +69,7 @@ class WallpaperSettingsFragment : Fragment() { val result = wallpaperUseCases.selectWallpaper(it) onWallpaperSelected(it, result, requireView()) } + context.settings().showWallpaperOnboarding = false } }, onLearnMoreClick = { url, collectionName -> From 29717911d6afc9d1102c6b14e969082b7a0ef36e Mon Sep 17 00:00:00 2001 From: t-p-white Date: Fri, 21 Jul 2023 17:17:19 +0100 Subject: [PATCH 128/207] Bug 1844804 - If wallpaper has already been changed don't show the Wallpaper prompt --- .../fenix/settings/wallpaper/WallpaperSettingsFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt index f2b3ae444..0b330cf22 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt @@ -69,7 +69,6 @@ class WallpaperSettingsFragment : Fragment() { val result = wallpaperUseCases.selectWallpaper(it) onWallpaperSelected(it, result, requireView()) } - context.settings().showWallpaperOnboarding = false } }, onLearnMoreClick = { url, collectionName -> @@ -139,6 +138,8 @@ class WallpaperSettingsFragment : Fragment() { } else -> { /* noop */ } } + + view.context.settings().showWallpaperOnboarding = false } override fun onResume() { From a187a6c8b7b2d96564bc3123fe3cbfaabe6298b8 Mon Sep 17 00:00:00 2001 From: DreVla Date: Mon, 17 Jul 2023 15:29:56 +0300 Subject: [PATCH 129/207] Bug 1836351 - Decrease close button size for `TabGridItem` The close button in `TabGridItem` is now 20 instead of 24. --- .../fenix/compose/tabstray/TabGridItem.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt index 335aeec56..050f21ba4 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.isSystemInDarkTheme @@ -32,6 +31,7 @@ import androidx.compose.material.Card import androidx.compose.material.DismissValue import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon +import androidx.compose.material.IconButton import androidx.compose.material.Text import androidx.compose.material.rememberDismissState import androidx.compose.material.ripple.rememberRipple @@ -204,16 +204,21 @@ fun TabGridItem( } if (!multiSelectionEnabled) { - Icon( - painter = painterResource(id = R.drawable.mozac_ic_cross_24), - contentDescription = stringResource(id = R.string.close_tab), - tint = FirefoxTheme.colors.iconPrimary, + IconButton( modifier = Modifier - .clickable { onCloseClick(tab) } .size(24.dp) .align(Alignment.CenterVertically) .testTag(TabsTrayTestTag.tabItemClose), - ) + onClick = { + onCloseClick(tab) + }, + ) { + Icon( + painter = painterResource(id = R.drawable.mozac_ic_cross_20), + contentDescription = stringResource(id = R.string.close_tab), + tint = FirefoxTheme.colors.iconPrimary, + ) + } } } From b91a728a67086412172dc93ca49f8515269a9f71 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 20 Jul 2023 15:16:59 +0300 Subject: [PATCH 130/207] Bug 1816066 - Re-enable verifyMultipleLoginsSelectionsTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt index 21b24b8cd..5cbbb7f17 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt @@ -242,7 +242,6 @@ class LoginsTest { } } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1816066") @SmokeTest @Test fun verifyMultipleLoginsSelectionsTest() { From 21068e8bb3a8b294624544033c4c1db2cad898c6 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Wed, 19 Jul 2023 15:33:50 +0200 Subject: [PATCH 131/207] Bug 1840332 - Add ReviewGradeCard --- .../shopping/ui/ReviewQualityCheckCards.kt | 162 ++++++++++++++++++ .../shopping/ui/ReviewQualityCheckContent.kt | 26 +++ app/src/main/res/values/static_strings.xml | 1 + 3 files changed, 189 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt new file mode 100644 index 000000000..9f8e109c4 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckCards.kt @@ -0,0 +1,162 @@ +/* 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.shopping.ui + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Card +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +private val cardShape = RoundedCornerShape(8.dp) +private val defaultCardElevation = 5.dp +private val defaultCardContentPadding = 16.dp + +/** + * A card container for review quality check UI that can be expanded and collapsed. + * + * @param title The title of the card. + * @param modifier Modifier to be applied to the card. + * @param content The content of the card. + */ +@Composable +fun ReviewQualityCheckExpandableCard( + title: String, + modifier: Modifier = Modifier, + content: @Composable () -> Unit, +) { + ReviewQualityCheckCard( + modifier = modifier, + contentPadding = 0.dp, + ) { + var isExpanded by remember { mutableStateOf(false) } + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .clickable { + isExpanded = isExpanded.not() + } + .padding(defaultCardContentPadding), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = title, + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline8, + ) + + val chevronDrawable = if (isExpanded) { + R.drawable.mozac_ic_chevron_up_20 + } else { + R.drawable.mozac_ic_chevron_down_20 + } + + Icon( + painter = painterResource(id = chevronDrawable), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + } + + AnimatedVisibility(visible = isExpanded) { + Box( + modifier = Modifier.padding( + start = defaultCardContentPadding, + end = defaultCardContentPadding, + bottom = defaultCardContentPadding, + ), + ) { + content() + } + } + } +} + +/** + * A card container for review quality check UI. + * + * @param modifier Modifier to be applied to the card. + * @param backgroundColor The background color of the card. + * @param elevation The elevation of the card. + * @param content The content of the card. + */ +@Composable +fun ReviewQualityCheckCard( + modifier: Modifier, + backgroundColor: Color = FirefoxTheme.colors.layer2, + elevation: Dp = defaultCardElevation, + contentPadding: Dp = defaultCardContentPadding, + content: @Composable ColumnScope.() -> Unit, +) { + Card( + shape = cardShape, + backgroundColor = backgroundColor, + elevation = elevation, + modifier = modifier, + ) { + Column( + modifier = Modifier.padding(contentPadding), + ) { + content() + } + } +} + +@LightDarkPreview +@Composable +private fun ReviewQualityCheckCardPreview() { + FirefoxTheme { + Column(modifier = Modifier.padding(16.dp)) { + ReviewQualityCheckCard( + modifier = Modifier.fillMaxWidth(), + ) { + Text( + text = "Review Quality Check Card Content", + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline8, + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + + ReviewQualityCheckExpandableCard( + title = "Review Quality Check Expandable Card", + modifier = Modifier.fillMaxWidth(), + ) { + Text( + text = "content", + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.body2, + ) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt index 78663ad03..05bb3bfeb 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckContent.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.unit.dp import org.mozilla.fenix.R import org.mozilla.fenix.compose.BottomSheetHandle import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.shopping.state.ReviewQualityCheckState import org.mozilla.fenix.theme.FirefoxTheme private val bottomSheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp) @@ -65,6 +66,13 @@ fun ReviewQualityCheckContent( Header() Spacer(modifier = Modifier.height(16.dp)) + + ReviewGradeCard( + modifier = Modifier.fillMaxWidth(), + reviewGrade = ReviewQualityCheckState.Grade.B, + ) + + Spacer(modifier = Modifier.height(16.dp)) } } @@ -90,6 +98,24 @@ private fun Header() { } } +@Composable +private fun ReviewGradeCard( + reviewGrade: ReviewQualityCheckState.Grade, + modifier: Modifier = Modifier, +) { + ReviewQualityCheckCard(modifier = modifier.semantics(mergeDescendants = true) {}) { + Text( + text = stringResource(R.string.review_quality_check_grade_title), + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline8, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + ReviewGradeExpanded(grade = reviewGrade) + } +} + @Composable @LightDarkPreview private fun ReviewQualityCheckContentPreview() { diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 3a06998b3..fc892bd38 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -119,4 +119,5 @@ Only some reliable reviews Unreliable reviews %1$s out of 5 stars + How reliable are the reviews? From e1a84285da0faec7bb3c4c004afcae3191363a90 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Tue, 18 Jul 2023 14:32:09 +0200 Subject: [PATCH 132/207] Bug 1843029 - Add preferences for shopping experience --- .../state/ReviewQualityCheckAction.kt | 46 +++++- .../state/ReviewQualityCheckPreferences.kt | 61 ++++++++ ...ReviewQualityCheckPreferencesMiddleware.kt | 93 ++++++++++++ .../shopping/state/ReviewQualityCheckStore.kt | 64 ++++++++- .../java/org/mozilla/fenix/utils/Settings.kt | 16 +++ app/src/main/res/values/preference_keys.xml | 4 + .../state/ReviewQualityCheckStoreTest.kt | 132 ++++++++++++++++++ 7 files changed, 412 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferences.kt create mode 100644 app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferencesMiddleware.kt create mode 100644 app/src/test/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStoreTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt index 30b57a109..ca7978a6d 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckAction.kt @@ -9,4 +9,48 @@ import mozilla.components.lib.state.Action /** * Actions for review quality check feature. */ -sealed interface ReviewQualityCheckAction : Action +sealed interface ReviewQualityCheckAction : Action { + + /** + * Actions that are observed by middlewares. + */ + sealed interface MiddlewareAction : ReviewQualityCheckAction + + /** + * Actions that cause updates to state. + */ + sealed interface UpdateAction : ReviewQualityCheckAction + + /** + * Actions related to preferences. + */ + sealed interface PreferencesMiddlewareAction : MiddlewareAction + + /** + * Triggered when the store is initialized. + */ + object Init : PreferencesMiddlewareAction + + /** + * Triggered when the user has opted in to the review quality check feature. + */ + object OptIn : PreferencesMiddlewareAction + + /** + * Triggered when the user has opted out of the review quality check feature. + */ + object OptOut : PreferencesMiddlewareAction, UpdateAction + + /** + * Triggered when the user has enabled or disabled product recommendations. + */ + object ToggleProductRecommendation : PreferencesMiddlewareAction, UpdateAction + + /** + * Triggered as a result of a [PreferencesMiddlewareAction] to update the state. + */ + data class UpdateUserPreferences( + val hasUserOptedIn: Boolean, + val isProductRecommendationsEnabled: Boolean, + ) : UpdateAction +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferences.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferences.kt new file mode 100644 index 000000000..1726faf25 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferences.kt @@ -0,0 +1,61 @@ +/* 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.shopping.state + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.mozilla.fenix.utils.Settings + +/** + * Interface to get and set preferences for the review quality check feature. + */ +interface ReviewQualityCheckPreferences { + /** + * Returns true if the user has opted in to the review quality check feature. + */ + suspend fun enabled(): Boolean + + /** + * Returns true if the user has enabled product recommendations. + */ + suspend fun productRecommendationsEnabled(): Boolean + + /** + * Sets whether the user has opted in to the review quality check feature. + */ + suspend fun setEnabled(isEnabled: Boolean) + + /** + * Sets whether the user has enabled product recommendations. + */ + suspend fun setProductRecommendationsEnabled(isEnabled: Boolean) +} + +/** + * Implementation of [ReviewQualityCheckPreferences] that uses [Settings] to store/fetch + * preferences. + * + * @param settings The [Settings] instance to use. + */ +class ReviewQualityCheckPreferencesImpl( + private val settings: Settings, +) : ReviewQualityCheckPreferences { + + override suspend fun enabled(): Boolean = withContext(Dispatchers.IO) { + settings.isReviewQualityCheckEnabled + } + + override suspend fun productRecommendationsEnabled(): Boolean = withContext(Dispatchers.IO) { + settings.isReviewQualityCheckProductRecommendationsEnabled + } + + override suspend fun setEnabled(isEnabled: Boolean) { + settings.isReviewQualityCheckEnabled = isEnabled + } + + override suspend fun setProductRecommendationsEnabled(isEnabled: Boolean) { + settings.isReviewQualityCheckProductRecommendationsEnabled = isEnabled + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferencesMiddleware.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferencesMiddleware.kt new file mode 100644 index 000000000..f7f367662 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckPreferencesMiddleware.kt @@ -0,0 +1,93 @@ +/* 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.shopping.state + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import mozilla.components.lib.state.Middleware +import mozilla.components.lib.state.MiddlewareContext +import mozilla.components.lib.state.Store + +/** + * Middleware for getting and setting review quality check user preferences. + * + * @param reviewQualityCheckPreferences The [ReviewQualityCheckPreferences] instance to use. + * @param scope The [CoroutineScope] to use for launching coroutines. + */ +class ReviewQualityCheckPreferencesMiddleware( + private val reviewQualityCheckPreferences: ReviewQualityCheckPreferences, + private val scope: CoroutineScope, +) : Middleware { + + override fun invoke( + context: MiddlewareContext, + next: (ReviewQualityCheckAction) -> Unit, + action: ReviewQualityCheckAction, + ) { + when (action) { + is ReviewQualityCheckAction.PreferencesMiddlewareAction -> { + processAction(context.store, action) + } + + else -> { + // no-op + } + } + // Forward the actions + next(action) + } + + private fun processAction( + store: Store, + action: ReviewQualityCheckAction.PreferencesMiddlewareAction, + ) { + when (action) { + is ReviewQualityCheckAction.Init -> { + scope.launch { + val hasUserOptedIn = reviewQualityCheckPreferences.enabled() + val isProductRecommendationsEnabled = + reviewQualityCheckPreferences.productRecommendationsEnabled() + store.dispatch( + ReviewQualityCheckAction.UpdateUserPreferences( + hasUserOptedIn = hasUserOptedIn, + isProductRecommendationsEnabled = isProductRecommendationsEnabled, + ), + ) + } + } + + ReviewQualityCheckAction.OptIn -> { + scope.launch { + val isProductRecommendationsEnabled = + reviewQualityCheckPreferences.productRecommendationsEnabled() + store.dispatch( + ReviewQualityCheckAction.UpdateUserPreferences( + hasUserOptedIn = true, + isProductRecommendationsEnabled = isProductRecommendationsEnabled, + ), + ) + + // Update the preference + reviewQualityCheckPreferences.setEnabled(true) + } + } + + ReviewQualityCheckAction.OptOut -> { + scope.launch { + // Update the preference + reviewQualityCheckPreferences.setEnabled(false) + } + } + + ReviewQualityCheckAction.ToggleProductRecommendation -> { + scope.launch { + reviewQualityCheckPreferences.setProductRecommendationsEnabled( + !reviewQualityCheckPreferences.productRecommendationsEnabled(), + ) + } + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt index aab0d57ee..bf9f26e62 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStore.kt @@ -4,12 +4,70 @@ package org.mozilla.fenix.shopping.state +import kotlinx.coroutines.CoroutineScope import mozilla.components.lib.state.Store /** * Store for review quality check feature. + * + * @param reviewQualityCheckPreferences The [ReviewQualityCheckPreferences] instance to use. + * @param scope The [CoroutineScope] to use for launching coroutines. */ -class ReviewQualityCheckStore : Store( +class ReviewQualityCheckStore( + reviewQualityCheckPreferences: ReviewQualityCheckPreferences, + scope: CoroutineScope, +) : Store( initialState = ReviewQualityCheckState.Initial, - reducer = { _, _ -> ReviewQualityCheckState.Initial }, -) + middleware = listOf( + ReviewQualityCheckPreferencesMiddleware(reviewQualityCheckPreferences, scope), + ), + reducer = ::reducer, +) { + init { + dispatch(ReviewQualityCheckAction.Init) + } +} + +private fun reducer( + state: ReviewQualityCheckState, + action: ReviewQualityCheckAction, +): ReviewQualityCheckState { + if (action is ReviewQualityCheckAction.UpdateAction) { + return mapStateForUpdateAction(state, action) + } + + return state +} + +private fun mapStateForUpdateAction( + state: ReviewQualityCheckState, + action: ReviewQualityCheckAction.UpdateAction, +): ReviewQualityCheckState { + when (action) { + is ReviewQualityCheckAction.UpdateUserPreferences -> { + return if (action.hasUserOptedIn) { + if (state is ReviewQualityCheckState.OptedIn) { + state.copy(productRecommendationsPreference = action.isProductRecommendationsEnabled) + } else { + ReviewQualityCheckState.OptedIn( + productRecommendationsPreference = action.isProductRecommendationsEnabled, + ) + } + } else { + ReviewQualityCheckState.NotOptedIn + } + } + + ReviewQualityCheckAction.OptOut -> { + return ReviewQualityCheckState.NotOptedIn + } + + ReviewQualityCheckAction.ToggleProductRecommendation -> { + return if (state is ReviewQualityCheckState.OptedIn) { + state.copy(productRecommendationsPreference = !state.productRecommendationsPreference) + } else { + state + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 422338c2e..a8173d5f4 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -1676,6 +1676,22 @@ class Settings(private val appContext: Context) : PreferencesHolder { } } + /** + * Indicates if the review quality check feature is enabled by the user. + */ + var isReviewQualityCheckEnabled by booleanPreference( + key = appContext.getPreferenceKey(R.string.pref_key_is_review_quality_check_enabled), + default = false, + ) + + /** + * Indicates if the review quality check product recommendations option is enabled by the user. + */ + var isReviewQualityCheckProductRecommendationsEnabled by booleanPreference( + key = appContext.getPreferenceKey(R.string.pref_key_is_review_quality_check_product_recommendations_enabled), + default = false, + ) + /** * Get the current mode for how https-only is enabled. */ diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index cdc42799f..a16d17da3 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -364,4 +364,8 @@ pref_key_notification_pre_permission_prompt_enabled pref_key_is_notification_pre_permission_prompt_shown + + + pref_key_is_review_quality_check_enabled + pref_key_is_review_quality_check_product_recommendations_enabled diff --git a/app/src/test/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStoreTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStoreTest.kt new file mode 100644 index 000000000..2c7e70abd --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/shopping/state/ReviewQualityCheckStoreTest.kt @@ -0,0 +1,132 @@ +/* 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.shopping.state + +import junit.framework.TestCase.assertEquals +import kotlinx.coroutines.test.runTest +import mozilla.components.support.test.ext.joinBlocking +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.Rule +import org.junit.Test + +class ReviewQualityCheckStoreTest { + + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + private val dispatcher = coroutinesTestRule.testDispatcher + private val scope = coroutinesTestRule.scope + + @Test + fun `GIVEN the user has not opted in the feature WHEN store is created THEN state should display not opted in UI`() = + runTest { + val tested = ReviewQualityCheckStore( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = false, + ), + scope = scope, + ) + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + + val expected = ReviewQualityCheckState.NotOptedIn + assertEquals(expected, tested.state) + } + + @Test + fun `GIVEN the user has not opted in the feature WHEN the user opts in THEN state should display opted in UI`() = + runTest { + val tested = ReviewQualityCheckStore( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = false, + isProductRecommendationsEnabled = false, + ), + scope = scope, + ) + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.OptIn).joinBlocking() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn(productRecommendationsPreference = false) + assertEquals(expected, tested.state) + } + + @Test + fun `GIVEN the user has opted in the feature WHEN the user opts out THEN state should display not opted in UI`() = + runTest { + val tested = ReviewQualityCheckStore( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = true, + isProductRecommendationsEnabled = true, + ), + scope = scope, + ) + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.OptOut).joinBlocking() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + + val expected = ReviewQualityCheckState.NotOptedIn + assertEquals(expected, tested.state) + } + + @Test + fun `GIVEN the user has opted in the feature and product recommendations are off WHEN the user turns on product recommendations THEN state should reflect that`() = + runTest { + val tested = ReviewQualityCheckStore( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = true, + isProductRecommendationsEnabled = false, + ), + scope = scope, + ) + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn(productRecommendationsPreference = true) + assertEquals(expected, tested.state) + } + + @Test + fun `GIVEN the user has opted in the feature and product recommendations are on WHEN the user turns off product recommendations THEN state should reflect that`() = + runTest { + val tested = ReviewQualityCheckStore( + reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences( + isEnabled = true, + isProductRecommendationsEnabled = true, + ), + scope = scope, + ) + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + tested.dispatch(ReviewQualityCheckAction.ToggleProductRecommendation).joinBlocking() + dispatcher.scheduler.advanceUntilIdle() + tested.waitUntilIdle() + + val expected = ReviewQualityCheckState.OptedIn(productRecommendationsPreference = false) + assertEquals(expected, tested.state) + } +} + +private class FakeReviewQualityCheckPreferences( + private val isEnabled: Boolean = false, + private val isProductRecommendationsEnabled: Boolean = false, +) : ReviewQualityCheckPreferences { + override suspend fun enabled(): Boolean = isEnabled + + override suspend fun productRecommendationsEnabled(): Boolean = isProductRecommendationsEnabled + + override suspend fun setEnabled(isEnabled: Boolean) { + } + + override suspend fun setProductRecommendationsEnabled(isEnabled: Boolean) { + } +} From 21f1eb878b7caea2337480c5c9bb4386c96b1cd5 Mon Sep 17 00:00:00 2001 From: JohanLorenzo Date: Fri, 21 Jul 2023 17:02:57 +0000 Subject: [PATCH 133/207] Update Fenix initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 68f403d9e..6ab07cb09 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -149,6 +149,63 @@ "localizations": null, "locales": null }, + { + "schemaVersion": "1.12.0", + "slug": "fx-release-android-re-engagement-notifications-114-rollout-v2", + "id": "fx-release-android-re-engagement-notifications-114-rollout-v2", + "arguments": {}, + "application": "org.mozilla.firefox", + "appName": "fenix", + "appId": "org.mozilla.firefox", + "channel": "release", + "userFacingName": "Fx Release - Android re-engagement notifications 116 rollout v2", + "userFacingDescription": "Android message for Fx 116", + "isEnrollmentPaused": false, + "isRollout": true, + "bucketConfig": { + "randomizationUnit": "nimbus_id", + "namespace": "fenix-re-engagement-notification-release-mobile_first_run-rollout-2", + "start": 0, + "count": 10000, + "total": 10000 + }, + "featureIds": [ + "re-engagement-notification" + ], + "probeSets": [], + "outcomes": [], + "branches": [ + { + "slug": "control", + "ratio": 1, + "feature": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "re-engagement-notification", + "enabled": true, + "value": { + "enabled": true, + "type": 0 + } + } + ] + } + ], + "targeting": "(app_version|versionCompare('116.*') <= 0) && ((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('116.!') >= 0)))", + "startDate": "2023-07-21", + "enrollmentEndDate": "2023-09-19", + "endDate": null, + "proposedDuration": 60, + "proposedEnrollment": 60, + "referenceBranch": "control", + "featureValidationOptOut": false, + "localizations": null, + "locales": null + }, { "schemaVersion": "1.12.0", "slug": "on-boarding-challenge-the-default", From 0d04fa3b4dac4ff049d5d123c521ded6c70c406e Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 20 Jul 2023 14:25:43 -0700 Subject: [PATCH 134/207] Bug 1844667 - Reveal Tabs Tray to Compose rewrite secret setting in Beta and Release --- .../java/org/mozilla/fenix/settings/SecretSettingsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index 4b931584e..8570984bd 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -53,7 +53,7 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { } requirePreference(R.string.pref_key_enable_tabs_tray_to_compose).apply { - isVisible = Config.channel.isNightlyOrDebug + isVisible = true isChecked = context.settings().enableTabsTrayToCompose onPreferenceChangeListener = SharedPreferenceUpdater() } From c7f1cc4f3d305908f2d9c1a5d41589b72b8b9d93 Mon Sep 17 00:00:00 2001 From: JohanLorenzo Date: Mon, 24 Jul 2023 21:32:13 +0000 Subject: [PATCH 135/207] Update Fenix initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 6ab07cb09..d3890935f 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -363,6 +363,120 @@ "featureValidationOptOut": false, "localizations": null, "locales": null + }, + { + "schemaVersion": "1.12.0", + "slug": "splash-screen-max-duration-test", + "id": "splash-screen-max-duration-test", + "arguments": {}, + "application": "org.mozilla.firefox", + "appName": "fenix", + "appId": "org.mozilla.firefox", + "channel": "release", + "userFacingName": "Splash screen max duration test", + "userFacingDescription": "Testing a splashscreen on app launch.", + "isEnrollmentPaused": false, + "isRollout": false, + "bucketConfig": { + "randomizationUnit": "nimbus_id", + "namespace": "fenix-splash-screen-release-1", + "start": 0, + "count": 10000, + "total": 10000 + }, + "featureIds": [ + "splash-screen" + ], + "probeSets": [], + "outcomes": [], + "branches": [ + { + "slug": "control", + "ratio": 1, + "feature": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "splash-screen", + "enabled": true, + "value": { + "enabled": false, + "maximum_duration_ms": 0 + } + } + ] + }, + { + "slug": "treatment-a", + "ratio": 1, + "feature": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "splash-screen", + "enabled": true, + "value": { + "enabled": true, + "maximum_duration_ms": 2500 + } + } + ] + }, + { + "slug": "treatment-b", + "ratio": 1, + "feature": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "splash-screen", + "enabled": true, + "value": { + "enabled": true, + "maximum_duration_ms": 6000 + } + } + ] + }, + { + "slug": "treatment-c", + "ratio": 1, + "feature": { + "featureId": "this-is-included-for-mobile-pre-96-support", + "enabled": false, + "value": {} + }, + "features": [ + { + "featureId": "splash-screen", + "enabled": true, + "value": { + "enabled": true, + "maximum_duration_ms": 11000 + } + } + ] + } + ], + "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('116.!') >= 0) && (region in ['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW'])))", + "startDate": "2023-07-24", + "enrollmentEndDate": "2023-08-15", + "endDate": null, + "proposedDuration": 42, + "proposedEnrollment": 14, + "referenceBranch": "control", + "featureValidationOptOut": false, + "localizations": null, + "locales": null } ] } From a5a373d2eceecaaf53fc3460f6a6520c8443bd8c Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Mon, 24 Jul 2023 14:45:33 -0400 Subject: [PATCH 136/207] Bug 1823492 - Add timespan metric for Adjust attribution --- app/metrics.yaml | 22 +++++++++++++++++++ .../metrics/AdjustMetricsService.kt | 6 +++++ .../components/metrics/FirstSessionPing.kt | 1 - 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index f00ec6f05..db76627d8 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -7256,6 +7256,28 @@ first_session: tags: - Performance - Attribution + adjust_attribution_timespan: + type: timespan + time_unit: millisecond + send_in_pings: + - first-session + - metrics + description: > + The time that it takes to derive the attribution parameters by + the Adjust SDK. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1823492 + data_reviews: + - https://github.com/mozilla-mobile/firefox-android/pull/2974 + data_sensitivity: + - technical + notification_emails: + - android-probes@mozilla.com + expires: 124 + metadata: + tags: + - Performance + - Attribution play_store_attribution: source: type: string diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt index f5eecf189..aa96ea2d2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt @@ -51,8 +51,13 @@ class AdjustMetricsService( val installationPing = FirstSessionPing(application) + FirstSession.adjustAttributionTimespan.start() val timerId = FirstSession.adjustAttributionTime.start() config.setOnAttributionChangedListener { + if (!installationPing.wasAlreadyTriggered()) { + FirstSession.adjustAttributionTimespan.stop() + } + FirstSession.adjustAttributionTime.stopAndAccumulate(timerId) if (!it.network.isNullOrEmpty()) { application.applicationContext.settings().adjustNetwork = @@ -81,6 +86,7 @@ class AdjustMetricsService( } override fun stop() { + FirstSession.adjustAttributionTimespan.cancel() Adjust.setEnabled(false) Adjust.gdprForgetMe(application.applicationContext) } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/FirstSessionPing.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/FirstSessionPing.kt index 7d1da9e35..9474ff079 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/FirstSessionPing.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/FirstSessionPing.kt @@ -35,7 +35,6 @@ class FirstSessionPing(private val context: Context) { * * @return true if it was already triggered, false otherwise. */ - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal fun wasAlreadyTriggered(): Boolean { return prefs.getBoolean("ping_sent", false) } From cb36fcffc95196f0d7a8e19b50a58f1e735610a0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 25 Jul 2023 00:03:33 +0000 Subject: [PATCH 137/207] Import translations from android-l10n --- app/src/main/res/values-eu/strings.xml | 4 ++- app/src/main/res/values-hu/strings.xml | 32 ++++++++++++---------- app/src/main/res/values-zh-rCN/strings.xml | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 05cb07c21..97ff5e77e 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -1211,8 +1211,10 @@ Partekatu Gorde PDF gisa - + Ezin da PDFa sortu + + Baztertu Ezin da inprimatu diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 05151c847..ae250b723 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -303,51 +303,51 @@ Most nem - + - Legyen a %s a szokásos böngészője + Legyen a %s a szokásos böngészője Legyen a Firefox a szokásos böngészője - A(z) %1$s az embereket helyezi a profit elé, és a webhelyek közötti nyomkövetők blokkolásával védi az Ön adatait.\n\nTovábbi információk az %2$s. + A(z) %1$s az embereket helyezi a profit elé, és a webhelyek közötti nyomkövetők blokkolásával védi az Ön adatait.\n\nTovábbi információk az %2$s. A Firefox az embereket helyezi a profit elé, és a webhelyek közötti nyomkövetők blokkolásával védi az Ön adatait.\n\nTovábbi információk az adatvédelmi nyilatkozatban találhatók. - adatvédelmi nyilatkozatban + adatvédelmi nyilatkozatban - Beállítás alapértelmezett böngészőként + Beállítás alapértelmezett böngészőként - Most nem + Most nem - Váltson át a telefonról a laptopra és vissza + Váltson át a telefonról a laptopra és vissza - Vegye át a lapokat és a jelszavakat a többi eszközéről, hogy ott folytassa, ahol abbahagyta. + Vegye át a lapokat és a jelszavakat a többi eszközéről, hogy ott folytassa, ahol abbahagyta. - Bejelentkezés + Bejelentkezés - Most nem + Most nem - Az értesítések segítségével még többet tehet a %s alkalmazással + Az értesítések segítségével még többet tehet a %s alkalmazással Az értesítések segítségével még többet tehet a Firefoxszal - Küldjön lapokat az eszközök között, kezelje a letöltéseket, és kapjon tippeket arról, hogyan hozza ki a legtöbbet a %s böngészőből. + Küldjön lapokat az eszközök között, kezelje a letöltéseket, és kapjon tippeket arról, hogyan hozza ki a legtöbbet a %s böngészőből. Küldjön lapokat az eszközök között, kezelje a letöltéseket, és kapjon tippeket arról, hogyan hozza ki a legtöbbet a Firefoxból. - Értesítések bekapcsolása + Értesítések bekapcsolása - Most nem + Most nem @@ -1210,8 +1210,10 @@ Megosztás Mentés PDF-ként - + A PDF nem állítható elő + + Eltüntetés Nem lehet kinyomtatni diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 93149d1b5..03a3be457 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1242,7 +1242,7 @@ 无法生成 PDF - 消除 + 知道了 无法打印 From 039ddc5f48b4e293db28ade6c4a4529775843e61 Mon Sep 17 00:00:00 2001 From: t-p-white Date: Fri, 21 Jul 2023 12:43:34 +0100 Subject: [PATCH 138/207] Bug 1840721 - We should prefer switching to open tabs vs opening a duplicate tab --- .../org/mozilla/fenix/home/HomeFragment.kt | 2 + .../controller/RecentBookmarksController.kt | 27 +++++++-- .../DefaultRecentBookmarksControllerTest.kt | 56 ++++++++++++++++--- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index a73dfcd8a..4a6cfde8c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -371,6 +371,8 @@ class HomeFragment : Fragment() { activity = activity, navController = findNavController(), appStore = components.appStore, + browserStore = components.core.store, + selectTabUseCase = components.useCases.tabsUseCases.selectTab, ), recentVisitsController = DefaultRecentVisitsController( navController = findNavController(), diff --git a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt index 3bea45e16..502236c7b 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt @@ -6,11 +6,14 @@ package org.mozilla.fenix.home.recentbookmarks.controller import androidx.navigation.NavController import mozilla.appservices.places.BookmarkRoot +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.ALLOW_JAVASCRIPT_URL +import mozilla.components.feature.tabs.TabsUseCases import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.RecentBookmarks import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.home.HomeFragmentDirections @@ -46,15 +49,27 @@ class DefaultRecentBookmarksController( private val activity: HomeActivity, private val navController: NavController, private val appStore: AppStore, + private val browserStore: BrowserStore, + private val selectTabUseCase: TabsUseCases.SelectTabUseCase, ) : RecentBookmarksController { override fun handleBookmarkClicked(bookmark: RecentBookmark) { - activity.openToBrowserAndLoad( - searchTermOrURL = bookmark.url!!, - newTab = true, - from = BrowserDirection.FromHome, - flags = EngineSession.LoadUrlFlags.select(ALLOW_JAVASCRIPT_URL), - ) + val bookmarkTab = browserStore.state.tabs.firstOrNull { + it.content.url == bookmark.url + } + + if (bookmarkTab != null) { + selectTabUseCase.invoke(bookmarkTab.id) + navController.navigate(R.id.browserFragment) + } else { + activity.openToBrowserAndLoad( + searchTermOrURL = bookmark.url!!, + newTab = true, + from = BrowserDirection.FromHome, + flags = EngineSession.LoadUrlFlags.select(ALLOW_JAVASCRIPT_URL), + ) + } + RecentBookmarks.bookmarkClicked.add() } diff --git a/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/DefaultRecentBookmarksControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/DefaultRecentBookmarksControllerTest.kt index 3454608bd..6f03ddbf9 100644 --- a/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/DefaultRecentBookmarksControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/DefaultRecentBookmarksControllerTest.kt @@ -11,10 +11,12 @@ import io.mockk.just import io.mockk.mockk import io.mockk.spyk import io.mockk.verify -import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.appservices.places.BookmarkRoot +import mozilla.components.browser.state.state.createTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.ALLOW_JAVASCRIPT_URL +import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.runTestOnMain @@ -28,11 +30,11 @@ import org.junit.runner.RunWith import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.RecentBookmarks import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.home.HomeFragmentDirections import org.mozilla.fenix.home.recentbookmarks.controller.DefaultRecentBookmarksController -@OptIn(ExperimentalCoroutinesApi::class) @RunWith(FenixRobolectricTestRunner::class) class DefaultRecentBookmarksControllerTest { @@ -44,31 +46,53 @@ class DefaultRecentBookmarksControllerTest { private val activity: HomeActivity = mockk(relaxed = true) private val navController: NavController = mockk(relaxUnitFun = true) + private val selectTabUseCase: TabsUseCases = mockk(relaxed = true) + private val browserStore: BrowserStore = mockk(relaxed = true) private lateinit var controller: DefaultRecentBookmarksController @Before fun setup() { every { activity.openToBrowserAndLoad(any(), any(), any()) } just Runs + every { browserStore.state.tabs }.returns(emptyList()) controller = spyk( DefaultRecentBookmarksController( activity = activity, navController = navController, appStore = mockk(), + browserStore = browserStore, + selectTabUseCase = selectTabUseCase.selectTab, ), ) } @Test - fun `WHEN a recently saved bookmark is clicked THEN the selected bookmark is opened`() { + fun `GIVEN no tabs WHEN a recently saved bookmark is clicked THEN the selected bookmark is opened in a new tab`() { assertNull(RecentBookmarks.bookmarkClicked.testGetValue()) - val bookmark = RecentBookmark( - title = null, - url = "https://www.example.com", - ) + val bookmark = RecentBookmark(title = null, url = "https://www.example.com") + controller.handleBookmarkClicked(bookmark) + + verify { + activity.openToBrowserAndLoad( + searchTermOrURL = bookmark.url!!, + newTab = true, + flags = EngineSession.LoadUrlFlags.select(ALLOW_JAVASCRIPT_URL), + from = BrowserDirection.FromHome, + ) + } + assertNotNull(RecentBookmarks.bookmarkClicked.testGetValue()) + } + + @Test + fun `GIVEN no matching tabs WHEN a recently saved bookmark is clicked THEN the selected bookmark is opened in a new tab`() { + assertNull(RecentBookmarks.bookmarkClicked.testGetValue()) + val testTab = createTab("https://www.not_example.com") + every { browserStore.state.tabs }.returns(listOf(testTab)) + + val bookmark = RecentBookmark(title = null, url = "https://www.example.com") controller.handleBookmarkClicked(bookmark) verify { @@ -82,6 +106,24 @@ class DefaultRecentBookmarksControllerTest { assertNotNull(RecentBookmarks.bookmarkClicked.testGetValue()) } + @Test + fun `GIVEN matching tab WHEN a recently saved bookmark is clicked THEN the existing tab is opened`() { + assertNull(RecentBookmarks.bookmarkClicked.testGetValue()) + + val testUrl = "https://www.example.com" + val testTab = createTab(testUrl) + every { browserStore.state.tabs }.returns(listOf(testTab)) + + val bookmark = RecentBookmark(title = null, url = testUrl) + controller.handleBookmarkClicked(bookmark) + + verify { + selectTabUseCase.invoke(testTab.id) + navController.navigate(R.id.browserFragment) + } + assertNotNull(RecentBookmarks.bookmarkClicked.testGetValue()) + } + @Test fun `WHEN show all recently saved bookmark is clicked THEN the bookmarks root is opened`() = runTestOnMain { assertNull(RecentBookmarks.showAllBookmarks.testGetValue()) From fc0f3a65fac3be48b999e1e747ee054ea2ea7ae6 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 21 Jul 2023 15:44:31 +0300 Subject: [PATCH 139/207] Bug 1815650 - Fix verifyLastUsedLoginSortingOptionTest UI test --- .../java/org/mozilla/fenix/ui/LoginsTest.kt | 25 +++++++++---------- ...bMenuLoginsAndPasswordsSavedLoginsRobot.kt | 22 +++++++++------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt index 5cbbb7f17..8acd1c30e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt @@ -664,7 +664,6 @@ class LoginsTest { } } - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1815650") @Test fun verifyLastUsedLoginSortingOptionTest() { val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) @@ -691,12 +690,12 @@ class LoginsTest { clickSavedLoginsChevronIcon() verifyLoginsSortingOptions() clickLastUsedSortingOption() - verifySortedLogin(activityTestRule, 0, originWebsite) - verifySortedLogin(activityTestRule, 1, firstLoginPage.url.authority.toString()) + verifySortedLogin(0, originWebsite) + verifySortedLogin(1, firstLoginPage.url.authority.toString()) }.goBack { }.openSavedLogins { - verifySortedLogin(activityTestRule, 0, originWebsite) - verifySortedLogin(activityTestRule, 1, firstLoginPage.url.authority.toString()) + verifySortedLogin(0, originWebsite) + verifySortedLogin(1, firstLoginPage.url.authority.toString()) } restartApp(activityTestRule) @@ -706,8 +705,8 @@ class LoginsTest { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { - verifySortedLogin(activityTestRule, 0, originWebsite) - verifySortedLogin(activityTestRule, 1, firstLoginPage.url.authority.toString()) + verifySortedLogin(0, originWebsite) + verifySortedLogin(1, firstLoginPage.url.authority.toString()) } } @@ -735,12 +734,12 @@ class LoginsTest { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() - verifySortedLogin(activityTestRule, 0, firstLoginPage.url.authority.toString()) - verifySortedLogin(activityTestRule, 1, originWebsite) + verifySortedLogin(0, firstLoginPage.url.authority.toString()) + verifySortedLogin(1, originWebsite) }.goBack { }.openSavedLogins { - verifySortedLogin(activityTestRule, 0, firstLoginPage.url.authority.toString()) - verifySortedLogin(activityTestRule, 1, originWebsite) + verifySortedLogin(0, firstLoginPage.url.authority.toString()) + verifySortedLogin(1, originWebsite) } restartApp(activityTestRule) @@ -750,8 +749,8 @@ class LoginsTest { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { - verifySortedLogin(activityTestRule, 0, firstLoginPage.url.authority.toString()) - verifySortedLogin(activityTestRule, 1, originWebsite) + verifySortedLogin(0, firstLoginPage.url.authority.toString()) + verifySortedLogin(1, originWebsite) } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt index bd1cd8717..57653171e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot.kt @@ -4,8 +4,6 @@ package org.mozilla.fenix.ui.robots -import androidx.appcompat.widget.AppCompatTextView -import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.action.ViewActions @@ -19,10 +17,10 @@ import androidx.test.espresso.matcher.ViewMatchers.withHint import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers.containsString -import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.R @@ -110,12 +108,18 @@ class SettingsSubMenuLoginsAndPasswordsSavedLoginsRobot { fun clickLastUsedSortingOption() = itemContainingText(getStringResource(R.string.saved_logins_sort_strategy_last_used)).click() - fun verifySortedLogin(testRule: HomeActivityIntentTestRule, position: Int, loginTitle: String) { - val list = testRule.activity.findViewById(R.id.saved_logins_list) - val item = list.layoutManager?.findViewByPosition(position) - val title = item?.findViewById(R.id.webAddressView) - assertEquals(loginTitle, title?.text) - } + fun verifySortedLogin(position: Int, loginTitle: String) = + assertTrue( + mDevice.findObject( + UiSelector() + .className("android.view.ViewGroup") + .index(position), + ).getChild( + UiSelector() + .resourceId("$packageName:id/webAddressView") + .textContains(loginTitle), + ).waitForExists(waitingTime), + ) fun searchLogin(searchTerm: String) = itemContainingText(getStringResource(R.string.preferences_passwords_saved_logins_search)).setText(searchTerm) From b0c0b57032b94e2e8d25826a4790ec6eb1cc529b Mon Sep 17 00:00:00 2001 From: mike a Date: Tue, 18 Jul 2023 19:16:20 +0900 Subject: [PATCH 140/207] =?UTF-8?q?Bug=201843244=20=E2=80=93=C2=A0fixed=20?= =?UTF-8?q?notch=20background=20color?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values-night-v27/styles.xml | 13 +++++++++++++ app/src/main/res/values-v23/styles.xml | 2 +- app/src/main/res/values-v24/styles.xml | 2 -- app/src/main/res/values-v27/styles.xml | 9 +++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/values-night-v27/styles.xml diff --git a/app/src/main/res/values-night-v27/styles.xml b/app/src/main/res/values-night-v27/styles.xml new file mode 100644 index 000000000..ce769d9e9 --- /dev/null +++ b/app/src/main/res/values-night-v27/styles.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml index 69ae406ce..6e7879ba0 100644 --- a/app/src/main/res/values-v23/styles.xml +++ b/app/src/main/res/values-v23/styles.xml @@ -20,4 +20,4 @@ ?attr/layer1 - \ No newline at end of file + diff --git a/app/src/main/res/values-v24/styles.xml b/app/src/main/res/values-v24/styles.xml index 563556ad7..8418254bc 100644 --- a/app/src/main/res/values-v24/styles.xml +++ b/app/src/main/res/values-v24/styles.xml @@ -5,7 +5,5 @@ diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml index cd4dccd1a..4e0eddedc 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v27/styles.xml @@ -12,6 +12,7 @@ @android:color/transparent @bool/theme_is_light + default + +