pull/600/head
Sawyer Blatz 6 years ago committed by Emily Kager
parent 10a928c08f
commit cd56129a63

@ -30,6 +30,7 @@ class IntentReceiverActivity : Activity() {
val openToBrowser: Boolean val openToBrowser: Boolean
val intent = Intent(intent) val intent = Intent(intent)
openToBrowser = when { openToBrowser = when {
CustomTabConfig.isCustomTabIntent(SafeIntent(intent)) -> { CustomTabConfig.isCustomTabIntent(SafeIntent(intent)) -> {
intent.setClassName(applicationContext, CustomTabActivity::class.java.name) intent.setClassName(applicationContext, CustomTabActivity::class.java.name)

@ -131,7 +131,14 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope {
) )
(layoutParams as CoordinatorLayout.LayoutParams).apply { (layoutParams as CoordinatorLayout.LayoutParams).apply {
gravity = Gravity.BOTTOM gravity = getAppropriateLayoutGravity()
view.nestedScrollQuickAction.visibility = if (gravity == Gravity.TOP) {
View.GONE
} else {
View.VISIBLE
}
height = (resources.displayMetrics.density * TOOLBAR_HEIGHT).toInt() height = (resources.displayMetrics.density * TOOLBAR_HEIGHT).toInt()
} }
} }
@ -144,6 +151,16 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope {
return view return view
} }
private fun getAppropriateLayoutGravity(): Int {
sessionId?.let { sessionId ->
if (requireComponents.core.sessionManager.findSessionById(sessionId)?.isCustomTabSession() == true) {
return Gravity.TOP
}
}
return Gravity.BOTTOM
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -255,20 +272,24 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope {
) )
val actionEmitter = ActionBusFactory.get(this).getManagedEmitter(SearchAction::class.java) val actionEmitter = ActionBusFactory.get(this).getManagedEmitter(SearchAction::class.java)
sessionId?.let { id ->
customTabsIntegration.set( sessionId?.let { sessionId ->
feature = CustomTabsIntegration( if (sessionManager.findSessionById(sessionId)?.isCustomTabSession() == true) {
requireContext(), customTabsIntegration.set(
requireComponents.core.sessionManager, feature = CustomTabsIntegration(
toolbar, requireContext(),
id, requireComponents.core.sessionManager,
requireActivity(), toolbar,
onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } sessionId,
), activity,
owner = this, onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) }
view = view ),
) owner = this,
view = view
)
}
} }
toolbarComponent.getView().setOnSiteSecurityClickedListener { toolbarComponent.getView().setOnSiteSecurityClickedListener {
showQuickSettingsDialog() showQuickSettingsDialog()
} }
@ -374,7 +395,6 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope {
return when { return when {
findInPageIntegration.onBackPressed() -> true findInPageIntegration.onBackPressed() -> true
sessionFeature.onBackPressed() -> true sessionFeature.onBackPressed() -> true
customTabsIntegration.onBackPressed() -> true
else -> false else -> false
} }
} }

