@ -6,12 +6,18 @@ package org.mozilla.fenix.home
import android.content.Context
import androidx.core.content.ContextCompat.getColor
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.BrowserMenuHighlight
import mozilla.components.browser.menu.ext.getHighlight
import mozilla.components.browser.menu.item.BrowserMenuCategory
import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuHighlightableItem
import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.concept.sync.AccountObserver
import mozilla.components.concept.sync.AuthType
import mozilla.components.concept.sync.OAuthAccount
import mozilla.components.support.ktx.android.content.getColorFromAttr
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
@ -20,8 +26,11 @@ import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.whatsnew.WhatsNew
class HomeMenu (
private val lifecycleOwner : LifecycleOwner ,
private val context : Context ,
private val onItemTapped : ( Item ) -> Unit = { }
private val onItemTapped : ( Item ) -> Unit = { } ,
private val onMenuBuilderChanged : ( BrowserMenuBuilder ) -> Unit = { } ,
private val onHighlightPresent : ( BrowserMenuHighlight ) -> Unit = { }
) {
sealed class Item {
object WhatsNew : Item ( )
@ -34,9 +43,6 @@ class HomeMenu(
object Sync : Item ( )
}
val menuBuilder by lazy { BrowserMenuBuilder ( menuItems ) }
private val hasAccountProblem get ( ) = context . components . backgroundServices . accountManager . accountNeedsReauth ( )
private val primaryTextColor =
ThemeManager . resolveAttribute ( R . attr . primaryText , context )
private val syncDisconnectedColor = ThemeManager . resolveAttribute ( R . attr . syncDisconnected , context )
@ -45,21 +51,7 @@ class HomeMenu(
private val menuCategoryTextColor =
ThemeManager . resolveAttribute ( R . attr . menuCategoryText , context )
private val menuItems by lazy {
val reconnectToSyncItem = BrowserMenuHighlightableItem (
context . getString ( R . string . sync _reconnect ) ,
R . drawable . ic _sync _disconnected ,
iconTintColorResource = syncDisconnectedColor ,
textColorResource = primaryTextColor ,
highlight = BrowserMenuHighlight . HighPriority (
backgroundTint = syncDisconnectedBackgroundColor
) ,
isHighlighted = { true }
) {
onItemTapped . invoke ( Item . Sync )
}
private val coreMenuItems by lazy {
val whatsNewItem = BrowserMenuHighlightableItem (
context . getString ( R . string . browser _menu _whats _new ) ,
R . drawable . ic _whats _new ,
@ -103,16 +95,7 @@ class HomeMenu(
onItemTapped . invoke ( Item . Help )
}
val quitItem = BrowserMenuImageText (
context . getString ( R . string . delete _browsing _data _on _quit _action ) ,
R . drawable . ic _exit ,
primaryTextColor
) {
onItemTapped . invoke ( Item . Quit )
}
val items = listOfNotNull (
if ( hasAccountProblem ) reconnectToSyncItem else null ,
listOfNotNull (
whatsNewItem ,
BrowserMenuDivider ( ) ,
BrowserMenuCategory (
@ -125,8 +108,66 @@ class HomeMenu(
settingsItem ,
helpItem ,
if ( Settings . getInstance ( context ) . shouldDeleteBrowsingDataOnQuit ) quitItem else null
)
) . also { items ->
items . getHighlight ( ) ?. let { onHighlightPresent ( it ) }
}
}
init {
// Report initial state.
onMenuBuilderChanged ( BrowserMenuBuilder ( coreMenuItems ) )
// Observe account state changes, and update menu item builder with a new set of items.
context . components . backgroundServices . accountManagerAvailableQueue . runIfReadyOrQueue {
// This task isn't relevant if our parent fragment isn't around anymore.
if ( lifecycleOwner . lifecycle . currentState == Lifecycle . State . DESTROYED ) {
return @runIfReadyOrQueue
}
context . components . backgroundServices . accountManager . register ( object : AccountObserver {
override fun onAuthenticationProblems ( ) {
onMenuBuilderChanged ( BrowserMenuBuilder (
listOf ( reconnectToSyncItem ) + coreMenuItems
) )
}
override fun onAuthenticated ( account : OAuthAccount , authType : AuthType ) {
onMenuBuilderChanged ( BrowserMenuBuilder (
coreMenuItems
) )
}
override fun onLoggedOut ( ) {
onMenuBuilderChanged ( BrowserMenuBuilder (
coreMenuItems
) )
}
} , lifecycleOwner )
}
}
// 'Reconnect' and 'Quit' items aren't needed most of the time, so we'll only create the if necessary.
private val reconnectToSyncItem by lazy {
BrowserMenuHighlightableItem (
context . getString ( R . string . sync _reconnect ) ,
R . drawable . ic _sync _disconnected ,
iconTintColorResource = syncDisconnectedColor ,
textColorResource = primaryTextColor ,
highlight = BrowserMenuHighlight . HighPriority (
backgroundTint = syncDisconnectedBackgroundColor
) ,
isHighlighted = { true }
) {
onItemTapped . invoke ( Item . Sync )
}
}
items
private val quitItem by lazy {
BrowserMenuImageText (
context . getString ( R . string . delete _browsing _data _on _quit _action ) ,
R . drawable . ic _exit ,
primaryTextColor
) {
onItemTapped . invoke ( Item . Quit )
}
}
}