From bbe605d119befc456e00c0dc2ad3d13e6da0c101 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 28 Aug 2016 18:21:59 +0200
Subject: [PATCH] Fixed joining and leaving buffers

---
 .../libquassel/client/BufferManager.java      |  4 ++
 .../libquassel/localtypes/BacklogFilter.java  |  2 +
 .../types/abstracts/ABufferViewConfig.java    | 13 ++++--
 .../syncables/types/impl/BacklogManager.java  |  6 ++-
 .../types/impl/BufferViewConfig.java          | 46 +++++++++++++++++++
 .../types/impl/BufferViewManager.java         | 10 ++++
 .../syncables/types/impl/Network.java         |  2 +-
 .../types/interfaces/QBufferViewConfig.java   |  5 ++
 .../types/interfaces/QBufferViewManager.java  |  3 ++
 9 files changed, 83 insertions(+), 8 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 3befa33e0..e41614135 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
@@ -40,6 +40,7 @@ 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.impl.BufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
@@ -108,6 +109,9 @@ public class BufferManager {
         Buffer buffer = Buffers.fromType(info, client);
         assertNotNull(buffer);
         createBuffer(buffer);
+        if (client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) {
+            client.bufferViewManager().checkForNewBuffers(info.id);
+        }
     }
 
     public boolean exists(@NonNull BufferInfo info) {
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
index 1a0c4bc0c..482e78f5c 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
@@ -78,6 +78,7 @@ public class BacklogFilter implements UICallback {
     }
 
     private void updateDayChangeMessages() {
+        /*
         LocalDate date = null;
         Message lastMessage = null;
         for (Message message : filtered) {
@@ -130,6 +131,7 @@ public class BacklogFilter implements UICallback {
                     ""
             )));
         }
+        */
     }
 
     private boolean filterItem(@NonNull Message message) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java
index c3de44e18..7c3bfa6d3 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java
@@ -21,10 +21,13 @@
 
 package de.kuschku.libquassel.syncables.types.abstracts;
 
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.syncables.types.SyncableObject;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 
 public abstract class ABufferViewConfig<T extends ABufferViewConfig<T>> extends SyncableObject<T> implements QBufferViewConfig {
+    static final String intName = QMetaType.Type.Int.getSerializableName();
+
     @Override
     public void setNetworkId(int networkId) {
         _setNetworkId(networkId);
@@ -95,7 +98,7 @@ public abstract class ABufferViewConfig<T extends ABufferViewConfig<T>> extends
     @Override
     public void requestAddBuffer(int bufferId, int pos) {
         _requestAddBuffer(bufferId, pos);
-        syncVar("requestAddBuffer", bufferId, pos);
+        sync("requestAddBuffer", new String[] { "BufferId", intName }, new Object[] { bufferId, pos });
     }
 
     @Override
@@ -107,7 +110,7 @@ public abstract class ABufferViewConfig<T extends ABufferViewConfig<T>> extends
     @Override
     public void requestMoveBuffer(int bufferId, int pos) {
         _requestMoveBuffer(bufferId, pos);
-        syncVar("requestMoveBuffer", bufferId, pos);
+        sync("requestMoveBuffer", new String[] { "BufferId", intName }, new Object[] { bufferId, pos });
     }
 
     @Override
@@ -119,18 +122,18 @@ public abstract class ABufferViewConfig<T extends ABufferViewConfig<T>> extends
     @Override
     public void requestRemoveBuffer(int bufferId) {
         _requestRemoveBuffer(bufferId);
-        syncVar("requestRemoveBuffer", bufferId);
+        sync("requestRemoveBuffer", new String[] { "BufferId" }, new Object[] { bufferId });
     }
 
     @Override
     public void removeBufferPermanently(int bufferId) {
         _removeBufferPermanently(bufferId);
-        syncVar("removeBufferPermanently", bufferId);
+        sync("removeBufferPermanently", new String[] { "BufferId" }, new Object[] { bufferId });
     }
 
     @Override
     public void requestRemoveBufferPermanently(int bufferId) {
         _requestRemoveBufferPermanently(bufferId);
-        syncVar("requestRemoveBufferPermanently", bufferId);
+        sync("requestRemoveBufferPermanently", new String[] { "BufferId" }, new Object[] { bufferId });
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
index dd3cac345..67d7af8b2 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
@@ -41,6 +41,7 @@ import de.kuschku.libquassel.localtypes.BacklogFilter;
 import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.message.Message_Table;
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.abstracts.ABacklogManager;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
@@ -135,8 +136,9 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
 
         Set<Integer> buffers = new HashSet<>();
         for (Message message : messages) {
-            storage.insertMessages(message.bufferInfo.id, message);
-            buffers.add(message.bufferInfo.id);
+            BufferInfo bufferInfo = message.bufferInfo;
+            storage.insertMessages(bufferInfo.id, message);
+            buffers.add(bufferInfo.id);
         }
         for (int id : buffers) {
             provider.sendEvent(new BacklogReceivedEvent(id));
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 6167a7527..f41b5035d 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,9 @@
 package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -30,6 +32,7 @@ import java.util.Map;
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.localtypes.buffers.Buffer;
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.serializers.BufferViewConfigSerializer;
 import de.kuschku.libquassel.syncables.types.abstracts.ABufferViewConfig;
@@ -144,6 +147,41 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
         }
     }
 
+    @Override
+    public void checkAddBuffer(int id) {
+        if (!allBufferIds.contains(id)) {
+            Log.w("DEBUG", "buffer " + id + " needs to be added to config " + bufferViewName);
+            Buffer buffer1 = client.bufferManager().buffer(id);
+            if (addNewBuffersAutomatically && buffer1 != null) {
+                BufferInfo info = buffer1.getInfo();
+                int pos;
+                if (!sortAlphabetically) {
+                    pos = visibleBufferIds.size();
+                } else {
+                    List<String> infos = new ArrayList<>();
+                    for (int bufferId : bufferList()) {
+                        Buffer buffer = client.bufferManager().buffer(bufferId);
+                        if (buffer == null)
+                            Log.e("DEBUG", "Buffer is null: " + bufferId + " while adding buffer " + info);
+                        BufferInfo info1 = buffer.getInfo();
+                        if (info1.networkId == info.networkId)
+                            infos.add(info1.name);
+                    }
+                    infos.add(info.name);
+                    Collections.sort(infos);
+                    pos = infos.indexOf(info.name);
+                }
+                requestAddBuffer(info.id, pos);
+                Log.w("DEBUG", "adding buffer: " + id);
+            } else {
+                requestRemoveBufferPermanently(id);
+                Log.w("DEBUG", "removing buffer permanently: " + id);
+            }
+        }  else {
+            Log.w("DEBUG", "Buffer already exists: " + id);
+        }
+    }
+
     @Override
     public DisplayType mayDisplay(Buffer buffer) {
         if (buffer != null &&
@@ -262,6 +300,13 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
         return allBufferIds;
     }
 
+    @Override
+    public void checkAddBuffers() {
+        for (int bufferId : client.bufferManager().bufferIds()) {
+            checkAddBuffer(bufferId);
+        }
+    }
+
     @NonNull
     @Override
     public ObservableSet<Integer> removedBuffers() {
@@ -378,6 +423,7 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
         super.init(objectName, provider, client);
         client.bufferViewManager()._addBufferViewConfig(this);
         updateNetworks();
+        checkAddBuffers();
         _update();
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java
index 11ff20776..2ef6d81fc 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java
@@ -22,6 +22,7 @@
 package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -32,6 +33,7 @@ import java.util.Set;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.client.Client;
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.abstracts.ABufferViewManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
@@ -104,6 +106,14 @@ public class BufferViewManager extends ABufferViewManager<BufferViewManager> {
         // Do nothing, we’re on the client – the server will receive the sync just as expected
     }
 
+    @Override
+    public void checkForNewBuffers(int bufferId) {
+        Log.w("DEBUG", "Checking if buffer needs to be added somewhere: " + bufferId + ": " + client.bufferManager().buffer(bufferId));
+        for (QBufferViewConfig config : bufferViewConfigs()) {
+            config.checkAddBuffer(bufferId);
+        }
+    }
+
     @Override
     public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) {
         super.init(objectName, provider, client);
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 f32f15a2a..a5e33688b 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
@@ -779,7 +779,7 @@ public class Network extends ANetwork<Network> implements Observer {
     @Override
     public void _update() {
         super._update();
-        if (client != null && client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) {
+        if (client != null && client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA && client.bufferViewManager() != null) {
             StatusBuffer buffer = client.bufferManager().network(networkInfo.networkId());
             if (buffer != null) {
                 buffer.updateStatus();
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java
index 919a482df..0dce495a7 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java
@@ -24,6 +24,7 @@ package de.kuschku.libquassel.syncables.types.interfaces;
 import android.support.annotation.NonNull;
 
 import de.kuschku.libquassel.localtypes.buffers.Buffer;
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.Synced;
 import de.kuschku.util.observables.lists.ObservableList;
 import de.kuschku.util.observables.lists.ObservableSet;
@@ -160,11 +161,15 @@ public interface QBufferViewConfig extends QObservable {
 
     void updateNetworks();
 
+    void checkAddBuffer(int id);
+
     DisplayType mayDisplay(Buffer buffer);
 
     @NonNull
     ObservableSet<Integer> allBufferIds();
 
+    void checkAddBuffers();
+
     enum DisplayType {
         NONE,
         ALWAYS,
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java
index 1359b8421..d34328459 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java
@@ -25,6 +25,7 @@ import android.support.annotation.NonNull;
 
 import java.util.List;
 
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.Synced;
 
 public interface QBufferViewManager extends QObservable {
@@ -71,4 +72,6 @@ public interface QBufferViewManager extends QObservable {
     void requestDeleteBufferViews(final List<Integer> bufferViews);
 
     void _requestDeleteBufferViews(final List<Integer> bufferViews);
+
+    void checkForNewBuffers(int bufferId);
 }
-- 
GitLab