1
0
Fork 0

Copione merged onto master

master
blallo 2020-08-21 00:00:19 +02:00
commit beb974db89
30 changed files with 512 additions and 118 deletions

View File

@ -553,11 +553,11 @@ private fun assertWelcomeHeader() =
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertGetTheMostHeader() = private fun assertGetTheMostHeader() =
onView(allOf(withText("Get the most out of Firefox Preview."))) onView(allOf(withText("Start syncing bookmarks, passwords, and more with your Firefox account.")))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertAccountsSignInButton() = private fun assertAccountsSignInButton() =
onView(ViewMatchers.withResourceName("turn_on_sync_button")) onView(ViewMatchers.withResourceName("fxa_sign_in_button"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertGetToKnowHeader() = private fun assertGetToKnowHeader() =

View File

@ -120,7 +120,6 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
addonNameTextColor = ThemeManager.resolveAttribute(R.attr.primaryText, context), addonNameTextColor = ThemeManager.resolveAttribute(R.attr.primaryText, context),
addonSummaryTextColor = ThemeManager.resolveAttribute(R.attr.secondaryText, context), addonSummaryTextColor = ThemeManager.resolveAttribute(R.attr.secondaryText, context),
sectionsTypeFace = ResourcesCompat.getFont(context, R.font.metropolis_semibold), sectionsTypeFace = ResourcesCompat.getFont(context, R.font.metropolis_semibold),
addonBackgroundIconColor = ThemeManager.resolveAttribute(R.attr.inset, requireContext()),
addonAllowPrivateBrowsingLabelDrawableRes = R.drawable.ic_add_on_private_browsing_label addonAllowPrivateBrowsingLabelDrawableRes = R.drawable.ic_add_on_private_browsing_label
) )
} }

View File

@ -24,6 +24,7 @@ import mozilla.components.browser.state.selector.findTab
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.storage.BookmarksStorage import mozilla.components.concept.storage.BookmarksStorage
import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.getColorFromAttr
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingMode

View File

@ -6,6 +6,9 @@ package org.mozilla.fenix.ext
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent
import android.os.Build
import android.provider.Settings
import android.view.ContextThemeWrapper import android.view.ContextThemeWrapper
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -89,3 +92,21 @@ fun Context.getStringWithArgSafe(@StringRes resId: Int, formatArg: String): Stri
*/ */
val Context.accessibilityManager: AccessibilityManager get() = val Context.accessibilityManager: AccessibilityManager get() =
getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
/**
* Used to navigate to system notifications settings for app
*/
fun Context.navigateToNotificationsSettings() {
val intent = Intent()
intent.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
it.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
it.putExtra(Settings.EXTRA_APP_PACKAGE, this.packageName)
} else {
it.action = "android.settings.APP_NOTIFICATION_SETTINGS"
it.putExtra("app_package", this.packageName)
it.putExtra("app_uid", this.applicationInfo.uid)
}
}
startActivity(intent)
}

View File

@ -21,6 +21,7 @@ import mozilla.components.concept.sync.AccountObserver
import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.AuthType
import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.OAuthAccount
import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.getColorFromAttr
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings

View File

@ -31,9 +31,9 @@ class OnboardingAutomaticSignInViewHolder(
private val headerText = view.header_text private val headerText = view.header_text
init { init {
view.turn_on_sync_button.setOnClickListener { view.fxa_sign_in_button.setOnClickListener {
scope.launch { scope.launch {
onClick(it.turn_on_sync_button) onClick(it.fxa_sign_in_button)
} }
} }
} }

View File

@ -5,40 +5,40 @@
package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
import android.view.View import android.view.View
import androidx.core.content.ContextCompat
import androidx.navigation.Navigation import androidx.navigation.Navigation
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.onboarding_manual_signin.view.* import kotlinx.android.synthetic.main.onboarding_manual_signin.view.*
import mozilla.components.support.ktx.android.content.getDrawableWithTint
import mozilla.components.support.ktx.android.view.putCompoundDrawablesRelativeWithIntrinsicBounds
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.addUnderline
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.home.HomeFragmentDirections import org.mozilla.fenix.home.HomeFragmentDirections
import org.mozilla.fenix.onboarding.OnboardingController
import org.mozilla.fenix.onboarding.OnboardingInteractor
class OnboardingManualSignInViewHolder(view: View) : RecyclerView.ViewHolder(view) { class OnboardingManualSignInViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val headerText = view.header_text private val headerText = view.header_text
init { init {
view.turn_on_sync_button.setOnClickListener { val interactor = OnboardingInteractor(OnboardingController(itemView.context))
view.fxa_sign_in_button.setOnClickListener {
it.context.components.analytics.metrics.track(Event.OnboardingManualSignIn) it.context.components.analytics.metrics.track(Event.OnboardingManualSignIn)
val directions = HomeFragmentDirections.actionGlobalTurnOnSync() val directions = HomeFragmentDirections.actionGlobalTurnOnSync()
Navigation.findNavController(view).navigate(directions) Navigation.findNavController(view).navigate(directions)
} }
view.learn_more.addUnderline()
view.learn_more.setOnClickListener {
interactor.onLearnMoreClicked()
}
} }
fun bind() { fun bind() {
val context = itemView.context val context = itemView.context
headerText.text = context.getString(R.string.onboarding_firefox_account_header)
val appName = context.getString(R.string.app_name)
headerText.text = context.getString(R.string.onboarding_firefox_account_header, appName)
val icon = context.getDrawableWithTint(
R.drawable.ic_onboarding_firefox_accounts,
ContextCompat.getColor(context, R.color.white_color)
)
headerText.putCompoundDrawablesRelativeWithIntrinsicBounds(start = icon)
} }
companion object { companion object {

View File

@ -1,4 +1,3 @@
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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, You can obtain one at http://mozilla.org/MPL/2.0/. */

View File

@ -1,4 +1,3 @@
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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, You can obtain one at http://mozilla.org/MPL/2.0/. */

View File

@ -16,7 +16,13 @@ import mozilla.components.lib.state.Store
* @property size The size in bytes of the download item * @property size The size in bytes of the download item
* @property contentType The type of file the download is * @property contentType The type of file the download is
*/ */
data class DownloadItem(val id: Long, val fileName: String?, val filePath: String, val size: String, val contentType: String?) data class DownloadItem(
val id: Long,
val fileName: String?,
val filePath: String,
val size: String,
val contentType: String?
)
/** /**
* The [Store] for holding the [DownloadFragmentState] and applying [DownloadFragmentAction]s. * The [Store] for holding the [DownloadFragmentState] and applying [DownloadFragmentAction]s.

View File

@ -15,13 +15,9 @@ class DownloadInteractor(
downloadController.handleOpen(item) downloadController.handleOpen(item)
} }
override fun select(item: DownloadItem) { override fun select(item: DownloadItem) { /* noop */ }
TODO("Not yet implemented")
}
override fun deselect(item: DownloadItem) { override fun deselect(item: DownloadItem) { /* noop */ }
TODO("Not yet implemented")
}
override fun onBackPressed(): Boolean { override fun onBackPressed(): Boolean {
return downloadController.handleBackPressed() return downloadController.handleBackPressed()

View File

@ -1,5 +1,3 @@
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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, You can obtain one at http://mozilla.org/MPL/2.0/. */
@ -9,8 +7,10 @@ package org.mozilla.fenix.library.downloads
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator import androidx.recyclerview.widget.SimpleItemAnimator
import kotlinx.android.synthetic.main.component_downloads.*
import kotlinx.android.synthetic.main.component_downloads.view.* import kotlinx.android.synthetic.main.component_downloads.view.*
import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.R import org.mozilla.fenix.R
@ -56,10 +56,11 @@ class DownloadView(
fun update(state: DownloadFragmentState) { fun update(state: DownloadFragmentState) {
view.swipe_refresh.isEnabled = view.swipe_refresh.isEnabled = false
state.mode === DownloadFragmentState.Mode.Normal
mode = state.mode mode = state.mode
updateEmptyState(state.items.isNotEmpty())
downloadAdapter.updateMode(state.mode) downloadAdapter.updateMode(state.mode)
downloadAdapter.updateDownloads(state.items) downloadAdapter.updateDownloads(state.items)
@ -68,6 +69,14 @@ class DownloadView(
) )
} }
fun updateEmptyState(userHasDownloads: Boolean) {
download_list.isVisible = userHasDownloads
download_empty_view.isVisible = !userHasDownloads
if (!userHasDownloads) {
download_empty_view.announceForAccessibility(context.getString(R.string.download_empty_message))
}
}
override fun onBackPressed(): Boolean { override fun onBackPressed(): Boolean {
return interactor.onBackPressed() return interactor.onBackPressed()
} }

View File

@ -0,0 +1,22 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.onboarding
import android.content.Context
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.settings.SupportUtils
class OnboardingController(
private val context: Context
) {
fun handleLearnMoreClicked() {
(context as HomeActivity).openToBrowserAndLoad(
searchTermOrURL = SupportUtils.getFirefoxAccountSumoUrl(),
newTab = true,
from = BrowserDirection.FromHome
)
}
}

View File

@ -0,0 +1,14 @@
/* 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.onboarding
class OnboardingInteractor(private val onboardingController: OnboardingController) {
/**
* Called when the user clicks the learn more link
* @param url the url the suggestion was providing
*/
fun onLearnMoreClicked() = onboardingController.handleLearnMoreClicked()
}

View File

@ -5,10 +5,14 @@
package org.mozilla.fenix.searchdialog package org.mozilla.fenix.searchdialog
import android.app.Dialog import android.app.Dialog
import android.content.DialogInterface
import android.graphics.Typeface
import android.os.Bundle import android.os.Bundle
import android.text.style.StyleSpan
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment import androidx.appcompat.app.AppCompatDialogFragment
import androidx.constraintlayout.widget.ConstraintProperties.BOTTOM import androidx.constraintlayout.widget.ConstraintProperties.BOTTOM
import androidx.constraintlayout.widget.ConstraintProperties.PARENT_ID import androidx.constraintlayout.widget.ConstraintProperties.PARENT_ID
@ -16,14 +20,26 @@ import androidx.constraintlayout.widget.ConstraintProperties.TOP
import androidx.constraintlayout.widget.ConstraintSet import androidx.constraintlayout.widget.ConstraintSet
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import kotlinx.android.synthetic.main.fragment_search.view.*
import kotlinx.android.synthetic.main.fragment_search_dialog.* import kotlinx.android.synthetic.main.fragment_search_dialog.*
import kotlinx.android.synthetic.main.fragment_search_dialog.pill_wrapper
import kotlinx.android.synthetic.main.fragment_search_dialog.qr_scan_button
import kotlinx.android.synthetic.main.fragment_search_dialog.toolbar
import kotlinx.android.synthetic.main.fragment_search_dialog.view.*
import kotlinx.android.synthetic.main.fragment_search_dialog.view.search_engines_shortcut_button
import kotlinx.android.synthetic.main.fragment_search_dialog.view.qr_scan_button
import kotlinx.android.synthetic.main.fragment_search_dialog.view.toolbar
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import mozilla.components.feature.qr.QrFeature
import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.UserInteractionHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.android.content.hasCamera
import mozilla.components.support.ktx.android.content.res.getSpanned
import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.hideKeyboard
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.components.toolbar.ToolbarPosition
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
@ -42,6 +58,9 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
private lateinit var store: SearchDialogFragmentStore private lateinit var store: SearchDialogFragmentStore
private lateinit var toolbarView: ToolbarView private lateinit var toolbarView: ToolbarView
private lateinit var awesomeBarView: AwesomeBarView private lateinit var awesomeBarView: AwesomeBarView
private var firstUpdate = true
private val qrFeature = ViewBoundFeatureWrapper<QrFeature>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -101,7 +120,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
awesomeBarView = AwesomeBarView( awesomeBarView = AwesomeBarView(
requireContext(), requireContext(),
interactor, interactor,
view.awesomeBar view.awesome_bar
) )
return view return view
@ -111,6 +130,101 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupConstraints(view)
search_wrapper.setOnClickListener {
it.hideKeyboard()
dismissAllowingStateLoss()
}
view.search_engines_shortcut_button.setOnClickListener {
interactor.onSearchShortcutsButtonClicked()
}
qr_scan_button.visibility = if (context?.hasCamera() == true) View.VISIBLE else View.GONE
qr_scan_button.setOnClickListener {
if (!requireContext().hasCamera()) { return@setOnClickListener }
toolbarView.view.clearFocus()
requireComponents.analytics.metrics.track(Event.QRScannerOpened)
qrFeature.get()?.scan(R.id.search_wrapper)
}
qrFeature.set(
createQrFeature(),
owner = this,
view = view
)
consumeFrom(store) {
val shouldShowAwesomebar =
!firstUpdate &&
it.query.isNotBlank() ||
it.showSearchShortcuts
awesome_bar?.visibility = if (shouldShowAwesomebar) View.VISIBLE else View.INVISIBLE
toolbarView.update(it)
awesomeBarView.update(it)
firstUpdate = false
}
}
override fun onBackPressed(): Boolean {
return when {
qrFeature.onBackPressed() -> {
toolbarView.view.edit.focus()
view?.qr_scan_button?.isChecked = false
toolbarView.view.requestFocus()
true
}
else -> {
view?.hideKeyboard()
dismissAllowingStateLoss()
true
}
}
}
private fun createQrFeature(): QrFeature {
return QrFeature(
requireContext(),
fragmentManager = childFragmentManager,
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_CAMERA_PERMISSIONS)
},
onScanResult = { result ->
qr_scan_button.isChecked = false
activity?.let {
AlertDialog.Builder(it).apply {
val spannable = resources.getSpanned(
R.string.qr_scanner_confirmation_dialog_message,
getString(R.string.app_name) to StyleSpan(Typeface.BOLD),
result to StyleSpan(Typeface.ITALIC)
)
setMessage(spannable)
setNegativeButton(R.string.qr_scanner_dialog_negative) { dialog: DialogInterface, _ ->
requireComponents.analytics.metrics.track(Event.QRScannerNavigationDenied)
dialog.cancel()
}
setPositiveButton(R.string.qr_scanner_dialog_positive) { dialog: DialogInterface, _ ->
requireComponents.analytics.metrics.track(Event.QRScannerNavigationAllowed)
(activity as HomeActivity)
.openToBrowserAndLoad(
searchTermOrURL = result,
newTab = store.state.tabId == null,
from = BrowserDirection.FromSearch
)
dialog.dismiss()
}
create()
}.show()
requireComponents.analytics.metrics.track(Event.QRScannerPromptDisplayed)
}
})
}
private fun setupConstraints(view: View) {
if (view.context.settings().toolbarPosition == ToolbarPosition.BOTTOM) { if (view.context.settings().toolbarPosition == ToolbarPosition.BOTTOM) {
ConstraintSet().apply { ConstraintSet().apply {
clone(search_wrapper) clone(search_wrapper)
@ -118,31 +232,17 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
clear(toolbar.id, TOP) clear(toolbar.id, TOP)
connect(toolbar.id, BOTTOM, PARENT_ID, BOTTOM) connect(toolbar.id, BOTTOM, PARENT_ID, BOTTOM)
clear(awesomeBar.id, TOP) clear(awesome_bar.id, TOP)
clear(awesomeBar.id, BOTTOM) clear(pill_wrapper.id, BOTTOM)
connect(awesomeBar.id, TOP, PARENT_ID, TOP) connect(awesome_bar.id, TOP, PARENT_ID, TOP)
connect(awesomeBar.id, BOTTOM, toolbar.id, TOP) connect(pill_wrapper.id, BOTTOM, toolbar.id, TOP)
applyTo(search_wrapper) applyTo(search_wrapper)
} }
} }
search_wrapper.setOnClickListener {
it.hideKeyboard()
dismissAllowingStateLoss()
}
consumeFrom(store) {
awesomeBar?.visibility = if (it.query.isEmpty()) View.INVISIBLE else View.VISIBLE
toolbarView.update(it)
awesomeBarView.update(it)
}
} }
override fun onBackPressed(): Boolean { companion object {
view?.hideKeyboard() private const val REQUEST_CODE_CAMERA_PERMISSIONS = 1
dismissAllowingStateLoss()
return true
} }
} }

