From 4d415947db16c9f00edc41caa22b07695fef3980 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 24 Feb 2016 01:23:38 +0100
Subject: [PATCH] Fixed crash of channel topic screen

---
 .../syncables/types/impl/IrcChannel.java      | 14 ++---
 .../ui/chat/ChannelDetailActivity.java        | 39 ++++++++------
 .../kuschku/util/irc/chanmodes/ChanMode.java  |  6 ++-
 .../irc/chanmodes/IrcModeProviderFactory.java | 15 +++++-
 .../chanmodes/impl/BewareIrcModeProvider.java | 34 +++++++++++--
 .../impl/CharybdisIrcModeProvider.java        | 50 ++++++++++++++++--
 .../chanmodes/impl/DalIrcModeProvider.java    | 40 +++++++++++++--
 .../chanmodes/impl/DancerIrcModeProvider.java | 38 ++++++++++++--
 .../irc/chanmodes/impl/FqIrcModeProvider.java | 39 ++++++++++++--
 .../chanmodes/impl/HybridIrcModeProvider.java | 38 ++++++++++++--
 .../impl/HyperionIrcModeProvider.java         | 36 +++++++++++--
 .../impl/InspireIrcModeProvider.java          | 46 +++++++++++++++--
 .../chanmodes/impl/NeoIrcModeProvider.java    | 40 +++++++++++++--
 .../impl/NightstarIrcModeProvider.java        | 34 +++++++++++--
 .../chanmodes/impl/RfcIrcModeProvider.java    | 32 ++++++++++--
 .../chanmodes/impl/ShadowIrcModeProvider.java | 51 +++++++++++++++++--
 .../chanmodes/impl/SolidIrcModeProvider.java  | 48 +++++++++++++++--
 .../impl/UndernetIrcModeProvider.java         | 32 ++++++++++--
 .../chanmodes/impl/UnrealIrcModeProvider.java | 50 ++++++++++++++++--
 .../res/layout/activity_channel_detail.xml    |  5 +-
 app/src/main/res/values/attrs.xml             |  8 +--
 app/src/main/res/values/styles.xml            |  4 ++
 22 files changed, 607 insertions(+), 92 deletions(-)

diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
index c6a994a3c..5e3fd2cac 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
@@ -23,7 +23,6 @@ package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.util.Log;
 
 import com.google.common.base.Joiner;
 
@@ -53,12 +52,6 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     @NonNull
     private final Map<String, Set<Character>> userModes = new HashMap<>();
     private final ObservableSet<String> users = new ObservableSet<>();
-    private String topic;
-    private String password;
-    private boolean encrypted;
-    private QNetwork network;
-    private String codecForEncoding;
-    private String codecForDecoding;
     @NonNull
     public Map<Character, List<String>> A_channelModes = new HashMap<>();
     @NonNull
@@ -67,6 +60,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     public Map<Character, String> C_channelModes = new HashMap<>();
     @NonNull
     public Set<Character> D_channelModes = new HashSet<>();
+    private String topic;
+    private String password;
+    private boolean encrypted;
+    private QNetwork network;
+    private String codecForEncoding;
+    private String codecForDecoding;
     // Because we don’t have networks at the beginning yet
     @Nullable
     private Map<String, String> cachedUserModes;
@@ -522,6 +521,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
         modes.addAll(D_channelModes);
         modes.addAll(C_channelModes.keySet());
         modes.addAll(B_channelModes.keySet());
+        modes.addAll(A_channelModes.keySet());
         return modes;
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java
index 83101e46a..d2913478a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java
@@ -38,6 +38,7 @@ import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.events.GeneralErrorEvent;
 import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
+import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread;
 import de.kuschku.util.irc.chanmodes.ChanMode;
