From 33b83fb0e370b6f8d0f05966017304a4fb9c8df6 Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Wed, 13 Mar 2019 09:47:23 -0700 Subject: [PATCH] Closes #832: Adds custom tabs menu (#944) --- .../mozilla/fenix/browser/BrowserFragment.kt | 10 + .../fenix/components/toolbar/ToolbarMenu.kt | 177 +++++++++++------- .../fenix/components/toolbar/ToolbarUIView.kt | 1 + app/src/main/res/values/strings.xml | 21 ++- 4 files changed, 137 insertions(+), 72 deletions(-) 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 3f8d7c765..a296f6857 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.browser import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater @@ -37,6 +38,7 @@ import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded import org.mozilla.fenix.BrowsingModeManager import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.FindInPageIntegration import org.mozilla.fenix.components.toolbar.SearchAction @@ -45,6 +47,7 @@ import org.mozilla.fenix.components.toolbar.ToolbarComponent import org.mozilla.fenix.components.toolbar.ToolbarIntegration import org.mozilla.fenix.components.toolbar.ToolbarMenu import org.mozilla.fenix.components.toolbar.ToolbarUIView +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.share import org.mozilla.fenix.mvi.ActionBusFactory @@ -289,6 +292,13 @@ class BrowserFragment : Fragment(), BackHandler { Navigation.findNavController(view!!).navigate(directions) (activity as HomeActivity).browsingModeManager.mode = BrowsingModeManager.Mode.Normal } + ToolbarMenu.Item.OpenInFenix -> { + val intent = Intent(context, IntentReceiverActivity::class.java) + val session = context!!.components.core.sessionManager.findSessionById(sessionId!!) + intent.action = Intent.ACTION_VIEW + intent.data = Uri.parse(session?.url) + startActivity(intent) + } } } 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 2276a3447..dab3d2cb5 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 @@ -10,11 +10,15 @@ 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.runWithSession 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 = {} ) { @@ -31,6 +35,7 @@ class ToolbarMenu( object Forward : Item() object Reload : Item() object ReportIssue : Item() + object OpenInFenix : Item() } val menuBuilder by lazy { BrowserMenuBuilder(menuItems) } @@ -63,82 +68,124 @@ class ToolbarMenu( BrowserMenuItemToolbar(listOf(back, forward, refresh)) } + private val isCustomTab by lazy { + context.components.core.sessionManager.runWithSession(sessionId) { + it.isCustomTabSession() + } + } + private val menuItems by lazy { - listOf( - BrowserMenuImageText( - context.getString(R.string.browser_menu_help), - R.drawable.ic_help, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.Help) - }, + if (isCustomTab) { + listOf( + SimpleBrowserMenuItem(context.getString(R.string.browser_menu_powered_by), + 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(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( - context.getString(R.string.browser_menu_settings), - R.drawable.ic_settings, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.Settings) - }, + BrowserMenuImageText( + context.getString(R.string.browser_menu_settings), + R.drawable.ic_settings, + DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) + ) { + onItemTapped.invoke(Item.Settings) + }, - BrowserMenuImageText( - context.getString(R.string.browser_menu_library), - R.drawable.ic_library, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.Library) - }, + BrowserMenuImageText( + context.getString(R.string.browser_menu_library), + R.drawable.ic_library, + DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) + ) { + onItemTapped.invoke(Item.Library) + }, - BrowserMenuDivider(), + BrowserMenuDivider(), - BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site), - requestDesktopStateProvider, { checked -> - onItemTapped.invoke(Item.RequestDesktop(checked)) - }), + 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.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.FindInPage) - }, + 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) + }, - BrowserMenuImageText( - context.getString(R.string.browser_menu_private_tab), - R.drawable.ic_private_browsing, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.NewPrivateTab) - }, + BrowserMenuImageText( + context.getString(R.string.browser_menu_private_tab), + R.drawable.ic_private_browsing, + DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) + ) { + onItemTapped.invoke(Item.NewPrivateTab) + }, - BrowserMenuImageText( - context.getString(R.string.browser_menu_new_tab), - R.drawable.ic_new, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.NewTab) - }, + BrowserMenuImageText( + context.getString(R.string.browser_menu_new_tab), + R.drawable.ic_new, + DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) + ) { + onItemTapped.invoke(Item.NewTab) + }, - BrowserMenuImageText( - context.getString(R.string.browser_menu_share), - R.drawable.mozac_ic_share, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.Share) - }, + BrowserMenuImageText( + context.getString(R.string.browser_menu_share), + R.drawable.mozac_ic_share, + DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) + ) { + onItemTapped.invoke(Item.Share) + }, - BrowserMenuImageText( - context.getString(R.string.browser_menu_report_issue), - R.drawable.ic_report_issues, - DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) - ) { - onItemTapped.invoke(Item.ReportIssue) - }, + BrowserMenuImageText( + context.getString(R.string.browser_menu_report_issue), + R.drawable.ic_report_issues, + DefaultThemeManager.resolveAttribute(R.attr.browserToolbarMenuIcons, context) + ) { + onItemTapped.invoke(Item.ReportIssue) + }, - BrowserMenuDivider(), + BrowserMenuDivider(), - menuToolbar - ) + menuToolbar + ) + } + } + + 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 9848ca733..d743e1f30 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 @@ -72,6 +72,7 @@ class ToolbarUIView( this, view, ToolbarMenu(this, + sessionId = sessionId, requestDesktopStateProvider = { session?.desktopMode ?: false }, onItemTapped = { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) } ), diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c9c366024..ab77cae6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ Fenix + More options @@ -16,6 +17,7 @@ Sessions help you return to the sites you visit often and those you\'ve just discovered. Start browsing and they\'ll begin to appear here. Search or enter address + You\'re in a private session @@ -23,6 +25,7 @@ Fenix clears your search and browsing history when you close your private session. While this doesn\'t make you anonymous to websites or your internet service provider, it makes it easier to keep what you do online private from anyone else who uses this device.\n\nCommon myths about private browsing Delete session + Home @@ -52,6 +55,11 @@ Share Share with… + + Open in Fenix" + + POWERED BY FENIX" + Scan @@ -59,9 +67,11 @@ Shortcuts Fill link from clipboard + Settings + Basics @@ -103,10 +113,8 @@ Data choices Leak Canary - Show search suggestions - Account Settings @@ -156,6 +164,7 @@

%1$s puts you in control.

%1$s is produced by Mozilla. Our mission is to foster a healthy, open Internet.
]]> + Current Session @@ -177,20 +186,17 @@ Send and Share Current session image - Save Session Delete Session - Delete - %1$d sites… - + Delete history @@ -199,5 +205,6 @@ is the number of items you have selected --> Delete %1$d items - Entering full screen modeq + + Entering full screen mode \ No newline at end of file