View File

@ -36,6 +36,7 @@ import org.mozilla.fenix.ext.application
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.ext.navigateToNotificationsSettings
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.ext.showToolbar
@ -271,10 +272,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataOnQuitFragment() SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataOnQuitFragment()
} }
resources.getString(R.string.pref_key_notifications) -> { resources.getString(R.string.pref_key_notifications) -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context?.navigateToNotificationsSettings()
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
startActivity(intent)
}
null null
} }
resources.getString(R.string.pref_key_customize) -> { resources.getString(R.string.pref_key_customize) -> {
@ -359,10 +357,6 @@ class SettingsFragment : PreferenceFragmentCompat() {
findPreference<Preference>( findPreference<Preference>(
getPreferenceKey(R.string.pref_key_debug_settings) getPreferenceKey(R.string.pref_key_debug_settings)
)?.isVisible = requireContext().settings().showSecretDebugMenuThisSession )?.isVisible = requireContext().settings().showSecretDebugMenuThisSession
findPreference<Preference>(
getPreferenceKey(R.string.pref_key_notifications)
)?.isVisible = requireContext().settings().showNotificationsSetting
} }
private fun getClickListenerForMakeDefaultBrowser(): Preference.OnPreferenceClickListener { private fun getClickListenerForMakeDefaultBrowser(): Preference.OnPreferenceClickListener {

View File

@ -74,6 +74,10 @@ object SupportUtils {
return "https://support.mozilla.org/$langTag/kb/$escapedTopic" return "https://support.mozilla.org/$langTag/kb/$escapedTopic"
} }
fun getFirefoxAccountSumoUrl(): String {
return "https://support.mozilla.org/kb/access-mozilla-services-firefox-account"
}
fun getMozillaPageUrl(page: MozillaPage, locale: Locale = Locale.getDefault()): String { fun getMozillaPageUrl(page: MozillaPage, locale: Locale = Locale.getDefault()): String {
val path = page.path val path = page.path
val langTag = getLanguageTag(locale) val langTag = getLanguageTag(locale)

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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/. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M17.6655,14.2092C16.1843,12.4998 14.1333,14.8 11.9997,14.8C9.8675,14.8 7.8151,12.4998 6.3339,14.2092C5.9139,14.6936 5.8803,15.3992 6.2401,15.9284C7.4959,17.7764 9.5959,19 11.9997,19C14.4035,19 16.5035,17.7764 17.7593,15.9284C18.1205,15.3992 18.0855,14.6936 17.6655,14.2092M16.25,9.25C16.25,6.9026 14.3474,5 12,5C9.6526,5 7.75,6.9026 7.75,9.25C7.75,11.5974 9.6526,13.5 12,13.5C14.3474,13.5 16.25,11.5974 16.25,9.25Z" />
<path
android:fillColor="@android:color/white"
android:pathData="M12,22C6.4772,22 2,17.5228 2,12C2,6.4772 6.4772,2 12,2C17.5228,2 22,6.4772 22,12C21.9939,17.5203 17.5203,21.9939 12,22L12,22ZM12,4C7.5817,4 4,7.5817 4,12C4,16.4183 7.5817,20 12,20C16.4183,20 20,16.4183 20,12C19.995,7.5838 16.4162,4.005 12,4Z" />
</vector>

View File

@ -30,7 +30,7 @@
app:layout_constraintTop_toTopOf="parent"/> app:layout_constraintTop_toTopOf="parent"/>
<mozilla.components.browser.awesomebar.BrowserAwesomeBar <mozilla.components.browser.awesomebar.BrowserAwesomeBar
xmlns:mozac="http://schemas.android.com/apk/res-auto" xmlns:mozac="http://schemas.android.com/apk/res-auto"
android:id="@+id/awesomeBar" android:id="@+id/awesome_bar"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:fadingEdge="horizontal" android:fadingEdge="horizontal"
@ -39,11 +39,40 @@
android:requiresFadingEdge="vertical" android:requiresFadingEdge="vertical"
android:background="?attr/foundation" android:background="?attr/foundation"
android:visibility="invisible" android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toTopOf="@+id/pill_wrapper"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" app:layout_constraintTop_toBottomOf="@id/toolbar"
mozac:awesomeBarChipBackgroundColor="@color/photonGreen50" mozac:awesomeBarChipBackgroundColor="@color/photonGreen50"
mozac:awesomeBarDescriptionTextColor="?secondaryText" mozac:awesomeBarDescriptionTextColor="?secondaryText"
mozac:awesomeBarTitleTextColor="?primaryText" /> mozac:awesomeBarTitleTextColor="?primaryText" />
<LinearLayout
android:id="@+id/pill_wrapper"
android:layout_width="0dp"
android:layout_height="@dimen/search_fragment_pill_height"
android:background="?foundation"
android:orientation="horizontal"
android:paddingStart="@dimen/search_fragment_pill_padding_start"
android:paddingTop="@dimen/search_fragment_pill_padding_vertical"
android:paddingEnd="@dimen/search_fragment_pill_padding_end"
android:paddingBottom="@dimen/search_fragment_pill_padding_vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<ToggleButton
android:id="@+id/qr_scan_button"
style="@style/search_pill"
android:layout_marginEnd="@dimen/search_fragment_scan_button_margin_end"
android:textOff="@string/search_scan_button"
android:textOn="@string/search_scan_button"
app:drawableStartCompat="@drawable/ic_qr" />
<ToggleButton
android:id="@+id/search_engines_shortcut_button"
style="@style/search_pill"
android:textOff="@string/search_engine_button"
android:textOn="@string/search_engine_button"
app:drawableStartCompat="@drawable/ic_search" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -22,7 +22,7 @@
tools:text="@string/onboarding_firefox_account_auto_signin_header_2" /> tools:text="@string/onboarding_firefox_account_auto_signin_header_2" />
<Button <Button
android:id="@+id/turn_on_sync_button" android:id="@+id/fxa_sign_in_button"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"

View File

@ -2,7 +2,8 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public <!-- 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 - 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, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/onboarding_card" android:id="@+id/onboarding_card"
@ -11,22 +12,51 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/avatar_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="12dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_onboarding_avatar_anonymous_large"
tools:ignore="RtlSymmetry" />
<TextView <TextView
android:id="@+id/header_text" android:id="@+id/header_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="14dp"
android:drawablePadding="12dp"
android:textAppearance="@style/Header16TextStyle" android:textAppearance="@style/Header16TextStyle"
android:lineSpacingExtra="8sp"
android:textColor="@color/neutral_text" android:textColor="@color/neutral_text"
app:drawableTint="@color/white_color" app:drawableTint="@color/white_color"
tools:text="@string/onboarding_firefox_account_header" /> app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/avatar_icon"
android:layout_marginStart="52dp"
tools:text="@string/onboarding_firefox_account_header"
/>
<org.mozilla.fenix.utils.LinkTextView
android:id="@+id/learn_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/onboarding_manual_sign_in_learn_more"
android:textAppearance="@style/Header16TextStyle"
android:textColor="@color/neutral_text"
app:layout_constraintStart_toStartOf="@id/header_text"
app:layout_constraintTop_toBottomOf="@id/header_text"
tools:textColor="@color/neutral_text" />
<Button <Button
style="@style/NeutralButton" style="@style/NeutralButton"
android:id="@+id/turn_on_sync_button" android:id="@+id/fxa_sign_in_button"
android:background="@drawable/onboarding_padded_background" android:background="@drawable/onboarding_padded_background"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:text="@string/onboarding_firefox_account_sign_in" android:text="@string/onboarding_firefox_account_sign_in"
app:layout_constraintTop_toBottomOf="@id/learn_more"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="parent"
app:backgroundTint="@color/foundation_light_theme" /> app:backgroundTint="@color/foundation_light_theme" />
</LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -27,6 +27,8 @@
<!-- Tab tray multi select title in app bar. The first parameter is the number of tabs selected --> <!-- Tab tray multi select title in app bar. The first parameter is the number of tabs selected -->
<string name="tab_tray_multi_select_title">%1$d esbillaes</string> <string name="tab_tray_multi_select_title">%1$d esbillaes</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Amiestu d\'una coleción nueva</string>
<!-- Label of editable text in create collection dialog for naming a new collection --> <!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">Nome</string> <string name="tab_tray_add_new_collection_name">Nome</string>
@ -247,6 +249,8 @@
<string name="preferences_sign_in_description">Sincroniza los marcadores, l\'historial y muncho más cola to cuenta de Firefox</string> <string name="preferences_sign_in_description">Sincroniza los marcadores, l\'historial y muncho más cola to cuenta de Firefox</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. --> <!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Cuenta de Firefox</string> <string name="preferences_account_default_name">Cuenta de Firefox</string>
<!-- Preference text for account title when there was an error syncing FxA -->
<string name="preferences_account_sync_error">Reconéutate pa siguir cola sincronización</string>
<!-- Preference for language --> <!-- Preference for language -->
<string name="preferences_language">Llingua</string> <string name="preferences_language">Llingua</string>
<!-- Preference for data collection --> <!-- Preference for data collection -->
@ -364,6 +368,11 @@
<!-- Header of the Turn on Sync preference view --> <!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Activación de Sync</string> <string name="preferences_sync">Activación de Sync</string>
<!-- Preference for reconnecting to FxA sync -->
<string name="preferences_sync_sign_in_to_reconnect">Aniciar sesión pa reconeutar</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">Desaniciar la cuenta</string>
<!-- Pairing Feature strings --> <!-- Pairing Feature strings -->
<!-- Instructions on how to access pairing --> <!-- Instructions on how to access pairing -->
<string name="pair_instructions_2"><![CDATA[Escania\'l códigu QR que s\'amuesa en <b>firefox.com/pair</b>]]></string> <string name="pair_instructions_2"><![CDATA[Escania\'l códigu QR que s\'amuesa en <b>firefox.com/pair</b>]]></string>
@ -473,6 +482,9 @@
<!-- Postfix for private WebApp titles, placeholder is replaced with app name --> <!-- Postfix for private WebApp titles, placeholder is replaced with app name -->
<string name="pwa_site_controls_title_private">%1$s (en privao)</string> <string name="pwa_site_controls_title_private">%1$s (en privao)</string>
<!-- Button in the current tab tray header in multiselect mode. Saved the selected tabs to a collection when pressed. -->
<string name="tab_tray_save_to_collection">Guardar</string>
<!-- History --> <!-- History -->
<!-- Text for the button to clear all history --> <!-- Text for the button to clear all history -->
<string name="history_delete_all">Desaniciar l\'historial</string> <string name="history_delete_all">Desaniciar l\'historial</string>
@ -659,6 +671,8 @@
<string name="create_collection_save_to_collection_tab_selected">Esbillóse %d llingüeta</string> <string name="create_collection_save_to_collection_tab_selected">Esbillóse %d llingüeta</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection --> <!-- Text shown in snackbar when multiple tabs have been saved in a collection -->
<string name="create_collection_tabs_saved">¡Guardáronse les llingüetes!</string> <string name="create_collection_tabs_saved">¡Guardáronse les llingüetes!</string>
<!-- Text shown in snackbar when one or multiple tabs have been saved in a new collection -->
<string name="create_collection_tabs_saved_new_collection">¡Guardóse la coleición!</string>
<!-- Text shown in snackbar when one tab has been saved in a collection --> <!-- Text shown in snackbar when one tab has been saved in a collection -->
<string name="create_collection_tab_saved">¡Guardóse la llingüeta!</string> <string name="create_collection_tab_saved">¡Guardóse la llingüeta!</string>
<!-- Content description (not visible, for screen readers etc.): button to close the collection creator --> <!-- Content description (not visible, for screen readers etc.): button to close the collection creator -->
@ -690,6 +704,8 @@
<!-- An option from the share dialog to send link to all other sync devices --> <!-- An option from the share dialog to send link to all other sync devices -->
<string name="sync_send_to_all">Unviar a tolos preseos</string> <string name="sync_send_to_all">Unviar a tolos preseos</string>
<!-- An option from the share dialog to reconnect to sync -->
<string name="sync_reconnect">Reconexón con Sync</string>
<!-- An option to connect additional devices --> <!-- An option to connect additional devices -->
<string name="sync_connect_device">Coneutar otru preséu</string> <string name="sync_connect_device">Coneutar otru preséu</string>
<!-- The dialog text shown when additional devices are not available --> <!-- The dialog text shown when additional devices are not available -->

View File

@ -27,6 +27,16 @@
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs --> <!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">%1$s ruwi\' ejaqon. Tachapa\' richin nak\'ëx ruwi\'.</string> <string name="open_tab_tray_plural">%1$s ruwi\' ejaqon. Tachapa\' richin nak\'ëx ruwi\'.</string>
<!-- Tab tray multi select title in app bar. The first parameter is the number of tabs selected -->
<string name="tab_tray_multi_select_title">%1$d xcha\'</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Titz\'aqatisäx k\'ak\'a\' mol</string>
<!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">B\'i\'aj</string>
<!-- Label of button in save to collection dialog for selecting a current collection -->
<string name="tab_tray_select_collection">Ticha\' mol</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s b\'anon ruma Mozilla.</string> <string name="about_content">%1$s b\'anon ruma Mozilla.</string>
@ -151,14 +161,10 @@
<!-- Search Fragment --> <!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code --> <!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Tiwachib\'ëx</string> <string name="search_scan_button">Tiwachib\'ëx</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Choj okem</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings --> <!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Runuk\'ulem kanob\'äl</string> <string name="search_shortcuts_engine_settings">Runuk\'ulem kanob\'äl</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Tikanöx pa</string>
<!-- Header displayed when selecting a shortcut search engine --> <!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Wakami tikanöx rik\'in:</string> <string name="search_engines_search_with">Wakami tikanöx rik\'in:</string>
<!-- Button in the search view that lets a user navigate to the site in their clipboard --> <!-- Button in the search view that lets a user navigate to the site in their clipboard -->
<string name="awesomebar_clipboard_title">Titz\'ajb\'äl ri ximonel pa ri molwuj</string> <string name="awesomebar_clipboard_title">Titz\'ajb\'äl ri ximonel pa ri molwuj</string>
<!-- Button in the search suggestions onboarding that allows search suggestions in private sessions --> <!-- Button in the search suggestions onboarding that allows search suggestions in private sessions -->
@ -270,8 +276,6 @@
<string name="developer_tools_category">Taq rusamajib\'al nuk\'unel</string> <string name="developer_tools_category">Taq rusamajib\'al nuk\'unel</string>
<!-- Preference for developers --> <!-- Preference for developers -->
<string name="preferences_remote_debugging">Näj chojmirisanem pa USB</string> <string name="preferences_remote_debugging">Näj chojmirisanem pa USB</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Kek\'ut retal pitz\'b\'äl richin nikanöx</string>
<!-- Preference title for switch preference to show search suggestions --> <!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">Kek\'ut pe ri taq chilab\'enïk richin yakanon</string> <string name="preferences_show_search_suggestions">Kek\'ut pe ri taq chilab\'enïk richin yakanon</string>
@ -524,6 +528,9 @@
<!-- Postfix for private WebApp titles, placeholder is replaced with app name --> <!-- Postfix for private WebApp titles, placeholder is replaced with app name -->
<string name="pwa_site_controls_title_private">%1$s (Ichinan Rub\'anikil)</string> <string name="pwa_site_controls_title_private">%1$s (Ichinan Rub\'anikil)</string>
<!-- Button in the current tab tray header in multiselect mode. Saved the selected tabs to a collection when pressed. -->
<string name="tab_tray_save_to_collection">Tiyak</string>
<!-- History --> <!-- History -->
<!-- Text for the button to clear all history --> <!-- Text for the button to clear all history -->
<string name="history_delete_all">Tiyuj natab\'äl</string> <string name="history_delete_all">Tiyuj natab\'äl</string>
@ -649,7 +656,7 @@
<!-- Bookmark snackbar message on deletion <!-- Bookmark snackbar message on deletion
The first parameter is the host part of the URL of the bookmark deleted, if any --> The first parameter is the host part of the URL of the bookmark deleted, if any -->
<string name="bookmark_deletion_snackbar_message">Xyuj %1$s</string> <string name="bookmark_deletion_snackbar_message">Xyuj %1$s</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks --> <!-- Bookmark snackbar message on deleting multiple bookmarks not including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_2">Taq yaketal xeyuj</string> <string name="bookmark_deletion_multiple_snackbar_message_2">Taq yaketal xeyuj</string>
<!-- Bookmark undo button for deletion snackbar action --> <!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">TITZOLÏX</string> <string name="bookmark_undo_deletion">TITZOLÏX</string>
@ -1458,9 +1465,7 @@ Achi\'el: \nhttps://www.google.com/search?q=%s</string>
<string name="saved_login_duplicate">K\'o chik jun tikirib\'äl molojri\'ïl rik\'in re b\'i\'aj re\'</string> <string name="saved_login_duplicate">K\'o chik jun tikirib\'äl molojri\'ïl rik\'in re b\'i\'aj re\'</string>
<!-- Synced Tabs --> <!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account --> <!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_to_sync_account">Tok rik\'in jun Rub\'i\' Rutaqoya\'l Firefox</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Tokisäx jun chik okisab\'äl</string> <string name="synced_tabs_connect_another_device">Tokisäx jun chik okisab\'äl</string>
<!-- Text displayed asking user to re-authenticate --> <!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Tajuxub\'ej chik awi\'.</string> <string name="synced_tabs_reauth">Tajuxub\'ej chik awi\'.</string>

View File

@ -39,6 +39,9 @@
<!-- Content description for save to collection button while in multiselect mode in tab tray --> <!-- Content description for save to collection button while in multiselect mode in tab tray -->
<string name="tab_tray_collection_button_multiselect_content_description">Αποθήκευση επιλεγμένων καρτελών στη συλλογή</string> <string name="tab_tray_collection_button_multiselect_content_description">Αποθήκευση επιλεγμένων καρτελών στη συλλογή</string>
<!-- Content description announcement when exiting multiselect mode in tab tray -->
<string name="tab_tray_exit_multiselect_content_description">Τέλος λειτουργίας πολλαπλής επιλογής</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">Το %1$s αναπτύσσεται από τη Mozilla.</string> <string name="about_content">Το %1$s αναπτύσσεται από τη Mozilla.</string>
@ -231,6 +234,10 @@
<string name="preferences_add_private_browsing_shortcut">Προσθήκη συντόμευσης ιδιωτικής περιήγησης</string> <string name="preferences_add_private_browsing_shortcut">Προσθήκη συντόμευσης ιδιωτικής περιήγησης</string>
<!-- Preference for accessibility --> <!-- Preference for accessibility -->
<string name="preferences_accessibility">Προσβασιμότητα</string> <string name="preferences_accessibility">Προσβασιμότητα</string>
<!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Προσαρμοσμένος διακομιστής λογαριασμού Firefox</string>
<!-- Preference to override the Sync token server -->
<string name="preferences_override_sync_tokenserver">Προσαρμοσμένος διακομιστής Sync</string>
<!-- Preference category for account information --> <!-- Preference category for account information -->
<string name="preferences_category_account">Λογαριασμός</string> <string name="preferences_category_account">Λογαριασμός</string>
<!-- Preference shown on banner to sign into account --> <!-- Preference shown on banner to sign into account -->
@ -305,6 +312,10 @@
<!-- Label indicating that sync is in progress --> <!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">Συγχρονισμός…</string> <string name="sync_syncing_in_progress">Συγχρονισμός…</string>
<!-- Label summary indicating that sync failed. The first parameter is the date stamp showing last time it succeeded -->
<string name="sync_failed_summary">Αποτυχία συγχρονισμού. Τελευταία επιτυχία: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_failed_never_synced_summary">Αποτυχία συγχρονισμού. Τελευταίος συγχρονισμός: ποτέ</string>
<!-- Label summary the date we last synced. The first parameter is date stamp showing last time synced --> <!-- Label summary the date we last synced. The first parameter is date stamp showing last time synced -->
<string name="sync_last_synced_summary">Τελευταίος συγχρονισμός: %s</string> <string name="sync_last_synced_summary">Τελευταίος συγχρονισμός: %s</string>
<!-- Label summary showing never synced --> <!-- Label summary showing never synced -->
@ -317,6 +328,8 @@
<!-- Send Tab --> <!-- Send Tab -->
<!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app --> <!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_name">Ληφθείσες καρτέλες</string> <string name="fxa_received_tab_channel_name">Ληφθείσες καρτέλες</string>
<!-- Description of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_description">Ειδοποιήσεις για καρτέλες που λαμβάνονται από άλλες συσκευές Firefox.</string>
<!-- The body for these is the URL of the tab received --> <!-- The body for these is the URL of the tab received -->
<string name="fxa_tab_received_notification_name">Ελήφθη καρτέλα</string> <string name="fxa_tab_received_notification_name">Ελήφθη καρτέλα</string>
<!-- When multiple tabs have been received --> <!-- When multiple tabs have been received -->
@ -329,6 +342,8 @@
<string name="preferences_tracking_protection_settings">Προστασία από καταγραφή</string> <string name="preferences_tracking_protection_settings">Προστασία από καταγραφή</string>
<!-- Preference switch for tracking protection --> <!-- Preference switch for tracking protection -->
<string name="preferences_tracking_protection">Προστασία από καταγραφή</string> <string name="preferences_tracking_protection">Προστασία από καταγραφή</string>
<!-- Preference switch description for tracking protection -->
<string name="preferences_tracking_protection_description">Φραγή περιεχομένου και σεναρίων που σας παρακολουθούν στο διαδίκτυο</string>
<!-- Preference for tracking protection exceptions --> <!-- Preference for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions">Εξαιρέσεις</string> <string name="preferences_tracking_protection_exceptions">Εξαιρέσεις</string>
<!-- Button in Exceptions Preference to turn on tracking protection for all sites (remove all exceptions) --> <!-- Button in Exceptions Preference to turn on tracking protection for all sites (remove all exceptions) -->
@ -358,6 +373,8 @@
<!-- Turn On Sync Preferences --> <!-- Turn On Sync Preferences -->
<!-- Header of the Turn on Sync preference view --> <!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Ενεργοποίηση Sync</string> <string name="preferences_sync">Ενεργοποίηση Sync</string>
<!-- Preference for pairing -->
<string name="preferences_sync_pair">Σάρωση κωδικού σύζευξης στο Firefox για υπολογιστή</string>
<!-- Preference for account login --> <!-- Preference for account login -->
<string name="preferences_sync_sign_in">Σύνδεση</string> <string name="preferences_sync_sign_in">Σύνδεση</string>
@ -612,8 +629,13 @@
<string name="bookmark_invalid_url_error">Άκυρο URL</string> <string name="bookmark_invalid_url_error">Άκυρο URL</string>
<!-- Bookmark screen message for empty bookmarks folder --> <!-- Bookmark screen message for empty bookmarks folder -->
<string name="bookmarks_empty_message">Κανένας σελιδοδείκτης εδώ</string> <string name="bookmarks_empty_message">Κανένας σελιδοδείκτης εδώ</string>
<!-- Bookmark snackbar message on deletion
The first parameter is the host part of the URL of the bookmark deleted, if any -->
<string name="bookmark_deletion_snackbar_message">Το %1$s διαγράφηκε</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks not including folders--> <!-- Bookmark snackbar message on deleting multiple bookmarks not including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_2">Οι σελιδοδείκτες διαγράφηκαν</string> <string name="bookmark_deletion_multiple_snackbar_message_2">Οι σελιδοδείκτες διαγράφηκαν</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_3">Διαγραφή επιλεγμένων φακέλων</string>
<!-- Bookmark undo button for deletion snackbar action --> <!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">ΑΝΑΙΡΕΣΗ</string> <string name="bookmark_undo_deletion">ΑΝΑΙΡΕΣΗ</string>
@ -857,6 +879,10 @@
<string name="preferences_delete_browsing_data_button">Διαγραφή δεδομένων περιήγησης</string> <string name="preferences_delete_browsing_data_button">Διαγραφή δεδομένων περιήγησης</string>
<!-- Title for the Delete browsing data on quit preference --> <!-- Title for the Delete browsing data on quit preference -->
<string name="preferences_delete_browsing_data_on_quit">Διαγραφή δεδομένων περιήγησης στην έξοδο</string> <string name="preferences_delete_browsing_data_on_quit">Διαγραφή δεδομένων περιήγησης στην έξοδο</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. -->
<string name="preference_summary_delete_browsing_data_on_quit">Διαγράφει αυτόματα τα δεδομένα περιήγησης όταν επιλέγετε &quot;Έξοδος&quot; από το κύριο μενού</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. -->
<string name="preference_summary_delete_browsing_data_on_quit_2">Διαγράφει αυτόματα τα δεδομένα περιήγησης όταν επιλέγετε \&quot;Quit\&quot; από το κύριο μενού</string>
<!-- Action item in menu for the Delete browsing data on quit feature --> <!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Έξοδος</string> <string name="delete_browsing_data_on_quit_action">Έξοδος</string>
@ -1079,6 +1105,8 @@
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Τα δικαιώματά σας</string> <string name="about_your_rights">Τα δικαιώματά σας</string>
<!-- About page link text to open open source licenses screen -->
<string name="about_open_source_licenses">Βιβλιοθήκες ανοιχτού κώδικα που χρησιμοποιούμε</string>
<!-- About page link text to open what's new link --> <!-- About page link text to open what's new link -->
<string name="about_whats_new">Τι νέο υπάρχει στο %s</string> <string name="about_whats_new">Τι νέο υπάρχει στο %s</string>
<!-- Open source licenses page title <!-- Open source licenses page title
@ -1176,6 +1204,8 @@
<string name="preferences_passwords_saved_logins_password">Κωδικός πρόσβασης</string> <string name="preferences_passwords_saved_logins_password">Κωδικός πρόσβασης</string>
<!-- Message displayed in security prompt to reenter a secret pin to access saved logins --> <!-- Message displayed in security prompt to reenter a secret pin to access saved logins -->
<string name="preferences_passwords_saved_logins_enter_pin">Εισάγετε ξανά το PIN σας</string> <string name="preferences_passwords_saved_logins_enter_pin">Εισάγετε ξανά το PIN σας</string>
<!-- Message displayed in security prompt to access saved logins -->
<string name="preferences_passwords_saved_logins_enter_pin_description">Ξεκλειδώστε για να δείτε τις αποθηκευμένες συνδέσεις σας</string>
<!-- Message displayed when a connection is insecure and we detect the user is entering a password --> <!-- Message displayed when a connection is insecure and we detect the user is entering a password -->
<string name="logins_insecure_connection_warning">Αυτή η σύνδεση δεν είναι ασφαλής. Οι λογαριασμοί που εισάγονται εδώ ενδέχεται να παραβιαστούν.</string> <string name="logins_insecure_connection_warning">Αυτή η σύνδεση δεν είναι ασφαλής. Οι λογαριασμοί που εισάγονται εδώ ενδέχεται να παραβιαστούν.</string>
<!-- Learn more link that will link to a page with more information displayed when a connection is insecure and we detect the user is entering a password --> <!-- Learn more link that will link to a page with more information displayed when a connection is insecure and we detect the user is entering a password -->
@ -1198,16 +1228,22 @@
<string name="saved_login_copy_username">Αντιγραφή ονόματος χρήστη</string> <string name="saved_login_copy_username">Αντιγραφή ονόματος χρήστη</string>
<!-- Content Description (for screenreaders etc) read for the button to copy a site in logins --> <!-- Content Description (for screenreaders etc) read for the button to copy a site in logins -->
<string name="saved_login_copy_site">Αντιγραφή ιστοσελίδας</string> <string name="saved_login_copy_site">Αντιγραφή ιστοσελίδας</string>
<!-- Content Description (for screenreaders etc) read for the button to open a site in logins -->
<string name="saved_login_open_site">Άνοιγμα σελίδας στο πρόγραμμα περιήγησης</string>
<!-- Content Description (for screenreaders etc) read for the button to reveal a password in logins --> <!-- Content Description (for screenreaders etc) read for the button to reveal a password in logins -->
<string name="saved_login_reveal_password">Εμφάνιση κωδικού πρόσβασης</string> <string name="saved_login_reveal_password">Εμφάνιση κωδικού πρόσβασης</string>
<!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins -->
<string name="saved_login_hide_password">Απόκρυψη κωδικού πρόσβασης</string> <string name="saved_login_hide_password">Απόκρυψη κωδικού πρόσβασης</string>
<!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins -->
<string name="logins_biometric_prompt_message">Ξεκλειδώστε για να δείτε τις αποθηκευμένες συνδέσεις σας</string>
<!-- Negative button to ignore warning dialog if users have no device authentication set up --> <!-- Negative button to ignore warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_later">Αργότερα</string> <string name="logins_warning_dialog_later">Αργότερα</string>
<!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_set_up_now">Ρύθμιση τώρα</string> <string name="logins_warning_dialog_set_up_now">Ρύθμιση τώρα</string>
<!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their logins --> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their logins -->
<string name="logins_biometric_prompt_message_pin">Ξεκλειδώστε τη συσκευή σας</string> <string name="logins_biometric_prompt_message_pin">Ξεκλειδώστε τη συσκευή σας</string>
<!-- Title for Accessibility Force Enable Zoom Preference -->
<string name="preference_accessibility_force_enable_zoom">Ζουμ σε όλες τις ιστοσελίδες</string>
<!-- Saved logins sorting strategy menu item -by name- (if selected, it will sort saved logins alphabetically) --> <!-- Saved logins sorting strategy menu item -by name- (if selected, it will sort saved logins alphabetically) -->
<string name="saved_logins_sort_strategy_alphabetically">Όνομα (Α-Ω)</string> <string name="saved_logins_sort_strategy_alphabetically">Όνομα (Α-Ω)</string>
<!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) -->
@ -1236,14 +1272,20 @@
<!-- Placeholder text shown in the Search String TextField before a user enters text --> <!-- Placeholder text shown in the Search String TextField before a user enters text -->
<string name="search_add_custom_engine_search_string_hint">Νήμα αναζήτησης προς χρήση</string> <string name="search_add_custom_engine_search_string_hint">Νήμα αναζήτησης προς χρήση</string>
<!-- Description text for the Search String TextField. The %s is part of the string -->
<string name="search_add_custom_engine_search_string_example">Αντικαταστήστε το ερώτημα με “%s”. Παράδειγμα:\nhttps://www.google.com/search?q=%s</string>
<!-- Text for the button to learn more about adding a custom search engine --> <!-- Text for the button to learn more about adding a custom search engine -->
<string name="search_add_custom_engine_learn_more_label">Μάθετε περισσότερα</string> <string name="search_add_custom_engine_learn_more_label">Μάθετε περισσότερα</string>
<!-- Accessibility description for the form in which details about the custom search engine are entered -->
<string name="search_add_custom_engine_form_description">Λεπτομέρειες προσαρμοσμένης μηχανής αναζήτησης</string>
<!-- Accessibility description for the 'Learn more' link --> <!-- Accessibility description for the 'Learn more' link -->
<string name="search_add_custom_engine_learn_more_description">Σύνδεσμος &quot;Μάθετε περισσότερα&quot;</string> <string name="search_add_custom_engine_learn_more_description">Σύνδεσμος &quot;Μάθετε περισσότερα&quot;</string>
<!-- Text shown when a user leaves the name field empty --> <!-- Text shown when a user leaves the name field empty -->
<string name="search_add_custom_engine_error_empty_name">Εισάγετε όνομα μηχανής αναζήτησης</string> <string name="search_add_custom_engine_error_empty_name">Εισάγετε όνομα μηχανής αναζήτησης</string>
<!-- Text shown when a user tries to add a search engine that already exists -->
<string name="search_add_custom_engine_error_existing_name">Η μηχανή αναζήτησης με το όνομα “%s” υπάρχει ήδη.</string>
<!-- Text shown when a user leaves the search string field empty --> <!-- Text shown when a user leaves the search string field empty -->
<string name="search_add_custom_engine_error_empty_search_string">Εισάγετε νήμα αναζήτησης</string> <string name="search_add_custom_engine_error_empty_search_string">Εισάγετε νήμα αναζήτησης</string>
<!-- Text shown when we aren't able to validate the custom search query. The first parameter is the url of the custom search engine --> <!-- Text shown when we aren't able to validate the custom search query. The first parameter is the url of the custom search engine -->
@ -1252,8 +1294,15 @@
<!-- Text shown when a user creates a new search engine --> <!-- Text shown when a user creates a new search engine -->
<string name="search_add_custom_engine_success_message">Δημιουργήθηκε to %s</string> <string name="search_add_custom_engine_success_message">Δημιουργήθηκε to %s</string>
<!-- Text shown when a user successfully edits a custom search engine -->
<string name="search_edit_custom_engine_success_message">Το %s αποθηκεύτηκε</string>
<!-- Text shown when a user successfully deletes a custom search engine -->
<string name="search_delete_search_engine_success_message">Το %s διαγράφηκε</string>
<!-- Title text shown for the migration screen to the new browser. Placeholder replaced with app name --> <!-- Title text shown for the migration screen to the new browser. Placeholder replaced with app name -->
<string name="migration_title">Καλώς ορίσατε στο νέο %s</string> <string name="migration_title">Καλώς ορίσατε στο νέο %s</string>
<!-- Description text followed by a list of things migrating (e.g. Bookmarks, History). Placeholder replaced with app name-->
<string name="migration_description">Σας περιμένει ένα πλήρως ανασχεδιασμένο πρόγραμμα περιήγησης, με βελτιωμένη απόδοση και λειτουργίες που θα σας βοηθήσουν να κάνετε περισσότερα στο διαδίκτυο.\n\nΠαρακαλούμε περιμένετε ενώ ενημερώνουμε το %s με το</string>
<!-- Text on the disabled button while in progress. Placeholder replaced with app name --> <!-- Text on the disabled button while in progress. Placeholder replaced with app name -->
<string name="migration_updating_app_button_text">Ενημέρωση του %s…</string> <string name="migration_updating_app_button_text">Ενημέρωση του %s…</string>
<!-- Text on the enabled button. Placeholder replaced with app name--> <!-- Text on the enabled button. Placeholder replaced with app name-->
@ -1263,6 +1312,8 @@
<!--Text on list of migrated items (e.g. Settings, History, etc.)--> <!--Text on list of migrated items (e.g. Settings, History, etc.)-->
<string name="migration_text_passwords">Κωδικοί πρόσβασης</string> <string name="migration_text_passwords">Κωδικοί πρόσβασης</string>
<!-- Heading for the instructions to allow a permission -->
<string name="phone_feature_blocked_intro">Για να το επιτρέψετε:</string>
<!-- First step for the allowing a permission --> <!-- First step for the allowing a permission -->
<string name="phone_feature_blocked_step_settings">1. Μεταβείτε στις Ρυθμίσεις Android</string> <string name="phone_feature_blocked_step_settings">1. Μεταβείτε στις Ρυθμίσεις Android</string>
<!-- Second step for the allowing a permission --> <!-- Second step for the allowing a permission -->
@ -1301,6 +1352,12 @@
<string name="dialog_delete_positive">Διαγραφή</string> <string name="dialog_delete_positive">Διαγραφή</string>
<!-- The saved login options menu description. --> <!-- The saved login options menu description. -->
<string name="login_options_menu">Επιλογές σύνδεσης</string> <string name="login_options_menu">Επιλογές σύνδεσης</string>
<!-- The editable text field for a login's web address. -->
<string name="saved_login_hostname_description">Το επεξεργάσιμο πεδίο κειμένου της διεύθυνσης ιστού της σύνδεσης.</string>
<!-- The editable text field for a login's username. -->
<string name="saved_login_username_description">Το επεξεργάσιμο πεδίο κειμένου για το όνομα χρήστη της σύνδεσης.</string>
<!-- The editable text field for a login's password. -->
<string name="saved_login_password_description">Το επεξεργάσιμο πεδίο κειμένου για τον κωδικό πρόσβασης της σύνδεσης.</string>
<!-- The button description to save changes to an edited login. --> <!-- The button description to save changes to an edited login. -->
<string name="save_changes_to_login">Αποθήκευση αλλαγών στη σύνδεση.</string> <string name="save_changes_to_login">Αποθήκευση αλλαγών στη σύνδεση.</string>
<!-- The button description to discard changes to an edited login. --> <!-- The button description to discard changes to an edited login. -->
@ -1325,9 +1382,16 @@
<!-- Text displayed when user has disabled tab syncing in Firefox Sync Account --> <!-- Text displayed when user has disabled tab syncing in Firefox Sync Account -->
<string name="synced_tabs_enable_tab_syncing">Παρακαλούμε ενεργοποιήστε το συγχρονισμό καρτελών.</string> <string name="synced_tabs_enable_tab_syncing">Παρακαλούμε ενεργοποιήστε το συγχρονισμό καρτελών.</string>
<!-- Text displayed when user has no tabs that have been synced -->
<string name="synced_tabs_no_tabs">Δεν έχετε καμία άλλη καρτέλα ανοικτή στο Firefox σε άλλες σας συσκευές.</string>
<!-- Text displayed in the synced tabs screen when a user is not signed in to Firefox Sync describing Synced Tabs -->
<string name="synced_tabs_sign_in_message">Δείτε μια λίστα καρτελών από τις άλλες συσκευές σας.</string>
<!-- Text displayed on a button in the synced tabs screen to link users to sign in when a user is not signed in to Firefox Sync --> <!-- Text displayed on a button in the synced tabs screen to link users to sign in when a user is not signed in to Firefox Sync -->
<string name="synced_tabs_sign_in_button">Σύνδεση στο Sync</string> <string name="synced_tabs_sign_in_button">Σύνδεση στο Sync</string>
<!-- Top Sites -->
<!-- Title text displayed in the dialog when top sites limit is reached. -->
<string name="top_sites_max_limit_title">Έχετε φτάσει το ανώτατο όριο κορυφαίων ιστοσελίδων</string>
<!-- Confirmation dialog button text when top sites limit is reached. --> <!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, το κατάλαβα</string> <string name="top_sites_max_limit_confirmation_button">OK, το κατάλαβα</string>

View File

@ -25,6 +25,29 @@
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs --> <!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">%1$s iepen ljepblêden. Tik om tusken ljepblêden te wikseljen.</string> <string name="open_tab_tray_plural">%1$s iepen ljepblêden. Tik om tusken ljepblêden te wikseljen.</string>
<!-- Tab tray multi select title in app bar. The first parameter is the number of tabs selected -->
<string name="tab_tray_multi_select_title">%1$d selektearre</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Nije kolleksje tafoegje</string>
<!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">Namme</string>
<!-- Label of button in save to collection dialog for selecting a current collection -->
<string name="tab_tray_select_collection">Kolleksje selektearje</string>
<!-- Content description for close button while in multiselect mode in tab tray -->
<string name="tab_tray_close_multiselect_content_description">Multiseleksjemodus ferlitte</string>
<!-- Content description for save to collection button while in multiselect mode in tab tray -->
<string name="tab_tray_collection_button_multiselect_content_description">Selektearre ljepblêden yn kolleksje bewarje</string>
<!-- Content description for checkmark while tab is selected while in multiselect mode in tab tray. The first parameter is the title of the tab selected -->
<string name="tab_tray_item_selected_multiselect_content_description">%1$s selektearre</string>
<!-- Content description when tab is unselected while in multiselect mode in tab tray. The first parameter is the title of the tab unselected -->
<string name="tab_tray_item_unselected_multiselect_content_description">Seleksje %1$s ûngedien makke</string>
<!-- Content description announcement when exiting multiselect mode in tab tray -->
<string name="tab_tray_exit_multiselect_content_description">Multiseleksjemodus ferlitten</string>
<!-- Content description announcement when entering multiselect mode in tab tray -->
<string name="tab_tray_enter_multiselect_content_description">Multiseleksjemodus aktivearre, selektearje ljepblêden om yn in kolleksje te bewarjen</string>
<!-- Content description on checkmark while tab is selected in multiselect mode in tab tray -->
<string name="tab_tray_multiselect_selected_content_description">Selektearre</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s is makke troch Mozilla.</string> <string name="about_content">%1$s is makke troch Mozilla.</string>
@ -150,8 +173,8 @@
<!-- Search Fragment --> <!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code --> <!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Scanne</string> <string name="search_scan_button">Scanne</string>
<!-- Button in the search view that lets a user search by using a shortcut --> <!-- Button in the search view that lets a user change their search engine -->
<string name="search_engines_shortcut_button">Sykmasine</string> <string name="search_engine_button">Sykmasine</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings --> <!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Ynstellingen sykmasine</string> <string name="search_shortcuts_engine_settings">Ynstellingen sykmasine</string>
<!-- Header displayed when selecting a shortcut search engine --> <!-- Header displayed when selecting a shortcut search engine -->
@ -282,6 +305,8 @@
<!-- Preference for open links in third party apps --> <!-- Preference for open links in third party apps -->
<string name="preferences_open_links_in_apps">Keppelingen iepenje yn apps</string> <string name="preferences_open_links_in_apps">Keppelingen iepenje yn apps</string>
<!-- Preference for open download with an external download manager app -->
<string name="preferences_external_download_manager">Eksterne downloadbehearder</string>
<!-- Preference for add_ons --> <!-- Preference for add_ons -->
<string name="preferences_addons">Add-ons</string> <string name="preferences_addons">Add-ons</string>
@ -510,6 +535,9 @@
<!-- Postfix for private WebApp titles, placeholder is replaced with app name --> <!-- Postfix for private WebApp titles, placeholder is replaced with app name -->
<string name="pwa_site_controls_title_private">%1$s (priveemodus)</string> <string name="pwa_site_controls_title_private">%1$s (priveemodus)</string>
<!-- Button in the current tab tray header in multiselect mode. Saved the selected tabs to a collection when pressed. -->
<string name="tab_tray_save_to_collection">Bewarje</string>
<!-- History --> <!-- History -->
<!-- Text for the button to clear all history --> <!-- Text for the button to clear all history -->
<string name="history_delete_all">Skiednis wiskje</string> <string name="history_delete_all">Skiednis wiskje</string>
@ -1431,9 +1459,7 @@
<string name="saved_login_duplicate">Der bestiet al in oanmelding mei dy brûkersnamme</string> <string name="saved_login_duplicate">Der bestiet al in oanmelding mei dy brûkersnamme</string>
<!-- Synced Tabs --> <!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account --> <!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_to_sync_account">Ferbine mei in Firefox-account.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">In oar apparaat ferbine.</string> <string name="synced_tabs_connect_another_device">In oar apparaat ferbine.</string>
<!-- Text displayed asking user to re-authenticate --> <!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Graach opnij autentisearje.</string> <string name="synced_tabs_reauth">Graach opnij autentisearje.</string>
@ -1455,13 +1481,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. --> <!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, begrepen</string> <string name="top_sites_max_limit_confirmation_button">OK, begrepen</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Fluchkeppelingen</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Sykje mei</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Diskear sykje mei:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Sykfluchkeppelingen toane</string>
</resources> </resources>

View File

@ -24,6 +24,29 @@
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs --> <!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">%1$s tabs averts. Tutgar per midar tab.</string> <string name="open_tab_tray_plural">%1$s tabs averts. Tutgar per midar tab.</string>
<!-- Tab tray multi select title in app bar. The first parameter is the number of tabs selected -->
<string name="tab_tray_multi_select_title">%1$d tschernids</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Agiuntar ina nova collecziun</string>
<!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">Num</string>
<!-- Label of button in save to collection dialog for selecting a current collection -->
<string name="tab_tray_select_collection">Tscherner ina collecziun</string>
<!-- Content description for close button while in multiselect mode in tab tray -->
<string name="tab_tray_close_multiselect_content_description">Sortir dal modus da tscherna multipla</string>
<!-- Content description for save to collection button while in multiselect mode in tab tray -->
<string name="tab_tray_collection_button_multiselect_content_description">Memorisar ils tabs tschernids en ina collecziun</string>
<!-- Content description for checkmark while tab is selected while in multiselect mode in tab tray. The first parameter is the title of the tab selected -->
<string name="tab_tray_item_selected_multiselect_content_description">%1$s tschernì</string>
<!-- Content description when tab is unselected while in multiselect mode in tab tray. The first parameter is the title of the tab unselected -->
<string name="tab_tray_item_unselected_multiselect_content_description">%1$s betg tschernì</string>
<!-- Content description announcement when exiting multiselect mode in tab tray -->
<string name="tab_tray_exit_multiselect_content_description">Sortì dal modus da tscherna multipla</string>
<!-- Content description announcement when entering multiselect mode in tab tray -->
<string name="tab_tray_enter_multiselect_content_description">Avert il modus da tscherna multipla, tscherner ils tabs per als memorisar en ina collecziun</string>
<!-- Content description on checkmark while tab is selected in multiselect mode in tab tray -->
<string name="tab_tray_multiselect_selected_content_description">Tschernì</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s vegn sviluppà da Mozilla.</string> <string name="about_content">%1$s vegn sviluppà da Mozilla.</string>
@ -144,14 +167,12 @@
<!-- Search Fragment --> <!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code --> <!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Scannar</string> <string name="search_scan_button">Scannar</string>
<!-- Button in the search view that lets a user search by using a shortcut --> <!-- Button in the search view that lets a user change their search engine -->
<string name="search_shortcuts_button">Scursanidas</string> <string name="search_engine_button">Maschina da tschertgar</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings --> <!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Parameters da la maschina da tschertgar</string> <string name="search_shortcuts_engine_settings">Parameters da la maschina da tschertgar</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Tschertgar cun</string>
<!-- Header displayed when selecting a shortcut search engine --> <!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Questa giada, tschertgar cun:</string> <string name="search_engines_search_with">Questa giada, tschertgar cun:</string>
<!-- Button in the search view that lets a user navigate to the site in their clipboard --> <!-- Button in the search view that lets a user navigate to the site in their clipboard -->
<string name="awesomebar_clipboard_title">Encollar la colliaziun en l\'archiv provisoric</string> <string name="awesomebar_clipboard_title">Encollar la colliaziun en l\'archiv provisoric</string>
<!-- Button in the search suggestions onboarding that allows search suggestions in private sessions --> <!-- Button in the search suggestions onboarding that allows search suggestions in private sessions -->
@ -258,8 +279,8 @@
<string name="developer_tools_category">Utensils per sviluppaders</string> <string name="developer_tools_category">Utensils per sviluppaders</string>
<!-- Preference for developers --> <!-- Preference for developers -->
<string name="preferences_remote_debugging">Debugging a distanza via USB</string> <string name="preferences_remote_debugging">Debugging a distanza via USB</string>
<!-- Preference title for switch preference to show search shortcuts --> <!-- Preference title for switch preference to show search engines -->
<string name="preferences_show_search_shortcuts">Mussar las scursanidas per tschertgas</string> <string name="preferences_show_search_engines">Mussar las maschinas da tschertgar</string>
<!-- Preference title for switch preference to show search suggestions --> <!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">Mussar propostas da tschertga</string> <string name="preferences_show_search_suggestions">Mussar propostas da tschertga</string>
<!-- Preference title for switch preference to show voice search button --> <!-- Preference title for switch preference to show voice search button -->
@ -277,6 +298,8 @@
<string name="preferences_account_settings">Parameters dal conto</string> <string name="preferences_account_settings">Parameters dal conto</string>
<!-- Preference for open links in third party apps --> <!-- Preference for open links in third party apps -->
<string name="preferences_open_links_in_apps">Avrir colliaziuns en apps</string> <string name="preferences_open_links_in_apps">Avrir colliaziuns en apps</string>
<!-- Preference for open download with an external download manager app -->
<string name="preferences_external_download_manager">Administraziun da telechargiadas externa</string>
<!-- Preference for add_ons --> <!-- Preference for add_ons -->
<string name="preferences_addons">Supplements</string> <string name="preferences_addons">Supplements</string>
@ -505,6 +528,9 @@
<!-- Postfix for private WebApp titles, placeholder is replaced with app name --> <!-- Postfix for private WebApp titles, placeholder is replaced with app name -->
<string name="pwa_site_controls_title_private">%1$s (modus privat)</string> <string name="pwa_site_controls_title_private">%1$s (modus privat)</string>
<!-- Button in the current tab tray header in multiselect mode. Saved the selected tabs to a collection when pressed. -->
<string name="tab_tray_save_to_collection">Memorisar</string>
<!-- History --> <!-- History -->
<!-- Text for the button to clear all history --> <!-- Text for the button to clear all history -->
<string name="history_delete_all">Stizzar la cronologia</string> <string name="history_delete_all">Stizzar la cronologia</string>
@ -570,6 +596,8 @@
<string name="bookmark_select_folder">Tscherner in ordinatur</string> <string name="bookmark_select_folder">Tscherner in ordinatur</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete the selected folder --> <!-- Confirmation message for a dialog confirming if the user wants to delete the selected folder -->
<string name="bookmark_delete_folder_confirmation_dialog">Vuls ti propi stizzar quest ordinatur?</string> <string name="bookmark_delete_folder_confirmation_dialog">Vuls ti propi stizzar quest ordinatur?</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete multiple items including folders. Parameter will be replaced by app name. -->
<string name="bookmark_delete_multiple_folders_confirmation_dialog">%s vegn a stizzar ils elements tschernids.</string>
<!-- Snackbar title shown after a folder has been deleted. This first parameter is the name of the deleted folder --> <!-- Snackbar title shown after a folder has been deleted. This first parameter is the name of the deleted folder -->
<string name="bookmark_delete_folder_snackbar">Stizzà %1$s</string> <string name="bookmark_delete_folder_snackbar">Stizzà %1$s</string>
<!-- Screen title for adding a bookmarks folder --> <!-- Screen title for adding a bookmarks folder -->
@ -624,8 +652,10 @@
<!-- Bookmark snackbar message on deletion <!-- Bookmark snackbar message on deletion
The first parameter is the host part of the URL of the bookmark deleted, if any --> The first parameter is the host part of the URL of the bookmark deleted, if any -->
<string name="bookmark_deletion_snackbar_message">Stizzà %1$s</string> <string name="bookmark_deletion_snackbar_message">Stizzà %1$s</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks --> <!-- Bookmark snackbar message on deleting multiple bookmarks not including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_2">Stizzà ils segnapaginas</string> <string name="bookmark_deletion_multiple_snackbar_message_2">Stizzà ils segnapaginas</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_3">Stizzar ils ordinaturs tschernids</string>
<!-- Bookmark undo button for deletion snackbar action --> <!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">REVOCAR</string> <string name="bookmark_undo_deletion">REVOCAR</string>
@ -718,6 +748,8 @@
<string name="create_collection_save_to_collection_tab_selected">%d tab tschernì</string> <string name="create_collection_save_to_collection_tab_selected">%d tab tschernì</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection --> <!-- Text shown in snackbar when multiple tabs have been saved in a collection -->
<string name="create_collection_tabs_saved">Memorisà ils tabs!</string> <string name="create_collection_tabs_saved">Memorisà ils tabs!</string>
<!-- Text shown in snackbar when one or multiple tabs have been saved in a new collection -->
<string name="create_collection_tabs_saved_new_collection">Memorisà la collecziun!</string>
<!-- Text shown in snackbar when one tab has been saved in a collection --> <!-- Text shown in snackbar when one tab has been saved in a collection -->
<string name="create_collection_tab_saved">Memorisà il tab!</string> <string name="create_collection_tab_saved">Memorisà il tab!</string>
<!-- Content description (not visible, for screen readers etc.): button to close the collection creator --> <!-- Content description (not visible, for screen readers etc.): button to close the collection creator -->
@ -825,6 +857,10 @@
<string name="qr_scanner_dialog_negative">REFUSAR</string> <string name="qr_scanner_dialog_negative">REFUSAR</string>
<!-- Tab collection deletion prompt dialog message. Placeholder will be replaced with the collection name --> <!-- Tab collection deletion prompt dialog message. Placeholder will be replaced with the collection name -->
<string name="tab_collection_dialog_message">Vuls ti propi stizzar %1$s?</string> <string name="tab_collection_dialog_message">Vuls ti propi stizzar %1$s?</string>
<!-- Collection and tab deletion prompt dialog message. This will show when the last tab from a collection is deleted -->
<string name="delete_tab_and_collection_dialog_message">Cun stizzar quest tab vegn l\'entira collecziun stizzada. Ti pos da tut temp crear novas collecziuns.</string>
<!-- Collection and tab deletion prompt dialog title. Placeholder will be replaced with the collection name. This will show when the last tab from a collection is deleted -->
<string name="delete_tab_and_collection_dialog_title">Stizzar %1$s?</string>
<!-- Tab collection deletion prompt dialog option to delete the collection --> <!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">Stizzar</string> <string name="tab_collection_dialog_positive">Stizzar</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection --> <!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
@ -1231,6 +1267,8 @@
<string name="preferences_passwords_exceptions_description_empty">Las infurmaziuns d\'annunzia ed ils pleds-clav betg memorisads vegnan mussadas qua.</string> <string name="preferences_passwords_exceptions_description_empty">Las infurmaziuns d\'annunzia ed ils pleds-clav betg memorisads vegnan mussadas qua.</string>
<!-- Description of list of login exceptions that we never save logins for --> <!-- Description of list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions_description">Las infurmaziuns d\'annunzia ed ils pleds-clav na vegnan betg memorisads per questas paginas.</string> <string name="preferences_passwords_exceptions_description">Las infurmaziuns d\'annunzia ed ils pleds-clav na vegnan betg memorisads per questas paginas.</string>
<!-- Text on button to remove all saved login exceptions -->
<string name="preferences_passwords_exceptions_remove_all">Stizzar tut las excepziuns</string>
<!-- Hint for search box in logins list --> <!-- Hint for search box in logins list -->
<string name="preferences_passwords_saved_logins_search">Tschertgar datas d\'annunzia</string> <string name="preferences_passwords_saved_logins_search">Tschertgar datas d\'annunzia</string>
<!-- Option to sort logins list A-Z, alphabetically --> <!-- Option to sort logins list A-Z, alphabetically -->
@ -1270,6 +1308,8 @@
<string name="saved_login_copy_username">Copiar il num d\'utilisader</string> <string name="saved_login_copy_username">Copiar il num d\'utilisader</string>
<!-- Content Description (for screenreaders etc) read for the button to copy a site in logins --> <!-- Content Description (for screenreaders etc) read for the button to copy a site in logins -->
<string name="saved_login_copy_site">Copiar la pagina</string> <string name="saved_login_copy_site">Copiar la pagina</string>
<!-- Content Description (for screenreaders etc) read for the button to open a site in logins -->
<string name="saved_login_open_site">Avrir la website en il navigatur</string>
<!-- Content Description (for screenreaders etc) read for the button to reveal a password in logins --> <!-- Content Description (for screenreaders etc) read for the button to reveal a password in logins -->
<string name="saved_login_reveal_password">Mussar il pled-clav</string> <string name="saved_login_reveal_password">Mussar il pled-clav</string>
<!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins -->
@ -1422,9 +1462,7 @@
<string name="saved_login_duplicate">Datas d\'annunzia cun quest num d\'utilisader existan gia</string> <string name="saved_login_duplicate">Datas d\'annunzia cun quest num d\'utilisader existan gia</string>
<!-- Synced Tabs --> <!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account --> <!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_to_sync_account">Connectar cun in conto da Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Colliar in auter apparat.</string> <string name="synced_tabs_connect_another_device">Colliar in auter apparat.</string>
<!-- Text displayed asking user to re-authenticate --> <!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Re-autentifitgescha per plaschair.</string> <string name="synced_tabs_reauth">Re-autentifitgescha per plaschair.</string>

View File

@ -974,9 +974,10 @@
<string name="onboarding_whats_new_description">Have questions about the redesigned %s? Want to know whats changed?</string> <string name="onboarding_whats_new_description">Have questions about the redesigned %s? Want to know whats changed?</string>
<!-- text for underlined clickable link that is part of "what's new" onboarding card description that links to an FAQ --> <!-- text for underlined clickable link that is part of "what's new" onboarding card description that links to an FAQ -->
<string name="onboarding_whats_new_description_linktext">Get answers here</string> <string name="onboarding_whats_new_description_linktext">Get answers here</string>
<!-- text for the firefox account onboarding card header <!-- text for the firefox account onboarding card header -->
The first parameter is the name of the app (e.g. Firefox Preview) --> <string name="onboarding_firefox_account_header">Start syncing bookmarks, passwords, and more with your Firefox account.</string>
<string name="onboarding_firefox_account_header">Get the most out of %s.</string> <!-- Text for the button to learn more about signing in to your Firefox account -->
<string name="onboarding_manual_sign_in_learn_more">Learn more</string>
<!-- text for the firefox account onboarding card header when we detect you're already signed in to <!-- text for the firefox account onboarding card header when we detect you're already signed in to
another Firefox browser. (The word `Firefox` should not be translated) another Firefox browser. (The word `Firefox` should not be translated)
The first parameter is the email of the detected user's account --> The first parameter is the email of the detected user's account -->

View File

@ -65,7 +65,7 @@ class OnboardingAutomaticSignInViewHolderTest {
"You are signed in as email@example.com on another Firefox browser on this phone. Would you like to sign in with this account?", "You are signed in as email@example.com on another Firefox browser on this phone. Would you like to sign in with this account?",
view.header_text.text view.header_text.text
) )
assertTrue(view.turn_on_sync_button.isEnabled) assertTrue(view.fxa_sign_in_button.isEnabled)
} }
@Test @Test
@ -79,10 +79,10 @@ class OnboardingAutomaticSignInViewHolderTest {
val holder = OnboardingAutomaticSignInViewHolder(view, scope = this) val holder = OnboardingAutomaticSignInViewHolder(view, scope = this)
holder.bind(account) holder.bind(account)
holder.onClick(view.turn_on_sync_button) holder.onClick(view.fxa_sign_in_button)
assertEquals("Signing in…", view.turn_on_sync_button.text) assertEquals("Signing in…", view.fxa_sign_in_button.text)
assertFalse(view.turn_on_sync_button.isEnabled) assertFalse(view.fxa_sign_in_button.isEnabled)
} }
@Test @Test
@ -96,10 +96,10 @@ class OnboardingAutomaticSignInViewHolderTest {
val holder = OnboardingAutomaticSignInViewHolder(view, scope = this) val holder = OnboardingAutomaticSignInViewHolder(view, scope = this)
holder.bind(account) holder.bind(account)
holder.onClick(view.turn_on_sync_button) holder.onClick(view.fxa_sign_in_button)
assertEquals("Yes, sign me in", view.turn_on_sync_button.text) assertEquals("Yes, sign me in", view.fxa_sign_in_button.text)
assertTrue(view.turn_on_sync_button.isEnabled) assertTrue(view.fxa_sign_in_button.isEnabled)
verify { snackbar.setText("Failed to sign-in") } verify { snackbar.setText("Failed to sign-in") }
} }
} }

