@ -57,7 +57,7 @@ import org.mozilla.fenix.utils.BrowsersCache
* @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 .
* /
* /
@Suppress ( " LargeClass " , " LongParameterList " )
@Suppress ( " LargeClass " , " LongParameterList " , " TooManyFunctions " )
@ExperimentalCoroutinesApi
@ExperimentalCoroutinesApi
open class DefaultToolbarMenu (
open class DefaultToolbarMenu (
private val context : Context ,
private val context : Context ,
@ -78,8 +78,7 @@ open class DefaultToolbarMenu(
private val selectedSession : TabSessionState ?
private val selectedSession : TabSessionState ?
get ( ) = store . state . selectedTab
get ( ) = store . state . selectedTab
private val primaryTextColor =
private val accountManager = context . components . backgroundServices . accountManager
ThemeManager . resolveAttribute ( R . attr . primaryText , context )
override val menuBuilder by lazy {
override val menuBuilder by lazy {
WebExtensionBrowserMenuBuilder (
WebExtensionBrowserMenuBuilder (
@ -91,7 +90,7 @@ open class DefaultToolbarMenu(
} ,
} ,
endOfMenuAlwaysVisible = shouldUseBottomToolbar ,
endOfMenuAlwaysVisible = shouldUseBottomToolbar ,
store = store ,
store = store ,
webExtIconTintColorResource = primaryTextColor ,
webExtIconTintColorResource = primaryTextColor () ,
onAddonsManagerTapped = {
onAddonsManagerTapped = {
onItemTapped . invoke ( ToolbarMenu . Item . AddonsManager )
onItemTapped . invoke ( ToolbarMenu . Item . AddonsManager )
} ,
} ,
@ -103,7 +102,7 @@ open class DefaultToolbarMenu(
val back = BrowserMenuItemToolbar . TwoStateButton (
val back = BrowserMenuItemToolbar . TwoStateButton (
primaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _back ,
primaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _back ,
primaryContentDescription = context . getString ( R . string . browser _menu _back ) ,
primaryContentDescription = context . getString ( R . string . browser _menu _back ) ,
primaryImageTintResource = primaryTextColor ,
primaryImageTintResource = primaryTextColor () ,
isInPrimaryState = {
isInPrimaryState = {
selectedSession ?. content ?. canGoBack ?: true
selectedSession ?. content ?. canGoBack ?: true
} ,
} ,
@ -117,7 +116,7 @@ open class DefaultToolbarMenu(
val forward = BrowserMenuItemToolbar . TwoStateButton (
val forward = BrowserMenuItemToolbar . TwoStateButton (
primaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _forward ,
primaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _forward ,
primaryContentDescription = context . getString ( R . string . browser _menu _forward ) ,
primaryContentDescription = context . getString ( R . string . browser _menu _forward ) ,
primaryImageTintResource = primaryTextColor ,
primaryImageTintResource = primaryTextColor () ,
isInPrimaryState = {
isInPrimaryState = {
selectedSession ?. content ?. canGoForward ?: true
selectedSession ?. content ?. canGoForward ?: true
} ,
} ,
@ -131,13 +130,13 @@ open class DefaultToolbarMenu(
val refresh = BrowserMenuItemToolbar . TwoStateButton (
val refresh = BrowserMenuItemToolbar . TwoStateButton (
primaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _refresh ,
primaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _refresh ,
primaryContentDescription = context . getString ( R . string . browser _menu _refresh ) ,
primaryContentDescription = context . getString ( R . string . browser _menu _refresh ) ,
primaryImageTintResource = primaryTextColor ,
primaryImageTintResource = primaryTextColor () ,
isInPrimaryState = {
isInPrimaryState = {
selectedSession ?. content ?. loading == false
selectedSession ?. content ?. loading == false
} ,
} ,
secondaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _stop ,
secondaryImageResource = mozilla . components . ui . icons . R . drawable . mozac _ic _stop ,
secondaryContentDescription = context . getString ( R . string . browser _menu _stop ) ,
secondaryContentDescription = context . getString ( R . string . browser _menu _stop ) ,
secondaryImageTintResource = primaryTextColor ,
secondaryImageTintResource = primaryTextColor () ,
disableInSecondaryState = false ,
disableInSecondaryState = false ,
longClickListener = { onItemTapped . invoke ( ToolbarMenu . Item . Reload ( bypassCache = true ) ) }
longClickListener = { onItemTapped . invoke ( ToolbarMenu . Item . Reload ( bypassCache = true ) ) }
) {
) {
@ -151,7 +150,7 @@ open class DefaultToolbarMenu(
val share = BrowserMenuItemToolbar . Button (
val share = BrowserMenuItemToolbar . Button (
imageResource = R . drawable . ic _share _filled ,
imageResource = R . drawable . ic _share _filled ,
contentDescription = context . getString ( R . string . browser _menu _share ) ,
contentDescription = context . getString ( R . string . browser _menu _share ) ,
iconTintColorResource = primaryTextColor ,
iconTintColorResource = primaryTextColor () ,
listener = {
listener = {
onItemTapped . invoke ( ToolbarMenu . Item . Share )
onItemTapped . invoke ( ToolbarMenu . Item . Share )
}
}
@ -165,14 +164,14 @@ open class DefaultToolbarMenu(
val bookmark = BrowserMenuItemToolbar . TwoStateButton (
val bookmark = BrowserMenuItemToolbar . TwoStateButton (
primaryImageResource = R . drawable . ic _bookmark _filled ,
primaryImageResource = R . drawable . ic _bookmark _filled ,
primaryContentDescription = context . getString ( R . string . browser _menu _edit _bookmark ) ,
primaryContentDescription = context . getString ( R . string . browser _menu _edit _bookmark ) ,
primaryImageTintResource = primaryTextColor ,
primaryImageTintResource = primaryTextColor () ,
// TwoStateButton.isInPrimaryState must be synchronous, and checking bookmark state is
// TwoStateButton.isInPrimaryState must be synchronous, and checking bookmark state is
// relatively slow. The best we can do here is periodically compute and cache a new "is
// relatively slow. The best we can do here is periodically compute and cache a new "is
// bookmarked" state, and use that whenever the menu has been opened.
// bookmarked" state, and use that whenever the menu has been opened.
isInPrimaryState = { isCurrentUrlBookmarked } ,
isInPrimaryState = { isCurrentUrlBookmarked } ,
secondaryImageResource = R . drawable . ic _bookmark _outline ,
secondaryImageResource = R . drawable . ic _bookmark _outline ,
secondaryContentDescription = context . getString ( R . string . browser _menu _bookmark ) ,
secondaryContentDescription = context . getString ( R . string . browser _menu _bookmark ) ,
secondaryImageTintResource = primaryTextColor ,
secondaryImageTintResource = primaryTextColor () ,
disableInSecondaryState = false
disableInSecondaryState = false
) {
) {
handleBookmarkItemTapped ( )
handleBookmarkItemTapped ( )
@ -208,7 +207,7 @@ open class DefaultToolbarMenu(
val installToHomescreen = BrowserMenuHighlightableItem (
val installToHomescreen = BrowserMenuHighlightableItem (
label = context . getString ( R . string . browser _menu _install _on _homescreen ) ,
label = context . getString ( R . string . browser _menu _install _on _homescreen ) ,
startImageResource = R . drawable . ic _add _to _homescreen ,
startImageResource = R . drawable . ic _add _to _homescreen ,
iconTintColorResource = primaryTextColor ,
iconTintColorResource = primaryTextColor () ,
highlight = BrowserMenuHighlight . LowPriority (
highlight = BrowserMenuHighlight . LowPriority (
label = context . getString ( R . string . browser _menu _install _on _homescreen ) ,
label = context . getString ( R . string . browser _menu _install _on _homescreen ) ,
notificationTint = getColor ( context , R . color . whats _new _notification _color )
notificationTint = getColor ( context , R . color . whats _new _notification _color )
@ -226,10 +225,10 @@ open class DefaultToolbarMenu(
startImageResource = R . drawable . ic _settings ,
startImageResource = R . drawable . ic _settings ,
iconTintColorResource = if ( hasAccountProblem )
iconTintColorResource = if ( hasAccountProblem )
ThemeManager . resolveAttribute ( R . attr . syncDisconnected , context ) else
ThemeManager . resolveAttribute ( R . attr . syncDisconnected , context ) else
primaryTextColor ,
primaryTextColor () ,
textColorResource = if ( hasAccountProblem )
textColorResource = if ( hasAccountProblem )
ThemeManager . resolveAttribute ( R . attr . primaryText , context ) else
ThemeManager . resolveAttribute ( R . attr . primaryText , context ) else
primaryTextColor ,
primaryTextColor () ,
highlight = BrowserMenuHighlight . HighPriority (
highlight = BrowserMenuHighlight . HighPriority (
endImageResource = R . drawable . ic _sync _disconnected ,
endImageResource = R . drawable . ic _sync _disconnected ,
backgroundTint = context . getColorFromAttr ( R . attr . syncDisconnectedBackground ) ,
backgroundTint = context . getColorFromAttr ( R . attr . syncDisconnectedBackground ) ,
@ -253,7 +252,7 @@ open class DefaultToolbarMenu(
val addToTopSites = BrowserMenuImageText (
val addToTopSites = BrowserMenuImageText (
label = context . getString ( R . string . browser _menu _add _to _top _sites ) ,
label = context . getString ( R . string . browser _menu _add _to _top _sites ) ,
imageResource = R . drawable . ic _top _sites ,
imageResource = R . drawable . ic _top _sites ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . AddToTopSites )
onItemTapped . invoke ( ToolbarMenu . Item . AddToTopSites )
}
}
@ -261,7 +260,7 @@ open class DefaultToolbarMenu(
val addToHomescreen = BrowserMenuImageText (
val addToHomescreen = BrowserMenuImageText (
label = context . getString ( R . string . browser _menu _add _to _homescreen ) ,
label = context . getString ( R . string . browser _menu _add _to _homescreen ) ,
imageResource = R . drawable . ic _add _to _homescreen ,
imageResource = R . drawable . ic _add _to _homescreen ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . AddToHomeScreen )
onItemTapped . invoke ( ToolbarMenu . Item . AddToHomeScreen )
}
}
@ -269,7 +268,7 @@ open class DefaultToolbarMenu(
val syncedTabs = BrowserMenuImageText (
val syncedTabs = BrowserMenuImageText (
label = context . getString ( R . string . synced _tabs ) ,
label = context . getString ( R . string . synced _tabs ) ,
imageResource = R . drawable . ic _synced _tabs ,
imageResource = R . drawable . ic _synced _tabs ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . SyncedTabs )
onItemTapped . invoke ( ToolbarMenu . Item . SyncedTabs )
}
}
@ -277,7 +276,7 @@ open class DefaultToolbarMenu(
val findInPage = BrowserMenuImageText (
val findInPage = BrowserMenuImageText (
label = context . getString ( R . string . browser _menu _find _in _page ) ,
label = context . getString ( R . string . browser _menu _find _in _page ) ,
imageResource = R . drawable . mozac _ic _search ,
imageResource = R . drawable . mozac _ic _search ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . FindInPage )
onItemTapped . invoke ( ToolbarMenu . Item . FindInPage )
}
}
@ -289,7 +288,7 @@ open class DefaultToolbarMenu(
val saveToCollection = BrowserMenuImageText (
val saveToCollection = BrowserMenuImageText (
label = context . getString ( R . string . browser _menu _save _to _collection _2 ) ,
label = context . getString ( R . string . browser _menu _save _to _collection _2 ) ,
imageResource = R . drawable . ic _tab _collection ,
imageResource = R . drawable . ic _tab _collection ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . SaveToCollection )
onItemTapped . invoke ( ToolbarMenu . Item . SaveToCollection )
}
}
@ -297,7 +296,7 @@ open class DefaultToolbarMenu(
val deleteDataOnQuit = BrowserMenuImageText (
val deleteDataOnQuit = BrowserMenuImageText (
label = context . getString ( R . string . delete _browsing _data _on _quit _action ) ,
label = context . getString ( R . string . delete _browsing _data _on _quit _action ) ,
imageResource = R . drawable . ic _exit ,
imageResource = R . drawable . ic _exit ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . Quit )
onItemTapped . invoke ( ToolbarMenu . Item . Quit )
}
}
@ -305,7 +304,7 @@ open class DefaultToolbarMenu(
val readerAppearance = BrowserMenuImageText (
val readerAppearance = BrowserMenuImageText (
label = context . getString ( R . string . browser _menu _read _appearance ) ,
label = context . getString ( R . string . browser _menu _read _appearance ) ,
imageResource = R . drawable . ic _readermode _appearance ,
imageResource = R . drawable . ic _readermode _appearance ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . CustomizeReaderView )
onItemTapped . invoke ( ToolbarMenu . Item . CustomizeReaderView )
}
}
@ -313,7 +312,7 @@ open class DefaultToolbarMenu(
val openInApp = BrowserMenuHighlightableItem (
val openInApp = BrowserMenuHighlightableItem (
label = context . getString ( R . string . browser _menu _open _app _link ) ,
label = context . getString ( R . string . browser _menu _open _app _link ) ,
startImageResource = R . drawable . ic _open _in _app ,
startImageResource = R . drawable . ic _open _in _app ,
iconTintColorResource = primaryTextColor ,
iconTintColorResource = primaryTextColor () ,
highlight = BrowserMenuHighlight . LowPriority (
highlight = BrowserMenuHighlight . LowPriority (
label = context . getString ( R . string . browser _menu _open _app _link ) ,
label = context . getString ( R . string . browser _menu _open _app _link ) ,
notificationTint = getColor ( context , R . color . whats _new _notification _color )
notificationTint = getColor ( context , R . color . whats _new _notification _color )
@ -326,7 +325,7 @@ open class DefaultToolbarMenu(
val historyItem = BrowserMenuImageText (
val historyItem = BrowserMenuImageText (
context . getString ( R . string . library _history ) ,
context . getString ( R . string . library _history ) ,
R . drawable . ic _history ,
R . drawable . ic _history ,
primaryTextColor
primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . History )
onItemTapped . invoke ( ToolbarMenu . Item . History )
}
}
@ -334,7 +333,7 @@ open class DefaultToolbarMenu(
val bookmarksItem = BrowserMenuImageText (
val bookmarksItem = BrowserMenuImageText (
context . getString ( R . string . library _bookmarks ) ,
context . getString ( R . string . library _bookmarks ) ,
R . drawable . ic _bookmark _filled ,
R . drawable . ic _bookmark _filled ,
primaryTextColor
primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . Bookmarks )
onItemTapped . invoke ( ToolbarMenu . Item . Bookmarks )
}
}
@ -342,7 +341,7 @@ open class DefaultToolbarMenu(
val downloadsItem = BrowserMenuImageText (
val downloadsItem = BrowserMenuImageText (
context . getString ( R . string . library _downloads ) ,
context . getString ( R . string . library _downloads ) ,
R . drawable . ic _download ,
R . drawable . ic _download ,
primaryTextColor
primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . Downloads )
onItemTapped . invoke ( ToolbarMenu . Item . Downloads )
}
}
@ -410,35 +409,6 @@ open class DefaultToolbarMenu(
id = WebExtensionPlaceholderMenuItem . MAIN _EXTENSIONS _MENU _ID
id = WebExtensionPlaceholderMenuItem . MAIN _EXTENSIONS _MENU _ID
)
)
val accountManager = context . components . backgroundServices . accountManager
val account = accountManager . authenticatedAccount ( )
val syncItemTitle = if ( account != null && accountManager . accountProfile ( ) ?. email != null ) {
context . getString ( R . string . sync _signed _as , accountManager . accountProfile ( ) ?. email )
} else {
context . getString ( R . string . sync _menu _sign _in )
}
val syncTabsOrSignInItem =
if ( tabsTrayRewrite ) {
// If synced tabs are being shown in tabs tray, show sync sign in here.
BrowserMenuImageText (
syncItemTitle ,
R . drawable . ic _synced _tabs ,
primaryTextColor ( )
) {
onItemTapped . invoke ( ToolbarMenu . Item . SyncAccount )
}
} else {
// If synced tabs are not shown in tabs tray, they should be shown here.
BrowserMenuImageText (
context . getString ( R . string . synced _tabs ) ,
R . drawable . ic _synced _tabs ,
primaryTextColor ( )
) {
onItemTapped . invoke ( ToolbarMenu . Item . SyncedTabs )
}
}
val findInPageItem = BrowserMenuImageText (
val findInPageItem = BrowserMenuImageText (
label = context . getString ( R . string . browser _menu _find _in _page ) ,
label = context . getString ( R . string . browser _menu _find _in _page ) ,
imageResource = R . drawable . mozac _ic _search ,
imageResource = R . drawable . mozac _ic _search ,
@ -512,10 +482,10 @@ open class DefaultToolbarMenu(
startImageResource = R . drawable . ic _settings ,
startImageResource = R . drawable . ic _settings ,
iconTintColorResource = if ( hasAccountProblem )
iconTintColorResource = if ( hasAccountProblem )
ThemeManager . resolveAttribute ( R . attr . syncDisconnected , context ) else
ThemeManager . resolveAttribute ( R . attr . syncDisconnected , context ) else
primaryTextColor ,
primaryTextColor () ,
textColorResource = if ( hasAccountProblem )
textColorResource = if ( hasAccountProblem )
ThemeManager . resolveAttribute ( R . attr . primaryText , context ) else
ThemeManager . resolveAttribute ( R . attr . primaryText , context ) else
primaryTextColor ,
primaryTextColor () ,
highlight = BrowserMenuHighlight . HighPriority (
highlight = BrowserMenuHighlight . HighPriority (
endImageResource = R . drawable . ic _sync _disconnected ,
endImageResource = R . drawable . ic _sync _disconnected ,
backgroundTint = context . getColorFromAttr ( R . attr . syncDisconnectedBackground ) ,
backgroundTint = context . getColorFromAttr ( R . attr . syncDisconnectedBackground ) ,
@ -546,11 +516,38 @@ open class DefaultToolbarMenu(
val deleteDataOnQuit = BrowserMenuImageText (
val deleteDataOnQuit = BrowserMenuImageText (
label = context . getString ( R . string . delete _browsing _data _on _quit _action ) ,
label = context . getString ( R . string . delete _browsing _data _on _quit _action ) ,
imageResource = R . drawable . ic _exit ,
imageResource = R . drawable . ic _exit ,
iconTintColorResource = primaryTextColor
iconTintColorResource = primaryTextColor ( )
) {
) {
onItemTapped . invoke ( ToolbarMenu . Item . Quit )
onItemTapped . invoke ( ToolbarMenu . Item . Quit )
}
}
val syncedTabsItem = BrowserMenuImageText (
context . getString ( R . string . synced _tabs ) ,
R . drawable . ic _synced _tabs ,
primaryTextColor ( )
) {
onItemTapped . invoke ( ToolbarMenu . Item . SyncedTabs )
}
private fun getSyncItemTitle ( ) : String {
val authenticatedAccount = accountManager . authenticatedAccount ( ) != null
val email = accountManager . accountProfile ( ) ?. email
return if ( authenticatedAccount && email != null ) {
email
} else {
context . getString ( R . string . sync _menu _sign _in )
}
}
val syncMenuItem = BrowserMenuImageText (
getSyncItemTitle ( ) ,
R . drawable . ic _synced _tabs ,
primaryTextColor ( )
) {
onItemTapped . invoke ( ToolbarMenu . Item . SyncAccount )
}
@VisibleForTesting ( otherwise = PRIVATE )
@VisibleForTesting ( otherwise = PRIVATE )
val newCoreMenuItems by lazy {
val newCoreMenuItems by lazy {
val menuItems =
val menuItems =
@ -562,7 +559,7 @@ open class DefaultToolbarMenu(
historyItem ,
historyItem ,
downloadsItem ,
downloadsItem ,
extensionsItem ,
extensionsItem ,
sync TabsOrSignIn Item,
if ( tabsTrayRewrite ) sync MenuItem else synced TabsItem,
BrowserMenuDivider ( ) ,
BrowserMenuDivider ( ) ,
findInPageItem ,
findInPageItem ,
desktopSiteItem ,
desktopSiteItem ,
@ -623,6 +620,7 @@ open class DefaultToolbarMenu(
. any { it . url == newUrl }
. any { it . url == newUrl }
}
}
}
}
private fun getSetDefaultBrowserItem ( ) : BrowserMenuImageText ? {
private fun getSetDefaultBrowserItem ( ) : BrowserMenuImageText ? {
val experiments = context . components . analytics . experiments
val experiments = context . components . analytics . experiments
val browsers = BrowsersCache . all ( context )
val browsers = BrowsersCache . all ( context )