1
0
Fork 0

For #355 - Present the Library when the menu item is tapped

master
Jeff Boek 2019-02-07 14:50:55 -08:00
parent 19dd468639
commit 98a1ae578e
7 changed files with 66 additions and 67 deletions

View File

@ -35,9 +35,10 @@ import org.mozilla.fenix.components.FindInPageIntegration
import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.getSafeManagedObservable
import org.mozilla.fenix.search.toolbar.SearchAction
import org.mozilla.fenix.search.toolbar.SearchState
import org.mozilla.fenix.search.toolbar.ToolbarComponent
import org.mozilla.fenix.search.toolbar.SearchState
import org.mozilla.fenix.search.toolbar.ToolbarUIView
import org.mozilla.fenix.search.toolbar.ToolbarMenu
class BrowserFragment : Fragment(), BackHandler {
@ -87,8 +88,10 @@ class BrowserFragment : Fragment(), BackHandler {
getSafeManagedObservable<SearchAction>()
.subscribe {
if (it is SearchAction.ToolbarTapped) {
navigateToSearch()
when (it) {
is SearchAction.ToolbarTapped -> Navigation.findNavController(toolbar)
.navigate(R.id.action_browserFragment_to_searchFragment, null, null)
is SearchAction.ToolbarMenuItemTapped -> handleToolbarItemInteraction(it)
}
}
}
@ -139,8 +142,7 @@ class BrowserFragment : Fragment(), BackHandler {
customTabsToolbarFeature = CustomTabsToolbarFeature(
sessionManager,
toolbar,
sessionId,
requireComponents.toolbar.menuBuilder
sessionId
) { requireActivity().finish() }
lifecycle.addObservers(
@ -182,9 +184,18 @@ class BrowserFragment : Fragment(), BackHandler {
promptsFeature.onActivityResult(requestCode, resultCode, data)
}
private fun navigateToSearch() {
Navigation.findNavController(toolbar)
.navigate(R.id.action_browserFragment_to_searchFragment, null, null)
private fun handleToolbarItemInteraction(action: SearchAction.ToolbarMenuItemTapped) {
val sessionUseCases = requireComponents.useCases.sessionUseCases
when (action.item) {
is ToolbarMenu.Item.Back -> sessionUseCases.goBack.invoke()
is ToolbarMenu.Item.Forward -> sessionUseCases.goForward.invoke()
is ToolbarMenu.Item.Reload -> sessionUseCases.reload.invoke()
is ToolbarMenu.Item.Settings -> Navigation.findNavController(toolbar)
.navigate(R.id.action_browserFragment_to_settingsActivity, null, null)
is ToolbarMenu.Item.Library -> Navigation.findNavController(toolbar)
.navigate(R.id.action_browserFragment_to_libraryFragment, null, null)
else -> return
}
}
companion object {

View File

@ -5,7 +5,6 @@
package org.mozilla.fenix.components
import android.content.Context
import org.mozilla.fenix.components.toolbar.Toolbar
/**
* Provides access to all components.
@ -14,7 +13,6 @@ class Components(private val context: Context) {
val core by lazy { Core(context) }
val search by lazy { Search(context) }
val useCases by lazy { UseCases(context, core.sessionManager, search.searchEngineManager) }
val toolbar by lazy { Toolbar(context, useCases.sessionUseCases, core.sessionManager) }
val utils by lazy { Utilities(context, core.sessionManager, useCases.sessionUseCases, useCases.searchUseCases) }
val analytics by lazy { Analytics(context) }
}

View File

@ -40,6 +40,7 @@ sealed class SearchAction : Action {
data class UrlCommitted(val url: String) : SearchAction()
data class TextChanged(val query: String) : SearchAction()
object ToolbarTapped : SearchAction()
data class ToolbarMenuItemTapped(val item: ToolbarMenu.Item) : SearchAction()
}
sealed class SearchChange : Change {

View File

@ -2,7 +2,7 @@
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.search.toolbar
import android.content.Context
import androidx.lifecycle.Lifecycle
@ -23,13 +23,14 @@ import org.mozilla.fenix.ext.components
class ToolbarIntegration(
context: Context,
toolbar: BrowserToolbar,
toolbarMenu: ToolbarMenu,
domainAutocompleteProvider: DomainAutocompleteProvider,
historyStorage: HistoryStorage,
sessionManager: SessionManager,
sessionId: String? = null
) : LifecycleObserver {
init {
toolbar.setMenuBuilder(context.components.toolbar.menuBuilder)
toolbar.setMenuBuilder(toolbarMenu.menuBuilder)
val home = BrowserToolbar.Button(
context.resources.getDrawable(R.drawable.ic_home, context.application.theme),

View File

@ -1,52 +1,41 @@
/* 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/. */
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.search.toolbar
import android.content.Context
import android.content.Intent
import mozilla.components.browser.domains.autocomplete.ShippedDomainsProvider
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.session.SessionManager
import mozilla.components.feature.session.SessionUseCases
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.share
import org.mozilla.fenix.settings.SettingsActivity
import org.mozilla.fenix.components.FindInPageIntegration
/**
* Component group for all functionality related to the browser toolbar.
*/
class Toolbar(
private val context: Context,
private val sessionUseCases: SessionUseCases,
private val sessionManager: SessionManager
) {
/**
* Helper class for building browser menus.app
*/
val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
/**
* Provides autocomplete functionality for shipped / provided domain lists.
*/
val shippedDomainsProvider by lazy {
ShippedDomainsProvider().also { it.initialize(context) }
class ToolbarMenu(private val context: Context, private val onItemTapped: (Item) -> Unit = {}) {
sealed class Item {
object Help : Item()
object Settings : Item()
object Library : Item()
data class RequestDesktop(val isChecked: Boolean) : Item()
object FindInPage : Item()
object NewPrivateTab : Item()
object NewTab : Item()
object Share : Item()
object Back : Item()
object Forward : Item()
object Reload : Item()
}
val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
val menuToolbar by lazy {
val back = BrowserMenuItemToolbar.Button(
mozilla.components.ui.icons.R.drawable.mozac_ic_back,
iconTintColorResource = R.color.icons,
contentDescription = context.getString(R.string.browser_menu_back)
) {
sessionUseCases.goBack.invoke()
onItemTapped.invoke(Item.Back)
}
val forward = BrowserMenuItemToolbar.Button(
@ -54,7 +43,7 @@ class Toolbar(
iconTintColorResource = R.color.icons,
contentDescription = context.getString(R.string.browser_menu_forward)
) {
sessionUseCases.goForward.invoke()
onItemTapped.invoke(Item.Forward)
}
val refresh = BrowserMenuItemToolbar.Button(
@ -62,7 +51,7 @@ class Toolbar(
iconTintColorResource = R.color.icons,
contentDescription = context.getString(R.string.browser_menu_refresh)
) {
sessionUseCases.reload.invoke()
onItemTapped.invoke(Item.Reload)
}
BrowserMenuItemToolbar(listOf(back, forward, refresh))
@ -76,7 +65,7 @@ class Toolbar(
context.getString(R.string.browser_menu_help),
R.color.icons
) {
// TODO Help
onItemTapped.invoke(Item.Help)
},
BrowserMenuImageText(
@ -85,7 +74,7 @@ class Toolbar(
context.getString(R.string.browser_menu_settings),
R.color.icons
) {
openSettingsActivity()
onItemTapped.invoke(Item.Settings)
},
BrowserMenuImageText(
@ -94,17 +83,15 @@ class Toolbar(
context.getString(R.string.browser_menu_library),
R.color.icons
) {
// TODO Your Library
onItemTapped.invoke(Item.Library)
},
BrowserMenuDivider(),
BrowserMenuSwitch(context.getString(R.string.browser_menu_desktop_site), {
sessionManager.selectedSessionOrThrow.desktopMode
false
}) { checked ->
sessionUseCases.requestDesktopSite.invoke(checked)
}.apply {
visible = { sessionManager.selectedSession != null }
onItemTapped.invoke(Item.RequestDesktop(checked))
},
BrowserMenuImageText(
@ -113,9 +100,7 @@ class Toolbar(
context.getString(R.string.browser_menu_find_in_page),
R.color.icons
) {
FindInPageIntegration.launch?.invoke()
}.apply {
visible = { sessionManager.selectedSession != null }
onItemTapped.invoke(Item.FindInPage)
},
BrowserMenuImageText(
@ -124,7 +109,7 @@ class Toolbar(
context.getString(R.string.browser_menu_private_tab),
R.color.icons
) {
// TODO Private Tab
onItemTapped.invoke(Item.NewPrivateTab)
},
BrowserMenuImageText(
@ -133,7 +118,7 @@ class Toolbar(
context.getString(R.string.browser_menu_new_tab),
R.color.icons
) {
// TODO New Tab
onItemTapped.invoke(Item.NewTab)
},
BrowserMenuImageText(
@ -142,10 +127,7 @@ class Toolbar(
context.getString(R.string.browser_menu_share),
R.color.icons
) {
val url = sessionManager.selectedSession?.url ?: ""
context.share(url)
}.apply {
visible = { sessionManager.selectedSession != null }
onItemTapped.invoke(Item.Share)
},
BrowserMenuDivider(),
@ -153,10 +135,4 @@ class Toolbar(
menuToolbar
)
}
private fun openSettingsActivity() {
val intent = Intent(context, SettingsActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}

View File

@ -14,7 +14,6 @@ import mozilla.components.browser.domains.autocomplete.ShippedDomainsProvider
import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.support.ktx.android.content.res.pxToDp
import org.mozilla.fenix.R
import org.mozilla.fenix.components.toolbar.ToolbarIntegration
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.mvi.UIView
@ -65,6 +64,7 @@ class ToolbarUIView(
toolbarIntegration = ToolbarIntegration(
this,
view,
ToolbarMenu(this) { actionEmitter.onNext(SearchAction.ToolbarMenuItemTapped(it)) },
ShippedDomainsProvider().also { it.initialize(this) },
components.core.historyStorage,
components.core.sessionManager,

View File

@ -36,6 +36,13 @@
app:popUpTo="@id/homeFragment" />
</fragment>
<fragment
android:id="@+id/libraryFragment"
android:name="org.mozilla.fenix.library.LibraryFragment"
android:label="fragment_library"
tools:layout="@layout/fragment_library">
</fragment>
<fragment
android:id="@+id/browserFragment"
android:name="org.mozilla.fenix.browser.BrowserFragment"
@ -47,11 +54,16 @@
<action
android:id="@+id/action_browserFragment_to_searchFragment"
app:destination="@id/searchFragment" />
<action
android:id="@+id/action_browserFragment_to_libraryFragment"
app:destination="@id/libraryFragment" />
<action
android:id="@+id/action_browserFragment_to_settingsActivity"
app:destination="@id/settingsActivity" />
<argument android:name="session_id" app:argType="string" app:nullable="true" />
</fragment>
<activity
android:id="@+id/settingsActivity"
android:name="org.mozilla.fenix.settings.SettingsActivity"