aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/app/src/main/java/com/wireguard/android/ObservableTreeMap.java
diff options
context:
space:
mode:
authorSamuel Holland <samuel@sholland.org>2017-08-17 02:40:05 -0500
committerSamuel Holland <samuel@sholland.org>2017-08-17 02:40:05 -0500
commit97149fff3f867e25103c632138468010cc804811 (patch)
tree287ffce3cf8dcfe09a824720bc3dca699b62672b /app/src/main/java/com/wireguard/android/ObservableTreeMap.java
parentpreferences: Control restoring enabled configs (diff)
downloadwireguard-android-97149fff3f867e25103c632138468010cc804811.tar.xz
wireguard-android-97149fff3f867e25103c632138468010cc804811.zip
ObservableMapAdapter: Based on an observable TreeMap
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r--app/src/main/java/com/wireguard/android/ObservableTreeMap.java67
1 files changed, 67 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/ObservableTreeMap.java b/app/src/main/java/com/wireguard/android/ObservableTreeMap.java
new file mode 100644
index 00000000..b0444d66
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/ObservableTreeMap.java
@@ -0,0 +1,67 @@
+package com.wireguard.android;
+
+import android.databinding.MapChangeRegistry;
+import android.databinding.ObservableMap;
+import android.support.annotation.NonNull;
+
+import java.util.Iterator;
+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);
+ }
+}