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