From d82bf21271de086274ff424f6da35307aa27e090 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Tue, 26 Sep 2017 22:20:33 +0200
Subject: [PATCH] Further improved parts of the code

---
 .../ExampleInstrumentedTest.kt                | 12 ++--
 app/src/main/AndroidManifest.xml              | 12 ++--
 .../quasseldroid_ng/service/QuasselService.kt |  2 +-
 .../ui/ServiceBoundActivity.kt                |  2 +-
 app/src/main/res/drawable/ic_add.xml          |  8 +--
 app/src/main/res/drawable/ic_arrow_right.xml  |  8 +--
 app/src/main/res/drawable/ic_check.xml        |  8 +--
 app/src/main/res/drawable/ic_debug.xml        |  8 +--
 app/src/main/res/drawable/ic_delete.xml       |  8 +--
 app/src/main/res/drawable/ic_filter.xml       |  8 +--
 app/src/main/res/drawable/ic_format_bold.xml  |  8 +--
 app/src/main/res/drawable/ic_format_fill.xml  |  8 +--
 .../main/res/drawable/ic_format_italic.xml    |  8 +--
 app/src/main/res/drawable/ic_format_paint.xml |  8 +--
 .../main/res/drawable/ic_format_underline.xml |  8 +--
 app/src/main/res/drawable/ic_help.xml         |  8 +--
 app/src/main/res/drawable/ic_history.xml      |  8 +--
 app/src/main/res/drawable/ic_lock.xml         |  8 +--
 app/src/main/res/drawable/ic_lock_open.xml    |  8 +--
 app/src/main/res/drawable/ic_modify.xml       |  8 +--
 app/src/main/res/drawable/ic_reorder.xml      |  8 +--
 app/src/main/res/drawable/ic_scroll_down.xml  |  8 +--
 app/src/main/res/drawable/ic_send.xml         |  8 +--
 app/src/main/res/drawable/ic_server.xml       |  8 +--
 app/src/main/res/drawable/ic_status.xml       |  8 +--
 .../main/res/drawable/ic_status_channel.xml   |  8 +--
 .../drawable/ic_status_channel_offline.xml    |  8 +--
 .../main/res/drawable/ic_status_offline.xml   |  8 +--
 app/src/main/res/layout/activity_main.xml     |  2 +-
 build.gradle.kts                              | 24 +++----
 gradle.properties                             |  4 --
 invokergenerator/build.gradle.kts             |  1 -
 .../annotations/InvokerProcessor.java         | 64 +++++++++---------
 lib/build.gradle.kts                          |  1 -
 .../kuschku/libquassel/protocol/ClientData.kt |  2 +-
 .../kuschku/libquassel/protocol/Protocol.kt   | 14 ++++
 .../de/kuschku/libquassel/protocol/QTypes.kt  | 65 ++++---------------
 .../protocol/message/InitDataSerializer.kt    |  4 +-
 .../protocol/message/InitRequestSerializer.kt |  4 +-
 .../protocol/message/RpcCallSerializer.kt     |  4 +-
 .../protocol/message/SyncMessageSerializer.kt |  4 +-
 ...erializer.kt => ProtocolInfoSerializer.kt} | 11 ++--
 .../primitive/serializer/StringSerializer.kt  | 20 ------
 .../kuschku/libquassel/quassel/NetworkInfo.kt |  2 -
 .../{ProtocolMeta.kt => ProtocolInfo.kt}      |  2 +-
 .../libquassel/quassel/syncables/Identity.kt  |  3 +-
 .../libquassel/quassel/syncables/IrcUser.kt   | 14 ++--
 .../libquassel/quassel/syncables/Network.kt   | 22 ++++---
 .../quassel/syncables/RpcHandler.kt           |  2 +-
 .../libquassel/session/CoreConnection.kt      |  4 +-
 .../libquassel/session/ObjectStorage.kt       |  6 +-
 .../util/helpers/ByteBufferHelper.kt          |  7 ++
 .../libquassel/util/helpers/StringHelper.kt   |  8 +++
 .../libquassel/util/irc/HostmaskHelper.kt     | 33 ++++++++++
 54 files changed, 275 insertions(+), 272 deletions(-)
 create mode 100644 lib/src/main/java/de/kuschku/libquassel/protocol/Protocol.kt
 rename lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/{ProtocolSerializer.kt => ProtocolInfoSerializer.kt} (77%)
 delete mode 100644 lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt
 rename lib/src/main/java/de/kuschku/libquassel/quassel/{ProtocolMeta.kt => ProtocolInfo.kt} (51%)
 create mode 100644 lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt

diff --git a/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt b/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt
index d3c465393..e100dfcad 100644
--- a/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt
+++ b/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt
@@ -13,10 +13,10 @@ import org.junit.runner.RunWith
  */
 @RunWith(AndroidJUnit4::class)
 class ExampleInstrumentedTest {
-    @Test
-    fun useAppContext() {
-        // Context of the app under test.
-        val appContext = InstrumentationRegistry.getTargetContext()
-        assertEquals("de.kuschku.quasseldroid_ng", appContext.packageName)
-    }
+  @Test
+  fun useAppContext() {
+    // Context of the app under test.
+    val appContext = InstrumentationRegistry.getTargetContext()
+    assertEquals("de.kuschku.quasseldroid_ng", appContext.packageName)
+  }
 }
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 37bc00cb4..1c13407cc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,11 +7,11 @@
 
   <application
     android:name=".QuasseldroidNG"
-    android:label="@string/app_name"
-    android:icon="@mipmap/ic_launcher"
-    android:theme="@style/AppTheme"
     android:allowBackup="true"
-    android:supportsRtl="true">
+    android:icon="@mipmap/ic_launcher"
+    android:label="@string/app_name"
+    android:supportsRtl="true"
+    android:theme="@style/AppTheme">
     <activity
       android:name=".ui.MainActivity"
       android:exported="true"
@@ -24,9 +24,9 @@
     </activity>
     <service
       android:name=".service.QuasselService"
-      android:label="@string/connection_service"
       android:description="@string/connection_service_description"
-      android:exported="false" />
+      android:exported="false"
+      android:label="@string/connection_service" />
   </application>
 
 </manifest>
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt
index b0e60d6a7..7387e658a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt
@@ -85,7 +85,7 @@ class QuasselService : LifecycleService() {
         Protocol_Feature.Compression,
         Protocol_Feature.TLS
       ),
-      supportedProtocols = byteArrayOf(0x02)
+      supportedProtocols = listOf(Protocol.Datastream)
     )
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt
index 6df4c86ad..e46c5ad49 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt
@@ -6,8 +6,8 @@ import android.content.Intent
 import android.content.ServiceConnection
 import android.os.IBinder
 import android.support.v7.app.AppCompatActivity
-import de.kuschku.quasseldroid_ng.service.QuasselService
 import de.kuschku.libquassel.session.Backend
