Merge remote-tracking branch 'upstream/master' into fork

pull/21/head
Adam Novak 4 years ago
commit d2a82b8de3

@ -29,6 +29,8 @@ import org.mozilla.fenix.ui.robots.DeepLinkRobot
* - fenix://urls_bookmarks — take the user to the bookmarks list * - fenix://urls_bookmarks — take the user to the bookmarks list
* - fenix://settings_logins — take the user to the settings page to do with logins (not the saved logins). * - fenix://settings_logins — take the user to the settings page to do with logins (not the saved logins).
**/ **/
@Ignore("All tests perma-failing, see: https://github.com/mozilla-mobile/fenix/issues/13491")
class DeepLinkTest { class DeepLinkTest {
private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
private lateinit var mockWebServer: MockWebServer private lateinit var mockWebServer: MockWebServer

@ -5,6 +5,7 @@
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper
import mozilla.components.browser.engine.gecko.ext.toContentBlockingSetting
import mozilla.components.browser.engine.gecko.glean.GeckoAdapter import mozilla.components.browser.engine.gecko.glean.GeckoAdapter
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy
import mozilla.components.concept.storage.LoginsStorage import mozilla.components.concept.storage.LoginsStorage
@ -50,8 +51,7 @@ object GeckoProvider {
val runtimeSettings = builder val runtimeSettings = builder
.crashHandler(CrashHandlerService::class.java) .crashHandler(CrashHandlerService::class.java)
.telemetryDelegate(GeckoAdapter()) .telemetryDelegate(GeckoAdapter())
// TODO: Fix me! .contentBlocking(policy.toContentBlockingSetting())
// .contentBlocking(policy.toContentBlockingSetting())
.aboutConfigEnabled(true) .aboutConfigEnabled(true)
.debugLogging(Config.channel.isDebug) .debugLogging(Config.channel.isDebug)
.build() .build()

@ -28,7 +28,14 @@ class AppRequestInterceptor(private val context: Context) : RequestInterceptor {
): RequestInterceptor.InterceptionResponse? { ): RequestInterceptor.InterceptionResponse? {
return context.components.services.appLinksInterceptor return context.components.services.appLinksInterceptor
.onLoadRequest( .onLoadRequest(
engineSession, uri, lastUri, hasUserGesture, isSameDomain, isRedirect, isDirectNavigation, isSubframeRequest engineSession,
uri,
lastUri,
hasUserGesture,
isSameDomain,
isRedirect,
isDirectNavigation,
isSubframeRequest
) )
} }

@ -252,10 +252,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
lifecycleScope.launch(IO) { lifecycleScope.launch(IO) {
if ( if (
settings().isDefaultBrowser() && settings().isDefaultBrowser() &&
settings().wasDefaultBrowserOnLastPause != settings().isDefaultBrowser() settings().wasDefaultBrowserOnLastResume != settings().isDefaultBrowser()
) { ) {
metrics.track(Event.ChangedToDefaultBrowser) metrics.track(Event.ChangedToDefaultBrowser)
} }
settings().wasDefaultBrowserOnLastResume = settings().isDefaultBrowser()
} }
} }
@ -264,11 +266,6 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
} }
if (settings().wasDefaultBrowserOnLastPause != settings().isDefaultBrowser()
) {
settings().wasDefaultBrowserOnLastPause = settings().isDefaultBrowser()
}
super.onPause() super.onPause()
// Every time the application goes into the background, it is possible that the user // Every time the application goes into the background, it is possible that the user

