diff --git a/app/src/main/java/com/topjohnwu/magisk/model/binding/BindingAdapter.kt b/app/src/main/java/com/topjohnwu/magisk/model/binding/BindingAdapter.kt new file mode 100644 index 000000000..5bfad68c6 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/binding/BindingAdapter.kt @@ -0,0 +1,37 @@ +package com.topjohnwu.magisk.model.binding + +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView +import com.skoumal.teanity.databinding.ComparableRvItem +import com.topjohnwu.magisk.model.entity.recycler.LenientRvItem +import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter + +class BindingAdapter : BindingRecyclerViewAdapter>() { + + private var recyclerView: RecyclerView? = null + + override fun onBindBinding( + binding: ViewDataBinding, + variableId: Int, + layoutRes: Int, + position: Int, + item: ComparableRvItem<*> + ) { + super.onBindBinding(binding, variableId, layoutRes, position, item) + + when (item) { + is LenientRvItem -> { + val recycler = recyclerView ?: return + item.onBindingBound(binding) + item.onBindingBound(binding, recycler) + } + else -> item.onBindingBound(binding) + } + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + this.recyclerView = recyclerView + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt index af4e508a8..e890f9f2d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt @@ -1,11 +1,26 @@ package com.topjohnwu.magisk.model.entity.recycler -import com.skoumal.teanity.databinding.ComparableRvItem +import android.widget.TextView +import androidx.core.view.updateLayoutParams +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.R -class ConsoleRvItem(val item: String) : ComparableRvItem() { +class ConsoleRvItem(val item: String) : LenientRvItem() { override val layoutRes: Int = R.layout.item_console + override fun onBindingBound(binding: ViewDataBinding, recyclerView: RecyclerView) { + val view = binding.root as TextView + view.measure(0, 0) + val desiredWidth = view.measuredWidth + + view.updateLayoutParams { width = desiredWidth } + + if (recyclerView.width < desiredWidth) { + recyclerView.requestLayout() + } + } + override fun contentSameAs(other: ConsoleRvItem) = itemSameAs(other) override fun itemSameAs(other: ConsoleRvItem) = item == other.item } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LenientRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LenientRvItem.kt new file mode 100644 index 000000000..ddbd2fbec --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LenientRvItem.kt @@ -0,0 +1,16 @@ +package com.topjohnwu.magisk.model.entity.recycler + +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView +import com.skoumal.teanity.databinding.ComparableRvItem + +/** + * This item addresses issues where enclosing recycler has to be invalidated or generally + * manipulated with. This shouldn't be however necessary for 99.9% of use-cases. Refrain from using + * this item as it provides virtually no additional functionality. Stick with ComparableRvItem. + * */ +abstract class LenientRvItem : ComparableRvItem() { + + open fun onBindingBound(binding: ViewDataBinding, recyclerView: RecyclerView) {} + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt index 7fb3c7b40..4347afbca 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt @@ -12,6 +12,7 @@ import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.LogRepository +import com.topjohnwu.magisk.model.binding.BindingAdapter import com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem import com.topjohnwu.magisk.model.entity.recycler.LogItemRvItem import com.topjohnwu.magisk.model.entity.recycler.LogRvItem @@ -30,6 +31,7 @@ class LogViewModel( private val logRepo: LogRepository ) : MagiskViewModel(), BindingViewPagerAdapter.PageTitles> { + val itemsAdapter = BindingAdapter() val items = DiffObservableList(ComparableRvItem.callback) val itemBinding = OnItemBind> { itemBinding, _, item -> item.bind(itemBinding) diff --git a/app/src/main/res/layout/item_page_magisk_log.xml b/app/src/main/res/layout/item_page_magisk_log.xml index b5d830ce2..252a47983 100644 --- a/app/src/main/res/layout/item_page_magisk_log.xml +++ b/app/src/main/res/layout/item_page_magisk_log.xml @@ -15,25 +15,20 @@ - - + - - - - - + \ No newline at end of file