diff options
| author | 2017-12-26 14:12:37 -0600 | |
|---|---|---|
| committer | 2018-01-06 04:08:01 -0600 | |
| commit | b7196e328a25a28078906d8afa50ba9636ae7bcb (patch) | |
| tree | b7fa6a415b72fad6eacc27abaa500880850e03ff /app/src/main/java/com/wireguard/android/databinding/ObservableTreeMap.java | |
| parent | app: Enable Java 8 features (diff) | |
| download | wireguard-android-b7196e328a25a28078906d8afa50ba9636ae7bcb.tar.xz wireguard-android-b7196e328a25a28078906d8afa50ba9636ae7bcb.zip | |
Rename package bindings -> databinding
Signed-off-by: Samuel Holland <samuel@sholland.org>
Diffstat (limited to 'app/src/main/java/com/wireguard/android/databinding/ObservableTreeMap.java')
| -rw-r--r-- | app/src/main/java/com/wireguard/android/databinding/ObservableTreeMap.java | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/databinding/ObservableTreeMap.java b/app/src/main/java/com/wireguard/android/databinding/ObservableTreeMap.java new file mode 100644 index 00000000..dc5f705b --- /dev/null +++ b/app/src/main/java/com/wireguard/android/databinding/ObservableTreeMap.java @@ -0,0 +1,66 @@ +package com.wireguard.android.databinding; + +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); + } +} |
