1
0
Fork 0

Closes #832 & For #222: Adds basic custom tab integration (#1026)

master
Sawyer Blatz 2019-03-15 10:51:04 -07:00 committed by GitHub
parent 6e1655e935
commit 8620b78d6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 246 additions and 112 deletions

View File

@ -49,6 +49,7 @@ import org.mozilla.fenix.components.toolbar.ToolbarComponent
import org.mozilla.fenix.components.toolbar.ToolbarIntegration import org.mozilla.fenix.components.toolbar.ToolbarIntegration
import org.mozilla.fenix.components.toolbar.ToolbarMenu import org.mozilla.fenix.components.toolbar.ToolbarMenu
import org.mozilla.fenix.components.toolbar.ToolbarUIView import org.mozilla.fenix.components.toolbar.ToolbarUIView
import org.mozilla.fenix.customtabs.CustomTabsIntegration
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.share import org.mozilla.fenix.ext.share
@ -68,6 +69,8 @@ class BrowserFragment : Fragment(), BackHandler, ComponentCallbacks2 {
private val sitePermissionsFeature = ViewBoundFeatureWrapper<SitePermissionsFeature>() private val sitePermissionsFeature = ViewBoundFeatureWrapper<SitePermissionsFeature>()
private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>() private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>()
private val thumbnailsFeature = ViewBoundFeatureWrapper<ThumbnailsFeature>() private val thumbnailsFeature = ViewBoundFeatureWrapper<ThumbnailsFeature>()
private val customTabsIntegration = ViewBoundFeatureWrapper<CustomTabsIntegration>()
var sessionId: String? = null var sessionId: String? = null
override fun onCreateView( override fun onCreateView(
@ -216,6 +219,22 @@ class BrowserFragment : Fragment(), BackHandler, ComponentCallbacks2 {
owner = this, owner = this,
view = view view = view
) )
val actionEmitter = ActionBusFactory.get(this).getManagedEmitter(SearchAction::class.java)
sessionId?.let { id ->
customTabsIntegration.set(
feature = CustomTabsIntegration(
requireContext(),
requireComponents.core.sessionManager,
toolbar,
id,
requireActivity(),
onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) }
),
owner = this,
view = view
)
}
} }
override fun onResume() { override fun onResume() {

View File

@ -10,8 +10,6 @@ import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText 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 mozilla.components.browser.menu.item.BrowserMenuSwitch
import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
import mozilla.components.browser.session.runWithSession
import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.DefaultThemeManager
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
@ -109,128 +107,83 @@ class ToolbarMenu(
BrowserMenuItemToolbar(listOf(back, forward, refresh)) BrowserMenuItemToolbar(listOf(back, forward, refresh))
} }
private val isCustomTab by lazy {
context.components.core.sessionManager.runWithSession(sessionId) {
it.isCustomTabSession()
}
}
private val menuItems by lazy { private val menuItems by lazy {
if (isCustomTab) { listOf(
listOf( BrowserMenuImageText(
SimpleBrowserMenuItem( context.getString(R.string.browser_menu_help),
context.getString(R.string.browser_menu_powered_by), R.drawable.ic_help,
CAPTION_TEXT_SIZE, DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) ) {
), onItemTapped.invoke(Item.Help)
BrowserMenuDivider(), },
SimpleBrowserMenuItem(
context.getString(R.string.browser_menu_open_in_fenix),
textColorResource = DefaultThemeManager.resolveAttribute(
R.attr.browserToolbarMenuIcons,
context
)
) {
onItemTapped.invoke(Item.OpenInFenix)
},
BrowserMenuImageText(
context.getString(R.string.browser_menu_find_in_page),
R.drawable.mozac_ic_search,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) {
onItemTapped.invoke(Item.FindInPage)
},
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site),
requestDesktopStateProvider, { checked ->
onItemTapped.invoke(Item.RequestDesktop(checked))
}),
BrowserMenuImageText(
context.getString(R.string.browser_menu_share),
R.drawable.mozac_ic_share,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) {
onItemTapped.invoke(Item.Share)
},
menuToolbar
)
} else {
listOf(
BrowserMenuImageText(
context.getString(R.string.browser_menu_help),
R.drawable.ic_help,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) {
onItemTapped.invoke(Item.Help)
},
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_settings), context.getString(R.string.browser_menu_settings),
R.drawable.ic_settings, R.drawable.ic_settings,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.Settings) onItemTapped.invoke(Item.Settings)
}, },
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_library), context.getString(R.string.browser_menu_library),
R.drawable.ic_library, R.drawable.ic_library,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.Library) onItemTapped.invoke(Item.Library)
}, },
BrowserMenuDivider(), BrowserMenuDivider(),
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site), BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site),
requestDesktopStateProvider, { checked -> requestDesktopStateProvider, { checked ->
onItemTapped.invoke(Item.RequestDesktop(checked)) onItemTapped.invoke(Item.RequestDesktop(checked))
}), }),
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_find_in_page), context.getString(R.string.browser_menu_find_in_page),
R.drawable.mozac_ic_search, R.drawable.mozac_ic_search,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.FindInPage) onItemTapped.invoke(Item.FindInPage)
}, },
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_private_tab), context.getString(R.string.browser_menu_private_tab),
R.drawable.ic_private_browsing, R.drawable.ic_private_browsing,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.NewPrivateTab) onItemTapped.invoke(Item.NewPrivateTab)
}, },
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_new_tab), context.getString(R.string.browser_menu_new_tab),
R.drawable.ic_new, R.drawable.ic_new,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.NewTab) onItemTapped.invoke(Item.NewTab)
}, },
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_share), context.getString(R.string.browser_menu_share),
R.drawable.mozac_ic_share, R.drawable.mozac_ic_share,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.Share) onItemTapped.invoke(Item.Share)
}, },
BrowserMenuImageText( BrowserMenuImageText(
context.getString(R.string.browser_menu_report_issue), context.getString(R.string.browser_menu_report_issue),
R.drawable.ic_report_issues, R.drawable.ic_report_issues,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
) { ) {
onItemTapped.invoke(Item.ReportIssue) onItemTapped.invoke(Item.ReportIssue)
}, },
BrowserMenuDivider(), BrowserMenuDivider(),
menuToolbar menuToolbar
) )
}
} }
companion object { companion object {

View File

@ -0,0 +1,162 @@
/* 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.app.Activity
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.toolbar.BrowserToolbar
import mozilla.components.feature.customtabs.CustomTabsToolbarFeature
import mozilla.components.support.base.feature.BackHandler
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.ext.components
class CustomTabsIntegration(
context: Context,
sessionManager: SessionManager,
toolbar: BrowserToolbar,
sessionId: String,
activity: Activity?,
onItemTapped: (ToolbarMenu.Item) -> Unit = {}
) : 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.browserToolbarMenuIcons,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoBack ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.disabledIconColor,
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.browserToolbarMenuIcons,
context
),
isInPrimaryState = {
context.components.core.sessionManager.selectedSession?.canGoForward ?: true
},
secondaryImageTintResource = DefaultThemeManager.resolveAttribute(
R.attr.disabledIconColor,
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.browserToolbarMenuIcons,
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.browserToolbarMenuIcons,
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(
context.getString(R.string.browser_menu_powered_by),
ToolbarMenu.CAPTION_TEXT_SIZE,
DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context)
),
BrowserMenuDivider(),
SimpleBrowserMenuItem(
context.getString(R.string.browser_menu_open_in_fenix),
textColorResource = DefaultThemeManager.resolveAttribute(
R.attr.browserToolbarMenuIcons,
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.browserToolbarMenuIcons, 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.browserToolbarMenuIcons, context)
) {
onItemTapped.invoke(ToolbarMenu.Item.Share)
},
menuToolbar
)
}
private val feature = CustomTabsToolbarFeature(
sessionManager,
toolbar,
sessionId,
menuBuilder,
closeListener = { activity?.finish() })
override fun start() {
feature.start()
}
override fun stop() {
feature.stop()
}
override fun onBackPressed(): Boolean {
return feature.onBackPressed()
}
}