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