From 0f35fc76858b6a30abb2d200c22c53927040c59f Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 9 Jan 2016 23:14:54 +0100
Subject: [PATCH] Fixed several bugs in reflection and reformatted code

---
 .../de/kuschku/libquassel/BusProvider.java    |   2 -
 .../java/de/kuschku/libquassel/Client.java    |  16 +-
 .../kuschku/libquassel/ProtocolHandler.java   |   2 +-
 .../exceptions/SyncInvocationException.java   |   4 +
 .../libquassel/localtypes/ChannelBuffer.java  |   4 +-
 .../libquassel/localtypes/QueryBuffer.java    |   4 +-
 .../libquassel/localtypes/StatusBuffer.java   |   2 +-
 .../libquassel/primitives/QMetaType.java      |  16 +-
 .../primitives/QMetaTypeRegistry.java         | 165 +++++++++---------
 .../libquassel/primitives/types/Message.java  |   2 -
 .../libquassel/protocols/LegacyPeer.java      |   2 +-
 .../syncables/SyncableRegistry.java           |   1 +
 .../serializers/IrcChannelSerializer.java     |   2 +-
 .../serializers/IrcUserSerializer.java        |   2 +-
 .../serializers/NetworkSerializer.java        |   4 +-
 .../syncables/types/IrcChannel.java           |   2 +-
 .../libquassel/syncables/types/IrcUser.java   |   7 -
 .../libquassel/syncables/types/Network.java   |   2 +-
 .../syncables/types/SyncableObject.java       |   8 +-
 .../BufferViewManagerChangedEvent.java        |  13 +-
 .../kuschku/quasseldroid_ng/MainActivity.java |  79 +++++----
 .../quasseldroid_ng/NetworkDrawerItem.java    |   2 +-
 .../java/de/kuschku/util/ReflectionUtils.java |  87 ++++-----
 23 files changed, 204 insertions(+), 224 deletions(-)

diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
index f1b5c81cf..f4848ec5a 100644
--- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java
+++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
@@ -1,7 +1,5 @@
 package de.kuschku.libquassel;
 
-import android.util.Log;
-
 import java.util.UUID;
 
 import de.greenrobot.event.EventBus;
diff --git a/app/src/main/java/de/kuschku/libquassel/Client.java b/app/src/main/java/de/kuschku/libquassel/Client.java
index 7d677b919..d556e4a45 100644
--- a/app/src/main/java/de/kuschku/libquassel/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/Client.java
@@ -1,7 +1,5 @@
 package de.kuschku.libquassel;
 
-import android.util.Log;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -23,7 +21,6 @@ import de.kuschku.libquassel.primitives.types.Message;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.BufferSyncer;
 import de.kuschku.libquassel.syncables.types.BufferViewManager;
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.syncables.types.Network;
 import de.kuschku.libquassel.syncables.types.SyncableObject;
 import de.kuschku.util.Stream;