@ -0,0 +1,172 @@
/* 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.content.Context
import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.browser.menu.item.BrowserMenuItemToolbar
import mozilla.components.browser.menu.item.BrowserMenuSwitch
import org.mozilla.fenix.DefaultThemeManager
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
class DefaultToolbarMenu(
private val context: Context,
private val sessionId: String?,
private val requestDesktopStateProvider: () -> Boolean = { false },
private val onItemTapped: (ToolbarMenu.Item) -> Unit = {}
) : ToolbarMenu {
override val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
override val menuToolbar by lazy {
val back = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back,
primaryContentDescription = context.getString(R.string.browser_menu_back),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoBack ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.neutral,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(ToolbarMenu.Item.Back)
}
val forward = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward,
primaryContentDescription = context.getString(R.string.browser_menu_forward),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoForward ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.neutral,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(ToolbarMenu.Item.Forward)
}
val refresh = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_refresh,
primaryContentDescription = context.getString(R.string.browser_menu_refresh),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
val loading = context.components.core.sessionManager.selectedSession?.loading
loading == false
},
secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop,
secondaryContentDescription = context.getString(R.string.browser_menu_stop),
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
disableInSecondaryState = false
) {
if (context.components.core.sessionManager.selectedSession?.loading == true) {
onItemTapped.invoke(ToolbarMenu.Item.Stop)
} else {
onItemTapped.invoke(ToolbarMenu.Item.Reload)
}
}
BrowserMenuItemToolbar(listOf(back, forward, refresh))
}
private val menuItems by lazy {
listOf(
BrowserMenuImageText(
context.getString(R.string.browser_menu_help),
R.drawable.ic_help,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Help)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_settings),
R.drawable.ic_settings,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Settings)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_library),
R.drawable.ic_library,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Library)
},
BrowserMenuDivider(),
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site),
requestDesktopStateProvider, { checked ->
onItemTapped.invoke(ToolbarMenu.Item.RequestDesktop(checked))
}),
BrowserMenuImageText(
context.getString(R.string.browser_menu_find_in_page),
R.drawable.mozac_ic_search,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.FindInPage)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_private_tab),
R.drawable.ic_private_browsing,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.NewPrivateTab)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_new_tab),
R.drawable.ic_new,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.NewTab)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_share),
R.drawable.mozac_ic_share,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Share)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_report_issue),
R.drawable.ic_report_issues,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.ReportIssue)
},
BrowserMenuDivider(),
menuToolbar
)
}
}

@ -12,8 +12,12 @@ import mozilla.components.browser.session.runWithSession
import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.concept.storage.HistoryStorage import mozilla.components.concept.storage.HistoryStorage
import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature
import mozilla.components.feature.toolbar.ToolbarFeature
import mozilla.components.feature.toolbar.ToolbarPresenter import mozilla.components.feature.toolbar.ToolbarPresenter
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.DefaultThemeManager
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.BrowserFragmentDirections import org.mozilla.fenix.browser.BrowserFragmentDirections
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
@ -27,6 +31,9 @@ class ToolbarIntegration(
sessionId: String? = null, sessionId: String? = null,
isPrivate: Boolean isPrivate: Boolean
) : LifecycleAwareFeature { ) : LifecycleAwareFeature {
private var renderStyle: ToolbarFeature.RenderStyle = ToolbarFeature.RenderStyle.UncoloredUrl
init { init {
toolbar.setMenuBuilder(toolbarMenu.menuBuilder) toolbar.setMenuBuilder(toolbarMenu.menuBuilder)
toolbar.private = isPrivate toolbar.private = isPrivate
@ -35,7 +42,10 @@ class ToolbarIntegration(
sessionManager.runWithSession(sessionId) { sessionManager.runWithSession(sessionId) {
it.isCustomTabSession() it.isCustomTabSession()
}.also { isCustomTab -> }.also { isCustomTab ->
if (isCustomTab) return@run if (isCustomTab) {
renderStyle = ToolbarFeature.RenderStyle.RegistrableDomain
return@run
}
val tabsAction = TabCounterToolbarButton( val tabsAction = TabCounterToolbarButton(
sessionManager, sessionManager,
@ -58,7 +68,9 @@ class ToolbarIntegration(
private val toolbarPresenter: ToolbarPresenter = ToolbarPresenter( private val toolbarPresenter: ToolbarPresenter = ToolbarPresenter(
toolbar, toolbar,
context.components.core.sessionManager, context.components.core.sessionManager,
sessionId sessionId,
ToolbarFeature.UrlRenderConfiguration(PublicSuffixList(context),
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context), renderStyle = renderStyle)
) )
override fun start() { override fun start() {

@ -1,25 +1,9 @@
/* 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 package org.mozilla.fenix.components.toolbar
import android.content.Context
import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.browser.menu.item.BrowserMenuItemToolbar import mozilla.components.browser.menu.item.BrowserMenuItemToolbar
import mozilla.components.browser.menu.item.BrowserMenuSwitch
import org.mozilla.fenix.DefaultThemeManager
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
class ToolbarMenu( interface ToolbarMenu {
private val context: Context,
private val sessionId: String?,
private val requestDesktopStateProvider: () -> Boolean = { false },
private val onItemTapped: (Item) -> Unit = {}
) {
sealed class Item { sealed class Item {
object Help : Item() object Help : Item()
object Settings : Item() object Settings : Item()
@ -37,154 +21,8 @@ class ToolbarMenu(
object OpenInFenix : Item() object OpenInFenix : Item()
} }
val menuBuilder by lazy { BrowserMenuBuilder(menuItems) } val menuBuilder: BrowserMenuBuilder
val menuToolbar: BrowserMenuItemToolbar
val menuToolbar by lazy {
val back = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back,
primaryContentDescription = context.getString(R.string.browser_menu_back),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoBack ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.secondaryText,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(Item.Back)
}
val forward = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward,
primaryContentDescription = context.getString(R.string.browser_menu_forward),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoForward ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.secondaryText,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(Item.Forward)
}
val refresh = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_refresh,
primaryContentDescription = context.getString(R.string.browser_menu_refresh),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
val loading = context.components.core.sessionManager.selectedSession?.loading
loading == false
},
secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop,
secondaryContentDescription = context.getString(R.string.browser_menu_stop),
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
disableInSecondaryState = false
) {
if (context.components.core.sessionManager.selectedSession?.loading == true) {
onItemTapped.invoke(Item.Stop)
} else {
onItemTapped.invoke(Item.Reload)
}
}
BrowserMenuItemToolbar(listOf(back, forward, refresh))
}
private val menuItems by lazy {
listOf(
BrowserMenuImageText(
context.getString(R.string.browser_menu_help),
R.drawable.ic_help,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.Help)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_settings),
R.drawable.ic_settings,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.Settings)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_library),
R.drawable.ic_library,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.Library)
},
BrowserMenuDivider(),
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site),
requestDesktopStateProvider, { checked ->
onItemTapped.invoke(Item.RequestDesktop(checked))
}),
BrowserMenuImageText(
context.getString(R.string.browser_menu_find_in_page),
R.drawable.mozac_ic_search,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.FindInPage)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_private_tab),
R.drawable.ic_private_browsing,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.NewPrivateTab)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_new_tab),
R.drawable.ic_new,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.NewTab)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_share),
R.drawable.mozac_ic_share,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.Share)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_report_issue),
R.drawable.ic_report_issues,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(Item.ReportIssue)
},
BrowserMenuDivider(),
menuToolbar
)
}
companion object { companion object {
const val CAPTION_TEXT_SIZE = 12f const val CAPTION_TEXT_SIZE = 12f

@ -5,9 +5,11 @@
package org.mozilla.fenix.components.toolbar package org.mozilla.fenix.components.toolbar
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import androidx.core.content.ContextCompat
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.Observer import io.reactivex.Observer
import io.reactivex.functions.Consumer import io.reactivex.functions.Consumer
@ -16,6 +18,7 @@ import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.support.ktx.android.content.res.pxToDp import mozilla.components.support.ktx.android.content.res.pxToDp
import org.jetbrains.anko.backgroundDrawable import org.jetbrains.anko.backgroundDrawable
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.customtabs.CustomTabToolbarMenu
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.mvi.UIView import org.mozilla.fenix.mvi.UIView
@ -41,6 +44,9 @@ class ToolbarUIView(
.inflate(R.layout.layout_url_background, container, false) .inflate(R.layout.layout_url_background, container, false)
init { init {
val session = sessionId?.let { view.context.components.core.sessionManager.findSessionById(sessionId) }
?: view.context.components.core.sessionManager.selectedSession
view.apply { view.apply {
setOnUrlCommitListener { setOnUrlCommitListener {
actionEmitter.onNext(SearchAction.UrlCommitted(it, sessionId, state?.engine)) actionEmitter.onNext(SearchAction.UrlCommitted(it, sessionId, state?.engine))
@ -52,7 +58,13 @@ class ToolbarUIView(
} }
browserActionMargin = resources.pxToDp(browserActionMarginDp) browserActionMargin = resources.pxToDp(browserActionMarginDp)
urlBoxView = urlBackground
val isCustomTabSession = (session?.isCustomTabSession() == true)
urlBoxView = if (isCustomTabSession) { null } else urlBackground
progressBarGravity = if (isCustomTabSession) { Gravity.TOP } else Gravity.BOTTOM
textColor = ContextCompat.getColor(context, R.color.photonGrey30)
hint = context.getString(R.string.search_hint) hint = context.getString(R.string.search_hint)
@ -74,17 +86,25 @@ class ToolbarUIView(
} }
with(view.context) { with(view.context) {
val session = sessionId?.let { components.core.sessionManager.findSessionById(sessionId) } val isCustom = session?.isCustomTabSession() ?: false
?: components.core.sessionManager.selectedSession
toolbarIntegration = ToolbarIntegration( val menuToolbar = if (isCustom) {
this, CustomTabToolbarMenu(this,
view, requestDesktopStateProvider = { session?.desktopMode ?: false },
ToolbarMenu(this, onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) }
)
} else {
DefaultToolbarMenu(this,
sessionId = sessionId, sessionId = sessionId,
requestDesktopStateProvider = { session?.desktopMode ?: false }, requestDesktopStateProvider = { session?.desktopMode ?: false },
onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) }
), )
}
toolbarIntegration = ToolbarIntegration(
this,
view,
menuToolbar,
ShippedDomainsProvider().also { it.initialize(this) }, ShippedDomainsProvider().also { it.initialize(this) },
components.core.historyStorage, components.core.historyStorage,
components.core.sessionManager, components.core.sessionManager,

@ -0,0 +1,143 @@
/* 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.customtabs
import android.content.Context
import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.browser.menu.item.BrowserMenuItemToolbar
import mozilla.components.browser.menu.item.BrowserMenuSwitch
import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
import org.mozilla.fenix.DefaultThemeManager
import org.mozilla.fenix.R
import org.mozilla.fenix.components.toolbar.ToolbarMenu
import org.mozilla.fenix.ext.components
class CustomTabToolbarMenu(
private val context: Context,
private val requestDesktopStateProvider: () -> Boolean = { false },
private val onItemTapped: (ToolbarMenu.Item) -> Unit = {}
) : ToolbarMenu {
override val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
override val menuToolbar by lazy {
val back = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back,
primaryContentDescription = context.getString(R.string.browser_menu_back),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoBack ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.neutral,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(ToolbarMenu.Item.Back)
}
val forward = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward,
primaryContentDescription = context.getString(R.string.browser_menu_forward),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoForward ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.neutral,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(ToolbarMenu.Item.Forward)
}
val refresh = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_refresh,
primaryContentDescription = context.getString(R.string.browser_menu_refresh),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
val loading = context.components.core.sessionManager.selectedSession?.loading
loading == false
},
secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop,
secondaryContentDescription = context.getString(R.string.browser_menu_stop),
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
disableInSecondaryState = false
) {
if (context.components.core.sessionManager.selectedSession?.loading == true) {
onItemTapped.invoke(ToolbarMenu.Item.Stop)
} else {
onItemTapped.invoke(ToolbarMenu.Item.Reload)
}
}
BrowserMenuItemToolbar(listOf(back, forward, refresh))
}
private val menuItems by lazy {
listOf(
SimpleBrowserMenuItem(
{
val appName = context.getString(R.string.app_name)
context.getString(R.string.browser_menu_powered_by, appName).toUpperCase()
}(),
ToolbarMenu.CAPTION_TEXT_SIZE,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
),
BrowserMenuDivider(),
SimpleBrowserMenuItem(
{
val appName = context.getString(R.string.app_name)
context.getString(R.string.browser_menu_open_in_fenix, appName)
}(),
textColorResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
)
) {
onItemTapped.invoke(ToolbarMenu.Item.OpenInFenix)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_find_in_page),
R.drawable.mozac_ic_search,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.FindInPage)
},
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site),
requestDesktopStateProvider, { checked ->
onItemTapped.invoke(ToolbarMenu.Item.RequestDesktop(checked))
}),
BrowserMenuImageText(
context.getString(R.string.browser_menu_share),
R.drawable.mozac_ic_share,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Share)
},
menuToolbar
)
}
}

@ -6,152 +6,36 @@ package org.mozilla.fenix.customtabs
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.browser.menu.item.BrowserMenuItemToolbar
import mozilla.components.browser.menu.item.BrowserMenuSwitch
import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.feature.customtabs.CustomTabsToolbarFeature import mozilla.components.feature.customtabs.CustomTabsToolbarFeature
import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.DefaultThemeManager
import org.mozilla.fenix.R
import org.mozilla.fenix.components.toolbar.ToolbarMenu import org.mozilla.fenix.components.toolbar.ToolbarMenu
import org.mozilla.fenix.ext.components
class CustomTabsIntegration( class CustomTabsIntegration(
context: Context, context: Context,
sessionManager: SessionManager, sessionManager: SessionManager,
toolbar: BrowserToolbar, val toolbar: BrowserToolbar,
sessionId: String, sessionId: String,
activity: Activity?, activity: Activity?,
onItemTapped: (ToolbarMenu.Item) -> Unit = {} onItemTapped: (ToolbarMenu.Item) -> Unit = {}
) : LifecycleAwareFeature, BackHandler { ) : LifecycleAwareFeature, BackHandler {
private val session = sessionManager.findSessionById(sessionId)
val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
val menuToolbar by lazy {
val back = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_back,
primaryContentDescription = context.getString(R.string.browser_menu_back),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoBack ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.secondaryText,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(ToolbarMenu.Item.Back)
}
val forward = BrowserMenuItemToolbar.TwoStateButton(
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_forward,
primaryContentDescription = context.getString(R.string.browser_menu_forward),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoForward ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.secondaryText,
context
),
disableInSecondaryState = true
) {
onItemTapped.invoke(ToolbarMenu.Item.Forward)
}
val refresh = BrowserMenuItemToolbar.TwoStateButton( private val session = sessionManager.findSessionById(sessionId)
primaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_refresh,
primaryContentDescription = context.getString(R.string.browser_menu_refresh),
primaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
isInPrimaryState = {
val loading = context.components.core.sessionManager.selectedSession?.loading
loading == false
},
secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop,
secondaryContentDescription = context.getString(R.string.browser_menu_stop),
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
),
disableInSecondaryState = false
) {
if (context.components.core.sessionManager.selectedSession?.loading == true) {
onItemTapped.invoke(ToolbarMenu.Item.Stop)
} else {
onItemTapped.invoke(ToolbarMenu.Item.Reload)
}
}
BrowserMenuItemToolbar(listOf(back, forward, refresh))
}
private val menuItems by lazy { private val customTabToolbarMenu by lazy {
listOf( CustomTabToolbarMenu(context,
SimpleBrowserMenuItem( requestDesktopStateProvider = { session?.desktopMode ?: false },
{ onItemTapped = onItemTapped
val appName = context.getString(R.string.app_name)
context.getString(R.string.browser_menu_powered_by, appName).toUpperCase()
}(),
ToolbarMenu.CAPTION_TEXT_SIZE,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
),
BrowserMenuDivider(),
SimpleBrowserMenuItem(
{
val appName = context.getString(R.string.app_name)
context.getString(R.string.browser_menu_open_in_fenix, appName)
}(),
textColorResource = DefaultThemeManager.resolveAttribute(
R.attr.primaryText,
context
)
) {
onItemTapped.invoke(ToolbarMenu.Item.OpenInFenix)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_find_in_page),
R.drawable.mozac_ic_search,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.FindInPage)
},
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site),
{ session?.desktopMode ?: false }, { checked ->
onItemTapped.invoke(ToolbarMenu.Item.RequestDesktop(checked))
}),
BrowserMenuImageText(
context.getString(R.string.browser_menu_share),
R.drawable.mozac_ic_share,
DefaultThemeManager.resolveAttribute(R.attr.primaryText, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Share)
},
menuToolbar
) )
} }
private val feature = CustomTabsToolbarFeature( private val feature = CustomTabsToolbarFeature(
sessionManager, sessionManager,
toolbar, toolbar,
sessionId, sessionId,
menuBuilder, customTabToolbarMenu.menuBuilder,
closeListener = { activity?.finish() }) closeListener = { activity?.finish() })
override fun start() { override fun start() {

Loading…
Cancel
Save