1
0
Fork 0

Copione merged onto master
continuous-integration/drone/push Build encountered an error Details

master
blallo 2020-08-06 00:00:31 +02:00
commit 773ed88171
44 changed files with 537 additions and 394 deletions

View File

@ -35,7 +35,6 @@ android {
def deepLinkSchemeValue = "fenix-dev"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders = [
"isRaptorEnabled": "false",
"deepLinkScheme": deepLinkSchemeValue
]
}
@ -56,12 +55,10 @@ android {
shrinkResources false
minifyEnabled false
applicationIdSuffix ".fenix.debug"
manifestPlaceholders.isRaptorEnabled = "true"
resValue "bool", "IS_DEBUG", "true"
pseudoLocalesEnabled true
}
forPerformanceTest releaseTemplate >> { // the ">>" concatenates the raptor-specific options with the template
manifestPlaceholders.isRaptorEnabled = "true"
applicationIdSuffix ".fenix.performancetest"
debuggable true
manifestPlaceholders = [
@ -556,17 +553,15 @@ dependencies {
lintChecks project(":mozilla-lint-rules")
}
if (project.hasProperty("raptor")) {
android.defaultConfig.manifestPlaceholders.isRaptorEnabled = "true"
}
if (project.hasProperty("coverage")) {
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
}
android.applicationVariants.all { variant ->
task "jacoco${variant.name.capitalize()}TestReport"(type: JacocoReport, dependsOn: "test${variant.name.capitalize()}UnitTest") {
tasks.register("jacoco${variant.name.capitalize()}TestReport", JacocoReport) {
dependsOn "test${variant.name.capitalize()}UnitTest"
reports {
xml.enabled = true
html.enabled = true
@ -579,11 +574,12 @@ if (project.hasProperty("coverage")) {
excludes: fileFilter)
def mainSrc = "$project.projectDir/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([kotlinDebugTree, javaDebugTree])
executionData = fileTree(dir: project.buildDir, includes: [
"jacoco/test${variant.name.capitalize()}UnitTest.exec", 'outputs/code-coverage/connected/*coverage.ec'
])
sourceDirectories.setFrom(files([mainSrc]))
classDirectories.setFrom(files([kotlinDebugTree, javaDebugTree]))
executionData.setFrom(fileTree(dir: project.buildDir, includes: [
"jacoco/test${variant.name.capitalize()}UnitTest.exec",
'outputs/code-coverage/connected/*coverage.ec'
]))
}
}

View File

@ -10,6 +10,7 @@ import okhttp3.mockwebserver.MockWebServer
import org.junit.Rule
import org.junit.Before
import org.junit.After
import org.junit.Ignore
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
@ -68,7 +69,7 @@ class SettingsAboutTest {
}
}
@Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/13219")
@Test
fun verifyAboutFirefoxPreview() {
homeScreen {

View File

@ -44,6 +44,7 @@ class SettingsAddonsTest {
}
// Walks through settings add-ons menu to ensure all items are present
@Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/13218")
@Test
fun settingsAddonsItemsTest() {
homeScreen {

View File

@ -3,7 +3,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import android.content.Context
import android.os.Bundle
import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper
import mozilla.components.browser.engine.gecko.ext.toContentBlockingSetting
import mozilla.components.browser.engine.gecko.glean.GeckoAdapter
@ -17,7 +16,6 @@ import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
object GeckoProvider {
var testConfig: Bundle? = null
private var runtime: GeckoRuntime? = null
@Synchronized
@ -40,11 +38,6 @@ object GeckoProvider {
): GeckoRuntime {
val builder = GeckoRuntimeSettings.Builder()
testConfig?.let {
builder.extras(it)
.remoteDebuggingEnabled(true)
}
val runtimeSettings = builder
.crashHandler(CrashHandlerService::class.java)
.telemetryDelegate(GeckoAdapter())

View File

@ -3,7 +3,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import android.content.Context
import android.os.Bundle
import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper
import mozilla.components.browser.engine.gecko.ext.toContentBlockingSetting
import mozilla.components.browser.engine.gecko.glean.GeckoAdapter
@ -17,7 +16,6 @@ import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
object GeckoProvider {
var testConfig: Bundle? = null
private var runtime: GeckoRuntime? = null
@Synchronized
@ -40,11 +38,6 @@ object GeckoProvider {
): GeckoRuntime {
val builder = GeckoRuntimeSettings.Builder()
testConfig?.let {
builder.extras(it)
.remoteDebuggingEnabled(true)
}
val runtimeSettings = builder
.crashHandler(CrashHandlerService::class.java)
.telemetryDelegate(GeckoAdapter())

View File

@ -217,11 +217,6 @@
<activity android:name=".widget.VoiceSearchActivity" />
<activity
android:name=".browser.BrowserPerformanceTestActivity"
android:enabled="${isRaptorEnabled}"
android:exported="${isRaptorEnabled}" />
<activity
android:name=".settings.account.AuthCustomTabActivity"
android:autoRemoveFromRecents="false"

View File

@ -47,5 +47,5 @@ object FeatureFlags {
/**
* Enables wait til first contentful paint
*/
val waitUntilPaintToDraw = Config.channel.isDebug
val waitUntilPaintToDraw = Config.channel.isNightlyOrDebug
}

View File

@ -1,33 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.browser
import GeckoProvider
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import mozilla.components.support.utils.SafeIntent
import org.mozilla.fenix.IntentReceiverActivity
/**
* This activity is used for performance testing with Raptor/tp6:
* https://wiki.mozilla.org/Performance_sheriffing/Raptor
*/
class BrowserPerformanceTestActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeckoProvider.testConfig = SafeIntent(intent).extras
val intent = Intent(intent)
intent.setClassName(applicationContext, IntentReceiverActivity::class.java.name)
startActivity(intent)
finish()
}
}

View File

@ -45,6 +45,8 @@ interface BookmarkController {
fun handleBookmarkFolderDeletion(nodes: Set<BookmarkNode>)
fun handleRequestSync()
fun handleBackPressed()
fun handleStartSwipingItem()
fun handleStopSwipingItem()
}
@Suppress("TooManyFunctions")
@ -169,6 +171,14 @@ class DefaultBookmarkController(
}
}
override fun handleStartSwipingItem() {
store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(false))
}
override fun handleStopSwipingItem() {
store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true))
}
private fun openInNewTab(
searchTermOrURL: String,
newTab: Boolean,

View File

@ -120,4 +120,12 @@ class BookmarkFragmentInteractor(
override fun onRequestSync() {
bookmarksController.handleRequestSync()
}
override fun onStartSwipingItem() {
bookmarksController.handleStartSwipingItem()
}
override fun onStopSwipingItem() {
bookmarksController.handleStopSwipingItem()
}
}

View File

@ -23,12 +23,14 @@ class BookmarkFragmentStore(
* @property guidBackstack A set of guids for bookmark nodes we have visited. Used to traverse back
* up the tree after a sync.
* @property isLoading true if bookmarks are still being loaded from disk
* @property isSwipeToRefreshEnabled true if swipe to refresh should be enabled
*/
data class BookmarkFragmentState(
val tree: BookmarkNode?,
val mode: Mode = Mode.Normal(),
val guidBackstack: List<String> = emptyList(),
val isLoading: Boolean = true
val isLoading: Boolean = true,
val isSwipeToRefreshEnabled: Boolean = true
) : State {
sealed class Mode {
open val selectedItems = emptySet<BookmarkNode>()
@ -49,6 +51,7 @@ sealed class BookmarkFragmentAction : Action {
object DeselectAll : BookmarkFragmentAction()
object StartSync : BookmarkFragmentAction()
object FinishSync : BookmarkFragmentAction()
data class SwipeRefreshAvailabilityChanged(val enabled: Boolean) : BookmarkFragmentAction()
}
/**
@ -71,31 +74,37 @@ private fun bookmarkFragmentStateReducer(
} + action.tree.guid
val items = state.mode.selectedItems.filter { it in action.tree }
val mode = when {
state.mode is BookmarkFragmentState.Mode.Syncing -> {
BookmarkFragmentState.Mode.Syncing
}
items.isEmpty() -> {
BookmarkFragmentState.Mode.Normal(shouldShowMenu(action.tree.guid))
}
else -> BookmarkFragmentState.Mode.Selecting(items.toSet())
}
state.copy(
tree = action.tree,
mode = when {
state.mode is BookmarkFragmentState.Mode.Syncing -> {
BookmarkFragmentState.Mode.Syncing
}
items.isEmpty() -> {
BookmarkFragmentState.Mode.Normal(shouldShowMenu(action.tree.guid))
}
else -> BookmarkFragmentState.Mode.Selecting(items.toSet())
},
mode = mode,
guidBackstack = backstack,
isLoading = false
isLoading = false,
isSwipeToRefreshEnabled = mode !is BookmarkFragmentState.Mode.Selecting
)
}
is BookmarkFragmentAction.Select ->
state.copy(mode = BookmarkFragmentState.Mode.Selecting(state.mode.selectedItems + action.item))
is BookmarkFragmentAction.Select -> state.copy(
mode = BookmarkFragmentState.Mode.Selecting(state.mode.selectedItems + action.item),
isSwipeToRefreshEnabled = false
)
is BookmarkFragmentAction.Deselect -> {
val items = state.mode.selectedItems - action.item
val mode = if (items.isEmpty()) {
BookmarkFragmentState.Mode.Normal()
} else {
BookmarkFragmentState.Mode.Selecting(items)
}
state.copy(
mode = if (items.isEmpty()) {
BookmarkFragmentState.Mode.Normal()
} else {
BookmarkFragmentState.Mode.Selecting(items)
}
mode = mode,
isSwipeToRefreshEnabled = mode !is BookmarkFragmentState.Mode.Selecting
)
}
is BookmarkFragmentAction.DeselectAll ->
@ -104,18 +113,22 @@ private fun bookmarkFragmentStateReducer(
BookmarkFragmentState.Mode.Syncing
} else {
BookmarkFragmentState.Mode.Normal()
}
)
is BookmarkFragmentAction.StartSync ->
state.copy(
mode = BookmarkFragmentState.Mode.Syncing
)
is BookmarkFragmentAction.FinishSync ->
state.copy(
mode = BookmarkFragmentState.Mode.Normal(
showMenu = shouldShowMenu(state.tree?.guid)
)
},
isSwipeToRefreshEnabled = true
)
is BookmarkFragmentAction.StartSync -> state.copy(
mode = BookmarkFragmentState.Mode.Syncing,
isSwipeToRefreshEnabled = true
)
is BookmarkFragmentAction.FinishSync -> state.copy(
mode = BookmarkFragmentState.Mode.Normal(
showMenu = shouldShowMenu(state.tree?.guid)
),
isSwipeToRefreshEnabled = true
)
is BookmarkFragmentAction.SwipeRefreshAvailabilityChanged -> state.copy(
isSwipeToRefreshEnabled = action.enabled && state.mode !is BookmarkFragmentState.Mode.Selecting
)
}
}

View File

@ -10,6 +10,7 @@ import android.graphics.drawable.Drawable
import androidx.appcompat.content.res.AppCompatResources
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import mozilla.components.concept.storage.BookmarkNodeType
import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.ktx.android.content.getDrawableWithTint
import mozilla.components.support.ktx.android.util.dpToPx
@ -21,8 +22,9 @@ import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkSeparatorViewHold
class BookmarkTouchHelper(interactor: BookmarkViewInteractor) :
ItemTouchHelper(BookmarkTouchCallback(interactor))
class BookmarkTouchCallback(private val interactor: BookmarkViewInteractor) :
ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
class BookmarkTouchCallback(
private val interactor: BookmarkViewInteractor
) : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
override fun getSwipeDirs(
recyclerView: RecyclerView,
@ -41,7 +43,14 @@ class BookmarkTouchCallback(private val interactor: BookmarkViewInteractor) :
*/
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val item = (viewHolder as BookmarkNodeViewHolder).item
item?.let { interactor.onDelete(setOf(it)) }
item?.let {
interactor.onDelete(setOf(it))
// We need to notify the adapter of a change if we swipe a folder to prevent
// visual bugs when cancelling deletion of a folder
if (item.type == BookmarkNodeType.FOLDER) {
viewHolder.bindingAdapter?.notifyItemChanged(viewHolder.bindingAdapterPosition)
}
}
}
override fun onChildDraw(
@ -107,6 +116,15 @@ class BookmarkTouchCallback(private val interactor: BookmarkViewInteractor) :
target: RecyclerView.ViewHolder
): Boolean = false
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
interactor.onStartSwipingItem()
} else {
interactor.onStopSwipingItem()
}
}
private fun setBounds(
background: Drawable,
backgroundBounds: Rect,

View File

@ -98,6 +98,16 @@ interface BookmarkViewInteractor : SelectionInteractor<BookmarkNode> {
*
*/
fun onRequestSync()
/**
* Handles the start of a swipe on a bookmark.
*/
fun onStartSwipingItem()
/**
* Handles the end of a swipe on a bookmark.
*/
fun onStopSwipingItem()
}
class BookmarkView(
@ -112,11 +122,10 @@ class BookmarkView(
private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal()
private var tree: BookmarkNode? = null
private val bookmarkAdapter: BookmarkAdapter
private val bookmarkAdapter = BookmarkAdapter(view.bookmarks_empty_view, interactor)
init {
view.bookmark_list.apply {
bookmarkAdapter = BookmarkAdapter(view.bookmarks_empty_view, interactor)
adapter = bookmarkAdapter
}
view.bookmark_folders_sign_in.setOnClickListener {
@ -153,8 +162,7 @@ class BookmarkView(
}
}
view.bookmarks_progress_bar.isVisible = state.isLoading
view.swipe_refresh.isEnabled =
state.mode is BookmarkFragmentState.Mode.Normal || state.mode is BookmarkFragmentState.Mode.Syncing
view.swipe_refresh.isEnabled = state.isSwipeToRefreshEnabled
view.swipe_refresh.isRefreshing = state.mode is BookmarkFragmentState.Mode.Syncing
}

View File

@ -141,7 +141,7 @@ class SearchFragment : Fragment(), UserInteractionHandler {
searchController
)
awesomeBarView = AwesomeBarView(view.scrollable_area, searchInteractor,
awesomeBarView = AwesomeBarView(requireContext(), searchInteractor,
view.findViewById(R.id.awesomeBar))
setShortcutsChangedListener(CustomSearchEngineStore.PREF_FILE_SEARCH_ENGINES)
setShortcutsChangedListener(FenixSearchEngineProvider.PREF_FILE_SEARCH_ENGINES)

View File

@ -4,7 +4,7 @@
package org.mozilla.fenix.search.awesomebar
import android.view.ViewGroup
import android.content.Context
import androidx.appcompat.content.res.AppCompatResources.getDrawable
import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat.SRC_IN
@ -34,11 +34,10 @@ import org.mozilla.fenix.search.SearchFragmentState
* View that contains and configures the BrowserAwesomeBar
*/
class AwesomeBarView(
private val container: ViewGroup,
private val context: Context,
val interactor: AwesomeBarInteractor,
val view: BrowserAwesomeBar
) {
private val sessionProvider: SessionSuggestionProvider
private val historyStorageProvider: HistoryStorageSuggestionProvider
private val shortcutsEnginePickerProvider: ShortcutsSuggestionProvider
@ -91,7 +90,6 @@ class AwesomeBarView(
init {
view.itemAnimator = null
val context = container.context
val components = context.components
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)
@ -255,7 +253,7 @@ class AwesomeBarView(
}
private fun isBrowsingModePrivate(): Boolean {
return (container.context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate
return (context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate
?: false
}
@ -280,7 +278,6 @@ class AwesomeBarView(
private fun getSuggestionProviderForEngine(engine: SearchEngine): List<AwesomeBar.SuggestionProvider> {
return searchSuggestionProviderMap.getOrPut(engine) {
val context = container.context
val components = context.components
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)

View File

@ -9,12 +9,116 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatDialogFragment
import kotlinx.android.synthetic.main.fragment_search.view.*
import mozilla.components.browser.search.SearchEngine
import mozilla.components.browser.session.Session
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.logDebug
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.search.SearchEngineSource
import org.mozilla.fenix.search.SearchFragmentState
import org.mozilla.fenix.search.awesomebar.AwesomeBarInteractor
import org.mozilla.fenix.search.awesomebar.AwesomeBarView
import org.mozilla.fenix.search.toolbar.ToolbarInteractor
import org.mozilla.fenix.search.toolbar.ToolbarView
class TempSearchInteractor(val onTextChangedCallback: (String) -> Unit) : ToolbarInteractor, AwesomeBarInteractor {
override fun onUrlCommitted(url: String) {
logDebug("boek", "onUrlCommitted $url")
}
override fun onEditingCanceled() {
logDebug("boek", "onEditingCanceled")
}
override fun onTextChanged(text: String) {
onTextChangedCallback.invoke(text)
}
override fun onUrlTapped(url: String) {
logDebug("boek", "onEditingCanceled")
}
override fun onSearchTermsTapped(searchTerms: String) {
logDebug("boek", "onEditingCanceled")
}
override fun onSearchShortcutEngineSelected(searchEngine: SearchEngine) {
logDebug("boek", "onEditingCanceled")
}
override fun onClickSearchEngineSettings() {
logDebug("boek", "onEditingCanceled")
}
override fun onExistingSessionSelected(session: Session) {
logDebug("boek", "onEditingCanceled")
}
override fun onExistingSessionSelected(tabId: String) {
logDebug("boek", "onEditingCanceled")
}
override fun onSearchShortcutsButtonClicked() {
logDebug("boek", "onEditingCanceled")
}
}
class SearchDialogFragment : AppCompatDialogFragment() {
private lateinit var toolbarView: ToolbarView
private lateinit var awesomeBarView: AwesomeBarView
private val tempInteractor = TempSearchInteractor {
view?.awesomeBar?.visibility = if (it.isEmpty()) View.INVISIBLE else View.VISIBLE
awesomeBarView.update(
SearchFragmentState(
query = it,
url = "",
searchTerms = "",
searchEngineSource = SearchEngineSource.Default(requireComponents.search.provider.getDefaultEngine(requireContext())),
defaultEngineSource = SearchEngineSource.Default(requireComponents.search.provider.getDefaultEngine(requireContext())),
showSearchSuggestions = true,
showSearchSuggestionsHint = false,
showSearchShortcuts = false,
areShortcutsAvailable = false,
showClipboardSuggestions = true,
showHistorySuggestions = true,
showBookmarkSuggestions = true,
tabId = null,
pastedText = null,
searchAccessPoint = null
)
)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.SearchDialogStyle)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_search_dialog, container, false)
): View? {
val view = inflater.inflate(R.layout.fragment_search_dialog, container, false)
toolbarView = ToolbarView(
requireContext(),
tempInteractor,
null,
false,
view.toolbar,
requireComponents.core.engine
)
awesomeBarView = AwesomeBarView(
requireContext(),
tempInteractor,
view.awesomeBar
)
return view
}
}

View File

@ -10,7 +10,6 @@ import android.os.Bundle
import mozilla.components.support.utils.RunWhenReadyQueue
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.browser.BrowserPerformanceTestActivity
import org.mozilla.fenix.settings.account.AuthIntentReceiverActivity
import org.mozilla.fenix.widget.VoiceSearchActivity
@ -37,8 +36,7 @@ class PerformanceActivityLifecycleCallbacks(
return isTransientActivityInMigrationVariant(activity) ||
(activity is IntentReceiverActivity) ||
(activity is VoiceSearchActivity) ||
(activity is AuthIntentReceiverActivity) ||
(activity is BrowserPerformanceTestActivity)
(activity is AuthIntentReceiverActivity)
}
/**

View File

@ -61,6 +61,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
private val tabsFeature = ViewBoundFeatureWrapper<TabsFeature>()
private var _tabTrayView: TabTrayView? = null
private var currentOrientation: Int? = null
private val tabTrayView: TabTrayView
get() = _tabTrayView!!
private lateinit var tabTrayDialogStore: TabTrayDialogFragmentStore
@ -154,9 +155,10 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
val isLandscape = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
tabTrayView.setTopOffset(isLandscape)
if (isLandscape) {
if (newConfig.orientation != currentOrientation) {
tabTrayView.dismissMenu()
tabTrayView.expand()
currentOrientation = newConfig.orientation
}
}
@ -168,6 +170,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
val thumbnailLoader = ThumbnailLoader(requireContext().components.core.thumbnailStorage)
val adapter = FenixTabsAdapter(requireContext(), thumbnailLoader)
currentOrientation = resources.configuration.orientation
_tabTrayView = TabTrayView(
view.tabLayout,

View File

@ -5,14 +5,49 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
<mozilla.components.browser.toolbar.BrowserToolbar
android:id="@+id/toolbar"
android:layout_width="0dp"
android:layout_height="@dimen/browser_toolbar_height"
android:background="@drawable/toolbar_background_top"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
app:layout_scrollFlags="scroll|enterAlways|snap|exitUntilCollapsed"
app:browserToolbarClearColor="?primaryText"
app:browserToolbarInsecureColor="?primaryText"
app:browserToolbarMenuColor="?primaryText"
app:browserToolbarProgressBarGravity="bottom"
app:browserToolbarSecureColor="?primaryText"
app:browserToolbarTrackingProtectionAndSecurityIndicatorSeparatorColor="?toolbarDivider"
app:layout_constraintEnd_toEndOf="parent"
android:text="Hello World"
/>
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.core.widget.NestedScrollView
android:layout_width="0dp"
android:layout_height="0dp"
android:id="@+id/scrollView"
android:background="?attr/scrimBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar"
android:scrollbars="vertical">
<mozilla.components.browser.awesomebar.BrowserAwesomeBar
xmlns:mozac="http://schemas.android.com/apk/res-auto"
android:id="@+id/awesomeBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fadingEdge="horizontal"
android:fadingEdgeLength="40dp"
android:nestedScrollingEnabled="false"
android:requiresFadingEdge="vertical"
android:background="?attr/foundation"
android:visibility="invisible"
mozac:awesomeBarChipBackgroundColor="@color/photonGreen50"
mozac:awesomeBarDescriptionTextColor="?secondaryText"
mozac:awesomeBarTitleTextColor="?primaryText" />
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -170,8 +170,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Sganio</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Peiriant Chwilio</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Peiriant chwilio</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Gosodiadau peiriannau chwilio</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1456,9 +1456,7 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad
<string name="saved_login_duplicate">Mae mewngofnod gydar enw defnyddiwr yna eisoes yn bodoli</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Cysylltu gyda Chyfrif Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Cysylltu dyfais arall</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Ail-ddilyswch, os gwelwch yn dda.</string>
@ -1480,13 +1478,4 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Iawn, Wedi deall!</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Llwybrau byr</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Chwilio gyda</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Y tro hwn, chwilio gyda:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Dangos llwybrau byr chwilio</string>
</resources>

View File

@ -170,8 +170,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Scan</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Search Engine</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Search engine</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Search engine settings</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1447,9 +1447,7 @@
<string name="saved_login_duplicate">A login with that username already exists</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Connect with a Firefox Account.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Connect another device.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Please re-authenticate.</string>
@ -1470,13 +1468,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, Got It</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Shortcuts</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Search with</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">This time, search with:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Show search shortcuts</string>
</resources>

View File

@ -169,8 +169,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Escanear</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Motor de búsqueda</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Motor de búsqueda</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Ajustes del motor de búsqueda</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1456,9 +1456,7 @@
<string name="saved_login_duplicate">Ya existe una credencial con ese nombre de usuario</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Conectarse con una cuenta de Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Conectar otro dispositivo.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Por favor, vuelve a autentificarte.</string>
@ -1479,14 +1477,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Ok, ¡ya caché!</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Atajos</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Buscar con</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Esta vez, buscar con:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Mostrar atajos de búsqueda</string>
</resources>

View File

@ -172,8 +172,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Scanner</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Moteur de recherche</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Moteur de recherche</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Paramètres du moteur de recherche</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1490,9 +1490,7 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n
<string name="saved_login_duplicate">Un identifiant avec ce nom dutilisateur existe déjà</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Connectez-vous avec un compte Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Connectez un autre appareil.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Veuillez vous authentifier à nouveau.</string>
@ -1513,14 +1511,4 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Jai compris</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Raccourcis</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Rechercher avec</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Pour cette fois, rechercher avec :</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Afficher les raccourcis de recherche</string>
</resources>

View File

@ -175,8 +175,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Mohaãnga</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Hekaha mongueha</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Hekaha mongueha</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Hekaha ñemboheko</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1484,9 +1484,7 @@
<string name="saved_login_duplicate">Oĩma tembiapo ñepyrũ puruhára réra peichagua</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Eike Firefox Account ndive.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Emoinge ambue mbaeoka.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Ikatúpiko emoneĩjey.</string>
@ -1508,13 +1506,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Oĩma, aikumby</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Mbopyaeha</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Eheka amo</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Koág̃a, eheka hendive:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Ehechauka jeheka mbopyaeha</string>
</resources>

View File

@ -800,7 +800,7 @@
<!-- An option from the share dialog to reconnect to sync -->
<string name="sync_reconnect">Ponovo se poveži za sinkronizaciju</string>
<!-- Text displayed when sync is offline and cannot be accessed -->
<string name="sync_offline">Neumreženo</string>
<string name="sync_offline">Izvanmrežno</string>
<!-- An option to connect additional devices -->
<string name="sync_connect_device">Poveži jedan drugi uređaj</string>
<!-- The dialog text shown when additional devices are not available -->

View File

@ -173,8 +173,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Leggi</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Motore di ricerca</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Motore di ricerca</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Impostazioni motori di ricerca</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1492,9 +1492,7 @@
<string name="saved_login_duplicate">Esistono già credenziali con questo nome utente</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Connetti un account Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Connetti un altro dispositivo.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Esegui nuovamente laccesso.</string>
@ -1516,14 +1514,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, tutto chiaro</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Scelte rapide</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Cerca con</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Adesso cerca con:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Mostra le scorciatoie di ricerca</string>
</resources>

View File

@ -30,6 +30,17 @@
<!-- 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 geselecteerd</string>
<!-- Label of button in create collection dialog for creating a new collection -->
<string name="tab_tray_add_new_collection">Nieuwe collectie toevoegen</string>
<!-- Label of editable text in create collection dialog for naming a new collection -->
<string name="tab_tray_add_new_collection_name">Naam</string>
<!-- Label of button in save to collection dialog for selecting a current collection -->
<string name="tab_tray_select_collection">Collectie selecteren</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 geselecteerd</string>
<!-- Content description on checkmark while tab is selected in multiselect mode in tab tray -->
<string name="tab_tray_multiselect_selected_content_description">Geselecteerd</string>
<!-- About content. The first parameter is the name of the application. (For example: Fenix) -->
<string name="about_content">%1$s is gemaakt door Mozilla.</string>
@ -156,8 +167,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Scannen</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Zoekmachine</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Zoekmachine</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Instellingen zoekmachine</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -520,6 +531,9 @@
<!-- Postfix for private WebApp titles, placeholder is replaced with app name -->
<string name="pwa_site_controls_title_private">%1$s (privémodus)</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">Opslaan</string>
<!-- History -->
<!-- Text for the button to clear all history -->
<string name="history_delete_all">Geschiedenis verwijderen</string>
@ -1444,9 +1458,7 @@
<string name="saved_login_duplicate">Er bestaat al een aanmelding met die gebruikersnaam</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Verbinden met een Firefox-account.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Een ander apparaat verbinden.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Gelieve opnieuw te authenticeren.</string>
@ -1468,13 +1480,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, begrepen</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Snelkoppelingen</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Zoeken met</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Deze keer zoeken met:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Zoeksnelkoppelingen tonen</string>
</resources>

View File

@ -173,8 +173,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Skanuj</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Wyszukiwarka</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Wyszukiwarka</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Ustawienia wyszukiwarki</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1466,9 +1466,7 @@
<string name="saved_login_duplicate">Dane logowania z tą nazwą użytkownika już istnieją</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Połącz się z kontem Firefoksa.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Połącz inne urządzenie.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Proszę uwierzytelnić się ponownie.</string>
@ -1490,13 +1488,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Skróty</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Szukaj w</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Tym razem szukaj w:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Skróty wyszukiwania</string>
</resources>

View File

@ -171,8 +171,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Digitalizar</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Mecanismo de pesquisa</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Mecanismo de pesquisa</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Configurações de mecanismos de pesquisa</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1461,9 +1461,7 @@
<string name="saved_login_duplicate">Já existe uma conta com este nome de usuário</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Conecte-se com uma Conta Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Conecte outro dispositivo.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Autentique novamente.</string>
@ -1485,13 +1483,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, entendi</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Atalhos</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Pesquisar com</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Desta vez, pesquisar com:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Mostrar atalhos de pesquisa</string>
</resources>

View File

@ -173,8 +173,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Skenovať</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Vyhľadávací modul</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Vyhľadávací modul</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Nastavenia vyhľadávacieho modulu</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1466,9 +1466,7 @@
<string name="saved_login_duplicate">Prihlasovacie údaje s týmto používateľským menom už existujú</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Prepojiť s účtom Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Pripojiť ďalšie zariadenie.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Prosím, znova overte totožnosť.</string>
@ -1490,14 +1488,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Ok, rozumiem</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Skratky</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Hľadať pomocou</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Vyhľadať pomocou:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Zobrazovať skratky vyhľadávania</string>
</resources>

View File

@ -169,8 +169,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Pinday</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Mesin Pamaluruh</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Mesin pamaluruh</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Setélan mesin pamaluruh</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1471,9 +1471,7 @@
<string name="saved_login_duplicate">Login maké éta sandiasma geus aya</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Sambungkeun maké Firefox Account.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Sambungkeun séjén paranti.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Mangga oténtikasi ulang.</string>
@ -1494,13 +1492,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Okéh, Ngarti</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Takulan</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Paluruh maké</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Saayeunaeun, paluruh maké:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Témbongkeun takulan pamaluruhan</string>
</resources>

View File

@ -169,8 +169,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">స్కాన్ చేయి</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">శోధన యంత్రం</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">శోధన యంత్రం</string>
<!-- 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>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1479,9 +1479,7 @@
<string name="saved_login_duplicate">ఆ వాడుకరి పేరుతో ఒక ప్రవేశం ఇప్పటికే ఉంది</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox 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 -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">మరొక పరికరాన్ని అనుసంధానించండి.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">దయచేసి పునరధీకరణ చేయండి.</string>
@ -1502,13 +1500,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<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>

View File

@ -169,8 +169,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">สแกน</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">เครื่องมือค้นหา</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">เครื่องมือค้นหา</string>
<!-- 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>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1454,9 +1454,7 @@
<string name="saved_login_duplicate">การเข้าสู่ระบบที่มีชื่อผู้ใช้นี้มีอยู่แล้ว</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox 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 -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">เชื่อมต่ออุปกรณ์อื่น</string>
<!-- Text displayed asking user to re-authenticate -->
@ -1478,13 +1476,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<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>

View File

@ -171,8 +171,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Tara</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Arama motoru</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Arama motoru</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Arama motoru ayarları</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1456,9 +1456,7 @@
<string name="saved_login_duplicate">Bu kullanıcı adına sahip bir hesap zaten var</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Firefox Hesabınıza giriş yapın.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Başka bir cihaz bağlayın.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Lütfen yeniden giriş yapın.</string>
@ -1479,13 +1477,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">Tamam</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Kısayollar</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Bununla ara:</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Bir de bununla aramayı deneyin:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Arama kısayollarını göster</string>
</resources>

View File

@ -166,8 +166,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Tekshirish</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Qidiruv tizimi</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Qidiruv tizimi</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Qidiruv tizimi sozlamalari</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -378,6 +378,11 @@
<!-- Preference switch for usage and technical data collection -->
<string name="preference_usage_data">Texnik va foydalanishga oid maʼlumotlar</string>
<!-- Preference description for usage and technical data collection -->
<string name="preferences_usage_data_description">Samaradorlik, foydalanish statistikasi va moslash maʼlumotlarini Mozillaga ulashish orqali siz %1$s brauzerini yaxshilashda yordam berasiz</string>
<!-- Preference switch for marketing data collection -->
<string name="preferences_marketing_data">Marketing maʼlumotlari</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">Maxfiy varaq qoʻshish</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
@ -809,9 +814,7 @@
<string name="saved_login_duplicate">Shu nomdagi login oldindan bor</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Firefox hisobi bilan ulanish</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Boshqa qurilmani ulash</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Qaytadan haqiqiylikni tekshiring.</string>
@ -832,11 +835,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, tushundim</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Yorliqlar</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Izlash:</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Bu safar quyidagi bilan izlash:</string>
</resources>

View File

@ -171,8 +171,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Quét</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">Công cụ tìm kiếm</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Công cụ tìm kiếm</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Cài đặt công cụ tìm kiếm</string>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1450,9 +1450,7 @@
<string name="saved_login_duplicate">Một thông tin đăng nhập với tên người dùng đó đã tồn tại</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox Account -->
<string name="synced_tabs_connect_to_sync_account">Kết nối với tài khoản Firefox.</string>
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">Kết nối thiết bị khác.</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">Vui lòng xác thực lại.</string>
@ -1473,13 +1471,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<string name="top_sites_max_limit_confirmation_button">OK, đã hiểu</string>
<!-- DEPRECATED STRINGS -->
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Tìm kiếm</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Tìm kiếm với</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Lần này, tìm kiếm với:</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">Hiển thị các lối tắt tìm kiếm</string>
</resources>

View File

@ -178,8 +178,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">扫码</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">搜索引擎</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">搜索引擎</string>
<!-- 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>
@ -1495,9 +1495,7 @@
<string name="saved_login_duplicate">已有同用户名的登录信息存在</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox 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 -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">绑定其他设备</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">请重新验证。</string>
@ -1518,14 +1516,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<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>

View File

@ -174,8 +174,8 @@
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">掃描</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_engines_shortcut_button">搜尋引擎</string>
<!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">搜尋引擎</string>
<!-- 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>
<!-- Header displayed when selecting a shortcut search engine -->
@ -1484,9 +1484,7 @@
<string name="saved_login_duplicate">已有該使用者名稱的登入資訊</string>
<!-- Synced Tabs -->
<!-- Text displayed when user is not logged into a Firefox 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 -->
<!-- Text displayed to ask user to connect another device as no devices found with account -->
<string name="synced_tabs_connect_another_device">連結另一部裝置。</string>
<!-- Text displayed asking user to re-authenticate -->
<string name="synced_tabs_reauth">請重新登入。</string>
@ -1507,13 +1505,4 @@
<!-- Confirmation dialog button text when top sites limit is reached. -->
<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>

View File

@ -614,4 +614,9 @@
<item name="elevation">90dp</item>
<item name="android:stateListAnimator">@null</item>
</style>
<style name="SearchDialogStyle" parent="DialogStyleBase">
<item name="android:windowIsFloating">false</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
</resources>

View File

@ -337,4 +337,22 @@ class BookmarkControllerTest {
navController.popBackStack()
}
}
@Test
fun `handleStartSwipingItem disables swipe to refresh`() {
controller.handleStartSwipingItem()
verify {
bookmarkStore.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(false))
}
}
@Test
fun `handleStopSwipingItem attempts to enable swipe to refresh`() {
controller.handleStopSwipingItem()
verify {
bookmarkStore.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true))
}
}
}

View File

@ -210,4 +210,22 @@ class BookmarkFragmentInteractorTest {
bookmarkController.handleRequestSync()
}
}
@Test
fun `start swiping an item`() {
interactor.onStartSwipingItem()
verify {
bookmarkController.handleStartSwipingItem()
}
}
@Test
fun `stop swiping an item`() {
interactor.onStopSwipingItem()
verify {
bookmarkController.handleStopSwipingItem()
}
}
}

View File

@ -80,32 +80,63 @@ class BookmarkFragmentStoreTest {
@Test
fun `ensure selected items remain selected after a tree change`() = runBlocking {
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder)))
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder)),
isLoading = false,
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.Change(newTree)).join()
assertEquals(store.state.tree, newTree)
assertEquals(store.state.mode, BookmarkFragmentState.Mode.Selecting(setOf(subfolder)))
assertEquals(
store.state,
BookmarkFragmentState(
newTree,
BookmarkFragmentState.Mode.Selecting(setOf(subfolder)),
guidBackstack = listOf(tree.guid),
isLoading = false,
isSwipeToRefreshEnabled = false
)
)
}
@Test
fun `select and deselect bookmarks changes the mode`() = runBlocking {
fun `select and deselect a single bookmark changes the mode and swipe to refresh state`() = runBlocking {
val initialState = BookmarkFragmentState(tree)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.Select(childItem)).join()
assertEquals(store.state, BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(childItem))))
assertEquals(
store.state,
BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Selecting(setOf(childItem)),
isSwipeToRefreshEnabled = false
)
)
store.dispatch(BookmarkFragmentAction.Deselect(childItem)).join()
assertEquals(store.state, BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal()))
assertEquals(
store.state,
BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Normal(),
isSwipeToRefreshEnabled = true
)
)
}
@Test
fun `selecting the same item twice does nothing`() = runBlocking {
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder)))
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder)),
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.Select(item)).join()
@ -115,7 +146,11 @@ class BookmarkFragmentStoreTest {
@Test
fun `deselecting an unselected bookmark does nothing`() = runBlocking {
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(childItem)))
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Selecting(setOf(childItem)),
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.Deselect(item)).join()
@ -134,14 +169,25 @@ class BookmarkFragmentStoreTest {
}
@Test
fun `deselect all bookmarks changes the mode`() = runBlocking {
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(item, childItem)))
val store = BookmarkFragmentStore(initialState)
fun `deselect all bookmarks changes the mode and updates swipe to refresh state`() =
runBlocking {
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Selecting(setOf(item, childItem)),
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.DeselectAll).join()
store.dispatch(BookmarkFragmentAction.DeselectAll).join()
assertEquals(store.state, initialState.copy(mode = BookmarkFragmentState.Mode.Normal()))
}
assertEquals(
store.state,
initialState.copy(
mode = BookmarkFragmentState.Mode.Normal(),
isSwipeToRefreshEnabled = true
)
)
}
@Test
fun `deselect all bookmarks when none are selected`() = runBlocking {
@ -214,6 +260,45 @@ class BookmarkFragmentStoreTest {
assertEquals(BookmarkFragmentState.Mode.Syncing, store.state.mode)
}
@Test
fun `enabling swipe to refresh in Normal mode works`() = runBlocking {
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Normal(),
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)).join()
assertEquals(true, store.state.isSwipeToRefreshEnabled)
}
@Test
fun `enabling swipe to refresh in Syncing mode works`() = runBlocking {
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Syncing,
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)).join()
assertEquals(true, store.state.isSwipeToRefreshEnabled)
}
@Test
fun `enabling swipe to refresh in Selecting mode does not work`() = runBlocking {
val initialState = BookmarkFragmentState(
tree,
BookmarkFragmentState.Mode.Selecting(emptySet()),
isSwipeToRefreshEnabled = false
)
val store = BookmarkFragmentStore(initialState)
store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)).join()
assertEquals(false, store.state.isSwipeToRefreshEnabled)
}
private val item = BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null)
private val separator = BookmarkNode(BookmarkNodeType.SEPARATOR, "789", "123", 1, null, null, null)
private val subfolder = BookmarkNode(BookmarkNodeType.FOLDER, "987", "123", 0, "Subfolder", null, listOf())

View File

@ -0,0 +1,59 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.library.bookmarks
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.RelaxedMockK
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.concept.storage.BookmarkNodeType
import org.junit.Before
import org.junit.Test
import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkNodeViewHolder
class BookmarkTouchHelperTest {
@RelaxedMockK private lateinit var interactor: BookmarkViewInteractor
@RelaxedMockK private lateinit var viewHolder: BookmarkNodeViewHolder
@RelaxedMockK private lateinit var item: BookmarkNode
private lateinit var touchCallback: BookmarkTouchCallback
@Before
fun setup() {
MockKAnnotations.init(this)
touchCallback = BookmarkTouchCallback(interactor)
every { viewHolder.item } returns item
}
@Test
fun `swiping an item calls onDelete`() {
touchCallback.onSwiped(viewHolder, ItemTouchHelper.LEFT)
verify {
interactor.onDelete(setOf(item))
}
}
@Test
fun `swiping a folder calls onDelete and notifies the adapter of the change`() {
val adapter: RecyclerView.Adapter<BookmarkNodeViewHolder> = mockk(relaxed = true)
every { item.type } returns BookmarkNodeType.FOLDER
every { viewHolder.bindingAdapter } returns adapter
every { viewHolder.bindingAdapterPosition } returns 0
touchCallback.onSwiped(viewHolder, ItemTouchHelper.LEFT)
verify {
interactor.onDelete(setOf(item))
adapter.notifyItemChanged(0)
}
}
}

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists