diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 6ef25e4e2..c98f1b555 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -42,7 +42,7 @@ object FeatureFlags { /** * Enables the new search experience */ - val newSearchExperience = Config.channel.isDebug + val newSearchExperience = Config.channel.isNightlyOrDebug /** * Enables wait til first contentful paint diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index d6ecf2c16..8df2e3f56 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -272,7 +272,8 @@ class Core(private val context: Context) { private val passwordsEncryptionKey by lazy { getSecureAbove22Preferences().getString(PASSWORDS_KEY) ?: generateEncryptionKey(KEY_STRENGTH).also { - if (context.settings().passwordsEncryptionKeyGenerated) { + if (context.settings().passwordsEncryptionKeyGenerated && + isSentryEnabled()) { // We already had previously generated an encryption key, but we have lost it Sentry.capture("Passwords encryption key for passwords storage was lost and we generated a new one") } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 9f659f5ca..ad91e0330 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -383,8 +383,10 @@ class HomeFragment : Fragment() { } } + val args by navArgs() + if (view.context.settings().accessibilityServicesEnabled && - bundleArgs.getBoolean(FOCUS_ON_ADDRESS_BAR) + args.focusOnAddressBar ) { // We cannot put this in the fragment_home.xml file as it breaks tests view.toolbar_wrapper.isFocusableInTouchMode = true @@ -413,6 +415,10 @@ class HomeFragment : Fragment() { } updateTabCounter(requireComponents.core.store.state) + + if (args.focusOnAddressBar && requireContext().settings().useNewSearchExperience) { + navigateToSearch() + } } private fun removeAllTabsAndShowSnackbar(sessionCode: String) { 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 e9882c3dc..bae126a1e 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -173,6 +173,8 @@ class SearchFragment : Fragment(), UserInteractionHandler { ) ) + awesomeBarView.view.setOnEditSuggestionListener(toolbarView.view::setSearchTerms) + val urlView = toolbarView.view .findViewById(R.id.mozac_browser_toolbar_edit_url_view) urlView?.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO diff --git a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt index 09d4fa2c9..79f11acf1 100644 --- a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt @@ -126,7 +126,14 @@ class ToolbarView( /* Only set the search terms if pasted text is null so that the search term doesn't overwrite pastedText when view enters `editMode` */ if (searchState.pastedText.isNullOrEmpty()) { - view.setSearchTerms(searchState.searchTerms) + // If we're in edit mode, setting the search term will update the toolbar, + // so we make sure we have the correct term/query to show. + val termOrQuery = if (searchState.searchTerms.isNotEmpty()) { + searchState.searchTerms + } else { + searchState.query + } + view.setSearchTerms(termOrQuery) } // We must trigger an onTextChanged so when search terms are set when transitioning to `editMode` 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 dad829902..41ca59eac 100644 --- a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt @@ -4,11 +4,16 @@ package org.mozilla.fenix.searchdialog +import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatDialogFragment +import androidx.constraintlayout.widget.ConstraintProperties.BOTTOM +import androidx.constraintlayout.widget.ConstraintProperties.PARENT_ID +import androidx.constraintlayout.widget.ConstraintProperties.TOP +import androidx.constraintlayout.widget.ConstraintSet import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import kotlinx.android.synthetic.main.fragment_search.view.* @@ -16,9 +21,11 @@ import kotlinx.android.synthetic.main.fragment_search_dialog.* import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.browser.state.selector.findTab import mozilla.components.lib.state.ext.consumeFrom +import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.ktx.android.view.hideKeyboard import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings @@ -40,7 +47,7 @@ fun Settings.shouldShowSearchSuggestions(isPrivate: Boolean): Boolean { } } -class SearchDialogFragment : AppCompatDialogFragment() { +class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { private lateinit var interactor: SearchDialogInteractor private lateinit var store: SearchDialogFragmentStore @@ -52,6 +59,14 @@ class SearchDialogFragment : AppCompatDialogFragment() { setStyle(STYLE_NO_TITLE, R.style.SearchDialogStyle) } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return object : Dialog(requireContext(), this.theme) { + override fun onBackPressed() { + this@SearchDialogFragment.onBackPressed() + } + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -97,6 +112,27 @@ class SearchDialogFragment : AppCompatDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + if (view.context.settings().toolbarPosition == ToolbarPosition.BOTTOM) { + ConstraintSet().apply { + clone(search_wrapper) + + clear(toolbar.id, TOP) + connect(toolbar.id, BOTTOM, PARENT_ID, BOTTOM) + + clear(awesomeBar.id, TOP) + clear(awesomeBar.id, BOTTOM) + connect(awesomeBar.id, TOP, PARENT_ID, TOP) + connect(awesomeBar.id, BOTTOM, toolbar.id, TOP) + + applyTo(search_wrapper) + } + } + + search_wrapper.setOnClickListener { + it.hideKeyboard() + dismissAllowingStateLoss() + } + consumeFrom(store) { awesomeBar?.visibility = if (it.query.isEmpty()) View.INVISIBLE else View.VISIBLE toolbarView.update(it) @@ -104,6 +140,13 @@ class SearchDialogFragment : AppCompatDialogFragment() { } } + override fun onBackPressed(): Boolean { + view?.hideKeyboard() + dismissAllowingStateLoss() + + return true + } + private fun setUpState(): SearchFragmentState { val activity = activity as HomeActivity val settings = activity.settings() diff --git a/app/src/main/res/layout/fragment_search_dialog.xml b/app/src/main/res/layout/fragment_search_dialog.xml index faac704e3..4a2abe039 100644 --- a/app/src/main/res/layout/fragment_search_dialog.xml +++ b/app/src/main/res/layout/fragment_search_dialog.xml @@ -2,10 +2,13 @@ - - - - + mozac:awesomeBarChipBackgroundColor="@color/photonGreen50" + mozac:awesomeBarDescriptionTextColor="?secondaryText" + mozac:awesomeBarTitleTextColor="?primaryText" /> diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index d206aa972..6eb679fae 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -171,8 +171,8 @@ Skannaa - - Hakukone + + Hakukone Hakukoneasetukset @@ -1471,9 +1471,7 @@ Kirjautumistieto tällä käyttäjänimellä on jo olemassa - - Yhdistä Firefox-tilillä. - + Yhdistä toinen laite. Tunnistaudu uudelleen. @@ -1494,13 +1492,4 @@ Selvä - - - Oikopolut - - Hae hakukoneella - - Tällä kertaa käytä hakuun: - - Näytä hakuoikopolut diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index f6124eb83..6250bd788 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1264,7 +1264,7 @@ 붙여넣기 - 클립보드에 URL 복사됨 + URL이 클립보드에 복사됨 홈 화면에 추가 diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 98ecc9984..072e330ab 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -113,7 +113,7 @@ Bibliotecă - Versiune site pentru calculator + Versiune site de desktop Adaugă în ecranul de start @@ -167,8 +167,8 @@ Scanează - - Motor de căutare + + Motor de căutare Setări pentru motorul de căutare @@ -1451,9 +1451,7 @@ Există un set de date de autentificare cu acest nume de utilizator - - Conectare cu un cont Firefox. - + Conectează alt dispozitiv. Te rugăm să te autentifici din nou. @@ -1474,13 +1472,4 @@ Ok, am înțeles - - - Comenzi rapide - - Căutare cu - - De data aceasta, caută cu: - - Afișează comenzile rapide pentru căutări diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 3253c226f..d70877b7f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -65,7 +65,7 @@ - Ana ekranınızdan gizli sekme açmak için bir kısayol ekleyin. + Ana ekranınızdan gizli sekme açmak için kısayol ekleyebilirsiniz. Kısayol ekle diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index cff6609cd..ddc06b1a9 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -746,6 +746,13 @@ Varaqlar yopildi + + Bekor qilish + + Toʻliq ekran rejimiga oʻtmoqda + + Manzildan nusxa olindi + Koʻchirish tugadi diff --git a/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt b/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt index 3f8c9c449..42aa2c781 100644 --- a/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt @@ -106,15 +106,26 @@ class ToolbarViewTest { view.update(defaultState) view.update(defaultState) - verify(exactly = 1) { toolbar.url = any() } verify(exactly = 1) { toolbar.setSearchTerms(any()) } - verify(exactly = 1) { interactor.onTextChanged(any()) } - // editMode gets called when the view is initialized. So it is called twice in this test - verify(exactly = 2) { toolbar.editMode() } assertTrue(view.isInitialized) } + @Test + fun `search term updates the url`() { + val view = buildToolbarView(false) + + view.update(defaultState) + view.update(defaultState) + view.update(defaultState) + + // editMode gets called when the view is initialized. + verify(exactly = 2) { toolbar.editMode() } + // search term changes update the url and invoke the interactor. + verify(exactly = 2) { toolbar.url = any() } + verify(exactly = 2) { interactor.onTextChanged(any()) } + } + @Test fun `URL gets set to the states query`() { val toolbarView = buildToolbarView(false) diff --git a/build.gradle b/build.gradle index 9f00fff0f..a236dc191 100644 --- a/build.gradle +++ b/build.gradle @@ -190,13 +190,13 @@ tasks.register("listRepositories") { } tasks.register("githubTestDetails", GithubDetailsTask) { - text = "### [Unit Test Results](/reports/test/testGeckoNightlyDebugUnitTest/index.html)" + text = "### [Unit Test Results]({reportsUrl}/test/testDebugUnitTest/index.html)" } tasks.register("githubLintDetektDetails", GithubDetailsTask) { - text = "### [Detekt Results](/reports/detekt.html)" + text = "### [Detekt Results]({reportsUrl}/detekt.html)" } tasks.register("githubLintAndroidDetails", GithubDetailsTask) { - text = "### [Android Lint Results](/reports/lint-results-geckoNightlyDebug.html)" + text = "### [Android Lint Results]({reportsUrl}/lint-results-geckoNightlyDebug.html)" } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2c41963a7..110302299 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "53.0.20200804130112" + const val VERSION = "54.0.20200807130552" } diff --git a/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt b/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt index 33ca353f6..16dccbcce 100644 --- a/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt +++ b/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt @@ -26,20 +26,11 @@ open class GithubDetailsTask : DefaultTask() { private val detailsFile = File("/builds/worker/github/customCheckRunText.md") private val suffix = "\n\n_(404 if compilation failed)_" - /** - * Captures the link name and URL in a markdown link. - * i.e. "### [Hello](/world.html)" -> "/world.html" - */ - private val markdownLinkRegex = """\[(.*)]\((.*)\)""".toRegex() - @TaskAction fun writeFile() { val taskId = System.getenv("TASK_ID") - val url = "https://firefoxci.taskcluster-artifacts.net/$taskId/0/public" - val replaced = text.replace(markdownLinkRegex) { match -> - val (_, linkName, linkUrl) = match.groupValues - "[$linkName](${url + linkUrl})" - } + val reportsUrl = "https://firefoxci.taskcluster-artifacts.net/$taskId/0/public/reports" + val replaced = text.replace("{reportsUrl}", reportsUrl) project.mkdir("/builds/worker/github") detailsFile.writeText(replaced + suffix)