package com.jakewharton.rxbinding2.support.design.widget; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; import android.support.design.widget.BottomNavigationView.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 BottomNavigationViewItemSelectionsObservable extends Observable<MenuItem> { private final BottomNavigationView view; BottomNavigationViewItemSelectionsObservable(BottomNavigationView 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.setOnNavigationItemSelectedListener(listener); // Emit initial 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 BottomNavigationView bottomNavigationView; private final Observer<? super MenuItem> observer; Listener(BottomNavigationView bottomNavigationView, Observer<? super MenuItem> observer) { this.bottomNavigationView = bottomNavigationView; this.observer = observer; } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { if (!isDisposed()) { observer.onNext(item); } return true; } @Override protected void onDispose() { bottomNavigationView.setOnNavigationItemSelectedListener(null); } } }