diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java index f415a1edaaf7fc76bb0c489fb6d9077848d48f0b..8d8e10b31bc839965651deb76edc72399cb6f568 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Set; import de.kuschku.libquassel.localtypes.buffers.Buffer; +import de.kuschku.libquassel.localtypes.buffers.Buffers; import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; import de.kuschku.libquassel.localtypes.buffers.StatusBuffer; @@ -118,4 +119,16 @@ public class BufferManager { createBuffer(new ChannelBuffer(info, ircChannel)); } } + + public void createBuffer(BufferInfo info) { + QNetwork network = client.networkManager().network(info.networkId()); + if (network == null) return; + Buffer buffer = Buffers.fromType(info, network); + if (buffer == null) return; + createBuffer(buffer); + } + + public boolean exists(BufferInfo info) { + return buffers.containsKey(info.id()); + } } diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java index 0684d5df60dcce450af61ad8de23d65b6addcade..6401bd5f62eb2882a77746bdfe76df5fa90b7c59 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/Client.java +++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java @@ -24,6 +24,7 @@ package de.kuschku.libquassel.client; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; +import android.util.Pair; import java.util.HashMap; import java.util.LinkedList; @@ -57,6 +58,7 @@ import de.kuschku.libquassel.syncables.types.impl.NetworkConfig; import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; import de.kuschku.libquassel.syncables.types.interfaces.QBufferSyncer; +import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; @@ -80,8 +82,9 @@ public class Client extends AClient { private final NotificationManager notificationManager; private final List<String> initRequests = new LinkedList<>(); private final List<Integer> backlogRequests = new LinkedList<>(); - private final Map<String, List<SyncFunction>> bufferedSyncs = new HashMap<>(); private final QBacklogManager backlogManager; + private final Map<String, List<SyncFunction>> bufferedSyncs = new HashMap<>(); + private final Map<Integer, Pair<QBufferViewConfig, Integer>> bufferedBuffers = new HashMap<>(); private QBufferViewManager bufferViewManager; // local private QBufferSyncer bufferSyncer; @@ -442,4 +445,21 @@ public class Client extends AClient { bufferedSyncs.put(key, new LinkedList<>()); bufferedSyncs.get(key).add(packedFunc); } + + public void bufferBuffer(QBufferViewConfig bufferViewConfig, int bufferId, int pos) { + bufferedBuffers.put(bufferId, Pair.create(bufferViewConfig, pos)); + Log.d("libquassel", "Queueing buffer: " + bufferId); + } + + public void unbufferBuffer(BufferInfo info) { + if (!bufferManager().exists(info)) { + bufferManager().createBuffer(info); + Log.d("libquassel", "Creating buffer from message info: " + info.id()); + } + if (bufferedBuffers.containsKey(info.id())) { + Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.remove(info.id()); + pair.first._addBuffer(info.id(), pair.second); + Log.d("libquassel", "Un-Queueing buffer: " + info.id()); + } + } } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java index ee0e0c3f4e2ab44a657513d9f5f41131f9336155..3d96429393f06ebef3a7e51b5373026f5eaaf9e2 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java @@ -66,14 +66,17 @@ public class MemoryBacklogStorage implements BacklogStorage { @Override public void insertMessages(@IntRange(from = 0) int bufferId, @NonNull Message... messages) { ensureExisting(bufferId); - for (Message message : messages) + for (Message message : messages) { + client.unbufferBuffer(message.bufferInfo); backlogs.get(bufferId).add(message); + } } @Override public void insertMessages(@NonNull Message... messages) { for (Message message : messages) { ensureExisting(message.bufferInfo.id()); + client.unbufferBuffer(message.bufferInfo); backlogs.get(message.bufferInfo.id()).add(message); } } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java index 6c6e03ea359cb6c96b098975a0221f2ad6f5d18a..10627998eb8dad7a91de5db614e63d443d4190f6 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java @@ -34,6 +34,19 @@ public class Buffers { } + public static boolean exists(@NonNull BufferInfo info, @NonNull QNetwork network) { + switch (info.type()) { + case QUERY: + return info.name() != null && network.ircUser(info.name()) != null; + case CHANNEL: + return info.name() != null && network.ircChannel(info.name()) != null; + case STATUS: + return true; + default: + return false; + } + } + @Nullable public static Buffer fromType(@NonNull BufferInfo info, @NonNull QNetwork network) { Buffer result; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java index 75fdfbc0e5e99330cc0af6bb911d09f881c794dd..af5bf64374b35568e52e7ba3863c9b3c90275dd9 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java @@ -55,13 +55,13 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje @Override public void joinIrcUser(QIrcUser ircuser) { _joinIrcUser(ircuser); - syncVar("joinIrcUser", ircuser); + syncVar("joinIrcUser", ircuser.nick()); } @Override public void part(QIrcUser ircuser) { _part(ircuser); - syncVar("part", ircuser); + syncVar("part", ircuser.nick()); } @Override @@ -73,7 +73,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje @Override public void setUserModes(QIrcUser ircuser, String modes) { _setUserModes(ircuser, modes); - syncVar("setUserModes", ircuser, modes); + syncVar("setUserModes", ircuser.nick(), modes); } @Override @@ -85,7 +85,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje @Override public void addUserMode(QIrcUser ircuser, String mode) { _addUserMode(ircuser, mode); - syncVar("addUserMode", ircuser, mode); + syncVar("addUserMode", ircuser.nick(), mode); } @Override @@ -97,7 +97,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje @Override public void removeUserMode(QIrcUser ircuser, String mode) { _removeUserMode(ircuser, mode); - syncVar("removeUserMode", ircuser, mode); + syncVar("removeUserMode", ircuser.nick(), mode); } @Override diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java index a80207ee1ff2586b6f468954a40712c971fcb66a..300175bcab3085903fe783e2b6f29271fa82729d 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java @@ -127,13 +127,13 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> @Override public void joinChannel(QIrcChannel channel) { _joinChannel(channel); - syncVar("joinChannel", channel); + syncVar("joinChannel", channel.name()); } @Override public void joinChannel(QIrcChannel channel, boolean skip_channel_join) { _joinChannel(channel, skip_channel_join); - syncVar("joinChannel", channel, skip_channel_join); + syncVar("joinChannel", channel.name(), skip_channel_join); } @Override @@ -145,7 +145,7 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> @Override public void partChannel(QIrcChannel channel) { _partChannel(channel); - syncVar("partChannel", channel); + syncVar("partChannel", channel.name()); } @Override @@ -175,6 +175,6 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> @Override public void partChannel(QIrcChannel channel, boolean skip_channel_part) { _partChannel(channel, skip_channel_part); - syncVar("partChannel", channel, skip_channel_part); + syncVar("partChannel", channel.name(), skip_channel_part); } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java index 291baa7622b4aa3c5765c54a97480a0d79273996..f7f196f362dbfa1623a5ba9bbf063ecca67ce652 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java @@ -251,12 +251,12 @@ public abstract class ANetwork<T extends ANetwork<T>> extends SyncableObject<T> @Override public void removeIrcChannel(QIrcChannel ircChannel) { _removeIrcChannel(ircChannel); - syncVar("removeIrcChannel", ircChannel); + syncVar("removeIrcChannel", ircChannel.name()); } @Override public void removeIrcUser(QIrcUser ircuser) { _removeIrcUser(ircuser); - syncVar("removeIrcUser", ircuser); + syncVar("removeIrcUser", ircuser.nick()); } } 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 43ff8e36469993e9335fc9faf86f3f2b0b538123..2cfd900a0f1080ca1fc6de2b0447c94f02ee0b1d 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 @@ -22,6 +22,7 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.NonNull; +import android.util.Log; import java.util.Collections; import java.util.List; @@ -214,6 +215,11 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { @Override public void _addBuffer(int bufferId, int pos) { + if (client.bufferManager().buffer(bufferId) == null) { + client.bufferBuffer(this, bufferId, pos); + return; + } + if (buffers.contains(bufferId)) return; @@ -228,7 +234,7 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { if (temporarilyRemovedBuffers.contains(bufferId)) temporarilyRemovedBuffers.remove(bufferId); - buffers.add(bufferId, pos); + buffers.add(pos, bufferId); } @Override @@ -269,13 +275,19 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { @Override public void _removeBuffer(int bufferId) { - if (buffers.contains(bufferId)) - buffers.remove(buffers.indexOf(bufferId)); + Log.d("after", String.valueOf(buffers)); + + int index; + if ((index = buffers.indexOf(bufferId)) != -1) { + buffers.remove(index); + } if (removedBuffers.contains(bufferId)) removedBuffers.remove(bufferId); temporarilyRemovedBuffers.add(bufferId); + + Log.d("after", String.valueOf(buffers)); _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 ee9ff1506c870f708e496a08430df85cc44a6516..520837eb3b5a169fdaefeb0983ea2ae6180c3db1 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 @@ -294,15 +294,15 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { public void _part(@NonNull QIrcUser ircuser) { if (isKnownUser(ircuser)) { userModes.remove(ircuser); - ircuser.partChannel(this); + ircuser._partChannel(this); if (network().isMe(ircuser) || userModes.isEmpty()) { Set<QIrcUser> users = userModes.keySet(); userModes.clear(); for (QIrcUser user : users) { - user.partChannel(this, true); + user._partChannel(this, true); } - network().removeIrcChannel(this); + network()._removeIrcChannel(this); } _update(); } 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 23666611e687e7fcaa1bf4df688cadc1c637d4a2..063c4344cff2ca45f3e1f4c9c8b6f127f3e57740 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 @@ -68,7 +68,7 @@ public class IrcUser extends AIrcUser<IrcUser> { private boolean encrypted; private QNetwork network; private Set<Character> userModes; - private Set<QIrcChannel> channels; + private Set<QIrcChannel> channels = new HashSet<>(); public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) { this.server = server; @@ -367,7 +367,7 @@ public class IrcUser extends AIrcUser<IrcUser> { if (!channels.contains(channel)) { channels.add(channel); if (!skip_channel_join) - channel.joinIrcUser(this); + channel._joinIrcUser(this); } _update(); } @@ -389,9 +389,9 @@ public class IrcUser extends AIrcUser<IrcUser> { if (channels.contains(channel)) { channels.remove(channel); if (!skip_channel_part) - channel.joinIrcUser(this); + channel._part(this); if (channels.isEmpty() && !network().isMe(this)) - quit(); + _quit(); } _update(); } @@ -407,9 +407,9 @@ public class IrcUser extends AIrcUser<IrcUser> { List<QIrcChannel> channels = new ArrayList<>(this.channels); this.channels.clear(); for (QIrcChannel channel : channels) { - channel.part(this); + channel._part(this); } - network().removeIrcUser(this); + network()._removeIrcUser(this); _update(); } @@ -436,7 +436,6 @@ public class IrcUser extends AIrcUser<IrcUser> { this.network = network; this.client = client; - channels = new HashSet<>(); if (cachedChannels != null) for (String channelName : cachedChannels) { channels.add(network().newIrcChannel(channelName));