From 0eb72a68d3b067eb316cc67e232faa89057f2107 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 20 Feb 2016 23:57:27 +0100
Subject: [PATCH] Added Buffer Status to the drawer

---
 .../libquassel/localtypes/BacklogFilter.java  |  1 +
 .../syncables/types/impl/BufferSyncer.java    | 21 ++++--
 .../types/interfaces/QBufferSyncer.java       |  4 +-
 .../quasseldroid_ng/ui/ViewIntBinder.java     | 71 +++++++++++++++++++
 .../ui/chat/drawer/BufferViewHolder.java      | 22 ++++++
 5 files changed, 113 insertions(+), 6 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java

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 340eedadb..c5e2b7ac1 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
@@ -138,6 +138,7 @@ public class BacklogFilter implements UICallback {
 
     public void onEventMainThread(@NonNull MessageInsertEvent event) {
         filtered.add(event.msg);
+        client.bufferSyncer().addActivity(event.msg);
     }
 
     public void onEventMainThread(@NonNull MessageRemoveEvent event) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
index 962f1c4f3..f7e1a99fe 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
@@ -21,8 +21,10 @@
 
 package de.kuschku.libquassel.syncables.types.impl;
 
+import android.databinding.ObservableInt;
 import android.support.annotation.NonNull;
 import android.util.Log;
+import android.util.SparseArray;
 import android.util.SparseIntArray;
 
 import java.util.Map;
@@ -42,7 +44,7 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
     @NonNull
-    private final SparseIntArray activities = new SparseIntArray();
+    private final SparseArray<ObservableInt> activities = new SparseArray<>();
     @NonNull
     private SparseIntArray lastSeenMsgs = new SparseIntArray();
     @NonNull
@@ -199,25 +201,34 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
         _update();
     }
 