View File

@ -6,9 +6,12 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.Navigation import androidx.navigation.Navigation
import io.mockk.Runs
import io.mockk.every import io.mockk.every
import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkStatic import io.mockk.mockkStatic
import io.mockk.unmockkStatic import io.mockk.unmockkStatic
@ -22,20 +25,27 @@ import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.HomeFragmentDirections import org.mozilla.fenix.home.HomeFragmentDirections
import org.mozilla.fenix.onboarding.OnboardingInteractor
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class OnboardingManualSignInViewHolderTest { class OnboardingManualSignInViewHolderTest {
private lateinit var view: View private lateinit var view: View
private lateinit var navController: NavController private lateinit var navController: NavController
private lateinit var interactor: OnboardingInteractor
private lateinit var itemView: ViewGroup
@Before @Before
fun setup() { fun setup() {
view = LayoutInflater.from(testContext) view = LayoutInflater.from(testContext)
.inflate(OnboardingManualSignInViewHolder.LAYOUT_ID, null) .inflate(OnboardingManualSignInViewHolder.LAYOUT_ID, null)
navController = mockk(relaxed = true) navController = mockk(relaxed = true)
interactor = mockk(relaxUnitFun = true)
itemView = mockk(relaxed = true)
mockkStatic(Navigation::class) mockkStatic(Navigation::class)
every { itemView.context } returns testContext
every { interactor.onLearnMoreClicked() } just Runs
every { Navigation.findNavController(view) } returns navController every { Navigation.findNavController(view) } returns navController
} }
@ -48,13 +58,16 @@ class OnboardingManualSignInViewHolderTest {
fun `bind header text`() { fun `bind header text`() {
OnboardingManualSignInViewHolder(view).bind() OnboardingManualSignInViewHolder(view).bind()
assertEquals("Get the most out of Firefox Preview.", view.header_text.text) assertEquals(
"Start syncing bookmarks, passwords, and more with your Firefox account.",
view.header_text.text
)
} }
@Test @Test
fun `navigate on click`() { fun `navigate on click`() {
OnboardingManualSignInViewHolder(view) OnboardingManualSignInViewHolder(view)
view.turn_on_sync_button.performClick() view.fxa_sign_in_button.performClick()
verify { navController.navigate(HomeFragmentDirections.actionGlobalTurnOnSync()) } verify { navController.navigate(HomeFragmentDirections.actionGlobalTurnOnSync()) }
} }

View File

@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents { object AndroidComponents {
const val VERSION = "54.0.20200818130156" const val VERSION = "56.0.20200819190136"
} }