From 073629764ed25db91e940603795252a36d6c0163 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 27 May 2018 21:22:17 +0200
Subject: [PATCH] Added sectioned fastscrolling to nick and buffer lists

---
 app/build.gradle.kts                                   |  1 +
 .../quasseldroid/ui/chat/buffers/BufferListAdapter.kt  |  5 ++++-
 .../ui/chat/messages/QuasselMessageRenderer.kt         |  2 +-
 .../quasseldroid/ui/chat/nicks/NickListAdapter.kt      | 10 +++++++++-
 .../quasseldroid/ui/chat/nicks/NickListFragment.kt     |  1 +
 .../kuschku/quasseldroid/util/ui/DrawerRecyclerView.kt |  4 ++--
 app/src/main/res/layout/fragment_chat_list.xml         |  6 ++++--
 app/src/main/res/layout/fragment_nick_list.xml         |  5 ++++-
 .../kuschku/quasseldroid/viewmodel/data/IrcUserItem.kt |  1 +
 9 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a38f2ac74..bbdc960c5 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -166,6 +166,7 @@ dependencies {
 
   // UI
   implementation("me.zhanghai.android.materialprogressbar", "library", "1.4.2")
+  implementation("com.simplecityapps", "recyclerview-fastscroll", "1.0.18")
   withVersion("0.9.6.0") {
     implementation("com.afollestad.material-dialogs", "core", version)
     implementation("com.afollestad.material-dialogs", "commons", version)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt
index be60564e2..b8f769479 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt
@@ -29,6 +29,7 @@ import android.widget.ImageView
 import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
+import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
 import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.Buffer_Activity
 import de.kuschku.libquassel.protocol.NetworkId
@@ -57,7 +58,9 @@ class BufferListAdapter(
     override fun areContentsTheSame(oldItem: BufferListItem, newItem: BufferListItem) =
       oldItem == newItem
   }
-) {
+), FastScrollRecyclerView.SectionedAdapter {
+  override fun getSectionName(position: Int) = getItem(position).props.network.networkName
+
   private var clickListener: ((BufferId) -> Unit)? = null
   private var longClickListener: ((BufferId) -> Unit)? = null
   private var updateFinishedListener: ((List<BufferListItem>) -> Unit)? = null
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
index 7b5a0cce5..31fd41ade 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/QuasselMessageRenderer.kt
@@ -128,7 +128,7 @@ class QuasselMessageRenderer @Inject constructor(
         viewHolder.realname?.setTextColor(getColor(1, 0))
         viewHolder.combined?.setTextColor(getColor(0, 0))
         viewHolder.content?.setTextColor(getColor(0, 0))
-        viewHolder.itemView.background = LayerDrawable(
+        viewHolder.messageContainer?.background = LayerDrawable(
           arrayOf(
             ColorDrawable(getColor(2, 0)),
             getDrawable(3)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListAdapter.kt
index 024db116d..ffb92f96a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListAdapter.kt
@@ -29,8 +29,11 @@ import android.widget.ImageView
 import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
+import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
+import de.kuschku.libquassel.util.helpers.nullIf
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.MessageSettings
+import de.kuschku.quasseldroid.util.helper.letIf
 import de.kuschku.quasseldroid.util.helper.loadAvatars
 import de.kuschku.quasseldroid.util.helper.visibleIf
 import de.kuschku.quasseldroid.util.ui.SpanFormatter
@@ -46,7 +49,12 @@ class NickListAdapter(
 
     override fun areContentsTheSame(oldItem: IrcUserItem?, newItem: IrcUserItem?) =
       oldItem == newItem
-  }) {
+  }), FastScrollRecyclerView.SectionedAdapter {
+  override fun getSectionName(position: Int) = getItem(position).let {
+    it.modes.letIf(it.modes.isNotEmpty()) { it.substring(0, 1) } +
+    (it.initial.nullIf(String?::isNullOrBlank) ?: "123")
+  }
+
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NickViewHolder {
     val holder = NickViewHolder(
       LayoutInflater.from(parent.context).inflate(
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
index 6b00e1e4c..936fbe74f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
@@ -146,6 +146,7 @@ class NickListFragment : ServiceBoundFragment() {
               if (messageSettings.squareAvatars) it.buildRect(initial, senderColor)
               else it.buildRound(initial, senderColor)
             },
+            initial = initial,
             modes = when (messageSettings.showPrefix) {
               MessageSettings.ShowPrefixMode.ALL ->
                 it.modes
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/DrawerRecyclerView.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/DrawerRecyclerView.kt
index d092b8b9d..e4cb9d8cc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/DrawerRecyclerView.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/DrawerRecyclerView.kt
@@ -24,15 +24,15 @@ import android.graphics.Canvas
 import android.graphics.Rect
 import android.graphics.drawable.Drawable
 import android.support.v4.view.ViewCompat
-import android.support.v7.widget.RecyclerView
 import android.util.AttributeSet
+import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
 import de.kuschku.quasseldroid.R
 
 class DrawerRecyclerView @JvmOverloads constructor(
   context: Context,
   attrs: AttributeSet? = null,
   defStyleAttr: Int = 0
-) : RecyclerView(context, attrs, defStyleAttr) {
+) : FastScrollRecyclerView(context, attrs, defStyleAttr) {
   private var mInsetForeground: Drawable? = null
   private var mInsets: Rect? = null
   private val mTempRect = Rect()
diff --git a/app/src/main/res/layout/fragment_chat_list.xml b/app/src/main/res/layout/fragment_chat_list.xml
index 1b012fa57..d504210af 100644
--- a/app/src/main/res/layout/fragment_chat_list.xml
+++ b/app/src/main/res/layout/fragment_chat_list.xml
@@ -49,10 +49,12 @@
   </android.support.design.widget.AppBarLayout>
 
 
-  <android.support.v7.widget.RecyclerView
+  <com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
     android:id="@+id/chatList"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:scrollbars="vertical"
+    app:fastScrollPopupBgColor="?colorAccent"
+    app:fastScrollPopupTextColor="?colorTextPrimaryInverse"
+    app:fastScrollThumbColor="?colorAccent"
     tools:listitem="@layout/widget_buffer" />
 </LinearLayout>
diff --git a/app/src/main/res/layout/fragment_nick_list.xml b/app/src/main/res/layout/fragment_nick_list.xml
index 7fb62aa72..6d4396b2b 100644
--- a/app/src/main/res/layout/fragment_nick_list.xml
+++ b/app/src/main/res/layout/fragment_nick_list.xml
@@ -18,6 +18,7 @@
   -->
 
 <de.kuschku.quasseldroid.util.ui.DrawerRecyclerView 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:id="@+id/nickList"
   android:layout_width="match_parent"
@@ -25,6 +26,8 @@
   android:background="?attr/colorBackground"
   android:clipToPadding="false"
   android:fitsSystemWindows="true"
-  android:scrollbars="vertical"
+  app:fastScrollPopupBgColor="?colorAccent"
+  app:fastScrollPopupTextColor="?colorTextPrimaryInverse"
+  app:fastScrollThumbColor="?colorAccent"
   tools:listitem="@layout/widget_nick"
   tools:showIn="@layout/activity_main" />
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/IrcUserItem.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/IrcUserItem.kt
index ec8bfd49c..da69e6f49 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/IrcUserItem.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/IrcUserItem.kt
@@ -31,6 +31,7 @@ data class IrcUserItem(
   val self: Boolean,
   val networkCasemapping: String?,
   val avatarUrls: List<Avatar> = emptyList(),
+  val initial: String? = "",
   val fallbackDrawable: Drawable? = null,
   val displayNick: CharSequence? = null
 )
-- 
GitLab