+import de.kuschku.quasseldroid_ng.service.QuasselService
 
 abstract class ServiceBoundActivity : AppCompatActivity() {
   protected val backend = MutableLiveData<Backend?>()
diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml
index 0d2aa51b0..b4463c685 100644
--- a/app/src/main/res/drawable/ic_add.xml
+++ b/app/src/main/res/drawable/ic_add.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" />
diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml
index 50e06d4b9..3ae7624da 100644
--- a/app/src/main/res/drawable/ic_arrow_right.xml
+++ b/app/src/main/res/drawable/ic_arrow_right.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z" />
diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml
index adb35a931..3b6dbf9c0 100644
--- a/app/src/main/res/drawable/ic_check.xml
+++ b/app/src/main/res/drawable/ic_check.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
diff --git a/app/src/main/res/drawable/ic_debug.xml b/app/src/main/res/drawable/ic_debug.xml
index 5da4c72cf..44e9d1892 100644
--- a/app/src/main/res/drawable/ic_debug.xml
+++ b/app/src/main/res/drawable/ic_debug.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M14,12H10V10H14M14,16H10V14H14M20,8H17.19C16.74,7.22 16.12,6.55 15.37,6.04L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.5,5 12,5C11.5,5 11.04,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6.04C7.88,6.55 7.26,7.22 6.81,8H4V10H6.09C6.04,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.04,15.67 6.09,16H4V18H6.81C7.85,19.79 9.78,21 12,21C14.22,21 16.15,19.79 17.19,18H20V16H17.91C17.96,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.96,10.33 17.91,10H20V8Z" />
diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml
index d17b5c1b7..3158f90e5 100644
--- a/app/src/main/res/drawable/ic_delete.xml
+++ b/app/src/main/res/drawable/ic_delete.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z" />
diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml
index 19feffee2..352dded08 100644
--- a/app/src/main/res/drawable/ic_filter.xml
+++ b/app/src/main/res/drawable/ic_filter.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M3,2H21V2H21V4H20.92L14,10.92V22.91L10,18.91V10.91L3.09,4H3V2Z" />
diff --git a/app/src/main/res/drawable/ic_format_bold.xml b/app/src/main/res/drawable/ic_format_bold.xml
index 1e70c5e66..28d62830f 100644
--- a/app/src/main/res/drawable/ic_format_bold.xml
+++ b/app/src/main/res/drawable/ic_format_bold.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M13.5,15.5H10V12.5H13.5A1.5,1.5 0 0,1 15,14A1.5,1.5 0 0,1 13.5,15.5M10,6.5H13A1.5,1.5 0 0,1 14.5,8A1.5,1.5 0 0,1 13,9.5H10M15.6,10.79C16.57,10.11 17.25,9 17.25,8C17.25,5.74 15.5,4 13.25,4H7V18H14.04C16.14,18 17.75,16.3 17.75,14.21C17.75,12.69 16.89,11.39 15.6,10.79Z" />
diff --git a/app/src/main/res/drawable/ic_format_fill.xml b/app/src/main/res/drawable/ic_format_fill.xml
index 950ec4dee..647776cf6 100644
--- a/app/src/main/res/drawable/ic_format_fill.xml
+++ b/app/src/main/res/drawable/ic_format_fill.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M19,11.5C19,11.5 17,13.67 17,15A2,2 0 0,0 19,17A2,2 0 0,0 21,15C21,13.67 19,11.5 19,11.5M5.21,10L10,5.21L14.79,10M16.56,8.94L7.62,0L6.21,1.41L8.59,3.79L3.44,8.94C2.85,9.5 2.85,10.47 3.44,11.06L8.94,16.56C9.23,16.85 9.62,17 10,17C10.38,17 10.77,16.85 11.06,16.56L16.56,11.06C17.15,10.47 17.15,9.5 16.56,8.94Z" />
diff --git a/app/src/main/res/drawable/ic_format_italic.xml b/app/src/main/res/drawable/ic_format_italic.xml
index 5007fd7c8..7004df917 100644
--- a/app/src/main/res/drawable/ic_format_italic.xml
+++ b/app/src/main/res/drawable/ic_format_italic.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M10,4V7H12.21L8.79,15H6V18H14V15H11.79L15.21,7H18V4H10Z" />
diff --git a/app/src/main/res/drawable/ic_format_paint.xml b/app/src/main/res/drawable/ic_format_paint.xml
index 698113842..7e713bde2 100644
--- a/app/src/main/res/drawable/ic_format_paint.xml
+++ b/app/src/main/res/drawable/ic_format_paint.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M18,4V3A1,1 0 0,0 17,2H5A1,1 0 0,0 4,3V7A1,1 0 0,0 5,8H17A1,1 0 0,0 18,7V6H19V10H9V21A1,1 0 0,0 10,22H12A1,1 0 0,0 13,21V12H21V4H18Z" />
diff --git a/app/src/main/res/drawable/ic_format_underline.xml b/app/src/main/res/drawable/ic_format_underline.xml
index 7e79bdc6d..ac556f071 100644
--- a/app/src/main/res/drawable/ic_format_underline.xml
+++ b/app/src/main/res/drawable/ic_format_underline.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M5,21H19V19H5V21M12,17A6,6 0 0,0 18,11V3H15.5V11A3.5,3.5 0 0,1 12,14.5A3.5,3.5 0 0,1 8.5,11V3H6V11A6,6 0 0,0 12,17Z" />
diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml
index ae0a04424..a80eaed15 100644
--- a/app/src/main/res/drawable/ic_help.xml
+++ b/app/src/main/res/drawable/ic_help.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z" />
diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml
index bad03f613..8482d8d54 100644
--- a/app/src/main/res/drawable/ic_history.xml
+++ b/app/src/main/res/drawable/ic_history.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M11,7V12.11L15.71,14.9L16.5,13.62L12.5,11.25V7M12.5,2C8.97,2 5.91,3.92 4.27,6.77L2,4.5V11H8.5L5.75,8.25C6.96,5.73 9.5,4 12.5,4A7.5,7.5 0 0,1 20,11.5A7.5,7.5 0 0,1 12.5,19C9.23,19 6.47,16.91 5.44,14H3.34C4.44,18.03 8.11,21 12.5,21C17.74,21 22,16.75 22,11.5A9.5,9.5 0 0,0 12.5,2Z" />
diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml
index dba5a1ad5..f6436819f 100644
--- a/app/src/main/res/drawable/ic_lock.xml
+++ b/app/src/main/res/drawable/ic_lock.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z" />
diff --git a/app/src/main/res/drawable/ic_lock_open.xml b/app/src/main/res/drawable/ic_lock_open.xml
index da3b6fdf0..384661318 100644
--- a/app/src/main/res/drawable/ic_lock_open.xml
+++ b/app/src/main/res/drawable/ic_lock_open.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10A2,2 0 0,1 6,8H15V6A3,3 0 0,0 12,3A3,3 0 0,0 9,6H7A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,17A2,2 0 0,1 10,15A2,2 0 0,1 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17Z" />
diff --git a/app/src/main/res/drawable/ic_modify.xml b/app/src/main/res/drawable/ic_modify.xml
index b919ec831..7af826410 100644
--- a/app/src/main/res/drawable/ic_modify.xml
+++ b/app/src/main/res/drawable/ic_modify.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" />
diff --git a/app/src/main/res/drawable/ic_reorder.xml b/app/src/main/res/drawable/ic_reorder.xml
index 77a4c4e27..530464729 100644
--- a/app/src/main/res/drawable/ic_reorder.xml
+++ b/app/src/main/res/drawable/ic_reorder.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M3,15H21V13H3V15M3,19H21V17H3V19M3,11H21V9H3V11M3,5V7H21V5H3Z" />
diff --git a/app/src/main/res/drawable/ic_scroll_down.xml b/app/src/main/res/drawable/ic_scroll_down.xml
index 0fbf78884..e2ed20f91 100644
--- a/app/src/main/res/drawable/ic_scroll_down.xml
+++ b/app/src/main/res/drawable/ic_scroll_down.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M16.59,5.59L18,7L12,13L6,7L7.41,5.59L12,10.17L16.59,5.59M16.59,11.59L18,13L12,19L6,13L7.41,11.59L12,16.17L16.59,11.59Z" />
diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml
index 8ca7d5986..474024b73 100644
--- a/app/src/main/res/drawable/ic_send.xml
+++ b/app/src/main/res/drawable/ic_send.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M2,21L23,12L2,3V10L17,12L2,14V21Z" />
diff --git a/app/src/main/res/drawable/ic_server.xml b/app/src/main/res/drawable/ic_server.xml
index 624297401..e0df0c772 100644
--- a/app/src/main/res/drawable/ic_server.xml
+++ b/app/src/main/res/drawable/ic_server.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
   <path
     android:fillColor="#000"
     android:pathData="M13,18H14A1,1 0 0,1 15,19H22V21H15A1,1 0 0,1 14,22H10A1,1 0 0,1 9,21H2V19H9A1,1 0 0,1 10,18H11V16H4A1,1 0 0,1 3,15V11A1,1 0 0,1 4,10H20A1,1 0 0,1 21,11V15A1,1 0 0,1 20,16H13V18M4,2H20A1,1 0 0,1 21,3V7A1,1 0 0,1 20,8H4A1,1 0 0,1 3,7V3A1,1 0 0,1 4,2M9,6H10V4H9V6M9,14H10V12H9V14M5,4V6H7V4H5M5,12V14H7V12H5Z" />
diff --git a/app/src/main/res/drawable/ic_status.xml b/app/src/main/res/drawable/ic_status.xml
index 9d9344517..46b6f2a0c 100644
--- a/app/src/main/res/drawable/ic_status.xml
+++ b/app/src/main/res/drawable/ic_status.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24.0"
-        android:viewportWidth="24.000002">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24.0"
+  android:viewportWidth="24.000002">
   <path
     android:fillColor="#FF000000"
     android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0" />
diff --git a/app/src/main/res/drawable/ic_status_channel.xml b/app/src/main/res/drawable/ic_status_channel.xml
index ec005a7a2..7512ee6ae 100644
--- a/app/src/main/res/drawable/ic_status_channel.xml
+++ b/app/src/main/res/drawable/ic_status_channel.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24.0"
-        android:viewportWidth="24.000002">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24.0"
+  android:viewportWidth="24.000002">
   <path
     android:fillColor="#FF000000"
     android:pathData="m12,2c-5.523,0 -10,4.477 -10,10s4.477,10 10,10 10,-4.477 10,-10 -4.477,-10 -10,-10zM10.663,7.049a0.625,0.625 0,0 1,0.063 0.004,0.625 0.625,0 0,1 0.062,0.011 0.625,0.625 0,0 1,0.06 0.017,0.625 0.625,0 0,1 0.058,0.023 0.625,0.625 0,0 1,0.056 0.028,0.625 0.625,0 0,1 0.053,0.034 0.625,0.625 0,0 1,0.049 0.039,0.625 0.625,0 0,1 0.045,0.044 0.625,0.625 0,0 1,0.04 0.048,0.625 0.625,0 0,1 0.035,0.051 0.625,0.625 0,0 1,0.03 0.055,0.625 0.625,0 0,1 0.024,0.058 0.625,0.625 0,0 1,0.018 0.06,0.625 0.625,0 0,1 0.013,0.061 0.625,0.625 0,0 1,0.006 0.063,0.625 0.625,0 0,1 0,0.063 0.625,0.625 0,0 1,-0.006 0.062l-0.271,1.953 2.78,-0.015 0.292,-2.109a0.625,0.625 0,0 1,0.007 -0.043,0.625 0.625,0 0,1 0.015,-0.061 0.625,0.625 0,0 1,0.021 -0.059,0.625 0.625,0 0,1 0.027,-0.056 0.625,0.625 0,0 1,0.033 -0.054,0.625 0.625,0 0,1 0.037,-0.05 0.625,0.625 0,0 1,0.043 -0.046,0.625 0.625,0 0,1 0.047,-0.041 0.625,0.625 0,0 1,0.05 -0.037,0.625 0.625,0 0,1 0.054,-0.032 0.625,0.625 0,0 1,0.057 -0.026,0.625 0.625,0 0,1 0.059,-0.02 0.625,0.625 0,0 1,0.061 -0.014,0.625 0.625,0 0,1 0.062,-0.008 0.625,0.625 0,0 1,0.063 -0.001,0.625 0.625,0 0,1 0.062,0.004 0.625,0.625 0,0 1,0.062 0.011,0.625 0.625,0 0,1 0.06,0.017 0.625,0.625 0,0 1,0.058 0.023,0.625 0.625,0 0,1 0.056,0.028 0.625,0.625 0,0 1,0.053 0.034,0.625 0.625,0 0,1 0.049,0.039 0.625,0.625 0,0 1,0.045 0.044,0.625 0.625,0 0,1 0.04,0.048 0.625,0.625 0,0 1,0.035 0.051,0.625 0.625,0 0,1 0.03,0.055 0.625,0.625 0,0 1,0.024 0.058,0.625 0.625,0 0,1 0.018,0.06 0.625,0.625 0,0 1,0.013 0.061,0.625 0.625,0 0,1 0.006,0.063 0.625,0.625 0,0 1,0 0.063,0.625 0.625,0 0,1 -0.006,0.062l-0.268,1.932 1.609,-0.008a0.625,0.625 0,0 1,0.041 0.001,0.625 0.625,0 0,1 0.062,0.006 0.625,0.625 0,0 1,0.061 0.012,0.625 0.625,0 0,1 0.06,0.019 0.625,0.625 0,0 1,0.058 0.024,0.625 0.625,0 0,1 0.055,0.03 0.625,0.625 0,0 1,0.052 0.035,0.625 0.625,0 0,1 0.048,0.04 0.625,0.625 0,0 1,0.043 0.045,0.625 0.625,0 0,1 0.039,0.049 0.625,0.625 0,0 1,0.034 0.053,0.625 0.625,0 0,1 0.028,0.056 0.625,0.625 0,0 1,0.023 0.058,0.625 0.625,0 0,1 0.017,0.06 0.625,0.625 0,0 1,0.011 0.062,0.625 0.625,0 0,1 0.004,0.063 0.625,0.625 0,0 1,-0.002 0.063,0.625 0.625,0 0,1 -0.008,0.062 0.625,0.625 0,0 1,-0.014 0.061,0.625 0.625,0 0,1 -0.02,0.059 0.625,0.625 0,0 1,-0.026 0.057,0.625 0.625,0 0,1 -0.032,0.054 0.625,0.625 0,0 1,-0.037 0.051,0.625 0.625,0 0,1 -0.041,0.046 0.625,0.625 0,0 1,-0.046 0.043,0.625 0.625,0 0,1 -0.05,0.038 0.625,0.625 0,0 1,-0.053 0.032,0.625 0.625,0 0,1 -0.057,0.026 0.625,0.625 0,0 1,-0.059 0.021,0.625 0.625,0 0,1 -0.06,0.015 0.625,0.625 0,0 1,-0.062 0.009,0.625 0.625,0 0,1 -0.063,0.003l-1.789,0.009 -0.331,2.388 1.712,-0.009a0.625,0.625 0,0 1,0.043 0.001,0.625 0.625,0 0,1 0.062,0.006 0.625,0.625 0,0 1,0.061 0.012,0.625 0.625,0 0,1 0.06,0.019 0.625,0.625 0,0 1,0.058 0.024,0.625 0.625,0 0,1 0.055,0.03 0.625,0.625 0,0 1,0.052 0.035,0.625 0.625,0 0,1 0.048,0.041 0.625,0.625 0,0 1,0.043 0.044,0.625 0.625,0 0,1 0.039,0.049 0.625,0.625 0,0 1,0.034 0.053,0.625 0.625,0 0,1 0.028,0.056 0.625,0.625 0,0 1,0.023 0.058,0.625 0.625,0 0,1 0.017,0.06 0.625,0.625 0,0 1,0.01 0.062,0.625 0.625,0 0,1 0.005,0.062 0.625,0.625 0,0 1,-0.002 0.063,0.625 0.625,0 0,1 -0.008,0.062 0.625,0.625 0,0 1,-0.014 0.061,0.625 0.625,0 0,1 -0.021,0.059 0.625,0.625 0,0 1,-0.026 0.057,0.625 0.625,0 0,1 -0.031,0.054 0.625,0.625 0,0 1,-0.037 0.05,0.625 0.625,0 0,1 -0.041,0.047 0.625,0.625 0,0 1,-0.046 0.042,0.625 0.625,0 0,1 -0.05,0.038 0.625,0.625 0,0 1,-0.053 0.032,0.625 0.625,0 0,1 -0.057,0.027 0.625,0.625 0,0 1,-0.059 0.021,0.625 0.625,0 0,1 -0.06,0.015 0.625,0.625 0,0 1,-0.062 0.009,0.625 0.625,0 0,1 -0.063,0.002l-1.892,0.01 -0.305,2.197a0.625,0.625 0,0 1,-0.004 0.026,0.625 0.625,0 0,1 -0.015,0.06 0.625,0.625 0,0 1,-0.02 0.06,0.625 0.625,0 0,1 -0.026,0.057 0.625,0.625 0,0 1,-0.032 0.054,0.625 0.625,0 0,1 -0.037,0.051 0.625,0.625 0,0 1,-0.042 0.046,0.625 0.625,0 0,1 -0.046,0.042 0.625,0.625 0,0 1,-0.05 0.038,0.625 0.625,0 0,1 -0.053,0.032 0.625,0.625 0,0 1,-0.057 0.027,0.625 0.625,0 0,1 -0.059,0.021 0.625,0.625 0,0 1,-0.06 0.015,0.625 0.625,0 0,1 -0.062,0.009 0.625,0.625 0,0 1,-0.063 0.002,0.625 0.625,0 0,1 -0.063,-0.003 0.625,0.625 0,0 1,-0.062 -0.01,0.625 0.625,0 0,1 -0.06,-0.016 0.625,0.625 0,0 1,-0.059 -0.022,0.625 0.625,0 0,1 -0.056,-0.028 0.625,0.625 0,0 1,-0.053 -0.033,0.625 0.625,0 0,1 -0.049,-0.038 0.625,0.625 0,0 1,-0.045 -0.043,0.625 0.625,0 0,1 -0.041,-0.047 0.625,0.625 0,0 1,-0.036 -0.051,0.625 0.625,0 0,1 -0.031,-0.054 0.625,0.625 0,0 1,-0.025 -0.058,0.625 0.625,0 0,1 -0.019,-0.059 0.625,0.625 0,0 1,-0.013 -0.061,0.625 0.625,0 0,1 -0.007,-0.063 0.625,0.625 0,0 1,-0.001 -0.063,0.625 0.625,0 0,1 0.005,-0.062l0.28,-2.019 -2.78,0.015 -0.302,2.176a0.625,0.625 0,0 1,-0.004 0.026,0.625 0.625,0 0,1 -0.015,0.061 0.625,0.625 0,0 1,-0.02 0.059,0.625 0.625,0 0,1 -0.026,0.057 0.625,0.625 0,0 1,-0.032 0.054,0.625 0.625,0 0,1 -0.037,0.051 0.625,0.625 0,0 1,-0.041 0.046,0.625 0.625,0 0,1 -0.046,0.042 0.625,0.625 0,0 1,-0.05 0.038,0.625 0.625,0 0,1 -0.054,0.032 0.625,0.625 0,0 1,-0.057 0.027,0.625 0.625,0 0,1 -0.059,0.021 0.625,0.625 0,0 1,-0.061 0.015,0.625 0.625,0 0,1 -0.062,0.009 0.625,0.625 0,0 1,-0.063 0.002,0.625 0.625,0 0,1 -0.063,-0.003 0.625,0.625 0,0 1,-0.062 -0.01,0.625 0.625,0 0,1 -0.061,-0.016 0.625,0.625 0,0 1,-0.059 -0.022,0.625 0.625,0 0,1 -0.056,-0.028 0.625,0.625 0,0 1,-0.053 -0.033,0.625 0.625,0 0,1 -0.049,-0.038 0.625,0.625 0,0 1,-0.045 -0.043,0.625 0.625,0 0,1 -0.041,-0.047 0.625,0.625 0,0 1,-0.036 -0.051,0.625 0.625,0 0,1 -0.031,-0.054 0.625,0.625 0,0 1,-0.025 -0.057,0.625 0.625,0 0,1 -0.019,-0.06 0.625,0.625 0,0 1,-0.013 -0.061,0.625 0.625,0 0,1 -0.007,-0.062 0.625,0.625 0,0 1,-0.001 -0.063,0.625 0.625,0 0,1 0.005,-0.063l0.277,-1.998 -1.418,0.007a0.625,0.625 0,0 1,-0.043 -0.001,0.625 0.625,0 0,1 -0.062,-0.006 0.625,0.625 0,0 1,-0.062 -0.012,0.625 0.625,0 0,1 -0.06,-0.019 0.625,0.625 0,0 1,-0.058 -0.024,0.625 0.625,0 0,1 -0.055,-0.03 0.625,0.625 0,0 1,-0.052 -0.036,0.625 0.625,0 0,1 -0.048,-0.04 0.625,0.625 0,0 1,-0.043 -0.045,0.625 0.625,0 0,1 -0.039,-0.049 0.625,0.625 0,0 1,-0.034 -0.053,0.625 0.625,0 0,1 -0.028,-0.056 0.625,0.625 0,0 1,-0.023 -0.058,0.625 0.625,0 0,1 -0.017,-0.06 0.625,0.625 0,0 1,-0.011 -0.062,0.625 0.625,0 0,1 -0.004,-0.063 0.625,0.625 0,0 1,0.002 -0.063,0.625 0.625,0 0,1 0.008,-0.062 0.625,0.625 0,0 1,0.014 -0.06,0.625 0.625,0 0,1 0.02,-0.059 0.625,0.625 0,0 1,0.026 -0.057,0.625 0.625,0 0,1 0.031,-0.054 0.625,0.625 0,0 1,0.037 -0.051,0.625 0.625,0 0,1 0.042,-0.046 0.625,0.625 0,0 1,0.046 -0.043,0.625 0.625,0 0,1 0.05,-0.037 0.625,0.625 0,0 1,0.054 -0.032,0.625 0.625,0 0,1 0.057,-0.027 0.625,0.625 0,0 1,0.059 -0.021,0.625 0.625,0 0,1 0.06,-0.015 0.625,0.625 0,0 1,0.062 -0.009,0.625 0.625,0 0,1 0.063,-0.002l1.598,-0.008 0.331,-2.388 -1.52,0.008a0.625,0.625 0,0 1,-0.042 -0.001,0.625 0.625,0 0,1 -0.062,-0.006 0.625,0.625 0,0 1,-0.062 -0.012,0.625 0.625,0 0,1 -0.06,-0.019 0.625,0.625 0,0 1,-0.058 -0.024,0.625 0.625,0 0,1 -0.055,-0.03 0.625,0.625 0,0 1,-0.052 -0.035,0.625 0.625,0 0,1 -0.048,-0.041 0.625,0.625 0,0 1,-0.043 -0.044,0.625 0.625,0 0,1 -0.039,-0.049 0.625,0.625 0,0 1,-0.034 -0.052,0.625 0.625,0 0,1 -0.028,-0.056 0.625,0.625 0,0 1,-0.023 -0.058,0.625 0.625,0 0,1 -0.017,-0.06 0.625,0.625 0,0 1,-0.01 -0.062,0.625 0.625,0 0,1 -0.005,-0.062 0.625,0.625 0,0 1,0.002 -0.063,0.625 0.625,0 0,1 0.008,-0.062 0.625,0.625 0,0 1,0.014 -0.061,0.625 0.625,0 0,1 0.021,-0.059 0.625,0.625 0,0 1,0.026 -0.057,0.625 0.625,0 0,1 0.031,-0.054 0.625,0.625 0,0 1,0.037 -0.05,0.625 0.625,0 0,1 0.041,-0.047 0.625,0.625 0,0 1,0.046 -0.042,0.625 0.625,0 0,1 0.05,-0.038 0.625,0.625 0,0 1,0.054 -0.032,0.625 0.625,0 0,1 0.057,-0.027 0.625,0.625 0,0 1,0.059 -0.021,0.625 0.625,0 0,1 0.06,-0.015 0.625,0.625 0,0 1,0.062 -0.009,0.625 0.625,0 0,1 0.063,-0.002l1.7,-0.009 0.295,-2.13a0.625,0.625 0,0 1,0.007 -0.043,0.625 0.625,0 0,1 0.015,-0.06 0.625,0.625 0,0 1,0.021 -0.059,0.625 0.625,0 0,1 0.027,-0.056 0.625,0.625 0,0 1,0.032 -0.054,0.625 0.625,0 0,1 0.038,-0.05 0.625,0.625 0,0 1,0.042 -0.046,0.625 0.625,0 0,1 0.047,-0.041 0.625,0.625 0,0 1,0.05 -0.037,0.625 0.625,0 0,1 0.054,-0.031 0.625,0.625 0,0 1,0.057 -0.026,0.625 0.625,0 0,1 0.06,-0.02 0.625,0.625 0,0 1,0.06 -0.014,0.625 0.625,0 0,1 0.062,-0.008 0.625,0.625 0,0 1,0.063 -0.002zM13.603,10.957 L10.823,10.972 10.492,13.36 13.271,13.345 13.603,10.958z" />
diff --git a/app/src/main/res/drawable/ic_status_channel_offline.xml b/app/src/main/res/drawable/ic_status_channel_offline.xml
index 139b24530..04fd35190 100644
--- a/app/src/main/res/drawable/ic_status_channel_offline.xml
+++ b/app/src/main/res/drawable/ic_status_channel_offline.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24.0"
-        android:viewportWidth="24.0">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24.0"
+  android:viewportWidth="24.0">
   <path
     android:fillColor="#FF000000"
     android:pathData="m10.66,7.04a0.625,0.625 0,0 0,-0.634 0.548l-0.295,2.13 -1.7,0.009a0.625,0.625 0,1 0,0.006 1.25l1.52,-0.008 -0.331,2.388 -1.598,0.008a0.625,0.625 0,1 0,0.006 1.25l1.418,-0.007 -0.277,1.998a0.625,0.625 0,1 0,1.238 0.172l0.302,-2.176 2.78,-0.015 -0.28,2.019a0.625,0.625 0,1 0,1.238 0.172l0.305,-2.197 1.892,-0.01a0.625,0.625 0,1 0,-0.007 -1.25l-1.712,0.009 0.331,-2.388 1.789,-0.009a0.625,0.625 0,1 0,-0.006 -1.25l-1.609,0.008 0.268,-1.932a0.625,0.625 0,0 0,-0.604 -0.719,0.625 0.625,0 0,0 -0.635,0.548l-0.292,2.109 -2.78,0.015 0.271,-1.953a0.625,0.625 0,0 0,-0.604 -0.719zM13.6,10.948 L13.269,13.336 10.489,13.35 10.82,10.963 13.6,10.948zM12,1.998c-5.514,0 -10,4.486 -10,10s4.486,10 10,10 10,-4.486 10,-10 -4.486,-10 -10,-10zM12,3.498c4.703,0 8.5,3.796 8.5,8.5s-3.797,8.5 -8.5,8.5 -8.5,-3.797 -8.5,-8.5 3.797,-8.5 8.5,-8.5z" />
diff --git a/app/src/main/res/drawable/ic_status_offline.xml b/app/src/main/res/drawable/ic_status_offline.xml
index 3b528c780..bb9098142 100644
--- a/app/src/main/res/drawable/ic_status_offline.xml
+++ b/app/src/main/res/drawable/ic_status_offline.xml
@@ -20,10 +20,10 @@
   -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24.0"
-        android:viewportWidth="24.000002">
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24.0"
+  android:viewportWidth="24.000002">
   <path
     android:fillColor="#FF000000"
     android:pathData="m12,2c-5.514,0 -10,4.486 -10,10 0,5.514 4.486,10 10,10s10,-4.486 10,-10 -4.486,-10 -10,-10zM12,3.5c4.703,0 8.5,3.796 8.5,8.5 -0,4.703 -3.797,8.5 -8.5,8.5s-8.5,-3.797 -8.5,-8.5 3.797,-8.5 8.5,-8.5z" />
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 064528ddd..c125e2959 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -100,6 +100,6 @@
       android:id="@+id/errorList"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:textIsSelectable="true"/>
+      android:textIsSelectable="true" />
   </LinearLayout>
 </ScrollView>
diff --git a/build.gradle.kts b/build.gradle.kts
index ac8a8cc8d..6228f732b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,17 +1,17 @@
 buildscript {
-    repositories {
-        google()
-        jcenter()
-    }
-    dependencies {
-        classpath("com.android.tools.build:gradle:3.0.0-beta6")
-        classpath(kotlin("gradle-plugin"))
-    }
+  repositories {
+    google()
+    jcenter()
+  }
+  dependencies {
+    classpath("com.android.tools.build:gradle:3.0.0-beta6")
+    classpath(kotlin("gradle-plugin"))
+  }
 }
 
 allprojects {
-    repositories {
-        google()
-        jcenter()
-    }
+  repositories {
+    google()
+    jcenter()
+  }
 }
diff --git a/gradle.properties b/gradle.properties
index 5a528ef03..3084e11b1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,16 +1,12 @@
 # Project-wide Gradle settings.
-
 # IDE (e.g. Android Studio) users:
 # Gradle settings configured through the IDE *will override*
 # any settings specified in this file.
-
 # For more details on how to configure your build environment visit
 # http://www.gradle.org/docs/current/userguide/build_environment.html
-
 # Specifies the JVM arguments used for the daemon process.
 # The setting is particularly useful for tweaking memory settings.
 org.gradle.jvmargs=-Xmx2048m
-
 # When configured, Gradle will run in incubating parallel mode.
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts
index de61f4ff8..2a9f340d6 100644
--- a/invokergenerator/build.gradle.kts
+++ b/invokergenerator/build.gradle.kts
@@ -1,4 +1,3 @@
-
 import org.gradle.kotlin.dsl.DependencyHandlerScope
 import org.gradle.kotlin.dsl.dependencies
 import org.gradle.kotlin.dsl.java
diff --git a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
index 24fe7fbb1..2bcff1b55 100644
--- a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
+++ b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
@@ -47,38 +47,6 @@ public class InvokerProcessor extends AbstractProcessor {
         messager = processingEnv.getMessager();
     }
 
-    private class SlotElement {
-        final ExecutableElement element;
-        final ExecutableType type;
-
-        final String slotName;
-
-        final Slot slot;
-
-        public SlotElement(ExecutableElement element, ExecutableType type, String slotName, Slot slot) {
-            this.element = element;
-            this.type = type;
-            this.slotName = slotName;
-            this.slot = slot;
-        }
-    }
-
-    private class SyncableElement {
-        PackageElement packageElement;
-        TypeElement typeElement;
-
-        Syncable annotation;
-
-        List<SlotElement> slots;
-
-        public SyncableElement(PackageElement packageElement, TypeElement typeElement, Syncable annotation, List<SlotElement> slots) {
-            this.packageElement = packageElement;
-            this.typeElement = typeElement;
-            this.annotation = annotation;
-            this.slots = slots;
-        }
-    }
-
     @Override
     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
         List<SyncableElement> syncableElements = new ArrayList<>();
@@ -238,4 +206,36 @@ public class InvokerProcessor extends AbstractProcessor {
 
         javaFile.writeTo(filer);
     }
+
+    private class SlotElement {
+        final ExecutableElement element;
+        final ExecutableType type;
+
+        final String slotName;
+
+        final Slot slot;
+
+        public SlotElement(ExecutableElement element, ExecutableType type, String slotName, Slot slot) {
+            this.element = element;
+            this.type = type;
+            this.slotName = slotName;
+            this.slot = slot;
+        }
+    }
+
+    private class SyncableElement {
+        PackageElement packageElement;
+        TypeElement typeElement;
+
+        Syncable annotation;
+
+        List<SlotElement> slots;
+
+        public SyncableElement(PackageElement packageElement, TypeElement typeElement, Syncable annotation, List<SlotElement> slots) {
+            this.packageElement = packageElement;
+            this.typeElement = typeElement;
+            this.annotation = annotation;
+            this.slots = slots;
+        }
+    }
 }
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index b6ac7eae9..7655a3b92 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -1,4 +1,3 @@
-
 import org.gradle.api.Project
 import org.gradle.api.artifacts.ExternalModuleDependency
 import org.gradle.kotlin.dsl.*
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt
index 4242b9cf0..cbd491c3f 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt
@@ -7,5 +7,5 @@ data class ClientData(
   val buildDate: Instant,
   val clientFeatures: Quassel_Features,
   val protocolFeatures: Protocol_Features,
-  val supportedProtocols: ByteArray
+  val supportedProtocols: List<Protocol>
 )
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/Protocol.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Protocol.kt
new file mode 100644
index 000000000..355c82cd9
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Protocol.kt
@@ -0,0 +1,14 @@
+package de.kuschku.libquassel.protocol
+
+enum class Protocol(private val value: Byte) {
+  Legacy(0x01),
+  Datastream(0x02);
+
+  fun toDouble(): Double = value.toDouble()
+  fun toFloat(): Float = value.toFloat()
+  fun toLong(): Long = value.toLong()
+  fun toInt(): Int = value.toInt()
+  fun toChar(): Char = value.toChar()
+  fun toShort(): Short = value.toShort()
+  fun toByte(): Byte = value
+}
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
index 8170d22fb..090db4833 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
@@ -1,14 +1,13 @@
 package de.kuschku.libquassel.protocol
 
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
-import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.ProtocolFeature
 import de.kuschku.libquassel.quassel.QuasselFeature
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.util.Flags
 import de.kuschku.libquassel.util.ShortFlags
