From 6c4adc358f43dc8b912f25251cc018d3ce18f4d0 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 27 Aug 2016 15:51:05 +0200
Subject: [PATCH] Fixed messages sometimes not being saved

---
 app/proguard-rules.pro                        |  7 ++-
 .../backlogstorage/HybridBacklogStorage.java  | 48 ++++++++++++-------
 .../quasseldroid_ng/ui/chat/MainActivity.java |  1 +
 app/src/main/res/menu/chat.xml                | 10 ++--
 4 files changed, 44 insertions(+), 22 deletions(-)

diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index df5f69275..08f3c6edc 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -78,4 +78,9 @@
 #########################################
 ## DBFlow                              ##
 #########################################
--keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; }
\ No newline at end of file
+-keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; }
+
+#########################################
+## AppCompat SearchView                ##
+#########################################
+-keep class android.support.v7.widget.SearchView { *; }
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
index f702dcb0d..7a53276ec 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
@@ -128,26 +128,40 @@ public class HybridBacklogStorage implements BacklogStorage {
 
     @Override
     public void insertMessages(@NonNull Message... messages) {
-        for (Message message : messages) {
-            client.unbufferBuffer(message.bufferInfo);
-            synchronized (backlogs) {
-                if (backlogs.get(message.bufferInfo.id) != null)
-                    backlogs.get(message.bufferInfo.id).add(message);
+        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() {
+            @Override
+            public void execute(DatabaseWrapper databaseWrapper) {
+                for (Message message : messages) {
+                    client.unbufferBuffer(message.bufferInfo);
+                    synchronized (backlogs) {
+                        if (backlogs.get(message.bufferInfo.id) != null)
+                            backlogs.get(message.bufferInfo.id).add(message);
+                        message.save();
+                        message.bufferInfo.save();
+                    }
+                    updateLatest(message);
+                }
             }
-            updateLatest(message);
-        }
+        });
     }
 
     @Override
     public void insertMessages(List<Message> messages) {
-        for (Message message : messages) {
-            client.unbufferBuffer(message.bufferInfo);
-            synchronized (backlogs) {
-                if (backlogs.get(message.bufferInfo.id) != null)
-                    backlogs.get(message.bufferInfo.id).add(message);
+        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() {
+            @Override
+            public void execute(DatabaseWrapper databaseWrapper) {
+                for (Message message : messages) {
+                    client.unbufferBuffer(message.bufferInfo);
+                    synchronized (backlogs) {
+                        if (backlogs.get(message.bufferInfo.id) != null)
+                            backlogs.get(message.bufferInfo.id).add(message);
+                        message.save();
+                        message.bufferInfo.save();
+                    }
+                    updateLatest(message);
+                }
             }
-            updateLatest(message);
-        }
+        });
     }
 
     public void setClient(Client client) {
@@ -167,8 +181,10 @@ public class HybridBacklogStorage implements BacklogStorage {
 
     @Override
     public void clear(@IntRange(from = 0) int bufferid) {
-        Log.w("libquassel", String.format("Backlog gap detected, clearing backlog for buffer %d", bufferid));
-        SQLite.delete().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferid)).execute();
+        synchronized (backlogs) {
+            Log.w("libquassel", String.format("Backlog gap detected, clearing backlog for buffer %d", bufferid));
+            SQLite.delete().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferid)).execute();
+        }
     }
 
     private void ensureExisting(@IntRange(from = -1) int bufferId) {
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 7174af59d..3ad162032 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
@@ -39,6 +39,7 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.SearchView;
 import android.support.v7.widget.Toolbar;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
diff --git a/app/src/main/res/menu/chat.xml b/app/src/main/res/menu/chat.xml
index 7381ab764..07869e2e9 100644
--- a/app/src/main/res/menu/chat.xml
+++ b/app/src/main/res/menu/chat.xml
@@ -22,16 +22,16 @@
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
-    <item
-        android:id="@+id/action_hide_events"
-        android:icon="?attr/iconFilter"
-        android:title="@string/labelHideEvents"
-        app:showAsAction="never" />
     <item
         android:id="@+id/action_search"
         android:title="@string/label_search"
         app:showAsAction="never|collapseActionView"
         app:actionViewClass="android.support.v7.widget.SearchView" />
+    <item
+        android:id="@+id/action_hide_events"
+        android:icon="?attr/iconFilter"
+        android:title="@string/labelHideEvents"
+        app:showAsAction="never" />
     <item
         android:id="@+id/action_settings"
         android:title="@string/label_settings"
-- 
GitLab