diff --git a/app/build.gradle b/app/build.gradle
index 3f86afe6a..da39bfdcd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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'
+ ]))
}
}
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt
index 26368bd0a..b9963cb98 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt
@@ -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 {
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt
index 05b3b82fc..a310457bb 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt
@@ -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 {
diff --git a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt
index b5171c98a..1bebe0c5c 100644
--- a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt
+++ b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt
@@ -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())
diff --git a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt
index 43a2dd510..031c1c6c1 100644
--- a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt
+++ b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt
@@ -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())
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dedb00946..bb20352e0 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -217,11 +217,6 @@
-
-
)
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,
diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt
index 4f5e757fc..3a1a4f252 100644
--- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt
+++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt
@@ -120,4 +120,12 @@ class BookmarkFragmentInteractor(
override fun onRequestSync() {
bookmarksController.handleRequestSync()
}
+
+ override fun onStartSwipingItem() {
+ bookmarksController.handleStartSwipingItem()
+ }
+
+ override fun onStopSwipingItem() {
+ bookmarksController.handleStopSwipingItem()
+ }
}
diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt
index d2c2341de..e1c4a8f43 100644
--- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt
+++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt
@@ -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 = emptyList(),
- val isLoading: Boolean = true
+ val isLoading: Boolean = true,
+ val isSwipeToRefreshEnabled: Boolean = true
) : State {
sealed class Mode {
open val selectedItems = emptySet()
@@ -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
+ )
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt
index 69c0186ed..b31b99fa6 100644
--- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt
+++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt
@@ -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,
diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt
index 10d91822b..9a0e4644a 100644
--- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt
+++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt
@@ -98,6 +98,16 @@ interface BookmarkViewInteractor : SelectionInteractor {
*
*/
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
}
diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt
index fb706bcda..e9882c3dc 100644
--- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt
@@ -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)
diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt
index 7d918a1e0..8ba8f3e20 100644
--- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt
+++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt
@@ -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 {
return searchSuggestionProviderMap.getOrPut(engine) {
- val context = container.context
val components = context.components
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)
diff --git a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt
index a8a97cc32..91b8bcf22 100644
--- a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt
@@ -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
+ }
}
diff --git a/app/src/main/java/org/mozilla/fenix/session/PerformanceActivityLifecycleCallbacks.kt b/app/src/main/java/org/mozilla/fenix/session/PerformanceActivityLifecycleCallbacks.kt
index 793a222cb..2684b0388 100644
--- a/app/src/main/java/org/mozilla/fenix/session/PerformanceActivityLifecycleCallbacks.kt
+++ b/app/src/main/java/org/mozilla/fenix/session/PerformanceActivityLifecycleCallbacks.kt
@@ -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)
}
/**
diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt
index a4417ef15..cfe8b0f1c 100644
--- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt
@@ -61,6 +61,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
private val tabsFeature = ViewBoundFeatureWrapper()
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,
diff --git a/app/src/main/res/layout/fragment_search_dialog.xml b/app/src/main/res/layout/fragment_search_dialog.xml
index 10c211752..faac704e3 100644
--- a/app/src/main/res/layout/fragment_search_dialog.xml
+++ b/app/src/main/res/layout/fragment_search_dialog.xml
@@ -5,14 +5,49 @@
-
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+
+
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 7373f9449..3da299943 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -170,8 +170,8 @@
Sganio
-
- Peiriant Chwilio
+
+ Peiriant chwilio
Gosodiadau peiriannau chwilio
@@ -1456,9 +1456,7 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad
Mae mewngofnod gyda’r enw defnyddiwr yna eisoes yn bodoli
-
- Cysylltu gyda Chyfrif Firefox.
-
+
Cysylltu dyfais arall
Ail-ddilyswch, os gwelwch yn dda.
@@ -1480,13 +1478,4 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad
Iawn, Wedi deall!
-
-
- Llwybrau byr
-
- Chwilio gyda
-
- Y tro hwn, chwilio gyda:
-
- Dangos llwybrau byr chwilio
diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml
index 2428be270..3f822e18c 100644
--- a/app/src/main/res/values-en-rCA/strings.xml
+++ b/app/src/main/res/values-en-rCA/strings.xml
@@ -170,8 +170,8 @@
Scan
-
- Search Engine
+
+ Search engine
Search engine settings
@@ -1447,9 +1447,7 @@
A login with that username already exists
-
- Connect with a Firefox Account.
-
+
Connect another device.
Please re-authenticate.
@@ -1470,13 +1468,4 @@
OK, Got It
-
-
- Shortcuts
-
- Search with
-
- This time, search with:
-
- Show search shortcuts
diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml
index 86efd0030..b8815f6d6 100644
--- a/app/src/main/res/values-es-rCL/strings.xml
+++ b/app/src/main/res/values-es-rCL/strings.xml
@@ -169,8 +169,8 @@
Escanear
-
- Motor de búsqueda
+
+ Motor de búsqueda
Ajustes del motor de búsqueda
@@ -1456,9 +1456,7 @@
Ya existe una credencial con ese nombre de usuario
-
- Conectarse con una cuenta de Firefox.
-
+
Conectar otro dispositivo.
Por favor, vuelve a autentificarte.
@@ -1479,14 +1477,4 @@
Ok, ¡ya caché!
-
-
- Atajos
-
- Buscar con
-
- Esta vez, buscar con:
-
-
- Mostrar atajos de búsqueda
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d4861c785..07fcfa93f 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -172,8 +172,8 @@
Scanner
-
- Moteur de recherche
+
+ Moteur de recherche
Paramètres du moteur de recherche
@@ -1490,9 +1490,7 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n
Un identifiant avec ce nom d’utilisateur existe déjà
-
- Connectez-vous avec un compte Firefox.
-
+
Connectez un autre appareil.
Veuillez vous authentifier à nouveau.
@@ -1513,14 +1511,4 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n
J’ai compris
-
-
- Raccourcis
-
- Rechercher avec
-
-
- Pour cette fois, rechercher avec :
-
- Afficher les raccourcis de recherche
diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml
index 750344e21..8977f2b82 100644
--- a/app/src/main/res/values-gn/strings.xml
+++ b/app/src/main/res/values-gn/strings.xml
@@ -175,8 +175,8 @@
Moha’ãnga
-
- Hekaha mongu’eha
+
+ Hekaha mongu’eha
Hekaha ñemboheko
@@ -1484,9 +1484,7 @@
Oĩma tembiapo ñepyrũ puruhára réra peichagua
-
- Eike Firefox Account ndive.
-
+
Emoinge ambue mba’e’oka.
Ikatúpiko emoneĩjey.
@@ -1508,13 +1506,4 @@
Oĩma, aikumby
-
-
- Mbopya’eha
-
- Eheka amo
-
- Ko’ág̃a, eheka hendive:
-
- Ehechauka jeheka mbopya’eha
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 15970f7ce..b1b97162b 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -800,7 +800,7 @@
Ponovo se poveži za sinkronizaciju
- Neumreženo
+ Izvanmrežno
Poveži jedan drugi uređaj
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index d7ef5b200..f0eb7997c 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -173,8 +173,8 @@
Leggi
-
- Motore di ricerca
+
+ Motore di ricerca
Impostazioni motori di ricerca
@@ -1492,9 +1492,7 @@
Esistono già credenziali con questo nome utente
-
- Connetti un account Firefox.
-
+
Connetti un altro dispositivo.
Esegui nuovamente l’accesso.
@@ -1516,14 +1514,4 @@
OK, tutto chiaro
-
-
- Scelte rapide
-
- Cerca con
-
-
- Adesso cerca con:
-
- Mostra le scorciatoie di ricerca
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 7cf425cce..9c65f659f 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -30,6 +30,17 @@
%1$d geselecteerd
+
+ Nieuwe collectie toevoegen
+
+ Naam
+
+ Collectie selecteren
+
+ %1$s geselecteerd
+
+ Geselecteerd
+
%1$s is gemaakt door Mozilla.
@@ -156,8 +167,8 @@
Scannen
-
- Zoekmachine
+
+ Zoekmachine
Instellingen zoekmachine
@@ -520,6 +531,9 @@
%1$s (privémodus)
+
+ Opslaan
+
Geschiedenis verwijderen
@@ -1444,9 +1458,7 @@
Er bestaat al een aanmelding met die gebruikersnaam
-
- Verbinden met een Firefox-account.
-
+
Een ander apparaat verbinden.
Gelieve opnieuw te authenticeren.
@@ -1468,13 +1480,4 @@
OK, begrepen
-
-
- Snelkoppelingen
-
- Zoeken met
-
- Deze keer zoeken met:
-
- Zoeksnelkoppelingen tonen
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index e2a98b23a..12a58500e 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -173,8 +173,8 @@
Skanuj
-
- Wyszukiwarka
+
+ Wyszukiwarka
Ustawienia wyszukiwarki
@@ -1466,9 +1466,7 @@
Dane logowania z tą nazwą użytkownika już istnieją
-
- Połącz się z kontem Firefoksa.
-
+
Połącz inne urządzenie.
Proszę uwierzytelnić się ponownie.
@@ -1490,13 +1488,4 @@
OK
-
-
- Skróty
-
- Szukaj w
-
- Tym razem szukaj w:
-
- Skróty wyszukiwania
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index dcb7b0153..ef5a2e67b 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -171,8 +171,8 @@
Digitalizar
-
- Mecanismo de pesquisa
+
+ Mecanismo de pesquisa
Configurações de mecanismos de pesquisa
@@ -1461,9 +1461,7 @@
Já existe uma conta com este nome de usuário
-
- Conecte-se com uma Conta Firefox.
-
+
Conecte outro dispositivo.
Autentique novamente.
@@ -1485,13 +1483,4 @@
OK, entendi
-
-
- Atalhos
-
- Pesquisar com
-
- Desta vez, pesquisar com:
-
- Mostrar atalhos de pesquisa
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index d927a9e84..08ca67184 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -173,8 +173,8 @@
Skenovať
-
- Vyhľadávací modul
+
+ Vyhľadávací modul
Nastavenia vyhľadávacieho modulu
@@ -1466,9 +1466,7 @@
Prihlasovacie údaje s týmto používateľským menom už existujú
-
- Prepojiť s účtom Firefox.
-
+
Pripojiť ďalšie zariadenie.
Prosím, znova overte totožnosť.
@@ -1490,14 +1488,4 @@
Ok, rozumiem
-
-
- Skratky
-
- Hľadať pomocou
-
-
- Vyhľadať pomocou:
-
- Zobrazovať skratky vyhľadávania
diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml
index a155b1da3..40d2e0025 100644
--- a/app/src/main/res/values-su/strings.xml
+++ b/app/src/main/res/values-su/strings.xml
@@ -169,8 +169,8 @@
Pinday
-
- Mesin Pamaluruh
+
+ Mesin pamaluruh
Setélan mesin pamaluruh
@@ -1471,9 +1471,7 @@
Login maké éta sandiasma geus aya
-
- Sambungkeun maké Firefox Account.
-
+
Sambungkeun séjén paranti.
Mangga oténtikasi ulang.
@@ -1494,13 +1492,4 @@
Okéh, Ngarti
-
-
- Takulan
-
- Paluruh maké
-
- Saayeunaeun, paluruh maké:
-
- Témbongkeun takulan pamaluruhan
diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml
index 517dd67e5..4b05e418b 100644
--- a/app/src/main/res/values-te/strings.xml
+++ b/app/src/main/res/values-te/strings.xml
@@ -169,8 +169,8 @@
స్కాన్ చేయి
-
- శోధన యంత్రం
+
+ శోధన యంత్రం
శోధన యంత్ర అమరికలు
@@ -1479,9 +1479,7 @@
ఆ వాడుకరి పేరుతో ఒక ప్రవేశం ఇప్పటికే ఉంది
-
- Firefox ఖాతాతో అనుసంధానమవ్వండి.
-
+
మరొక పరికరాన్ని అనుసంధానించండి.
దయచేసి పునరధీకరణ చేయండి.
@@ -1502,13 +1500,4 @@
సరే, అర్థమయ్యింది
-
-
- సత్వరమార్గాలు
-
- దీనితో వెతుకు
-
- ఈసారి దీనితో వెతుకు:
-
- శోధన సత్వరమార్గాలను చూపించు
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 9dca54614..40f4c67d1 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -169,8 +169,8 @@
สแกน
-
- เครื่องมือค้นหา
+
+ เครื่องมือค้นหา
การตั้งค่าเครื่องมือค้นหา
@@ -1454,9 +1454,7 @@
การเข้าสู่ระบบที่มีชื่อผู้ใช้นี้มีอยู่แล้ว
-
- เชื่อมต่อกับบัญชี Firefox
-
+
เชื่อมต่ออุปกรณ์อื่น
@@ -1478,13 +1476,4 @@
ตกลง เข้าใจแล้ว
-
-
- ทางลัด
-
- ค้นหาด้วย
-
- คราวนี้ค้นหาด้วย:
-
- แสดงทางลัดการค้นหา
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 1b6ccda3a..3253c226f 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -171,8 +171,8 @@
Tara
-
- Arama motoru
+
+ Arama motoru
Arama motoru ayarları
@@ -1456,9 +1456,7 @@
Bu kullanıcı adına sahip bir hesap zaten var
-
- Firefox Hesabınıza giriş yapın.
-
+
Başka bir cihaz bağlayın.
Lütfen yeniden giriş yapın.
@@ -1479,13 +1477,4 @@
Tamam
-
-
- Kısayollar
-
- Bununla ara:
-
- Bir de bununla aramayı deneyin:
-
- Arama kısayollarını göster
diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml
index a1f99455b..cff6609cd 100644
--- a/app/src/main/res/values-uz/strings.xml
+++ b/app/src/main/res/values-uz/strings.xml
@@ -166,8 +166,8 @@
Tekshirish
-
- Qidiruv tizimi
+
+ Qidiruv tizimi
Qidiruv tizimi sozlamalari
@@ -378,6 +378,11 @@
Texnik va foydalanishga oid maʼlumotlar
+
+ Samaradorlik, foydalanish statistikasi va moslash maʼlumotlarini Mozillaga ulashish orqali siz %1$s brauzerini yaxshilashda yordam berasiz
+
+ Marketing maʼlumotlari
+
Maxfiy varaq qoʻshish
@@ -809,9 +814,7 @@
Shu nomdagi login oldindan bor
-
- Firefox hisobi bilan ulanish
-
+
Boshqa qurilmani ulash
Qaytadan haqiqiylikni tekshiring.
@@ -832,11 +835,4 @@
OK, tushundim
-
-
- Yorliqlar
-
- Izlash:
-
- Bu safar quyidagi bilan izlash:
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 4bc8f7662..02a89d376 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -171,8 +171,8 @@
Quét
-
- Công cụ tìm kiếm
+
+ Công cụ tìm kiếm
Cài đặt công cụ tìm kiếm
@@ -1450,9 +1450,7 @@
Một thông tin đăng nhập với tên người dùng đó đã tồn tại
-
- Kết nối với tài khoản Firefox.
-
+
Kết nối thiết bị khác.
Vui lòng xác thực lại.
@@ -1473,13 +1471,4 @@
OK, đã hiểu
-
-
- Tìm kiếm
-
- Tìm kiếm với
-
- Lần này, tìm kiếm với:
-
- Hiển thị các lối tắt tìm kiếm
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 3615f0b5a..5e01ed42b 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -178,8 +178,8 @@
扫码
-
- 搜索引擎
+
+ 搜索引擎
搜索引擎设置
@@ -1495,9 +1495,7 @@
已有同用户名的登录信息存在
-
- 绑定 Firefox 账户
-
+
绑定其他设备
请重新验证。
@@ -1518,14 +1516,4 @@
我知道了
-
-
- 快捷操作
-
- 可选用下列引擎搜索
-
-
- 更多搜索引擎:
-
- 显示搜索快捷操作
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e1d52cb6b..5802a9129 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -174,8 +174,8 @@
掃描
-
- 搜尋引擎
+
+ 搜尋引擎
搜尋引擎設定
@@ -1484,9 +1484,7 @@
已有該使用者名稱的登入資訊
-
- 連結 Firefox 帳號。
-
+
連結另一部裝置。
請重新登入。
@@ -1507,13 +1505,4 @@
好,知道了!
-
-
- 捷徑
-
- 使用下列引擎搜尋
-
- 這次使用下列搜尋引擎搜尋:
-
- 顯示搜尋捷徑
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index f71bd9753..d2421212f 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -614,4 +614,9 @@
- 90dp
- @null
+
+
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt
index d55eb3818..2d0f2deb4 100644
--- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt
@@ -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))
+ }
+ }
}
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt
index 5f0a409cc..d640a9c78 100644
--- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt
@@ -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()
+ }
+ }
}
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt
index f0e6f629c..321558e07 100644
--- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt
@@ -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())
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt
new file mode 100644
index 000000000..5e9209d88
--- /dev/null
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt
@@ -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 = 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)
+ }
+ }
+}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0ebb3108e..ac33e9944 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -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