1
0
Fork 0

For #1830 - Updates the tab visual style

master
Jeff Boek 2019-04-19 13:24:59 -07:00
parent 316569b899
commit 774c5c0e0c
4 changed files with 81 additions and 36 deletions

View File

@ -34,6 +34,7 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.urlToHost
import org.mozilla.fenix.home.sessioncontrol.Mode import org.mozilla.fenix.home.sessioncontrol.Mode
import org.mozilla.fenix.home.sessioncontrol.SessionControlAction import org.mozilla.fenix.home.sessioncontrol.SessionControlAction
import org.mozilla.fenix.home.sessioncontrol.SessionControlChange import org.mozilla.fenix.home.sessioncontrol.SessionControlChange
@ -284,7 +285,14 @@ class HomeFragment : Fragment(), CoroutineScope {
.filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private } .filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private }
.map { .map {
val selected = it == sessionManager.selectedSession val selected = it == sessionManager.selectedSession
org.mozilla.fenix.home.sessioncontrol.Tab(it.id, it.url, selected, it.thumbnail) org.mozilla.fenix.home.sessioncontrol.Tab(
it.id,
it.url,
it.url.urlToHost(),
it.title,
selected,
it.thumbnail
)
} }
) )
) )

View File

@ -40,7 +40,15 @@ class SessionControlComponent(
} }
} }
data class Tab(val sessionId: String, val url: String, val selected: Boolean, val thumbnail: Bitmap? = null) data class Tab(
val sessionId: String,
val url: String,
val hostname: String,
val title: String,
val selected: Boolean,
val thumbnail: Bitmap? = null
)
sealed class Mode { sealed class Mode {
object Normal : Mode() object Normal : Mode()
object Private : Mode() object Private : Mode()

View File

@ -4,7 +4,9 @@
package org.mozilla.fenix.home.sessioncontrol.viewholders package org.mozilla.fenix.home.sessioncontrol.viewholders
import android.graphics.Outline
import android.view.View import android.view.View
import android.view.ViewOutlineProvider
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.reactivex.Observer import io.reactivex.Observer
@ -15,6 +17,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.browser.icons.IconRequest import mozilla.components.browser.icons.IconRequest
import mozilla.components.support.ktx.android.content.res.pxToDp
import org.jetbrains.anko.image import org.jetbrains.anko.image
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
@ -49,20 +52,34 @@ class TabViewHolder(
actionEmitter.onNext(TabAction.Close(tab?.sessionId!!)) actionEmitter.onNext(TabAction.Close(tab?.sessionId!!))
} }
} }
favicon_image.clipToOutline = true
favicon_image.outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View?, outline: Outline?) {
outline?.setRoundRect(
0,
0,
view!!.width,
view.height,
view.context.resources.pxToDp(favIconBorderRadiusInPx).toFloat()
)
}
}
} }
fun bindSession(tab: Tab, position: Int) { fun bindSession(tab: Tab, position: Int) {
this.tab = tab this.tab = tab
updateTabBackground(position) updateTabBackground(position)
updateUrl(tab.url) updateText(tab)
updateSelected(tab.selected) updateSelected(tab.selected)
} }
fun updateUrl(url: String) { fun updateText(tab: Tab) {
text_url.text = url hostname.text = tab.hostname
tab_title.text = tab.title
launch(Dispatchers.IO) { launch(Dispatchers.IO) {
val bitmap = favicon_image.context.components.utils.icons val bitmap = favicon_image.context.components.utils.icons
.loadIcon(IconRequest(url)).await().bitmap .loadIcon(IconRequest(tab.url)).await().bitmap
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
favicon_image.setImageBitmap(bitmap) favicon_image.setImageBitmap(bitmap)
} }
@ -75,16 +92,17 @@ class TabViewHolder(
fun updateTabBackground(id: Int) { fun updateTabBackground(id: Int) {
if (tab?.thumbnail != null) { if (tab?.thumbnail != null) {
tab_background.setImageBitmap(tab?.thumbnail) // tab_background.setImageBitmap(tab?.thumbnail)
} else { } else {
val background = availableBackgrounds[id % availableBackgrounds.size] val background = availableBackgrounds[id % availableBackgrounds.size]
tab_background.image = ContextCompat.getDrawable(view.context, background) favicon_image.image = ContextCompat.getDrawable(view.context, background)
} }
} }
companion object { companion object {
const val LAYOUT_ID = R.layout.tab_list_row const val LAYOUT_ID = R.layout.tab_list_row
const val closeButtonIncreaseDps = 12 const val closeButtonIncreaseDps = 12
const val favIconBorderRadiusInPx = 8
private val availableBackgrounds = listOf( private val availableBackgrounds = listOf(
R.drawable.sessions_01, R.drawable.sessions_02, R.drawable.sessions_01, R.drawable.sessions_02,

View File

@ -22,57 +22,68 @@
<ImageView <ImageView
android:id="@+id/favicon_image" android:id="@+id/favicon_image"
android:layout_width="wrap_content" android:layout_width="64dp"
android:layout_height="wrap_content" android:layout_height="64dp"
android:layout_margin="10dp" android:layout_margin="8dp"
android:adjustViewBounds="true"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:minWidth="32dp" android:scaleType="centerInside"
android:minHeight="32dp" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/text_url" android:id="@+id/hostname"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:ellipsize="none" android:ellipsize="none"
android:requiresFadingEdge="horizontal"
android:singleLine="true" android:singleLine="true"
android:textColor="?primaryText" android:textColor="?secondaryText"
android:textSize="16sp" android:textSize="12sp"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/close_tab_button" app:layout_constraintEnd_toStartOf="@id/close_tab_button"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/favicon_image" app:layout_constraintStart_toEndOf="@id/favicon_image"
app:layout_constraintTop_toTopOf="@id/favicon_image" /> app:layout_constraintTop_toTopOf="@id/favicon_image" />
<TextView
android:id="@+id/tab_title"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="4dp"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="?primaryText"
android:textSize="15sp"
app:layout_constraintStart_toEndOf="@id/favicon_image"
app:layout_constraintEnd_toEndOf="@id/hostname"
app:layout_constraintTop_toBottomOf="@id/hostname"
app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView <ImageView
android:id="@+id/close_tab_button" android:id="@+id/close_tab_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="1dp" android:layout_margin="8dp"
android:contentDescription="@string/close_tab" android:contentDescription="@string/close_tab"
android:paddingStart="12dp"
android:paddingEnd="10dp"
android:src="@drawable/ic_close" android:src="@drawable/ic_close"
app:layout_constraintBottom_toBottomOf="@id/text_url" android:background="?android:attr/selectableItemBackgroundBorderless"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/text_url" /> app:layout_constraintTop_toTopOf="parent" />
<org.mozilla.fenix.home.ImageViewTopCrop <ImageButton
android:id="@+id/tab_background" android:id="@+id/tab_overflow_button"
android:layout_width="0dp" android:layout_width="@dimen/glyph_button_width"
android:layout_height="100dp" android:layout_height="@dimen/glyph_button_height"
android:layout_marginTop="10dp" android:background="?android:attr/selectableItemBackgroundBorderless"
android:adjustViewBounds="false" android:contentDescription="@string/tab_menu"
android:focusable="false" android:src="@drawable/ic_menu"
android:importantForAccessibility="no" android:translationX="4dp"
android:scaleType="matrix"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/close_tab_button" />
app:layout_constraintTop_toBottomOf="@id/favicon_image" />
<View <View
android:id="@+id/selected_border" android:id="@+id/selected_border"