Create ToolbarPosition enum (#12747)
parent
c143f95819
commit
8f5a37733d
|
@ -93,6 +93,7 @@ import org.mozilla.fenix.components.toolbar.BrowserToolbarViewInteractor
|
||||||
import org.mozilla.fenix.components.toolbar.DefaultBrowserToolbarController
|
import org.mozilla.fenix.components.toolbar.DefaultBrowserToolbarController
|
||||||
import org.mozilla.fenix.components.toolbar.SwipeRefreshScrollingViewBehavior
|
import org.mozilla.fenix.components.toolbar.SwipeRefreshScrollingViewBehavior
|
||||||
import org.mozilla.fenix.components.toolbar.ToolbarIntegration
|
import org.mozilla.fenix.components.toolbar.ToolbarIntegration
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.downloads.DownloadService
|
import org.mozilla.fenix.downloads.DownloadService
|
||||||
import org.mozilla.fenix.downloads.DynamicDownloadDialog
|
import org.mozilla.fenix.downloads.DynamicDownloadDialog
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
|
@ -264,7 +265,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
|
||||||
|
|
||||||
_browserToolbarView = BrowserToolbarView(
|
_browserToolbarView = BrowserToolbarView(
|
||||||
container = view.browserLayout,
|
container = view.browserLayout,
|
||||||
shouldUseBottomToolbar = context.settings().shouldUseBottomToolbar,
|
toolbarPosition = context.settings().toolbarPosition,
|
||||||
interactor = browserInteractor,
|
interactor = browserInteractor,
|
||||||
customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) },
|
customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) },
|
||||||
lifecycleOwner = viewLifecycleOwner
|
lifecycleOwner = viewLifecycleOwner
|
||||||
|
@ -677,10 +678,10 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
|
||||||
private fun initializeEngineView(toolbarHeight: Int) {
|
private fun initializeEngineView(toolbarHeight: Int) {
|
||||||
engineView.setDynamicToolbarMaxHeight(toolbarHeight)
|
engineView.setDynamicToolbarMaxHeight(toolbarHeight)
|
||||||
|
|
||||||
val behavior = if (requireContext().settings().shouldUseBottomToolbar) {
|
val context = requireContext()
|
||||||
EngineViewBottomBehavior(context, null)
|
val behavior = when (context.settings().toolbarPosition) {
|
||||||
} else {
|
ToolbarPosition.BOTTOM -> EngineViewBottomBehavior(context, null)
|
||||||
SwipeRefreshScrollingViewBehavior(requireContext(), null, engineView, browserToolbarView)
|
ToolbarPosition.TOP -> SwipeRefreshScrollingViewBehavior(context, null, engineView, browserToolbarView)
|
||||||
}
|
}
|
||||||
|
|
||||||
(swipeRefresh.layoutParams as CoordinatorLayout.LayoutParams).behavior = behavior
|
(swipeRefresh.layoutParams as CoordinatorLayout.LayoutParams).behavior = behavior
|
||||||
|
@ -843,7 +844,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
|
||||||
* Returns the layout [android.view.Gravity] for the quick settings and ETP dialog.
|
* Returns the layout [android.view.Gravity] for the quick settings and ETP dialog.
|
||||||
*/
|
*/
|
||||||
protected fun getAppropriateLayoutGravity(): Int =
|
protected fun getAppropriateLayoutGravity(): Int =
|
||||||
if (context?.settings()?.shouldUseBottomToolbar == true) Gravity.BOTTOM else Gravity.TOP
|
context?.settings()?.toolbarPosition?.androidGravity ?: Gravity.BOTTOM
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the site permissions rules based on user settings.
|
* Updates the site permissions rules based on user settings.
|
||||||
|
|
|
@ -21,6 +21,7 @@ import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.components.concept.engine.EngineView
|
import mozilla.components.concept.engine.EngineView
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.settings
|
import org.mozilla.fenix.ext.settings
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
|
@ -155,12 +156,15 @@ class BrowserAnimator(
|
||||||
fun getToolbarNavOptions(context: Context): NavOptions {
|
fun getToolbarNavOptions(context: Context): NavOptions {
|
||||||
val navOptions = NavOptions.Builder()
|
val navOptions = NavOptions.Builder()
|
||||||
|
|
||||||
if (!context.settings().shouldUseBottomToolbar) {
|
when (context.settings().toolbarPosition) {
|
||||||
navOptions.setEnterAnim(R.anim.fade_in)
|
ToolbarPosition.TOP -> {
|
||||||
navOptions.setExitAnim(R.anim.fade_out)
|
navOptions.setEnterAnim(R.anim.fade_in)
|
||||||
} else {
|
navOptions.setExitAnim(R.anim.fade_out)
|
||||||
navOptions.setEnterAnim(R.anim.fade_in_up)
|
}
|
||||||
navOptions.setExitAnim(R.anim.fade_out_down)
|
ToolbarPosition.BOTTOM -> {
|
||||||
|
navOptions.setEnterAnim(R.anim.fade_in_up)
|
||||||
|
navOptions.setExitAnim(R.anim.fade_out_down)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return navOptions.build()
|
return navOptions.build()
|
||||||
|
|
|
@ -11,7 +11,6 @@ import android.graphics.drawable.ColorDrawable
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.core.view.isGone
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.marginTop
|
import androidx.core.view.marginTop
|
||||||
import kotlinx.android.synthetic.main.search_widget_cfr.view.*
|
import kotlinx.android.synthetic.main.search_widget_cfr.view.*
|
||||||
|
@ -21,6 +20,7 @@ import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.SearchWidgetCreator
|
import org.mozilla.fenix.components.SearchWidgetCreator
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
import org.mozilla.fenix.components.metrics.MetricController
|
import org.mozilla.fenix.components.metrics.MetricController
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.utils.Settings
|
import org.mozilla.fenix.utils.Settings
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -50,18 +50,14 @@ class SearchWidgetCFR(
|
||||||
val searchWidgetCFRDialog = Dialog(context)
|
val searchWidgetCFRDialog = Dialog(context)
|
||||||
val layout = LayoutInflater.from(context)
|
val layout = LayoutInflater.from(context)
|
||||||
.inflate(R.layout.search_widget_cfr, null)
|
.inflate(R.layout.search_widget_cfr, null)
|
||||||
val isBottomToolbar = settings.shouldUseBottomToolbar
|
val toolbarPosition = settings.toolbarPosition
|
||||||
|
|
||||||
layout.drop_down_triangle.isGone = isBottomToolbar
|
layout.drop_down_triangle.isVisible = toolbarPosition == ToolbarPosition.TOP
|
||||||
layout.pop_up_triangle.isVisible = isBottomToolbar
|
layout.pop_up_triangle.isVisible = toolbarPosition == ToolbarPosition.BOTTOM
|
||||||
|
|
||||||
val toolbar = getToolbar()
|
val toolbar = getToolbar()
|
||||||
|
|
||||||
val gravity = if (isBottomToolbar) {
|
val gravity = Gravity.CENTER_HORIZONTAL or toolbarPosition.androidGravity
|
||||||
Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
|
|
||||||
} else {
|
|
||||||
Gravity.CENTER_HORIZONTAL or Gravity.TOP
|
|
||||||
}
|
|
||||||
|
|
||||||
layout.cfr_neg_button.setOnClickListener {
|
layout.cfr_neg_button.setOnClickListener {
|
||||||
metrics.track(Event.SearchWidgetCFRNotNowPressed)
|
metrics.track(Event.SearchWidgetCFRNotNowPressed)
|
||||||
|
|
|
@ -50,6 +50,7 @@ import org.mozilla.fenix.GleanMetrics.TopSites
|
||||||
import org.mozilla.fenix.GleanMetrics.TrackingProtection
|
import org.mozilla.fenix.GleanMetrics.TrackingProtection
|
||||||
import org.mozilla.fenix.GleanMetrics.UserSpecifiedSearchEngines
|
import org.mozilla.fenix.GleanMetrics.UserSpecifiedSearchEngines
|
||||||
import org.mozilla.fenix.GleanMetrics.VoiceSearch
|
import org.mozilla.fenix.GleanMetrics.VoiceSearch
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.ext.settings
|
import org.mozilla.fenix.ext.settings
|
||||||
import org.mozilla.fenix.utils.BrowsersCache
|
import org.mozilla.fenix.utils.BrowsersCache
|
||||||
|
@ -724,10 +725,9 @@ class GleanMetricsService(private val context: Context) : MetricsService {
|
||||||
}
|
}
|
||||||
|
|
||||||
toolbarPosition.set(
|
toolbarPosition.set(
|
||||||
if (context.settings().shouldUseBottomToolbar) {
|
when (context.settings().toolbarPosition) {
|
||||||
Event.ToolbarPositionChanged.Position.BOTTOM.name
|
ToolbarPosition.BOTTOM -> Event.ToolbarPositionChanged.Position.BOTTOM.name
|
||||||
} else {
|
ToolbarPosition.TOP -> Event.ToolbarPositionChanged.Position.TOP.name
|
||||||
Event.ToolbarPositionChanged.Position.TOP.name
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import androidx.annotation.VisibleForTesting
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.core.view.updateLayoutParams
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import com.google.android.material.appbar.AppBarLayout
|
import com.google.android.material.appbar.AppBarLayout
|
||||||
import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
|
import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
|
||||||
|
@ -59,7 +60,7 @@ interface BrowserToolbarViewInteractor {
|
||||||
@SuppressWarnings("LargeClass")
|
@SuppressWarnings("LargeClass")
|
||||||
class BrowserToolbarView(
|
class BrowserToolbarView(
|
||||||
private val container: ViewGroup,
|
private val container: ViewGroup,
|
||||||
private val shouldUseBottomToolbar: Boolean,
|
private val toolbarPosition: ToolbarPosition,
|
||||||
private val interactor: BrowserToolbarViewInteractor,
|
private val interactor: BrowserToolbarViewInteractor,
|
||||||
private val customTabSession: Session?,
|
private val customTabSession: Session?,
|
||||||
private val lifecycleOwner: LifecycleOwner
|
private val lifecycleOwner: LifecycleOwner
|
||||||
|
@ -71,9 +72,9 @@ class BrowserToolbarView(
|
||||||
private val settings = container.context.settings()
|
private val settings = container.context.settings()
|
||||||
|
|
||||||
@LayoutRes
|
@LayoutRes
|
||||||
private val toolbarLayout = when {
|
private val toolbarLayout = when (settings.toolbarPosition) {
|
||||||
settings.shouldUseBottomToolbar -> R.layout.component_bottom_browser_toolbar
|
ToolbarPosition.BOTTOM -> R.layout.component_bottom_browser_toolbar
|
||||||
else -> R.layout.component_browser_top_toolbar
|
ToolbarPosition.TOP -> R.layout.component_browser_top_toolbar
|
||||||
}
|
}
|
||||||
|
|
||||||
private val layout = LayoutInflater.from(container.context)
|
private val layout = LayoutInflater.from(container.context)
|
||||||
|
@ -144,7 +145,7 @@ class BrowserToolbarView(
|
||||||
with(container.context) {
|
with(container.context) {
|
||||||
val sessionManager = components.core.sessionManager
|
val sessionManager = components.core.sessionManager
|
||||||
|
|
||||||
if (!shouldUseBottomToolbar) {
|
if (toolbarPosition == ToolbarPosition.TOP) {
|
||||||
val offsetChangedListener =
|
val offsetChangedListener =
|
||||||
AppBarLayout.OnOffsetChangedListener { _: AppBarLayout?, verticalOffset: Int ->
|
AppBarLayout.OnOffsetChangedListener { _: AppBarLayout?, verticalOffset: Int ->
|
||||||
interactor.onScrolled(verticalOffset)
|
interactor.onScrolled(verticalOffset)
|
||||||
|
@ -167,10 +168,9 @@ class BrowserToolbarView(
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
display.progressGravity = if (shouldUseBottomToolbar) {
|
display.progressGravity = when (toolbarPosition) {
|
||||||
DisplayToolbar.Gravity.TOP
|
ToolbarPosition.BOTTOM -> DisplayToolbar.Gravity.TOP
|
||||||
} else {
|
ToolbarPosition.TOP -> DisplayToolbar.Gravity.BOTTOM
|
||||||
DisplayToolbar.Gravity.BOTTOM
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val primaryTextColor = ContextCompat.getColor(
|
val primaryTextColor = ContextCompat.getColor(
|
||||||
|
@ -207,7 +207,7 @@ class BrowserToolbarView(
|
||||||
this,
|
this,
|
||||||
sessionManager,
|
sessionManager,
|
||||||
customTabSession?.id,
|
customTabSession?.id,
|
||||||
shouldReverseItems = !shouldUseBottomToolbar,
|
shouldReverseItems = toolbarPosition == ToolbarPosition.TOP,
|
||||||
onItemTapped = {
|
onItemTapped = {
|
||||||
interactor.onBrowserToolbarMenuItemTapped(it)
|
interactor.onBrowserToolbarMenuItemTapped(it)
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ class BrowserToolbarView(
|
||||||
menuToolbar = DefaultToolbarMenu(
|
menuToolbar = DefaultToolbarMenu(
|
||||||
context = this,
|
context = this,
|
||||||
hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(),
|
hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(),
|
||||||
shouldReverseItems = !shouldUseBottomToolbar,
|
shouldReverseItems = toolbarPosition == ToolbarPosition.TOP,
|
||||||
onItemTapped = { interactor.onBrowserToolbarMenuItemTapped(it) },
|
onItemTapped = { interactor.onBrowserToolbarMenuItemTapped(it) },
|
||||||
lifecycleOwner = lifecycleOwner,
|
lifecycleOwner = lifecycleOwner,
|
||||||
sessionManager = sessionManager,
|
sessionManager = sessionManager,
|
||||||
|
@ -254,12 +254,15 @@ class BrowserToolbarView(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun expand() {
|
fun expand() {
|
||||||
if (settings.shouldUseBottomToolbar) {
|
when (settings.toolbarPosition) {
|
||||||
(view.layoutParams as CoordinatorLayout.LayoutParams).apply {
|
ToolbarPosition.BOTTOM -> {
|
||||||
(behavior as BrowserToolbarBottomBehavior).forceExpand(view)
|
(view.layoutParams as CoordinatorLayout.LayoutParams).apply {
|
||||||
|
(behavior as BrowserToolbarBottomBehavior).forceExpand(view)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ToolbarPosition.TOP -> {
|
||||||
|
layout.app_bar?.setExpanded(true)
|
||||||
}
|
}
|
||||||
} else if (!settings.shouldUseBottomToolbar) {
|
|
||||||
layout.app_bar?.setExpanded(true)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,30 +271,27 @@ class BrowserToolbarView(
|
||||||
* Note that the bottom toolbar has a feature flag for being dynamic, so it may not get flags set.
|
* Note that the bottom toolbar has a feature flag for being dynamic, so it may not get flags set.
|
||||||
*/
|
*/
|
||||||
fun setScrollFlags(shouldDisableScroll: Boolean = false) {
|
fun setScrollFlags(shouldDisableScroll: Boolean = false) {
|
||||||
if (view.context.settings().shouldUseBottomToolbar) {
|
when (settings.toolbarPosition) {
|
||||||
if (view.layoutParams is CoordinatorLayout.LayoutParams) {
|
ToolbarPosition.BOTTOM -> {
|
||||||
(view.layoutParams as CoordinatorLayout.LayoutParams).apply {
|
(view.layoutParams as? CoordinatorLayout.LayoutParams)?.apply {
|
||||||
behavior = BrowserToolbarBottomBehavior(view.context, null)
|
behavior = BrowserToolbarBottomBehavior(view.context, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ToolbarPosition.TOP -> {
|
||||||
return
|
view.updateLayoutParams<AppBarLayout.LayoutParams> {
|
||||||
}
|
scrollFlags = if (settings.shouldUseFixedTopToolbar || shouldDisableScroll) {
|
||||||
|
// Force expand the toolbar so the user is not stuck with a hidden toolbar
|
||||||
val params = view.layoutParams as AppBarLayout.LayoutParams
|
expand()
|
||||||
|
0
|
||||||
params.scrollFlags = when (view.context.settings().shouldUseFixedTopToolbar || shouldDisableScroll) {
|
} else {
|
||||||
true -> {
|
SCROLL_FLAG_SCROLL or
|
||||||
// Force expand the toolbar so the user is not stuck with a hidden toolbar
|
SCROLL_FLAG_ENTER_ALWAYS or
|
||||||
expand()
|
SCROLL_FLAG_SNAP or
|
||||||
0
|
SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
|
||||||
}
|
}
|
||||||
false -> {
|
}
|
||||||
SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS or SCROLL_FLAG_SNAP or SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
view.layoutParams = params
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -113,10 +113,9 @@ class TabCounterToolbarButton(
|
||||||
)
|
)
|
||||||
|
|
||||||
return BrowserMenuBuilder(
|
return BrowserMenuBuilder(
|
||||||
if (context.settings().shouldUseBottomToolbar) {
|
when (context.settings().toolbarPosition) {
|
||||||
menuItems.reversed()
|
ToolbarPosition.BOTTOM -> menuItems.reversed()
|
||||||
} else {
|
ToolbarPosition.TOP -> menuItems
|
||||||
menuItems
|
|
||||||
}
|
}
|
||||||
).build(context)
|
).build(context)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
/* 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.components.toolbar
|
||||||
|
|
||||||
|
import android.view.Gravity
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fenix lets the browser toolbar be placed at either the top or the bottom of the screen.
|
||||||
|
* This enum represents the posible positions.
|
||||||
|
*
|
||||||
|
* @property androidGravity [Gravity] value corresponding to the position.
|
||||||
|
* Used to position related elements such as a CFR tooltip.
|
||||||
|
*/
|
||||||
|
enum class ToolbarPosition(val androidGravity: Int) {
|
||||||
|
BOTTOM(Gravity.BOTTOM),
|
||||||
|
TOP(Gravity.TOP)
|
||||||
|
}
|
|
@ -83,6 +83,7 @@ import org.mozilla.fenix.components.TabCollectionStorage
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
import org.mozilla.fenix.components.tips.FenixTipManager
|
import org.mozilla.fenix.components.tips.FenixTipManager
|
||||||
import org.mozilla.fenix.components.tips.providers.MigrationTipProvider
|
import org.mozilla.fenix.components.tips.providers.MigrationTipProvider
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.ext.hideToolbar
|
import org.mozilla.fenix.ext.hideToolbar
|
||||||
import org.mozilla.fenix.ext.metrics
|
import org.mozilla.fenix.ext.metrics
|
||||||
|
@ -120,12 +121,9 @@ class HomeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private val snackbarAnchorView: View?
|
private val snackbarAnchorView: View?
|
||||||
get() {
|
get() = when (requireContext().settings().toolbarPosition) {
|
||||||
return if (requireContext().settings().shouldUseBottomToolbar) {
|
ToolbarPosition.BOTTOM -> toolbarLayout
|
||||||
toolbarLayout
|
ToolbarPosition.TOP -> null
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val browsingModeManager get() = (activity as HomeActivity).browsingModeManager
|
private val browsingModeManager get() = (activity as HomeActivity).browsingModeManager
|
||||||
|
@ -253,45 +251,45 @@ class HomeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateLayout(view: View) {
|
private fun updateLayout(view: View) {
|
||||||
val shouldUseBottomToolbar = view.context.settings().shouldUseBottomToolbar
|
when (view.context.settings().toolbarPosition) {
|
||||||
|
ToolbarPosition.TOP -> {
|
||||||
if (!shouldUseBottomToolbar) {
|
view.toolbarLayout.layoutParams = CoordinatorLayout.LayoutParams(
|
||||||
view.toolbarLayout.layoutParams = CoordinatorLayout.LayoutParams(
|
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
ConstraintLayout.LayoutParams.WRAP_CONTENT
|
||||||
ConstraintLayout.LayoutParams.WRAP_CONTENT
|
).apply {
|
||||||
)
|
|
||||||
.apply {
|
|
||||||
gravity = Gravity.TOP
|
gravity = Gravity.TOP
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstraintSet().apply {
|
ConstraintSet().apply {
|
||||||
clone(view.toolbarLayout)
|
clone(view.toolbarLayout)
|
||||||
clear(view.bottom_bar.id, BOTTOM)
|
clear(view.bottom_bar.id, BOTTOM)
|
||||||
clear(view.bottomBarShadow.id, BOTTOM)
|
clear(view.bottomBarShadow.id, BOTTOM)
|
||||||
connect(view.bottom_bar.id, TOP, PARENT_ID, TOP)
|
connect(view.bottom_bar.id, TOP, PARENT_ID, TOP)
|
||||||
connect(view.bottomBarShadow.id, TOP, view.bottom_bar.id, BOTTOM)
|
connect(view.bottomBarShadow.id, TOP, view.bottom_bar.id, BOTTOM)
|
||||||
connect(view.bottomBarShadow.id, BOTTOM, PARENT_ID, BOTTOM)
|
connect(view.bottomBarShadow.id, BOTTOM, PARENT_ID, BOTTOM)
|
||||||
applyTo(view.toolbarLayout)
|
applyTo(view.toolbarLayout)
|
||||||
|
}
|
||||||
|
|
||||||
|
view.bottom_bar.background = resources.getDrawable(
|
||||||
|
ThemeManager.resolveAttribute(R.attr.bottomBarBackgroundTop, requireContext()),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
view.homeAppBar.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||||
|
topMargin = HEADER_MARGIN.dpToPx(resources.displayMetrics)
|
||||||
|
}
|
||||||
|
|
||||||
|
createNewAppBarListener(HEADER_MARGIN.dpToPx(resources.displayMetrics).toFloat())
|
||||||
|
view.homeAppBar.addOnOffsetChangedListener(
|
||||||
|
homeAppBarOffSetListener
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
ToolbarPosition.BOTTOM -> {
|
||||||
view.bottom_bar.background = resources.getDrawable(
|
createNewAppBarListener(0F)
|
||||||
ThemeManager.resolveAttribute(R.attr.bottomBarBackgroundTop, requireContext()),
|
view.homeAppBar.addOnOffsetChangedListener(
|
||||||
null
|
homeAppBarOffSetListener
|
||||||
)
|
)
|
||||||
|
|
||||||
view.homeAppBar.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
|
||||||
topMargin = HEADER_MARGIN.dpToPx(resources.displayMetrics)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
createNewAppBarListener(HEADER_MARGIN.dpToPx(resources.displayMetrics).toFloat())
|
|
||||||
view.homeAppBar.addOnOffsetChangedListener(
|
|
||||||
homeAppBarOffSetListener
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
createNewAppBarListener(0F)
|
|
||||||
view.homeAppBar.addOnOffsetChangedListener(
|
|
||||||
homeAppBarOffSetListener
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ import kotlinx.android.synthetic.main.onboarding_toolbar_position_picker.view.*
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
import org.mozilla.fenix.components.metrics.Event.OnboardingToolbarPosition.Position
|
import org.mozilla.fenix.components.metrics.Event.OnboardingToolbarPosition.Position
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.asActivity
|
import org.mozilla.fenix.ext.asActivity
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.onboarding.OnboardingRadioButton
|
import org.mozilla.fenix.onboarding.OnboardingRadioButton
|
||||||
|
@ -29,10 +30,9 @@ class OnboardingToolbarPositionPickerViewHolder(view: View) : RecyclerView.ViewH
|
||||||
radioBottomToolbar.addIllustration(view.toolbar_bottom_image)
|
radioBottomToolbar.addIllustration(view.toolbar_bottom_image)
|
||||||
|
|
||||||
val settings = view.context.components.settings
|
val settings = view.context.components.settings
|
||||||
radio = if (settings.shouldUseBottomToolbar) {
|
radio = when (settings.toolbarPosition) {
|
||||||
radioBottomToolbar
|
ToolbarPosition.BOTTOM -> radioBottomToolbar
|
||||||
} else {
|
ToolbarPosition.TOP -> radioTopToolbar
|
||||||
radioTopToolbar
|
|
||||||
}
|
}
|
||||||
radio.updateRadioValue(true)
|
radio.updateRadioValue(true)
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.ext.requireComponents
|
import org.mozilla.fenix.ext.requireComponents
|
||||||
import org.mozilla.fenix.ext.settings
|
import org.mozilla.fenix.ext.settings
|
||||||
|
@ -122,8 +123,9 @@ class CustomizationFragment : PreferenceFragmentCompat() {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
topPreference.setCheckedWithoutClickListener(!requireContext().settings().shouldUseBottomToolbar)
|
val toolbarPosition = requireContext().settings().toolbarPosition
|
||||||
bottomPreference.setCheckedWithoutClickListener(requireContext().settings().shouldUseBottomToolbar)
|
topPreference.setCheckedWithoutClickListener(toolbarPosition == ToolbarPosition.TOP)
|
||||||
|
bottomPreference.setCheckedWithoutClickListener(toolbarPosition == ToolbarPosition.BOTTOM)
|
||||||
|
|
||||||
addToRadioGroup(topPreference, bottomPreference)
|
addToRadioGroup(topPreference, bottomPreference)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.core.view.isGone
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.marginTop
|
import androidx.core.view.marginTop
|
||||||
import kotlinx.android.synthetic.main.tracking_protection_onboarding_popup.*
|
import kotlinx.android.synthetic.main.tracking_protection_onboarding_popup.*
|
||||||
|
@ -22,6 +21,7 @@ import mozilla.components.browser.session.Session
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
import org.mozilla.fenix.components.metrics.MetricController
|
import org.mozilla.fenix.components.metrics.MetricController
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.increaseTapArea
|
import org.mozilla.fenix.ext.increaseTapArea
|
||||||
import org.mozilla.fenix.utils.Settings
|
import org.mozilla.fenix.utils.Settings
|
||||||
|
|
||||||
|
@ -63,10 +63,10 @@ class TrackingProtectionOverlay(
|
||||||
|
|
||||||
val layout = LayoutInflater.from(context)
|
val layout = LayoutInflater.from(context)
|
||||||
.inflate(R.layout.tracking_protection_onboarding_popup, null)
|
.inflate(R.layout.tracking_protection_onboarding_popup, null)
|
||||||
val isBottomToolbar = settings.shouldUseBottomToolbar
|
val toolbarPosition = settings.toolbarPosition
|
||||||
|
|
||||||
layout.drop_down_triangle.isGone = isBottomToolbar
|
layout.drop_down_triangle.isVisible = toolbarPosition == ToolbarPosition.TOP
|
||||||
layout.pop_up_triangle.isVisible = isBottomToolbar
|
layout.pop_up_triangle.isVisible = toolbarPosition == ToolbarPosition.BOTTOM
|
||||||
|
|
||||||
layout.onboarding_message.text =
|
layout.onboarding_message.text =
|
||||||
context.getString(
|
context.getString(
|
||||||
|
@ -91,11 +91,7 @@ class TrackingProtectionOverlay(
|
||||||
|
|
||||||
val xOffset = triangleMarginStartPx + triangleWidthPx / 2
|
val xOffset = triangleMarginStartPx + triangleWidthPx / 2
|
||||||
|
|
||||||
val gravity = if (isBottomToolbar) {
|
val gravity = Gravity.START or toolbarPosition.androidGravity
|
||||||
Gravity.START or Gravity.BOTTOM
|
|
||||||
} else {
|
|
||||||
Gravity.START or Gravity.TOP
|
|
||||||
}
|
|
||||||
|
|
||||||
trackingOnboardingDialog.apply {
|
trackingOnboardingDialog.apply {
|
||||||
setContentView(layout)
|
setContentView(layout)
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.mozilla.fenix.Config
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
||||||
import org.mozilla.fenix.components.metrics.MozillaProductDetector
|
import org.mozilla.fenix.components.metrics.MozillaProductDetector
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.ext.getPreferenceKey
|
import org.mozilla.fenix.ext.getPreferenceKey
|
||||||
import org.mozilla.fenix.settings.PhoneFeature
|
import org.mozilla.fenix.settings.PhoneFeature
|
||||||
|
@ -463,6 +464,9 @@ class Settings(private val appContext: Context) : PreferencesHolder {
|
||||||
default = !touchExplorationIsEnabled && !switchServiceIsEnabled
|
default = !touchExplorationIsEnabled && !switchServiceIsEnabled
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val toolbarPosition: ToolbarPosition
|
||||||
|
get() = if (shouldUseBottomToolbar) ToolbarPosition.BOTTOM else ToolbarPosition.TOP
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check each active accessibility service to see if it can perform gestures, if any can,
|
* Check each active accessibility service to see if it can perform gestures, if any can,
|
||||||
* then it is *likely* a switch service is enabled. We are assuming this to be the case based on #7486
|
* then it is *likely* a switch service is enabled. We are assuming this to be the case based on #7486
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
|
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||||
import org.mozilla.fenix.utils.Settings
|
import org.mozilla.fenix.utils.Settings
|
||||||
|
|
||||||
|
@ -34,7 +35,7 @@ class OnboardingToolbarPositionPickerViewHolderTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `bottom illustration should select corresponding radio button`() {
|
fun `bottom illustration should select corresponding radio button`() {
|
||||||
every { settings.shouldUseBottomToolbar } returns false
|
every { settings.toolbarPosition } returns ToolbarPosition.TOP
|
||||||
OnboardingToolbarPositionPickerViewHolder(view)
|
OnboardingToolbarPositionPickerViewHolder(view)
|
||||||
assertTrue(view.toolbar_top_radio_button.isChecked)
|
assertTrue(view.toolbar_top_radio_button.isChecked)
|
||||||
assertFalse(view.toolbar_bottom_radio_button.isChecked)
|
assertFalse(view.toolbar_bottom_radio_button.isChecked)
|
||||||
|
@ -46,7 +47,7 @@ class OnboardingToolbarPositionPickerViewHolderTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `top illustration should select corresponding radio button`() {
|
fun `top illustration should select corresponding radio button`() {
|
||||||
every { settings.shouldUseBottomToolbar } returns true
|
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
|
||||||
OnboardingToolbarPositionPickerViewHolder(view)
|
OnboardingToolbarPositionPickerViewHolder(view)
|
||||||
assertFalse(view.toolbar_top_radio_button.isChecked)
|
assertFalse(view.toolbar_top_radio_button.isChecked)
|
||||||
assertTrue(view.toolbar_bottom_radio_button.isChecked)
|
assertTrue(view.toolbar_bottom_radio_button.isChecked)
|
||||||
|
|
Loading…
Reference in New Issue