@@ -110,28 +111,36 @@ public class ChannelDetailActivity extends BoundActivity {
         boolean topicEditable = true;
         for (char c : channel.modeList()) {
             ChanMode mode = provider.modeFromChar(c);
+            QNetwork.ChannelModeType type = channel.network().channelModeType(c);
             if (mode != null) {
-                View v = getLayoutInflater().inflate(R.layout.widget_channel_mode, modes, false);
-                TextView name = (TextView) v.findViewById(R.id.name);
-                TextView description = (TextView) v.findViewById(R.id.description);
-                TextView value = (TextView) v.findViewById(R.id.value);
+                if (type == QNetwork.ChannelModeType.A_CHANMODE) {
+                    // TODO: Implement a proper display for these
+                    // Log.e("DEBUG", String.valueOf(c) + ": " + String.valueOf(channel.modeValueList(c)));
+                } else if (type == QNetwork.ChannelModeType.B_CHANMODE || type == QNetwork.ChannelModeType.C_CHANMODE || type == QNetwork.ChannelModeType.D_CHANMODE) {
+                    View v = getLayoutInflater().inflate(R.layout.widget_channel_mode, modes, false);
+                    TextView name = (TextView) v.findViewById(R.id.name);
+                    TextView description = (TextView) v.findViewById(R.id.description);
+                    TextView value = (TextView) v.findViewById(R.id.value);
 
-                String modeName = context.themeUtil().chanModes.chanModeToName(mode);
-                name.setText(String.format("%s (+%s)", modeName, c));
+                    String modeName = context.themeUtil().chanModes.chanModeToName(mode);
+                    name.setText(String.format("%s (+%s)", modeName, c));
 
-                String modeDescription = context.themeUtil().chanModes.chanModeToDescription(mode);
-                description.setText(modeDescription);
+                    String modeDescription = context.themeUtil().chanModes.chanModeToDescription(mode);
+                    description.setText(modeDescription);
 
-                String modeValue = channel.modeValue(c);
+                    String modeValue = channel.modeValue(c);
 
-                if (modeValue != null && !modeValue.isEmpty()) {
-                    value.setText(modeValue);
-                    value.setVisibility(View.VISIBLE);
-                }
+                    if (modeValue != null && !modeValue.isEmpty()) {
+                        value.setText(modeValue);
+                        value.setVisibility(View.VISIBLE);
+                    }
 
-                modes.addView(v);
+                    modes.addView(v);
 
-                if (mode == ChanMode.RESTRICT_TOPIC) topicEditable = isOp;
+                    if (mode == ChanMode.RESTRICT_TOPIC) topicEditable = isOp;
+                }
+            } else {
+                Log.d("libquassel", "Couldn’t find mode " + c + " for IRCd" + provider.getClass().getSimpleName());
             }
         }
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java
index 46d60c2ab..da14888e4 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java
@@ -60,5 +60,9 @@ public enum ChanMode {
     RESTRICT_TOPIC,
     STRIP_COLOR,
     UNLISTED,
-    FORWARD
+    FORWARD,
+    BAN,
+    BAN_EXCEPTION,
+    INVITE_EXCEPTION,
+    MUTE
 }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java
index a7b65c9c9..836dd0513 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java
@@ -21,13 +21,23 @@
 
 package de.kuschku.util.irc.chanmodes;
 
-import de.kuschku.util.irc.chanmodes.impl.*;
-
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import de.kuschku.util.irc.chanmodes.impl.CharybdisIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.DalIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.DancerIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.FqIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.HybridIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.HyperionIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.InspireIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.NeoIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.ShadowIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.SolidIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.impl.UnrealIrcModeProvider;
+
 public class IrcModeProviderFactory {
     private static List<IrcModeProvider> servers = Arrays.asList(
             new CharybdisIrcModeProvider(),
@@ -44,6 +54,7 @@ public class IrcModeProviderFactory {
     );
 
     private static Set<Character> toModeSet(String chanModes) {
+        if (chanModes == null) chanModes = "";
         String replaced = chanModes.replaceAll(",","");
         Set<Character> modeSet = new HashSet<>();
         for (char c : replaced.toCharArray()) {
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java
index 08f297d2b..c38a11405 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java
@@ -21,15 +21,27 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class BewareIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -55,6 +67,13 @@ public class BewareIrcModeProvider extends AbstractIrcModeProvider {
             case 'p': return PARANOID;
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -72,6 +91,13 @@ public class BewareIrcModeProvider extends AbstractIrcModeProvider {
             case PARANOID: return 'p';
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java
index c0e23656c..788f00244 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java
@@ -21,15 +21,40 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_FORWARD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.FORWARD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MUTE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_ADMIN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class CharybdisIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -63,6 +88,14 @@ public class CharybdisIrcModeProvider extends AbstractIrcModeProvider {
             case 't': return RESTRICT_TOPIC;
             case 'z': return REDUCED_MODERATION;
 
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
+            case 'q':
+                return MUTE;
         }
         return null;
     }
@@ -92,6 +125,15 @@ public class CharybdisIrcModeProvider extends AbstractIrcModeProvider {
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
             case REDUCED_MODERATION: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
+            case MUTE:
+                return 'q';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java
index 2a912eb69..fa4b49dbd 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java
@@ -21,15 +21,33 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.AUDITORIUM;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class DalIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -56,6 +74,13 @@ public class DalIrcModeProvider extends AbstractIrcModeProvider {
             case 'r': return REGISTERED;
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -79,6 +104,13 @@ public class DalIrcModeProvider extends AbstractIrcModeProvider {
             case REGISTERED: return 'r';
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java
index 42cb3667b..5b6e898a9 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java
@@ -21,15 +21,31 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class DancerIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -54,6 +70,13 @@ public class DancerIrcModeProvider extends AbstractIrcModeProvider {
             case 'r': return BLOCK_UNIDENTIFIED;
             case 's': return UNLISTED;
             case 'z': return REDUCED_MODERATION;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -75,6 +98,13 @@ public class DancerIrcModeProvider extends AbstractIrcModeProvider {
             case BLOCK_UNIDENTIFIED: return 'r';
             case UNLISTED: return 's';
             case REDUCED_MODERATION: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java
index 3dcf74165..0a2edf5aa 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java
@@ -21,15 +21,32 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class FqIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -56,6 +73,13 @@ public class FqIrcModeProvider extends AbstractIrcModeProvider {
             case 'r': return REGISTERED;
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -78,6 +102,13 @@ public class FqIrcModeProvider extends AbstractIrcModeProvider {
             case REGISTERED: return 'r';
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java
index bcb461f6d..f25971420 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java
@@ -21,15 +21,31 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class HybridIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -54,6 +70,13 @@ public class HybridIrcModeProvider extends AbstractIrcModeProvider {
             case 'r': return REGISTERED;
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -75,6 +98,13 @@ public class HybridIrcModeProvider extends AbstractIrcModeProvider {
             case REGISTERED: return 'r';
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java
index 56e5150bb..28c2c12d4 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java
@@ -21,15 +21,29 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class HyperionIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -52,6 +66,13 @@ public class HyperionIrcModeProvider extends AbstractIrcModeProvider {
             case 'r': return BLOCK_UNIDENTIFIED;
             case 's': return UNLISTED;
             case 'z': return REDUCED_MODERATION;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -71,6 +92,13 @@ public class HyperionIrcModeProvider extends AbstractIrcModeProvider {
             case BLOCK_UNIDENTIFIED: return 'r';
             case UNLISTED: return 's';
             case REDUCED_MODERATION: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java
index 928074ac8..98a7d6f03 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java
@@ -21,15 +21,46 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ANTIFLOOD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.AUDITORIUM;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CAPS;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KNOCK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.CENSOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.FORWARD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.HIDE_JOINS;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class InspireIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -69,6 +100,13 @@ public class InspireIrcModeProvider extends AbstractIrcModeProvider {
             case 't': return RESTRICT_TOPIC;
             case 'u': return AUDITORIUM;
             case 'z': return ONLY_SSL;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java
index c4d28f615..7e4a27f82 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java
@@ -21,15 +21,33 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.DISABLE_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class NeoIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -56,6 +74,13 @@ public class NeoIrcModeProvider extends AbstractIrcModeProvider {
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
             case 'z': return ONLY_SSL;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -79,6 +104,13 @@ public class NeoIrcModeProvider extends AbstractIrcModeProvider {
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
             case ONLY_SSL: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java
index b2bae9198..2d7ce7777 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java
@@ -21,15 +21,27 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class NightstarIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -55,6 +67,13 @@ public class NightstarIrcModeProvider extends AbstractIrcModeProvider {
             case 'r': return REGISTERED;
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -72,6 +91,13 @@ public class NightstarIrcModeProvider extends AbstractIrcModeProvider {
             case REGISTERED: return 'r';
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java
index 76cd66513..67e8062b5 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java
@@ -21,15 +21,25 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class RfcIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -48,6 +58,13 @@ public class RfcIrcModeProvider extends AbstractIrcModeProvider {
             case 'm': return MODERATED;
             case 'l': return LIMIT;
             case 'k': return PASSWORD;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -63,6 +80,13 @@ public class RfcIrcModeProvider extends AbstractIrcModeProvider {
             case MODERATED: return 'm';
             case LIMIT: return 'l';
             case PASSWORD: return 'k';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java
index b78647b78..54af40869 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java
@@ -21,15 +21,44 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_FORWARD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_ACTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_AUTOREJOIN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CAPS;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_REPEAT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_ADMIN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class ShadowIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -67,6 +96,13 @@ public class ShadowIrcModeProvider extends AbstractIrcModeProvider {
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
             case 'z': return REDUCED_MODERATION;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -101,6 +137,13 @@ public class ShadowIrcModeProvider extends AbstractIrcModeProvider {
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
             case REDUCED_MODERATION: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java
index 97acd327b..e33255f68 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java
@@ -21,15 +21,41 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ANTIFLOOD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.AUDITORIUM;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CAPS;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KNOCK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.CENSOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.DISABLE_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class SolidIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -64,6 +90,13 @@ public class SolidIrcModeProvider extends AbstractIrcModeProvider {
             case 't': return RESTRICT_TOPIC;
             case 'u': return AUDITORIUM;
             case 'z': return ONLY_SSL;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -95,6 +128,13 @@ public class SolidIrcModeProvider extends AbstractIrcModeProvider {
             case RESTRICT_TOPIC: return 't';
             case AUDITORIUM: return 'u';
             case ONLY_SSL: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java
index d7efd24f6..0dca5c0a6 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java
@@ -21,15 +21,25 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class UndernetIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -53,6 +63,13 @@ public class UndernetIrcModeProvider extends AbstractIrcModeProvider {
             case 'p': return PARANOID;
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -68,6 +85,13 @@ public class UndernetIrcModeProvider extends AbstractIrcModeProvider {
             case PARANOID: return 'p';
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java
index 04db02db6..deffc9a8e 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java
@@ -21,15 +21,43 @@
 
 package de.kuschku.util.irc.chanmodes.impl;
 
-import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
-import de.kuschku.util.irc.chanmodes.ChanMode;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import static de.kuschku.util.irc.chanmodes.ChanMode.*;
+import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider;
+import de.kuschku.util.irc.chanmodes.ChanMode;
+
+import static de.kuschku.util.irc.chanmodes.ChanMode.ANTIFLOOD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KNOCK;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.CENSOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.DISABLE_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.FORWARD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION;
+import static de.kuschku.util.irc.chanmodes.ChanMode.IS_SECURE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER;
+import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD;
+import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT;
+import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED;
+import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC;
+import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR;
+import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class UnrealIrcModeProvider extends AbstractIrcModeProvider {
 
@@ -66,6 +94,13 @@ public class UnrealIrcModeProvider extends AbstractIrcModeProvider {
             case 's': return UNLISTED;
             case 't': return RESTRICT_TOPIC;
             case 'z': return ONLY_SSL;
+
+            case 'b':
+                return BAN;
+            case 'e':
+                return BAN_EXCEPTION;
+            case 'I':
+                return INVITE_EXCEPTION;
         }
         return null;
     }
@@ -99,6 +134,13 @@ public class UnrealIrcModeProvider extends AbstractIrcModeProvider {
             case UNLISTED: return 's';
             case RESTRICT_TOPIC: return 't';
             case ONLY_SSL: return 'z';
+
+            case BAN:
+                return 'b';
+            case BAN_EXCEPTION:
+                return 'e';
+            case INVITE_EXCEPTION:
+                return 'I';
         }
         return ' ';
     }
diff --git a/app/src/main/res/layout/activity_channel_detail.xml b/app/src/main/res/layout/activity_channel_detail.xml
index 90a6edf60..19eabf0f7 100644
--- a/app/src/main/res/layout/activity_channel_detail.xml
+++ b/app/src/main/res/layout/activity_channel_detail.xml
@@ -46,7 +46,6 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical">
-
             <TextView
                 style="@style/TextAppearance.AppCompat.Button"
                 android:layout_width="match_parent"
@@ -71,7 +70,7 @@
                 style="@style/Widget.AppCompat.Button.Colored"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_gravity="right"
+                android:layout_gravity="end"
                 android:layout_marginLeft="16dp"
                 android:layout_marginRight="16dp"
                 android:text="Edit Topic" />
@@ -80,7 +79,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="1dp"
                 android:layout_marginTop="16dp"
-                android:background="?attr/material_drawer_divider" />
+                android:background="?attr/colorDivider" />
 
             <TextView
                 style="@style/TextAppearance.AppCompat.Button"
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index f1689d169..b006f4508 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -21,9 +21,6 @@
   -->
 
 <resources>
-    <attr name="colorAccentFocus" format="color" />
-    <attr name="formatBarTheme" format="reference" />
-
     <!-- sender colors -->
 
     <attr name="senderColor0" format="color" />
@@ -69,6 +66,9 @@
     <attr name="colorForegroundSecondary" format="color" />
     <attr name="colorForegroundAction" />
 
+    <attr name="colorAccentFocus" format="color" />
+    <attr name="colorDivider" format="color" />
+
     <attr name="colorBackground" format="color" />
     <attr name="colorBackgroundHighlight" format="color" />
     <attr name="colorBackgroundSecondary" format="color" />
@@ -93,6 +93,6 @@
     <attr name="iconDelete" format="reference" />
     <attr name="iconModify" format="reference" />
     <attr name="iconAdd" format="reference" />
-
+    <attr name="formatBarTheme" format="reference" />
     <attr name="cardStyle" format="reference" />
 </resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 09c7e6f85..3b826b53e 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -33,6 +33,8 @@
         <item name="windowActionModeOverlay">true</item>
         <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
 
+        <item name="colorDivider">#1FFFFFFF</item>
+
         <!--
         <item name="material_drawer_background">?attr/colorBackground</item>
         <item name="material_drawer_primary_text">?attr/colorForeground</item>
@@ -63,6 +65,8 @@
         <item name="windowActionModeOverlay">true</item>
         <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
 
+        <item name="colorDivider">#1F000000</item>
+
         <!--
         <item name="material_drawer_background">?attr/colorBackground</item>
         <item name="material_drawer_primary_text">?attr/colorForeground</item>
-- 
GitLab