1
0
Fork 0

For #1830 - Adds the ability to share a tab

master
Jeff Boek 2019-04-19 13:41:13 -07:00
parent 774c5c0e0c
commit 4ea54252b0
5 changed files with 52 additions and 21 deletions

View File

@ -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)
}

View File

@ -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()
}

View File

@ -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)
}
)
}
}

View File

@ -22,12 +22,13 @@
<ImageView
android:id="@+id/favicon_image"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="8dp"
android:adjustViewBounds="true"
android:importantForAccessibility="no"
android:scaleType="centerInside"
android:scaleType="fitCenter"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -49,12 +50,13 @@
<TextView
android:id="@+id/tab_title"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:ellipsize="end"
android:maxLines="2"
android:minLines="2"
android:textColor="?primaryText"
android:textSize="15sp"
app:layout_constraintStart_toEndOf="@id/favicon_image"
@ -81,7 +83,7 @@
android:contentDescription="@string/tab_menu"
android:src="@drawable/ic_menu"
android:translationX="4dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toBottomOf="@id/tab_title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/close_tab_button" />

View File

@ -232,6 +232,8 @@
<string name="close_tab">Close tab</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Tab menu</string>
<!-- Tab menu item to share the tab -->
<string name="tab_share">Share tab</string>
<!-- Button in the current session menu. Deletes the session when pressed -->
<string name="current_session_delete">Delete</string>
<!-- Button in the current session menu. Saves the session when pressed -->