@ -42,7 +42,6 @@ import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab
import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.state.content.DownloadState
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.thumbnails.BrowserThumbnails
import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.feature.accounts.FxaCapability import mozilla.components.feature.accounts.FxaCapability
import mozilla.components.feature.accounts.FxaWebChannelFeature import mozilla.components.feature.accounts.FxaWebChannelFeature
@ -101,6 +100,7 @@ import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.ext.accessibilityManager import org.mozilla.fenix.ext.accessibilityManager
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enterToImmersiveMode import org.mozilla.fenix.ext.enterToImmersiveMode
import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.ext.hideToolbar import org.mozilla.fenix.ext.hideToolbar
import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.nav
@ -140,7 +140,6 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
private val appLinksFeature = ViewBoundFeatureWrapper<AppLinksFeature>() private val appLinksFeature = ViewBoundFeatureWrapper<AppLinksFeature>()
private val promptsFeature = ViewBoundFeatureWrapper<PromptFeature>() private val promptsFeature = ViewBoundFeatureWrapper<PromptFeature>()
private val findInPageIntegration = ViewBoundFeatureWrapper<FindInPageIntegration>() private val findInPageIntegration = ViewBoundFeatureWrapper<FindInPageIntegration>()
private val thumbnailsFeature = ViewBoundFeatureWrapper<BrowserThumbnails>()
private val toolbarIntegration = ViewBoundFeatureWrapper<ToolbarIntegration>() private val toolbarIntegration = ViewBoundFeatureWrapper<ToolbarIntegration>()
private val sitePermissionsFeature = ViewBoundFeatureWrapper<SitePermissionsFeature>() private val sitePermissionsFeature = ViewBoundFeatureWrapper<SitePermissionsFeature>()
private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>() private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>()
@ -281,12 +280,6 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
lifecycleOwner = viewLifecycleOwner lifecycleOwner = viewLifecycleOwner
) )
thumbnailsFeature.set(
feature = BrowserThumbnails(context, view.engineView, store),
owner = this,
view = view
)
toolbarIntegration.set( toolbarIntegration.set(
feature = browserToolbarView.toolbarIntegration, feature = browserToolbarView.toolbarIntegration,
owner = this, owner = this,
@ -594,7 +587,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
.ifChanged { it.content.firstContentfulPaint } .ifChanged { it.content.firstContentfulPaint }
.collect { .collect {
val showEngineView = val showEngineView =
it.content.firstContentfulPaint || it.content.progress == 100 it.content.firstContentfulPaint || it.content.progress == LOADING_PROGRESS_COMPLETE
if (showEngineView) { if (showEngineView) {
engineView?.asView()?.isVisible = true engineView?.asView()?.isVisible = true
@ -812,11 +805,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
} }
override fun onBackLongPressed(): Boolean { override fun onBackLongPressed(): Boolean {
if (FeatureFlags.tabHistory) { findNavController().navigate(R.id.action_global_tabHistoryDialogFragment)
findNavController().navigate(R.id.action_global_tabHistoryDialogFragment) return true
return true
}
return false
} }
/** /**
@ -1082,6 +1072,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
private const val REQUEST_CODE_DOWNLOAD_PERMISSIONS = 1 private const val REQUEST_CODE_DOWNLOAD_PERMISSIONS = 1
private const val REQUEST_CODE_PROMPT_PERMISSIONS = 2 private const val REQUEST_CODE_PROMPT_PERMISSIONS = 2
private const val REQUEST_CODE_APP_PERMISSIONS = 3 private const val REQUEST_CODE_APP_PERMISSIONS = 3
private const val LOADING_PROGRESS_COMPLETE = 100
} }
override fun onAccessibilityStateChanged(enabled: Boolean) { override fun onAccessibilityStateChanged(enabled: Boolean) {

@ -42,7 +42,7 @@ class BrowserAnimator(
if (unwrappedSwipeRefresh?.context?.settings()?.waitToShowPageUntilFirstPaint == true) { if (unwrappedSwipeRefresh?.context?.settings()?.waitToShowPageUntilFirstPaint == true) {
if (firstContentfulHappened()) { if (firstContentfulHappened()) {
viewLifecycleScope.get()?.launch { viewLifecycleScope.get()?.launch {
delay(100) delay(ANIMATION_DELAY)
unwrappedEngineView?.asView()?.visibility = View.VISIBLE unwrappedEngineView?.asView()?.visibility = View.VISIBLE
unwrappedSwipeRefresh?.background = null unwrappedSwipeRefresh?.background = null
unwrappedSwipeRefresh?.alpha = 1f unwrappedSwipeRefresh?.alpha = 1f
@ -91,6 +91,8 @@ class BrowserAnimator(
} }
companion object { companion object {
private const val ANIMATION_DELAY = 100L
fun getToolbarNavOptions(context: Context): NavOptions { fun getToolbarNavOptions(context: Context): NavOptions {
val navOptions = NavOptions.Builder() val navOptions = NavOptions.Builder()

@ -21,6 +21,7 @@ import kotlinx.android.synthetic.main.fragment_browser.view.*
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import mozilla.components.browser.session.Session import mozilla.components.browser.session.Session
import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.selector.findTab
import mozilla.components.browser.thumbnails.BrowserThumbnails
import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.feature.app.links.AppLinksUseCases import mozilla.components.feature.app.links.AppLinksUseCases
import mozilla.components.feature.contextmenu.ContextMenuCandidate import mozilla.components.feature.contextmenu.ContextMenuCandidate
@ -55,6 +56,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
private val windowFeature = ViewBoundFeatureWrapper<WindowFeature>() private val windowFeature = ViewBoundFeatureWrapper<WindowFeature>()
private val searchFeature = ViewBoundFeatureWrapper<SearchFeature>() private val searchFeature = ViewBoundFeatureWrapper<SearchFeature>()
private val thumbnailsFeature = ViewBoundFeatureWrapper<BrowserThumbnails>()
private var readerModeAvailable = false private var readerModeAvailable = false
@ -107,6 +109,12 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
browserToolbarView.view.addPageAction(readerModeAction) browserToolbarView.view.addPageAction(readerModeAction)
thumbnailsFeature.set(
feature = BrowserThumbnails(context, view.engineView, components.core.store),
owner = this,
view = view
)
readerViewFeature.set( readerViewFeature.set(
feature = StrictMode.allowThreadDiskReads().resetPoliciesAfter { feature = StrictMode.allowThreadDiskReads().resetPoliciesAfter {
ReaderViewFeature( ReaderViewFeature(

@ -35,6 +35,7 @@ import kotlin.math.min
* Handles intercepting touch events on the toolbar for swipe gestures and executes the * Handles intercepting touch events on the toolbar for swipe gestures and executes the
* necessary animations. * necessary animations.
*/ */
@Suppress("LargeClass", "TooManyFunctions")
class ToolbarGestureHandler( class ToolbarGestureHandler(
private val activity: Activity, private val activity: Activity,
private val contentLayout: View, private val contentLayout: View,
@ -76,6 +77,7 @@ class ToolbarGestureHandler(
GestureDirection.LEFT_TO_RIGHT GestureDirection.LEFT_TO_RIGHT
} }
@Suppress("ComplexCondition")
return if ( return if (
!activity.window.decorView.isKeyboardVisible() && !activity.window.decorView.isKeyboardVisible() &&
start.isInToolbar() && start.isInToolbar() &&

@ -95,6 +95,7 @@ class LeanplumMetricsService(
deviceId deviceId
} }
@Suppress("ComplexMethod")
override fun start() { override fun start() {
if (!application.settings().isMarketingTelemetryEnabled) return if (!application.settings().isMarketingTelemetryEnabled) return
@ -255,7 +256,7 @@ class LeanplumMetricsService(
"jpn" // Japanese "jpn" // Japanese
) )
private val PREFERENCE_NAME = "LEANPLUM_PREFERENCES" private const val PREFERENCE_NAME = "LEANPLUM_PREFERENCES"
private val DEVICE_ID_KEY = "LP_DEVICE_ID" private const val DEVICE_ID_KEY = "LP_DEVICE_ID"
} }
} }

@ -140,6 +140,7 @@ internal class ReleaseMetricController(
MetricServiceType.Marketing -> isMarketingDataTelemetryEnabled() MetricServiceType.Marketing -> isMarketingDataTelemetryEnabled()
} }
@Suppress("LongMethod")
private fun Fact.toEvent(): Event? = when (Pair(component, item)) { private fun Fact.toEvent(): Event? = when (Pair(component, item)) {
Component.FEATURE_PROMPTS to LoginDialogFacts.Items.DISPLAY -> Event.LoginDialogPromptDisplayed Component.FEATURE_PROMPTS to LoginDialogFacts.Items.DISPLAY -> Event.LoginDialogPromptDisplayed
Component.FEATURE_PROMPTS to LoginDialogFacts.Items.CANCEL -> Event.LoginDialogPromptCancelled Component.FEATURE_PROMPTS to LoginDialogFacts.Items.CANCEL -> Event.LoginDialogPromptCancelled

@ -23,7 +23,6 @@ import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.feature.session.SessionFeature import mozilla.components.feature.session.SessionFeature
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.kotlin.isUrl import mozilla.components.support.ktx.kotlin.isUrl
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.R import org.mozilla.fenix.R
@ -204,14 +203,18 @@ class DefaultBrowserToolbarController(
trackToolbarItemInteraction(item) trackToolbarItemInteraction(item)
Do exhaustive when (item) { Do exhaustive when (item) {
ToolbarMenu.Item.Back -> sessionUseCases.goBack.invoke(currentSession) is ToolbarMenu.Item.Back -> {
if (item.viewHistory) {
navController.navigate(R.id.action_global_tabHistoryDialogFragment)
} else {
sessionUseCases.goBack.invoke(currentSession)
}
}
is ToolbarMenu.Item.Forward -> { is ToolbarMenu.Item.Forward -> {
if (FeatureFlags.tabHistory && item.viewHistory) { if (item.viewHistory) {
navController.navigate(R.id.action_global_tabHistoryDialogFragment) navController.navigate(R.id.action_global_tabHistoryDialogFragment)
} else if (!item.viewHistory) {
sessionUseCases.goForward.invoke(currentSession)
} else { } else {
// Do nothing if tab history feature flag is off and item.viewHistory is true sessionUseCases.goForward.invoke(currentSession)
} }
} }
is ToolbarMenu.Item.Reload -> { is ToolbarMenu.Item.Reload -> {
@ -383,7 +386,7 @@ class DefaultBrowserToolbarController(
@Suppress("ComplexMethod") @Suppress("ComplexMethod")
private fun trackToolbarItemInteraction(item: ToolbarMenu.Item) { private fun trackToolbarItemInteraction(item: ToolbarMenu.Item) {
val eventItem = when (item) { val eventItem = when (item) {
ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK is ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK
is ToolbarMenu.Item.Forward -> Event.BrowserMenuItemTapped.Item.FORWARD is ToolbarMenu.Item.Forward -> Event.BrowserMenuItemTapped.Item.FORWARD
is ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD is ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD
ToolbarMenu.Item.Stop -> Event.BrowserMenuItemTapped.Item.STOP ToolbarMenu.Item.Stop -> Event.BrowserMenuItemTapped.Item.STOP

@ -250,8 +250,10 @@ class BrowserToolbarView(
private const val TOOLBAR_ELEVATION = 16 private const val TOOLBAR_ELEVATION = 16
} }
@Suppress("ComplexCondition")
private fun ToolbarMenu.Item.performHapticIfNeeded(view: View) { private fun ToolbarMenu.Item.performHapticIfNeeded(view: View) {
if (this is ToolbarMenu.Item.Reload && this.bypassCache || if (this is ToolbarMenu.Item.Reload && this.bypassCache ||
this is ToolbarMenu.Item.Back && this.viewHistory ||
this is ToolbarMenu.Item.Forward && this.viewHistory this is ToolbarMenu.Item.Forward && this.viewHistory
) { ) {
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)

@ -74,6 +74,20 @@ class DefaultToolbarMenu(
} }
override val menuToolbar by lazy { override val menuToolbar by lazy {
val back = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back,
primaryContentDescription = context.getString(R.string.browser_menu_back),
primaryImageTintResource = primaryTextColor(),
isInPrimaryState = {
session?.canGoBack ?: true
},
secondaryImageTintResource = ThemeManager.resolveAttribute(R.attr.disabled, context),
disableInSecondaryState = true,
longClickListener = { onItemTapped.invoke(ToolbarMenu.Item.Back(viewHistory = true)) }
) {
onItemTapped.invoke(ToolbarMenu.Item.Back(viewHistory = false))
}
val forward = BrowserMenuItemToolbar.TwoStateButton( val forward = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward, primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward,
primaryContentDescription = context.getString(R.string.browser_menu_forward), primaryContentDescription = context.getString(R.string.browser_menu_forward),
@ -135,7 +149,7 @@ class DefaultToolbarMenu(
onItemTapped.invoke(ToolbarMenu.Item.Bookmark) onItemTapped.invoke(ToolbarMenu.Item.Bookmark)
} }
BrowserMenuItemToolbar(listOf(bookmark, share, forward, refresh)) BrowserMenuItemToolbar(listOf(back, forward, bookmark, share, refresh))
} }
// Predicates that need to be repeatedly called as the session changes // Predicates that need to be repeatedly called as the session changes

@ -13,7 +13,7 @@ interface ToolbarMenu {
data class RequestDesktop(val isChecked: Boolean) : Item() data class RequestDesktop(val isChecked: Boolean) : Item()
object FindInPage : Item() object FindInPage : Item()
object Share : Item() object Share : Item()
object Back : Item() data class Back(val viewHistory: Boolean) : Item()
data class Forward(val viewHistory: Boolean) : Item() data class Forward(val viewHistory: Boolean) : Item()
data class Reload(val bypassCache: Boolean) : Item() data class Reload(val bypassCache: Boolean) : Item()
object Stop : Item() object Stop : Item()

@ -59,9 +59,10 @@ class CustomTabToolbarMenu(
R.attr.disabled, R.attr.disabled,
context context
), ),
disableInSecondaryState = true disableInSecondaryState = true,
longClickListener = { onItemTapped.invoke(ToolbarMenu.Item.Back(viewHistory = true)) }
) { ) {
onItemTapped.invoke(ToolbarMenu.Item.Back) onItemTapped.invoke(ToolbarMenu.Item.Back(viewHistory = false))
} }
val forward = BrowserMenuItemToolbar.TwoStateButton( val forward = BrowserMenuItemToolbar.TwoStateButton(

@ -232,7 +232,10 @@ class DefaultSessionControlController(
} }
override fun handleCollectionShareTabsClicked(collection: TabCollection) { override fun handleCollectionShareTabsClicked(collection: TabCollection) {
showShareFragment(collection.tabs.map { ShareData(url = it.url, title = it.title) }) showShareFragment(
collection.title,
collection.tabs.map { ShareData(url = it.url, title = it.title) }
)
metrics.track(Event.CollectionShared) metrics.track(Event.CollectionShared)
} }
@ -366,8 +369,9 @@ class DefaultSessionControlController(
showTabTrayCollectionCreation() showTabTrayCollectionCreation()
} }
private fun showShareFragment(data: List<ShareData>) { private fun showShareFragment(shareSubject: String, data: List<ShareData>) {
val directions = HomeFragmentDirections.actionGlobalShareFragment( val directions = HomeFragmentDirections.actionGlobalShareFragment(
shareSubject = shareSubject,
data = data.toTypedArray() data = data.toTypedArray()
) )
navController.nav(R.id.homeFragment, directions) navController.nav(R.id.homeFragment, directions)

@ -302,8 +302,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
private fun setupPreferences() { private fun setupPreferences() {
val leakKey = getPreferenceKey(R.string.pref_key_leakcanary) val leakKey = getPreferenceKey(R.string.pref_key_leakcanary)
val debuggingKey = getPreferenceKey(R.string.pref_key_remote_debugging) val debuggingKey = getPreferenceKey(R.string.pref_key_remote_debugging)
val externalDownloadManagerKey = getPreferenceKey(R.string.pref_key_external_download_manager) val preferenceExternalDownloadManager = requirePreference<Preference>(R.string.pref_key_make_default_browser)
val preferenceExternalDownloadManager = findPreference<Preference>(externalDownloadManagerKey)
val preferenceLeakCanary = findPreference<Preference>(leakKey) val preferenceLeakCanary = findPreference<Preference>(leakKey)
val preferenceRemoteDebugging = findPreference<Preference>(debuggingKey) val preferenceRemoteDebugging = findPreference<Preference>(debuggingKey)
val preferenceMakeDefaultBrowser = requirePreference<Preference>(R.string.pref_key_make_default_browser) val preferenceMakeDefaultBrowser = requirePreference<Preference>(R.string.pref_key_make_default_browser)
@ -316,7 +315,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
} }
} }
preferenceExternalDownloadManager?.isVisible = FeatureFlags.externalDownloadManager preferenceExternalDownloadManager.isVisible = FeatureFlags.externalDownloadManager
preferenceRemoteDebugging?.setOnPreferenceChangeListener<Boolean> { preference, newValue -> preferenceRemoteDebugging?.setOnPreferenceChangeListener<Boolean> { preference, newValue ->
preference.context.settings().preferences.edit() preference.context.settings().preferences.edit()
.putBoolean(preference.key, newValue).apply() .putBoolean(preference.key, newValue).apply()

@ -55,6 +55,7 @@ interface ShareController {
* Default behavior of [ShareController]. Other implementations are possible. * Default behavior of [ShareController]. Other implementations are possible.
* *
* @param context [Context] used for various Android interactions. * @param context [Context] used for various Android interactions.
* @param shareSubject desired message subject used when sharing through 3rd party apps, like email clients.
* @param shareData the list of [ShareData]s that can be shared. * @param shareData the list of [ShareData]s that can be shared.
* @param sendTabUseCases instance of [SendTabUseCases] which allows sending tabs to account devices. * @param sendTabUseCases instance of [SendTabUseCases] which allows sending tabs to account devices.
* @param snackbar - instance of [FenixSnackbar] for displaying styled snackbars * @param snackbar - instance of [FenixSnackbar] for displaying styled snackbars
@ -64,6 +65,7 @@ interface ShareController {
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
class DefaultShareController( class DefaultShareController(
private val context: Context, private val context: Context,
private val shareSubject: String?,
private val shareData: List<ShareData>, private val shareData: List<ShareData>,
private val sendTabUseCases: SendTabUseCases, private val sendTabUseCases: SendTabUseCases,
private val snackbar: FenixSnackbar, private val snackbar: FenixSnackbar,
@ -90,7 +92,7 @@ class DefaultShareController(
val intent = Intent(ACTION_SEND).apply { val intent = Intent(ACTION_SEND).apply {
putExtra(EXTRA_TEXT, getShareText()) putExtra(EXTRA_TEXT, getShareText())
putExtra(EXTRA_SUBJECT, shareData.map { it.title }.joinToString(", ")) putExtra(EXTRA_SUBJECT, getShareSubject())
type = "text/plain" type = "text/plain"
flags = FLAG_ACTIVITY_NEW_TASK flags = FLAG_ACTIVITY_NEW_TASK
setClassName(app.packageName, app.activityName) setClassName(app.packageName, app.activityName)
@ -189,6 +191,9 @@ class DefaultShareController(
} }
} }
@VisibleForTesting
internal fun getShareSubject() = shareSubject ?: shareData.map { it.title }.joinToString(", ")
// Navigation between app fragments uses ShareTab as arguments. SendTabUseCases uses TabData. // Navigation between app fragments uses ShareTab as arguments. SendTabUseCases uses TabData.
@VisibleForTesting @VisibleForTesting
internal fun List<ShareData>.toTabData() = map { data -> internal fun List<ShareData>.toTabData() = map { data ->

@ -67,6 +67,7 @@ class ShareFragment : AppCompatDialogFragment() {
shareInteractor = ShareInteractor( shareInteractor = ShareInteractor(
DefaultShareController( DefaultShareController(
context = requireContext(), context = requireContext(),
shareSubject = args.shareSubject,
shareData = shareData, shareData = shareData,
snackbar = FenixSnackbar.make( snackbar = FenixSnackbar.make(
view = requireActivity().getRootView()!!, view = requireActivity().getRootView()!!,

@ -34,18 +34,25 @@ class TabHistoryView(
private val adapter = TabHistoryAdapter(interactor) private val adapter = TabHistoryAdapter(interactor)
private val layoutManager = object : LinearLayoutManager(containerView.context) { private val layoutManager = object : LinearLayoutManager(containerView.context) {
private var shouldScrollToSelected = true
override fun onLayoutCompleted(state: RecyclerView.State?) { override fun onLayoutCompleted(state: RecyclerView.State?) {
super.onLayoutCompleted(state) super.onLayoutCompleted(state)
currentIndex?.let { index -> currentIndex?.let { index ->
// Force expansion of the dialog, otherwise scrolling to the current history item // Attempt to center the current history item after the first layout is completed,
// won't work when its position is near the bottom of the recyclerview. // but not after subsequent layouts
expandDialog.invoke() if (shouldScrollToSelected) {
// Also, attempt to center the current history item. // Force expansion of the dialog, otherwise scrolling to the current history item
val itemView = tabHistoryRecyclerView.findViewHolderForLayoutPosition( // won't work when its position is near the bottom of the recyclerview.
findFirstCompletelyVisibleItemPosition() expandDialog.invoke()
)?.itemView val itemView = tabHistoryRecyclerView.findViewHolderForLayoutPosition(
val offset = tabHistoryRecyclerView.height / 2 - (itemView?.height ?: 0) / 2 findFirstCompletelyVisibleItemPosition()
scrollToPositionWithOffset(index, offset) )?.itemView
val offset = tabHistoryRecyclerView.height / 2 - (itemView?.height ?: 0) / 2
scrollToPositionWithOffset(index, offset)
shouldScrollToSelected = false
}
} }
} }
}.apply { }.apply {

@ -33,7 +33,9 @@ class TabHistoryViewHolder(
history_layout.loadFavicon(item.url) history_layout.loadFavicon(item.url)
if (item.isSelected) { if (item.isSelected) {
history_layout.setBackgroundColor(history_layout.context.getColorFromAttr(R.attr.tabHistoryItemSelectedBackground)) history_layout.setBackgroundColor(
history_layout.context.getColorFromAttr(R.attr.tabHistoryItemSelectedBackground)
)
} else { } else {
history_layout.background = null history_layout.background = null
} }

@ -8,7 +8,11 @@ import mozilla.components.support.ktx.android.content.PreferencesHolder
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
fun featureFlagPreference(key: String, default: Boolean, featureFlag: Boolean): ReadWriteProperty<PreferencesHolder, Boolean> = fun featureFlagPreference(
key: String,
default: Boolean,
featureFlag: Boolean
): ReadWriteProperty<PreferencesHolder, Boolean> =
FeatureFlagPreferencePreference(key, default, featureFlag) FeatureFlagPreferencePreference(key, default, featureFlag)
private class FeatureFlagPreferencePreference( private class FeatureFlagPreferencePreference(

@ -340,7 +340,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
* Caches the last known "is default browser" state when the app was paused. * Caches the last known "is default browser" state when the app was paused.
* For an up to do date state use `isDefaultBrowser` instead. * For an up to do date state use `isDefaultBrowser` instead.
*/ */
var wasDefaultBrowserOnLastPause by booleanPreference( var wasDefaultBrowserOnLastResume by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_default_browser), appContext.getPreferenceKey(R.string.pref_key_default_browser),
default = isDefaultBrowser() default = isDefaultBrowser()
) )

@ -53,7 +53,8 @@
app:layout_constraintStart_toEndOf="@id/icon" app:layout_constraintStart_toEndOf="@id/icon"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/url" app:layout_constraintBottom_toTopOf="@+id/url"
app:layout_constraintVertical_chainStyle="packed"/> app:layout_constraintVertical_chainStyle="packed"
app:layout_goneMarginEnd="@dimen/library_item_icon_margin_horizontal" />
<TextView <TextView
android:id="@+id/url" android:id="@+id/url"
@ -69,7 +70,8 @@
app:layout_constraintEnd_toStartOf="@id/overflow_menu" app:layout_constraintEnd_toStartOf="@id/overflow_menu"
app:layout_constraintStart_toEndOf="@id/icon" app:layout_constraintStart_toEndOf="@id/icon"
app:layout_constraintTop_toBottomOf="@+id/title" app:layout_constraintTop_toBottomOf="@+id/title"
app:layout_constraintBottom_toBottomOf="parent" /> app:layout_constraintBottom_toBottomOf="parent"
app:layout_goneMarginEnd="@dimen/library_item_icon_margin_horizontal" />
<ImageButton <ImageButton
android:id="@+id/overflow_menu" android:id="@+id/overflow_menu"

@ -677,6 +677,11 @@
android:defaultValue="null" android:defaultValue="null"
app:argType="string" app:argType="string"
app:nullable="true" /> app:nullable="true" />
<argument
android:name="shareSubject"
android:defaultValue="@null"
app:argType="string"
app:nullable="true" />
</dialog> </dialog>
<dialog <dialog
android:id="@+id/quickSettingsSheetDialogFragment" android:id="@+id/quickSettingsSheetDialogFragment"

@ -2,7 +2,7 @@
<resources> <resources>
<!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)--> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_5">Privado %s</string> <string name="app_name_private_5">%s privado</string>
<!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)--> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_4">%s (Privado)</string> <string name="app_name_private_4">%s (Privado)</string>
<!-- Home Fragment --> <!-- Home Fragment -->

@ -27,6 +27,9 @@
<!-- 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 pestañas abiertas. Tocar para cambiar de pestaña.</string> <string name="open_tab_tray_plural">%1$s pestañas abiertas. Tocar para cambiar de pestaña.</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 seleccionado</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 es producido por Mozilla.</string> <string name="about_content">%1$s es producido por Mozilla.</string>

@ -40,6 +40,8 @@
<string name="tab_tray_collection_button_multiselect_content_description">Tallenna valitut välilehdet kokoelmaan</string> <string name="tab_tray_collection_button_multiselect_content_description">Tallenna valitut välilehdet kokoelmaan</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 --> <!-- 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">Valittu %1$s</string> <string name="tab_tray_item_selected_multiselect_content_description">Valittu %1$s</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">Kumottu valinta %1$s</string>
<!-- Content description announcement when exiting multiselect mode in tab tray --> <!-- Content description announcement when exiting multiselect mode in tab tray -->
<string name="tab_tray_exit_multiselect_content_description">Poistuttiin monivalintatilasta</string> <string name="tab_tray_exit_multiselect_content_description">Poistuttiin monivalintatilasta</string>
<!-- Content description announcement when entering multiselect mode in tab tray --> <!-- Content description announcement when entering multiselect mode in tab tray -->

@ -37,9 +37,18 @@
<string name="tab_tray_close_multiselect_content_description">मल्टीसेलेक्ट मोड से बाहर निकलें</string> <string name="tab_tray_close_multiselect_content_description">मल्टीसेलेक्ट मोड से बाहर निकलें</string>
<!-- 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 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 चयनित</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 अचयनित</string>
<!-- Content description announcement when exiting multiselect mode in tab tray --> <!-- Content description announcement when exiting multiselect mode in tab tray -->
<string name="tab_tray_exit_multiselect_content_description">मल्टीसेलेक्ट मोड से बाहर निकल चुके</string> <string name="tab_tray_exit_multiselect_content_description">मल्टीसेलेक्ट मोड से बाहर निकल चुके</string>
<!-- Content description announcement when entering multiselect mode in tab tray -->
<string name="tab_tray_enter_multiselect_content_description">मल्टीसेलेक्ट मोड में दाखिल, संग्रह में सहेजने के लिए टैबों को चुनें</string>
<!-- Content description on checkmark while tab is selected in multiselect mode in tab tray -->
<string name="tab_tray_multiselect_selected_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>
@ -165,8 +174,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">स्कैन करें</string> <string name="search_scan_button">स्कैन करें</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">खोज इंजन</string> <string name="search_engine_button">खोज इंजन</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">खोज इंजन सेटिंग्स</string> <string name="search_shortcuts_engine_settings">खोज इंजन सेटिंग्स</string>
<!-- Header displayed when selecting a shortcut search engine --> <!-- Header displayed when selecting a shortcut search engine -->
@ -597,6 +606,8 @@
<string name="bookmark_select_folder">फ़ोल्डर चुनें</string> <string name="bookmark_select_folder">फ़ोल्डर चुनें</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">क्या आप वाकई इस फ़ोल्डर को हटाना चाहते हैं?</string> <string name="bookmark_delete_folder_confirmation_dialog">क्या आप वाकई इस फ़ोल्डर को हटाना चाहते हैं?</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 चयनित वस्तुओं को मिटा देगा।</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">%1$s मिटाया गया</string> <string name="bookmark_delete_folder_snackbar">%1$s मिटाया गया</string>
<!-- Screen title for adding a bookmarks folder --> <!-- Screen title for adding a bookmarks folder -->
@ -655,6 +666,8 @@
<!-- 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>
@ -860,6 +873,8 @@
<string name="tab_collection_dialog_message">क्या आप वाकई %1$s को हटाना चाहते हैं?</string> <string name="tab_collection_dialog_message">क्या आप वाकई %1$s को हटाना चाहते हैं?</string>
<!-- Collection and tab deletion prompt dialog message. This will show when the last tab from a collection is deleted --> <!-- 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">इस टैब को हटाने से संपूर्ण संग्रह मिट जाएगा। आप किसी भी समय नए संग्रह बना सकते हैं।</string> <string name="delete_tab_and_collection_dialog_message">इस टैब को हटाने से संपूर्ण संग्रह मिट जाएगा। आप किसी भी समय नए संग्रह बना सकते हैं।</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">%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">मिटाएं</string> <string name="tab_collection_dialog_positive">मिटाएं</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection --> <!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
@ -1269,6 +1284,8 @@
<string name="preferences_passwords_exceptions_description_empty">लॉगिन और पासवर्ड जो सहेजे नहीं गए हैं उन्हें यहां दिखाये जायेंगे।</string> <string name="preferences_passwords_exceptions_description_empty">लॉगिन और पासवर्ड जो सहेजे नहीं गए हैं उन्हें यहां दिखाये जायेंगे।</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">इन साइटों के लिए लॉगिन और पासवर्ड सहेजे नहीं जाएंगे।</string> <string name="preferences_passwords_exceptions_description">इन साइटों के लिए लॉगिन और पासवर्ड सहेजे नहीं जाएंगे।</string>
<!-- Text on button to remove all saved login exceptions -->
<string name="preferences_passwords_exceptions_remove_all">सभी अपवादों को मिटाएं</string>
<!-- Hint for search box in logins list --> <!-- Hint for search box in logins list -->
<string name="preferences_passwords_saved_logins_search">लॉगिन खोजें</string> <string name="preferences_passwords_saved_logins_search">लॉगिन खोजें</string>
<!-- Option to sort logins list A-Z, alphabetically --> <!-- Option to sort logins list A-Z, alphabetically -->
@ -1472,9 +1489,7 @@
<string name="saved_login_duplicate">एक लॉगिन इस उपयोगकर्ता नाम के साथ मौजूद है</string> <string name="saved_login_duplicate">एक लॉगिन इस उपयोगकर्ता नाम के साथ मौजूद है</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">Firefox खाते से कनेक्ट करें।</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">अन्य डिवाइस कनेक्ट करें</string> <string name="synced_tabs_connect_another_device">अन्य डिवाइस कनेक्ट करें</string>
<!-- Text displayed asking user to re-authenticate --> <!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">कृपया पुनः प्रमाणित करें।</string> <string name="synced_tabs_reauth">कृपया पुनः प्रमाणित करें।</string>
@ -1495,13 +1510,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">ठीक है, समझ गए</string> <string name="top_sites_max_limit_confirmation_button">ठीक है, समझ गए</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">शॉर्टकट</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">के साथ खोजें</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">इस बार, इसके साथ खोजें:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">खोज शॉर्टकट्स दिखाएं</string>
</resources> </resources>

@ -734,7 +734,7 @@
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed --> <!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Gyűjtemény menü</string> <string name="collection_menu_button_content_description">Gyűjtemény menü</string>
<!-- No Open Tabs Message Header --> <!-- No Open Tabs Message Header -->
<string name="no_collections_header1">Gyűjtsd össze a számára fontos dolgokat</string> <string name="no_collections_header1">Gyűjtse össze az Önnek fontos dolgokat</string>
<!-- Label to describe what collections are to a new user without any collections --> <!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">Csoportosítsa a hasonló kereséseket, webhelyeket és lapokat a későbbi gyors elérés érdekében.</string> <string name="no_collections_description1">Csoportosítsa a hasonló kereséseket, webhelyeket és lapokat a későbbi gyors elérés érdekében.</string>
<!-- Title for the "select tabs" step of the collection creator --> <!-- Title for the "select tabs" step of the collection creator -->

@ -27,6 +27,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 tab terbuka. Ketuk untuk beralih tab.</string> <string name="open_tab_tray_plural">%1$s tab terbuka. Ketuk untuk beralih 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 terpilih</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Tambah koleksi baru</string>
<!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">Nama</string>
<!-- Label of button in save to collection dialog for selecting a current collection -->
<string name="tab_tray_select_collection">Pilih koleksi</string>
<!-- Content description for close button while in multiselect mode in tab tray -->
<string name="tab_tray_close_multiselect_content_description">Keluar mode seleksi ganda</string>
<!-- Content description for save to collection button while in multiselect mode in tab tray -->
<string name="tab_tray_collection_button_multiselect_content_description">Simpan tab terpilih ke koleksi</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 dipilih</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 tidak dipilih</string>
<!-- Content description announcement when exiting multiselect mode in tab tray -->
<string name="tab_tray_exit_multiselect_content_description">Keluar dari mode seleksi ganda</string>
<!-- Content description announcement when entering multiselect mode in tab tray -->
<string name="tab_tray_enter_multiselect_content_description">Memasuki mode seleksi ganda, pilih tab untuk menyimpannya ke koleksi</string>
<!-- Content description on checkmark while tab is selected in multiselect mode in tab tray -->
<string name="tab_tray_multiselect_selected_content_description">Terpilih</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 diproduksi oleh Mozilla.</string> <string name="about_content">%1$s diproduksi oleh Mozilla.</string>
@ -152,15 +175,13 @@
<!-- 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">Pindai</string> <string name="search_scan_button">Pindai</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">Pintasan</string> <string name="search_engine_button">Mesin pencari</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">Setelan mesin pencari</string> <string name="search_shortcuts_engine_settings">Setelan mesin pencari</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Cari dengan</string>
<!-- Header displayed when selecting a shortcut search engine --> <!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Kali ini, cari lewat:</string> <string name="search_engines_search_with">Saat ini, cari dengan:</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">Isi tautan dari papan klip</string> <string name="awesomebar_clipboard_title">Isi tautan dari papan klip</string>
@ -270,8 +291,8 @@
<string name="developer_tools_category">Perangkat pengembang</string> <string name="developer_tools_category">Perangkat pengembang</string>
<!-- Preference for developers --> <!-- Preference for developers -->
<string name="preferences_remote_debugging">Pengawakutuan jarak jauh melalui USB</string> <string name="preferences_remote_debugging">Pengawakutuan jarak jauh melalui 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">Tampilkan pintasan pencarian</string> <string name="preferences_show_search_engines">Tampilkan mesin pencari</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">Tampilkan saran pencarian</string> <string name="preferences_show_search_suggestions">Tampilkan saran pencarian</string>
<!-- Preference title for switch preference to show voice search button --> <!-- Preference title for switch preference to show voice search button -->
@ -525,6 +546,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 (Mode Privat)</string> <string name="pwa_site_controls_title_private">%1$s (Mode 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">Simpan</string>
<!-- History --> <!-- History -->
<!-- Text for the button to clear all history --> <!-- Text for the button to clear all history -->
<string name="history_delete_all">Hapus riwayat</string> <string name="history_delete_all">Hapus riwayat</string>
@ -592,6 +616,8 @@
<string name="bookmark_select_folder">Pilih folder</string> <string name="bookmark_select_folder">Pilih folder</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">Yakin akan menghapus folder ini?</string> <string name="bookmark_delete_folder_confirmation_dialog">Yakin akan menghapus folder ini?</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 akan menghapus item terpilih.</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">%1$s terhapus</string> <string name="bookmark_delete_folder_snackbar">%1$s terhapus</string>
<!-- Screen title for adding a bookmarks folder --> <!-- Screen title for adding a bookmarks folder -->
@ -646,8 +672,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">%1$s terhapus</string> <string name="bookmark_deletion_snackbar_message">%1$s terhapus</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">Markah dihapus</string> <string name="bookmark_deletion_multiple_snackbar_message_2">Markah dihapus</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks including folders-->
<string name="bookmark_deletion_multiple_snackbar_message_3">Menghapus folder terpilih</string>
<!-- Bookmark undo button for deletion snackbar action --> <!-- Bookmark undo button for deletion snackbar action -->
<string name="bookmark_undo_deletion">URUNGKAN</string> <string name="bookmark_undo_deletion">URUNGKAN</string>
@ -743,6 +771,8 @@
<string name="create_collection_save_to_collection_tab_selected">%d tab dipilih</string> <string name="create_collection_save_to_collection_tab_selected">%d tab dipilih</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">Tab disimpan!</string> <string name="create_collection_tabs_saved">Tab disimpan!</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">Koleksi disimpan!</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">Tab disimpan!</string> <string name="create_collection_tab_saved">Tab disimpan!</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 -->
@ -849,6 +879,10 @@
<string name="qr_scanner_dialog_negative">TOLAK</string> <string name="qr_scanner_dialog_negative">TOLAK</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">Yakin ingin menghapus %1$s?</string> <string name="tab_collection_dialog_message">Yakin ingin menghapus %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">Menghapus tab ini akan menghapus keseluruhan koleksi. Kamu dapat membuat koleksi baru kapan saja.</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">Hapus %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">Hapus</string> <string name="tab_collection_dialog_positive">Hapus</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection --> <!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
@ -1249,6 +1283,8 @@
<string name="preferences_passwords_exceptions_description_empty">Info masuk dan kata sandi yang tidak disimpan akan ditampilkan di sini.</string> <string name="preferences_passwords_exceptions_description_empty">Info masuk dan kata sandi yang tidak disimpan akan ditampilkan di sini.</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">Info masuk dan kata sandi tidak akan disimpan untuk situs-situs ini.</string> <string name="preferences_passwords_exceptions_description">Info masuk dan kata sandi tidak akan disimpan untuk situs-situs ini.</string>
<!-- Text on button to remove all saved login exceptions -->
<string name="preferences_passwords_exceptions_remove_all">Hapus semua pengecualian</string>
<!-- Hint for search box in logins list --> <!-- Hint for search box in logins list -->
<string name="preferences_passwords_saved_logins_search">Cari log masuk</string> <string name="preferences_passwords_saved_logins_search">Cari log masuk</string>
<!-- Option to sort logins list A-Z, alphabetically --> <!-- Option to sort logins list A-Z, alphabetically -->
@ -1287,6 +1323,8 @@
<string name="saved_login_copy_username">Salin nama pengguna</string> <string name="saved_login_copy_username">Salin nama pengguna</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">Salin situs</string> <string name="saved_login_copy_site">Salin situs</string>
<!-- Content Description (for screenreaders etc) read for the button to open a site in logins -->
<string name="saved_login_open_site">Buka situs di peramban</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">Tampilkan sandi</string> <string name="saved_login_reveal_password">Tampilkan sandi</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 -->
@ -1437,9 +1475,7 @@
<string name="saved_login_duplicate">Sebuah info masuk dengan nama pengguna tersebut sudah ada</string> <string name="saved_login_duplicate">Sebuah info masuk dengan nama pengguna tersebut sudah ada</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">Hubungkan dengan 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">Hubungkan perangkat lain</string> <string name="synced_tabs_connect_another_device">Hubungkan perangkat lain</string>
<!-- Text displayed asking user to re-authenticate --> <!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Harap autentikasi ulang.</string> <string name="synced_tabs_reauth">Harap autentikasi ulang.</string>

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- App name for private browsing mode, only the "Private" portion should be localized. --> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_2">သီးသန့် Firefox အကြိုမြင်ကွင်း</string> <string name="app_name_private_5">သီးသန့် %s</string>
<!-- App name for private browsing mode, only the "Private" portion should be localized. --> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_3">Firefox Preview (သီးသန့်)</string> <string name="app_name_private_4">%s (သီးသန့်)</string>
<!-- Home Fragment --> <!-- Home Fragment -->
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. --> <!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
<string name="content_description_menu">ရွေးချယ်စရာများ</string> <string name="content_description_menu">ရွေးချယ်စရာများ</string>
@ -14,23 +14,40 @@
<string name="content_description_disable_private_browsing_button">သီးသန့်ရှာဖွေမှုကို ပိတ်ပါ</string> <string name="content_description_disable_private_browsing_button">သီးသန့်ရှာဖွေမှုကို ပိတ်ပါ</string>
<!-- Placeholder text shown in the search bar before a user enters text --> <!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">လိပ်စာရှာဖွေ သို့ ရိုက်ထည့်ပါ</string> <string name="search_hint">လိပ်စာရှာဖွေ သို့ ရိုက်ထည့်ပါ</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">ဖွင့်ထားသည့်တပ်ဗ်များ မရှိပါ</string>
<!-- No Open Tabs Message Description --> <!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">သင့်ဖွင့်ထားသည့်တက်ဗ်များကို ဤနေရာတွင် ပြမည်။</string> <string name="no_open_tabs_description">သင့်ဖွင့်ထားသည့်တက်ဗ်များကို ဤနေရာတွင် ပြမည်။</string>
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">သင်၏ သီးသန့် တက်ဗ်များ ဤနေရာမှာ ပြရန်။</string>
<!-- Message announced to the user when tab tray is selected with 1 tab -->
<string name="open_tab_tray_single">ဖွင့်ထားသော တက်ဗ် 1 ခု။ တက်ဗ်များ ပြောင်းရန် ထိပါ။</string>
<!-- Message announced to the user when tab tray is selected with 0 or 2+ tabs -->
<string name="open_tab_tray_plural">ဖွင့်ထားသော တက်ဗ် %1$s ခု။ တက်ဗ်များ ပြောင်းရန် ထိပါ။</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 ခု ရွေးချယ်ထားပြီး</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">စုဆောင်းမှု အသစ် သို့ ထည့်ရန်</string>
<!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">အမည်</string>
<!-- Label of button in save to collection dialog for selecting a current collection -->
<string name="tab_tray_select_collection">စုဆောင်းမှု ကို ရွေးချယ်ရန်</string>
<!-- Content description for close button while in multiselect mode in tab tray -->
<string name="tab_tray_close_multiselect_content_description">multiselect mode ကိုပိတ်ပါ</string>
<!-- Content description for save to collection button while in multiselect mode in tab tray -->
<string name="tab_tray_collection_button_multiselect_content_description">စုဆောင်းမှု သို့ တက်ဗ်များ သိမ်းရန်</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s ကို Mozilla မှ ထုတ်လုပ်သည်။</string>
<!-- Private Browsing --> <!-- Private Browsing -->
<!-- Title for private session option --> <!-- Title for private session option -->
<string name="private_browsing_title">သင် ကိုယ်ပိုင်အပိုင်းထဲတွင် ရှိနေသည်။</string> <string name="private_browsing_title">သင် ကိုယ်ပိုင်အပိုင်းထဲတွင် ရှိနေသည်။</string>
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_placeholder_description">% 1 $ s သည်သင်အက်ပ်မှထွက်သောအခါသို့မဟုတ်သီးသန့် tabs အားလုံးပိတ်သောအခါသင်၏ရှာဖွေခြင်းနှင့်ရှာဖွေခြင်းရာဇဝင်ကိုရှင်းလင်းသည်။ ၎င်းသည်သင့်အားဝက်ဘ်ဆိုက်များသို့မဟုတ်သင်၏အင်တာနက် န်ဆောင်မှုပေးသူများအတွက်အမည်မသိစေသော်လည်း၎င်းကိုပြုလုပ်သည်
        သင်အွန်လိုင်းလုပ်တာကိုဒီကိရိယာကိုအသုံးပြုတဲ့သူတိုင်းထံမှလျှို့ဝှက်ထားရန်ပိုလွယ်ကူသည်။</string>
<string name="private_browsing_common_myths">ပုဂ္ဂလိက browsing ဆိုင်ရာ အမြင်မှားများ</string> <string name="private_browsing_common_myths">ပုဂ္ဂလိက browsing ဆိုင်ရာ အမြင်မှားများ</string>
<!-- Delete session button to erase your history in a private session --> <!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">အပိုင်း ကိုဖျက်ပါ</string> <string name="private_browsing_delete_session">အပိုင်း ကိုဖျက်ပါ</string>
<!-- Private mode shortcut "contextual feature recommender" (CFR) --> <!-- Private mode shortcut "contextual feature recommendation" (CFR) -->
<!-- Text for the main message --> <!-- Text for the main message -->
<string name="cfr_message">သင့်မူလမြင်ကွင်းမှ သီးသန့်တဗ်များကိုဖွင့်ရန် ဖြတ်လမ်းလုပ်ပါ</string> <string name="cfr_message">သင့်မူလမြင်ကွင်းမှ သီးသန့်တဗ်များကိုဖွင့်ရန် ဖြတ်လမ်းလုပ်ပါ</string>
<!-- Text for the positive button --> <!-- Text for the positive button -->
@ -38,6 +55,9 @@
<!-- Text for the negative button --> <!-- Text for the negative button -->
<string name="cfr_neg_button_text">နေပါစေ</string> <string name="cfr_neg_button_text">နေပါစေ</string>
<!-- Text for the negative button -->
<string name="search_widget_cfr_neg_button_text">ယခု မဟုတ်</string>
<!-- Home screen icons - Long press shortcuts --> <!-- Home screen icons - Long press shortcuts -->
<!-- Shortcut action to open new tab --> <!-- Shortcut action to open new tab -->
<string name="home_screen_shortcut_open_new_tab_2">တပ်ဗ် အသစ်</string> <string name="home_screen_shortcut_open_new_tab_2">တပ်ဗ် အသစ်</string>
@ -45,6 +65,9 @@
<!-- Shortcut action to open new private tab --> <!-- Shortcut action to open new private tab -->
<string name="home_screen_shortcut_open_new_private_tab_2">တစ်ကိုယ်ရေသုံး တပ်ဗ်အသစ်</string> <string name="home_screen_shortcut_open_new_private_tab_2">တစ်ကိုယ်ရေသုံး တပ်ဗ်အသစ်</string>
<!-- Heading for the Top Sites block -->
<string name="home_screen_top_sites_heading">ထိပ်တန်း ဆိုက်များ</string>
<!-- Browser Fragment --> <!-- Browser Fragment -->
<!-- Content description (not visible, for screen readers etc.): Navigate to open tabs --> <!-- Content description (not visible, for screen readers etc.): Navigate to open tabs -->
<string name="browser_tabs_button">တပ်ဗ်များကို ဖွင့်ပါ</string> <string name="browser_tabs_button">တပ်ဗ်များကို ဖွင့်ပါ</string>
@ -87,8 +110,6 @@
<string name="browser_menu_new_tab">တပ်ဗ် အသစ်</string> <string name="browser_menu_new_tab">တပ်ဗ် အသစ်</string>
<!-- Browser menu button that saves the current tab to a collection --> <!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">စုဆောင်းမှုသို့သိမ်းဆည်းပါ</string> <string name="browser_menu_save_to_collection_2">စုဆောင်းမှုသို့သိမ်းဆည်းပါ</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">ဆိုဘ်ပြဿနာကိုတင်ပြပါ</string>
<!-- Browser menu button that open a share menu to share the current site --> <!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">မျှဝေ</string> <string name="browser_menu_share">မျှဝေ</string>
<!-- Share menu title, displayed when a user is sharing their current site --> <!-- Share menu title, displayed when a user is sharing their current site -->
@ -102,7 +123,7 @@
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab <!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) --> The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">%1$s က ထောက်ပံ့ပေးထားတယ်</string> <string name="browser_menu_powered_by2">%1$s က ထောက်ပံ့ပေးထားတယ်</string>
<!-- Browser menu button to put the the current page in reader mode --> <!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">စာဖတ်သူမြင်ကွင်း</string> <string name="browser_menu_read">စာဖတ်သူမြင်ကွင်း</string>
<!-- Browser menu button to open the current page in an external app --> <!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">အက်ပ်ထဲတွင်ဖွင့်ပါ</string> <string name="browser_menu_open_app_link">အက်ပ်ထဲတွင်ဖွင့်ပါ</string>
@ -123,14 +144,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">စစ်ဆေးပါ</string> <string name="search_scan_button">စစ်ဆေးပါ</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">လမ်းတိုများ</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">အင်ဂျင်အပြင်အဆင် ရှာဖွေပါ</string> <string name="search_shortcuts_engine_settings">အင်ဂျင်အပြင်အဆင် ရှာဖွေပါ</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">ရှာပါ</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">ဤတစ်ကြိမ်တွင်ရှာဖွေပါ -</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">ကလစ်ဘုတ်မှ လင့်ခ်ကိုဖြည့်စွက်ပါ</string> <string name="awesomebar_clipboard_title">ကလစ်ဘုတ်မှ လင့်ခ်ကိုဖြည့်စွက်ပါ</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 -->
@ -150,6 +165,9 @@
<!-- Text preview for larger sized widgets --> <!-- Text preview for larger sized widgets -->
<string name="search_widget_text_long">ဝဘ်တွင် ရှာဖွေပါ</string> <string name="search_widget_text_long">ဝဘ်တွင် ရှာဖွေပါ</string>
<!-- Content description (not visible, for screen readers etc.): Voice search -->
<string name="search_widget_voice">အသံဖြင့် ရှာရန်</string>
<!-- Preferences --> <!-- Preferences -->
<!-- Title for the settings page--> <!-- Title for the settings page-->
<string name="settings">အပြင်အဆင်များ</string> <string name="settings">အပြင်အဆင်များ</string>
@ -227,10 +245,12 @@
<!-- Preference for developers --> <!-- Preference for developers -->
<string name="preferences_remote_debugging">USB မှတဆင့် Remote debugging</string> <string name="preferences_remote_debugging">USB မှတဆင့် Remote debugging</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">ရှာဖွေမှုဖြတ်လမ်းများကိုပြပါ</string> <string name="preferences_show_search_engines">ရှာဖွေရေး အင်ဂျင်များပြရန်</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">ရှာဖွေရေး အကြံပြုချက်များကို ဖေါ်ပြပါ</string> <string name="preferences_show_search_suggestions">ရှာဖွေရေး အကြံပြုချက်များကို ဖေါ်ပြပါ</string>
<!-- Preference title for switch preference to show voice search button -->
<string name="preferences_show_voice_search">အသံရှာ ဖွေမှု ပြရန်</string>
<!-- Preference title for switch preference to show search suggestions also in private mode --> <!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">ကိုယ်ပိုင်သီးသန့်အပိုင်းများတွင်ပြပါ</string> <string name="preferences_show_search_suggestions_in_private">ကိုယ်ပိုင်သီးသန့်အပိုင်းများတွင်ပြပါ</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching --> <!-- Preference title for switch preference to show a clipboard suggestion when searching -->
@ -257,6 +277,8 @@
<string name="preferences_sync_bookmarks">စာမှတ်များ</string> <string name="preferences_sync_bookmarks">စာမှတ်များ</string>
<!-- Preference for syncing logins --> <!-- Preference for syncing logins -->
<string name="preferences_sync_logins">ဝင်ရောက်မှုများ</string> <string name="preferences_sync_logins">ဝင်ရောက်မှုများ</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs_2">ပွင့်နေသော တက်ဗ်များ</string>
<!-- Preference for signing out --> <!-- Preference for signing out -->
<string name="preferences_sign_out">ထွက်ရန်</string> <string name="preferences_sign_out">ထွက်ရန်</string>
<!-- Preference displays and allows changing current FxA device name --> <!-- Preference displays and allows changing current FxA device name -->
@ -278,7 +300,7 @@
<!-- Text for displaying the default device name. <!-- Text for displaying the default device name.
The first parameter is the application name, the second is the device manufacturer name The first parameter is the application name, the second is the device manufacturer name
and the third is the device model. --> and the third is the device model. -->
<string name="default_device_name">%s %s အပေါ် %s</string> <string name="default_device_name_2">%1$s သည် %2$s %3$s တွင်</string>
<!-- 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 -->
@ -348,7 +370,7 @@
<!-- Pairing Feature strings --> <!-- Pairing Feature strings -->
<!-- Instructions on how to access pairing --> <!-- Instructions on how to access pairing -->
<string name="pair_instructions"><![CDATA[ကျူအာကုတ်ရရှိရန် သင့်ကွန်ပျူတာပေါ်မှ Firefox တွင် <b>firefox.com/pair</b> သို့လည်ပတ်ပါ။]]></string> <string name="pair_instructions_2"><![CDATA[<b>firefox.com/pair</b> တွင်ပြနေသော QR ကုဒ်ကို ဖတ်ပါ]]></string>
<!-- Button to open camera for pairing --> <!-- Button to open camera for pairing -->
<string name="pair_open_camera">ကင်မရာဖွင့်ပါ</string> <string name="pair_open_camera">ကင်မရာဖွင့်ပါ</string>
<!-- Button to cancel pairing --> <!-- Button to cancel pairing -->
@ -393,8 +415,6 @@
<string name="library_reading_list">စာဖတ်စာရင်း</string> <string name="library_reading_list">စာဖတ်စာရင်း</string>
<!-- Menu Item Label for Search in Library --> <!-- Menu Item Label for Search in Library -->
<string name="library_search">ရှာပါ</string> <string name="library_search">ရှာပါ</string>
<!-- Library Page Title -->
<string name="library_title">စာကြည့်တိုက်</string>
<!-- Settings Page Title --> <!-- Settings Page Title -->
<string name="settings_title">အပြင်အဆင်များ</string> <string name="settings_title">အပြင်အဆင်များ</string>
<!-- Content description (not visible, for screen readers etc.): "Menu icon for items on a history item" --> <!-- Content description (not visible, for screen readers etc.): "Menu icon for items on a history item" -->
@ -412,6 +432,24 @@
<string name="tabs_header_private_tabs_title">သီးသန့် တဗ် များ</string> <string name="tabs_header_private_tabs_title">သီးသန့် တဗ် များ</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed --> <!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">တက်ဗ် ထည့်ပါ</string> <string name="add_tab">တက်ဗ် ထည့်ပါ</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">သီးသန့် တက်ဗ် ထည့်</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
<string name="tab_drawer_fab_content">သီးသန့်</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">ပွင့်နေသည့် တက်ဗ်များ</string>
<!-- Text shown in the menu for saving tabs to a collection -->
<string name="tab_tray_menu_item_save">စုစည်းမှု ထဲသို့ သိမ်းရန်</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">တက်ဗ်များ အားလုံး မျှဝေရန်</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">တက်ဗ်များ အားလုံး ပိတ်ရန်</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">တက်ဗ် အသစ်</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">မူလ သို့ သွားရန်</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">စုစည်းမှု ထဲမှ တက်ဗ် ကို ဖယ်ရှားရန်</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed --> <!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
<string name="close_tab">တပ်ဗ်ကို ပိတ်ရန်</string> <string name="close_tab">တပ်ဗ်ကို ပိတ်ရန်</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title --> <!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title -->
@ -423,7 +461,7 @@
<!-- Open tabs menu item to share all tabs --> <!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">တပ်ဗ်များကို မျှဝေပါ</string> <string name="tabs_menu_share_tabs">တပ်ဗ်များကို မျှဝေပါ</string>
<!-- Open tabs menu item to save tabs to collection --> <!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">စုဆောင်းမှုသို့သိမ်းဆည်းပါ</string> <string name="tabs_menu_save_to_collection1">စုဆောင်းမှု သို့ တက်ဗ်များ သိမ်းရန်</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed --> <!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">တဗ်မန်နူး</string> <string name="tab_menu">တဗ်မန်နူး</string>
<!-- Tab menu item to share the tab --> <!-- Tab menu item to share the tab -->
@ -447,13 +485,24 @@
<!-- Text for the menu button to remove a top site --> <!-- Text for the menu button to remove a top site -->
<string name="remove_top_site">ဖယ်ရှားပါ</string> <string name="remove_top_site">ဖယ်ရှားပါ</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">သိမ်းရန်</string>
<!-- History --> <!-- History -->
<!-- Text for the button to clear all history --> <!-- Text for the button to clear all history -->
<string name="history_delete_all">မှတ်တမ်းကို ဖျက်ပါ</string> <string name="history_delete_all">မှတ်တမ်းကို ဖျက်ပါ</string>
<!-- Text for the dialog to confirm clearing all history --> <!-- Text for the dialog to confirm clearing all history -->
<string name="history_delete_all_dialog">သင့် မှတ်တမ်းကို ဖျက်ပစ်မှာ သေချာပြီလား?</string> <string name="history_delete_all_dialog">သင့် မှတ်တမ်းကို ဖျက်ပစ်မှာ သေချာပြီလား?</string>
<!-- Text for the snackbar to confirm that multiple browsing history items has been deleted -->
<string name="history_delete_multiple_items_snackbar">မှတ်တမ်း ကို ဖျက်ပြီး</string>
<!-- Text for the snackbar to confirm that a single browsing history item has been deleted. The first parameter is the shortened URL of the deleted history item. -->
<string name="history_delete_single_item_snackbar">%1$s ခု ဖျက်ပြီး</string>
<!-- Text for positive action to delete history in deleting history dialog --> <!-- Text for positive action to delete history in deleting history dialog -->
<string name="history_clear_dialog">ရှင်းလင်းပါ</string> <string name="history_clear_dialog">ရှင်းလင်းပါ</string>
<!-- History overflow menu copy button -->
<string name="history_menu_copy_button">ကူးရန်</string>
<!-- History overflow menu share button -->
<string name="history_menu_share_button">မျှဝေရန်</string>
<!-- Text for the button to delete a single history item --> <!-- Text for the button to delete a single history item -->
<string name="history_delete_item">ဖျက်ပါ</string> <string name="history_delete_item">ဖျက်ပါ</string>
<!-- History multi select title in app bar <!-- History multi select title in app bar
@ -554,8 +603,6 @@
<!-- 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">%1$s ဖျက်ပြီး</string> <string name="bookmark_deletion_snackbar_message">%1$s ဖျက်ပြီး</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks -->
<string name="bookmark_deletion_multiple_snackbar_message">ရွေးချယ်ထားသည့်အမှတ်အသားများကိုဖျက်ပစ်သည်</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>
@ -618,16 +665,14 @@
<string name="delete_browsing_data_quit_off">ပိတ်ပါ</string> <string name="delete_browsing_data_quit_off">ပိတ်ပါ</string>
<!-- Collections --> <!-- Collections -->
<!-- Label to describe what collections are to a new user without any collections -->
<string name="collections_description">သင့်အတွက်အရေးကြီးတဲ့အရာတွေကိုစုဆောင်းပါ။ စတင်ရန်စုဆောင်းမှုအသစ်တစ်ခုရရှိရန်ဖွင့်ထားသောတဗ်များကိုသိမ်းဆည်းပါ။</string>
<!-- Collections header on home fragment --> <!-- Collections header on home fragment -->
<string name="collections_header">စုဆည်းမှုများ</string> <string name="collections_header">စုဆည်းမှုများ</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed --> <!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">စုဆောင်းခြင်းမီနူး</string> <string name="collection_menu_button_content_description">စုဆောင်းခြင်းမီနူး</string>
<!-- No Open Tabs Message Header --> <!-- No Open Tabs Message Header -->
<string name="no_collections_header">စုစည်းမှု မရှိပါ</string> <string name="no_collections_header1">သင် အတွက် အရေးပါသည်များ ကို စုစည်းပါ</string>
<!-- No Open Tabs Message Description --> <!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description">သင်၏ စုစည်းမှုများကိုဤနေရာတွင်ပြလိမ့်မည်။</string> <string name="no_collections_description1">ရှာဖွေခြင်းများ၊ ဆိုက်များ နှင့် တက်ဗ်များ ကို အမျိုးအစားတူစုခြင်းဖြင့် နောင်တွင် မြန်မြန် ရယူနိုင်လိမ့်မည်။</string>
<!-- Title for the "select tabs" step of the collection creator --> <!-- Title for the "select tabs" step of the collection creator -->
<string name="create_collection_select_tabs">တက်ပ်များကိုရွေးပါ</string> <string name="create_collection_select_tabs">တက်ပ်များကိုရွေးပါ</string>
<!-- Title for the "select collection" step of the collection creator --> <!-- Title for the "select collection" step of the collection creator -->
@ -651,6 +696,8 @@
<string name="create_collection_save_to_collection_tab_selected">% d tabs ကိုရွေးချယ်ထားပါသည်</string> <string name="create_collection_save_to_collection_tab_selected">% d tabs ကိုရွေးချယ်ထားပါသည်</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">တဗ်များကိုသိမ်းထားပြီး</string> <string name="create_collection_tabs_saved">တဗ်များကိုသိမ်းထားပြီး</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">စုစည်းမှု သိမ်းပြီး။</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">တဗ်ကိုသိမ်းထားပြီး</string> <string name="create_collection_tab_saved">တဗ်ကိုသိမ်းထားပြီး</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 -->
@ -658,6 +705,9 @@
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator--> <!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">သိမ်းပါ</string> <string name="create_collection_save">သိမ်းပါ</string>
<!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">မြင်ကွင်း</string>
<!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections--> <!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections-->
<string name="create_collection_default_name">စုဆည်းမှု %d</string> <string name="create_collection_default_name">စုဆည်းမှု %d</string>
@ -752,6 +802,10 @@
<string name="qr_scanner_dialog_negative">Deny</string> <string name="qr_scanner_dialog_negative">Deny</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">%1$s ကိုသင်ဖျက်လိုသလား။</string> <string name="tab_collection_dialog_message">%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">ဤ တက်ဗ် ကို ဖျက်ခြင်း ကြောင့် ဤ စုစည်းမှုတစ်ခုလုံး ပျက်သွားလိမ့်မည်။ သင် သည် စုစည်းမှု အသစ် ကိုအချိန်မရွေး ပြုလုပ်နိုင်ပါသည်။</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">%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">ဖျက်ပါ</string> <string name="tab_collection_dialog_positive">ဖျက်ပါ</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection --> <!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
@ -768,16 +822,11 @@
<!-- Title for Accessibility Text Size Scaling Preference --> <!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">စာလုံးအရွယ်အစား</string> <string name="preference_accessibility_font_size_title">စာလုံးအရွယ်အစား</string>
<!-- Title for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size">အလိုအလျောက်စာလုံးအရွယ်အစား</string>
<!-- Summary for Accessibility Text Automatic Size Scaling Preference --> <!-- Summary for Accessibility Text Automatic Size Scaling Preference -->
<string name="preference_accessibility_auto_size_summary">စာလုံးအရွယ်အစားသည်သင်၏ဖုန်းနှင့်ကိုက်ညီပါလိမ့်မည်။ဤနေရာတွင်ဖောင့်အရွယ်အစားကိုစီမံခန့်ခွဲရန်ကိုပိတ်ပါ။</string> <string name="preference_accessibility_auto_size_summary">စာလုံးအရွယ်အစားသည်သင်၏ဖုန်းနှင့်ကိုက်ညီပါလိမ့်မည်။ဤနေရာတွင်ဖောင့်အရွယ်အစားကိုစီမံခန့်ခွဲရန်ကိုပိတ်ပါ။</string>
<!-- Title for the Delete browsing data preference --> <!-- Title for the Delete browsing data preference -->
<string name="preferences_delete_browsing_data">ကြည့်ရှုမှုအချက်အလက်များ ဖျက်ပါ</string> <string name="preferences_delete_browsing_data">ကြည့်ရှုမှုအချက်အလက်များ ဖျက်ပါ</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title">တပ်ဗ်များကို ဖွင့်ပါ</string>
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs --> <!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
<string name="preferences_delete_browsing_data_tabs_subtitle">%d တဗ်များ</string> <string name="preferences_delete_browsing_data_tabs_subtitle">%d တဗ်များ</string>
<!-- Title for the data and history items in Delete browsing data --> <!-- Title for the data and history items in Delete browsing data -->
@ -809,8 +858,6 @@
<string name="preference_summary_delete_browsing_data_on_quit">ပင်မမန်နူးမှ \&quot;Quit\&quot; ကိုသင်ရွေးလျှင် ရှာဖွေအချက်အလက်များကိုအလိုအလျောက်ဖျက်ပါမည်။</string> <string name="preference_summary_delete_browsing_data_on_quit">ပင်မမန်နူးမှ \&quot;Quit\&quot; ကိုသင်ရွေးလျှင် ရှာဖွေအချက်အလက်များကိုအလိုအလျောက်ဖျက်ပါမည်။</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. --> <!-- 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> <string name="preference_summary_delete_browsing_data_on_quit_2">ပင်မမန်နူးမှ \&quot;Quit\&quot; ကိုသင်ရွေးလျှင် ရှာဖွေအချက်အလက်များကိုအလိုအလျောက်ဖျက်ပါမည်။</string>
<!-- Category for history items to delete on quit in delete browsing data on quit -->
<string name="preferences_delete_browsing_data_on_quit_browsing_history">ရှာဖွေကြည့်ရှုမှု မှတ်တမ်း</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>
@ -862,20 +909,9 @@
<string name="onboarding_firefox_account_sync_is_on">ထပ်တူပြုခြင်းဖွင့်ထားသည်</string> <string name="onboarding_firefox_account_sync_is_on">ထပ်တူပြုခြင်းဖွင့်ထားသည်</string>
<!-- text to display in the snackbar if automatic sign-in fails. user may try again --> <!-- text to display in the snackbar if automatic sign-in fails. user may try again -->
<string name="onboarding_firefox_account_automatic_signin_failed">ဝင်ရောက်ရန်မအောင်မြင်ပါ</string> <string name="onboarding_firefox_account_automatic_signin_failed">ဝင်ရောက်ရန်မအောင်မြင်ပါ</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header">သင့်ကိုယ်သင်ကာကွယ်ပါ</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description1">သင့်ကိုအွန်လိုင်းပေါ်တွင် ခြေရာခံခြင်းမှ %s မှ ဆိုက်များကိုရပ်ဆိုင်းပြီးကူညီလိမ့်မည်။</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button">စံ</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description">ခြေရာခံသူများကိုပိတ်သော်လည်း စာမျက်နှာများကိုပုံမှန်ဆွဲတင်ခွင့်ပြုပါ။</string>
<!-- text for tracking protection radio button option for strict level of blocking --> <!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">တင်းကြပ်စွာ (အကြံပြုသည်)</string> <string name="onboarding_tracking_protection_strict_button">တင်းကြပ်စွာ (အကြံပြုသည်)</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description">ပိုမိုကောင်းမွန်သောကာကွယ်မှုနှင့်စွမ်းဆောင်ရည်အတွက်ခြေရာခံသူများကိုပိုမိုပိတ်ဆို့ထားသောကြောင့်အချို့သောဆိုဒ်များကိုအလုပ်မလုပ်နိုင်ပါ</string>
<!-- text for the toolbar position card header <!-- text for the toolbar position card header
In English this is an idiom for "choose a side as in an argument or fight" In English this is an idiom for "choose a side as in an argument or fight"
but it is ok to make this more literally about "choosing a position in a physical space --> but it is ok to make this more literally about "choosing a position in a physical space -->
@ -959,33 +995,15 @@
<string name="preference_enhanced_tracking_protection_explanation">သင့်ရဲ့အချက်အလက်များကိုသင်ကိုယ်တိုင်သိမ်းထားပါ။ %s သည်အွန်လိုင်းတွင်လုပ်ဆောင်သောအသုံးပြုမှုများကို ခြေရာခံမှုများမှသင့်အားကာကွယ်ပေးသည်။</string> <string name="preference_enhanced_tracking_protection_explanation">သင့်ရဲ့အချက်အလက်များကိုသင်ကိုယ်တိုင်သိမ်းထားပါ။ %s သည်အွန်လိုင်းတွင်လုပ်ဆောင်သောအသုံးပြုမှုများကို ခြေရာခံမှုများမှသင့်အားကာကွယ်ပေးသည်။</string>
<!-- Text displayed that links to website about enhanced tracking protection --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">ပိုမိုလေ့လာရန်</string> <string name="preference_enhanced_tracking_protection_explanation_learn_more">ပိုမိုလေ့လာရန်</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_option">စံ</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">စံ (အကြံပြုချက်)</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description">လုံခြုံရေးနှင့် စွမ်းဆောင်ရည်ကို ဟန်ချက်ညီစေရန် ပြုလုပ်ထားသည်။</string>
<!-- Preference description for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_description_2">စာမျက်နှာများသည်ပုံမှန်အားဖြင့်ဆွဲတင်လိမ့်မည်၊ သို့သော် ခြေရာခံတွေကိုပိတ်လိမ့်မည်။</string>
<!-- Accessibility text for the Standard protection information icon --> <!-- Accessibility text for the Standard protection information icon -->
<string name="preference_enhanced_tracking_protection_standard_info_button">စံချိန်မြင့်ခြေရာခံကာကွယ်ခြင်းက ဘာတွေကိုပိတ်ဆို့မလဲ</string> <string name="preference_enhanced_tracking_protection_standard_info_button">စံချိန်မြင့်ခြေရာခံကာကွယ်ခြင်းက ဘာတွေကိုပိတ်ဆို့မလဲ</string>
<!-- Preference for enhanced tracking protection for the strict protection settings --> <!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">တင်းကျပ်ပါ</string> <string name="preference_enhanced_tracking_protection_strict">တင်းကျပ်ပါ</string>
<!-- Preference for enhanced tracking protection for the strict protection settings, default setting -->
<string name="preference_enhanced_tracking_protection_strict_default">တင်းကျပ်ရန် (ပုံမှန်)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_default_description">ပိုမိုအားကောင်းသည့်ခြေရာခံကာကွယ်ခြင်းနှင့်ပိုမိုမြန်ဆန်သောစွမ်းဆောင်နိုင်မှုများရှိသော်လည်းအချို့သောဆိုဒ်များမှာအလုပ်မလုပ်နိုင်ပါ။</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_strict_recommended">တင်းကြပ်စွာ (အကြံပြုသည်)</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict_description">ပိုမိုလုံခြုံသောကာကွယ်မှုဖြစ်သော်လည်းအချို့သောဆိုဒ်များသို့မဟုတ်ပါဝင်သည့်အရာများအားပျက်စီးစေနိုင်သည်။</string>
<!-- Accessibility text for the Strict protection information icon --> <!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_strict_info_button">ကန့်သတ်ခြေရာခံကာကွယ်ခြင်းက ဘာတွေကိုပိတ်ဆို့မလဲ</string> <string name="preference_enhanced_tracking_protection_strict_info_button">ကန့်သတ်ခြေရာခံကာကွယ်ခြင်းက ဘာတွေကိုပိတ်ဆို့မလဲ</string>
<!-- Preference for enhanced tracking protection for the custom protection settings --> <!-- Preference for enhanced tracking protection for the custom protection settings -->
<string name="preference_enhanced_tracking_protection_custom">စိတ်ကြိုက်</string> <string name="preference_enhanced_tracking_protection_custom">စိတ်ကြိုက်</string>
<!-- Preference description for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_custom_description">ပိတ်ဆို့ရန် ခြေရာခံသူများနှင့် scriptsများကို ရွေးချယ်ပါ။</string>
<!-- Accessibility text for the Strict protection information icon --> <!-- Accessibility text for the Strict protection information icon -->
<string name="preference_enhanced_tracking_protection_custom_info_button">စိတ်ကြိုက်ခြေရာခံကာကွယ်ခြင်းက ဘာတွေကိုပိတ်ဆို့မလဲ</string> <string name="preference_enhanced_tracking_protection_custom_info_button">စိတ်ကြိုက်ခြေရာခံကာကွယ်ခြင်းက ဘာတွေကိုပိတ်ဆို့မလဲ</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings --> <!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
@ -1035,8 +1053,6 @@
<string name="etp_tracking_content_title">နောက်ယောင်ခံသည့် အရာများ</string> <string name="etp_tracking_content_title">နောက်ယောင်ခံသည့် အရာများ</string>
<!-- Description of tracking content that can be blocked by Enhanced Tracking Protection --> <!-- Description of tracking content that can be blocked by Enhanced Tracking Protection -->
<string name="etp_tracking_content_description">ခြေရာခံခြင်းကုဒ်ပါရှိခြင်းကြောင့်အပြင်ဘက်ကြော်ငြာများ၊ဗွီဒီယိုများနှင့်အခြားအကြောင်းအရာများကိုတားမြစ်သည်။ အချို့သော ဆိုက်၏လုပ်ဆောင်နိုင်စွမ်းကိုအကျိုးသက်ရောက်နိုင်သည်။</string> <string name="etp_tracking_content_description">ခြေရာခံခြင်းကုဒ်ပါရှိခြင်းကြောင့်အပြင်ဘက်ကြော်ငြာများ၊ဗွီဒီယိုများနှင့်အခြားအကြောင်းအရာများကိုတားမြစ်သည်။ အချို့သော ဆိုက်၏လုပ်ဆောင်နိုင်စွမ်းကိုအကျိုးသက်ရောက်နိုင်သည်။</string>
<!-- Enhanced Tracking Protection Onboarding Message shown in a dialog above the toolbar. The first parameter is the name of the application (For example: Fenix) -->
<string name="etp_onboarding_message_2">စိတ်မချရ၍ %s သည် ခြေရာခံသူများကိုဤဆိုက်ပေါ်တွင်ပိတ်ဆို့ထားသည်။ ဘာတွေကိုပိတ်ဆို့ထားလဲနှိပ်၍ကြည့်ပါ။</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site --> <!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">ဤဆိုက်အတွက် ကာကွယ်မှုဖွင့်ထားသည်။</string> <string name="etp_panel_on">ဤဆိုက်အတွက် ကာကွယ်မှုဖွင့်ထားသည်။</string>
<!-- Enhanced Tracking Protection message that protection is currently off for this site --> <!-- Enhanced Tracking Protection message that protection is currently off for this site -->
@ -1284,4 +1300,5 @@
<string name="login_deletion_confirmation">ဤဝင်ရောက်မှုကိုဖျက်မှာသေချာပါသလား။</string> <string name="login_deletion_confirmation">ဤဝင်ရောက်မှုကိုဖျက်မှာသေချာပါသလား။</string>
<!-- Positive action of a dialog asking to delete --> <!-- Positive action of a dialog asking to delete -->
<string name="dialog_delete_positive">ဖျက်ပါ</string> <string name="dialog_delete_positive">ဖျက်ပါ</string>
</resources>
</resources>

@ -25,6 +25,8 @@
<!-- 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">Odprtih zavihkov: %1$s. Tapnite za preklop zavihkov.</string> <string name="open_tab_tray_plural">Odprtih zavihkov: %1$s. Tapnite za preklop zavihkov.</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 izbranih</string>
<!-- Label of button in create collection dialog for creating a new collection --> <!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Dodaj novo zbirko</string> <string name="tab_tray_add_new_collection">Dodaj novo zbirko</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 -->

@ -217,7 +217,7 @@ class DefaultBrowserToolbarControllerTest {
@Test @Test
fun handleToolbarBackPress() = runBlockingTest { fun handleToolbarBackPress() = runBlockingTest {
val item = ToolbarMenu.Item.Back val item = ToolbarMenu.Item.Back(false)
val controller = createController(scope = this) val controller = createController(scope = this)
controller.handleToolbarItemInteraction(item) controller.handleToolbarItemInteraction(item)
@ -226,6 +226,17 @@ class DefaultBrowserToolbarControllerTest {
verify { sessionUseCases.goBack(currentSession) } verify { sessionUseCases.goBack(currentSession) }
} }
@Test
fun handleToolbarBackLongPress() = runBlockingTest {
val item = ToolbarMenu.Item.Back(true)
val controller = createController(scope = this)
controller.handleToolbarItemInteraction(item)
verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.BACK)) }
verify { navController.navigate(R.id.action_global_tabHistoryDialogFragment) }
}
@Test @Test
fun handleToolbarForwardPress() = runBlockingTest { fun handleToolbarForwardPress() = runBlockingTest {
val item = ToolbarMenu.Item.Forward(false) val item = ToolbarMenu.Item.Forward(false)

@ -212,6 +212,7 @@ class DefaultSessionControlControllerTest {
fun handleCollectionShareTabsClicked() { fun handleCollectionShareTabsClicked() {
val collection = mockk<TabCollection> { val collection = mockk<TabCollection> {
every { tabs } returns emptyList() every { tabs } returns emptyList()
every { title } returns ""
} }
controller.handleCollectionShareTabsClicked(collection) controller.handleCollectionShareTabsClicked(collection)

@ -48,6 +48,7 @@ class ShareControllerTest {
// Need a valid context to retrieve Strings for example, but we also need it to return our "metrics" // Need a valid context to retrieve Strings for example, but we also need it to return our "metrics"
private val context: Context = spyk(testContext) private val context: Context = spyk(testContext)
private val metrics: MetricController = mockk(relaxed = true) private val metrics: MetricController = mockk(relaxed = true)
private val shareSubject = "shareSubject"
private val shareData = listOf( private val shareData = listOf(
ShareData(url = "url0", title = "title0"), ShareData(url = "url0", title = "title0"),
ShareData(url = "url1", title = "title1") ShareData(url = "url1", title = "title1")
@ -65,7 +66,7 @@ class ShareControllerTest {
private val dismiss = mockk<(ShareController.Result) -> Unit>(relaxed = true) private val dismiss = mockk<(ShareController.Result) -> Unit>(relaxed = true)
private val recentAppStorage = mockk<RecentAppsStorage>(relaxed = true) private val recentAppStorage = mockk<RecentAppsStorage>(relaxed = true)
private val controller = DefaultShareController( private val controller = DefaultShareController(
context, shareData, sendTabUseCases, snackbar, navController, context, shareSubject, shareData, sendTabUseCases, snackbar, navController,
recentAppStorage, testCoroutineScope, dismiss recentAppStorage, testCoroutineScope, dismiss
) )
@ -91,8 +92,8 @@ class ShareControllerTest {
// needed for capturing the actual Intent used the `slot` one doesn't have this flag so we // needed for capturing the actual Intent used the `slot` one doesn't have this flag so we
// need to use an Activity Context. // need to use an Activity Context.
val activityContext: Context = mockk<Activity>() val activityContext: Context = mockk<Activity>()
val testController = DefaultShareController(activityContext, shareData, mockk(), mockk(), mockk(), val testController = DefaultShareController(activityContext, shareSubject, shareData, mockk(),
recentAppStorage, testCoroutineScope, dismiss) mockk(), mockk(), recentAppStorage, testCoroutineScope, dismiss)
every { activityContext.startActivity(capture(shareIntent)) } just Runs every { activityContext.startActivity(capture(shareIntent)) } just Runs
every { recentAppStorage.updateRecentApp(appShareOption.activityName) } just Runs every { recentAppStorage.updateRecentApp(appShareOption.activityName) } just Runs
@ -101,6 +102,7 @@ class ShareControllerTest {
// Check that the Intent used for querying apps has the expected structure // Check that the Intent used for querying apps has the expected structure
assertTrue(shareIntent.isCaptured) assertTrue(shareIntent.isCaptured)
assertEquals(Intent.ACTION_SEND, shareIntent.captured.action) assertEquals(Intent.ACTION_SEND, shareIntent.captured.action)
assertEquals(shareSubject, shareIntent.captured.extras!![Intent.EXTRA_SUBJECT])
assertEquals(textToShare, shareIntent.captured.extras!![Intent.EXTRA_TEXT]) assertEquals(textToShare, shareIntent.captured.extras!![Intent.EXTRA_TEXT])
assertEquals("text/plain", shareIntent.captured.type) assertEquals("text/plain", shareIntent.captured.type)
assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, shareIntent.captured.flags) assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, shareIntent.captured.flags)
@ -124,8 +126,8 @@ class ShareControllerTest {
// needed for capturing the actual Intent used the `slot` one doesn't have this flag so we // needed for capturing the actual Intent used the `slot` one doesn't have this flag so we
// need to use an Activity Context. // need to use an Activity Context.
val activityContext: Context = mockk<Activity>() val activityContext: Context = mockk<Activity>()
val testController = DefaultShareController(activityContext, shareData, mockk(), snackbar, val testController = DefaultShareController(activityContext, shareSubject, shareData, mockk(),
mockk(), mockk(), testCoroutineScope, dismiss) snackbar, mockk(), mockk(), testCoroutineScope, dismiss)
every { activityContext.startActivity(capture(shareIntent)) } throws SecurityException() every { activityContext.startActivity(capture(shareIntent)) } throws SecurityException()
every { activityContext.getString(R.string.share_error_snackbar) } returns "Cannot share to this app" every { activityContext.getString(R.string.share_error_snackbar) } returns "Cannot share to this app"
@ -247,6 +249,7 @@ class ShareControllerTest {
fun `getSuccessMessage should return different strings depending on the number of shared tabs`() { fun `getSuccessMessage should return different strings depending on the number of shared tabs`() {
val controllerWithOneSharedTab = DefaultShareController( val controllerWithOneSharedTab = DefaultShareController(
context, context,
shareSubject,
listOf(ShareData(url = "url0", title = "title0")), listOf(ShareData(url = "url0", title = "title0")),
mockk(), mockk(),
mockk(), mockk(),
@ -280,7 +283,7 @@ class ShareControllerTest {
ShareData(url = "url1") ShareData(url = "url1")
) )
val controller = DefaultShareController( val controller = DefaultShareController(
context, shareData, sendTabUseCases, snackbar, navController, context, shareSubject, shareData, sendTabUseCases, snackbar, navController,
recentAppStorage, testCoroutineScope, dismiss recentAppStorage, testCoroutineScope, dismiss
) )
@ -288,6 +291,21 @@ class ShareControllerTest {
assertEquals(expectedShareText, controller.getShareText()) assertEquals(expectedShareText, controller.getShareText())
} }
@Test
fun `getShareSubject will return "shareSubject" if that is non null`() {
assertEquals(shareSubject, controller.getShareSubject())
}
@Test
fun `getShareSubject will return a concatenation of tab titles if "shareSubject" is null`() {
val controller = DefaultShareController(
context, null, shareData, sendTabUseCases, snackbar, navController,
recentAppStorage, testCoroutineScope, dismiss
)
assertEquals("title0, title1", controller.getShareSubject())
}
@Test @Test
fun `ShareTab#toTabData maps a list of ShareTab to a TabData list`() { fun `ShareTab#toTabData maps a list of ShareTab to a TabData list`() {
var tabData: List<TabData> var tabData: List<TabData>

@ -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.20200810074539" const val VERSION = "54.0.20200812130143"
} }

@ -76,7 +76,7 @@ complexity:
# https://github.com/mozilla-mobile/fenix/issues/4861 # https://github.com/mozilla-mobile/fenix/issues/4861
threshold: 75 threshold: 75
LongParameterList: LongParameterList:
active: trued active: true
excludes: "**/*Controller.kt, **/*Integration.kt" excludes: "**/*Controller.kt, **/*Integration.kt"
functionThreshold: 6 functionThreshold: 6
constructorThreshold: 7 constructorThreshold: 7

Loading…
Cancel
Save