15cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount/*
25cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * Copyright (C) 2015 The Android Open Source Project
35cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *
45cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
55cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * you may not use this file except in compliance with the License.
65cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * You may obtain a copy of the License at
75cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *
85cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
95cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *
105cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * Unless required by applicable law or agreed to in writing, software
115cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
125cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * See the License for the specific language governing permissions and
145cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * limitations under the License.
155cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount */
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding;
175cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount
185cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mountimport java.util.Map;
195cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount
20722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount/**
21722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * A {@link Map} that notifies when items change. This kind of Map may be data bound
22722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * and have the UI update as the map changes.
23722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * <p>
24722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * Implementers must call {@link OnMapChangedCallback#onMapChanged(ObservableMap, Object)} whenever
25722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * an item is added, changed, or removed.
26722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * <p>
27722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * ObservableArrayMap is a convenient implementation of ObservableMap.
28722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * MapChangeRegistry may help other implementations manage the callbacks.
29722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * @see Observable
30722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * @see ObservableList
31722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount */
325cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mountpublic interface ObservableMap<K, V> extends Map<K, V> {
33722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
34722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    /**
35722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * Adds a callback to listen for changes to the ObservableMap.
36722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * @param callback The callback to start listening for events.
37722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     */
38722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    void addOnMapChangedCallback(
39722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> callback);
40722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
41722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    /**
42722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * Removes a previously added callback.
43722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * @param callback The callback that no longer needs to be notified of map changes.
44722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     */
45722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    void removeOnMapChangedCallback(
46722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            OnMapChangedCallback<? extends ObservableMap<K, V>, K, V> callback);
47722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
48722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    /**
49722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * A callback receiving notifications when an ObservableMap changes.
50722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     */
51722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    abstract class OnMapChangedCallback<T extends ObservableMap<K, V>, K, V> {
52722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
53722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        /**
54722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * Called whenever an ObservableMap changes, including values inserted, deleted,
55722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * and changed.
56722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param sender The changing map.
57722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param key The key of the value inserted, removed, or changed.
58722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         */
59722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public abstract void onMapChanged(T sender, K key);
60722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    }
615cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount}
62