package com.jakewharton.rxbinding2.widget; import android.support.annotation.Nullable; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import com.jakewharton.rxbinding2.InitialValueObservable; import io.reactivex.Observer; import io.reactivex.android.MainThreadDisposable; import static com.jakewharton.rxbinding2.internal.Preconditions.checkMainThread; final class SeekBarChangeObservable extends InitialValueObservable<Integer> { private final SeekBar view; @Nullable private final Boolean shouldBeFromUser; SeekBarChangeObservable(SeekBar view, @Nullable Boolean shouldBeFromUser) { this.view = view; this.shouldBeFromUser = shouldBeFromUser; } @Override protected void subscribeListener(Observer<? super Integer> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, shouldBeFromUser, observer); view.setOnSeekBarChangeListener(listener); observer.onSubscribe(listener); } @Override protected Integer getInitialValue() { return view.getProgress(); } static final class Listener extends MainThreadDisposable implements OnSeekBarChangeListener { private final SeekBar view; private final Boolean shouldBeFromUser; private final Observer<? super Integer> observer; Listener(SeekBar view, Boolean shouldBeFromUser, Observer<? super Integer> observer) { this.view = view; this.shouldBeFromUser = shouldBeFromUser; this.observer = observer; } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (!isDisposed() && (shouldBeFromUser == null || shouldBeFromUser == fromUser)) { observer.onNext(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override protected void onDispose() { view.setOnSeekBarChangeListener(this); } } }