From d534075707a7eeeaff3c8ba760e2455a9fb8cced Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 4 Feb 2016 23:54:01 +0100
Subject: [PATCH] =?UTF-8?q?Fixed=20issue=20where=20newly=20created=20chann?=
 =?UTF-8?q?els=20wouldn=E2=80=99t=20be=20properly=20initialized.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../libquassel/client/BufferManager.java      | 57 +------------------
 .../de/kuschku/libquassel/client/Client.java  |  5 +-
 .../localtypes/buffers/Buffers.java           | 31 ++--------
 .../localtypes/buffers/ChannelBuffer.java     | 23 +++-----
 .../localtypes/buffers/QueryBuffer.java       | 21 +++----
 .../localtypes/buffers/StatusBuffer.java      | 16 ++++--
 .../types/impl/BufferViewConfig.java          |  5 --
 .../syncables/types/impl/IrcChannel.java      |  2 -
 .../syncables/types/impl/IrcUser.java         |  1 -
 .../syncables/types/impl/Network.java         | 10 ++--
 10 files changed, 45 insertions(+), 126 deletions(-)

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 8d8e10b31..3b2c11994 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
@@ -25,20 +25,12 @@ import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 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;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
-import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
-import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
-import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
@@ -47,10 +39,6 @@ public class BufferManager {
     private final Map<Integer, Buffer> buffers = new HashMap<>();
     private final Client client;
 
-    // We cache those, because the networks might not be initialized at begin
-    @NonNull
-    private Map<String, Set<BufferInfo>> bufferInfos = new HashMap<>();
-
     public BufferManager(Client client) {
         this.client = client;
     }
@@ -75,56 +63,17 @@ public class BufferManager {
 
     public void init(List<BufferInfo> bufferInfos) {
         for (BufferInfo info : bufferInfos) {
-            if (this.bufferInfos.get(objectName(info)) == null)
-                this.bufferInfos.put(objectName(info), new HashSet<>());
-
-            this.bufferInfos.get(objectName(info)).add(info);
+            createBuffer(info);
         }
     }
 
-    private String objectName(BufferInfo info) {
-        if (info.type() == BufferInfo.Type.STATUS)
-            return String.valueOf(info.networkId());
-        else
-            return info.networkId() + "/" + info.name();
-    }
-
-    public void postInit(String objectName, QIrcUser ircUser) {
-        if (bufferInfos.get(objectName) != null)
-            for (BufferInfo info : bufferInfos.get(objectName)) {
-                QNetwork network = client.networkManager().network(info.networkId());
-                assertNotNull(network);
-                createBuffer(new QueryBuffer(info, ircUser));
-            }
-    }
-
-    public void postInit(String objectName, QNetwork ircUser) {
-        if (bufferInfos.get(objectName) != null)
-            for (BufferInfo info : bufferInfos.get(objectName)) {
-                QNetwork network = client.networkManager().network(info.networkId());
-                assertNotNull(network);
-                createBuffer(new StatusBuffer(info, ircUser));
-            }
-    }
-
     public Map<Integer, Buffer> buffers() {
         return buffers;
     }
 
-    public void postInit(String objectName, QIrcChannel ircChannel) {
-        if (bufferInfos.get(objectName) != null)
-            for (BufferInfo info : bufferInfos.get(objectName)) {
-                QNetwork network = client.networkManager().network(info.networkId());
-                assertNotNull(network);
-                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;
+        Buffer buffer = Buffers.fromType(info, client);
+        assertNotNull(buffer);
         createBuffer(buffer);
     }
 
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 6401bd5f6..6ce6497cb 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java
@@ -193,6 +193,9 @@ public class Client extends AClient {
 
         this.connectionStatus = connectionStatus;
         if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
+            for (QNetwork network : networkManager().networks()) {
+                Log.d("libquassel", String.valueOf(network.channels()));
+            }
             setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
         }
         provider.sendEvent(new ConnectionChangeEvent(connectionStatus));
@@ -457,7 +460,7 @@ public class Client extends AClient {
             Log.d("libquassel", "Creating buffer from message info: " + info.id());
         }
         if (bufferedBuffers.containsKey(info.id())) {
-            Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.remove(info.id());
+            Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.get(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/buffers/Buffers.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java
index 10627998e..a1ab5b5b7 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
@@ -24,46 +24,25 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
-import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
-
-import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 public class Buffers {
     private 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;
+    public static Buffer fromType(@NonNull BufferInfo info, @NonNull Client client) {
         switch (info.type()) {
             case QUERY:
-                assertNotNull(info.name());
-                result = new QueryBuffer(info, network.ircUser(info.name()));
-                break;
+                return new QueryBuffer(info, client);
             case CHANNEL:
-                result = new ChannelBuffer(info, network.ircChannel(info.name()));
-                break;
+                return new ChannelBuffer(info, client);
             case STATUS:
-                result = new StatusBuffer(info, network);
-                break;
+                return new StatusBuffer(info, client);
             default:
                 return null;
         }
-        return result;
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
index ea3d4db26..3a0451742 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
@@ -24,21 +24,19 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 
-import static de.kuschku.util.AndroidAssert.assertNotNull;
-
 public class ChannelBuffer implements Buffer {
+    @NonNull
+    private final Client client;
     @NonNull
     private BufferInfo info;
-    @Nullable
-    private QIrcChannel channel;
 
-    public ChannelBuffer(@NonNull BufferInfo info, @Nullable QIrcChannel channel) {
-        assertNotNull(channel);
+    public ChannelBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
-        this.channel = channel;
+        this.client = client;
     }
 
     @NonNull
@@ -61,21 +59,17 @@ public class ChannelBuffer implements Buffer {
     @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
-        return channel == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE;
+        return getChannel() == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE;
     }
 
     @Override
     public void renameBuffer(@NonNull String newName) {
-
+        info.setName(newName);
     }
 
     @Nullable
     public QIrcChannel getChannel() {
-        return channel;
-    }
-
-    public void setChannel(@Nullable QIrcChannel channel) {
-        this.channel = channel;
+        return client.networkManager().network(info.networkId()).ircChannel(info.name());
     }
 
     @NonNull
@@ -83,7 +77,6 @@ public class ChannelBuffer implements Buffer {
     public String toString() {
         return "ChannelBuffer{" +
                 "info=" + info +
-                ", channel=" + channel +
                 '}';
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
index 48cee5999..0b862ab5c 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
@@ -24,21 +24,19 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
 
-import static de.kuschku.util.AndroidAssert.assertNotNull;
-
 public class QueryBuffer implements Buffer {
-    @Nullable
-    private final QIrcUser user;
+    @NonNull
+    private final Client client;
     @NonNull
     private BufferInfo info;
 
-    public QueryBuffer(@NonNull BufferInfo info, @Nullable QIrcUser user) {
-        assertNotNull(user);
+    public QueryBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
-        this.user = user;
+        this.client = client;
     }
 
     @NonNull
@@ -61,19 +59,19 @@ public class QueryBuffer implements Buffer {
     @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
-        return (user == null) ? BufferInfo.BufferStatus.OFFLINE :
-                (user.isAway()) ? BufferInfo.BufferStatus.AWAY :
+        return (getUser() == null) ? BufferInfo.BufferStatus.OFFLINE :
+                (getUser().isAway()) ? BufferInfo.BufferStatus.AWAY :
                         BufferInfo.BufferStatus.ONLINE;
     }
 
     @Override
     public void renameBuffer(@NonNull String newName) {
-
+        info.setName(newName);
     }
 
     @Nullable
     public QIrcUser getUser() {
-        return user;
+        return client.networkManager().network(info.networkId()).ircUser(info.name());
     }
 
     @NonNull
@@ -81,7 +79,6 @@ public class QueryBuffer implements Buffer {
     public String toString() {
         return "QueryBuffer{" +
                 "info=" + info +
-                ", user=" + user +
                 '}';
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
index 36041b9fb..cd172cf58 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
@@ -24,18 +24,19 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 
 public class StatusBuffer implements Buffer {
     @NonNull
-    private final QNetwork network;
+    private final Client client;
     @NonNull
     private BufferInfo info;
 
-    public StatusBuffer(@NonNull BufferInfo info, @NonNull QNetwork network) {
+    public StatusBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
-        this.network = network;
+        this.client = client;
     }
 
     @NonNull
@@ -49,16 +50,20 @@ public class StatusBuffer implements Buffer {
         this.info = info;
     }
 
+    public QNetwork getNetwork() {
+        return client.networkManager().network(info.networkId());
+    }
+
     @Nullable
     @Override
     public String getName() {
-        return network.networkName();
+        return getNetwork().networkName();
     }
 
     @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
-        return network.isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE;
+        return getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE;
     }
 
     @Override
@@ -71,7 +76,6 @@ public class StatusBuffer implements Buffer {
     public String toString() {
         return "StatusBuffer{" +
                 "info=" + info +
-                ", network=" + network +
                 '}';
     }
 }
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 2cfd900a0..da8830879 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,7 +22,6 @@
 package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
-import android.util.Log;
 
 import java.util.Collections;
 import java.util.List;
@@ -275,8 +274,6 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
 
     @Override
     public void _removeBuffer(int bufferId) {
-        Log.d("after", String.valueOf(buffers));
-
         int index;
         if ((index = buffers.indexOf(bufferId)) != -1) {
             buffers.remove(index);
@@ -286,8 +283,6 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
             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 520837eb3..bf9e3eb95 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
@@ -444,8 +444,6 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
         cachedChanModes = null;
 
         this.network._addIrcChannel(this);
-
-        client.bufferManager().postInit(network.networkId() + "/" + name(), 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 063c4344c..3b36b2ab0 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
@@ -440,7 +440,6 @@ public class IrcUser extends AIrcUser<IrcUser> {
         for (String channelName : cachedChannels) {
             channels.add(network().newIrcChannel(channelName));
         }
-        client.bufferManager().postInit(network.networkId() + "/" + nick(), this);
         _update();
     }
 
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 2878e8420..0d74ab0d6 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
@@ -405,9 +405,12 @@ public class Network extends ANetwork<Network> implements Observer {
 
     @Override
     public QIrcChannel newIrcChannel(@NonNull String channelname) {
-        QIrcChannel channel = IrcChannel.create(channelname);
-        channels.put(IrcCaseMapper.toLowerCase(channelname), channel);
-        return channel;
+        if (!channels.containsKey(IrcCaseMapper.toLowerCase(channelname))) {
+            QIrcChannel channel = IrcChannel.create(channelname);
+            channels.put(IrcCaseMapper.toLowerCase(channelname), channel);
+            channel.init(this, client);
+        }
+        return channels.get(IrcCaseMapper.toLowerCase(channelname));
     }
 
     @Nullable
@@ -757,7 +760,6 @@ public class Network extends ANetwork<Network> implements Observer {
         for (QIrcUser name : ircUsers()) {
             client.requestInitObject("IrcUser", networkId() + "/" + name.nick());
         }
-        client.bufferManager().postInit(String.valueOf(networkId()), this);
     }
 
     @Override
-- 
GitLab