Progress on new search experience with Toolbar and Awesomebar placeholders (#13314)
* For #13272 - Adds the ToolbarView to the SearchDialogFragment * For #13273 - Replaces container dependency with context in AwesomebarView * For #13276 - Hacks together the awesomebar and toolbar in the new search experiencemaster
parent
f319b457bf
commit
6492773fc7
|
@ -141,7 +141,7 @@ class SearchFragment : Fragment(), UserInteractionHandler {
|
||||||
searchController
|
searchController
|
||||||
)
|
)
|
||||||
|
|
||||||
awesomeBarView = AwesomeBarView(view.scrollable_area, searchInteractor,
|
awesomeBarView = AwesomeBarView(requireContext(), searchInteractor,
|
||||||
view.findViewById(R.id.awesomeBar))
|
view.findViewById(R.id.awesomeBar))
|
||||||
setShortcutsChangedListener(CustomSearchEngineStore.PREF_FILE_SEARCH_ENGINES)
|
setShortcutsChangedListener(CustomSearchEngineStore.PREF_FILE_SEARCH_ENGINES)
|
||||||
setShortcutsChangedListener(FenixSearchEngineProvider.PREF_FILE_SEARCH_ENGINES)
|
setShortcutsChangedListener(FenixSearchEngineProvider.PREF_FILE_SEARCH_ENGINES)
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
package org.mozilla.fenix.search.awesomebar
|
package org.mozilla.fenix.search.awesomebar
|
||||||
|
|
||||||
import android.view.ViewGroup
|
import android.content.Context
|
||||||
import androidx.appcompat.content.res.AppCompatResources.getDrawable
|
import androidx.appcompat.content.res.AppCompatResources.getDrawable
|
||||||
import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat
|
import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat
|
||||||
import androidx.core.graphics.BlendModeCompat.SRC_IN
|
import androidx.core.graphics.BlendModeCompat.SRC_IN
|
||||||
|
@ -34,11 +34,10 @@ import org.mozilla.fenix.search.SearchFragmentState
|
||||||
* View that contains and configures the BrowserAwesomeBar
|
* View that contains and configures the BrowserAwesomeBar
|
||||||
*/
|
*/
|
||||||
class AwesomeBarView(
|
class AwesomeBarView(
|
||||||
private val container: ViewGroup,
|
private val context: Context,
|
||||||
val interactor: AwesomeBarInteractor,
|
val interactor: AwesomeBarInteractor,
|
||||||
val view: BrowserAwesomeBar
|
val view: BrowserAwesomeBar
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val sessionProvider: SessionSuggestionProvider
|
private val sessionProvider: SessionSuggestionProvider
|
||||||
private val historyStorageProvider: HistoryStorageSuggestionProvider
|
private val historyStorageProvider: HistoryStorageSuggestionProvider
|
||||||
private val shortcutsEnginePickerProvider: ShortcutsSuggestionProvider
|
private val shortcutsEnginePickerProvider: ShortcutsSuggestionProvider
|
||||||
|
@ -91,7 +90,6 @@ class AwesomeBarView(
|
||||||
init {
|
init {
|
||||||
view.itemAnimator = null
|
view.itemAnimator = null
|
||||||
|
|
||||||
val context = container.context
|
|
||||||
val components = context.components
|
val components = context.components
|
||||||
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)
|
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)
|
||||||
|
|
||||||
|
@ -255,7 +253,7 @@ class AwesomeBarView(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isBrowsingModePrivate(): Boolean {
|
private fun isBrowsingModePrivate(): Boolean {
|
||||||
return (container.context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate
|
return (context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate
|
||||||
?: false
|
?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,7 +278,6 @@ class AwesomeBarView(
|
||||||
|
|
||||||
private fun getSuggestionProviderForEngine(engine: SearchEngine): List<AwesomeBar.SuggestionProvider> {
|
private fun getSuggestionProviderForEngine(engine: SearchEngine): List<AwesomeBar.SuggestionProvider> {
|
||||||
return searchSuggestionProviderMap.getOrPut(engine) {
|
return searchSuggestionProviderMap.getOrPut(engine) {
|
||||||
val context = container.context
|
|
||||||
val components = context.components
|
val components = context.components
|
||||||
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)
|
val primaryTextColor = context.getColorFromAttr(R.attr.primaryText)
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,116 @@ import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.appcompat.app.AppCompatDialogFragment
|
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.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() {
|
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(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,14 +5,49 @@
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<TextView
|
<mozilla.components.browser.toolbar.BrowserToolbar
|
||||||
android:layout_width="wrap_content"
|
android:id="@+id/toolbar"
|
||||||
android:layout_height="wrap_content"
|
android:layout_width="0dp"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
android:layout_height="@dimen/browser_toolbar_height"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
android:background="@drawable/toolbar_background_top"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
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"
|
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>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
|
@ -614,4 +614,9 @@
|
||||||
<item name="elevation">90dp</item>
|
<item name="elevation">90dp</item>
|
||||||
<item name="android:stateListAnimator">@null</item>
|
<item name="android:stateListAnimator">@null</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="SearchDialogStyle" parent="DialogStyleBase">
|
||||||
|
<item name="android:windowIsFloating">false</item>
|
||||||
|
<item name="android:windowAnimationStyle">@null</item>
|
||||||
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in New Issue