mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Remove card backgrounds from browse lists
This commit is contained in:
		@@ -234,7 +234,6 @@ dependencies {
 | 
			
		||||
    implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
 | 
			
		||||
    implementation 'com.nononsenseapps:filepicker:2.5.2'
 | 
			
		||||
    implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.1.0'
 | 
			
		||||
    implementation 'com.github.mthli:Slice:v1.3'
 | 
			
		||||
    implementation 'com.github.chrisbanes:PhotoView:2.3.0'
 | 
			
		||||
    implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,70 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.holder
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.flexibleadapter.items.ISectionable
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.dpToPx
 | 
			
		||||
import io.github.mthli.slice.Slice
 | 
			
		||||
 | 
			
		||||
interface SlicedHolder {
 | 
			
		||||
 | 
			
		||||
    val slice: Slice
 | 
			
		||||
 | 
			
		||||
    val adapter: FlexibleAdapter<IFlexible<*>>
 | 
			
		||||
 | 
			
		||||
    val viewToSlice: View
 | 
			
		||||
 | 
			
		||||
    fun setCardEdges(item: ISectionable<*, *>) {
 | 
			
		||||
        // Position of this item in its header. Defaults to 0 when header is null.
 | 
			
		||||
        var position = 0
 | 
			
		||||
 | 
			
		||||
        // Number of items in the header of this item. Defaults to 1 when header is null.
 | 
			
		||||
        var count = 1
 | 
			
		||||
 | 
			
		||||
        if (item.header != null) {
 | 
			
		||||
            val sectionItems = adapter.getSectionItems(item.header)
 | 
			
		||||
            position = sectionItems.indexOf(item)
 | 
			
		||||
            count = sectionItems.size
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        when {
 | 
			
		||||
            // Only one item in the card
 | 
			
		||||
            count == 1 -> applySlice(2f, topRect = false, bottomRect = false, topShadow = true, bottomShadow = true)
 | 
			
		||||
            // First item of the card
 | 
			
		||||
            position == 0 -> applySlice(2f, topRect = false, bottomRect = true, topShadow = true, bottomShadow = false)
 | 
			
		||||
            // Last item of the card
 | 
			
		||||
            position == count - 1 -> applySlice(2f, topRect = true, bottomRect = false, topShadow = false, bottomShadow = true)
 | 
			
		||||
            // Middle item
 | 
			
		||||
            else -> applySlice(0f, topRect = false, bottomRect = false, topShadow = false, bottomShadow = false)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun applySlice(
 | 
			
		||||
        radius: Float,
 | 
			
		||||
        topRect: Boolean,
 | 
			
		||||
        bottomRect: Boolean,
 | 
			
		||||
        topShadow: Boolean,
 | 
			
		||||
        bottomShadow: Boolean
 | 
			
		||||
    ) {
 | 
			
		||||
        val margin = margin
 | 
			
		||||
 | 
			
		||||
        slice.setRadius(radius)
 | 
			
		||||
        slice.showLeftTopRect(topRect)
 | 
			
		||||
        slice.showRightTopRect(topRect)
 | 
			
		||||
        slice.showLeftBottomRect(bottomRect)
 | 
			
		||||
        slice.showRightBottomRect(bottomRect)
 | 
			
		||||
        setMargins(margin, if (topShadow) margin else 0, margin, if (bottomShadow) margin else 0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setMargins(left: Int, top: Int, right: Int, bottom: Int) {
 | 
			
		||||
        if (viewToSlice.layoutParams is ViewGroup.MarginLayoutParams) {
 | 
			
		||||
            val p = viewToSlice.layoutParams as ViewGroup.MarginLayoutParams
 | 
			
		||||
            p.setMargins(left, top, right, bottom)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    val margin
 | 
			
		||||
        get() = 8.dpToPx
 | 
			
		||||
}
 | 
			
		||||
@@ -1,48 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.browse
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.graphics.Canvas
 | 
			
		||||
import android.graphics.Rect
 | 
			
		||||
import android.graphics.drawable.Drawable
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.view.marginBottom
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
 | 
			
		||||
class SourceDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() {
 | 
			
		||||
 | 
			
		||||
    private val divider: Drawable
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        val a = context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider))
 | 
			
		||||
        divider = a.getDrawable(0)!!
 | 
			
		||||
        a.recycle()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
 | 
			
		||||
        val childCount = parent.childCount
 | 
			
		||||
        for (i in 0 until childCount - 1) {
 | 
			
		||||
            val child = parent.getChildAt(i)
 | 
			
		||||
            val holder = parent.getChildViewHolder(child)
 | 
			
		||||
            if (holder is SourceListItem &&
 | 
			
		||||
                parent.getChildViewHolder(parent.getChildAt(i + 1)) is SourceListItem
 | 
			
		||||
            ) {
 | 
			
		||||
                val top = child.bottom + child.marginBottom
 | 
			
		||||
                val bottom = top + divider.intrinsicHeight
 | 
			
		||||
                val left = parent.paddingStart + holder.margin
 | 
			
		||||
                val right = parent.width - parent.paddingEnd - holder.margin
 | 
			
		||||
 | 
			
		||||
                divider.setBounds(left, top, right, bottom)
 | 
			
		||||
                divider.draw(c)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getItemOffsets(
 | 
			
		||||
        outRect: Rect,
 | 
			
		||||
        view: View,
 | 
			
		||||
        parent: RecyclerView,
 | 
			
		||||
        state: RecyclerView.State
 | 
			
		||||
    ) {
 | 
			
		||||
        outRect.set(0, 0, 0, divider.intrinsicHeight)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.browse
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
 | 
			
		||||
 | 
			
		||||
interface SourceListItem : SlicedHolder
 | 
			
		||||
@@ -18,7 +18,6 @@ import eu.kanade.tachiyomi.extension.model.Extension
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.BrowseController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceDividerItemDecoration
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.extension.details.ExtensionDetailsController
 | 
			
		||||
import kotlinx.coroutines.flow.filter
 | 
			
		||||
import kotlinx.coroutines.flow.launchIn
 | 
			
		||||
@@ -76,7 +75,6 @@ open class ExtensionController :
 | 
			
		||||
        // Create recycler and set adapter.
 | 
			
		||||
        binding.recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        binding.recycler.adapter = adapter
 | 
			
		||||
        binding.recycler.addItemDecoration(SourceDividerItemDecoration(view.context))
 | 
			
		||||
        adapter?.fastScroller = binding.fastScroller
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,11 +6,7 @@ import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
import eu.kanade.tachiyomi.extension.model.Extension
 | 
			
		||||
import eu.kanade.tachiyomi.extension.model.InstallStep
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceListItem
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
 | 
			
		||||
import io.github.mthli.slice.Slice
 | 
			
		||||
import kotlinx.android.synthetic.main.extension_card_item.card
 | 
			
		||||
import kotlinx.android.synthetic.main.extension_card_item.ext_button
 | 
			
		||||
import kotlinx.android.synthetic.main.extension_card_item.ext_title
 | 
			
		||||
import kotlinx.android.synthetic.main.extension_card_item.image
 | 
			
		||||
@@ -18,17 +14,8 @@ import kotlinx.android.synthetic.main.extension_card_item.lang
 | 
			
		||||
import kotlinx.android.synthetic.main.extension_card_item.version
 | 
			
		||||
import kotlinx.android.synthetic.main.extension_card_item.warning
 | 
			
		||||
 | 
			
		||||
class ExtensionHolder(view: View, override val adapter: ExtensionAdapter) :
 | 
			
		||||
    BaseFlexibleViewHolder(view, adapter),
 | 
			
		||||
    SourceListItem,
 | 
			
		||||
    SlicedHolder {
 | 
			
		||||
 | 
			
		||||
    override val slice = Slice(card).apply {
 | 
			
		||||
        setColor(adapter.cardBackground)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override val viewToSlice: View
 | 
			
		||||
        get() = card
 | 
			
		||||
class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
 | 
			
		||||
    BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        ext_button.setOnClickListener {
 | 
			
		||||
@@ -38,7 +25,6 @@ class ExtensionHolder(view: View, override val adapter: ExtensionAdapter) :
 | 
			
		||||
 | 
			
		||||
    fun bind(item: ExtensionItem) {
 | 
			
		||||
        val extension = item.extension
 | 
			
		||||
        setCardEdges(item)
 | 
			
		||||
 | 
			
		||||
        ext_title.text = extension.name
 | 
			
		||||
        version.text = extension.versionName
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.MigrationMangaControllerBinding
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceDividerItemDecoration
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.migration.search.SearchController
 | 
			
		||||
 | 
			
		||||
class MigrationMangaController :
 | 
			
		||||
@@ -54,7 +53,6 @@ class MigrationMangaController :
 | 
			
		||||
        adapter = FlexibleAdapter<IFlexible<*>>(null, this)
 | 
			
		||||
        binding.recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        binding.recycler.adapter = adapter
 | 
			
		||||
        binding.recycler.addItemDecoration(SourceDividerItemDecoration(view.context))
 | 
			
		||||
        adapter?.fastScroller = binding.fastScroller
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.kanade.tachiyomi.databinding.MigrationSourcesControllerBinding
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceDividerItemDecoration
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.migration.manga.MigrationMangaController
 | 
			
		||||
 | 
			
		||||
class MigrationSourcesController :
 | 
			
		||||
@@ -32,7 +31,6 @@ class MigrationSourcesController :
 | 
			
		||||
        adapter = SourceAdapter(this)
 | 
			
		||||
        binding.recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        binding.recycler.adapter = adapter
 | 
			
		||||
        binding.recycler.addItemDecoration(SourceDividerItemDecoration(view.context))
 | 
			
		||||
        adapter?.fastScroller = binding.fastScroller
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,28 +3,14 @@ package eu.kanade.tachiyomi.ui.browse.migration.sources
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.kanade.tachiyomi.source.icon
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceListItem
 | 
			
		||||
import io.github.mthli.slice.Slice
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.card
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.image
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.title
 | 
			
		||||
 | 
			
		||||
class SourceHolder(view: View, override val adapter: SourceAdapter) :
 | 
			
		||||
    BaseFlexibleViewHolder(view, adapter),
 | 
			
		||||
    SourceListItem,
 | 
			
		||||
    SlicedHolder {
 | 
			
		||||
 | 
			
		||||
    override val slice = Slice(card).apply {
 | 
			
		||||
        setColor(adapter.cardBackground)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override val viewToSlice: View
 | 
			
		||||
        get() = card
 | 
			
		||||
class SourceHolder(view: View, val adapter: SourceAdapter) :
 | 
			
		||||
    BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    fun bind(item: SourceItem) {
 | 
			
		||||
        val source = item.source
 | 
			
		||||
        setCardEdges(item)
 | 
			
		||||
 | 
			
		||||
        // Set source name
 | 
			
		||||
        title.text = source.name
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,6 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.BrowseController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceDividerItemDecoration
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.source.latest.LatestUpdatesController
 | 
			
		||||
@@ -93,7 +92,6 @@ class SourceController :
 | 
			
		||||
        // Create recycler and set adapter.
 | 
			
		||||
        binding.recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        binding.recycler.adapter = adapter
 | 
			
		||||
        binding.recycler.addItemDecoration(SourceDividerItemDecoration(view.context))
 | 
			
		||||
        adapter?.fastScroller = binding.fastScroller
 | 
			
		||||
 | 
			
		||||
        requestPermissionsSafe(arrayOf(WRITE_EXTERNAL_STORAGE), 301)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,28 +6,15 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.icon
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.SourceListItem
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.getResourceColor
 | 
			
		||||
import eu.kanade.tachiyomi.util.view.setVectorCompat
 | 
			
		||||
import io.github.mthli.slice.Slice
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.card
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.image
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.pin
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.source_latest
 | 
			
		||||
import kotlinx.android.synthetic.main.source_main_controller_card_item.title
 | 
			
		||||
 | 
			
		||||
class SourceHolder(private val view: View, override val adapter: SourceAdapter) :
 | 
			
		||||
    BaseFlexibleViewHolder(view, adapter),
 | 
			
		||||
    SourceListItem,
 | 
			
		||||
    SlicedHolder {
 | 
			
		||||
 | 
			
		||||
    override val slice = Slice(card).apply {
 | 
			
		||||
        setColor(adapter.cardBackground)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override val viewToSlice: View
 | 
			
		||||
        get() = card
 | 
			
		||||
class SourceHolder(private val view: View, val adapter: SourceAdapter) :
 | 
			
		||||
    BaseFlexibleViewHolder(view, adapter) {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        source_latest.setOnClickListener {
 | 
			
		||||
@@ -41,7 +28,6 @@ class SourceHolder(private val view: View, override val adapter: SourceAdapter)
 | 
			
		||||
 | 
			
		||||
    fun bind(item: SourceItem) {
 | 
			
		||||
        val source = item.source
 | 
			
		||||
        setCardEdges(item)
 | 
			
		||||
 | 
			
		||||
        // Set source name
 | 
			
		||||
        title.text = source.name
 | 
			
		||||
 
 | 
			
		||||
@@ -1,94 +1,86 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content">
 | 
			
		||||
    android:layout_height="64dp"
 | 
			
		||||
    android:background="@drawable/list_item_selector_background">
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
        android:id="@+id/card"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="64dp"
 | 
			
		||||
        android:background="@drawable/list_item_selector">
 | 
			
		||||
    <ImageView
 | 
			
		||||
        android:id="@+id/image"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:padding="12dp"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintDimensionRatio="h,1:1"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:src="@mipmap/ic_launcher_round" />
 | 
			
		||||
 | 
			
		||||
        <ImageView
 | 
			
		||||
            android:id="@+id/image"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            android:padding="12dp"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintDimensionRatio="h,1:1"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            tools:src="@mipmap/ic_launcher_round" />
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/ext_title"
 | 
			
		||||
        style="@style/TextAppearance.Regular"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginEnd="4dp"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.Regular.SubHeading"
 | 
			
		||||
        android:textSize="14sp"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/lang"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/ext_button"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/image"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        app:layout_constraintVertical_chainStyle="packed"
 | 
			
		||||
        tools:text="Batoto" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/ext_title"
 | 
			
		||||
            style="@style/TextAppearance.Regular"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginEnd="4dp"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:maxLines="1"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.Regular.SubHeading"
 | 
			
		||||
            android:textSize="14sp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/lang"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/ext_button"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/image"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            app:layout_constraintVertical_chainStyle="packed"
 | 
			
		||||
            tools:text="Batoto" />
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/lang"
 | 
			
		||||
        style="@style/TextAppearance.Regular.Body1.Secondary"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:textSize="12sp"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/image"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@+id/ext_title"
 | 
			
		||||
        tools:text="English"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/lang"
 | 
			
		||||
            style="@style/TextAppearance.Regular.Body1.Secondary"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:maxLines="1"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/image"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@+id/ext_title"
 | 
			
		||||
            tools:text="English"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/version"
 | 
			
		||||
        style="@style/TextAppearance.Regular.Body1.Secondary"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginStart="4dp"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:textSize="12sp"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/lang"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@+id/ext_title"
 | 
			
		||||
        tools:text="Version" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/version"
 | 
			
		||||
            style="@style/TextAppearance.Regular.Body1.Secondary"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginStart="4dp"
 | 
			
		||||
            android:maxLines="1"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/lang"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@+id/ext_title"
 | 
			
		||||
            tools:text="Version" />
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/warning"
 | 
			
		||||
        style="@style/TextAppearance.Regular.Body1.Secondary"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginStart="4dp"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:textColor="?attr/colorError"
 | 
			
		||||
        android:textSize="12sp"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/version"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@+id/ext_title"
 | 
			
		||||
        tools:text="Warning" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/warning"
 | 
			
		||||
            style="@style/TextAppearance.Regular.Body1.Secondary"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginStart="4dp"
 | 
			
		||||
            android:maxLines="1"
 | 
			
		||||
            android:textColor="?attr/colorError"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/version"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@+id/ext_title"
 | 
			
		||||
            tools:text="Warning" />
 | 
			
		||||
 | 
			
		||||
        <Button
 | 
			
		||||
            android:id="@+id/ext_button"
 | 
			
		||||
            style="@style/Theme.Widget.Button"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginEnd="16dp"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            tools:text="Details" />
 | 
			
		||||
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
    <Button
 | 
			
		||||
        android:id="@+id/ext_button"
 | 
			
		||||
        style="@style/Theme.Widget.Button"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginEnd="16dp"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:text="Details" />
 | 
			
		||||
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,15 @@
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/title"
 | 
			
		||||
        style="@style/TextAppearance.Regular.SubHeading"
 | 
			
		||||
        style="@style/TextAppearance.Regular.SubHeading.Secondary"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:fontFamily="sans-serif-medium"
 | 
			
		||||
        android:paddingStart="@dimen/material_component_text_fields_padding_above_and_below_label"
 | 
			
		||||
        android:paddingTop="8dp"
 | 
			
		||||
        android:paddingEnd="@dimen/material_component_text_fields_padding_above_and_below_label"
 | 
			
		||||
        android:paddingBottom="8dp"
 | 
			
		||||
        android:textAllCaps="true"
 | 
			
		||||
        tools:text="Title" />
 | 
			
		||||
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,74 +1,68 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content">
 | 
			
		||||
    android:layout_height="64dp"
 | 
			
		||||
    android:background="@drawable/list_item_selector_background">
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
        android:id="@+id/card"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="@dimen/material_component_lists_two_line_height"
 | 
			
		||||
        android:background="@drawable/list_item_selector">
 | 
			
		||||
    <ImageView
 | 
			
		||||
        android:id="@+id/image"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:paddingStart="16dp"
 | 
			
		||||
        android:paddingEnd="8dp"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintDimensionRatio="1:1"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:ignore="ContentDescription"
 | 
			
		||||
        tools:src="@mipmap/ic_launcher_round" />
 | 
			
		||||
 | 
			
		||||
        <ImageView
 | 
			
		||||
            android:id="@+id/image"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintDimensionRatio="1:1"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            tools:ignore="ContentDescription"
 | 
			
		||||
            tools:src="@mipmap/ic_launcher_round" />
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/title"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:paddingStart="0dp"
 | 
			
		||||
        android:paddingEnd="8dp"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.Regular.SubHeading"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@+id/source_latest"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@+id/image"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:text="Source title" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/title"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:maxLines="1"
 | 
			
		||||
            android:paddingStart="0dp"
 | 
			
		||||
            android:paddingEnd="8dp"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.Regular.SubHeading"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@+id/source_latest"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@+id/image"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            tools:text="Source title" />
 | 
			
		||||
    <Button
 | 
			
		||||
        android:id="@+id/source_latest"
 | 
			
		||||
        style="@style/Theme.Widget.Button"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:maxHeight="48dp"
 | 
			
		||||
        android:minWidth="0dp"
 | 
			
		||||
        android:minHeight="48dp"
 | 
			
		||||
        android:paddingStart="16dp"
 | 
			
		||||
        android:paddingEnd="16dp"
 | 
			
		||||
        android:text="@string/latest"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@+id/pin"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <Button
 | 
			
		||||
            android:id="@+id/source_latest"
 | 
			
		||||
            style="@style/Theme.Widget.Button"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:maxHeight="48dp"
 | 
			
		||||
            android:minWidth="0dp"
 | 
			
		||||
            android:minHeight="48dp"
 | 
			
		||||
            android:paddingStart="16dp"
 | 
			
		||||
            android:paddingEnd="16dp"
 | 
			
		||||
            android:text="@string/latest"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@+id/pin"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
    <ImageButton
 | 
			
		||||
        android:id="@+id/pin"
 | 
			
		||||
        android:layout_width="40dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:layout_marginEnd="8dp"
 | 
			
		||||
        android:background="?selectableItemBackgroundBorderless"
 | 
			
		||||
        android:contentDescription="@string/action_pin"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        app:srcCompat="@drawable/ic_push_pin_24dp"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <ImageButton
 | 
			
		||||
            android:id="@+id/pin"
 | 
			
		||||
            android:layout_width="40dp"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            android:layout_marginEnd="8dp"
 | 
			
		||||
            android:background="?selectableItemBackgroundBorderless"
 | 
			
		||||
            android:contentDescription="@string/action_pin"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            app:srcCompat="@drawable/ic_push_pin_24dp"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -80,11 +80,7 @@
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
    <style name="TextAppearance.Regular.SubHeading">
 | 
			
		||||
        <item name="android:textSize">16sp</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
    <style name="TextAppearance.Regular.SubHeading.Upper">
 | 
			
		||||
        <item name="android:textAllCaps">true</item>
 | 
			
		||||
        <item name="android:textSize">14sp</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
    <style name="TextAppearance.Regular.SubHeading.Secondary">
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user