package com.jakewharton.rxbinding2.support.design.widget;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.design.widget.NavigationView.OnNavigationItemSelectedListener;
import android.view.Menu;
import android.view.MenuItem;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.MainThreadDisposable;
import static com.jakewharton.rxbinding2.internal.Preconditions.checkMainThread;
final class NavigationViewItemSelectionsObservable extends Observable<MenuItem> {
private final NavigationView view;
NavigationViewItemSelectionsObservable(NavigationView view) {
this.view = view;
}
@Override protected void subscribeActual(Observer<? super MenuItem> observer) {
if (!checkMainThread(observer)) {
return;
}
Listener listener = new Listener(view, observer);
observer.onSubscribe(listener);
view.setNavigationItemSelectedListener(listener);
// Emit initial checked item, if one can be found.
Menu menu = view.getMenu();
for (int i = 0, count = menu.size(); i < count; i++) {
MenuItem item = menu.getItem(i);
if (item.isChecked()) {
observer.onNext(item);
break;
}
}
}
static final class Listener extends MainThreadDisposable
implements OnNavigationItemSelectedListener {
private final NavigationView navigationView;
private final Observer<? super MenuItem> observer;
Listener(NavigationView navigationView, Observer<? super MenuItem> observer) {
this.navigationView = navigationView;
this.observer = observer;
}
@Override public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (!isDisposed()) {
observer.onNext(item);
}
return true;
}
@Override protected void onDispose() {
navigationView.setNavigationItemSelectedListener(null);
}
}
}