@@ -35,6 +32,7 @@ public class Client {
     private final List<String> initDataQueue = new ArrayList<>();
     private final BacklogManager backlogManager;
     private final BusProvider busProvider;
+    public int lag;
     private ConnectionChangeEvent.Status connectionStatus;
     private ClientInitAck core;
     private SessionState state;
@@ -42,8 +40,6 @@ public class Client {
     private BufferSyncer bufferSyncer;
     private ClientData clientData;
 
-    public int lag;
-
     public Client(final BusProvider busProvider) {
         this(new SimpleBacklogManager(busProvider), busProvider);
     }
@@ -176,11 +172,6 @@ public class Client {
         this.core = core;
     }
 
-    public void setConnectionStatus(final ConnectionChangeEvent.Status connectionStatus) {
-        this.connectionStatus = connectionStatus;
-        busProvider.sendEvent(new ConnectionChangeEvent(connectionStatus));
-    }
-
     public void setClientData(ClientData clientData) {
         this.clientData = clientData;
     }
@@ -196,4 +187,9 @@ public class Client {
     public ConnectionChangeEvent.Status getConnectionStatus() {
         return connectionStatus;
     }
+
+    public void setConnectionStatus(final ConnectionChangeEvent.Status connectionStatus) {
+        this.connectionStatus = connectionStatus;
+        busProvider.sendEvent(new ConnectionChangeEvent(connectionStatus));
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
index f429e682f..c307a19ac 100644
--- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
+++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
@@ -12,13 +12,13 @@ import de.kuschku.libquassel.functions.types.InitDataFunction;
 import de.kuschku.libquassel.functions.types.InitRequestFunction;
 import de.kuschku.libquassel.functions.types.RpcCallFunction;
 import de.kuschku.libquassel.functions.types.SyncFunction;
-import de.kuschku.libquassel.syncables.SyncableRegistry;
 import de.kuschku.libquassel.objects.types.ClientInitAck;
 import de.kuschku.libquassel.objects.types.ClientInitReject;
 import de.kuschku.libquassel.objects.types.ClientLoginAck;
 import de.kuschku.libquassel.objects.types.ClientLoginReject;
 import de.kuschku.libquassel.objects.types.SessionInit;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
+import de.kuschku.libquassel.syncables.SyncableRegistry;
 import de.kuschku.util.ReflectionUtils;
 
 public class ProtocolHandler implements IProtocolHandler {
diff --git a/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java b/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java
index b9ffcda97..b4f34e7f0 100644
--- a/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java
+++ b/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java
@@ -6,6 +6,10 @@ public class SyncInvocationException extends InvocationTargetException {
     public SyncInvocationException() {
     }
 
+    public SyncInvocationException(String detailMessage) {
+        super(null, detailMessage);
+    }
+
     public SyncInvocationException(Throwable exception) {
         super(exception);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
index 9c1dc0754..0f50962d3 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
@@ -2,20 +2,20 @@ package de.kuschku.libquassel.localtypes;
 
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
-import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.quasseldroid_ng.BufferDrawerItem;
 
 public class ChannelBuffer implements Buffer {
     private final BufferInfo info;
     private IrcChannel channel;
+    private IDrawerItem drawerElement = new BufferDrawerItem(this);
 
     public ChannelBuffer(BufferInfo info, IrcChannel channel) {
         this.info = info;
         this.channel = channel;
     }
 
-    private IDrawerItem drawerElement = new BufferDrawerItem(this);
     public IDrawerItem getDrawerElement() {
         return drawerElement;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
index a2f4b22af..df5ad5268 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
@@ -2,20 +2,20 @@ package de.kuschku.libquassel.localtypes;
 
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
+import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.quasseldroid_ng.BufferDrawerItem;
 
 public class QueryBuffer implements Buffer {
     private final BufferInfo info;
     private IrcUser user;
+    private IDrawerItem drawerElement = new BufferDrawerItem(this);
 
     public QueryBuffer(BufferInfo info, IrcUser user) {
         this.info = info;
         this.user = user;
     }
 
-    private IDrawerItem drawerElement = new BufferDrawerItem(this);
     public IDrawerItem getDrawerElement() {
         return drawerElement;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
index c7a69e73f..51a08e1e8 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
@@ -9,13 +9,13 @@ import de.kuschku.quasseldroid_ng.BufferDrawerItem;
 public class StatusBuffer implements Buffer {
     private final BufferInfo info;
     private final Network network;
+    private IDrawerItem drawerElement = new BufferDrawerItem(this);
 
     public StatusBuffer(BufferInfo info, Network network) {
         this.info = info;
         this.network = network;
     }
 
-    private IDrawerItem drawerElement = new BufferDrawerItem(this);
     public IDrawerItem getDrawerElement() {
         return drawerElement;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
index 7c2f40e72..7fe683994 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
@@ -38,21 +38,23 @@ import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer;
 public class QMetaType<T> {
     public final Type type;
     public final String name;
+    public final Class cl;
     public final PrimitiveSerializer<T> serializer;
 
-    public QMetaType(Type type) {
-        this(type, type.getSerializableName());
+    public QMetaType(Class cl, Type type) {
+        this(cl, type, type.getSerializableName());
     }
 
-    public QMetaType(Type type, String name) {
-        this(type, name, null);
+    public QMetaType(Class cl, Type type, String name) {
+        this(cl, type, name, null);
     }
 
-    public QMetaType(Type type, PrimitiveSerializer<T> serializer) {
-        this(type, type.getSerializableName(), serializer);
+    public QMetaType(Class cl, Type type, PrimitiveSerializer<T> serializer) {
+        this(cl, type, type.getSerializableName(), serializer);
     }
 
-    public QMetaType(Type type, String name, PrimitiveSerializer<T> serializer) {
+    public QMetaType(Class cl, Type type, String name, PrimitiveSerializer<T> serializer) {
+        this.cl = cl;
         this.type = type;
         this.name = name;
         this.serializer = serializer;
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
index b84566036..7219a30b5 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
@@ -3,6 +3,7 @@ package de.kuschku.libquassel.primitives;
 import org.joda.time.DateTime;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.channels.ByteChannel;
 import java.util.HashMap;
@@ -42,85 +43,85 @@ public class QMetaTypeRegistry {
     private static final Map<String, QMetaType> stringSerializerMap = new HashMap<>();
 
     static {
-        addType(QMetaType.Type.Void, new VoidSerializer());
-        addType(QMetaType.Type.Bool, new BoolSerializer());
-        addType(QMetaType.Type.Int, new IntSerializer());
-        addType(QMetaType.Type.UserType, "BufferId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "NetworkId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "IdentityId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "MsgId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "BufferInfo", new BufferInfoSerializer());
-        addType(QMetaType.Type.UserType, "Message", new MessageSerializer());
-        addType(QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(new IdentitySerializer()));
-        addType(QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(new NetworkServerSerializer()));
-        addType(QMetaType.Type.UInt, new IntSerializer());
-        addType(QMetaType.Type.UShort, new ShortSerializer());
+        addType(Void.class, QMetaType.Type.Void, new VoidSerializer());
+        addType(boolean.class, QMetaType.Type.Bool, new BoolSerializer());
+        addType(int.class, QMetaType.Type.Int, new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "BufferId", new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "NetworkId", new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "IdentityId", new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "MsgId", new IntSerializer());
+        addType(BufferInfo.class, QMetaType.Type.UserType, "BufferInfo", new BufferInfoSerializer());
+        addType(Message.class, QMetaType.Type.UserType, "Message", new MessageSerializer());
+        addType(Identity.class, QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(new IdentitySerializer()));
+        addType(NetworkServer.class, QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(new NetworkServerSerializer()));
+        addType(int.class, QMetaType.Type.UInt, new IntSerializer());
+        addType(short.class, QMetaType.Type.UShort, new ShortSerializer());
 
         // TODO: Implement more custom quassel types
 
-        addType(QMetaType.Type.QTime, new TimeSerializer());
-        addType(QMetaType.Type.LongLong);
-        addType(QMetaType.Type.ULongLong);
-        addType(QMetaType.Type.Double);
-        addType(QMetaType.Type.QChar, new CharSerializer());
-        addType(QMetaType.Type.QVariantList, new VariantListSerializer<>());
-        addType(QMetaType.Type.QVariantMap, new VariantMapSerializer<>());
-        addType(QMetaType.Type.QStringList, new StringListSerializer());
-        addType(QMetaType.Type.QString, new StringSerializer());
-        addType(QMetaType.Type.QByteArray, new ByteArraySerializer());
-        addType(QMetaType.Type.QBitArray);
-        addType(QMetaType.Type.QDate);
-        addType(QMetaType.Type.QDateTime, new DateTimeSerializer());
-        addType(QMetaType.Type.QUrl);
-        addType(QMetaType.Type.QLocale);
-        addType(QMetaType.Type.QRect);
-        addType(QMetaType.Type.QRectF);
-        addType(QMetaType.Type.QSize);
-        addType(QMetaType.Type.QSizeF);
-        addType(QMetaType.Type.QLine);
-        addType(QMetaType.Type.QLineF);
-        addType(QMetaType.Type.QPoint);
-        addType(QMetaType.Type.QPointF);
+        addType(DateTime.class, QMetaType.Type.QTime, new TimeSerializer());
+        addType(BigDecimal.class, QMetaType.Type.LongLong);
+        addType(BigDecimal.class, QMetaType.Type.ULongLong);
+        addType(double.class, QMetaType.Type.Double);
+        addType(char.class, QMetaType.Type.QChar, new CharSerializer());
+        addType(List.class, QMetaType.Type.QVariantList, new VariantListSerializer());
+        addType(Map.class, QMetaType.Type.QVariantMap, new VariantMapSerializer());
+        addType(List.class, QMetaType.Type.QStringList, new StringListSerializer());
+        addType(String.class, QMetaType.Type.QString, new StringSerializer());
+        addType(String.class, QMetaType.Type.QByteArray, new ByteArraySerializer());
+        addType(void.class, QMetaType.Type.QBitArray);
+        addType(void.class, QMetaType.Type.QDate);
+        addType(DateTime.class, QMetaType.Type.QDateTime, new DateTimeSerializer());
+        addType(void.class, QMetaType.Type.QUrl);
+        addType(void.class, QMetaType.Type.QLocale);
+        addType(void.class, QMetaType.Type.QRect);
+        addType(void.class, QMetaType.Type.QRectF);
+        addType(void.class, QMetaType.Type.QSize);
+        addType(void.class, QMetaType.Type.QSizeF);
+        addType(void.class, QMetaType.Type.QLine);
+        addType(void.class, QMetaType.Type.QLineF);
+        addType(void.class, QMetaType.Type.QPoint);
+        addType(void.class, QMetaType.Type.QPointF);
         // TODO: Handle QRegExp for the IgnoreListManager
-        addType(QMetaType.Type.QRegExp);
-        addType(QMetaType.Type.QVariantHash);
-        addType(QMetaType.Type.QEasingCurve);
+        addType(void.class, QMetaType.Type.QRegExp);
+        addType(void.class, QMetaType.Type.QVariantHash);
+        addType(void.class, QMetaType.Type.QEasingCurve);
 
         // UI Types
-        addType(QMetaType.Type.QFont);
-        addType(QMetaType.Type.QPixmap);
-        addType(QMetaType.Type.QBrush);
-        addType(QMetaType.Type.QColor);
-        addType(QMetaType.Type.QPalette);
-        addType(QMetaType.Type.QIcon);
-        addType(QMetaType.Type.QImage);
-        addType(QMetaType.Type.QPolygon);
-        addType(QMetaType.Type.QRegion);
-        addType(QMetaType.Type.QBitmap);
-        addType(QMetaType.Type.QCursor);
-        addType(QMetaType.Type.QSizePolicy);
-        addType(QMetaType.Type.QKeySequence);
-        addType(QMetaType.Type.QPen);
-        addType(QMetaType.Type.QTextLength);
-        addType(QMetaType.Type.QTextFormat);
-        addType(QMetaType.Type.QMatrix);
-        addType(QMetaType.Type.QTransform);
-        addType(QMetaType.Type.QMatrix4x4);
-        addType(QMetaType.Type.QVector2D);
-        addType(QMetaType.Type.QVector3D);
-        addType(QMetaType.Type.QVector4D);
-        addType(QMetaType.Type.QQuaternion);
-
-        addType(QMetaType.Type.VoidStar, "void*");
-        addType(QMetaType.Type.Long, new LongSerializer());
-        addType(QMetaType.Type.Short, new ShortSerializer());
-        addType(QMetaType.Type.Char, new ByteSerializer());
-        addType(QMetaType.Type.ULong, new LongSerializer());
-        addType(QMetaType.Type.UChar, new ByteSerializer());
-        addType(QMetaType.Type.Float);
-        addType(QMetaType.Type.QObjectStar, "QObject*");
-        addType(QMetaType.Type.QWidgetStar, "QWidget*");
-        addType(QMetaType.Type.QVariant, new VariantSerializer());
+        addType(void.class, QMetaType.Type.QFont);
+        addType(void.class, QMetaType.Type.QPixmap);
+        addType(void.class, QMetaType.Type.QBrush);
+        addType(void.class, QMetaType.Type.QColor);
+        addType(void.class, QMetaType.Type.QPalette);
+        addType(void.class, QMetaType.Type.QIcon);
+        addType(void.class, QMetaType.Type.QImage);
+        addType(void.class, QMetaType.Type.QPolygon);
+        addType(void.class, QMetaType.Type.QRegion);
+        addType(void.class, QMetaType.Type.QBitmap);
+        addType(void.class, QMetaType.Type.QCursor);
+        addType(void.class, QMetaType.Type.QSizePolicy);
+        addType(void.class, QMetaType.Type.QKeySequence);
+        addType(void.class, QMetaType.Type.QPen);
+        addType(void.class, QMetaType.Type.QTextLength);
+        addType(void.class, QMetaType.Type.QTextFormat);
+        addType(void.class, QMetaType.Type.QMatrix);
+        addType(void.class, QMetaType.Type.QTransform);
+        addType(void.class, QMetaType.Type.QMatrix4x4);
+        addType(void.class, QMetaType.Type.QVector2D);
+        addType(void.class, QMetaType.Type.QVector3D);
+        addType(void.class, QMetaType.Type.QVector4D);
+        addType(void.class, QMetaType.Type.QQuaternion);
+
+        addType(void.class, QMetaType.Type.VoidStar, "void*");
+        addType(long.class, QMetaType.Type.Long, new LongSerializer());
+        addType(short.class, QMetaType.Type.Short, new ShortSerializer());
+        addType(byte.class, QMetaType.Type.Char, new ByteSerializer());
+        addType(long.class, QMetaType.Type.ULong, new LongSerializer());
+        addType(byte.class, QMetaType.Type.UChar, new ByteSerializer());
+        addType(void.class, QMetaType.Type.Float);
+        addType(void.class, QMetaType.Type.QObjectStar, "QObject*");
+        addType(void.class, QMetaType.Type.QWidgetStar, "QWidget*");
+        addType(QVariant.class, QMetaType.Type.QVariant, new VariantSerializer());
     }
 
     // Disable Constructor
@@ -128,20 +129,20 @@ public class QMetaTypeRegistry {
 
     }
 
-    private static <T> void addType(final QMetaType.Type type, final String name, final PrimitiveSerializer<T> serializer) {
-        addType(new QMetaType<T>(type, name, serializer));
+    private static <T> void addType(final Class cl, final QMetaType.Type type, final String name, final PrimitiveSerializer<T> serializer) {
+        addType(new QMetaType<T>(cl, type, name, serializer));
     }
 
-    private static <T> void addType(final QMetaType.Type type, final String name) {
-        addType(new QMetaType<T>(type, name));
+    private static <T> void addType(final Class cl, final QMetaType.Type type, final String name) {
+        addType(new QMetaType<T>(cl, type, name));
     }
 
-    private static <T> void addType(final QMetaType.Type type, final PrimitiveSerializer<T> serializer) {
-        addType(new QMetaType<T>(type, serializer));
+    private static <T> void addType(final Class cl, final QMetaType.Type type, final PrimitiveSerializer<T> serializer) {
+        addType(new QMetaType<T>(cl, type, serializer));
     }
 
-    private static <T> void addType(final QMetaType.Type type) {
-        addType(new QMetaType<T>(type));
+    private static <T> void addType(final Class cl, final QMetaType.Type type) {
+        addType(new QMetaType<T>(cl, type));
     }
 
     private static <T> void addType(final QMetaType<T> metaType) {
@@ -213,7 +214,7 @@ public class QMetaTypeRegistry {
             if (((List) type).size() > 0 && ((List) type).get(0) instanceof String)
                 return (QMetaType<T>) typeSerializerMap.get(QMetaType.Type.QStringList);
             else if (((List) type).size() > 0 && ((List) type).get(0) instanceof QVariant)
-                return (QMetaType<T>) new QMetaType<T>(QMetaType.Type.QVariantList, new VariantVariantListSerializer());
+                return new QMetaType<>((Class) type.getClass(), QMetaType.Type.QVariantList, new VariantVariantListSerializer());
             else
                 return (QMetaType<T>) typeSerializerMap.get(QMetaType.Type.QVariantList);
         } else if (type instanceof Map)
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java
index a08aeb9c2..cb68f51a8 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java
@@ -2,8 +2,6 @@ package de.kuschku.libquassel.primitives.types;
 
 import android.support.annotation.NonNull;
 
-import com.mikepenz.fastadapter.IItem;
-
 import org.joda.time.DateTime;
 
 import java.io.Serializable;
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
index 2e44c7651..0a8d6f8a5 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
@@ -56,7 +56,7 @@ public class LegacyPeer implements RemotePeer {
     public final void onEventBackgroundThread(SyncFunction func) {
         final List serialize = new UnpackedSyncFunctionSerializer().serialize(func);
         connection.getOutputExecutor().submit(new OutputRunnable<>(new VariantSerializer<List>(),
-                new QVariant<>(new QMetaType<List>(QMetaType.Type.QVariantList, new VariantVariantListSerializer()),
+                new QVariant<>(new QMetaType<List>(List.class, QMetaType.Type.QVariantList, new VariantVariantListSerializer()),
                         serialize)));
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java b/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java
index 72fe5bc29..fb17008e7 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java
@@ -17,6 +17,7 @@ import de.kuschku.libquassel.syncables.types.SyncableObject;
 
 public class SyncableRegistry {
     private static final Map<String, ObjectSerializer<? extends SyncableObject>> map = new HashMap<>();
+
     static {
         map.put("BufferSyncer", new BufferSyncerSerializer());
         map.put("BufferViewConfig", new BufferViewConfigSerializer());
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java
index 61ee5876c..489bcf9bb 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java
@@ -8,8 +8,8 @@ import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
 import de.kuschku.libquassel.objects.serializers.StringObjectMapSerializer;
-import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
 
 public class IrcChannelSerializer implements ObjectSerializer<IrcChannel> {
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java
index cfd04fd79..bd32e1b35 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java
@@ -10,8 +10,8 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.libquassel.syncables.types.IrcUser;
 
 public class IrcUserSerializer implements ObjectSerializer<IrcUser> {
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java
index 288ec4564..22308e1a5 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java
@@ -12,10 +12,10 @@ import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
 import de.kuschku.libquassel.objects.serializers.StringObjectMapSerializer;
-import de.kuschku.libquassel.syncables.types.IrcChannel;
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.objects.types.NetworkServer;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
+import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.syncables.types.Network;
 
 public class NetworkSerializer implements ObjectSerializer<Network> {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
index c275fe771..13fe475c4 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
@@ -59,7 +59,7 @@ public class IrcChannel extends SyncableObject {
         if (UserModes.get(nick) == null)
             UserModes.put(nick, mode);
         else if (!UserModes.get(nick).contains(mode))
-            UserModes.put(nick, UserModes.get(nick)+mode);
+            UserModes.put(nick, UserModes.get(nick) + mode);
     }
 
     public void removeUserMode(String nick, String mode) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
index c43a00ade..37765e277 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
@@ -1,19 +1,12 @@
 package de.kuschku.libquassel.syncables.types;
 
-import android.util.Log;
-
-import com.google.common.collect.Lists;
-
 import org.joda.time.DateTime;
 
-import java.util.Arrays;
 import java.util.List;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.functions.types.InitDataFunction;
-import de.kuschku.libquassel.syncables.types.SyncableObject;
-import de.kuschku.util.Stream;
 
 public class IrcUser extends SyncableObject {
     public String server;
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
index c62ff1b07..a08e3d417 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
@@ -124,7 +124,7 @@ public class Network extends SyncableObject {
     }
 
     public void addIrcUser(String sender) {
-        provider.dispatch(new InitRequestFunction("IrcUser", getObjectName()+"/"+sender));
+        provider.dispatch(new InitRequestFunction("IrcUser", getObjectName() + "/" + sender));
     }
 
     public IrcUser getUser(String name) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
index 4b5a7ac0d..318a2e2e7 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
@@ -27,13 +27,13 @@ public abstract class SyncableObject {
         return objectName;
     }
 
-    public void renameObject(String objectName) {
-        setObjectName(objectName);
-    }
-
     public void setObjectName(String objectName) {
         this.objectName = objectName;
     }
 
+    public void renameObject(String objectName) {
+        setObjectName(objectName);
+    }
+
     public abstract void init(InitDataFunction function, BusProvider provider, Client client);
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java b/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java
index 878e8a1c0..32a2a562f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java
@@ -1,17 +1,16 @@
 package de.kuschku.quasseldroid_ng;
 
 public class BufferViewManagerChangedEvent {
-    public enum Action {
-        ADD,
-        REMOVE,
-        MODIFY
-    }
-
     public final int id;
     public final Action action;
-
     public BufferViewManagerChangedEvent(int id, Action action) {
         this.id = id;
         this.action = action;
     }
+
+    public enum Action {
+        ADD,
+        REMOVE,
+        MODIFY
+    }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
index 332256159..4b4960b60 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
@@ -162,7 +162,8 @@ public class MainActivity extends AppCompatActivity {
                                     .setPositiveButton("Connect", (dialog, which) -> {
                                         EditText hostname = ((EditText) coreview.findViewById(R.id.server));
                                         EditText port = ((EditText) coreview.findViewById(R.id.port));
-                                        if (binder.getBackgroundThread() != null) binder.getBackgroundThread().provider.event.unregister(this);
+                                        if (binder.getBackgroundThread() != null)
+                                            binder.getBackgroundThread().provider.event.unregister(this);
                                         binder.stopBackgroundThread();
                                         BusProvider provider = new BusProvider();
                                         provider.event.register(this);
@@ -206,42 +207,6 @@ public class MainActivity extends AppCompatActivity {
         super.onConfigurationChanged(newConfig);
     }
 
-    class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
-        ObservableList<Message> messageList = new ObservableList<>(Message.class);
-
-        public void setMessageList(ObservableList<Message> messageList) {
-            this.messageList.setCallback(null);
-            this.messageList = messageList;
-            this.messageList.setCallback(new ObservableList.RecyclerViewAdapterCallback(this));
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-            return new MessageViewHolder(LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, parent, false));
-        }
-
-        @Override
-        public void onBindViewHolder(MessageViewHolder holder, int position) {
-            holder.text1.setText(messageList.list.get(position).toString());
-        }
-
-        @Override
-        public int getItemCount() {
-            return messageList.list.size();
-        }
-    };
-
-    class MessageViewHolder extends RecyclerView.ViewHolder {
-        @Bind(android.R.id.text1)
-        TextView text1;
-
-        public MessageViewHolder(View itemView) {
-            super(itemView);
-            ButterKnife.bind(this, itemView);
-        }
-    }
-
     private void switchBuffer(int bufferId) {
         this.bufferId = bufferId;
 
@@ -257,6 +222,8 @@ public class MainActivity extends AppCompatActivity {
         drawer.closeDrawer();
     }
 
+    ;
+
     @Override
     protected void onDestroy() {
         super.onDestroy();
@@ -314,7 +281,7 @@ public class MainActivity extends AppCompatActivity {
                 );
                 break;
         }
-        Collections.sort(header.getProfiles(), (x,y) -> x.getIdentifier() - y.getIdentifier());
+        Collections.sort(header.getProfiles(), (x, y) -> x.getIdentifier() - y.getIdentifier());
         if (event.action == BufferViewManagerChangedEvent.Action.REMOVE && event.id == selectedProfile) {
             ArrayList<IProfile> profiles = header.getProfiles();
             if (!profiles.isEmpty())
@@ -334,4 +301,40 @@ public class MainActivity extends AppCompatActivity {
             Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show();
         }
     }
+
+    class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
+        ObservableList<Message> messageList = new ObservableList<>(Message.class);
+
+        public void setMessageList(ObservableList<Message> messageList) {
+            this.messageList.setCallback(null);
+            this.messageList = messageList;
+            this.messageList.setCallback(new ObservableList.RecyclerViewAdapterCallback(this));
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new MessageViewHolder(LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, parent, false));
+        }
+
+        @Override
+        public void onBindViewHolder(MessageViewHolder holder, int position) {
+            holder.text1.setText(messageList.list.get(position).toString());
+        }
+
+        @Override
+        public int getItemCount() {
+            return messageList.list.size();
+        }
+    }
+
+    class MessageViewHolder extends RecyclerView.ViewHolder {
+        @Bind(android.R.id.text1)
+        TextView text1;
+
+        public MessageViewHolder(View itemView) {
+            super(itemView);
+            ButterKnife.bind(this, itemView);
+        }
+    }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
index c118a7921..eb97d3f94 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
@@ -32,6 +32,6 @@ public class NetworkDrawerItem extends PrimaryDrawerItem {
 
     @Override
     public int getIdentifier() {
-        return network.getNetworkId()* Short.MAX_VALUE;
+        return network.getNetworkId() * Short.MAX_VALUE;
     }
 }
diff --git a/app/src/main/java/de/kuschku/util/ReflectionUtils.java b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
index 97bdfd134..979d097db 100644
--- a/app/src/main/java/de/kuschku/util/ReflectionUtils.java
+++ b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
@@ -1,13 +1,13 @@
 package de.kuschku.util;
 
-import java.lang.reflect.InvocationTargetException;
+import android.support.annotation.NonNull;
+
+import com.google.common.primitives.Primitives;
+
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.exceptions.SyncInvocationException;
 
 public class ReflectionUtils {
@@ -16,68 +16,53 @@ public class ReflectionUtils {
     }
 
     public static void invokeMethod(Object o, String name, Object[] argv) throws SyncInvocationException {
-        Method m;
+        name = stripName(name);
+
+        Class<?>[] classes = new Class<?>[argv.length];
+        for (int i = 0; i < argv.length; i++) {
+            classes[i] = argv[i].getClass();
+        }
+        Method m = getMethodFromSignature(name, o.getClass(), classes);
         try {
-            m = getMethodFromSignature(name, argv.length, o.getClass());
-            try {
+
+            if (m != null) {
                 m.invoke(o, argv);
-            } catch (Exception e) {
-                e.printStackTrace();
-                throw new SyncInvocationException(e, String.format("Unknown method: %s::%s with arguments: %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
             }
-        } catch (SyncInvocationException e) {
-            throw e;
+
         } catch (Exception e) {
-            e.printStackTrace();
-            throw new SyncInvocationException(e, String.format("Unknown method: %s::%s with arguments: %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
+            throw new SyncInvocationException(e, String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
         }
+        throw new SyncInvocationException(String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
+    }
+
+    @NonNull
+    private static String stripName(String name) {
+        return (name.contains("(")) ? name.substring(0, name.indexOf("(")) : name;
     }
 
     public static void invokeMethod(Object o, String name, List argv) throws SyncInvocationException {
         invokeMethod(o, name, argv.toArray(new Object[argv.size()]));
     }
 
-    private static Method getMethodFromSignature(String methodName, int parameterCount, Class cl) {
-        String[] types = new String[] {};
-        if (methodName.contains("(")) {
-            types = methodName.substring(methodName.indexOf("(")+1, methodName.indexOf(")")).split(",");
-            methodName = methodName.substring(0, methodName.indexOf("("));
-        }
+    private static Method getMethodFromSignature(String methodName, Class cl, Class<?>[] parameterTypes) {
+        Method[] methods = cl.getMethods();
+        looper:
+        for (Method m : methods) {
+            if (m.getName().equals(methodName) && m.getParameterTypes().length == parameterTypes.length) {
+                for (int i = 0; i < parameterTypes.length; i++) {
+                    Class mParam = m.getParameterTypes()[i];
+                    Class vParam = parameterTypes[i];
+                    if (mParam.isPrimitive() && Primitives.isWrapperType(vParam))
+                        vParam = Primitives.unwrap(vParam);
 
-        List<Method> candidates = new ArrayList<>();
-        for (final Method m : cl.getDeclaredMethods()) {
-            if (m.getName().equals(methodName) && m.getParameterTypes().length == parameterCount) {
-                candidates.add(m);
-            }
-        }
-        if (candidates.size() == 1) return candidates.get(0);
-        else if (candidates.size() > 1){
-            for (Method m : candidates) {
-                if (matches(types, m.getParameterTypes()))
-                    return m;
-            }
-        }
-
-        throw new IllegalArgumentException("Could not find a method with proper arguments");
-    }
-
-    private static boolean matches(String[] types, Class[] classes) {
-        paramater_loop: for (int i = 0; i < types.length; i++) {
-            Class cl = classes[i];
-            while (cl != Object.class) {
-                if (cl.getSimpleName().equals(types[i])) {
-                    continue paramater_loop;
-                } else {
-                    for (Class in : cl.getInterfaces()) {
-                        if (in.getSimpleName().equals(types[i])) {
-                            continue paramater_loop;
-                        }
+                    if (mParam != vParam && !mParam.isAssignableFrom(vParam)) {
+                        continue looper;
                     }
                 }
-                cl = cl.getSuperclass();
+                return m;
             }
-            return false;
         }
-        return true;
+
+        return null;
     }
 }
-- 
GitLab