diff --git a/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java index fd75b5b2b65d189f1c699c2cbf8927d1374e0b13..dffa62054eef3f3c46fd225e7b1f2375f8dad0f1 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java @@ -34,6 +34,8 @@ import de.kuschku.libquassel.localtypes.buffers.Buffers; import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; +import static de.kuschku.util.AndroidAssert.assertNotNull; + public class QBufferManager { @NonNull private final Map<Integer, Buffer> buffers = new HashMap<>(); @@ -70,12 +72,14 @@ public class QBufferManager { } public void postInit() { - for (BufferInfo info : bufferInfos) { - QNetwork network = client.networkManager().network(info.networkId()); - if (network == null) continue; - Buffer buffer = Buffers.fromType(info, network); - if (buffer == null) continue; - createBuffer(buffer); + if (bufferInfos != null) { + for (BufferInfo info : bufferInfos) { + QNetwork network = client.networkManager().network(info.networkId()); + assertNotNull(network); + Buffer buffer = Buffers.fromType(info, network); + assertNotNull(buffer); + createBuffer(buffer); + } } bufferInfos = null; } diff --git a/app/src/main/java/de/kuschku/libquassel/client/QClient.java b/app/src/main/java/de/kuschku/libquassel/client/QClient.java index ddf73d341fd6b4d8aa718ccd16de6fed533b6ac0..b4e5ff7084f2fa1933caa03222497c1693046d24 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/QClient.java +++ b/app/src/main/java/de/kuschku/libquassel/client/QClient.java @@ -135,6 +135,8 @@ public class QClient extends AClient { @Override public void _displayStatusMsg(String network, String message) { + assertNotNull(provider); + provider.sendEvent(new StatusMessageEvent(network, message)); } @@ -165,6 +167,8 @@ public class QClient extends AClient { @Override public void _passwordChanged(long peerPtr, boolean success) { + assertNotNull(provider); + if (peerPtr != 0x0000000000000000L) provider.sendEvent(new CriticalErrorEvent("Your core has a critical vulnerability. Please update it.")); provider.sendEvent(new PasswordChangeEvent(success)); @@ -183,13 +187,10 @@ public class QClient extends AClient { assertNotNull(provider); this.connectionStatus = connectionStatus; - switch (connectionStatus) { - case LOADING_BACKLOG: { - bufferManager.postInit(); - networkManager.postInit(); - setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); - } - break; + if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) { + networkManager.postInit(); + bufferManager.postInit(); + setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); } provider.sendEvent(new ConnectionChangeEvent(connectionStatus)); } @@ -262,7 +263,11 @@ public class QClient extends AClient { return globalNetworkConfig; } case "NetworkInfo": { - return getObjectByIdentifier(QNetwork.class, "Network", objectName).networkInfo(); + QNetwork network = networkManager().network(Integer.parseInt(objectName)); + if (network == null) + return null; + else + return network.networkInfo(); } default: { Log.w("libquassel", "Unknown type: " + className + " : " + objectName); diff --git a/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java index 747991a072f27c7d5400f0c227ebf90a45e4aeee..7684b66946be6545c8339956d74ec9b50ef0ffda 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java @@ -24,14 +24,16 @@ package de.kuschku.libquassel.client; import android.support.annotation.IntRange; import android.support.annotation.NonNull; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Observable; import de.kuschku.libquassel.syncables.types.impl.Network; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -public class QNetworkManager { +public class QNetworkManager extends Observable { @NonNull private final Map<Integer, QNetwork> networks = new HashMap<>(); private final QClient client; @@ -46,6 +48,7 @@ public class QNetworkManager { public void createNetwork(@NonNull QNetwork network) { networks.put(network.networkId(), network); + _update(); } public QNetwork network(@IntRange(from = 0) int networkId) { @@ -54,6 +57,7 @@ public class QNetworkManager { public void removeNetwork(@IntRange(from = 0) int network) { networks.remove(network); + _update(); } @@ -62,6 +66,12 @@ public class QNetworkManager { createNetwork(networkId); client.requestInitObject("Network", String.valueOf(networkId)); } + _update(); + } + + private void _update() { + setChanged(); + notifyObservers(); } public void onDone(Runnable runnable) { @@ -72,5 +82,10 @@ public class QNetworkManager { for (QNetwork network : networks.values()) { network.postInit(); } + _update(); + } + + public List<QNetwork> networks() { + return new ArrayList<>(networks.values()); } } 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 60b11ed04eed6eebb40cfb2c22709e0e3a24e54d..7461e3388f01083a69ef511517cb758ac985bd33 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 @@ -78,6 +78,9 @@ public class NetworkSerializer implements ObjectSerializer<Network> { } final Map<String, QIrcUser> userMap = new HashMap<>(users.size()); + for (QIrcUser user : users) { + userMap.put(user.nick(), user); + } return new Network( channelMap, 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 370a29635e23c7206f4dc4d6d44119267f503676..fe7bb20c29b0a5cff05b66f96edb6b8cfe29d830 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 @@ -24,6 +24,7 @@ package de.kuschku.libquassel.syncables.types; import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import java.util.ArrayList; import java.util.Arrays; @@ -115,6 +116,8 @@ public abstract class SyncableObject<T extends SyncableObject<T>> extends Observ this.objectName = objectName; this.client = client; this.initialized = true; + + Log.d("libquassel", "init: " + objectName); } public void _update() { diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java index b34f6bfc3e1a02ae1bce545553455ab3e9e0bfa2..38a4789f240dd269092800f65b7d765762fcd8dc 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java @@ -305,6 +305,7 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) { bufferViewId = Integer.parseInt(objectName); super.init(objectName, provider, client); + client.bufferViewManager()._addBufferViewConfig(this); _update(); } 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 6da870050ed85ea384857bd9ee39298c54d9d244..1a9fc0372ec4a1abb5f422dd1e6f09eb566bb664 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 @@ -35,6 +35,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import de.kuschku.libquassel.BusProvider; +import de.kuschku.libquassel.client.QClient; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.serializers.IrcChannelSerializer; import de.kuschku.libquassel.syncables.types.abstracts.AIrcChannel; @@ -424,9 +426,16 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } } if (cachedChanModes != null) { + if (cachedChanModes.get("A") != null) A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A"); + + if (cachedChanModes.get("B") != null) B_channelModes = (Map<Character, String>) cachedChanModes.get("B"); + + if (cachedChanModes.get("C") != null) C_channelModes = (Map<Character, String>) cachedChanModes.get("C"); + + if (cachedChanModes.get("D") != null) D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D")); } @@ -464,4 +473,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { return result; } + @Override + public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) { + super.init(objectName, provider, client); + + String[] split = objectName.split("/"); + assertEquals(split.length, 2); + init(client.networkManager().network(Integer.parseInt(split[0]))); + } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java index 8766ad21df0324a5304a89fd2d74fb31359234da..0118e0598fd5fb05c9c1b4c122b87519800b2921 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java @@ -34,6 +34,8 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import de.kuschku.libquassel.BusProvider; +import de.kuschku.libquassel.client.QClient; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.abstracts.AIrcUser; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; @@ -42,6 +44,8 @@ import de.kuschku.util.backports.Objects; import de.kuschku.util.irc.IrcUserUtils; import de.kuschku.util.irc.ModeUtils; +import static de.kuschku.util.AndroidAssert.assertEquals; + public class IrcUser extends AIrcUser<IrcUser> { @NonNull private final SparseArray<DateTime> lastActivity = new SparseArray<>(); @@ -87,6 +91,21 @@ public class IrcUser extends AIrcUser<IrcUser> { @NonNull public static IrcUser create(@NonNull String mask) { + String nick; + String host; + String user; + + // Sometimes this is invoked with a nick instead, so we check + if (mask.contains("@")) { + nick = IrcUserUtils.getNick(mask); + host = IrcUserUtils.getHost(mask); + user = IrcUserUtils.getUser(mask); + } else { + nick = mask; + host = null; + user = null; + } + return new IrcUser( null, null, @@ -95,15 +114,15 @@ public class IrcUser extends AIrcUser<IrcUser> { null, null, null, - IrcUserUtils.getNick(mask), + nick, null, null, null, false, null, - IrcUserUtils.getHost(mask), + host, null, - IrcUserUtils.getUser(mask) + user ); } @@ -416,12 +435,21 @@ public class IrcUser extends AIrcUser<IrcUser> { public void init(QNetwork network) { this.network = network; channels = new HashSet<>(); + if (cachedChannels != null) for (String channelName : cachedChannels) { channels.add(network().newIrcChannel(channelName)); } _update(); } + @Override + public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) { + super.init(objectName, provider, client); + String[] split = objectName.split("/"); + assertEquals(split.length, 2); + init(client.networkManager().network(Integer.parseInt(split[0]))); + } + @Override public void update(Map<String, QVariant> from) { } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java index afb9a2e34fb1663a49096218d20290f477b9e79b..eb8ac90fd02a33df92c5dcbae8f7a736ba785983 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java @@ -754,6 +754,7 @@ public class Network extends ANetwork<Network> implements Observer { public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) { super.init(objectName, provider, client); networkInfo._setNetworkId(Integer.parseInt(objectName)); + client.networkManager().createNetwork(this); } @Override diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java index be5e66f1b047d4af30b9ae27082f1826c2f6198d..0b8bd3510c384b5ee27ea307e5306e3f076d19ea 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java @@ -29,6 +29,7 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import java.util.ArrayList; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; +import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; import de.kuschku.quasseldroid_ng.ui.theme.AppContext; import de.kuschku.util.observables.lists.ObservableSortedList; @@ -50,11 +51,26 @@ public class BufferViewConfigWrapper { return item1.getNetwork().networkId() == item2.getNetwork().networkId(); } }); + @NonNull + private final AppContext context; + @NonNull + private final QBufferViewConfig config; private Drawer drawer; public BufferViewConfigWrapper(@NonNull AppContext context, @NonNull QBufferViewConfig config, Drawer drawer) { + this.context = context; + this.config = config; this.drawer = drawer; + updateNetworks(); + } + + public void updateNetworks() { networks.clear(); + if (config.networkId() != 0) + networks.add(new NetworkItem(context, context.client().networkManager().network(config.networkId()), config)); + else + for (QNetwork network : context.client().networkManager().networks()) + networks.add(new NetworkItem(context, network, config)); } public void updateDrawerItems() { diff --git a/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java b/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java index 3f9a04945ebe9e0fdd2a725bc942535b80388190..47f5ba912f2f243e7df196b1054df5f14d9cae2a 100644 --- a/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java +++ b/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java @@ -49,22 +49,22 @@ public class IrcUserUtils { @NonNull public static String getNick(@NonNull String hostmask) { - return hostmask.split("!")[0]; + return hostmask.split("!", -1)[0]; } @NonNull public static String getUser(@NonNull String hostmask) { - return getMask(hostmask).split("@")[0]; + return getMask(hostmask).split("@", -1)[0]; } @NonNull public static String getHost(@NonNull String hostmask) { - return getMask(hostmask).split("@")[1]; + return getMask(hostmask).split("@", -1)[1]; } @NonNull public static String getMask(@NonNull String hostmask) { - return hostmask.split("!")[1]; + return hostmask.split("!", -1)[1]; } public static class CRCUtils {