diff --git a/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt b/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt index d82e2c573..50c365f3e 100644 --- a/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt @@ -30,6 +30,7 @@ class IntentReceiverActivity : Activity() { val openToBrowser: Boolean val intent = Intent(intent) + openToBrowser = when { CustomTabConfig.isCustomTabIntent(SafeIntent(intent)) -> { intent.setClassName(applicationContext, CustomTabActivity::class.java.name) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 2b3a94f05..b66e99876 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -131,7 +131,14 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope { ) (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() } } @@ -144,6 +151,16 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope { 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?) { super.onViewCreated(view, savedInstanceState) @@ -255,20 +272,24 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope { ) 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 - ) + + sessionId?.let { sessionId -> + if (sessionManager.findSessionById(sessionId)?.isCustomTabSession() == true) { + customTabsIntegration.set( + feature = CustomTabsIntegration( + requireContext(), + requireComponents.core.sessionManager, + toolbar, + sessionId, + activity, + onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } + ), + owner = this, + view = view + ) + } } + toolbarComponent.getView().setOnSiteSecurityClickedListener { showQuickSettingsDialog() } @@ -374,7 +395,6 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope { return when { findInPageIntegration.onBackPressed() -> true sessionFeature.onBackPressed() -> true - customTabsIntegration.onBackPressed() -> true else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt new file mode 100644 index 000000000..8f19de23f --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -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 + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt index 471e26bbc..998534b6b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt @@ -12,8 +12,12 @@ import mozilla.components.browser.session.runWithSession import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.concept.storage.HistoryStorage import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature +import mozilla.components.feature.toolbar.ToolbarFeature import mozilla.components.feature.toolbar.ToolbarPresenter +import mozilla.components.lib.publicsuffixlist.PublicSuffixList 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.ext.components @@ -27,6 +31,9 @@ class ToolbarIntegration( sessionId: String? = null, isPrivate: Boolean ) : LifecycleAwareFeature { + + private var renderStyle: ToolbarFeature.RenderStyle = ToolbarFeature.RenderStyle.UncoloredUrl + init { toolbar.setMenuBuilder(toolbarMenu.menuBuilder) toolbar.private = isPrivate @@ -35,7 +42,10 @@ class ToolbarIntegration( sessionManager.runWithSession(sessionId) { it.isCustomTabSession() }.also { isCustomTab -> - if (isCustomTab) return@run + if (isCustomTab) { + renderStyle = ToolbarFeature.RenderStyle.RegistrableDomain + return@run + } val tabsAction = TabCounterToolbarButton( sessionManager, @@ -58,7 +68,9 @@ class ToolbarIntegration( private val toolbarPresenter: ToolbarPresenter = ToolbarPresenter( toolbar, context.components.core.sessionManager, - sessionId + sessionId, + ToolbarFeature.UrlRenderConfiguration(PublicSuffixList(context), + DefaultThemeManager.resolveAttribute(R.attr.primaryText, context), renderStyle = renderStyle) ) override fun start() { diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt index d813a6ae8..eebbe7286 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt @@ -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 -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 ToolbarMenu( - private val context: Context, - private val sessionId: String?, - private val requestDesktopStateProvider: () -> Boolean = { false }, - private val onItemTapped: (Item) -> Unit = {} -) { +interface ToolbarMenu { sealed class Item { object Help : Item() object Settings : Item() @@ -37,154 +21,8 @@ class ToolbarMenu( object OpenInFenix : Item() } - 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(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 - ) - } + val menuBuilder: BrowserMenuBuilder + val menuToolbar: BrowserMenuItemToolbar companion object { const val CAPTION_TEXT_SIZE = 12f diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt index 46ab54391..2b0951985 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt @@ -5,9 +5,11 @@ package org.mozilla.fenix.components.toolbar import android.graphics.drawable.BitmapDrawable +import android.view.Gravity import android.view.LayoutInflater import android.view.ViewGroup import android.widget.ImageView +import androidx.core.content.ContextCompat import io.reactivex.Observable import io.reactivex.Observer 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 org.jetbrains.anko.backgroundDrawable import org.mozilla.fenix.R +import org.mozilla.fenix.customtabs.CustomTabToolbarMenu import org.mozilla.fenix.ext.components import org.mozilla.fenix.mvi.UIView @@ -41,6 +44,9 @@ class ToolbarUIView( .inflate(R.layout.layout_url_background, container, false) init { + val session = sessionId?.let { view.context.components.core.sessionManager.findSessionById(sessionId) } + ?: view.context.components.core.sessionManager.selectedSession + view.apply { setOnUrlCommitListener { actionEmitter.onNext(SearchAction.UrlCommitted(it, sessionId, state?.engine)) @@ -52,7 +58,13 @@ class ToolbarUIView( } 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) @@ -74,17 +86,25 @@ class ToolbarUIView( } with(view.context) { - val session = sessionId?.let { components.core.sessionManager.findSessionById(sessionId) } - ?: components.core.sessionManager.selectedSession + val isCustom = session?.isCustomTabSession() ?: false + + val menuToolbar = if (isCustom) { + CustomTabToolbarMenu(this, + requestDesktopStateProvider = { session?.desktopMode ?: false }, + onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } + ) + } else { + DefaultToolbarMenu(this, + sessionId = sessionId, + requestDesktopStateProvider = { session?.desktopMode ?: false }, + onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } + ) + } toolbarIntegration = ToolbarIntegration( this, view, - ToolbarMenu(this, - sessionId = sessionId, - requestDesktopStateProvider = { session?.desktopMode ?: false }, - onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } - ), + menuToolbar, ShippedDomainsProvider().also { it.initialize(this) }, components.core.historyStorage, components.core.sessionManager, diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt new file mode 100644 index 000000000..683922d84 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -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 + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt index ecc276e6f..ed74343fe 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt @@ -6,152 +6,36 @@ 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, + val 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.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( - 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), - { 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 customTabToolbarMenu by lazy { + CustomTabToolbarMenu(context, + requestDesktopStateProvider = { session?.desktopMode ?: false }, + onItemTapped = onItemTapped ) } + private val feature = CustomTabsToolbarFeature( sessionManager, toolbar, sessionId, - menuBuilder, + customTabToolbarMenu.menuBuilder, closeListener = { activity?.finish() }) override fun start() {