package com.jakewharton.rxbinding2.support.v7.widget;
import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.AdapterDataObserver;
import android.support.v7.widget.RecyclerView.ViewHolder;
import com.jakewharton.rxbinding2.InitialValueObservable;
import io.reactivex.Observer;
import io.reactivex.android.MainThreadDisposable;
import static com.jakewharton.rxbinding2.internal.Preconditions.checkMainThread;
final class RecyclerAdapterDataChangeObservable<T extends Adapter<? extends ViewHolder>>
extends InitialValueObservable<T> {
private final T adapter;
RecyclerAdapterDataChangeObservable(T adapter) {
this.adapter = adapter;
}
@Override protected void subscribeListener(Observer<? super T> observer) {
if (!checkMainThread(observer)) {
return;
}
Listener listener = new Listener(adapter, observer);
observer.onSubscribe(listener);
adapter.registerAdapterDataObserver(listener.dataObserver);
}
@Override protected T getInitialValue() {
return adapter;
}
final class Listener extends MainThreadDisposable {
private final T recyclerAdapter;
final AdapterDataObserver dataObserver;
Listener(final T recyclerAdapter, final Observer<? super T> observer) {
this.recyclerAdapter = recyclerAdapter;
this.dataObserver = new AdapterDataObserver() {
@Override public void onChanged() {
if (!isDisposed()) {
observer.onNext(recyclerAdapter);
}
}
};
}
@Override protected void onDispose() {
recyclerAdapter.unregisterAdapterDataObserver(dataObserver);
}
}
}