package droidkit.util; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * @author Daniel Serdyukov */ public class Observable<T> { private final List<Observer<T>> mObservers; private Observable(@NonNull List<Observer<T>> observers) { mObservers = observers; } @NonNull public static <T> Observable<T> create() { return new Observable<>(new ArrayList<Observer<T>>()); } @NonNull public static <T> Observable<T> createThreadSafe() { return new Observable<>(new CopyOnWriteArrayList<Observer<T>>()); } public boolean registerObserver(@NonNull Observer<T> observer) { return !mObservers.contains(observer) && mObservers.add(observer); } public boolean unregisterObserver(@NonNull Observer<T> observer) { return mObservers.remove(observer); } public void unregisterAllObservers() { mObservers.clear(); } public void notifyChange(@Nullable T data) { for (final Observer<T> observer : mObservers) { observer.onChange(this, data); } } }