|
|
@ -23,12 +23,14 @@ import mozilla.components.browser.menu.item.BrowserMenuImageSwitch
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuImageText
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuImageText
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuImageTextCheckboxButton
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuImageTextCheckboxButton
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuItemToolbar
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuItemToolbar
|
|
|
|
|
|
|
|
import mozilla.components.browser.menu.item.TwoStateBrowserMenuImageText
|
|
|
|
import mozilla.components.browser.menu.item.WebExtensionPlaceholderMenuItem
|
|
|
|
import mozilla.components.browser.menu.item.WebExtensionPlaceholderMenuItem
|
|
|
|
import mozilla.components.browser.state.selector.findTab
|
|
|
|
import mozilla.components.browser.state.selector.findTab
|
|
|
|
import mozilla.components.browser.state.selector.selectedTab
|
|
|
|
import mozilla.components.browser.state.selector.selectedTab
|
|
|
|
import mozilla.components.browser.state.state.TabSessionState
|
|
|
|
import mozilla.components.browser.state.state.TabSessionState
|
|
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
|
|
import mozilla.components.concept.storage.BookmarksStorage
|
|
|
|
import mozilla.components.concept.storage.BookmarksStorage
|
|
|
|
|
|
|
|
import mozilla.components.feature.top.sites.PinnedSiteStorage
|
|
|
|
import mozilla.components.feature.webcompat.reporter.WebCompatReporterFeature
|
|
|
|
import mozilla.components.feature.webcompat.reporter.WebCompatReporterFeature
|
|
|
|
import mozilla.components.lib.state.ext.flowScoped
|
|
|
|
import mozilla.components.lib.state.ext.flowScoped
|
|
|
|
import mozilla.components.support.ktx.android.content.getColorFromAttr
|
|
|
|
import mozilla.components.support.ktx.android.content.getColorFromAttr
|
|
|
@ -48,6 +50,7 @@ import org.mozilla.fenix.utils.BrowsersCache
|
|
|
|
* @param store reference to the application's [BrowserStore].
|
|
|
|
* @param store reference to the application's [BrowserStore].
|
|
|
|
* @param hasAccountProblem If true, there was a problem signing into the Firefox account.
|
|
|
|
* @param hasAccountProblem If true, there was a problem signing into the Firefox account.
|
|
|
|
* @param shouldReverseItems If true, reverse the menu items.
|
|
|
|
* @param shouldReverseItems If true, reverse the menu items.
|
|
|
|
|
|
|
|
* @param pinnedSiteStorage Used to check if the current url is a pinned site.
|
|
|
|
* @param onItemTapped Called when a menu item is tapped.
|
|
|
|
* @param onItemTapped Called when a menu item is tapped.
|
|
|
|
* @param lifecycleOwner View lifecycle owner used to determine when to cancel UI jobs.
|
|
|
|
* @param lifecycleOwner View lifecycle owner used to determine when to cancel UI jobs.
|
|
|
|
* @param bookmarksStorage Used to check if a page is bookmarked.
|
|
|
|
* @param bookmarksStorage Used to check if a page is bookmarked.
|
|
|
@ -60,9 +63,11 @@ open class DefaultToolbarMenu(
|
|
|
|
private val onItemTapped: (ToolbarMenu.Item) -> Unit = {},
|
|
|
|
private val onItemTapped: (ToolbarMenu.Item) -> Unit = {},
|
|
|
|
private val lifecycleOwner: LifecycleOwner,
|
|
|
|
private val lifecycleOwner: LifecycleOwner,
|
|
|
|
private val bookmarksStorage: BookmarksStorage,
|
|
|
|
private val bookmarksStorage: BookmarksStorage,
|
|
|
|
|
|
|
|
private val pinnedSiteStorage: PinnedSiteStorage,
|
|
|
|
val isPinningSupported: Boolean
|
|
|
|
val isPinningSupported: Boolean
|
|
|
|
) : ToolbarMenu {
|
|
|
|
) : ToolbarMenu {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private var isCurrentUrlPinned = false
|
|
|
|
private var isCurrentUrlBookmarked = false
|
|
|
|
private var isCurrentUrlBookmarked = false
|
|
|
|
private var isBookmarkedJob: Job? = null
|
|
|
|
private var isBookmarkedJob: Job? = null
|
|
|
|
|
|
|
|
|
|
|
@ -271,13 +276,23 @@ open class DefaultToolbarMenu(
|
|
|
|
onItemTapped.invoke(ToolbarMenu.Item.AddToHomeScreen)
|
|
|
|
onItemTapped.invoke(ToolbarMenu.Item.AddToHomeScreen)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
val addToTopSitesItem = BrowserMenuImageText(
|
|
|
|
val addRemoveTopSitesItem = TwoStateBrowserMenuImageText(
|
|
|
|
label = context.getString(R.string.browser_menu_add_to_top_sites),
|
|
|
|
primaryLabel = context.getString(R.string.browser_menu_add_to_top_sites),
|
|
|
|
imageResource = R.drawable.ic_top_sites,
|
|
|
|
secondaryLabel = context.getString(R.string.browser_menu_remove_from_top_sites),
|
|
|
|
iconTintColorResource = primaryTextColor()
|
|
|
|
primaryStateIconResource = R.drawable.ic_top_sites,
|
|
|
|
) {
|
|
|
|
secondaryStateIconResource = R.drawable.ic_top_sites,
|
|
|
|
onItemTapped.invoke(ToolbarMenu.Item.AddToTopSites)
|
|
|
|
iconTintColorResource = primaryTextColor(),
|
|
|
|
}
|
|
|
|
isInPrimaryState = { !isCurrentUrlPinned },
|
|
|
|
|
|
|
|
isInSecondaryState = { isCurrentUrlPinned },
|
|
|
|
|
|
|
|
primaryStateAction = {
|
|
|
|
|
|
|
|
isCurrentUrlPinned = true
|
|
|
|
|
|
|
|
onItemTapped.invoke(ToolbarMenu.Item.AddToTopSites)
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
secondaryStateAction = {
|
|
|
|
|
|
|
|
isCurrentUrlPinned = false
|
|
|
|
|
|
|
|
onItemTapped.invoke(ToolbarMenu.Item.RemoveFromTopSites)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
val saveToCollectionItem = BrowserMenuImageText(
|
|
|
|
val saveToCollectionItem = BrowserMenuImageText(
|
|
|
|
label = context.getString(R.string.browser_menu_save_to_collection_2),
|
|
|
|
label = context.getString(R.string.browser_menu_save_to_collection_2),
|
|
|
@ -367,7 +382,7 @@ open class DefaultToolbarMenu(
|
|
|
|
BrowserMenuDivider(),
|
|
|
|
BrowserMenuDivider(),
|
|
|
|
addToHomeScreenItem.apply { visible = ::canAddToHomescreen },
|
|
|
|
addToHomeScreenItem.apply { visible = ::canAddToHomescreen },
|
|
|
|
installToHomescreen.apply { visible = ::canInstall },
|
|
|
|
installToHomescreen.apply { visible = ::canInstall },
|
|
|
|
addToTopSitesItem,
|
|
|
|
addRemoveTopSitesItem,
|
|
|
|
saveToCollectionItem,
|
|
|
|
saveToCollectionItem,
|
|
|
|
BrowserMenuDivider(),
|
|
|
|
BrowserMenuDivider(),
|
|
|
|
settingsItem,
|
|
|
|
settingsItem,
|
|
|
@ -392,6 +407,15 @@ open class DefaultToolbarMenu(
|
|
|
|
@VisibleForTesting
|
|
|
|
@VisibleForTesting
|
|
|
|
internal fun menuItemButtonTintColor() = ThemeManager.resolveAttribute(R.attr.menuItemButtonTintColor, context)
|
|
|
|
internal fun menuItemButtonTintColor() = ThemeManager.resolveAttribute(R.attr.menuItemButtonTintColor, context)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@VisibleForTesting
|
|
|
|
|
|
|
|
internal fun updateIsCurrentUrlPinned(currentUrl: String) {
|
|
|
|
|
|
|
|
lifecycleOwner.lifecycleScope.launch {
|
|
|
|
|
|
|
|
isCurrentUrlPinned = pinnedSiteStorage
|
|
|
|
|
|
|
|
.getPinnedSites()
|
|
|
|
|
|
|
|
.find { it.url == currentUrl } != null
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@VisibleForTesting
|
|
|
|
@VisibleForTesting
|
|
|
|
internal fun registerForIsBookmarkedUpdates() {
|
|
|
|
internal fun registerForIsBookmarkedUpdates() {
|
|
|
|
store.flowScoped(lifecycleOwner) { flow ->
|
|
|
|
store.flowScoped(lifecycleOwner) { flow ->
|
|
|
@ -403,6 +427,9 @@ open class DefaultToolbarMenu(
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.collect {
|
|
|
|
.collect {
|
|
|
|
|
|
|
|
isCurrentUrlPinned = false
|
|
|
|
|
|
|
|
updateIsCurrentUrlPinned(it.content.url)
|
|
|
|
|
|
|
|
|
|
|
|
isCurrentUrlBookmarked = false
|
|
|
|
isCurrentUrlBookmarked = false
|
|
|
|
updateCurrentUrlIsBookmarked(it.content.url)
|
|
|
|
updateCurrentUrlIsBookmarked(it.content.url)
|
|
|
|
}
|
|
|
|
}
|
|
|
|