2019-04-05 23:33:02 +02:00
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
package org.mozilla.fenix.components.toolbar
|
|
|
|
|
2020-06-11 00:34:26 +02:00
|
|
|
import android.content.Context
|
2019-04-05 23:33:02 +02:00
|
|
|
import android.util.TypedValue
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2020-06-11 00:34:26 +02:00
|
|
|
import mozilla.components.browser.menu.BrowserMenu
|
|
|
|
import mozilla.components.browser.menu.BrowserMenuBuilder
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuDivider
|
|
|
|
import mozilla.components.browser.menu.item.BrowserMenuImageText
|
2019-04-05 23:33:02 +02:00
|
|
|
import mozilla.components.browser.session.Session
|
|
|
|
import mozilla.components.browser.session.SessionManager
|
|
|
|
import mozilla.components.concept.toolbar.Toolbar
|
2020-06-11 00:34:26 +02:00
|
|
|
import org.mozilla.fenix.R
|
2020-06-12 21:28:38 +02:00
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
import org.mozilla.fenix.ext.components
|
2019-08-27 22:04:03 +02:00
|
|
|
import org.mozilla.fenix.ext.sessionsOfType
|
2020-06-25 17:25:16 +02:00
|
|
|
import org.mozilla.fenix.ext.settings
|
2020-06-11 00:34:26 +02:00
|
|
|
import org.mozilla.fenix.theme.ThemeManager
|
2019-04-05 23:33:02 +02:00
|
|
|
import java.lang.ref.WeakReference
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A [Toolbar.Action] implementation that shows a [TabCounter].
|
|
|
|
*/
|
|
|
|
class TabCounterToolbarButton(
|
|
|
|
private val sessionManager: SessionManager,
|
2019-12-17 21:26:46 +01:00
|
|
|
private val isPrivate: Boolean,
|
2020-06-11 00:34:26 +02:00
|
|
|
private val onItemTapped: (TabCounterMenuItem) -> Unit = {},
|
2019-12-17 21:26:46 +01:00
|
|
|
private val showTabs: () -> Unit
|
2019-04-05 23:33:02 +02:00
|
|
|
) : Toolbar.Action {
|
|
|
|
private var reference: WeakReference<TabCounter> = WeakReference<TabCounter>(null)
|
|
|
|
|
|
|
|
override fun createView(parent: ViewGroup): View {
|
2019-05-02 21:36:22 +02:00
|
|
|
sessionManager.register(sessionManagerObserver, view = parent)
|
2019-04-05 23:33:02 +02:00
|
|
|
|
|
|
|
val view = TabCounter(parent.context).apply {
|
|
|
|
reference = WeakReference(this)
|
|
|
|
setOnClickListener {
|
|
|
|
showTabs.invoke()
|
|
|
|
}
|
2019-08-22 07:36:01 +02:00
|
|
|
|
2020-06-11 00:34:26 +02:00
|
|
|
setOnLongClickListener {
|
|
|
|
getTabContextMenu(it.context).show(it)
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
2019-06-13 23:09:59 +02:00
|
|
|
addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
|
|
|
|
override fun onViewAttachedToWindow(v: View?) {
|
2019-08-27 22:04:03 +02:00
|
|
|
setCount(sessionManager.sessionsOfType(private = isPrivate).count())
|
2019-06-13 23:09:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onViewDetachedFromWindow(v: View?) { /* no-op */ }
|
|
|
|
})
|
2019-04-05 23:33:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Set selectableItemBackgroundBorderless
|
|
|
|
val outValue = TypedValue()
|
|
|
|
parent.context.theme.resolveAttribute(
|
|
|
|
android.R.attr.selectableItemBackgroundBorderless,
|
|
|
|
outValue,
|
|
|
|
true
|
|
|
|
)
|
|
|
|
view.setBackgroundResource(outValue.resourceId)
|
|
|
|
return view
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun bind(view: View) = Unit
|
|
|
|
|
|
|
|
private fun updateCount() {
|
2019-08-27 22:04:03 +02:00
|
|
|
val count = sessionManager.sessionsOfType(private = isPrivate).count()
|
2019-08-22 07:36:01 +02:00
|
|
|
|
|
|
|
reference.get()?.let {
|
|
|
|
it.setCountWithAnimation(count)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-11 00:34:26 +02:00
|
|
|
private fun getTabContextMenu(context: Context): BrowserMenu {
|
|
|
|
val primaryTextColor = ThemeManager.resolveAttribute(R.attr.primaryText, context)
|
2020-06-12 21:28:38 +02:00
|
|
|
val metrics = context.components.analytics.metrics
|
2020-06-11 00:34:26 +02:00
|
|
|
val menuItems = listOf(
|
|
|
|
BrowserMenuImageText(
|
|
|
|
label = context.getString(R.string.browser_menu_new_tab),
|
|
|
|
imageResource = R.drawable.ic_new,
|
|
|
|
iconTintColorResource = primaryTextColor,
|
|
|
|
textColorResource = primaryTextColor
|
|
|
|
) {
|
2020-06-12 21:28:38 +02:00
|
|
|
metrics.track(Event.TabCounterMenuItemTapped(Event.TabCounterMenuItemTapped.Item.NEW_TAB))
|
2020-06-11 00:34:26 +02:00
|
|
|
onItemTapped(TabCounterMenuItem.NewTab(false))
|
|
|
|
},
|
|
|
|
BrowserMenuImageText(
|
|
|
|
label = context.getString(R.string.home_screen_shortcut_open_new_private_tab_2),
|
|
|
|
imageResource = R.drawable.ic_private_browsing,
|
|
|
|
iconTintColorResource = primaryTextColor,
|
|
|
|
textColorResource = primaryTextColor
|
|
|
|
) {
|
2020-06-12 21:28:38 +02:00
|
|
|
metrics.track(Event.TabCounterMenuItemTapped(Event.TabCounterMenuItemTapped.Item.NEW_PRIVATE_TAB))
|
2020-06-11 00:34:26 +02:00
|
|
|
onItemTapped(TabCounterMenuItem.NewTab(true))
|
2020-06-25 17:25:16 +02:00
|
|
|
},
|
|
|
|
BrowserMenuDivider(),
|
|
|
|
BrowserMenuImageText(
|
|
|
|
label = context.getString(R.string.close_tab),
|
|
|
|
imageResource = R.drawable.ic_close,
|
|
|
|
iconTintColorResource = primaryTextColor,
|
|
|
|
textColorResource = primaryTextColor
|
|
|
|
) {
|
|
|
|
metrics.track(Event.TabCounterMenuItemTapped(Event.TabCounterMenuItemTapped.Item.CLOSE_TAB))
|
|
|
|
onItemTapped(TabCounterMenuItem.CloseTab)
|
2020-06-11 00:34:26 +02:00
|
|
|
}
|
|
|
|
)
|
2020-06-25 17:25:16 +02:00
|
|
|
|
|
|
|
return BrowserMenuBuilder(
|
2020-07-23 04:23:38 +02:00
|
|
|
when (context.settings().toolbarPosition) {
|
|
|
|
ToolbarPosition.BOTTOM -> menuItems.reversed()
|
|
|
|
ToolbarPosition.TOP -> menuItems
|
2020-06-25 17:25:16 +02:00
|
|
|
}
|
|
|
|
).build(context)
|
2020-06-11 00:34:26 +02:00
|
|
|
}
|
|
|
|
|
2019-04-05 23:33:02 +02:00
|
|
|
private val sessionManagerObserver = object : SessionManager.Observer {
|
|
|
|
override fun onSessionAdded(session: Session) {
|
|
|
|
updateCount()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onSessionRemoved(session: Session) {
|
|
|
|
updateCount()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onSessionsRestored() {
|
|
|
|
updateCount()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onAllSessionsRemoved() {
|
|
|
|
updateCount()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|