Skip to content
Snippets Groups Projects
Commit 5c33a274 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Fixed issue where newly created channels wouldn’t be properly initialized.

parent 48842fa5
Branches
Tags
No related merge requests found
Showing
with 86 additions and 26 deletions
......@@ -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());
}
}
......@@ -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());
}
}
}
......@@ -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);
}
}
......
......@@ -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;
......
......@@ -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
......
......@@ -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);
}
}
......@@ -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());
}
}
......@@ -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();
}
......
......@@ -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();
}
......
......@@ -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));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment