summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-06-16 19:57:14 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-07-01 19:12:29 +0000
commitd7501dfd43e687dcaa7cb4f2c2984527191438d7 (patch)
tree4bc1b938f15f1239fd1b9809a5d3d971c47d186d /android
parent8cdfac15f26348da9b164716f1cad3c5287b3a80 (diff)
downloadmullvadvpn-d7501dfd43e687dcaa7cb4f2c2984527191438d7.tar.xz
mullvadvpn-d7501dfd43e687dcaa7cb4f2c2984527191438d7.zip
Create `AdapterWithHeader` wrapper adapter
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/util/AdapterWithHeader.kt110
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/util/HeaderOrHolder.kt9
2 files changed, 119 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/AdapterWithHeader.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/AdapterWithHeader.kt
new file mode 100644
index 0000000000..0cddaaa123
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/AdapterWithHeader.kt
@@ -0,0 +1,110 @@
+package net.mullvad.mullvadvpn.util
+
+import android.support.v7.widget.RecyclerView.Adapter
+import android.support.v7.widget.RecyclerView.AdapterDataObserver
+import android.support.v7.widget.RecyclerView.ViewHolder
+import android.view.LayoutInflater
+import android.view.ViewGroup
+
+class AdapterWithHeader<H : ViewHolder>(
+ val adapter: Adapter<H>,
+ val headerLayoutId: Int
+) : Adapter<HeaderOrHolder<H>>() {
+ private val observer = object : AdapterDataObserver() {
+ override fun onChanged() {
+ notifyDataSetChanged()
+ }
+
+ override fun onItemRangeChanged(start: Int, count: Int) {
+ notifyItemRangeChanged(start + 1, count)
+ }
+
+ override fun onItemRangeChanged(start: Int, count: Int, payload: Any?) {
+ notifyItemRangeChanged(start + 1, count, payload)
+ }
+
+ override fun onItemRangeInserted(start: Int, count: Int) {
+ notifyItemRangeInserted(start + 1, count)
+ }
+
+ override fun onItemRangeMoved(from: Int, to: Int, count: Int) {
+ if (from == to) {
+ notifyItemRangeChanged(from + 1, count)
+ } else {
+ val sourceStart = from + 1
+ val sourceEnd = sourceStart + count
+ val destinationStart = to + 1
+ val destinationEnd = destinationStart + count
+
+ val ascendingIndices =
+ (sourceStart..sourceEnd).zip(destinationStart..destinationEnd)
+
+ val indices = if (from < to) {
+ ascendingIndices.asReversed()
+ } else {
+ ascendingIndices
+ }
+
+ for ((source, destination) in indices) {
+ notifyItemMoved(source, destination)
+ }
+ }
+ }
+
+ override fun onItemRangeRemoved(start: Int, count: Int) {
+ notifyItemRangeRemoved(start + 1, count)
+ }
+ }
+
+ init {
+ adapter.registerAdapterDataObserver(observer)
+ }
+
+ override fun getItemCount() = adapter.itemCount + 1
+
+ override fun getItemId(position: Int): Long {
+ if (position == 0) {
+ return 0L
+ } else {
+ return adapter.getItemId(position - 1) + 1
+ }
+ }
+
+ override fun getItemViewType(position: Int): Int {
+ if (position == 0) {
+ return 0
+ } else {
+ return adapter.getItemViewType(position - 1) + 1
+ }
+ }
+
+ override fun onBindViewHolder(holder: HeaderOrHolder<H>, position: Int) {
+ when (holder) {
+ is HeaderOrHolder.Header -> {
+ if (position != 0) {
+ throw IllegalArgumentException("Adapter position is not for the header")
+ }
+ }
+ is HeaderOrHolder.Holder -> {
+ if (position > 0) {
+ adapter.onBindViewHolder(holder.holder, position - 1)
+ } else {
+ throw IllegalArgumentException("Adapter position is for the header")
+ }
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parentView: ViewGroup, viewType: Int): HeaderOrHolder<H> {
+ if (viewType == 0) {
+ val inflater = LayoutInflater.from(parentView.context)
+ val view = inflater.inflate(headerLayoutId, parentView, false)
+
+ return HeaderOrHolder.Header(view)
+ } else {
+ val holder = adapter.onCreateViewHolder(parentView, viewType - 1)
+
+ return HeaderOrHolder.Holder(holder)
+ }
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/HeaderOrHolder.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/HeaderOrHolder.kt
new file mode 100644
index 0000000000..631d69100e
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/HeaderOrHolder.kt
@@ -0,0 +1,9 @@
+package net.mullvad.mullvadvpn.util
+
+import android.support.v7.widget.RecyclerView.ViewHolder
+import android.view.View
+
+sealed class HeaderOrHolder<H : ViewHolder>(itemView: View) : ViewHolder(itemView) {
+ class Header<H : ViewHolder>(headerView: View) : HeaderOrHolder<H>(headerView)
+ class Holder<H : ViewHolder>(val holder: H) : HeaderOrHolder<H>(holder.itemView)
+}