blob: 9e7903059554446c3170bd3ed28018724674bc57 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.ui.modelutil;
import androidx.annotation.Nullable;
import org.chromium.base.ObserverList;
import java.util.Collection;
/**
* A base class for models maintaining a set of properties.
*
* @param <T> The type of the property key used for uniquely identifying properties.
*/
public abstract class PropertyObservable<T> {
/**
* An observer to be notified of changes to a {@link PropertyObservable}.
*
* @param <T> The type of the property key used for uniquely identifying properties.
*/
public interface PropertyObserver<T> {
/**
* Notifies that the given {@code property} of the observed {@code source} has changed.
* @param source The object whose property has changed
* @param propertyKey The key of the property that has changed.
*/
void onPropertyChanged(PropertyObservable<T> source, @Nullable T propertyKey);
}
private final ObserverList<PropertyObserver<T>> mObservers = new ObserverList<>();
/**
* @param observer An observer to be notified of changes to the model.
*/
public void addObserver(PropertyObserver<T> observer) {
mObservers.addObserver(observer);
}
/**
* @param observer The observer to remove.
*/
public void removeObserver(PropertyObserver<T> observer) {
mObservers.removeObserver(observer);
}
/**
* @return A collection of all properties of this model that have been set. The returned
* collection should not be modified.
*/
public abstract Collection<T> getAllSetProperties();
/**
* @return A collection of all properties of this model. The returned collection should not be
* modified.
*/
public abstract Collection<T> getAllProperties();
/**
* Notifies observers that the property identified by {@code propertyKey} has changed.
*
* @param propertyKey The key of the property that has changed.
*/
protected void notifyPropertyChanged(T propertyKey) {
for (PropertyObserver<T> observer : mObservers) {
observer.onPropertyChanged(this, propertyKey);
}
}
}