From ef8a5b90644b0027683849c25b27cb45bef9800a Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 12 Feb 2016 23:58:10 +0100
Subject: [PATCH] Fixed a bug where items occurred twice in the buffer list

---
 .../quasseldroid_ng/ui/chat/MainActivity.java     | 15 +++++++++------
 .../ui/chat/drawer/BufferViewConfigItem.java      | 14 ++++++++++++--
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
index cb2af0690..02f08b33f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
@@ -99,7 +99,7 @@ public class MainActivity extends BoundActivity {
      * This object encapsulates the current status of the activity – opened bufferview, for example
      */
     Status status = new Status();
-
+    BufferViewConfigItem currentConfig;
     private AccountManager manager;
 
     @Override
@@ -209,16 +209,19 @@ public class MainActivity extends BoundActivity {
         status.bufferViewConfigId = bufferViewConfigId;
         accountHeader.setActiveProfile(bufferViewConfigId, false);
 
-        if (bufferViewConfigId == -1) {
-            drawerLeft.removeAllItems();
-        } else {
-            drawerLeft.removeAllItems();
+
+        drawerLeft.removeAllItems();
+        if (currentConfig != null)
+            currentConfig.remove();
+        currentConfig = null;
+
+        if (bufferViewConfigId != -1) {
             QBufferViewManager bufferViewManager = client.bufferViewManager();
             assertNotNull(bufferViewManager);
             QBufferViewConfig viewConfig = bufferViewManager.bufferViewConfig(bufferViewConfigId);
             assertNotNull(viewConfig);
 
-            new BufferViewConfigItem(drawerLeft, viewConfig, context);
+            currentConfig = new BufferViewConfigItem(drawerLeft, viewConfig, context);
         }
     }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java
index f23eb526e..8362f4b52 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java
@@ -35,6 +35,7 @@ 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.callbacks.DrawerItemCallback;
+import de.kuschku.util.observables.callbacks.GeneralCallback;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 
@@ -52,14 +53,18 @@ public class BufferViewConfigItem implements DrawerItemCallback {
     @NonNull
     private final AppContext context;
 
+    GeneralCallback rebuildNetworkList = this::rebuildNetworkList;
+    AdapterUICallbackWrapper callbackWrapper;
+
     public BufferViewConfigItem(@NonNull Drawer drawer, @NonNull QBufferViewConfig config, @NonNull AppContext context) {
         this.drawer = drawer;
         this.config = config;
         this.context = context;
         manager = new BufferItemManager(context);
-        config.addObserver(this::rebuildNetworkList);
+        config.addObserver(rebuildNetworkList);
         assertNotNull(drawer.getItemAdapter());
-        networks.addCallback(new AdapterUICallbackWrapper(drawer.getItemAdapter()));
+        callbackWrapper = new AdapterUICallbackWrapper(drawer.getItemAdapter());
+        networks.addCallback(callbackWrapper);
         rebuildNetworkList();
     }
 
@@ -126,4 +131,9 @@ public class BufferViewConfigItem implements DrawerItemCallback {
                 drawer.getAdapter().notifyAdapterSubItemsChanged(position);
         }
     }
+
+    public void remove() {
+        config.deleteObserver(rebuildNetworkList);
+        networks.removeCallback(callbackWrapper);
+    }
 }
-- 
GitLab