diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
index 31087359b..75d81f0b3 100644
--- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
@@ -34,6 +34,7 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.requireComponents
+import org.mozilla.fenix.ext.share
import org.mozilla.fenix.ext.urlToHost
import org.mozilla.fenix.home.sessioncontrol.Mode
import org.mozilla.fenix.home.sessioncontrol.SessionControlAction
@@ -201,6 +202,11 @@ class HomeFragment : Fragment(), CoroutineScope {
requireComponents.core.sessionManager.remove(session)
}
}
+ is TabAction.Share -> {
+ requireComponents.core.sessionManager.findSessionById(action.sessionId)?.let { session ->
+ requireContext().share(session.url)
+ }
+ }
is TabAction.CloseAll -> {
requireComponents.useCases.tabsUseCases.removeAllTabsOfType.invoke(action.private)
}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt
index 7e64f6865..7cb18c136 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt
@@ -66,6 +66,7 @@ sealed class TabAction : Action {
data class CloseAll(val private: Boolean) : TabAction()
data class Select(val sessionId: String) : TabAction()
data class Close(val sessionId: String) : TabAction()
+ data class Share(val sessionId: String) : TabAction()
object PrivateBrowsingLearnMore : TabAction()
}
diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabViewHolder.kt
index 925a12237..0a0a30c2d 100644
--- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabViewHolder.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabViewHolder.kt
@@ -4,10 +4,10 @@
package org.mozilla.fenix.home.sessioncontrol.viewholders
+import android.content.Context
import android.graphics.Outline
import android.view.View
import android.view.ViewOutlineProvider
-import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import io.reactivex.Observer
import kotlinx.android.extensions.LayoutContainer
@@ -17,8 +17,10 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import mozilla.components.browser.icons.IconRequest
+import mozilla.components.browser.menu.BrowserMenu
+import mozilla.components.browser.menu.BrowserMenuBuilder
+import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
import mozilla.components.support.ktx.android.content.res.pxToDp
-import org.jetbrains.anko.image
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.increaseTapArea
@@ -40,8 +42,15 @@ class TabViewHolder(
get() = Dispatchers.IO + job
var tab: Tab? = null
+ private lateinit var tabMenu: TabItemMenu
init {
+ tabMenu = TabItemMenu(view.context) {
+ when (it) {
+ is TabItemMenu.Item.Share ->
+ actionEmitter.onNext(TabAction.Share(tab?.sessionId!!))
+ }
+ }
item_tab.setOnClickListener {
actionEmitter.onNext(TabAction.Select(tab?.sessionId!!))
}
@@ -65,11 +74,16 @@ class TabViewHolder(
)
}
}
+
+ tab_overflow_button.setOnClickListener {
+ tabMenu.menuBuilder
+ .build(view.context)
+ .show(anchor = it, orientation = BrowserMenu.Orientation.DOWN)
+ }
}
fun bindSession(tab: Tab, position: Int) {
this.tab = tab
- updateTabBackground(position)
updateText(tab)
updateSelected(tab.selected)
}
@@ -90,24 +104,30 @@ class TabViewHolder(
selected_border.visibility = if (selected) View.VISIBLE else View.GONE
}
- fun updateTabBackground(id: Int) {
- if (tab?.thumbnail != null) {
-// tab_background.setImageBitmap(tab?.thumbnail)
- } else {
- val background = availableBackgrounds[id % availableBackgrounds.size]
- favicon_image.image = ContextCompat.getDrawable(view.context, background)
- }
- }
-
companion object {
const val LAYOUT_ID = R.layout.tab_list_row
const val closeButtonIncreaseDps = 12
const val favIconBorderRadiusInPx = 8
+ }
+}
- private val availableBackgrounds = listOf(
- R.drawable.sessions_01, R.drawable.sessions_02,
- R.drawable.sessions_03, R.drawable.sessions_06,
- R.drawable.sessions_07, R.drawable.sessions_08
+class TabItemMenu(
+ private val context: Context,
+ private val onItemTapped: (Item) -> Unit = {}
+) {
+ sealed class Item {
+ object Share : Item()
+ }
+
+ val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
+
+ private val menuItems by lazy {
+ listOf(
+ SimpleBrowserMenuItem(
+ context.getString(R.string.tab_share)
+ ) {
+ onItemTapped.invoke(Item.Share)
+ }
)
}
}
diff --git a/app/src/main/res/layout/tab_list_row.xml b/app/src/main/res/layout/tab_list_row.xml
index 85911b096..3d6d40465 100644
--- a/app/src/main/res/layout/tab_list_row.xml
+++ b/app/src/main/res/layout/tab_list_row.xml
@@ -22,12 +22,13 @@
@@ -49,12 +50,13 @@
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index fec671220..47e73b853 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -232,6 +232,8 @@
Close tab
Tab menu
+
+ Share tab
Delete