summaryrefslogtreecommitdiffhomepage
path: root/app/src/main/java/com/wireguard/android/bindings/ObservableTreeMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/com/wireguard/android/bindings/ObservableTreeMap.java')
-rw-r--r--app/src/main/java/com/wireguard/android/bindings/ObservableTreeMap.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/bindings/ObservableTreeMap.java b/app/src/main/java/com/wireguard/android/bindings/ObservableTreeMap.java
new file mode 100644
index 00000000..34fcab61
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/bindings/ObservableTreeMap.java
@@ -0,0 +1,66 @@
+package com.wireguard.android.bindings;
+
+import android.databinding.MapChangeRegistry;
+import android.databinding.ObservableMap;
+import android.support.annotation.NonNull;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Observable version of a TreeMap. Only notifies for changes made through methods, not iterators or
+ * views. This behavior is in line with that of ObservableArrayMap.
+ */
+
+public class ObservableTreeMap<K, V> extends TreeMap<K, V> implements ObservableSortedMap<K, V> {
+ private transient MapChangeRegistry listeners;
+
+ @Override
+ public void clear() {
+ super.clear();
+ notifyChange(null);
+ }
+
+ @Override
+ public void addOnMapChangedCallback(
+ final OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener) {
+ if (listeners == null)
+ listeners = new MapChangeRegistry();
+ listeners.add(listener);
+ }
+
+ private void notifyChange(final K key) {
+ if (listeners != null)
+ listeners.notifyChange(this, key);
+ }
+
+ @Override
+ public V put(final K key, final V value) {
+ final V oldValue = super.put(key, value);
+ notifyChange(key);
+ return oldValue;
+ }
+
+ @Override
+ public void putAll(@NonNull final Map<? extends K, ? extends V> map) {
+ super.putAll(map);
+ for (final K key : map.keySet())
+ notifyChange(key);
+ }
+
+ @Override
+ public V remove(final Object key) {
+ final V oldValue = super.remove(key);
+ @SuppressWarnings("unchecked")
+ final K k = (K) key;
+ notifyChange(k);
+ return oldValue;
+ }
+
+ @Override
+ public void removeOnMapChangedCallback(
+ final OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener) {
+ if (listeners != null)
+ listeners.remove(listener);
+ }
+}