1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package android.databinding;
17 
18 import android.support.v4.util.ArrayMap;
19 
20 import java.util.Collection;
21 
22 public class ObservableArrayMap<K, V> extends ArrayMap<K, V> implements ObservableMap<K, V> {
23 
24     private transient MapChangeRegistry mListeners;
25 
26     @Override
addOnMapChangedCallback( OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener)27     public void addOnMapChangedCallback(
28             OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener) {
29         if (mListeners == null) {
30             mListeners = new MapChangeRegistry();
31         }
32         mListeners.add(listener);
33     }
34 
35     @Override
removeOnMapChangedCallback( OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener)36     public void removeOnMapChangedCallback(
37             OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> listener) {
38         if (mListeners != null) {
39             mListeners.remove(listener);
40         }
41     }
42 
43     @Override
clear()44     public void clear() {
45         boolean wasEmpty = isEmpty();
46         if (!wasEmpty) {
47             super.clear();
48             notifyChange(null);
49         }
50     }
51 
put(K k, V v)52     public V put(K k, V v) {
53         V val = super.put(k, v);
54         notifyChange(k);
55         return v;
56     }
57 
58     @Override
removeAll(Collection<?> collection)59     public boolean removeAll(Collection<?> collection) {
60         boolean removed = false;
61         for (Object key : collection) {
62             int index = indexOfKey(key);
63             if (index >= 0) {
64                 removed = true;
65                 removeAt(index);
66             }
67         }
68         return removed;
69     }
70 
71     @Override
retainAll(Collection<?> collection)72     public boolean retainAll(Collection<?> collection) {
73         boolean removed = false;
74         for (int i = size() - 1; i >= 0; i--) {
75             Object key = keyAt(i);
76             if (!collection.contains(key)) {
77                 removeAt(i);
78                 removed = true;
79             }
80         }
81         return removed;
82     }
83 
84     @Override
removeAt(int index)85     public V removeAt(int index) {
86         K key = keyAt(index);
87         V value = super.removeAt(index);
88         if (value != null) {
89             notifyChange(key);
90         }
91         return value;
92     }
93 
94     @Override
setValueAt(int index, V value)95     public V setValueAt(int index, V value) {
96         K key = keyAt(index);
97         V oldValue = super.setValueAt(index, value);
98         notifyChange(key);
99         return oldValue;
100     }
101 
notifyChange(Object key)102     private void notifyChange(Object key) {
103         if (mListeners != null) {
104             mListeners.notifyCallbacks(this, 0, key);
105         }
106     }
107 }
108