-    public int activity(int bufferid) {
+    public ObservableInt activity(int bufferid) {
         assertNotNull(activities);
+        ensureExistingActivity(bufferid);
 
-        return activities.get(bufferid, 0);
+        return activities.get(bufferid);
     }
 
     public void setActivity(int bufferid, int activity) {
         assertNotNull(activities);
+        ensureExistingActivity(bufferid);
 
-        activities.put(bufferid, activity);
+        activities.get(bufferid).set(activity);
+    }
+
+    private void ensureExistingActivity(int bufferid) {
+        if (activities.get(bufferid) == null)
+            activities.put(bufferid, new ObservableInt());
     }
 
     public void addActivity(int bufferid, int activity) {
         assertNotNull(activities);
+        ensureExistingActivity(bufferid);
 
-        activities.put(bufferid, activities.get(bufferid) | activity);
+        activities.get(bufferid).set(activities.get(bufferid).get() | activity);
     }
 
     public void addActivity(int bufferid, @NonNull Message.Type type) {
+        ensureExistingActivity(bufferid);
         addActivity(bufferid, type.value);
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java
index 7ed12656d..658f710d4 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.syncables.types.interfaces;
 
+import android.databinding.ObservableInt;
+
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.syncables.Synced;
 
@@ -95,7 +97,7 @@ public interface QBufferSyncer extends QObservable {
     void _markBufferAsRead(int buffer);
 
 
-    int activity(int bufferid);
+    ObservableInt activity(int bufferid);
 
     void setActivity(int bufferid, int activity);
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java
new file mode 100644
index 000000000..55771c399
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java
@@ -0,0 +1,71 @@
+/*
+ * QuasselDroid - Quassel client for Android
+ * Copyright (C) 2016 Janne Koschinski
+ * Copyright (C) 2016 Ken Børge Viktil
+ * Copyright (C) 2016 Magnus Fjell
+ * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.quasseldroid_ng.ui;
+
+import android.databinding.Observable;
+import android.databinding.ObservableInt;
+import android.view.View;
+import android.widget.TextView;
+
+import com.google.common.base.Function;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ViewIntBinder {
+    private final ObservableInt field;
+    private Set<Observable.OnPropertyChangedCallback> callbacks = new HashSet<>();
+
+    public ViewIntBinder(ObservableInt field) {
+        this.field = field;
+    }
+
+    public void bindBackgroundColor(View v, Function<Integer, Integer> mapper) {
+        v.setBackgroundColor(mapper.apply(field.get()));
+        Observable.OnPropertyChangedCallback callback = new Observable.OnPropertyChangedCallback() {
+            @Override
+            public void onPropertyChanged(Observable sender, int propertyId) {
+                v.setBackgroundColor(mapper.apply(field.get()));
+            }
+        };
+        callbacks.add(callback);
+        field.addOnPropertyChangedCallback(callback);
+    }
+
+    public void bindTextColor(TextView v, Function<Integer, Integer> mapper) {
+        v.setTextColor(mapper.apply(field.get()));
+        Observable.OnPropertyChangedCallback callback = new Observable.OnPropertyChangedCallback() {
+            @Override
+            public void onPropertyChanged(Observable sender, int propertyId) {
+                v.setTextColor(mapper.apply(field.get()));
+            }
+        };
+        callbacks.add(callback);
+        field.addOnPropertyChangedCallback(callback);
+    }
+
+    public void unbind() {
+        for (Observable.OnPropertyChangedCallback callback : callbacks) {
+            field.removeOnPropertyChangedCallback(callback);
+        }
+    }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java
index ac61dd2d5..8ec64bcd0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java
@@ -26,6 +26,7 @@ import android.databinding.ObservableField;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.StateListDrawable;
 import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.view.View;
 import android.widget.ImageView;
@@ -33,6 +34,7 @@ import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import com.bignerdranch.expandablerecyclerview.ViewHolder.ChildViewHolder;
+import com.google.common.base.Function;
 import com.mikepenz.materialize.util.UIUtils;
 
 import java.util.Locale;
@@ -43,10 +45,12 @@ import de.kuschku.libquassel.events.BufferChangeEvent;
 import de.kuschku.libquassel.localtypes.buffers.Buffer;
 import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
 import de.kuschku.libquassel.localtypes.buffers.QueryBuffer;
+import de.kuschku.libquassel.message.Message;
 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.quasseldroid_ng.R;
+import de.kuschku.quasseldroid_ng.ui.ViewIntBinder;
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 
 public class BufferViewHolder extends ChildViewHolder {
@@ -65,6 +69,7 @@ public class BufferViewHolder extends ChildViewHolder {
     private ObservableField<BufferInfo.BufferStatus> status;
     private Observable.OnPropertyChangedCallback callback;
     private AppContext context;
+    private ViewIntBinder viewIntBinder;
 
     private StateListDrawable background;
 
@@ -89,6 +94,9 @@ public class BufferViewHolder extends ChildViewHolder {
             status.removeOnPropertyChangedCallback(callback);
         status = buffer.getStatus();
         name.setText(buffer.getName());
+        if (viewIntBinder != null) viewIntBinder.unbind();
+        viewIntBinder = new ViewIntBinder(context.client().bufferSyncer().activity(buffer.getInfo().id()));
+        viewIntBinder.bindTextColor(name, colorFromActivityStatus(buffer));
         setDescription(context.deserializer().formatString(getDescription(buffer)));
         setBadge(0);
         itemView.setOnClickListener(v -> listener.onClick(buffer));
@@ -110,6 +118,20 @@ public class BufferViewHolder extends ChildViewHolder {
         setSelected();
     }
 
+    @NonNull
+    private Function<Integer, Integer> colorFromActivityStatus(Buffer buffer) {
+        return activities -> {
+            int filters = context.client().backlogManager().filter(buffer.getInfo().id()).getFilters();
+            activities = activities & ~filters;
+            if (0 != ((activities & Message.Type.Plain.value) | (activities & Message.Type.Notice.value) | (activities & Message.Type.Action.value)))
+                return context.themeUtil().res.colorTintMessage;
+            if (0 != activities)
+                return context.themeUtil().res.colorTintActivity;
+            else
+                return context.themeUtil().res.colorForeground;
+        };
+    }
+
     private void setSelected() {
         setSelected(context.client().backlogManager().open() == id);
     }
-- 
GitLab