+import de.kuschku.libquassel.util.helpers.deserializeString
 import java.nio.ByteBuffer
 
 typealias QStringList = List<String?>
@@ -48,23 +47,19 @@ typealias UShort = Short
 typealias UInt = Int
 typealias ULong = Long
 
-inline val SLOT
-  get() = Throwable().stackTrace.first().methodName
-
 typealias ARG = QVariant_
 
-fun QVariantMap.toVariantList(): QVariantList =
-  entries.flatMap { (key, value) ->
-    listOf(QVariant_(key.serializeString(StringSerializer.UTF8), Type.QByteArray), value)
+fun QVariantList.toVariantMap(): QVariantMap {
+  val map = HashMap<String, QVariant_>()
+  var i = 0
+  while (i < size) {
+    val key = get(i).value<ByteBuffer?>().deserializeString(StringSerializer.UTF8) ?: ""
+    val value = get(i + 1)
+    map.put(key, value)
+    i += 2
   }
-
-fun QVariantList.toVariantMap(): QVariantMap =
-  (0 until size step 2).map {
-    Pair(
-      get(it).value<ByteBuffer?>().deserializeString(StringSerializer.UTF8) ?: "",
-      get(it + 1)
-    )
-  }.toMap()
+  return map
+}
 
 fun <K, V> List<Map<K, V>>.transpose(): Map<K, List<V>> {
   val result = mutableMapOf<K, MutableList<V>>()
@@ -75,41 +70,3 @@ fun <K, V> List<Map<K, V>>.transpose(): Map<K, List<V>> {
   }
   return result
 }
-
-
-fun <K, V> Map<K, List<V>>.transpose(): List<Map<K, V>> {
-  val result = MutableList(values.map(List<*>::size).max() ?: 0) { mutableMapOf<K, V>() }
-  this.entries.forEach { (key, values) ->
-    values.forEachIndexed { index, value ->
-      result[index][key] = value
-    }
-  }
-  return result
-}
-
-fun nickFromMask(mask: String): String {
-  val (nick, _, _) = splitHostMask(mask)
-  return nick
-}
-
-fun userFromMask(mask: String): String {
-  val (_, user, _) = splitHostMask(mask)
-  return user
-}
-
-fun hostFromMask(mask: String): String {
-  val (_, _, host) = splitHostMask(mask)
-  return host
-}
-
-fun splitHostMask(mask: String): Triple<String, String, String> {
-  if (!mask.contains("@"))
-    return Triple(mask, "", "")
-
-  val (userPart, host) = mask.split("@", limit = 2)
-  if (!userPart.contains("!"))
-    return Triple(mask, "", host)
-
-  val (nick, user) = userPart.split('!', limit = 2)
-  return Triple(nick, user, host)
-}
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt
index 286892e6f..2f85f5ac7 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt
@@ -2,8 +2,8 @@ package de.kuschku.libquassel.protocol.message
 
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
-import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
+import de.kuschku.libquassel.util.helpers.deserializeString
+import de.kuschku.libquassel.util.helpers.serializeString
 import java.nio.ByteBuffer
 
 object InitDataSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitData> {
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt
index 439de0391..4a891f52a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt
@@ -4,9 +4,9 @@ import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
-import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
 import de.kuschku.libquassel.protocol.value
+import de.kuschku.libquassel.util.helpers.deserializeString
+import de.kuschku.libquassel.util.helpers.serializeString
 import java.nio.ByteBuffer
 
 object InitRequestSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitRequest> {
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt
index 33e1bab0f..b0acbfe5b 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt
@@ -4,9 +4,9 @@ import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
-import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
 import de.kuschku.libquassel.protocol.value
+import de.kuschku.libquassel.util.helpers.deserializeString
+import de.kuschku.libquassel.util.helpers.serializeString
 import java.nio.ByteBuffer
 
 object RpcCallSerializer : SignalProxyMessageSerializer<SignalProxyMessage.RpcCall> {
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt
index 3af382351..27f177c3a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt
@@ -4,9 +4,9 @@ import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
-import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
 import de.kuschku.libquassel.protocol.value
+import de.kuschku.libquassel.util.helpers.deserializeString
+import de.kuschku.libquassel.util.helpers.serializeString
 import java.nio.ByteBuffer
 
 object SyncMessageSerializer : SignalProxyMessageSerializer<SignalProxyMessage.SyncMessage> {
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolInfoSerializer.kt
similarity index 77%
rename from lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolInfoSerializer.kt
index 90f56d0fb..aa2910614 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolInfoSerializer.kt
@@ -2,19 +2,20 @@ package de.kuschku.libquassel.protocol.primitive.serializer
 
 import de.kuschku.libquassel.protocol.Protocol_Features
 import de.kuschku.libquassel.protocol.Quassel_Features
-import de.kuschku.libquassel.quassel.Protocol
+import de.kuschku.libquassel.quassel.ProtocolInfo
 import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
-object ProtocolSerializer : Serializer<Protocol> {
-  override fun serialize(buffer: ChainedByteBuffer, data: Protocol, features: Quassel_Features) {
+object ProtocolInfoSerializer : Serializer<ProtocolInfo> {
+  override fun serialize(buffer: ChainedByteBuffer, data: ProtocolInfo,
+                         features: Quassel_Features) {
     ByteSerializer.serialize(buffer, data.flags.toByte(), features)
     ShortSerializer.serialize(buffer, data.data, features)
     ByteSerializer.serialize(buffer, data.version, features)
   }
 
-  override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Protocol {
-    return Protocol(
+  override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): ProtocolInfo {
+    return ProtocolInfo(
       Protocol_Features.of(ByteSerializer.deserialize(buffer, features).toInt()),
       ShortSerializer.deserialize(buffer, features),
       ByteSerializer.deserialize(buffer, features)
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
index 7ea7209f6..d893b2d44 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
@@ -1,6 +1,5 @@
 package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.Quassel_Features
 import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
@@ -101,22 +100,3 @@ abstract class StringSerializer(
     }
   }
 }
-
-fun QVariant<ByteBuffer>?.deserializeString(
-  serializer: StringSerializer) = if (this?.data == null) {
-  null
-} else {
-  serializer.deserializeAll(data)
-}
-
-fun ByteBuffer?.deserializeString(serializer: StringSerializer) = if (this == null) {
-  null
-} else {
-  serializer.deserializeAll(this)
-}
-
-fun String?.serializeString(serializer: StringSerializer) = if (this == null) {
-  null
-} else {
-  serializer.serialize(this)
-}
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt
deleted file mode 100644
index 054800e4b..000000000
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt
+++ /dev/null
@@ -1,2 +0,0 @@
-package de.kuschku.libquassel.quassel
-
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolMeta.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolInfo.kt
similarity index 51%
rename from lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolMeta.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolInfo.kt
index 69edb4e98..c90699c8c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolMeta.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolInfo.kt
@@ -2,4 +2,4 @@ package de.kuschku.libquassel.quassel
 
 import de.kuschku.libquassel.protocol.Protocol_Features
 
-data class Protocol(val flags: Protocol_Features, val data: Short, val version: Byte)
+data class ProtocolInfo(val flags: Protocol_Features, val data: Short, val version: Byte)
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
index 0275c6bb5..0acd3e335 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
@@ -50,7 +50,8 @@ class Identity constructor(
     setAutoAwayEnabled(properties["autoAwayEnabled"].valueOr(this::autoAwayEnabled))
     setAutoAwayTime(properties["autoAwayTime"].valueOr(this::autoAwayTime))
     setAutoAwayReason(properties["autoAwayReason"].valueOr(this::autoAwayReason))
-    setAutoAwayReasonEnabled(properties["autoAwayReasonEnabled"].valueOr(this::autoAwayReasonEnabled))
+    setAutoAwayReasonEnabled(
+      properties["autoAwayReasonEnabled"].valueOr(this::autoAwayReasonEnabled))
     setDetachAwayEnabled(properties["detachAwayEnabled"].valueOr(this::detachAwayEnabled))
     setDetachAwayReason(properties["detachAwayReason"].valueOr(this::detachAwayReason))
     setDetachAwayReasonEnabled(
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
index 68b3fc139..f9a51c952 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
@@ -1,8 +1,12 @@
 package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.protocol.valueOr
 import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcUser
 import de.kuschku.libquassel.session.SignalProxy
+import de.kuschku.libquassel.util.irc.HostmaskHelper
 import org.threeten.bp.Instant
 import java.nio.charset.Charset
 
@@ -200,7 +204,7 @@ class IrcUser(
 
   override fun updateHostmask(mask: String) {
     if (hostMask() != mask) {
-      val (user, host, _) = splitHostMask(mask)
+      val (user, host, _) = HostmaskHelper.split(mask)
       setUser(user)
       setHost(host)
     }
@@ -263,9 +267,9 @@ class IrcUser(
     renameObject("${network().networkId()}/$_nick")
   }
 
-  private var _nick: String = nickFromMask(hostmask)
-  private var _user: String = userFromMask(hostmask)
-  private var _host: String = hostFromMask(hostmask)
+  private var _nick: String = HostmaskHelper.nick(hostmask)
+  private var _user: String = HostmaskHelper.user(hostmask)
+  private var _host: String = HostmaskHelper.host(hostmask)
   private var _realName: String = ""
   private var _account: String = ""
   private var _awayMessage: String = ""
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index c8c731fbf..dbd5d8bca 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -3,11 +3,12 @@ package de.kuschku.libquassel.quassel.syncables
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork.*
 import de.kuschku.libquassel.session.SignalProxy
 import de.kuschku.libquassel.util.helpers.getOr
+import de.kuschku.libquassel.util.helpers.serializeString
+import de.kuschku.libquassel.util.irc.HostmaskHelper
 import java.nio.ByteBuffer
 import java.nio.charset.Charset
 import java.util.*
@@ -313,7 +314,7 @@ class Network constructor(
   }
 
   fun newIrcUser(hostMask: String, initData: QVariantMap = emptyMap()): IrcUser {
-    val nick = nickFromMask(hostMask).toLowerCase(Locale.ENGLISH)
+    val nick = HostmaskHelper.nick(hostMask).toLowerCase(Locale.ENGLISH)
     val user = ircUser(nick)
     return if (user == null) {
       val ircUser = IrcUser(hostMask, this, proxy)
@@ -767,11 +768,14 @@ class Network constructor(
     setMyNick(properties["myNick"].valueOr(this::myNick))
     setLatency(properties["latency"].valueOr(this::latency))
     setCodecForServer(
-      properties["codecForServer"].value(codecForServer().serializeString(StringSerializer.UTF8)))
+      properties["codecForServer"].value(codecForServer().serializeString(StringSerializer.UTF8))
+    )
     setCodecForEncoding(properties["codecForEncoding"].value(
-      codecForEncoding().serializeString(StringSerializer.UTF8)))
+      codecForEncoding().serializeString(StringSerializer.UTF8))
+    )
     setCodecForDecoding(properties["codecForDecoding"].value(
-      codecForDecoding().serializeString(StringSerializer.UTF8)))
+      codecForDecoding().serializeString(StringSerializer.UTF8))
+    )
     setIdentity(properties["identityId"].valueOr(this::identity))
     setConnected(properties["isConnected"].valueOr(this::isConnected))
     setConnectionState(properties["connectionState"].value(connectionState().value))
@@ -785,10 +789,12 @@ class Network constructor(
     setSaslPassword(properties["saslPassword"].valueOr(this::saslPassword))
     setUseAutoReconnect(properties["useAutoReconnect"].valueOr(this::useAutoReconnect))
     setAutoReconnectInterval(
-      properties["autoReconnectInterval"].valueOr(this::autoReconnectInterval))
+      properties["autoReconnectInterval"].valueOr(this::autoReconnectInterval)
+    )
     setAutoReconnectRetries(properties["autoReconnectRetries"].valueOr(this::autoReconnectRetries))
     setUnlimitedReconnectRetries(
-      properties["unlimitedReconnectRetries"].valueOr(this::unlimitedReconnectRetries))
+      properties["unlimitedReconnectRetries"].valueOr(this::unlimitedReconnectRetries)
+    )
     setRejoinChannels(properties["rejoinChannels"].valueOr(this::rejoinChannels))
     setUseCustomMessageRate(properties["useCustomMessageRate"].valueOr(this::useCustomMessageRate))
     setMessageRateBurstSize(properties["msgRateBurstSize"].valueOr(this::messageRateBurstSize))
@@ -797,7 +803,7 @@ class Network constructor(
   }
 
   fun updateNickFromMask(mask: String): IrcUser {
-    val nick = nickFromMask(mask).toLowerCase(Locale.ENGLISH)
+    val nick = HostmaskHelper.nick(mask).toLowerCase(Locale.ENGLISH)
     val user = _ircUsers[nick]
     return if (user != null) {
       user.updateHostmask(mask)
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
index 609d8bc07..7214a40ff 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
@@ -2,11 +2,11 @@ package de.kuschku.libquassel.quassel.syncables
 
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.quassel.syncables.interfaces.IRpcHandler
 import de.kuschku.libquassel.session.SignalProxy
+import de.kuschku.libquassel.util.helpers.deserializeString
 import java.nio.ByteBuffer
 
 class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
index c778ad2c7..73ca50adb 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -6,7 +6,7 @@ import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.protocol.primitive.serializer.HandshakeVariantMapSerializer
 import de.kuschku.libquassel.protocol.primitive.serializer.IntSerializer
-import de.kuschku.libquassel.protocol.primitive.serializer.ProtocolSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.ProtocolInfoSerializer
 import de.kuschku.libquassel.protocol.primitive.serializer.VariantListSerializer
 import de.kuschku.libquassel.quassel.ProtocolFeature
 import de.kuschku.libquassel.util.compatibility.CompatibilityUtils
@@ -81,7 +81,7 @@ class CoreConnection(
     sizeBuffer.clear()
     channel?.read(sizeBuffer)
     sizeBuffer.flip()
-    val protocol = ProtocolSerializer.deserialize(sizeBuffer, session.coreFeatures)
+    val protocol = ProtocolInfoSerializer.deserialize(sizeBuffer, session.coreFeatures)
 
     log(DEBUG, "Protocol negotiated $protocol")
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
index 2bdb870bc..0a1bd7715 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
@@ -24,9 +24,9 @@ class ObjectStorage(private val proxy: SignalProxy) {
     objectTree.remove("${obj.className}:$old")
     proxy.dispatch(
       SignalProxyMessage.RpcCall("__objectRenamed__", listOf(
-      QVariant_(obj.className, Type.QString), QVariant_(new, Type.QString),
-      QVariant_(old, Type.QString))
-    ))
+        QVariant_(obj.className, Type.QString), QVariant_(new, Type.QString),
+        QVariant_(old, Type.QString))
+      ))
   }
 
   fun get(className: QType, objectName: String) = get(className.typeName, objectName)
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
index 9ac71cbcb..0401092c7 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
@@ -1,5 +1,6 @@
 package de.kuschku.libquassel.util.helpers
 
+import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
 import java.nio.ByteBuffer
 
 fun ByteBuffer.copyTo(target: ByteBuffer) {
@@ -8,3 +9,9 @@ fun ByteBuffer.copyTo(target: ByteBuffer) {
   while (target.hasRemaining())
     target.put(this.get())
 }
+
+fun ByteBuffer?.deserializeString(serializer: StringSerializer) = if (this == null) {
+  null
+} else {
+  serializer.deserializeAll(this)
+}
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt
index bd4f543fd..a1af7c17d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt
@@ -1,8 +1,16 @@
 package de.kuschku.libquassel.util.helpers
 
+import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
+
 /**
  * Because Android’s String::split is broken
  *
  * @return A list with all substrings of length 1, in order
  */
 fun String.split() = Array(length) { this.substring(it, it + 1) }
+
+fun String?.serializeString(serializer: StringSerializer) = if (this == null) {
+  null
+} else {
+  serializer.serialize(this)
+}
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt
new file mode 100644
index 000000000..978b600d4
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt
@@ -0,0 +1,33 @@
+package de.kuschku.libquassel.util.irc
+
+object HostmaskHelper {
+  fun nick(mask: String): String {
+    val (nick, _, _) = split(mask)
+    return nick
+  }
+
+  fun user(mask: String): String {
+    val (_, user, _) = split(mask)
+    return user
+  }
+
+  fun host(mask: String): String {
+    val (_, _, host) = split(mask)
+    return host
+  }
+
+  fun split(mask: String): Triple<String, String, String> {
+    val userPartHostSplit = mask.split("@", limit = 2)
+    if (userPartHostSplit.size < 2)
+      return Triple(mask, "", "")
+
+    val (userPart, host) = userPartHostSplit
+
+    val nickUserSplit = userPart.split('!', limit = 2)
+    if (nickUserSplit.size < 2)
+      return Triple(mask, "", host)
+
+    val (nick, user) = nickUserSplit
+    return Triple(nick, user, host)
+  }
+}
-- 
GitLab