Full Code of JakeWharton/RxBinding for AI

master 78f7ebdeb9dc cached
235 files
367.0 KB
96.2k tokens
336 symbols
1 requests
Download .txt
Showing preview only (439K chars total). Download the full file or copy to clipboard to get everything.
Repository: JakeWharton/RxBinding
Branch: master
Commit: 78f7ebdeb9dc
Files: 235
Total size: 367.0 KB

Directory structure:
gitextract_m_pj7wzf/

├── .github/
│   └── workflows/
│       └── build.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── RELEASING.md
├── build.gradle
├── gradle/
│   ├── gradle-mvn-push.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── rxbinding/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── jakewharton/
│       │   │           └── rxbinding4/
│       │   │               ├── internal/
│       │   │               │   └── MainThreadKtTest.java
│       │   │               ├── view/
│       │   │               │   ├── RxMenuItemTest.java
│       │   │               │   ├── RxViewAttachTest.java
│       │   │               │   ├── RxViewAttachTestActivity.java
│       │   │               │   ├── RxViewGroupTest.java
│       │   │               │   ├── RxViewSystemUiVisibilityTest.java
│       │   │               │   ├── RxViewSystemUiVisibilityTestActivity.java
│       │   │               │   └── RxViewTest.java
│       │   │               └── widget/
│       │   │                   ├── RxAbsListViewTest.java
│       │   │                   ├── RxAbsListViewTestActivity.java
│       │   │                   ├── RxAdapterTest.java
│       │   │                   ├── RxAdapterViewTest.java
│       │   │                   ├── RxAdapterViewTestActivity.java
│       │   │                   ├── RxAutoCompleteTextViewTest.java
│       │   │                   ├── RxAutoCompleteTextViewTestActivity.java
│       │   │                   ├── RxCompoundButtonTest.java
│       │   │                   ├── RxPopupMenuTest.java
│       │   │                   ├── RxPopupMenuTestActivity.java
│       │   │                   ├── RxRadioGroupTest.java
│       │   │                   ├── RxRatingBarTest.java
│       │   │                   ├── RxRatingBarTestActivity.java
│       │   │                   ├── RxSearchViewTest.java
│       │   │                   ├── RxSearchViewTestActivity.java
│       │   │                   ├── RxSeekBarTest.java
│       │   │                   ├── RxSeekBarTestActivity.java
│       │   │                   ├── RxTextViewTest.java
│       │   │                   ├── RxToolbarTest.java
│       │   │                   └── RxToolbarTestActivity.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   └── icon.xml
│       │       └── values/
│       │           ├── ids.xml
│       │           └── strings.xml
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           ├── InitialValueObservable.kt
│                           ├── internal/
│                           │   ├── mainThread.kt
│                           │   └── true.kt
│                           ├── view/
│                           │   ├── MenuItemActionViewEvent.kt
│                           │   ├── MenuItemActionViewEventObservable.kt
│                           │   ├── MenuItemClickObservable.kt
│                           │   ├── ViewAttachEvent.kt
│                           │   ├── ViewAttachEventObservable.kt
│                           │   ├── ViewAttachesObservable.kt
│                           │   ├── ViewClickObservable.kt
│                           │   ├── ViewDragObservable.kt
│                           │   ├── ViewFocusChangeObservable.kt
│                           │   ├── ViewGroupHierarchyChangeEvent.kt
│                           │   ├── ViewGroupHierarchyChangeEventObservable.kt
│                           │   ├── ViewHoverObservable.kt
│                           │   ├── ViewKeyObservable.kt
│                           │   ├── ViewLayoutChangeEventObservable.kt
│                           │   ├── ViewLayoutChangeObservable.kt
│                           │   ├── ViewLongClickObservable.kt
│                           │   ├── ViewScrollChangeEventObservable.kt
│                           │   ├── ViewSystemUiVisibilityChangeObservable.kt
│                           │   ├── ViewTouchObservable.kt
│                           │   ├── ViewTreeObserverDrawObservable.kt
│                           │   ├── ViewTreeObserverGlobalLayoutObservable.kt
│                           │   ├── ViewTreeObserverPreDrawObservable.kt
│                           │   └── ViewVisibilityConsumer.kt
│                           └── widget/
│                               ├── AbsListViewScrollEventObservable.kt
│                               ├── AdapterDataChangeObservable.kt
│                               ├── AdapterViewItemClickEventObservable.kt
│                               ├── AdapterViewItemClickObservable.kt
│                               ├── AdapterViewItemLongClickEventObservable.kt
│                               ├── AdapterViewItemLongClickObservable.kt
│                               ├── AdapterViewItemSelectionObservable.kt
│                               ├── AdapterViewSelectionEvent.kt
│                               ├── AdapterViewSelectionObservable.kt
│                               ├── AutoCompleteTextViewItemClickEventObservable.kt
│                               ├── CompoundButtonCheckedChangeObservable.kt
│                               ├── PopupMenuDismissObservable.kt
│                               ├── PopupMenuItemClickObservable.kt
│                               ├── RadioGroupCheckedChangeObservable.kt
│                               ├── RadioGroupToggleCheckedConsumer.kt
│                               ├── RatingBarRatingChangeEventObservable.kt
│                               ├── RatingBarRatingChangeObservable.kt
│                               ├── SearchViewQueryConsumer.kt
│                               ├── SearchViewQueryTextChangeEventsObservable.kt
│                               ├── SearchViewQueryTextChangesObservable.kt
│                               ├── SearchViewQueryTextEvent.kt
│                               ├── SeekBarChangeEvent.kt
│                               ├── SeekBarChangeEventObservable.kt
│                               ├── SeekBarChangeObservable.kt
│                               ├── TextViewAfterTextChangeEventObservable.kt
│                               ├── TextViewBeforeTextChangeEventObservable.kt
│                               ├── TextViewEditorActionEventObservable.kt
│                               ├── TextViewEditorActionObservable.kt
│                               ├── TextViewTextChangeEventObservable.kt
│                               ├── TextViewTextChangesObservable.kt
│                               ├── ToolbarItemClickObservable.kt
│                               └── ToolbarNavigationClickObservable.kt
├── rxbinding-appcompat/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── appcompat/
│       │                       ├── RxActionMenuViewTest.java
│       │                       ├── RxPopupMenuTest.java
│       │                       ├── RxPopupMenuTestActivity.java
│       │                       ├── RxSearchViewTest.java
│       │                       ├── RxSearchViewTestActivity.java
│       │                       ├── RxToolbarTest.java
│       │                       └── RxToolbarTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── appcompat/
│                               ├── ActionMenuViewItemClickObservable.kt
│                               ├── PopupMenuDismissObservable.kt
│                               ├── PopupMenuItemClickObservable.kt
│                               ├── SearchViewQueryTextChangeEventsObservable.kt
│                               ├── SearchViewQueryTextChangesObservable.kt
│                               ├── SearchViewQueryTextEvent.kt
│                               ├── SearchViewSetQueryConsumer.kt
│                               ├── ToolbarItemClickObservable.kt
│                               └── ToolbarNavigationClickObservable.kt
├── rxbinding-core/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── core/
│       │                       ├── RxNestedScrollViewTest.java
│       │                       └── RxNestedScrollViewTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── core/
│                               └── NestedScrollViewScrollChangeEventObservable.kt
├── rxbinding-drawerlayout/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── drawerlayout/
│       │                       ├── RxDrawerLayoutTest.java
│       │                       └── RxDrawerLayoutTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── drawerlayout/
│                               ├── DrawerLayoutDrawerOpenedObservable.kt
│                               └── DrawerLayoutOpenConsumer.kt
├── rxbinding-leanback/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── leanback/
│       │                       ├── RxSearchBarTest.java
│       │                       ├── RxSearchBarTestActivity.java
│       │                       ├── RxSearchEditTextTest.java
│       │                       └── RxSearchEditTextTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── leanback/
│                               ├── SearchBarSearchQueryChangeEventsObservable.kt
│                               ├── SearchBarSearchQueryChangesObservable.kt
│                               ├── SearchBarSearchQueryEvent.kt
│                               └── SearchEditTextKeyboardDismissObservable.kt
├── rxbinding-material/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── jakewharton/
│       │   │           └── rxbinding4/
│       │   │               └── material/
│       │   │                   ├── RxAppBarLayoutTest.java
│       │   │                   ├── RxBottomNavigationViewTest.java
│       │   │                   ├── RxChipTest.kt
│       │   │                   ├── RxFloatingActionButtonTest.java
│       │   │                   ├── RxNavigationViewTest.java
│       │   │                   ├── RxSnackbarTest.java
│       │   │                   ├── RxSwipeDismissBehaviorTest.java
│       │   │                   ├── RxSwipeDismissBehaviorTestActivity.java
│       │   │                   └── RxTabLayoutTest.java
│       │   └── res/
│       │       ├── menu/
│       │       │   └── menu.xml
│       │       └── values/
│       │           └── strings.xml
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── material/
│                               ├── AppBarLayoutOffsetChangeObservable.kt
│                               ├── BottomNavigationViewItemSelectionsObservable.kt
│                               ├── ChipCloseIconClicksObservable.kt
│                               ├── FloatingActionButtonVisibilityConsumer.kt
│                               ├── NavigationViewItemSelectionsObservable.kt
│                               ├── SnackbarDismissesObservable.kt
│                               ├── SwipeDismissBehaviorObservable.kt
│                               ├── TabLayoutSelectConsumer.kt
│                               ├── TabLayoutSelectionEvent.kt
│                               ├── TabLayoutSelectionEventObservable.kt
│                               └── TabLayoutSelectionsObservable.kt
├── rxbinding-recyclerview/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── recyclerview/
│       │                       ├── RxRecyclerViewAdapterTest.java
│       │                       ├── RxRecyclerViewTest.java
│       │                       └── RxRecyclerViewTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── recyclerview/
│                               ├── RecyclerAdapterDataChangeObservable.kt
│                               ├── RecyclerViewChildAttachStateChangeEventObservable.kt
│                               ├── RecyclerViewChildAttachStateChangeEvents.kt
│                               ├── RecyclerViewFlingEventObservable.kt
│                               ├── RecyclerViewScrollEventObservable.kt
│                               └── RecyclerViewScrollStateChangeObservable.kt
├── rxbinding-slidingpanelayout/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── slidingpanelayout/
│       │                       ├── RxSlidingPaneLayoutTest.java
│       │                       └── RxSlidingPaneLayoutTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── slidingpanelayout/
│                               ├── SlidingPaneLayoutOpenConsumer.kt
│                               ├── SlidingPaneLayoutPaneOpenedObservable.kt
│                               └── SlidingPaneLayoutSlideObservable.kt
├── rxbinding-swiperefreshlayout/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── jakewharton/
│       │   │           └── rxbinding4/
│       │   │               └── swiperefreshlayout/
│       │   │                   ├── RxSwipeRefreshLayoutTest.java
│       │   │                   └── RxSwipeRefreshLayoutTestActivity.java
│       │   └── res/
│       │       └── values/
│       │           └── ids.xml
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── swiperefreshlayout/
│                               └── SwipeRefreshLayoutRefreshObservable.kt
├── rxbinding-viewpager/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── viewpager/
│       │                       ├── RxViewPagerTest.java
│       │                       └── RxViewPagerTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── viewpager/
│                               ├── ViewPagerPageScrollStateChangedObservable.kt
│                               ├── ViewPagerPageScrolledObservable.kt
│                               └── ViewPagerPageSelectedObservable.kt
├── rxbinding-viewpager2/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── viewpager2/
│       │                       ├── RxViewPager2Test.kt
│       │                       └── RxViewPager2TestActivity.kt
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── viewpager2/
│                               ├── PageScrollStateChangedObservable.kt
│                               ├── PageScrolledObservable.kt
│                               └── PageSelectedObservable.kt
├── settings.gradle
└── testing-utils/
    ├── build.gradle
    └── src/
        └── main/
            ├── AndroidManifest.xml
            └── java/
                └── com/
                    └── jakewharton/
                        └── rxbinding4/
                            ├── MotionEventUtil.java
                            ├── RecordingObserver.java
                            ├── RxBindingTestRunner.java
                            ├── TouchUtilsBackport.java
                            ├── UnsafeRunnable.java
                            └── ViewDirtyIdlingResource.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/build.yml
================================================
name: build

on: [push, pull_request]

env:
  GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false -Dkotlin.incremental=false"

jobs:
  test:
    runs-on: macos-latest

    strategy:
      fail-fast: false
      matrix:
        module:
          - rxbinding
          - rxbinding-appcompat
          - rxbinding-core
          - rxbinding-drawerlayout
          - rxbinding-leanback
          - rxbinding-material
          - rxbinding-recyclerview
          - rxbinding-slidingpanelayout
          - rxbinding-swiperefreshlayout
          - rxbinding-viewpager
          - rxbinding-viewpager2

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Validate Gradle Wrapper
        uses: gradle/wrapper-validation-action@v1

      - uses: actions/cache@v1
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-${{ hashFiles('**/build.gradle') }}-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Run Tests
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: 18
          script: ./gradlew ${{ matrix.module }}:connectedCheck --stacktrace

  publish:
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/master'
    needs: test

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Configure JDK
        uses: actions/setup-java@v1
        with:
          java-version: 14

      - name: Upload Artifacts
        run: ./gradlew uploadArchives
        env:
          ORG_GRADLE_PROJECT_SONATYPE_NEXUS_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }}
          ORG_GRADLE_PROJECT_SONATYPE_NEXUS_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }}


================================================
FILE: .gitignore
================================================
# IntelliJ IDEA
.idea
*.iml
annotations

# Gradle
.gradle
gradlew.bat
build
local.properties
reports
jacoco.exec

.DS_Store



================================================
FILE: CHANGELOG.md
================================================
Change Log
==========

Version 4.0.0 *(2020-05-19)*
----------------------------

This version updates to support RxJava 3. No functional changes.

The groupId and package name are now `com.jakewharton.rxbinding4`.


Version 3.1.0 *(2019-11-22)*
----------------------------

 * New bindings!
    * `rxbinding-viewpager2`:
       * `ViewPager2`:
          * `pageSelections`
          * `pageScrollEvents`
          * `pageScrollStateChanges`


Version 3.0.0 *(2019-07-23)*
----------------------------

 * New: Maven coordinates are now `com.jakewharton.rxbinding3:rxbinding` (et al). Package name is now
   `com.jakewharton.rxbinding3.*`.
 * New: AndroidX support! The library is now AndroidX-only. For use with the old support libraries use version 2.2.0.
 * New: Library is now Kotlin-first and `-kotlin` artifacts are gone. Java callers get the same API as before. Kotlin
   callers get the extension-based API. Event classes are now Kotlin `data` classes instead of using AutoValue. RxJava's
   `Predicate` and Java's `Callable` are no longer used and are replaced by Kotlin functional types. For Java callers
   these can still be used as `Function1` but the use of lambdas is encouraged.
 * New: Observables which signal an event without any information use `Unit` instead of `Object`. (Note: This was
   always true for Kotlin extension users)
 * All deprecated methods have been removed.
 * Some trivial consumer factories have been removed. You can subscribe lambdas to the stream to replicate their functionality.

Changes from 3.0.0-alpha2:

 * Fix: Correct binary compatibility with Material Design Components v1.1.0.


Version 3.0.0-alpha2 *(2018-12-18)*
-----------------------------------

 * Fix: Correct nullability of adapter view callback's clicked view.


Version 3.0.0-alpha1 *(2018-10-17)*
-----------------------------------

 * New: Maven coordinates are now `com.jakewharton.rxbinding3:rxbinding` (et al). Package name is now
   `com.jakewharton.rxbinding3.*`.
 * New: AndroidX support! The library is now AndroidX-only. For use with the old support libraries use version 2.2.0.
 * New: Library is now Kotlin-first and `-kotlin` artifacts are gone. Java callers get the same API as before. Kotlin
   callers get the extension-based API. Event classes are now Kotlin `data` classes instead of using AutoValue. RxJava's
   `Predicate` and Java's `Callable` are no longer used and are replaced by Kotlin functional types. For Java callers
   these can still be used as `Function1` but the use of lambdas is encouraged.
 * New: Observables which signal an event without any information use `Unit` instead of `Object`. (Note: This was
   always true for Kotlin extension users)
 * All deprecated methods have been removed.
 * Some trivial consumer factories have been removed. You can subscribe lambdas to the stream to replicate their functionality.


Version 2.2.0 *(2018-09-25)*
----------------------------

 * New bindings!
    * `rxbinding-support-v4`:
       * `ViewPager`:
          * `pageScrollEvents`
    * `rxbinding-recyclerview-v7`:
       * `RecyclerView`:
          * `flingEvents`
 * New: Target Java 8 bytecode. Use AGP 3.2 or newer and enable Java 8 source/target compatibility.
 * Deprecate `RxMenuItemCompat` which is no longer needed. Use `RxMenuItem` directly.
 * Deprecate more simple consumers which delegate directly to a method. You should use method references for these instead. For example, `RxView.enabled(view)` becomes `view::setEnabled`.


Version 2.1.1 *(2018-02-12)*
----------------------------

 * Fix: Include consumer ProGuard rules to prevent warning about AutoValue annotation.
 * Fix: Useless `BuildConfig` classes are no longer included.
 * Fix: Eliminate Java interop checks for Kotlin extensions as they're only for Kotlin consumers and the checks exist in the Java code they delegate to anyway.


Version 2.1.0 *(2018-01-30)*
----------------------------

 * New bindings!
    * `rxbinding-design`:
       * `FloatingActionButton`:
          * `visibility`: Shows or hides FAB.
 * Use add/remove callback for Snackbar dismisses.
 * Deprecate simple consumers which delegate directly to a method. You should use method references for these instead. For example, `RxView.enabled(view)` becomes `view::setEnabled`.
 * Fix: Propagate `@RequiresApi` annotations to Kotlin extensions.


Version 2.0.0 *(2017-03-06)*
----------------------------

This version only supports RxJava 2.

 * New: Maven coordinates are now `com.jakewharton.rxbinding2:rxbinding` (et al). Package name is now
   `com.jakewharton.rxbinding2.*`.
 * New: Bindings which emit an initial value now return an `InitialValueObservable<T>` which offers a
   type-safe way to skip that value via `skipInitialValue()`.
 * Event objects which previously contained an enum now use an abstract event type and subclasses for
   easier filtering using the `ofType(Class)` operator.
 * Bindings which previously emitted null using the `Void` type now use `Object` and omit an opaque
   item instance for which no guarantees are provided. You can neither rely on the emitted instance
   being the same, equal, nor different for subsequent events.


Version 1.0.1 *(2017-02-28)*
----------------------------

 * Fix: Reduce method count cost for Kotlin modules.


Version 1.0.0 *(2016-12-01)*
----------------------------

 * New bindings!
    * `rxbinding`:
       * `Toolbar`:
          * `title` - Toolbar title.
          * `titleRes` - Toolbar title from resource.
          * `subtitle` - Toolbar subtitle.
          * `subtitleRes` - Toolbar subtitle from resource.
       * `View`:
          * `keys` - View key events.
    * `rxbinding-appcompat-v7`:
       * `Toolbar`:
          * `title` - Toolbar title.
          * `titleRes` - Toolbar title from resource.
          * `subtitle` - Toolbar subtitle.
          * `subtitleRes` - Toolbar subtitle from resource.
    * `rxbinding-design`:
       * `BottomNavigationView`:
          * `itemSelections` - Navigation item selections.
    * `rxbinding-support-v4`:
       * `NestedScrollView`:
          * `scrollChangeEvents` - Nested scrolling change events.
       * `SlidingPaneLayout`:
          * `open` - Opens the panel.
          * `panelOpens` - Sliding panel opens.
          * `panelSlides` - Sliding panel open offsets.
       * `ViewPager`:
          * `pageScrollStateChanges` - Page scrolling change events.
          * `currentItem` - Sets the current page item.
 * New: `rxbinding-support-v4` now only depends on `support-core-ui`.
 * Fix: Kotlin `Action` generic types now properly allow nulls when applicable.
 * Fix: Correct nullability of `TextViewAfterTextChangeEvent`'s `editable` property.
 * Fix: Correct nullability of `TextViewEditorActionEvent`'s `keyEvent` property.


Version 0.4.0 *(2016-02-18)*
----------------------------

 * New bindings!
    * `rxbinding`:
       * `RxAbsListView`:
          * `scrollEvents` - List scroll events.
       * `RxAutoCompleteTextView`:
          * `completionHint` - Sets the hint text at the bottom of the suggestion list.
          * `threshold` - Sets the minimum number of characters before suggestions are shown.
       * `RxPopupMenu`:
          * `itemClicks` - Menu item clicks.
          * `dismisses` - Menu item dismissal.
    * `rxbinding-appcompat-v7`:
       * `RxActionMenuView`:
          * `itemClicks` - Menu item clicks.
       * `RxPopupMenu`:
          * `itemClicks` - Menu item clicks.
          * `dismisses` - Menu item dismissal.
    * `rxbinding-design`:
       * `RxTextInputLayout`:
          * `error` - Sets the error text for the text input.
          * `errorRes` - Sets the error text resource for the text input.
    * `rxbinding-support-v4`:
       * `RxMenuItemCompat`:
          * `actionViewEvents`- Menu item action view events.
 * Update Kotlin modules dependency to v1.0.0.
 * Fix: Remove 76 needless synthetic accessor methods.


Version 0.3.0 *(2015-10-22)*
----------------------------

 * New modules!
    * `rxbinding-leanback-v17` (and `rxbinding-leanback-v17-kotlin`) for the 'Leanback Support Library':
       * `RxSearchBar`:
          * `searchQuery` - Sets the query text.
          * `searchQueryChanges` - Query text changes.
          * `searchQueryChangeEvents` - Query text change events.
       * `RxSearchEditText`:
          * `keyboardDismisses` - Keyboard dismisses.
 * New bindings!
    * `rxbinding`:
       * `RxAutoCompleteTextView`:
          * `itemClickEvents` - Suggestion item clicks.
       * `RxCheckedTextView`:
          * `checked` - Sets the checked state.
       * `RxMenuItem`:
          * `actionViewEvents` - Action view expand and collapse events.
          * `checked` - Sets the checked state.
          * `clicks` - Item clicks.
          * `enabled` - Sets the enabled state.
          * `icon` - Sets the icon.
          * `iconRes` - Sets the icon using a resource.
          * `title` - Sets the title.
          * `titleRes` - Sets the title using a resources.
          * `visible` - Sets the visible state.
       * `RxSeekBar`:
          * `userChanges` - Only user value changes.
          * `systemChanges` - Only system value changes.
       * `RxTextView`:
          * `afterTextChangeEvents` - After text change events.
          * `beforeTextChangeEvents` - Before text change events.
          * `color` - Sets the text color.
          * `error` - Sets the error text.
          * `errorRes` - Sets the error text using a resource.
          * `hint` - Sets the hint text.
          * `hintRes` - Sets the hint text using a resource.
       * `RxToolbar`:
          * `navigationClicks` - Clicks on the navigation view.
       * `RxView`:
          * `draws` - ViewTreeObserver draw events.
          * `globalLayouts` - ViewTreeObserver global layout events.
          * `hovers` - View hover `MotionEvent`.
          * `hoverEvents` - View hover `MotionEvent` events.
          * `layoutChanges` - ViewTreeObserver layout changes.
          * `layoutChangeEvents` - ViewTreeObserver layout change events.
          * `preDraws` - ViewTreeObserver pre-draw events.
          * `scrollChangeEvents` - Scroll offset change events.
          * `systemUiVisibilityChanges` - System UI visibility changes.
       * `RxViewGroup`:
          * `changeEvents` - Child add and remove events.
    * `rxbinding-appcompat-v7`:
       * `RxToolbar`:
          * `navigationClicks` - Clicks on the navigation view.
    * `rxbinding-design`:
       * `RxAppBarLayout`:
          * `offsetChanges` - Offset value changes.
       * `RxSwipeDismissBehavior`:
          * `dismisses` - Dismiss events.
       * `RxTextInputLayoutTest`:
          * `counterEnabled` - Sets the enabled state of the counter.
          * `counterMaxLength` - Sets the maximum length of the counter.
          * `hint` - Sets the hint text.
          * `hintRest` - Sets the hint text using a resource.
    * `rxbinding-recyclerview-v7`:
       * `RxRecyclerView`:
          * `scrollStateChanges` - Scroll state changes (dragging, settling, idling).
       * `RxRecyclerViewAdapter`:
          * `childAttachStateChangeEvents` - Child attach and detach events.
          * `dataChanges` - Adapter data changes.
    * `rxbinding-support-v4`:
       * `RxViewPager`:
          * `pageSelections` - Page index selections.
 * Update Kotlin modules dependency to v1.0.0-beta-1038.
 * Update support library dependencies to v23.1.0.
 * Fix: Bindings whose values are irrelevant now use `Void` instead of `Object` (and `Unit` in
   Kotlin).
 * Fix: Remove binding overloads which provided event objects that included no additional
   information (aside from the source view). To include the source view for an event, add it with
   the `map` operator (e.g., `RxFoo.bar(sourceView).map(data -> new Pair<>(sourceView, data))`).
    * `RxCompoundButton.checkedChangeEvents`
    * `RxRadioGroup.checkedChangeEvents`
    * `RxRecyclerView.scrollStateChangeEvents`
    * `RxView.clickEvents`
    * `RxView.dragEvents`
    * `RxView.focusChangeEvents`
    * `RxView.hoverEvents`
    * `RxView.longClickEvents`
    * `RxView.touchEvents`


Version 0.2.0 *(2015-08-23)*
----------------------------

 * New modules!
    * `rxbinding-appcompat-v7` (and `rxbinding-appcompat-v7-kotlin`) for the 'AppCompat Support Library':
       * `RxSearchView`:
          * `queryTextChanges` - Query text changes.
          * `queryTextChangeEvents` - Query text change events.
          * `query` - Sets the query text.
       * `RxToolbar`:
          * `itemClicks` - Item clicks.
    * `rxbinding-design` (and `rxbinding-design-kotlin`) for the 'Design Support Library':
       * `RxNavigationView`:
          * `itemSelections` - Item selections.
       * `RxSnackbar`:
          * `dismisses` - Dismiss events.
       * `RxTabLayout`:
          * `selections` - Tab selections.
          * `selectionEvents` - Tab selection, reselection, and unselection events.
          * `select` - Sets the selected tab.
    * `rxbinding-recyclerview-v7` (and `rxbinding-recyclerview-v7-kotlin`) for the 'RecyclerView Support Library':
       * `RxRecyclerView`:
          * `scrollEvents` - Scroll events.
          * `scrollStateChangeEvents` - Scroll state change events (dragging, settling, idling).
 * New bindings!
    * `rxbinding`:
       * `RxSearchView`:
          * `queryTextChanges` - Query text changes.
          * `queryTextChangeEvents` - Query text change events.
          * `query` - Sets the query text.
       * `RxSwipeRefreshLayout`:
          * `refreshes` - Refresh events.
          * `refreshing` - Whether showing the refreshing indicator.
       * `RxTextSwitcher`:
          * `text` - Sets the text to display.
          * `currentText` - Sets the current displayed text.
       * `RxToolbar`:
          * `itemClicks` - Item clicks.
       * `RxView`:
          * `attaches` - Attach indication.
          * `attachEvents` - Attach and detach events.
          * `detaches` - Detach indication.
 * Added `@CheckResult` to methods which will generate lint warnings if the return value is ignored.
 * Added `@NonNull` to methods to indicate to lint that they will never return null and added to parameters
   to indicate to lint for which arguments is null not allowed. Explicit null checks have been removed.
 * Update Kotlin modules to Kotlin v0.12.1230.
 * Update support library dependencies to v23.0.0.
 * Minimum SDK version is now 14 because reasons.
 * Fix: Kotlin modules now have correct dependencies on the corresponding Java modules.


Version 0.1.0 *(2015-08-02)*
----------------------------

Initial release.


================================================
FILE: LICENSE.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
RxBinding
=========

RxJava binding APIs for Android UI widgets from the platform and support libraries.


Download
--------

Platform bindings:
```groovy
implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'
```

AndroidX library bindings:
```groovy
implementation 'com.jakewharton.rxbinding4:rxbinding-core:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-appcompat:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-drawerlayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-leanback:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-recyclerview:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-slidingpanelayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-swiperefreshlayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-viewpager:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-viewpager2:4.0.0'
```

Google 'material' library bindings:
```groovy
implementation 'com.jakewharton.rxbinding4:rxbinding-material:4.0.0'
```

Snapshots of the development version are available in [Sonatype's `snapshots` repository][snap].


License
-------

    Copyright (C) 2015 Jake Wharton

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.





 [snap]: https://oss.sonatype.org/content/repositories/snapshots/


================================================
FILE: RELEASING.md
================================================
Releasing
========

 1. Change the version in `gradle.properties` to a non-SNAPSHOT version.
 2. Update the `CHANGELOG.md` for the impending release.
 3. Update the `README.md` with the new version.
 4. `git commit -am "Prepare for release X.Y.Z."` (where X.Y.Z is the new version)
 5. `git tag -a X.Y.Z -m "Version X.Y.Z"` (where X.Y.Z is the new version)
 6. `./gradlew clean uploadArchives`
 7. Update the `gradle.properties` to the next SNAPSHOT version.
 8. `git commit -am "Prepare next development version."`
 9. `git push && git push --tags`
 10. Visit [Sonatype Nexus](https://oss.sonatype.org/) and promote the artifact.


================================================
FILE: build.gradle
================================================
buildscript {
  ext.buildConfig = [
    'minSdkVersion': 14,
    'compileSdkVersion': 29,
  ]
  ext.versions = [
    'kotlin': '1.3.72',
  ]
  ext.deps = [
    'kotlinStdlib': "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}",

    'androidXAnnotations': 'androidx.annotation:annotation:1.0.0',
    'androidXAppCompat': 'androidx.appcompat:appcompat:1.0.0',
    'androidXCore': 'androidx.core:core:1.0.0',
    'androidXDrawerLayout': 'androidx.drawerlayout:drawerlayout:1.0.0',
    'androidXLeanback': 'androidx.leanback:leanback:1.0.0',
    'androidXRecyclerView': 'androidx.recyclerview:recyclerview:1.0.0',
    'androidXSlidingPaneLayout': 'androidx.slidingpanelayout:slidingpanelayout:1.0.0',
    'androidXSwipeRefreshLayout': 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0',
    'androidXViewPager': 'androidx.viewpager:viewpager:1.0.0',
    'androidXViewPager2': 'androidx.viewpager2:viewpager2:1.0.0',

    'androidXTestCore': 'androidx.test:core:1.1.0',
    'androidXTestRunner': 'androidx.test:runner:1.1.1',
    'androidXTestRules': 'androidx.test:rules:1.1.1',
    'androidXTestEspresso': 'androidx.test.espresso:espresso-core:3.1.1',
    'androidXTestEspressoContrib': 'androidx.test.espresso:espresso-contrib:3.1.1',

    'googleMaterial': 'com.google.android.material:material:1.0.0',

    'rxJava': 'io.reactivex.rxjava3:rxjava:3.0.3',
    'rxAndroid': 'io.reactivex.rxjava3:rxandroid:3.0.0',

    'junit': 'junit:junit:4.12',
  ]

  dependencies {
    classpath 'com.android.tools.build:gradle:3.6.3'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
  }
  repositories {
    mavenCentral()
    google()
    jcenter()
  }
}

subprojects {
  repositories {
    mavenCentral()
    google()
    jcenter()
  }

  group = GROUP
  version = VERSION_NAME

  afterEvaluate {
    // The default 'assemble' task only applies to normal variants. Add test variants as well.
    def assembleProvider = tasks.named('assemble')
    android.testVariants.all { variant ->
      assembleProvider.configure {
        it.dependsOn(variant.assembleProvider)
      }
    }

    // Disable BuildConfig generation.
    // TODO replace with https://issuetracker.google.com/issues/72050365 once released.
    android.libraryVariants.all {
      it.generateBuildConfigProvider.configure {
        enabled = false
      }
    }

    tasks.withType(com.android.build.gradle.internal.tasks.AndroidTestTask) { task ->
      task.doFirst {
        logging.level = LogLevel.INFO
      }
      task.doLast {
        logging.level = LogLevel.LIFECYCLE
      }
    }
  }
}


================================================
FILE: gradle/gradle-mvn-push.gradle
================================================
/*
 * Copyright 2013 Chris Banes
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

apply plugin: 'maven'
apply plugin: 'signing'

def isReleaseBuild() {
    return VERSION_NAME.contains("SNAPSHOT") == false
}

def getRepositoryUsername() {
    return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : ""
}

def getRepositoryPassword() {
    return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : ""
}

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

                pom.groupId = GROUP
                pom.artifactId = POM_ARTIFACT_ID
                pom.version = VERSION_NAME

                repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
                snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }

                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                    scm {
                        url POM_SCM_URL
                        connection POM_SCM_CONNECTION
                        developerConnection POM_SCM_DEV_CONNECTION
                    }

                    licenses {
                        license {
                            name POM_LICENCE_NAME
                            url POM_LICENCE_URL
                            distribution POM_LICENCE_DIST
                        }
                    }

                    developers {
                        developer {
                            id POM_DEVELOPER_ID
                            name POM_DEVELOPER_NAME
                        }
                    }
                }
            }
        }
    }

    signing {
        required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
        sign configurations.archives
    }

    task androidJavadocs(type: Javadoc) {
        if (!project.plugins.hasPlugin('kotlin-android')) {
            source = android.sourceSets.main.java.srcDirs
        }
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        exclude '**/internal/*'
        include '**/*.java'

        if (JavaVersion.current().isJava8Compatible()) {
            options.addStringOption('Xdoclint:none', '-quiet')
        }
    }

    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }

    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.source
    }

    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: gradle.properties
================================================
GROUP=com.jakewharton.rxbinding4
VERSION_NAME=4.0.1-SNAPSHOT

POM_DESCRIPTION=RxJava binding APIs for Android's UI widgets.

POM_URL=https://github.com/JakeWharton/RxBinding/
POM_SCM_URL=https://github.com/JakeWharton/RxBinding/
POM_SCM_CONNECTION=scm:git:git://github.com/JakeWharton/RxBinding.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/JakeWharton/RxBinding.git

POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo

POM_DEVELOPER_ID=jakewharton
POM_DEVELOPER_NAME=Jake Wharton

android.useAndroidX=true


================================================
FILE: gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: rxbinding/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.android'

dependencies {
  api deps.androidXAnnotations
  api deps.kotlinStdlib
  api deps.rxJava
  implementation deps.rxAndroid

  androidTestImplementation project(':testing-utils')
  androidTestImplementation deps.androidXTestCore
  androidTestImplementation deps.androidXTestRunner
  androidTestImplementation deps.androidXTestRules
}

android {
  compileSdkVersion buildConfig.compileSdkVersion

  defaultConfig {
    minSdkVersion buildConfig.minSdkVersion

    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

  kotlinOptions {
    jvmTarget = '1.8'
  }

  lintOptions {
    textReport true
    textOutput 'stdout'
  }

  buildTypes {
    debug {
      testCoverageEnabled true
    }
  }
}

apply from: rootProject.file('gradle/gradle-mvn-push.gradle')


================================================
FILE: rxbinding/gradle.properties
================================================
POM_ARTIFACT_ID=rxbinding
POM_NAME=RxBinding
POM_PACKAGING=aar


================================================
FILE: rxbinding/src/androidTest/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jakewharton.rxbinding4">

  <application>
    <activity android:name=".view.RxViewAttachTestActivity"/>
    <activity android:name=".view.RxViewSystemUiVisibilityTestActivity"/>
    <activity android:name=".widget.RxAdapterViewTestActivity"/>
    <activity android:name=".widget.RxAbsListViewTestActivity"/>
    <activity android:name=".widget.RxAutoCompleteTextViewTestActivity"/>
    <activity android:name=".widget.RxRatingBarTestActivity"/>
    <activity android:name=".widget.RxSearchViewTestActivity"/>
    <activity android:name=".widget.RxSeekBarTestActivity"/>
    <activity android:name=".widget.RxPopupMenuTestActivity"/>
    <activity
        android:name=".widget.RxToolbarTestActivity"
        android:theme="@android:style/Theme.Material"
        />
  </application>
</manifest>


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java
================================================
package com.jakewharton.rxbinding4.internal;

import androidx.test.annotation.UiThreadTest;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public final class MainThreadKtTest {
  @UiThreadTest
  @Test public void checkMainOnMainDoesNotNotify() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    assertTrue(Preconditions.checkMainThread(o));
    o.assertNoMoreEvents();
  }

  @Test public void checkMainOnNotMainNotifies() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    assertFalse(Preconditions.checkMainThread(o));
    Throwable e = o.takeError();
    assertTrue(e instanceof IllegalStateException);
    assertTrue(e.getMessage().startsWith("Expected to be called on the main thread but was "));
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java
================================================
package com.jakewharton.rxbinding4.view;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.ActionProvider;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import kotlin.jvm.functions.Function1;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;

public final class RxMenuItemTest {
  private final Context context = ApplicationProvider.getApplicationContext();
  private final TestMenuItem menuItem = new TestMenuItem(context);

  @Test @UiThreadTest public void clicks() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxMenuItem.clicks(menuItem).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    menuItem.performClick();
    assertNotNull(o.takeNext());

    menuItem.performClick();
    assertNotNull(o.takeNext());

    o.dispose();

    menuItem.performClick();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void clicksAvoidHandling() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxMenuItem.clicks(menuItem, item -> false).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    menuItem.performClick();
    o.assertNoMoreEvents();

    menuItem.performClick();
    o.assertNoMoreEvents();

    o.dispose();

    menuItem.performClick();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void actionViewEvents() {
    RecordingObserver<MenuItemActionViewEvent> o = new RecordingObserver<>();
    RxMenuItem.actionViewEvents(menuItem).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    menuItem.expandActionView();
    assertEquals(new MenuItemActionViewExpandEvent(menuItem), o.takeNext());

    menuItem.collapseActionView();
    assertEquals(new MenuItemActionViewCollapseEvent(menuItem), o.takeNext());

    o.dispose();

    menuItem.performClick();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void actionViewEventsAvoidHandling() {
    Function1<MenuItemActionViewEvent, Boolean> handled = menuItem -> false;

    RecordingObserver<MenuItemActionViewEvent> o = new RecordingObserver<>();
    RxMenuItem.actionViewEvents(menuItem, handled).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    menuItem.expandActionView();
    assertFalse(menuItem.isActionViewExpanded()); // Should be prevented by handler
    o.assertNoMoreEvents();

    o.dispose();

    menuItem.performClick();
    o.assertNoMoreEvents();
  }

  // There is no accessible default implementation of MenuItem, so we have to create one
  private static final class TestMenuItem implements MenuItem {

    private final Context context;

    private int itemId;
    private int groupId;
    private int order;
    private CharSequence title;
    private CharSequence titleCondensed;
    private Drawable icon;
    private Intent intent;
    private char numericChar;
    private char alphaChar;
    private boolean checkable;
    private boolean checked;
    private boolean visible;
    private boolean enabled;
    private OnMenuItemClickListener menuItemClickListener;
    private int actionEnum;
    private View actionView;
    private ActionProvider actionProvider;
    private boolean isActionViewExpanded;
    private OnActionExpandListener actionExpandListener;

    public TestMenuItem(Context context) {
      this.context = context;
    }

    public void performClick() {
      if (menuItemClickListener != null) {
        menuItemClickListener.onMenuItemClick(this);
      }
    }

    @Override public int getItemId() {
      return itemId;
    }

    @Override public int getGroupId() {
      return groupId;
    }

    @Override public int getOrder() {
      return order;
    }

    @Override public MenuItem setTitle(CharSequence title) {
      this.title = title;
      return this;
    }

    @Override public MenuItem setTitle(int title) {
      this.title = context.getText(title);
      return this;
    }

    @Override public CharSequence getTitle() {
      return title;
    }

    @Override public MenuItem setTitleCondensed(CharSequence title) {
      this.titleCondensed = title;
      return this;
    }

    @Override public CharSequence getTitleCondensed() {
      return titleCondensed;
    }

    @Override public MenuItem setIcon(Drawable icon) {
      this.icon = icon;
      return this;
    }

    @Override public MenuItem setIcon(int iconRes) {
      this.icon = context.getResources().getDrawable(iconRes);
      return this;
    }

    @Override public Drawable getIcon() {
      return icon;
    }

    @Override public MenuItem setIntent(Intent intent) {
      this.intent = intent;
      return this;
    }

    @Override public Intent getIntent() {
      return intent;
    }

    @Override public MenuItem setShortcut(char numericChar, char alphaChar) {
      this.numericChar = numericChar;
      this.alphaChar = alphaChar;
      return this;
    }

    @Override public MenuItem setNumericShortcut(char numericChar) {
      this.numericChar = numericChar;
      return this;
    }

    @Override public char getNumericShortcut() {
      return numericChar;
    }

    @Override public MenuItem setAlphabeticShortcut(char alphaChar) {
      this.alphaChar = alphaChar;
      return this;
    }

    @Override public char getAlphabeticShortcut() {
      return alphaChar;
    }

    @Override public MenuItem setCheckable(boolean checkable) {
      this.checkable = checkable;
      return this;
    }

    @Override public boolean isCheckable() {
      return checkable;
    }

    @Override public MenuItem setChecked(boolean checked) {
      if (checkable) {
        this.checked = checked;
      }
      return this;
    }

    @Override public boolean isChecked() {
      return checked;
    }

    @Override public MenuItem setVisible(boolean visible) {
      this.visible = visible;
      return this;
    }

    @Override public boolean isVisible() {
      return visible;
    }

    @Override public MenuItem setEnabled(boolean enabled) {
      this.enabled = enabled;
      return this;
    }

    @Override public boolean isEnabled() {
      return enabled;
    }

    @Override public boolean hasSubMenu() {
      return false;
    }

    @Override public SubMenu getSubMenu() {
      return null;
    }

    @Override
    public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
      this.menuItemClickListener = menuItemClickListener;
      return this;
    }

    @Override public ContextMenu.ContextMenuInfo getMenuInfo() {
      return null;
    }

    @Override public void setShowAsAction(int actionEnum) {
      this.actionEnum = actionEnum;
    }

    @Override public MenuItem setShowAsActionFlags(int actionEnum) {
      this.actionEnum = actionEnum;
      return this;
    }

    @Override public MenuItem setActionView(View view) {
      this.actionView = view;
      return this;
    }

    @Override public MenuItem setActionView(int resId) {
      this.actionView = LayoutInflater.from(context).inflate(resId, null);
      return this;
    }

    @Override public View getActionView() {
      return actionView;
    }

    @Override public MenuItem setActionProvider(ActionProvider actionProvider) {
      this.actionProvider = actionProvider;
      return this;
    }

    @Override public ActionProvider getActionProvider() {
      return actionProvider;
    }

    @Override public boolean expandActionView() {
      if (isActionViewExpanded) {
        return false;
      }

      if (actionExpandListener != null && !actionExpandListener.onMenuItemActionExpand(this)) {
        return false;
      }

      isActionViewExpanded = true;
      return true;
    }

    @Override public boolean collapseActionView() {
      if (!isActionViewExpanded) {
        return false;
      }

      if (actionExpandListener != null && !actionExpandListener.onMenuItemActionCollapse(this)) {
        return false;
      }

      isActionViewExpanded = false;
      return true;
    }

    @Override public boolean isActionViewExpanded() {
      return isActionViewExpanded;
    }

    @Override public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {
      this.actionExpandListener = listener;
      return this;
    }
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java
================================================
package com.jakewharton.rxbinding4.view;

import android.app.Instrumentation;
import android.view.View;
import android.widget.FrameLayout;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

public final class RxViewAttachTest {
  @Rule public final ActivityTestRule<RxViewAttachTestActivity> activityRule =
      new ActivityTestRule<>(RxViewAttachTestActivity.class);

  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
  FrameLayout parent;
  View child;

  @Before public void setUp() {
    RxViewAttachTestActivity activity = activityRule.getActivity();
    parent = activity.parent;
    child = activity.child;
  }

  @Test public void attaches() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.attaches(child)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    instrumentation.runOnMainSync(() -> parent.addView(child));
    assertNotNull(o.takeNext());
    instrumentation.runOnMainSync(() -> parent.removeView(child));
    o.assertNoMoreEvents();

    o.dispose();

    instrumentation.runOnMainSync(() -> {
      parent.addView(child);
      parent.removeView(child);
    });
    o.assertNoMoreEvents();
  }

  @Test public void attachEvents() {
    RecordingObserver<ViewAttachEvent> o = new RecordingObserver<>();
    RxView.attachEvents(child)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    instrumentation.runOnMainSync(() -> parent.addView(child));
    assertEquals(new ViewAttachAttachedEvent(child), o.takeNext());
    instrumentation.runOnMainSync(() -> parent.removeView(child));
    assertEquals(new ViewAttachDetachedEvent(child), o.takeNext());

    o.dispose();

    instrumentation.runOnMainSync(() -> {
      parent.addView(child);
      parent.removeView(child);
    });
    o.assertNoMoreEvents();
  }

  @Test public void detaches() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.detaches(child)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    instrumentation.runOnMainSync(() -> parent.addView(child));
    o.assertNoMoreEvents();
    instrumentation.runOnMainSync(() -> parent.removeView(child));
    assertNotNull(o.takeNext());

    o.dispose();

    instrumentation.runOnMainSync(() -> {
      parent.addView(child);
      parent.removeView(child);
    });
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java
================================================
package com.jakewharton.rxbinding4.view;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;

public final class RxViewAttachTestActivity extends Activity {
  FrameLayout parent;
  View child;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    parent = new FrameLayout(this);
    child = new View(this);
    setContentView(parent);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java
================================================
package com.jakewharton.rxbinding4.view;

import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public final class RxViewGroupTest {
  private final Context context = ApplicationProvider.getApplicationContext();
  private final LinearLayout parent = new LinearLayout(context);
  private final View child = new View(context);

  @Test @UiThreadTest public void childViewEvents() {
    RecordingObserver<ViewGroupHierarchyChangeEvent> o = new RecordingObserver<>();
    RxViewGroup.changeEvents(parent).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    parent.addView(child);
    assertEquals(new ViewGroupHierarchyChildViewAddEvent(parent, child), o.takeNext());

    parent.removeView(child);
    assertEquals(new ViewGroupHierarchyChildViewRemoveEvent(parent, child), o.takeNext());

    o.dispose();

    parent.addView(child);
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java
================================================
package com.jakewharton.rxbinding4.view;

import android.app.Instrumentation;
import android.view.View;
import android.widget.FrameLayout;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public final class RxViewSystemUiVisibilityTest {
  @Rule public final ActivityTestRule<RxViewSystemUiVisibilityTestActivity> activityRule =
      new ActivityTestRule<>(RxViewSystemUiVisibilityTestActivity.class);

  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
  FrameLayout root;

  @Before public void setUp() {
    RxViewSystemUiVisibilityTestActivity activity = activityRule.getActivity();
    root = activity.root;
    root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
  }

  @Test public void systemUiVisibilityChanges() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxView.systemUiVisibilityChanges(root)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(
        () -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
    assertEquals(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION, o.takeNext().intValue());

    instrumentation.runOnMainSync(() -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE));
    assertEquals(View.SYSTEM_UI_FLAG_VISIBLE, o.takeNext().intValue());

    o.dispose();

    instrumentation.runOnMainSync(
        () -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java
================================================
package com.jakewharton.rxbinding4.view;

import android.app.Activity;
import android.os.Bundle;
import android.widget.FrameLayout;

public final class RxViewSystemUiVisibilityTestActivity extends Activity {
  FrameLayout root;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    root = new FrameLayout(this);
    setContentView(root);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java
================================================
package com.jakewharton.rxbinding4.view;

import android.content.Context;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SdkSuppress;
import com.jakewharton.rxbinding4.RecordingObserver;
import com.jakewharton.rxbinding4.internal.AlwaysTrue;
import io.reactivex.rxjava3.functions.Consumer;
import org.junit.Test;

import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_HOVER_ENTER;
import static android.view.MotionEvent.ACTION_HOVER_EXIT;
import static android.view.MotionEvent.ACTION_HOVER_MOVE;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
import static com.jakewharton.rxbinding4.MotionEventUtil.hoverMotionEventAtPosition;
import static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

public final class RxViewTest {
  private final Context context = ApplicationProvider.getApplicationContext();
  private final View view = new View(context);

  @Test @UiThreadTest public void clicks() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.clicks(view).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    view.performClick();
    assertNotNull(o.takeNext());

    view.performClick();
    assertNotNull(o.takeNext());

    o.dispose();

    view.performClick();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void drags() {
    //RecordingObserver<ViewClickEvent> o = new RecordingObserver<>();
    //RxView.clickEvents(view).subscribe(o);
    //o.assertNoMoreEvents(); // No initial value.
    //
    //clock.advance(1, SECONDS);
    //view.performClick();
    //assertEquals(ViewClickEvent.create(view, 1000), o.takeNext());
    //
    //clock.advance(1, SECONDS);
    //view.performClick();
    //assertEquals(ViewClickEvent.create(view, 2000), o.takeNext());
    //
    //o.dispose();
    //
    //clock.advance(1, SECONDS);
    //view.performClick();
    //o.assertNoMoreEvents();
  }

  @SdkSuppress(minSdkVersion = 16)
  @Test @UiThreadTest public void drawEvents() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.draws(view).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    view.getViewTreeObserver().dispatchOnDraw();
    assertNotNull(o.takeNext());

    o.dispose();

    view.getViewTreeObserver().dispatchOnDraw();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void focusChanges() {
    // We need a parent which can take focus from our view when it attempts to clear.
    LinearLayout parent = new LinearLayout(context);
    parent.setFocusable(true);
    parent.addView(view);

    view.setFocusable(true);

    RecordingObserver<Boolean> o = new RecordingObserver<>();
    RxView.focusChanges(view).subscribe(o);
    assertFalse(o.takeNext());

    view.requestFocus();
    assertTrue(o.takeNext());

    view.clearFocus();
    assertFalse(o.takeNext());

    o.dispose();

    view.requestFocus();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void globalLayouts() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.globalLayouts(view).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    view.getViewTreeObserver().dispatchOnGlobalLayout();
    assertNotNull(o.takeNext());

    o.dispose();
    view.getViewTreeObserver().dispatchOnGlobalLayout();

    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void hovers() {
    RecordingObserver<MotionEvent> o = new RecordingObserver<>();
    RxView.hovers(view).subscribe(o);
    o.assertNoMoreEvents();

    view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_ENTER, 0, 50));
    MotionEvent event1 = o.takeNext();
    assertEquals(ACTION_HOVER_ENTER, event1.getAction());

    view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_MOVE, 1, 50));
    MotionEvent event2 = o.takeNext();
    assertEquals(ACTION_HOVER_MOVE, event2.getAction());

    o.dispose();

    view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_EXIT, 1, 50));
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void layoutChanges() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.layoutChanges(view).subscribe(o);
    o.assertNoMoreEvents();

    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
    assertNotNull(o.takeNext());

    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
    o.assertNoMoreEvents();

    o.dispose();
    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void layoutChangeEvents() {
    RecordingObserver<ViewLayoutChangeEvent> o = new RecordingObserver<>();
    RxView.layoutChangeEvents(view).subscribe(o);
    o.assertNoMoreEvents();

    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
    ViewLayoutChangeEvent event1 = o.takeNext();
    assertSame(view, event1.getView());
    assertNotSame(event1.getOldLeft(), event1.getLeft());
    assertSame(event1.getOldRight(), event1.getRight());

    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
    o.assertNoMoreEvents();

    o.dispose();
    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void longClicks() {
    // We need a parent because long presses delegate to the parent.
    LinearLayout parent = new LinearLayout(context) {
      @Override public boolean showContextMenuForChild(View originalView) {
        return true;
      }
    };
    parent.addView(view);

    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.longClicks(view).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    view.performLongClick();
    assertNotNull(o.takeNext());

    view.performLongClick();
    assertNotNull(o.takeNext());

    o.dispose();

    view.performLongClick();
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void preDrawEvents() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxView.preDraws(view, AlwaysTrue.INSTANCE).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    view.getViewTreeObserver().dispatchOnPreDraw();
    assertNotNull(o.takeNext());

    o.dispose();

    view.getViewTreeObserver().dispatchOnPreDraw();
    o.assertNoMoreEvents();
  }

  @SdkSuppress(minSdkVersion = 23)
  @Test @UiThreadTest public void scrollChangeEvents() {
    RecordingObserver<ViewScrollChangeEvent> o = new RecordingObserver<>();
    RxView.scrollChangeEvents(view).subscribe(o);
    o.assertNoMoreEvents();

    view.scrollTo(1, 1);
    ViewScrollChangeEvent event0 = o.takeNext();
    assertSame(view, event0.getView());
    assertEquals(1, event0.getScrollX());
    assertEquals(1, event0.getScrollY());
    assertEquals(0, event0.getOldScrollX());
    assertEquals(0, event0.getOldScrollY());

    view.scrollTo(2, 2);
    ViewScrollChangeEvent event1 = o.takeNext();
    assertSame(view, event1.getView());
    assertEquals(2, event1.getScrollX());
    assertEquals(2, event1.getScrollY());
    assertEquals(1, event1.getOldScrollX());
    assertEquals(1, event1.getOldScrollY());

    o.dispose();
    view.scrollTo(3, 3);
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void touches() {
    RecordingObserver<MotionEvent> o = new RecordingObserver<>();
    RxView.touches(view).subscribe(o);
    o.assertNoMoreEvents();

    view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_DOWN, 0, 50));
    MotionEvent event1 = o.takeNext();
    assertEquals(ACTION_DOWN, event1.getAction());

    view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_MOVE, 1, 50));
    MotionEvent event2 = o.takeNext();
    assertEquals(ACTION_MOVE, event2.getAction());

    o.dispose();

    view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_UP, 1, 50));
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void keys() {
    RecordingObserver<KeyEvent> o = new RecordingObserver<>();
    RxView.keys(view).subscribe(o);
    o.assertNoMoreEvents();

    view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_R));
    KeyEvent event1 = o.takeNext();
    assertEquals(KeyEvent.ACTION_DOWN, event1.getAction());

    view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_H));
    KeyEvent event2 = o.takeNext();
    assertEquals(KeyEvent.KEYCODE_H, event2.getKeyCode());

    o.dispose();

    view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_S));
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void visibility() throws Throwable {
    view.setVisibility(View.VISIBLE);
    Consumer<? super Boolean> action = RxView.visibility(view);
    action.accept(false);
    assertEquals(View.GONE, view.getVisibility());
    action.accept(true);
    assertEquals(View.VISIBLE, view.getVisibility());
  }

  @Test @UiThreadTest public void visibilityCustomFalse() throws Throwable {
    view.setVisibility(View.VISIBLE);
    Consumer<? super Boolean> action = RxView.visibility(view, View.INVISIBLE);
    action.accept(false);
    assertEquals(View.INVISIBLE, view.getVisibility());
    action.accept(true);
    assertEquals(View.VISIBLE, view.getVisibility());
  }

  @SuppressWarnings("ResourceType") @Test @UiThreadTest public void setVisibilityCustomFalseToVisibleThrows() {
    try {
      RxView.visibility(view, View.VISIBLE);
      fail();
    } catch (IllegalArgumentException e) {
      assertEquals("Setting visibility to VISIBLE when false would have no effect.", e.getMessage());
    }
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Instrumentation;
import android.widget.ListView;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public final class RxAbsListViewTest {
  @Rule public final ActivityTestRule<RxAbsListViewTestActivity> activityRule =
      new ActivityTestRule<>(RxAbsListViewTestActivity.class);

  private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

  private RxAbsListViewTestActivity activity;
  ListView listView;

  @Before public void setUp() {
    activity = activityRule.getActivity();
    listView = activity.listView;
  }

  @Test public void scrollEvents() {
    RecordingObserver<AbsListViewScrollEvent> o = new RecordingObserver<>();
    RxAbsListView.scrollEvents(listView)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    AbsListViewScrollEvent event = o.takeNext();
    assertEquals(100, event.getTotalItemCount());
    assertEquals(0, event.getFirstVisibleItem());
    assertEquals(0, event.getScrollState());

    instrumentation.runOnMainSync(() -> listView.smoothScrollToPosition(50));
    AbsListViewScrollEvent event1 = o.takeNext();
    assertEquals(listView, event1.getView());
    assertEquals(100, event1.getTotalItemCount());

    o.dispose();

    instrumentation.runOnMainSync(() -> listView.smoothScrollToPosition(100));
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

public final class RxAbsListViewTestActivity extends Activity {
  ListView listView;

  List<String> values;
  ArrayAdapter<String> adapter;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    values = createValues(100);
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);

    listView = new ListView(this);
    listView.setAdapter(adapter);

    FrameLayout layout = new FrameLayout(this);
    layout.addView(listView);
    setContentView(layout);
  }

  private static List<String> createValues(int count) {
    final List<String> values = new ArrayList<>(count);
    for (int i = 0; i < count; i++) {
      values.add(String.valueOf(i));
    }
    return values;
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import androidx.test.annotation.UiThreadTest;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;

import static org.junit.Assert.assertSame;

public final class RxAdapterTest {
  private final TestAdapter adapter = new TestAdapter();

  @Test @UiThreadTest public void dataChanges() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxAdapter.dataChanges(adapter).subscribe(o);
    assertSame(adapter, o.takeNext());

    adapter.notifyDataSetChanged();
    assertSame(adapter, o.takeNext());

    adapter.notifyDataSetChanged();
    assertSame(adapter, o.takeNext());

    o.dispose();
    adapter.notifyDataSetChanged();
    o.assertNoMoreEvents();
  }

  private static final class TestAdapter extends BaseAdapter {
    TestAdapter() {
    }

    @Override public int getCount() {
      return 0;
    }

    @Override public Object getItem(int position) {
      return null;
    }

    @Override public long getItemId(int position) {
      return 0;
    }

    @Override public View getView(int position, View convertView, ViewGroup parent) {
      return null;
    }
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Instrumentation;
import android.widget.ListView;
import android.widget.Spinner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;

public final class RxAdapterViewTest {
  @Rule public final ActivityTestRule<RxAdapterViewTestActivity> activityRule =
      new ActivityTestRule<>(RxAdapterViewTestActivity.class);

  private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

  RxAdapterViewTestActivity activity;
  Spinner spinner;
  ListView listView;

  @Before public void setUp() {
    activity = activityRule.getActivity();
    spinner = activity.spinner;
    listView = activity.listView;
  }

  @Test public void itemSelections() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxAdapterView.itemSelections(spinner)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    assertEquals(0, o.takeNext().intValue());

    instrumentation.runOnMainSync(() -> spinner.setSelection(2));
    assertEquals(2, o.takeNext().intValue());

    instrumentation.runOnMainSync(() -> spinner.setSelection(0));
    assertEquals(0, o.takeNext().intValue());

    o.dispose();

    instrumentation.runOnMainSync(() -> spinner.setSelection(1));
    o.assertNoMoreEvents();
  }

  @Test public void selectionEvents() {
    RecordingObserver<AdapterViewSelectionEvent> o = new RecordingObserver<>();
    RxAdapterView.selectionEvents(spinner)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    AdapterViewItemSelectionEvent event1 = (AdapterViewItemSelectionEvent) o.takeNext();
    assertSame(spinner, event1.getView());
    assertNotNull(event1.getSelectedView());
    assertEquals(0, event1.getPosition());
    assertEquals(0, event1.getId());

    instrumentation.runOnMainSync(() -> spinner.setSelection(2));
    AdapterViewItemSelectionEvent event2 = (AdapterViewItemSelectionEvent) o.takeNext();
    assertSame(spinner, event2.getView());
    assertNotNull(event2.getSelectedView());
    assertEquals(2, event2.getPosition());
    assertEquals(2, event2.getId());

    instrumentation.runOnMainSync(() -> {
      activity.values.clear();
      activity.adapter.notifyDataSetChanged();
    });
    assertEquals(new AdapterViewNothingSelectionEvent(spinner), o.takeNext());

    o.dispose();

    instrumentation.runOnMainSync(() -> {
      activity.values.add("Hello");
      activity.adapter.notifyDataSetChanged();
    });
    o.assertNoMoreEvents();
  }

  @Test public void itemClicks() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxAdapterView.itemClicks(listView)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(2), 2, 2));
    assertEquals(2, o.takeNext().intValue());

    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(0), 0, 0));
    assertEquals(0, o.takeNext().intValue());

    o.dispose();

    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(1), 1, 1));
    o.assertNoMoreEvents();
  }

  @Test public void itemClickEvents() {
    RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();
    RxAdapterView.itemClickEvents(listView)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(2), 2, 2));
    AdapterViewItemClickEvent event = o.takeNext();
    assertEquals(listView, event.getView());
    assertNotNull(event.getClickedView());
    assertEquals(2, event.getPosition());
    assertEquals(2, event.getId());

    o.dispose();

    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(1), 1, 1));
    o.assertNoMoreEvents();
  }

  @Test public void itemLongClicks() {
    // TODO
  }

  @Test public void itemLongClickEvents() {
    // TODO
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public final class RxAdapterViewTestActivity extends Activity {
  Spinner spinner;
  ListView listView;

  List<String> values;
  ArrayAdapter<String> adapter;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    values = new ArrayList<>(Arrays.asList("One", "Two", "Three"));
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);

    spinner = new Spinner(this);
    spinner.setAdapter(adapter);

    listView = new ListView(this);
    listView.setAdapter(adapter);

    FrameLayout layout = new FrameLayout(this);
    layout.addView(spinner);
    layout.addView(listView);
    setContentView(layout);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Instrumentation;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import com.jakewharton.rxbinding4.test.R;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.clearText;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.matcher.RootMatchers.withDecorView;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

public final class RxAutoCompleteTextViewTest {
  @Rule public final ActivityTestRule<RxAutoCompleteTextViewTestActivity> activityRule =
      new ActivityTestRule<>(RxAutoCompleteTextViewTestActivity.class);

  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

  private RxAutoCompleteTextViewTestActivity activity;
  AutoCompleteTextView autoCompleteTextView;

  @Before public void setUp() {
    activity = activityRule.getActivity();
    autoCompleteTextView = activity.autoCompleteTextView;
  }

  @Test public void itemClickEvents() {
    instrumentation.runOnMainSync(() -> {
      autoCompleteTextView.setThreshold(1);

      List<String> values = Arrays.asList("Two", "Three", "Twenty");
      ArrayAdapter<String> adapter = new ArrayAdapter<>(autoCompleteTextView.getContext(),
          android.R.layout.simple_list_item_1, values);
      autoCompleteTextView.setAdapter(adapter);
    });

    RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();
    RxAutoCompleteTextView.itemClickEvents(autoCompleteTextView)
      .subscribeOn(AndroidSchedulers.mainThread())
      .subscribe(o);
    o.assertNoMoreEvents();

    onView(withId(R.id.auto_complete)).perform(typeText("Tw"));
    onData(startsWith("Twenty"))
        .inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))
        .perform(click());

    AdapterViewItemClickEvent event = o.takeNext();
    assertNotNull(event.getView());
    assertNotNull(event.getClickedView());
    assertEquals(1, event.getPosition()); // Second item in two-item filtered list.
    assertEquals(1, event.getId()); // Second item in two-item filtered list.

    o.dispose();

    onView(withId(R.id.auto_complete)).perform(clearText(), typeText("Tw"));
    onData(startsWith("Twenty"))
        .inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))
        .perform(click());

    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.AutoCompleteTextView;
import android.widget.LinearLayout;
import com.jakewharton.rxbinding4.test.R;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;

public final class RxAutoCompleteTextViewTestActivity extends Activity {
  AutoCompleteTextView autoCompleteTextView;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    setContentView(layout);

    autoCompleteTextView = new AutoCompleteTextView(this);
    autoCompleteTextView.setLayoutParams(new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
    autoCompleteTextView.setId(R.id.auto_complete);
    layout.addView(autoCompleteTextView);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.content.Context;
import android.widget.CompoundButton;
import android.widget.ToggleButton;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public final class RxCompoundButtonTest {
  private final Context context = ApplicationProvider.getApplicationContext();
  private final CompoundButton view = new ToggleButton(context);

  @Test @UiThreadTest public void checkedChanges() {
    view.setChecked(false);

    RecordingObserver<Boolean> o = new RecordingObserver<>();
    RxCompoundButton.checkedChanges(view).subscribe(o);
    assertFalse(o.takeNext());

    view.setChecked(true);
    assertTrue(o.takeNext());
    view.setChecked(false);
    assertFalse(o.takeNext());

    o.dispose();

    view.setChecked(true);
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Instrumentation;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.PopupMenu;
import androidx.test.annotation.UiThreadTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;

public final class RxPopupMenuTest {
  @Rule public final ActivityTestRule<RxPopupMenuTestActivity> activityRule =
      new ActivityTestRule<>(RxPopupMenuTestActivity.class);

  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

  PopupMenu view;

  @Before public void setUp() {
    view = activityRule.getActivity().popupMenu;
  }

  @Test @UiThreadTest public void itemClicks() {
    Menu menu = view.getMenu();
    MenuItem item1 = menu.add(0, 1, 0, "Hi");
    MenuItem item2 = menu.add(0, 2, 0, "Hey");

    RecordingObserver<MenuItem> o = new RecordingObserver<>();
    RxPopupMenu.itemClicks(view).subscribe(o);
    o.assertNoMoreEvents();

    menu.performIdentifierAction(2, 0);
    assertSame(item2, o.takeNext());

    menu.performIdentifierAction(1, 0);
    assertSame(item1, o.takeNext());

    o.dispose();

    menu.performIdentifierAction(2, 0);
    o.assertNoMoreEvents();
  }

  @Test public void dismisses() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxPopupMenu.dismisses(view).subscribeOn(AndroidSchedulers.mainThread()).subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    instrumentation.runOnMainSync(() -> view.show());
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> view.dismiss());
    assertNotNull(o.takeNext());

    o.dispose();
    instrumentation.runOnMainSync(() -> view.show());
    instrumentation.runOnMainSync(() -> view.dismiss());

    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.PopupMenu;

public final class RxPopupMenuTestActivity extends Activity {

  PopupMenu popupMenu;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    View anchor = new View(this);
    setContentView(anchor);
    popupMenu = new PopupMenu(this, anchor);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.content.Context;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.functions.Consumer;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

@SuppressWarnings("ResourceType") // Don't need real IDs for test case.
public final class RxRadioGroupTest {
  private final Context context = ApplicationProvider.getApplicationContext();
  private final RadioGroup view = new RadioGroup(context);

  @Before public void setUp() {
    RadioButton button1 = new RadioButton(context);
    button1.setId(1);
    view.addView(button1);
    RadioButton button2 = new RadioButton(context);
    button2.setId(2);
    view.addView(button2);
  }

  @Test @UiThreadTest public void checkedChanges() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxRadioGroup.checkedChanges(view).subscribe(o);
    assertEquals(-1, o.takeNext().intValue());

    view.check(1);
    assertEquals(1, o.takeNext().intValue());

    view.clearCheck();
    assertEquals(-1, o.takeNext().intValue());

    view.check(2);
    assertEquals(2, o.takeNext().intValue());

    o.dispose();

    view.check(1);
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void checked() throws Throwable {
    Consumer<? super Integer> action = RxRadioGroup.checked(view);
    assertEquals(-1, view.getCheckedRadioButtonId());
    action.accept(1);
    assertEquals(1, view.getCheckedRadioButtonId());
    action.accept(-1);
    assertEquals(-1, view.getCheckedRadioButtonId());
    action.accept(2);
    assertEquals(2, view.getCheckedRadioButtonId());
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Instrumentation;
import android.widget.RatingBar;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
import static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;
import static org.junit.Assert.assertEquals;

public final class RxRatingBarTest {
  @Rule public final ActivityTestRule<RxRatingBarTestActivity> activityRule =
      new ActivityTestRule<>(RxRatingBarTestActivity.class);

  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

  RatingBar view;

  @Before public void setUp() {
    view = activityRule.getActivity().ratingBar;
  }

  @Test public void ratingChanges() {
    RecordingObserver<Float> o = new RecordingObserver<>();
    RxRatingBar.ratingChanges(view)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    assertEquals(0f, o.takeNext(), 0f);

    instrumentation.runOnMainSync(() -> view.setRating(1f));
    assertEquals(1f, o.takeNext(), 0f);

    instrumentation.runOnMainSync(() -> view.setRating(2f));
    assertEquals(2f, o.takeNext(), 0f);

    o.dispose();

    instrumentation.runOnMainSync(() -> view.setRating(1f));
    o.assertNoMoreEvents();
  }

  @Test public void ratingChangeEvents() {
    RecordingObserver<RatingBarChangeEvent> o = new RecordingObserver<>();
    RxRatingBar.ratingChangeEvents(view) //
        .subscribeOn(AndroidSchedulers.mainThread()) //
        .subscribe(o);
    assertEquals(new RatingBarChangeEvent(view, 0f, false), o.takeNext());

    instrumentation.runOnMainSync(() -> view.setRating(5f));
    assertEquals(new RatingBarChangeEvent(view, 5f, false), o.takeNext());

    instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_DOWN, 0, 50));
    instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_UP, 0, 50));
    instrumentation.waitForIdleSync();
    assertEquals(new RatingBarChangeEvent(view, 1f, true), o.takeNext());

    o.dispose();

    instrumentation.runOnMainSync(() -> view.setRating(1f));
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RatingBar;

public final class RxRatingBarTestActivity extends Activity {
  RatingBar ratingBar;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ratingBar = new RatingBar(this);
    ratingBar.setMax(10);
    ratingBar.setStepSize(1f);
    setContentView(ratingBar);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.widget.SearchView;
import androidx.test.annotation.UiThreadTest;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public final class RxSearchViewTest {
  @Rule
  public final ActivityTestRule<RxSearchViewTestActivity> activityRule =
          new ActivityTestRule<>(RxSearchViewTestActivity.class);

  private SearchView searchView;

  @Before public void setUp() {
    searchView = activityRule.getActivity().searchView;
  }

  @Test @UiThreadTest public void queryTextChanges() {
    searchView.setQuery("Initial", false);
    RecordingObserver<CharSequence> o = new RecordingObserver<>();
    RxSearchView.queryTextChanges(searchView).subscribe(o);
    assertEquals("Initial", o.takeNext().toString());

    searchView.setQuery("H", false);
    assertEquals("H", o.takeNext().toString());
    searchView.setQuery("He", false);
    assertEquals("He", o.takeNext().toString());

    searchView.setQuery(null, false); // Internally coerced to empty string.
    assertEquals("", o.takeNext().toString());

    o.dispose();

    searchView.setQuery("Silent", false);
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void query() throws Throwable {
    RxSearchView.query(searchView, false).accept("Hey");
    assertEquals("Hey", searchView.getQuery().toString());

    RxSearchView.query(searchView, true).accept("Bye");
    assertEquals("Bye", searchView.getQuery().toString());
  }

  @Test @UiThreadTest public void queryTextEventNotSubmitted() {
    RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();
    RxSearchView.queryTextChangeEvents(searchView).subscribe(o);

    assertEquals("", o.takeNext().getQueryText().toString());

    searchView.setQuery("q", false);
    SearchViewQueryTextEvent event = o.takeNext();
    assertEquals("q", event.getQueryText().toString());
    assertFalse(event.isSubmitted());
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void queryTextEventSubmitted() {
    RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();
    RxSearchView.queryTextChangeEvents(searchView).subscribe(o);

    assertEquals("", o.takeNext().getQueryText().toString());

    searchView.setQuery("q", true);
    // Text change event:
    SearchViewQueryTextEvent event = o.takeNext();
    assertEquals("q", event.getQueryText().toString());
    assertFalse(event.isSubmitted());
    // Submission event:
    SearchViewQueryTextEvent event1 = o.takeNext();
    assertEquals("q", event1.getQueryText().toString());
    assertTrue(event1.isSubmitted());
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.SearchView;

public final class RxSearchViewTestActivity extends Activity {
  SearchView searchView;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    searchView = new SearchView(this);
    setContentView(searchView);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Instrumentation;
import android.widget.SeekBar;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
import static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;
import static org.junit.Assert.assertEquals;

public final class RxSeekBarTest {
  @Rule public final ActivityTestRule<RxSeekBarTestActivity> activityRule =
      new ActivityTestRule<>(RxSeekBarTestActivity.class);

  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();

  SeekBar seekBar;

  @Before public void setUp() {
    seekBar = activityRule.getActivity().seekBar;
  }

  @Test public void changes() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxSeekBar.changes(seekBar) //
        .subscribeOn(AndroidSchedulers.mainThread()) //
        .subscribe(o);
    assertEquals(0, o.takeNext().intValue());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    assertEquals(100, o.takeNext().intValue());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 0, 50));
    instrumentation.waitForIdleSync();
    assertEquals(0, o.takeNext().intValue());

    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
    instrumentation.waitForIdleSync();
    assertEquals(85, o.takeNext().intValue());

    o.dispose();

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();
  }

  @Test public void systemChanges() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxSeekBar.systemChanges(seekBar) //
            .subscribeOn(AndroidSchedulers.mainThread()) //
            .subscribe(o);
    assertEquals(0, o.takeNext().intValue());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
    instrumentation.waitForIdleSync();
    assertEquals(85, o.takeNext().intValue());

    o.dispose();

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();
  }

  @Test public void userChanges() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxSeekBar.userChanges(seekBar) //
            .subscribeOn(AndroidSchedulers.mainThread()) //
            .subscribe(o);
    assertEquals(0, o.takeNext().intValue());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    assertEquals(100, o.takeNext().intValue());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 0, 50));
    instrumentation.waitForIdleSync();
    assertEquals(0, o.takeNext().intValue());

    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    o.dispose();

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();

    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();
  }

  @Test public void changeEvents() {
    RecordingObserver<SeekBarChangeEvent> o = new RecordingObserver<>();
    RxSeekBar.changeEvents(seekBar) //
        .subscribeOn(AndroidSchedulers.mainThread()) //
        .subscribe(o);
    assertEquals(new SeekBarProgressChangeEvent(seekBar, 0, false), o.takeNext());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
    instrumentation.waitForIdleSync();
    assertEquals(new SeekBarStartChangeEvent(seekBar), o.takeNext());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));
    instrumentation.waitForIdleSync();
    assertEquals(new SeekBarProgressChangeEvent(seekBar, 100, true), o.takeNext());

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_UP, 100, 50));
    instrumentation.waitForIdleSync();
    assertEquals(new SeekBarStopChangeEvent(seekBar), o.takeNext());

    instrumentation.runOnMainSync(() -> seekBar.setProgress(0));
    instrumentation.waitForIdleSync();
    assertEquals(new SeekBarProgressChangeEvent(seekBar, 0, false), o.takeNext());

    o.dispose();

    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));
    instrumentation.waitForIdleSync();
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.SeekBar;

public final class RxSeekBarTestActivity extends Activity {
  SeekBar seekBar;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    seekBar = new SeekBar(this);
    setContentView(seekBar);
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.content.Context;
import android.widget.TextView;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import com.jakewharton.rxbinding4.RecordingObserver;
import org.junit.Test;

import static android.view.inputmethod.EditorInfo.IME_ACTION_GO;
import static android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;

public final class RxTextViewTest {
  private final Context context = ApplicationProvider.getApplicationContext();
  private final TextView view = new TextView(context);

  @Test @UiThreadTest public void editorActions() {
    RecordingObserver<Integer> o = new RecordingObserver<>();
    RxTextView.editorActions(view).subscribe(o);
    o.assertNoMoreEvents();

    view.onEditorAction(IME_ACTION_GO);
    assertEquals(IME_ACTION_GO, o.takeNext().intValue());

    view.onEditorAction(IME_ACTION_NEXT);
    assertEquals(IME_ACTION_NEXT, o.takeNext().intValue());

    o.dispose();

    view.onEditorAction(IME_ACTION_GO);
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void editorActionEvents() {
    RecordingObserver<TextViewEditorActionEvent> o = new RecordingObserver<>();
    RxTextView.editorActionEvents(view).subscribe(o);
    o.assertNoMoreEvents();

    view.onEditorAction(IME_ACTION_GO);
    TextViewEditorActionEvent event1 = o.takeNext();
    assertSame(view, event1.getView());
    assertEquals(IME_ACTION_GO, event1.getActionId());
    assertNull(event1.getKeyEvent());

    view.onEditorAction(IME_ACTION_NEXT);
    TextViewEditorActionEvent event2 = o.takeNext();
    assertSame(view, event2.getView());
    assertEquals(IME_ACTION_NEXT, event2.getActionId());
    assertNull(event2.getKeyEvent()); // TODO figure out a user event?

    o.dispose();

    view.onEditorAction(IME_ACTION_GO);
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void textChanges() {
    view.setText("Initial");

    RecordingObserver<CharSequence> o = new RecordingObserver<>();
    RxTextView.textChanges(view).subscribe(o);
    assertEquals("Initial", o.takeNext().toString());

    view.setText("H");
    assertEquals("H", o.takeNext().toString());
    view.setText("He");
    assertEquals("He", o.takeNext().toString());

    view.setText(null); // Internally coerced to empty string.
    assertEquals("", o.takeNext().toString());

    o.dispose();

    view.setText("Silent");
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void textChangeEvents() {
    view.setText("Initial");

    RecordingObserver<TextViewTextChangeEvent> o = new RecordingObserver<>();
    RxTextView.textChangeEvents(view).subscribe(o);
    TextViewTextChangeEvent event0 = o.takeNext();
    assertSame(view, event0.getView());
    assertEquals("Initial", event0.getText().toString());
    assertEquals(0, event0.getStart());
    assertEquals(0, event0.getBefore());
    assertEquals(0, event0.getCount());

    view.setText("H");
    TextViewTextChangeEvent event1 = o.takeNext();
    assertSame(view, event1.getView());
    assertEquals("H", event1.getText().toString());
    assertEquals(0, event1.getStart());
    assertEquals(7, event1.getBefore());
    assertEquals(1, event1.getCount());

    view.setText("He");
    TextViewTextChangeEvent event2 = o.takeNext();
    assertSame(view, event2.getView());
    assertEquals("He", event2.getText().toString());
    assertEquals(0, event2.getStart());
    assertEquals(1, event2.getBefore());
    assertEquals(2, event2.getCount());

    o.dispose();

    view.setText("Silent");
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void beforeTextChangeEvents() {
    view.setText("Initial");

    RecordingObserver<TextViewBeforeTextChangeEvent> o = new RecordingObserver<>();
    RxTextView.beforeTextChangeEvents(view).subscribe(o);
    TextViewBeforeTextChangeEvent event0 = o.takeNext();
    assertSame(view, event0.getView());
    assertEquals("Initial", event0.getText().toString());
    assertEquals(0, event0.getStart());
    assertEquals(0, event0.getCount());
    assertEquals(0, event0.getAfter());

    view.setText("H");
    TextViewBeforeTextChangeEvent event1 = o.takeNext();
    assertSame(view, event1.getView());
    assertEquals("Initial", event1.getText().toString());
    assertEquals(0, event1.getStart());
    assertEquals(7, event1.getCount());
    assertEquals(1, event1.getAfter());

    view.setText("He");
    TextViewBeforeTextChangeEvent event2 = o.takeNext();
    assertSame(view, event2.getView());
    assertEquals("H", event2.getText().toString());
    assertEquals(0, event2.getStart());
    assertEquals(1, event2.getCount());
    assertEquals(2, event2.getAfter());

    o.dispose();

    view.setText("Silent");
    o.assertNoMoreEvents();
  }

  @Test @UiThreadTest public void afterTextChangeEvents() {
    view.setText("Initial");

    RecordingObserver<TextViewAfterTextChangeEvent> o = new RecordingObserver<>();
    RxTextView.afterTextChangeEvents(view).subscribe(o);
    TextViewAfterTextChangeEvent event0 = o.takeNext();
    assertSame(view, event0.getView());
    assertEquals(null, event0.getEditable());

    view.setText("H");
    TextViewAfterTextChangeEvent event1 = o.takeNext();
    assertSame(view, event1.getView());
    assertEquals("H", event1.getEditable().toString());

    view.setText("He");
    TextViewAfterTextChangeEvent event2 = o.takeNext();
    assertSame(view, event2.getView());
    assertEquals("He", event2.getEditable().toString());

    o.dispose();

    view.setText("Silent");
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toolbar;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SdkSuppress;
import androidx.test.rule.ActivityTestRule;
import com.jakewharton.rxbinding4.RecordingObserver;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static com.jakewharton.rxbinding4.widget.RxToolbarTestActivity.NAVIGATION_CONTENT_DESCRIPTION;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;

@SdkSuppress(minSdkVersion = 21)
public final class RxToolbarTest {
  @Rule public final ActivityTestRule<RxToolbarTestActivity> activityRule =
      new ActivityTestRule<>(RxToolbarTestActivity.class);

  private Toolbar view;

  @Before public void setUp() {
    RxToolbarTestActivity activity = activityRule.getActivity();
    view = activity.toolbar;
  }

  @Test @UiThreadTest public void itemClicks() {
    Menu menu = view.getMenu();
    MenuItem item1 = menu.add(0, 1, 0, "Hi");
    MenuItem item2 = menu.add(0, 2, 0, "Hey");

    RecordingObserver<MenuItem> o = new RecordingObserver<>();
    RxToolbar.itemClicks(view).subscribe(o);
    o.assertNoMoreEvents();

    menu.performIdentifierAction(2, 0);
    assertSame(item2, o.takeNext());

    menu.performIdentifierAction(1, 0);
    assertSame(item1, o.takeNext());

    o.dispose();

    menu.performIdentifierAction(2, 0);
    o.assertNoMoreEvents();
  }

  @Test public void navigationClicks() {
    RecordingObserver<Object> o = new RecordingObserver<>();
    RxToolbar.navigationClicks(view)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(o);
    o.assertNoMoreEvents(); // No initial value.

    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());
    assertNotNull(o.takeNext());

    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());
    assertNotNull(o.takeNext());

    o.dispose();

    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());
    o.assertNoMoreEvents();
  }
}


================================================
FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java
================================================
package com.jakewharton.rxbinding4.widget;

import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toolbar;

@TargetApi(21)
public final class RxToolbarTestActivity extends Activity {
  static final String NAVIGATION_CONTENT_DESCRIPTION = "click me!";

  Toolbar toolbar;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    toolbar = new Toolbar(this);
    toolbar.setNavigationContentDescription(NAVIGATION_CONTENT_DESCRIPTION);
    toolbar.setNavigationIcon(android.R.drawable.sym_def_app_icon);
    setContentView(toolbar);
  }
}


================================================
FILE: rxbinding/src/androidTest/res/drawable/icon.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<color
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:color="#008800"
  />


================================================
FILE: rxbinding/src/androidTest/res/values/ids.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <item type="id" name="auto_complete"/>
</resources>


================================================
FILE: rxbinding/src/androidTest/res/values/strings.xml
================================================
<resources>
  <string name="hey">Hey</string>
  <string name="ouch">Ouch</string>
  <string name="hint">Your name here</string>
</resources>


================================================
FILE: rxbinding/src/main/AndroidManifest.xml
================================================
<manifest package="com.jakewharton.rxbinding4"/>


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt
================================================
package com.jakewharton.rxbinding4

import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer

abstract class InitialValueObservable<T> : Observable<T>() {
  protected abstract val initialValue: T

  override fun subscribeActual(observer: Observer<in T>) {
    subscribeListener(observer)
    observer.onNext(initialValue)
  }

  protected abstract fun subscribeListener(observer: Observer<in T>)

  fun skipInitialValue(): Observable<T> = Skipped()

  private inner class Skipped : Observable<T>() {
    override fun subscribeActual(observer: Observer<in T>) {
      subscribeListener(observer)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/mainThread.kt
================================================
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
@file:JvmName("Preconditions")

package com.jakewharton.rxbinding4.internal

import android.os.Looper
import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.disposables.Disposable

@RestrictTo(LIBRARY_GROUP)
fun checkMainThread(observer: Observer<*>): Boolean {
  if (Looper.myLooper() != Looper.getMainLooper()) {
    observer.onSubscribe(Disposable.empty())
    observer.onError(IllegalStateException(
        "Expected to be called on the main thread but was " + Thread.currentThread().name))
    return false
  }
  return true
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/true.kt
================================================
package com.jakewharton.rxbinding4.internal

import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP

@RestrictTo(LIBRARY_GROUP)
object AlwaysTrue : () -> Boolean, (Any) -> Boolean {
  override fun invoke() = true
  override fun invoke(ignored: Any) = true
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEvent.kt
================================================
package com.jakewharton.rxbinding4.view

import android.content.Context
import android.view.MenuItem

/**
 * An action view event on a menu item.
 *
 * **Warning:** Instances keep a strong reference to the menu item. Operators that
 * cache instances have the potential to leak the associated [Context].
 */
sealed class MenuItemActionViewEvent {
  /** The menu item from which this event occurred.  */
  abstract val menuItem: MenuItem
}

data class MenuItemActionViewCollapseEvent(
  override val menuItem: MenuItem
) : MenuItemActionViewEvent()

data class MenuItemActionViewExpandEvent(
  override val menuItem: MenuItem
) : MenuItemActionViewEvent()


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEventObservable.kt
================================================
@file:JvmName("RxMenuItem")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.MenuItem
import android.view.MenuItem.OnActionExpandListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of action view events for `menuItem`.
 *
 * *Warning:* The created observable keeps a strong reference to `menuItem`.
 * Unsubscribe to free this reference.
 *
 * *Warning:* The created observable uses [MenuItem.setOnActionExpandListener] to
 * observe action view events. Only one observable can be used for a menu item at a time.
 *
 * @param handled Function invoked with each value to determine the return value of the
 * underlying [MenuItem.OnActionExpandListener].
 */
@CheckResult
@JvmOverloads
fun MenuItem.actionViewEvents(
  handled: (MenuItemActionViewEvent) -> Boolean = AlwaysTrue
): Observable<MenuItemActionViewEvent> {
  return MenuItemActionViewEventObservable(this, handled)
}

private class MenuItemActionViewEventObservable(
  private val menuItem: MenuItem,
  private val handled: (MenuItemActionViewEvent) -> Boolean
) : Observable<MenuItemActionViewEvent>() {

  override fun subscribeActual(observer: Observer<in MenuItemActionViewEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(menuItem, handled, observer)
    observer.onSubscribe(listener)
    menuItem.setOnActionExpandListener(listener)
  }

  private class Listener(
    private val menuItem: MenuItem,
    private val handled: (MenuItemActionViewEvent) -> Boolean,
    private val observer: Observer<in MenuItemActionViewEvent>
  ) : MainThreadDisposable(), OnActionExpandListener {

    override fun onMenuItemActionExpand(item: MenuItem): Boolean {
      return onEvent(MenuItemActionViewExpandEvent(item))
    }

    override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
      return onEvent(MenuItemActionViewCollapseEvent(item))
    }

    private fun onEvent(event: MenuItemActionViewEvent): Boolean {
      if (!isDisposed) {
        try {
          if (handled(event)) {
            observer.onNext(event)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      menuItem.setOnActionExpandListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemClickObservable.kt
================================================
@file:JvmName("RxMenuItem")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.MenuItem
import android.view.MenuItem.OnMenuItemClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `menuItem` click events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `menuItem`.
 * Unsubscribe to free this reference.
 *
 * *Warning:* The created observable uses [MenuItem.setOnMenuItemClickListener] to
 * observe clicks. Only one observable can be used for a menu item at a time.
 *
 * @param handled Function invoked with each value to determine the return value of the
 * underlying [MenuItem.OnMenuItemClickListener].
 */
@CheckResult
@JvmOverloads
fun MenuItem.clicks(handled: (MenuItem) -> Boolean = AlwaysTrue): Observable<Unit> {
  return MenuItemClickObservable(this, handled)
}

private class MenuItemClickObservable(
  private val menuItem: MenuItem,
  private val handled: (MenuItem) -> Boolean
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(menuItem, handled, observer)
    observer.onSubscribe(listener)
    menuItem.setOnMenuItemClickListener(listener)
  }

  private class Listener(
    private val menuItem: MenuItem,
    private val handled: (MenuItem) -> Boolean,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnMenuItemClickListener {

    override fun onMenuItemClick(item: MenuItem): Boolean {
      if (!isDisposed) {
        try {
          if (handled(menuItem)) {
            observer.onNext(Unit)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      menuItem.setOnMenuItemClickListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEvent.kt
================================================
package com.jakewharton.rxbinding4.view

import android.content.Context
import android.view.View

/**
 * A view attach event on a view.
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that
 * cache instances have the potential to leak the associated [Context].
 */
sealed class ViewAttachEvent {
  /** The view from which this event occurred.  */
  abstract val view: View
}

/**
 * A view attached event on a view.
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that cache
 * instances have the potential to leak the associated [Context].
 */
data class ViewAttachAttachedEvent(
  override val view: View
) : ViewAttachEvent()

/**
 * A view detached event on a view.
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that cache
 * instances have the potential to leak the associated [Context].
 */
data class ViewAttachDetachedEvent(
  override val view: View
) : ViewAttachEvent()


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEventObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnAttachStateChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of attach and detach events on `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun View.attachEvents(): Observable<ViewAttachEvent> {
  return ViewAttachEventObservable(this)
}

private class ViewAttachEventObservable(
  private val view: View
) : Observable<ViewAttachEvent>() {

  override fun subscribeActual(observer: Observer<in ViewAttachEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.addOnAttachStateChangeListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in ViewAttachEvent>
  ) : MainThreadDisposable(), OnAttachStateChangeListener {

    override fun onViewAttachedToWindow(v: View) {
      if (!isDisposed) {
        observer.onNext(ViewAttachAttachedEvent(view))
      }
    }

    override fun onViewDetachedFromWindow(v: View) {
      if (!isDisposed) {
        observer.onNext(ViewAttachDetachedEvent(view))
      }
    }

    override fun onDispose() {
      view.removeOnAttachStateChangeListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachesObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnAttachStateChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `view` attach events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun View.attaches(): Observable<Unit> {
  return ViewAttachesObservable(this, true)
}

/**
 * Create an observable which emits on `view` detach events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun View.detaches(): Observable<Unit> {
  return ViewAttachesObservable(this, false)
}

private class ViewAttachesObservable(
  private val view: View,
  private val callOnAttach: Boolean
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, callOnAttach, observer)
    observer.onSubscribe(listener)
    view.addOnAttachStateChangeListener(listener)
  }

  private class Listener(
    private val view: View,
    private val callOnAttach: Boolean,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnAttachStateChangeListener {

    override fun onViewAttachedToWindow(v: View) {
      if (callOnAttach && !isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onViewDetachedFromWindow(v: View) {
      if (!callOnAttach && !isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      view.removeOnAttachStateChangeListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewClickObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `view` click events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [View.setOnClickListener] to observe
 * clicks. Only one observable can be used for a view at a time.
 */
@CheckResult
fun View.clicks(): Observable<Unit> {
  return ViewClickObservable(this)
}

private class ViewClickObservable(
  private val view: View
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.setOnClickListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnClickListener {

    override fun onClick(v: View) {
      if (!isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      view.setOnClickListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewDragObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.DragEvent
import android.view.View
import android.view.View.OnDragListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of [DragEvent] for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [View.setOnDragListener] to observe
 * drags. Only one observable can be used for a view at a time.
 *
 * @param handled Predicate invoked with each value to determine the return value of the
 * underlying [View.OnDragListener].
 */
@CheckResult
@JvmOverloads
fun View.drags(handled: (DragEvent) -> Boolean = AlwaysTrue): Observable<DragEvent> {
  return ViewDragObservable(this, handled)
}

private class ViewDragObservable(
  private val view: View,
  private val handled: (DragEvent) -> Boolean
) : Observable<DragEvent>() {

  override fun subscribeActual(observer: Observer<in DragEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, handled, observer)
    observer.onSubscribe(listener)
    view.setOnDragListener(listener)
  }

  private class Listener(
    private val view: View,
    private val handled: (DragEvent) -> Boolean,
    private val observer: Observer<in DragEvent>
  ) : MainThreadDisposable(), OnDragListener {

    override fun onDrag(v: View, event: DragEvent): Boolean {
      if (!isDisposed) {
        try {
          if (handled(event)) {
            observer.onNext(event)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.setOnDragListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewFocusChangeObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnFocusChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

/**
 * Create an observable of booleans representing the focus of `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [View.setOnFocusChangeListener] to observe
 * focus change. Only one observable can be used for a view at a time.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun View.focusChanges(): InitialValueObservable<Boolean> {
  return ViewFocusChangeObservable(this)
}

private class ViewFocusChangeObservable(
  private val view: View
) : InitialValueObservable<Boolean>() {

  override val initialValue: Boolean
    get() = view.hasFocus()

  override fun subscribeListener(observer: Observer<in Boolean>) {
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.onFocusChangeListener = listener
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Boolean>
  ) : MainThreadDisposable(), OnFocusChangeListener {

    override fun onFocusChange(v: View, hasFocus: Boolean) {
      if (!isDisposed) {
        observer.onNext(hasFocus)
      }
    }

    override fun onDispose() {
      view.onFocusChangeListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEvent.kt
================================================
package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.ViewGroup

sealed class ViewGroupHierarchyChangeEvent {
  /** The view from which this event occurred.  */
  abstract val view: ViewGroup

  /** The child from which this event occurred.  */
  abstract val child: View
}

/**
 * A child view add event on a [ViewGroup].
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that cache
 * instances have the potential to leak the associated [android.content.Context].
 */
data class ViewGroupHierarchyChildViewAddEvent(
  override val view: ViewGroup,
  override val child: View
) : ViewGroupHierarchyChangeEvent()

/**
 * A child view remove event on a [ViewGroup].
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that cache
 * instances have the potential to leak the associated [android.content.Context].
 */
data class ViewGroupHierarchyChildViewRemoveEvent(
  override val view: ViewGroup,
  override val child: View
) : ViewGroupHierarchyChangeEvent()


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEventObservable.kt
================================================
@file:JvmName("RxViewGroup")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.OnHierarchyChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of hierarchy change events for `viewGroup`.
 *
 * *Warning:* The created observable keeps a strong reference to `viewGroup`.
 * Unsubscribe to free this reference.
 */
@CheckResult
fun ViewGroup.changeEvents(): Observable<ViewGroupHierarchyChangeEvent> {
  return ViewGroupHierarchyChangeEventObservable(this)
}

private class ViewGroupHierarchyChangeEventObservable(
  private val viewGroup: ViewGroup
) : Observable<ViewGroupHierarchyChangeEvent>() {

  override fun subscribeActual(observer: Observer<in ViewGroupHierarchyChangeEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(viewGroup, observer)
    observer.onSubscribe(listener)
    viewGroup.setOnHierarchyChangeListener(listener)
  }

  private class Listener(
    private val viewGroup: ViewGroup,
    private val observer: Observer<in ViewGroupHierarchyChangeEvent>
  ) : MainThreadDisposable(), OnHierarchyChangeListener {

    override fun onChildViewAdded(parent: View, child: View) {
      if (!isDisposed) {
        observer.onNext(ViewGroupHierarchyChildViewAddEvent(viewGroup, child))
      }
    }

    override fun onChildViewRemoved(parent: View, child: View) {
      if (!isDisposed) {
        observer.onNext(ViewGroupHierarchyChildViewRemoveEvent(viewGroup, child))
      }
    }

    override fun onDispose() {
      viewGroup.setOnHierarchyChangeListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewHoverObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.MotionEvent
import android.view.View
import android.view.View.OnHoverListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import com.jakewharton.rxbinding4.internal.checkMainThread
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

/**
 * Create an observable of hover events for `view`.
 *
 * *Warning:* Values emitted by this observable are **mutable** and part of a shared
 * object pool and thus are **not safe** to cache or delay reading (such as by observing
 * on a different thread). If you want to cache or delay reading the items emitted then you must
 * map values through a function which calls [MotionEvent.obtain] or
 * [MotionEvent.obtainNoHistory] to create a copy.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [View.setOnHoverListener] to observe
 * touches. Only one observable can be used for a view at a time.
 *
 * @param handled Predicate invoked with each value to determine the return value of the
 * underlying [View.OnHoverListener].
 */
@CheckResult
@JvmOverloads
fun View.hovers(
  handled: (MotionEvent) -> Boolean = AlwaysTrue
): Observable<MotionEvent> {
  return ViewHoverObservable(this, handled)
}

private class ViewHoverObservable(
  private val view: View,
  private val handled: (MotionEvent) -> Boolean
) : Observable<MotionEvent>() {

  override fun subscribeActual(observer: Observer<in MotionEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, handled, observer)
    observer.onSubscribe(listener)
    view.setOnHoverListener(listener)
  }

  private class Listener(
    private val view: View, private val handled: (MotionEvent) -> Boolean,
    private val observer: Observer<in MotionEvent>
  ) : MainThreadDisposable(), OnHoverListener {

    override fun onHover(v: View, event: MotionEvent): Boolean {
      if (!isDisposed) {
        try {
          if (handled(event)) {
            observer.onNext(event)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.setOnHoverListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewKeyObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.KeyEvent
import android.view.View
import android.view.View.OnKeyListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of key events for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 * *Warning:* The created observable uses [View.setOnKeyListener] to observe
 * key events. Only one observable can be used for a view at a time.
 *
 * @param handled Predicate invoked each occurrence to determine the return value of the
 * underlying [View.OnKeyListener].
 */
@CheckResult
@JvmOverloads
fun View.keys(handled: (KeyEvent) -> Boolean = AlwaysTrue): Observable<KeyEvent> {
  return ViewKeyObservable(this, handled)
}

private class ViewKeyObservable(
  private val view: View,
  private val handled: (KeyEvent) -> Boolean
) : Observable<KeyEvent>() {

  override fun subscribeActual(observer: Observer<in KeyEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, handled, observer)
    observer.onSubscribe(listener)
    view.setOnKeyListener(listener)
  }

  private class Listener(
    private val view: View,
    private val handled: (KeyEvent) -> Boolean,
    private val observer: Observer<in KeyEvent>
  ) : MainThreadDisposable(), OnKeyListener {

    override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean {
      if (!isDisposed) {
        try {
          if (handled(event)) {
            observer.onNext(event)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.setOnKeyListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeEventObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.content.Context
import android.view.View
import android.view.View.OnLayoutChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of layout-change events for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun View.layoutChangeEvents(): Observable<ViewLayoutChangeEvent> {
  return ViewLayoutChangeEventObservable(this)
}

/**
 * A layout-change event on a view.
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that cache
 * instances have the potential to leak the associated [Context].
 */
data class ViewLayoutChangeEvent(
  /** The view from which this event occurred. */
  val view: View,
  val left: Int,
  val top: Int,
  val right: Int,
  val bottom: Int,
  val oldLeft: Int,
  val oldTop: Int,
  val oldRight: Int,
  val oldBottom: Int
)

/**
 * A scroll-change event on a view.
 *
 * **Warning:** Instances keep a strong reference to the view. Operators that cache
 * instances have the potential to leak the associated [android.content.Context].
 */
data class ViewScrollChangeEvent(
  /** The view from which this event occurred.  */
  val view: View,
  val scrollX: Int,
  val scrollY: Int,
  val oldScrollX: Int,
  val oldScrollY: Int
)

private class ViewLayoutChangeEventObservable(
  private val view: View
) : Observable<ViewLayoutChangeEvent>() {

  override fun subscribeActual(observer: Observer<in ViewLayoutChangeEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.addOnLayoutChangeListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in ViewLayoutChangeEvent>
  ) : MainThreadDisposable(), OnLayoutChangeListener {

    override fun onLayoutChange(
      v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int,
      oldTop: Int, oldRight: Int, oldBottom: Int
    ) {
      if (!isDisposed) {
        observer.onNext(
            ViewLayoutChangeEvent(v, left, top, right, bottom, oldLeft, oldTop, oldRight,
                oldBottom))
      }
    }

    override fun onDispose() {
      view.removeOnLayoutChangeListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnLayoutChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `view` layout changes. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun View.layoutChanges(): Observable<Unit> {
  return ViewLayoutChangeObservable(this)
}

private class ViewLayoutChangeObservable(
  private val view: View
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.addOnLayoutChangeListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnLayoutChangeListener {

    override fun onLayoutChange(
      v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int,
      oldTop: Int, oldRight: Int, oldBottom: Int
    ) {
      if (!isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      view.removeOnLayoutChangeListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLongClickObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnLongClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import java.util.concurrent.Callable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `view` long-click events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [View.setOnLongClickListener] to observe
 * long clicks. Only one observable can be used for a view at a time.
 *
 * @param handled Predicate invoked each occurrence to determine the return value of the
 * underlying [View.OnLongClickListener].
 */
@CheckResult
@JvmOverloads
fun View.longClicks(handled: () -> Boolean = AlwaysTrue): Observable<Unit> {
  return ViewLongClickObservable(this, handled)
}

private class ViewLongClickObservable(
  private val view: View,
  private val handled: () -> Boolean
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, handled, observer)
    observer.onSubscribe(listener)
    view.setOnLongClickListener(listener)
  }

  private class Listener(
    private val view: View,
    private val handled: () -> Boolean,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnLongClickListener {

    override fun onLongClick(v: View): Boolean {
      if (!isDisposed) {
        try {
          if (handled()) {
            observer.onNext(Unit)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.setOnLongClickListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewScrollChangeEventObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import androidx.annotation.RequiresApi
import android.view.View
import android.view.View.OnScrollChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of scroll-change events for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@RequiresApi(23)
@CheckResult
fun View.scrollChangeEvents(): Observable<ViewScrollChangeEvent> {
  return ViewScrollChangeEventObservable(this)
}

@RequiresApi(23)
private class ViewScrollChangeEventObservable(
  private val view: View
) : Observable<ViewScrollChangeEvent>() {

  override fun subscribeActual(observer: Observer<in ViewScrollChangeEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.setOnScrollChangeListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in ViewScrollChangeEvent>
  ) : MainThreadDisposable(), OnScrollChangeListener {

    override fun onScrollChange(
      v: View,
      scrollX: Int,
      scrollY: Int,
      oldScrollX: Int,
      oldScrollY: Int
    ) {
      if (!isDisposed) {
        observer.onNext(ViewScrollChangeEvent(v, scrollX, scrollY, oldScrollX, oldScrollY))
      }
    }

    override fun onDispose() {
      view.setOnScrollChangeListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewSystemUiVisibilityChangeObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.View.OnSystemUiVisibilityChangeListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of integers representing a new system UI visibility for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses
 * [View.setOnSystemUiVisibilityChangeListener] to observe system UI visibility changes.
 * Only one observable can be used for a view at a time.
 */
@CheckResult
fun View.systemUiVisibilityChanges(): Observable<Int> {
  return ViewSystemUiVisibilityChangeObservable(this)
}

private class ViewSystemUiVisibilityChangeObservable(
  private val view: View
) : Observable<Int>() {

  override fun subscribeActual(observer: Observer<in Int>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.setOnSystemUiVisibilityChangeListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Int>
  ) : MainThreadDisposable(), OnSystemUiVisibilityChangeListener {

    override fun onSystemUiVisibilityChange(visibility: Int) {
      if (!isDisposed) {
        observer.onNext(visibility)
      }
    }

    override fun onDispose() {
      view.setOnSystemUiVisibilityChangeListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTouchObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.MotionEvent
import android.view.View
import android.view.View.OnTouchListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of touch events for `view`.
 *
 *
 * *Warning:* Values emitted by this observable are **mutable** and part of a shared
 * object pool and thus are **not safe** to cache or delay reading (such as by observing
 * on a different thread). If you want to cache or delay reading the items emitted then you must
 * map values through a function which calls [MotionEvent.obtain] or
 * [MotionEvent.obtainNoHistory] to create a copy.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [View.setOnTouchListener] to observe
 * touches. Only one observable can be used for a view at a time.
 *
 * @param handled Predicate invoked with each value to determine the return value of the
 * underlying [View.OnTouchListener].
 */
@CheckResult
@JvmOverloads
fun View.touches(
  handled: (MotionEvent) -> Boolean = AlwaysTrue
): Observable<MotionEvent> {
  return ViewTouchObservable(this, handled)
}

private class ViewTouchObservable(
  private val view: View,
  private val handled: (MotionEvent) -> Boolean
) : Observable<MotionEvent>() {

  override fun subscribeActual(observer: Observer<in MotionEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, handled, observer)
    observer.onSubscribe(listener)
    view.setOnTouchListener(listener)
  }

  private class Listener(
    private val view: View,
    private val handled: (MotionEvent) -> Boolean,
    private val observer: Observer<in MotionEvent>
  ) : MainThreadDisposable(), OnTouchListener {

    override fun onTouch(v: View, event: MotionEvent): Boolean {
      if (!isDisposed) {
        try {
          if (handled(event)) {
            observer.onNext(event)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.setOnTouchListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverDrawObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import androidx.annotation.RequiresApi
import android.view.View
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnDrawListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable for draws on `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [ViewTreeObserver.addOnDrawListener] to
 * observe draws. Multiple observables can be used for a view at a time.
 */
@RequiresApi(16)
@CheckResult
fun View.draws(): Observable<Unit> {
  return ViewTreeObserverDrawObservable(this)
}

@RequiresApi(16)
private class ViewTreeObserverDrawObservable(
  private val view: View
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.viewTreeObserver
        .addOnDrawListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnDrawListener {

    override fun onDraw() {
      if (!isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      view.viewTreeObserver.removeOnDrawListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverGlobalLayoutObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnGlobalLayoutListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `view` globalLayout events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [ ][ViewTreeObserver.addOnGlobalLayoutListener] to observe global layouts. Multiple observables
 * can be used for a view at a time.
 */
@CheckResult
fun View.globalLayouts(): Observable<Unit> {
  return ViewTreeObserverGlobalLayoutObservable(this)
}

private class ViewTreeObserverGlobalLayoutObservable(
  private val view: View
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.viewTreeObserver
        .addOnGlobalLayoutListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnGlobalLayoutListener {

    override fun onGlobalLayout() {
      if (!isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      @Suppress("DEPRECATION") // Correct when minSdk 16.
      view.viewTreeObserver.removeGlobalOnLayoutListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverPreDrawObservable.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import android.view.View
import android.view.ViewTreeObserver
import android.view.ViewTreeObserver.OnPreDrawListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import java.util.concurrent.Callable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable for pre-draws on `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [ViewTreeObserver.addOnPreDrawListener] to
 * observe pre-draws. Multiple observables can be used for a view at a time.
 */
@CheckResult
fun View.preDraws(proceedDrawingPass: () -> Boolean): Observable<Unit> {
  return ViewTreeObserverPreDrawObservable(this, proceedDrawingPass)
}

private class ViewTreeObserverPreDrawObservable(
  private val view: View,
  private val proceedDrawingPass: () -> Boolean
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, proceedDrawingPass, observer)
    observer.onSubscribe(listener)
    view.viewTreeObserver
        .addOnPreDrawListener(listener)
  }

  private class Listener(
    private val view: View,
    private val proceedDrawingPass: () -> Boolean,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnPreDrawListener {

    override fun onPreDraw(): Boolean {
      if (!isDisposed) {
        observer.onNext(Unit)
        try {
          return proceedDrawingPass()
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return true
    }

    override fun onDispose() {
      view.viewTreeObserver.removeOnPreDrawListener(this)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewVisibilityConsumer.kt
================================================
@file:JvmName("RxView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.view

import androidx.annotation.CheckResult
import android.view.View
import io.reactivex.rxjava3.functions.Consumer

/**
 * An action which sets the visibility property of `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe to free this
 * reference.
 *
 * @param visibilityWhenFalse Visibility to set on a `false` value (`View.INVISIBLE` or
 * `View.GONE`).
 */
@CheckResult
@JvmOverloads
fun View.visibility(visibilityWhenFalse: Int = View.GONE): Consumer<in Boolean> {
  require(visibilityWhenFalse != View.VISIBLE) {
    "Setting visibility to VISIBLE when false would have no effect."
  }
  require(visibilityWhenFalse == View.INVISIBLE || visibilityWhenFalse == View.GONE) {
    "Must set visibility to INVISIBLE or GONE when false."
  }
  return Consumer { value -> visibility = if (value) View.VISIBLE else visibilityWhenFalse }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AbsListViewScrollEventObservable.kt
================================================
@file:JvmName("RxAbsListView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.widget.AbsListView
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of scroll events on `absListView`.
 *
 * *Warning:* The created observable keeps a strong reference to `absListView`.
 * Unsubscribe to free this reference.
 *
 * *Warning:* The created observable uses
 * [AbsListView.setOnScrollListener] to observe scroll
 * changes. Only one observable can be used for a view at a time.
 */
@CheckResult
fun AbsListView.scrollEvents(): Observable<AbsListViewScrollEvent> {
  return AbsListViewScrollEventObservable(this)
}

data class AbsListViewScrollEvent(
  /** The view from which this event occurred.  */
  val view: AbsListView,
  val scrollState: Int,
  val firstVisibleItem: Int,
  val visibleItemCount: Int,
  val totalItemCount: Int
)

private class AbsListViewScrollEventObservable(
  private val view: AbsListView
) : Observable<AbsListViewScrollEvent>() {

  override fun subscribeActual(observer: Observer<in AbsListViewScrollEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.setOnScrollListener(listener)
  }

  private class Listener(
    private val view: AbsListView,
    private val observer: Observer<in AbsListViewScrollEvent>
  ) : MainThreadDisposable(), AbsListView.OnScrollListener {
    private var currentScrollState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE

    override fun onScrollStateChanged(absListView: AbsListView, scrollState: Int) {
      currentScrollState = scrollState
      if (!isDisposed) {
        val event = AbsListViewScrollEvent(view, scrollState, view.firstVisiblePosition,
            view.childCount, view.count)
        observer.onNext(event)
      }
    }

    override fun onScroll(
      absListView: AbsListView, firstVisibleItem: Int, visibleItemCount: Int,
      totalItemCount: Int
    ) {
      if (!isDisposed) {
        val event = AbsListViewScrollEvent(view, currentScrollState, firstVisibleItem,
            visibleItemCount, totalItemCount)
        observer.onNext(event)
      }
    }

    override fun onDispose() {
      view.setOnScrollListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterDataChangeObservable.kt
================================================
@file:JvmName("RxAdapter")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.database.DataSetObserver
import android.widget.Adapter
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of data change events for `adapter`.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun <T : Adapter> T.dataChanges(): InitialValueObservable<T> {
  return AdapterDataChangeObservable(this)
}

private class AdapterDataChangeObservable<T : Adapter>(
  private val adapter: T
) : InitialValueObservable<T>() {

  override fun subscribeListener(observer: Observer<in T>) {
    if (!checkMainThread(observer)) {
      return
    }
    val disposableDataSetObserver = ObserverDisposable(initialValue, observer)
    initialValue.registerDataSetObserver(disposableDataSetObserver.dataSetObserver)
    observer.onSubscribe(disposableDataSetObserver)
  }

  override val initialValue get() = adapter

  private class ObserverDisposable<T : Adapter>(
    private val adapter: T,
    observer: Observer<in T>
  ) : MainThreadDisposable() {
    @JvmField val dataSetObserver = object : DataSetObserver() {
      override fun onChanged() {
        if (!isDisposed) {
          observer.onNext(adapter)
        }
      }
    }

    override fun onDispose() {
      adapter.unregisterDataSetObserver(dataSetObserver)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickEventObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the item click events for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun <T : Adapter> AdapterView<T>.itemClickEvents(): Observable<AdapterViewItemClickEvent> {
  return AdapterViewItemClickEventObservable(this)
}

data class AdapterViewItemClickEvent(
  /** The view from which this event occurred.  */
  val view: AdapterView<*>,
  val clickedView: View?,
  val position: Int,
  val id: Long
)

private class AdapterViewItemClickEventObservable(
  private val view: AdapterView<*>
) : Observable<AdapterViewItemClickEvent>() {

  override fun subscribeActual(observer: Observer<in AdapterViewItemClickEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.onItemClickListener = listener
  }

  private class Listener(
    private val view: AdapterView<*>,
    private val observer: Observer<in AdapterViewItemClickEvent>
  ) : MainThreadDisposable(), OnItemClickListener {

    override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
      if (!isDisposed) {
        observer.onNext(AdapterViewItemClickEvent(parent, view, position, id))
      }
    }

    override fun onDispose() {
      view.onItemClickListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the position of item clicks for `view`.
 *
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun <T : Adapter> AdapterView<T>.itemClicks(): Observable<Int> {
  return AdapterViewItemClickObservable(this)
}

private class AdapterViewItemClickObservable(
  private val view: AdapterView<*>
) : Observable<Int>() {

  override fun subscribeActual(observer: Observer<in Int>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.onItemClickListener = listener
  }

  private class Listener(
    private val view: AdapterView<*>,
    private val observer: Observer<in Int>
  ) : MainThreadDisposable(), OnItemClickListener {

    override fun onItemClick(adapterView: AdapterView<*>, view: View?, position: Int, id: Long) {
      if (!isDisposed) {
        observer.onNext(position)
      }
    }

    override fun onDispose() {
      view.onItemClickListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickEventObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemLongClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the item long-click events for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * @param handled Function invoked with each value to determine the return value of the
 * underlying [AdapterView.OnItemLongClickListener].
 */
@CheckResult
@JvmOverloads
fun <T : Adapter> AdapterView<T>.itemLongClickEvents(
  handled: (AdapterViewItemLongClickEvent) -> Boolean = AlwaysTrue
): Observable<AdapterViewItemLongClickEvent> {
  return AdapterViewItemLongClickEventObservable(this, handled)
}

data class AdapterViewItemLongClickEvent(
  /** The view from which this event occurred.  */
  val view: AdapterView<*>,
  val clickedView: View?,
  val position: Int,
  val id: Long
)

private class AdapterViewItemLongClickEventObservable(
  private val view: AdapterView<*>,
  private val handled: (AdapterViewItemLongClickEvent) -> Boolean
) : Observable<AdapterViewItemLongClickEvent>() {

  override fun subscribeActual(observer: Observer<in AdapterViewItemLongClickEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer, handled)
    observer.onSubscribe(listener)
    view.onItemLongClickListener = listener
  }

  private class Listener(
    private val view: AdapterView<*>,
    private val observer: Observer<in AdapterViewItemLongClickEvent>,
    private val handled: (AdapterViewItemLongClickEvent) -> Boolean
  ) : MainThreadDisposable(), OnItemLongClickListener {

    override fun onItemLongClick(
      parent: AdapterView<*>,
      view: View?,
      position: Int,
      id: Long
    ): Boolean {
      if (!isDisposed) {
        val event = AdapterViewItemLongClickEvent(parent, view, position, id)
        try {
          if (handled(event)) {
            observer.onNext(event)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.onItemLongClickListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemLongClickListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.AlwaysTrue
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable
import java.util.concurrent.Callable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the position of item long-clicks for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * @param handled Function invoked each occurrence to determine the return value of the
 * underlying [AdapterView.OnItemLongClickListener].
 */
@CheckResult
@JvmOverloads
fun <T : Adapter> AdapterView<T>.itemLongClicks(
  handled: () -> Boolean = AlwaysTrue
): Observable<Int> {
  return AdapterViewItemLongClickObservable(this, handled)
}

private class AdapterViewItemLongClickObservable(
  private val view: AdapterView<*>,
  private val handled: () -> Boolean
) : Observable<Int>() {

  override fun subscribeActual(observer: Observer<in Int>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer, handled)
    observer.onSubscribe(listener)
    view.onItemLongClickListener = listener
  }

  private class Listener(
    private val view: AdapterView<*>,
    private val observer: Observer<in Int>,
    private val handled: () -> Boolean
  ) : MainThreadDisposable(), OnItemLongClickListener {

    override fun onItemLongClick(
      parent: AdapterView<*>,
      view: View?,
      position: Int,
      id: Long
    ): Boolean {
      if (!isDisposed) {
        try {
          if (handled()) {
            observer.onNext(position)
            return true
          }
        } catch (e: Exception) {
          observer.onError(e)
          dispose()
        }

      }
      return false
    }

    override fun onDispose() {
      view.onItemLongClickListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemSelectionObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemSelectedListener
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import android.widget.AdapterView.INVALID_POSITION
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the selected position of `view`. If nothing is selected,
 * [AdapterView.INVALID_POSITION] will be emitted.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun <T : Adapter> AdapterView<T>.itemSelections(): InitialValueObservable<Int> {
  return AdapterViewItemSelectionObservable(this)
}

private class AdapterViewItemSelectionObservable(
  private val view: AdapterView<*>
) : InitialValueObservable<Int>() {

  override fun subscribeListener(observer: Observer<in Int>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    view.onItemSelectedListener = listener
    observer.onSubscribe(listener)
  }

  override val initialValue get() = view.selectedItemPosition

  private class Listener(
    private val view: AdapterView<*>,
    private val observer: Observer<in Int>
  ) : MainThreadDisposable(), OnItemSelectedListener {

    override fun onItemSelected(adapterView: AdapterView<*>, view: View?, position: Int, id: Long) {
      if (!isDisposed) {
        observer.onNext(position)
      }
    }

    override fun onNothingSelected(adapterView: AdapterView<*>) {
      if (!isDisposed) {
        observer.onNext(INVALID_POSITION)
      }
    }

    override fun onDispose() {
      view.onItemSelectedListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionEvent.kt
================================================
package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.AdapterView

sealed class AdapterViewSelectionEvent {
  /** The view from which this event occurred.  */
  abstract val view: AdapterView<*>
}

data class AdapterViewItemSelectionEvent(
  override val view: AdapterView<*>,
  val selectedView: View?,
  val position: Int,
  val id: Long
) : AdapterViewSelectionEvent()

data class AdapterViewNothingSelectionEvent(
  override val view: AdapterView<*>
) : AdapterViewSelectionEvent()


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionObservable.kt
================================================
@file:JvmName("RxAdapterView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.AdapterView.OnItemSelectedListener
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import android.widget.AdapterView.INVALID_POSITION
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of selection events for `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun <T : Adapter> AdapterView<T>.selectionEvents(): InitialValueObservable<AdapterViewSelectionEvent> {
  return AdapterViewSelectionObservable(this)
}

private class AdapterViewSelectionObservable(
  private val view: AdapterView<*>
) : InitialValueObservable<AdapterViewSelectionEvent>() {

  override fun subscribeListener(observer: Observer<in AdapterViewSelectionEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    view.onItemSelectedListener = listener
    observer.onSubscribe(listener)
  }

  override val initialValue: AdapterViewSelectionEvent
    get() {
      val selectedPosition = view.selectedItemPosition
      return if (selectedPosition == INVALID_POSITION) {
        AdapterViewNothingSelectionEvent(view)
      } else {
        val selectedView = view.selectedView
        val selectedId = view.selectedItemId
        AdapterViewItemSelectionEvent(view, selectedView, selectedPosition, selectedId)
      }
    }

  private class Listener(
    private val view: AdapterView<*>,
    private val observer: Observer<in AdapterViewSelectionEvent>
  ) : MainThreadDisposable(), OnItemSelectedListener {

    override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
      if (!isDisposed) {
        observer.onNext(AdapterViewItemSelectionEvent(parent, view, position, id))
      }
    }

    override fun onNothingSelected(parent: AdapterView<*>) {
      if (!isDisposed) {
        observer.onNext(AdapterViewNothingSelectionEvent(parent))
      }
    }

    override fun onDispose() {
      view.onItemSelectedListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AutoCompleteTextViewItemClickEventObservable.kt
================================================
@file:JvmName("RxAutoCompleteTextView")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.View
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import android.widget.AutoCompleteTextView
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of item click events on `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun AutoCompleteTextView.itemClickEvents(): Observable<AdapterViewItemClickEvent> {
  return AutoCompleteTextViewItemClickEventObservable(this)
}

private class AutoCompleteTextViewItemClickEventObservable(
  private val view: AutoCompleteTextView
) : Observable<AdapterViewItemClickEvent>() {

  override fun subscribeActual(observer: Observer<in AdapterViewItemClickEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.onItemClickListener = listener
  }

  private class Listener(
    private val view: AutoCompleteTextView,
    private val observer: Observer<in AdapterViewItemClickEvent>
  ) : MainThreadDisposable(), OnItemClickListener {

    override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
      if (!isDisposed) {
        observer.onNext(AdapterViewItemClickEvent(parent, view, position, id))
      }
    }

    override fun onDispose() {
      view.onItemClickListener = null
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/CompoundButtonCheckedChangeObservable.kt
================================================
@file:JvmName("RxCompoundButton")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.widget.CompoundButton
import android.widget.CompoundButton.OnCheckedChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of booleans representing the checked state of `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Warning:* The created observable uses [CompoundButton.setOnCheckedChangeListener]
 * to observe checked changes. Only one observable can be used for a view at a time.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun CompoundButton.checkedChanges(): InitialValueObservable<Boolean> {
  return CompoundButtonCheckedChangeObservable(this)
}

private class CompoundButtonCheckedChangeObservable(
  private val view: CompoundButton
) : InitialValueObservable<Boolean>() {

  override fun subscribeListener(observer: Observer<in Boolean>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.setOnCheckedChangeListener(listener)
  }

  override val initialValue get() = view.isChecked

  private class Listener(
    private val view: CompoundButton,
    private val observer: Observer<in Boolean>
  ) : MainThreadDisposable(), OnCheckedChangeListener {

    override fun onCheckedChanged(compoundButton: CompoundButton, isChecked: Boolean) {
      if (!isDisposed) {
        observer.onNext(isChecked)
      }
    }

    override fun onDispose() {
      view.setOnCheckedChangeListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuDismissObservable.kt
================================================
@file:JvmName("RxPopupMenu")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.widget.PopupMenu
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits on `view` dismiss events. The emitted value is
 * unspecified and should only be used as notification.
 *
 * *Warning:* The created observable keeps a strong reference to `view`.
 * Unsubscribe to free this reference.
 *
 * *Warning:* The created observable uses [PopupMenu.setOnDismissListener] to
 * observe dismiss change. Only one observable can be used for a view at a time.
 */
@CheckResult
fun PopupMenu.dismisses(): Observable<Unit> {
  return PopupMenuDismissObservable(this)
}

private class PopupMenuDismissObservable(
  private val view: PopupMenu
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    view.setOnDismissListener(listener)
    observer.onSubscribe(listener)
  }

  private class Listener(
    private val view: PopupMenu,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), PopupMenu.OnDismissListener {

    override fun onDismiss(popupMenu: PopupMenu) {
      if (!isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      view.setOnDismissListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuItemClickObservable.kt
================================================
@file:JvmName("RxPopupMenu")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.view.MenuItem
import android.widget.PopupMenu
import android.widget.PopupMenu.OnMenuItemClickListener
import androidx.annotation.CheckResult
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable which emits the clicked item in `view`'s menu.
 *
 * *Warning:* The created observable keeps a strong reference to `view`.
 * Unsubscribe to free this reference.
 *
 * *Warning:* The created observable uses [PopupMenu.setOnMenuItemClickListener]
 * to observe dismiss change. Only one observable can be used for a view at a time.
 */
@CheckResult
fun PopupMenu.itemClicks(): Observable<MenuItem> {
  return PopupMenuItemClickObservable(this)
}

private class PopupMenuItemClickObservable(
  private val view: PopupMenu
) : Observable<MenuItem>() {

  override fun subscribeActual(observer: Observer<in MenuItem>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    view.setOnMenuItemClickListener(listener)
    observer.onSubscribe(listener)
  }

  private class Listener(
    private val view: PopupMenu,
    private val observer: Observer<in MenuItem>
  ) : MainThreadDisposable(), OnMenuItemClickListener {

    override fun onMenuItemClick(menuItem: MenuItem): Boolean {
      if (!isDisposed) {
        observer.onNext(menuItem)
        return true
      }
      return false
    }

    override fun onDispose() {
      view.setOnMenuItemClickListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupCheckedChangeObservable.kt
================================================
@file:JvmName("RxRadioGroup")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.widget.RadioGroup
import android.widget.RadioGroup.OnCheckedChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the checked view ID changes in `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun RadioGroup.checkedChanges(): InitialValueObservable<Int> {
  return RadioGroupCheckedChangeObservable(this)
}

private class RadioGroupCheckedChangeObservable(
  private val view: RadioGroup
) : InitialValueObservable<Int>() {

  override fun subscribeListener(observer: Observer<in Int>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    view.setOnCheckedChangeListener(listener)
    observer.onSubscribe(listener)
  }

  override val initialValue get() = view.checkedRadioButtonId

  private class Listener(
    private val view: RadioGroup,
    private val observer: Observer<in Int>
  ) : MainThreadDisposable(), OnCheckedChangeListener {
    private var lastChecked = -1

    override fun onCheckedChanged(radioGroup: RadioGroup, checkedId: Int) {
      if (!isDisposed && checkedId != lastChecked) {
        lastChecked = checkedId
        observer.onNext(checkedId)
      }
    }

    override fun onDispose() {
      view.setOnCheckedChangeListener(null)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupToggleCheckedConsumer.kt
================================================
@file:JvmName("RxRadioGroup")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import androidx.annotation.CheckResult
import android.widget.RadioGroup
import io.reactivex.rxjava3.functions.Consumer

/**
 * An action which sets the checked child of `view` with ID. Passing `-1` will clear
 * any checked view.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 */
@CheckResult
fun RadioGroup.checked(): Consumer<in Int> {
  return Consumer { value ->
    if (value == -1) {
      clearCheck()
    } else {
      check(value!!)
    }
  }
}


================================================
FILE: rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeEventObservable.kt
================================================
@file:JvmName("RxRatingBar")
@file:JvmMultifileClass

package com.jakewharton.rxbinding4.widget

import android.widget.RatingBar
import android.widget.RatingBar.OnRatingBarChangeListener
import androidx.annotation.CheckResult
import com.jakewharton.rxbinding4.InitialValueObservable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.android.MainThreadDisposable

import com.jakewharton.rxbinding4.internal.checkMainThread

/**
 * Create an observable of the rating change events on `view`.
 *
 * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe
 * to free this reference.
 *
 * *Note:* A value will be emitted immediately on subscribe.
 */
@CheckResult
fun RatingBar.ratingChangeEvents(): InitialValueObservable<RatingBarChangeEvent> {
  return RatingBarRatingChangeEventObservable(this)
}

data class RatingBarChangeEvent(
  /** The view from which this event occurred.  */
  val view: RatingBar,
  val rating: Float,
  val fromUser: Boolean
)

private class RatingBarRatingChangeEventObservable(
  private val view: RatingBar
) : InitialValueObservable<RatingBarChangeEvent>() {

  override fun subscribeListener(observer: Observer<in RatingBarChangeEvent>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    view.onRatingBarChangeListener = listener
    observer.onSubscribe(listener)
  }

  override val initialValue get() = RatingBarChangeEvent(view, view.rating, false)

  private class Listener(
    private val view: RatingBar,
    private val observer: Observer<in RatingBarChangeEvent>
  ) : MainThreadDisposable(), OnRatingBarChangeListener {

    override fun onRatingChanged(ratingBar: RatingBar, rating: Float, fromUser: Boolean) {
      if (!isDisposed) {
        observer.onNext(RatingBarChangeEvent(ratingBar, rating, fromUser))
      }
    }

    override fun onDispose() {
      view.onRatingBarChangeListener = null
    }
  }
}


===============
Download .txt
gitextract_m_pj7wzf/

├── .github/
│   └── workflows/
│       └── build.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── RELEASING.md
├── build.gradle
├── gradle/
│   ├── gradle-mvn-push.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── rxbinding/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── jakewharton/
│       │   │           └── rxbinding4/
│       │   │               ├── internal/
│       │   │               │   └── MainThreadKtTest.java
│       │   │               ├── view/
│       │   │               │   ├── RxMenuItemTest.java
│       │   │               │   ├── RxViewAttachTest.java
│       │   │               │   ├── RxViewAttachTestActivity.java
│       │   │               │   ├── RxViewGroupTest.java
│       │   │               │   ├── RxViewSystemUiVisibilityTest.java
│       │   │               │   ├── RxViewSystemUiVisibilityTestActivity.java
│       │   │               │   └── RxViewTest.java
│       │   │               └── widget/
│       │   │                   ├── RxAbsListViewTest.java
│       │   │                   ├── RxAbsListViewTestActivity.java
│       │   │                   ├── RxAdapterTest.java
│       │   │                   ├── RxAdapterViewTest.java
│       │   │                   ├── RxAdapterViewTestActivity.java
│       │   │                   ├── RxAutoCompleteTextViewTest.java
│       │   │                   ├── RxAutoCompleteTextViewTestActivity.java
│       │   │                   ├── RxCompoundButtonTest.java
│       │   │                   ├── RxPopupMenuTest.java
│       │   │                   ├── RxPopupMenuTestActivity.java
│       │   │                   ├── RxRadioGroupTest.java
│       │   │                   ├── RxRatingBarTest.java
│       │   │                   ├── RxRatingBarTestActivity.java
│       │   │                   ├── RxSearchViewTest.java
│       │   │                   ├── RxSearchViewTestActivity.java
│       │   │                   ├── RxSeekBarTest.java
│       │   │                   ├── RxSeekBarTestActivity.java
│       │   │                   ├── RxTextViewTest.java
│       │   │                   ├── RxToolbarTest.java
│       │   │                   └── RxToolbarTestActivity.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   └── icon.xml
│       │       └── values/
│       │           ├── ids.xml
│       │           └── strings.xml
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           ├── InitialValueObservable.kt
│                           ├── internal/
│                           │   ├── mainThread.kt
│                           │   └── true.kt
│                           ├── view/
│                           │   ├── MenuItemActionViewEvent.kt
│                           │   ├── MenuItemActionViewEventObservable.kt
│                           │   ├── MenuItemClickObservable.kt
│                           │   ├── ViewAttachEvent.kt
│                           │   ├── ViewAttachEventObservable.kt
│                           │   ├── ViewAttachesObservable.kt
│                           │   ├── ViewClickObservable.kt
│                           │   ├── ViewDragObservable.kt
│                           │   ├── ViewFocusChangeObservable.kt
│                           │   ├── ViewGroupHierarchyChangeEvent.kt
│                           │   ├── ViewGroupHierarchyChangeEventObservable.kt
│                           │   ├── ViewHoverObservable.kt
│                           │   ├── ViewKeyObservable.kt
│                           │   ├── ViewLayoutChangeEventObservable.kt
│                           │   ├── ViewLayoutChangeObservable.kt
│                           │   ├── ViewLongClickObservable.kt
│                           │   ├── ViewScrollChangeEventObservable.kt
│                           │   ├── ViewSystemUiVisibilityChangeObservable.kt
│                           │   ├── ViewTouchObservable.kt
│                           │   ├── ViewTreeObserverDrawObservable.kt
│                           │   ├── ViewTreeObserverGlobalLayoutObservable.kt
│                           │   ├── ViewTreeObserverPreDrawObservable.kt
│                           │   └── ViewVisibilityConsumer.kt
│                           └── widget/
│                               ├── AbsListViewScrollEventObservable.kt
│                               ├── AdapterDataChangeObservable.kt
│                               ├── AdapterViewItemClickEventObservable.kt
│                               ├── AdapterViewItemClickObservable.kt
│                               ├── AdapterViewItemLongClickEventObservable.kt
│                               ├── AdapterViewItemLongClickObservable.kt
│                               ├── AdapterViewItemSelectionObservable.kt
│                               ├── AdapterViewSelectionEvent.kt
│                               ├── AdapterViewSelectionObservable.kt
│                               ├── AutoCompleteTextViewItemClickEventObservable.kt
│                               ├── CompoundButtonCheckedChangeObservable.kt
│                               ├── PopupMenuDismissObservable.kt
│                               ├── PopupMenuItemClickObservable.kt
│                               ├── RadioGroupCheckedChangeObservable.kt
│                               ├── RadioGroupToggleCheckedConsumer.kt
│                               ├── RatingBarRatingChangeEventObservable.kt
│                               ├── RatingBarRatingChangeObservable.kt
│                               ├── SearchViewQueryConsumer.kt
│                               ├── SearchViewQueryTextChangeEventsObservable.kt
│                               ├── SearchViewQueryTextChangesObservable.kt
│                               ├── SearchViewQueryTextEvent.kt
│                               ├── SeekBarChangeEvent.kt
│                               ├── SeekBarChangeEventObservable.kt
│                               ├── SeekBarChangeObservable.kt
│                               ├── TextViewAfterTextChangeEventObservable.kt
│                               ├── TextViewBeforeTextChangeEventObservable.kt
│                               ├── TextViewEditorActionEventObservable.kt
│                               ├── TextViewEditorActionObservable.kt
│                               ├── TextViewTextChangeEventObservable.kt
│                               ├── TextViewTextChangesObservable.kt
│                               ├── ToolbarItemClickObservable.kt
│                               └── ToolbarNavigationClickObservable.kt
├── rxbinding-appcompat/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── appcompat/
│       │                       ├── RxActionMenuViewTest.java
│       │                       ├── RxPopupMenuTest.java
│       │                       ├── RxPopupMenuTestActivity.java
│       │                       ├── RxSearchViewTest.java
│       │                       ├── RxSearchViewTestActivity.java
│       │                       ├── RxToolbarTest.java
│       │                       └── RxToolbarTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── appcompat/
│                               ├── ActionMenuViewItemClickObservable.kt
│                               ├── PopupMenuDismissObservable.kt
│                               ├── PopupMenuItemClickObservable.kt
│                               ├── SearchViewQueryTextChangeEventsObservable.kt
│                               ├── SearchViewQueryTextChangesObservable.kt
│                               ├── SearchViewQueryTextEvent.kt
│                               ├── SearchViewSetQueryConsumer.kt
│                               ├── ToolbarItemClickObservable.kt
│                               └── ToolbarNavigationClickObservable.kt
├── rxbinding-core/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── core/
│       │                       ├── RxNestedScrollViewTest.java
│       │                       └── RxNestedScrollViewTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── core/
│                               └── NestedScrollViewScrollChangeEventObservable.kt
├── rxbinding-drawerlayout/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── drawerlayout/
│       │                       ├── RxDrawerLayoutTest.java
│       │                       └── RxDrawerLayoutTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── drawerlayout/
│                               ├── DrawerLayoutDrawerOpenedObservable.kt
│                               └── DrawerLayoutOpenConsumer.kt
├── rxbinding-leanback/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── leanback/
│       │                       ├── RxSearchBarTest.java
│       │                       ├── RxSearchBarTestActivity.java
│       │                       ├── RxSearchEditTextTest.java
│       │                       └── RxSearchEditTextTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── leanback/
│                               ├── SearchBarSearchQueryChangeEventsObservable.kt
│                               ├── SearchBarSearchQueryChangesObservable.kt
│                               ├── SearchBarSearchQueryEvent.kt
│                               └── SearchEditTextKeyboardDismissObservable.kt
├── rxbinding-material/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── jakewharton/
│       │   │           └── rxbinding4/
│       │   │               └── material/
│       │   │                   ├── RxAppBarLayoutTest.java
│       │   │                   ├── RxBottomNavigationViewTest.java
│       │   │                   ├── RxChipTest.kt
│       │   │                   ├── RxFloatingActionButtonTest.java
│       │   │                   ├── RxNavigationViewTest.java
│       │   │                   ├── RxSnackbarTest.java
│       │   │                   ├── RxSwipeDismissBehaviorTest.java
│       │   │                   ├── RxSwipeDismissBehaviorTestActivity.java
│       │   │                   └── RxTabLayoutTest.java
│       │   └── res/
│       │       ├── menu/
│       │       │   └── menu.xml
│       │       └── values/
│       │           └── strings.xml
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── material/
│                               ├── AppBarLayoutOffsetChangeObservable.kt
│                               ├── BottomNavigationViewItemSelectionsObservable.kt
│                               ├── ChipCloseIconClicksObservable.kt
│                               ├── FloatingActionButtonVisibilityConsumer.kt
│                               ├── NavigationViewItemSelectionsObservable.kt
│                               ├── SnackbarDismissesObservable.kt
│                               ├── SwipeDismissBehaviorObservable.kt
│                               ├── TabLayoutSelectConsumer.kt
│                               ├── TabLayoutSelectionEvent.kt
│                               ├── TabLayoutSelectionEventObservable.kt
│                               └── TabLayoutSelectionsObservable.kt
├── rxbinding-recyclerview/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── recyclerview/
│       │                       ├── RxRecyclerViewAdapterTest.java
│       │                       ├── RxRecyclerViewTest.java
│       │                       └── RxRecyclerViewTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── recyclerview/
│                               ├── RecyclerAdapterDataChangeObservable.kt
│                               ├── RecyclerViewChildAttachStateChangeEventObservable.kt
│                               ├── RecyclerViewChildAttachStateChangeEvents.kt
│                               ├── RecyclerViewFlingEventObservable.kt
│                               ├── RecyclerViewScrollEventObservable.kt
│                               └── RecyclerViewScrollStateChangeObservable.kt
├── rxbinding-slidingpanelayout/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── slidingpanelayout/
│       │                       ├── RxSlidingPaneLayoutTest.java
│       │                       └── RxSlidingPaneLayoutTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── slidingpanelayout/
│                               ├── SlidingPaneLayoutOpenConsumer.kt
│                               ├── SlidingPaneLayoutPaneOpenedObservable.kt
│                               └── SlidingPaneLayoutSlideObservable.kt
├── rxbinding-swiperefreshlayout/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── jakewharton/
│       │   │           └── rxbinding4/
│       │   │               └── swiperefreshlayout/
│       │   │                   ├── RxSwipeRefreshLayoutTest.java
│       │   │                   └── RxSwipeRefreshLayoutTestActivity.java
│       │   └── res/
│       │       └── values/
│       │           └── ids.xml
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── swiperefreshlayout/
│                               └── SwipeRefreshLayoutRefreshObservable.kt
├── rxbinding-viewpager/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── viewpager/
│       │                       ├── RxViewPagerTest.java
│       │                       └── RxViewPagerTestActivity.java
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── viewpager/
│                               ├── ViewPagerPageScrollStateChangedObservable.kt
│                               ├── ViewPagerPageScrolledObservable.kt
│                               └── ViewPagerPageSelectedObservable.kt
├── rxbinding-viewpager2/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── androidTest/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── jakewharton/
│       │               └── rxbinding4/
│       │                   └── viewpager2/
│       │                       ├── RxViewPager2Test.kt
│       │                       └── RxViewPager2TestActivity.kt
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── jakewharton/
│                       └── rxbinding4/
│                           └── viewpager2/
│                               ├── PageScrollStateChangedObservable.kt
│                               ├── PageScrolledObservable.kt
│                               └── PageSelectedObservable.kt
├── settings.gradle
└── testing-utils/
    ├── build.gradle
    └── src/
        └── main/
            ├── AndroidManifest.xml
            └── java/
                └── com/
                    └── jakewharton/
                        └── rxbinding4/
                            ├── MotionEventUtil.java
                            ├── RecordingObserver.java
                            ├── RxBindingTestRunner.java
                            ├── TouchUtilsBackport.java
                            ├── UnsafeRunnable.java
                            └── ViewDirtyIdlingResource.java
Download .txt
SYMBOL INDEX (336 symbols across 66 files)

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxActionMenuViewTest.java
  class RxActionMenuViewTest (line 16) | public final class RxActionMenuViewTest {
    method setUp (line 22) | @Before public void setUp() {
    method itemClicks (line 26) | @Test @UiThreadTest public void itemClicks() {

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTest.java
  class RxPopupMenuTest (line 19) | public final class RxPopupMenuTest {
    method setUp (line 27) | @Before public void setUp() {
    method itemClicks (line 31) | @Test @UiThreadTest public void itemClicks() {
    method dismisses (line 52) | @Test public void dismisses() {

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTestActivity.java
  class RxPopupMenuTestActivity (line 8) | public final class RxPopupMenuTestActivity extends Activity {
    method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTest.java
  class RxSearchViewTest (line 15) | public final class RxSearchViewTest {
    method setUp (line 22) | @Before public void setUp() {
    method queryTextChanges (line 26) | @Test @UiThreadTest public void queryTextChanges() {
    method query (line 46) | @Test @UiThreadTest public void query() throws Throwable {
    method queryTextEventNotSubmitted (line 54) | @Test @UiThreadTest public void queryTextEventNotSubmitted() {
    method queryTextEventSubmitted (line 67) | @Test @UiThreadTest public void queryTextEventSubmitted() {

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTestActivity.java
  class RxSearchViewTestActivity (line 8) | public final class RxSearchViewTestActivity extends Activity {
    method onCreate (line 11) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTest.java
  class RxToolbarTest (line 21) | public final class RxToolbarTest {
    method setUp (line 27) | @Before public void setUp() {
    method itemClicks (line 32) | @Test @UiThreadTest public void itemClicks() {
    method navigationClicks (line 53) | @Test public void navigationClicks() {

FILE: rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTestActivity.java
  class RxToolbarTestActivity (line 7) | public final class RxToolbarTestActivity extends Activity {
    method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTest.java
  class RxNestedScrollViewTest (line 15) | public final class RxNestedScrollViewTest {
    method setUp (line 21) | @Before public void setUp() {
    method scrollChangeEvents (line 26) | @Test @UiThreadTest public void scrollChangeEvents() {

FILE: rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTestActivity.java
  class RxNestedScrollViewTestActivity (line 12) | public final class RxNestedScrollViewTestActivity extends Activity {
    method onCreate (line 16) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTest.java
  class RxDrawerLayoutTest (line 27) | public final class RxDrawerLayoutTest {
    method setUp (line 37) | @Before public void setUp() {
    method tearDown (line 45) | @After public void tearDown() {
    method drawerOpen (line 49) | @Test public void drawerOpen() {
    method open (line 68) | @Test public void open() {

FILE: rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTestActivity.java
  class RxDrawerLayoutTestActivity (line 13) | public final class RxDrawerLayoutTestActivity extends Activity {
    method onCreate (line 16) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTest.java
  class RxSearchBarTest (line 15) | public final class RxSearchBarTest {
    method setUp (line 22) | @Before public void setUp() {
    method searchQueryChanges (line 28) | @Test @UiThreadTest public void searchQueryChanges() {
    method searchQueryChangeEvents (line 44) | @Test @UiThreadTest public void searchQueryChangeEvents() {
    method searchQueryChangeEventsKeyboardDismissed (line 58) | @Test @UiThreadTest public void searchQueryChangeEventsKeyboardDismiss...

FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTestActivity.java
  class RxSearchBarTestActivity (line 9) | public final class RxSearchBarTestActivity extends Activity {
    method onCreate (line 13) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTest.java
  class RxSearchEditTextTest (line 14) | public final class RxSearchEditTextTest {
    method setUp (line 19) | @Before public void setUp() {
    method keyboardDismisses (line 23) | @Test @UiThreadTest public void keyboardDismisses() {

FILE: rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTestActivity.java
  class RxSearchEditTextTestActivity (line 7) | public final class RxSearchEditTextTestActivity extends Activity {
    method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxAppBarLayoutTest.java
  class RxAppBarLayoutTest (line 17) | public class RxAppBarLayoutTest {
    method setUp (line 23) | @Before public void setUp() {
    method offsetChanges (line 27) | @SdkSuppress(minSdkVersion = 17)

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxBottomNavigationViewTest.java
  class RxBottomNavigationViewTest (line 18) | public final class RxBottomNavigationViewTest {
    method setUp (line 24) | @Before public void setUp() {
    method teardown (line 28) | @After public void teardown() {
    method itemSelections (line 32) | @Test @UiThreadTest public void itemSelections() {

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxFloatingActionButtonTest.java
  class RxFloatingActionButtonTest (line 14) | public class RxFloatingActionButtonTest {
    method visibility (line 19) | @Test

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxNavigationViewTest.java
  class RxNavigationViewTest (line 16) | public final class RxNavigationViewTest {
    method setUp (line 24) | @Before public void setUp() {
    method itemSelections (line 28) | @Test @UiThreadTest public void itemSelections() {
    method itemSelectionsInitialValue (line 45) | @Test @UiThreadTest public void itemSelectionsInitialValue() {

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSnackbarTest.java
  class RxSnackbarTest (line 18) | public final class RxSnackbarTest {
    method dismisses (line 24) | @Test public void dismisses() {

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTest.java
  class RxSwipeDismissBehaviorTest (line 22) | public final class RxSwipeDismissBehaviorTest {
    method setUp (line 28) | @Before public void setUp() {
    method dismisses (line 33) | @Test public void dismisses() {
    method swipeRight (line 52) | private static ViewAction swipeRight() {

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTestActivity.java
  class RxSwipeDismissBehaviorTestActivity (line 8) | public class RxSwipeDismissBehaviorTestActivity extends Activity {
    method onCreate (line 12) | @SuppressWarnings("ResourceType")

FILE: rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxTabLayoutTest.java
  class RxTabLayoutTest (line 17) | public final class RxTabLayoutTest {
    method setUp (line 24) | @Before public void setUp() {
    method selectionEvents (line 29) | @Test @UiThreadTest public void selectionEvents() {
    method selectionEventsNoInitial (line 51) | @Test @UiThreadTest public void selectionEventsNoInitial() {
    method selections (line 59) | @Test @UiThreadTest public void selections() {
    method selectionsNoInitial (line 79) | @Test @UiThreadTest public void selectionsNoInitial() {
    method select (line 87) | @Test @UiThreadTest public void select() throws Throwable {
    method selectInvalidValueThrows (line 96) | @Test @UiThreadTest public void selectInvalidValueThrows() throws Thro...

FILE: rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewAdapterTest.java
  class RxRecyclerViewAdapterTest (line 12) | public final class RxRecyclerViewAdapterTest {
    method dataChanges (line 15) | @Test @UiThreadTest public void dataChanges() {
    class TestRecyclerAdapter (line 31) | private static final class TestRecyclerAdapter extends RecyclerView.Ad...
      method TestRecyclerAdapter (line 32) | TestRecyclerAdapter() {
      method onCreateViewHolder (line 35) | @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int...
      method onBindViewHolder (line 39) | @Override public void onBindViewHolder(ViewHolder holder, int positi...
      method getItemCount (line 42) | @Override public int getItemCount() {

FILE: rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTest.java
  class RxRecyclerViewTest (line 24) | public final class RxRecyclerViewTest {
    method setUp (line 35) | @Before public void setUp() {
    method tearDown (line 43) | @After public void tearDown() {
    method childAttachEvents (line 47) | @Test public void childAttachEvents() {
    method childDetachEvents (line 66) | @Test public void childDetachEvents() {
    method scrollEventsVertical (line 87) | @Test public void scrollEventsVertical() {
    method scrollEventsHorizontal (line 119) | @Test public void scrollEventsHorizontal() {
    method flingEventsVertical (line 155) | @Test public void flingEventsVertical() {
    method flingEventsHorizontal (line 183) | @Test public void flingEventsHorizontal() {
    class SimpleAdapter (line 215) | private class SimpleAdapter extends RecyclerView.Adapter {
      method SimpleAdapter (line 218) | SimpleAdapter(View child) {
      method onCreateViewHolder (line 222) | @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGrou...
      method onBindViewHolder (line 227) | @Override public void onBindViewHolder(RecyclerView.ViewHolder holde...
      method getItemCount (line 230) | @Override public int getItemCount() {
    class Adapter (line 235) | private static class Adapter extends RecyclerView.Adapter<ViewHolder> {
      method Adapter (line 236) | public Adapter() {
      method onCreateViewHolder (line 240) | @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int...
      method onBindViewHolder (line 245) | @Override public void onBindViewHolder(ViewHolder holder, int positi...
      method getItemCount (line 249) | @Override public int getItemCount() {
      method getItemId (line 253) | @Override public long getItemId(int position) {
    class ViewHolder (line 258) | private static class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 262) | ViewHolder(TextView itemView) {

FILE: rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTestActivity.java
  class RxRecyclerViewTestActivity (line 8) | public final class RxRecyclerViewTestActivity extends Activity {
    method onCreate (line 11) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTest.java
  class RxSlidingPaneLayoutTest (line 28) | public class RxSlidingPaneLayoutTest {
    method setUp (line 39) | @Before public void setUp() {
    method teardown (line 47) | @After public void teardown() {
    method paneOpen (line 51) | @Test public void paneOpen() {
    method slides (line 70) | @Test public void slides() {
    method open (line 98) | @Test public void open() {
    method isOpen (line 132) | private static Matcher<View> isOpen() {
    method isClosed (line 144) | private static Matcher<View> isClosed() {

FILE: rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTestActivity.java
  class RxSlidingPaneLayoutTestActivity (line 12) | public final class RxSlidingPaneLayoutTestActivity extends Activity {
    method onCreate (line 15) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding-swiperefreshlayout/src/androidTest/java/com/jakewharton/rxbinding4/swiperefreshlayout/RxSwipeRefreshLayoutTest.java
  class RxSwipeRefreshLayoutTest (line 20) | public final class RxSwipeRefreshLayoutTest {
    method setUp (line 26) | @Before public void setUp() {
    method refreshes (line 31) | @Test public void refreshes() throws InterruptedException {
    method swipeDown (line 46) | private static ViewAction swipeDown() {

FILE: rxbinding-swiperefreshlayout/src/androidTest/java/com/jakewharton/rxbinding4/swiperefreshlayout/RxSwipeRefreshLayoutTestActivity.java
  class RxSwipeRefreshLayoutTestActivity (line 16) | public final class RxSwipeRefreshLayoutTestActivity extends Activity {
    method run (line 21) | @Override public void run() {
    method onCreate (line 26) | @Override protected void onCreate(Bundle savedInstanceState) {
    method onPause (line 50) | @Override protected void onPause() {

FILE: rxbinding-viewpager/src/androidTest/java/com/jakewharton/rxbinding4/viewpager/RxViewPagerTest.java
  class RxViewPagerTest (line 24) | public final class RxViewPagerTest {
    method setUp (line 32) | @Before public void setUp() {
    method pageScrollEvents (line 37) | @Test public void pageScrollEvents() {
    method pageScrollStateChanges (line 61) | @Test public void pageScrollStateChanges() {
    method pageSelections (line 81) | @Test @UiThreadTest public void pageSelections() {
    method swipeLeft (line 98) | private static ViewAction swipeLeft() {

FILE: rxbinding-viewpager/src/androidTest/java/com/jakewharton/rxbinding4/viewpager/RxViewPagerTestActivity.java
  class RxViewPagerTestActivity (line 11) | public final class RxViewPagerTestActivity extends Activity {
    method onCreate (line 14) | @SuppressWarnings("ResourceType")
    class Adapter (line 25) | private static class Adapter extends PagerAdapter {
      method Adapter (line 26) | Adapter() {
      method getCount (line 29) | @Override public int getCount() {
      method isViewFromObject (line 33) | @Override public boolean isViewFromObject(View view, Object object) {
      method instantiateItem (line 37) | @Override public Object instantiateItem(ViewGroup container, int pos...
      method destroyItem (line 43) | @Override public void destroyItem(ViewGroup container, int position,...

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java
  class MainThreadKtTest (line 10) | public final class MainThreadKtTest {
    method checkMainOnMainDoesNotNotify (line 11) | @UiThreadTest
    method checkMainOnNotMainNotifies (line 18) | @Test public void checkMainOnNotMainNotifies() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java
  class RxMenuItemTest (line 22) | public final class RxMenuItemTest {
    method clicks (line 26) | @Test @UiThreadTest public void clicks() {
    method clicksAvoidHandling (line 43) | @Test @UiThreadTest public void clicksAvoidHandling() {
    method actionViewEvents (line 60) | @Test @UiThreadTest public void actionViewEvents() {
    method actionViewEventsAvoidHandling (line 77) | @Test @UiThreadTest public void actionViewEventsAvoidHandling() {
    class TestMenuItem (line 95) | private static final class TestMenuItem implements MenuItem {
      method TestMenuItem (line 119) | public TestMenuItem(Context context) {
      method performClick (line 123) | public void performClick() {
      method getItemId (line 129) | @Override public int getItemId() {
      method getGroupId (line 133) | @Override public int getGroupId() {
      method getOrder (line 137) | @Override public int getOrder() {
      method setTitle (line 141) | @Override public MenuItem setTitle(CharSequence title) {
      method setTitle (line 146) | @Override public MenuItem setTitle(int title) {
      method getTitle (line 151) | @Override public CharSequence getTitle() {
      method setTitleCondensed (line 155) | @Override public MenuItem setTitleCondensed(CharSequence title) {
      method getTitleCondensed (line 160) | @Override public CharSequence getTitleCondensed() {
      method setIcon (line 164) | @Override public MenuItem setIcon(Drawable icon) {
      method setIcon (line 169) | @Override public MenuItem setIcon(int iconRes) {
      method getIcon (line 174) | @Override public Drawable getIcon() {
      method setIntent (line 178) | @Override public MenuItem setIntent(Intent intent) {
      method getIntent (line 183) | @Override public Intent getIntent() {
      method setShortcut (line 187) | @Override public MenuItem setShortcut(char numericChar, char alphaCh...
      method setNumericShortcut (line 193) | @Override public MenuItem setNumericShortcut(char numericChar) {
      method getNumericShortcut (line 198) | @Override public char getNumericShortcut() {
      method setAlphabeticShortcut (line 202) | @Override public MenuItem setAlphabeticShortcut(char alphaChar) {
      method getAlphabeticShortcut (line 207) | @Override public char getAlphabeticShortcut() {
      method setCheckable (line 211) | @Override public MenuItem setCheckable(boolean checkable) {
      method isCheckable (line 216) | @Override public boolean isCheckable() {
      method setChecked (line 220) | @Override public MenuItem setChecked(boolean checked) {
      method isChecked (line 227) | @Override public boolean isChecked() {
      method setVisible (line 231) | @Override public MenuItem setVisible(boolean visible) {
      method isVisible (line 236) | @Override public boolean isVisible() {
      method setEnabled (line 240) | @Override public MenuItem setEnabled(boolean enabled) {
      method isEnabled (line 245) | @Override public boolean isEnabled() {
      method hasSubMenu (line 249) | @Override public boolean hasSubMenu() {
      method getSubMenu (line 253) | @Override public SubMenu getSubMenu() {
      method setOnMenuItemClickListener (line 257) | @Override
      method getMenuInfo (line 263) | @Override public ContextMenu.ContextMenuInfo getMenuInfo() {
      method setShowAsAction (line 267) | @Override public void setShowAsAction(int actionEnum) {
      method setShowAsActionFlags (line 271) | @Override public MenuItem setShowAsActionFlags(int actionEnum) {
      method setActionView (line 276) | @Override public MenuItem setActionView(View view) {
      method setActionView (line 281) | @Override public MenuItem setActionView(int resId) {
      method getActionView (line 286) | @Override public View getActionView() {
      method setActionProvider (line 290) | @Override public MenuItem setActionProvider(ActionProvider actionPro...
      method getActionProvider (line 295) | @Override public ActionProvider getActionProvider() {
      method expandActionView (line 299) | @Override public boolean expandActionView() {
      method collapseActionView (line 312) | @Override public boolean collapseActionView() {
      method isActionViewExpanded (line 325) | @Override public boolean isActionViewExpanded() {
      method setOnActionExpandListener (line 329) | @Override public MenuItem setOnActionExpandListener(OnActionExpandLi...

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java
  class RxViewAttachTest (line 17) | public final class RxViewAttachTest {
    method setUp (line 25) | @Before public void setUp() {
    method attaches (line 31) | @Test public void attaches() {
    method attachEvents (line 52) | @Test public void attachEvents() {
    method detaches (line 73) | @Test public void detaches() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java
  class RxViewAttachTestActivity (line 8) | public final class RxViewAttachTestActivity extends Activity {
    method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java
  class RxViewGroupTest (line 13) | public final class RxViewGroupTest {
    method childViewEvents (line 18) | @Test @UiThreadTest public void childViewEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java
  class RxViewSystemUiVisibilityTest (line 16) | public final class RxViewSystemUiVisibilityTest {
    method setUp (line 23) | @Before public void setUp() {
    method systemUiVisibilityChanges (line 29) | @Test public void systemUiVisibilityChanges() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java
  class RxViewSystemUiVisibilityTestActivity (line 7) | public final class RxViewSystemUiVisibilityTestActivity extends Activity {
    method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java
  class RxViewTest (line 32) | public final class RxViewTest {
    method clicks (line 36) | @Test @UiThreadTest public void clicks() {
    method drags (line 53) | @Test @UiThreadTest public void drags() {
    method drawEvents (line 73) | @SdkSuppress(minSdkVersion = 16)
    method focusChanges (line 88) | @Test @UiThreadTest public void focusChanges() {
    method globalLayouts (line 112) | @Test @UiThreadTest public void globalLayouts() {
    method hovers (line 126) | @Test @UiThreadTest public void hovers() {
    method layoutChanges (line 145) | @Test @UiThreadTest public void layoutChanges() {
    method layoutChangeEvents (line 161) | @Test @UiThreadTest public void layoutChangeEvents() {
    method longClicks (line 180) | @Test @UiThreadTest public void longClicks() {
    method preDrawEvents (line 205) | @Test @UiThreadTest public void preDrawEvents() {
    method scrollChangeEvents (line 219) | @SdkSuppress(minSdkVersion = 23)
    method touches (line 246) | @Test @UiThreadTest public void touches() {
    method keys (line 265) | @Test @UiThreadTest public void keys() {
    method visibility (line 284) | @Test @UiThreadTest public void visibility() throws Throwable {
    method visibilityCustomFalse (line 293) | @Test @UiThreadTest public void visibilityCustomFalse() throws Throwab...
    method setVisibilityCustomFalseToVisibleThrows (line 302) | @SuppressWarnings("ResourceType") @Test @UiThreadTest public void setV...

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java
  class RxAbsListViewTest (line 15) | public final class RxAbsListViewTest {
    method setUp (line 24) | @Before public void setUp() {
    method scrollEvents (line 29) | @Test public void scrollEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java
  class RxAbsListViewTestActivity (line 11) | public final class RxAbsListViewTestActivity extends Activity {
    method onCreate (line 17) | @Override protected void onCreate(Bundle savedInstanceState) {
    method createValues (line 31) | private static List<String> createValues(int count) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java
  class RxAdapterTest (line 12) | public final class RxAdapterTest {
    method dataChanges (line 15) | @Test @UiThreadTest public void dataChanges() {
    class TestAdapter (line 31) | private static final class TestAdapter extends BaseAdapter {
      method TestAdapter (line 32) | TestAdapter() {
      method getCount (line 35) | @Override public int getCount() {
      method getItem (line 39) | @Override public Object getItem(int position) {
      method getItemId (line 43) | @Override public long getItemId(int position) {
      method getView (line 47) | @Override public View getView(int position, View convertView, ViewGr...

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java
  class RxAdapterViewTest (line 18) | public final class RxAdapterViewTest {
    method setUp (line 28) | @Before public void setUp() {
    method itemSelections (line 34) | @Test public void itemSelections() {
    method selectionEvents (line 53) | @Test public void selectionEvents() {
    method itemClicks (line 86) | @Test public void itemClicks() {
    method itemClickEvents (line 105) | @Test public void itemClickEvents() {
    method itemLongClicks (line 125) | @Test public void itemLongClicks() {
    method itemLongClickEvents (line 129) | @Test public void itemLongClickEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java
  class RxAdapterViewTestActivity (line 13) | public final class RxAdapterViewTestActivity extends Activity {
    method onCreate (line 20) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java
  class RxAutoCompleteTextViewTest (line 30) | public final class RxAutoCompleteTextViewTest {
    method setUp (line 39) | @Before public void setUp() {
    method itemClickEvents (line 44) | @Test public void itemClickEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java
  class RxAutoCompleteTextViewTestActivity (line 13) | public final class RxAutoCompleteTextViewTestActivity extends Activity {
    method onCreate (line 16) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java
  class RxCompoundButtonTest (line 14) | public final class RxCompoundButtonTest {
    method checkedChanges (line 18) | @Test @UiThreadTest public void checkedChanges() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java
  class RxPopupMenuTest (line 19) | public final class RxPopupMenuTest {
    method setUp (line 27) | @Before public void setUp() {
    method itemClicks (line 31) | @Test @UiThreadTest public void itemClicks() {
    method dismisses (line 52) | @Test public void dismisses() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java
  class RxPopupMenuTestActivity (line 8) | public final class RxPopupMenuTestActivity extends Activity {
    method onCreate (line 12) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java
  class RxRadioGroupTest (line 15) | @SuppressWarnings("ResourceType") // Don't need real IDs for test case.
    method setUp (line 20) | @Before public void setUp() {
    method checkedChanges (line 29) | @Test @UiThreadTest public void checkedChanges() {
    method checked (line 49) | @Test @UiThreadTest public void checked() throws Throwable {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java
  class RxRatingBarTest (line 18) | public final class RxRatingBarTest {
    method setUp (line 26) | @Before public void setUp() {
    method ratingChanges (line 30) | @Test public void ratingChanges() {
    method ratingChangeEvents (line 49) | @Test public void ratingChangeEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java
  class RxRatingBarTestActivity (line 7) | public final class RxRatingBarTestActivity extends Activity {
    method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java
  class RxSearchViewTest (line 15) | public final class RxSearchViewTest {
    method setUp (line 22) | @Before public void setUp() {
    method queryTextChanges (line 26) | @Test @UiThreadTest public void queryTextChanges() {
    method query (line 46) | @Test @UiThreadTest public void query() throws Throwable {
    method queryTextEventNotSubmitted (line 54) | @Test @UiThreadTest public void queryTextEventNotSubmitted() {
    method queryTextEventSubmitted (line 67) | @Test @UiThreadTest public void queryTextEventSubmitted() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java
  class RxSearchViewTestActivity (line 7) | public final class RxSearchViewTestActivity extends Activity {
    method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java
  class RxSeekBarTest (line 19) | public final class RxSeekBarTest {
    method setUp (line 27) | @Before public void setUp() {
    method changes (line 31) | @Test public void changes() {
    method systemChanges (line 65) | @Test public void systemChanges() {
    method userChanges (line 91) | @Test public void userChanges() {
    method changeEvents (line 125) | @Test public void changeEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java
  class RxSeekBarTestActivity (line 7) | public final class RxSeekBarTestActivity extends Activity {
    method onCreate (line 10) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java
  class RxTextViewTest (line 16) | public final class RxTextViewTest {
    method editorActions (line 20) | @Test @UiThreadTest public void editorActions() {
    method editorActionEvents (line 37) | @Test @UiThreadTest public void editorActionEvents() {
    method textChanges (line 60) | @Test @UiThreadTest public void textChanges() {
    method textChangeEvents (line 81) | @Test @UiThreadTest public void textChangeEvents() {
    method beforeTextChangeEvents (line 115) | @Test @UiThreadTest public void beforeTextChangeEvents() {
    method afterTextChangeEvents (line 149) | @Test @UiThreadTest public void afterTextChangeEvents() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java
  class RxToolbarTest (line 22) | @SdkSuppress(minSdkVersion = 21)
    method setUp (line 29) | @Before public void setUp() {
    method itemClicks (line 34) | @Test @UiThreadTest public void itemClicks() {
    method navigationClicks (line 55) | @Test public void navigationClicks() {

FILE: rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java
  class RxToolbarTestActivity (line 8) | @TargetApi(21)
    method onCreate (line 14) | @Override protected void onCreate(Bundle savedInstanceState) {

FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/MotionEventUtil.java
  class MotionEventUtil (line 8) | public final class MotionEventUtil {
    method motionEventAtPosition (line 9) | public static MotionEvent motionEventAtPosition(View view, int action,...
    method hoverMotionEventAtPosition (line 36) | public static MotionEvent hoverMotionEventAtPosition(View view, int ac...
    method MotionEventUtil (line 54) | private MotionEventUtil() {

FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/RecordingObserver.java
  class RecordingObserver (line 12) | public final class RecordingObserver<T> extends DisposableObserver<T> {
    method onComplete (line 17) | @Override public void onComplete() {
    method onError (line 22) | @Override public void onError(Throwable e) {
    method onNext (line 27) | @Override public void onNext(T t) {
    method takeEvent (line 32) | private <E> E takeEvent(Class<E> wanted) {
    method takeNext (line 47) | public T takeNext() {
    method takeError (line 52) | public Throwable takeError() {
    method clearEvents (line 56) | public void clearEvents() {
    method assertOnCompleted (line 62) | public void assertOnCompleted() {
    method assertNoMoreEvents (line 66) | public void assertNoMoreEvents() {
    class OnNext (line 74) | private final class OnNext {
      method OnNext (line 77) | private OnNext(T value) {
      method toString (line 81) | @Override public String toString() {
    class OnCompleted (line 86) | private final class OnCompleted {
      method toString (line 87) | @Override public String toString() {
    class OnError (line 92) | private final class OnError {
      method OnError (line 95) | private OnError(Throwable throwable) {
      method toString (line 99) | @Override public String toString() {

FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/RxBindingTestRunner.java
  class RxBindingTestRunner (line 14) | public final class RxBindingTestRunner extends AndroidJUnitRunner {
    method onStart (line 17) | @Override public void onStart() {
    method onDestroy (line 32) | @Override public void onDestroy() {

FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/TouchUtilsBackport.java
  class TouchUtilsBackport (line 10) | public final class TouchUtilsBackport {
    method dragViewTo (line 21) | public static int dragViewTo(View v, int gravity, int toX, int toY) {
    method drag (line 47) | public static void drag(float fromX, float toX, float fromY, float toY...
    method getStartLocation (line 84) | private static void getStartLocation(View v, int gravity, int[] xy) {
    method TouchUtilsBackport (line 117) | private TouchUtilsBackport() {

FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/UnsafeRunnable.java
  class UnsafeRunnable (line 3) | public abstract class UnsafeRunnable implements Runnable {
    method run (line 5) | @Override
    method unsafeRun (line 14) | protected abstract void unsafeRun() throws Throwable;

FILE: testing-utils/src/main/java/com/jakewharton/rxbinding4/ViewDirtyIdlingResource.java
  class ViewDirtyIdlingResource (line 7) | public final class ViewDirtyIdlingResource implements IdlingResource {
    method ViewDirtyIdlingResource (line 11) | public ViewDirtyIdlingResource(Activity activity) {
    method getName (line 15) | @Override public String getName() {
    method isIdleNow (line 19) | @Override public boolean isIdleNow() {
    method registerIdleTransitionCallback (line 27) | @Override public void registerIdleTransitionCallback(ResourceCallback ...
Condensed preview — 235 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (415K chars).
[
  {
    "path": ".github/workflows/build.yml",
    "chars": 1713,
    "preview": "name: build\n\non: [push, pull_request]\n\nenv:\n  GRADLE_OPTS: \"-Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false -Dkotl"
  },
  {
    "path": ".gitignore",
    "chars": 125,
    "preview": "# IntelliJ IDEA\n.idea\n*.iml\nannotations\n\n# Gradle\n.gradle\ngradlew.bat\nbuild\nlocal.properties\nreports\njacoco.exec\n\n.DS_St"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 14627,
    "preview": "Change Log\n==========\n\nVersion 4.0.0 *(2020-05-19)*\n----------------------------\n\nThis version updates to support RxJava"
  },
  {
    "path": "LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 1813,
    "preview": "RxBinding\n=========\n\nRxJava binding APIs for Android UI widgets from the platform and support libraries.\n\n\nDownload\n----"
  },
  {
    "path": "RELEASING.md",
    "chars": 631,
    "preview": "Releasing\n========\n\n 1. Change the version in `gradle.properties` to a non-SNAPSHOT version.\n 2. Update the `CHANGELOG.m"
  },
  {
    "path": "build.gradle",
    "chars": 2593,
    "preview": "buildscript {\n  ext.buildConfig = [\n    'minSdkVersion': 14,\n    'compileSdkVersion': 29,\n  ]\n  ext.versions = [\n    'ko"
  },
  {
    "path": "gradle/gradle-mvn-push.gradle",
    "chars": 3629,
    "preview": "/*\n * Copyright 2013 Chris Banes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not us"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 202,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 609,
    "preview": "GROUP=com.jakewharton.rxbinding4\nVERSION_NAME=4.0.1-SNAPSHOT\n\nPOM_DESCRIPTION=RxJava binding APIs for Android's UI widge"
  },
  {
    "path": "gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "rxbinding/build.gradle",
    "chars": 984,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api deps.androidXAnno"
  },
  {
    "path": "rxbinding/gradle.properties",
    "chars": 63,
    "preview": "POM_ARTIFACT_ID=rxbinding\nPOM_NAME=RxBinding\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding/src/androidTest/AndroidManifest.xml",
    "chars": 919,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java",
    "chars": 858,
    "preview": "package com.jakewharton.rxbinding4.internal;\n\nimport androidx.test.annotation.UiThreadTest;\nimport com.jakewharton.rxbin"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java",
    "chars": 8617,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android."
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java",
    "chars": 2900,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport android.w"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java",
    "chars": 462,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.Vie"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java",
    "chars": 1142,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.widge"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java",
    "chars": 1810,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport android.w"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java",
    "chars": 400,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.F"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java",
    "chars": 10262,
    "preview": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.view.KeyEvent;\nimport android.v"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java",
    "chars": 1691,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ListView;\nimport a"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java",
    "chars": 1019,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java",
    "chars": 1255,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widg"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java",
    "chars": 4426,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ListView;\nimport a"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java",
    "chars": 1009,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java",
    "chars": 3175,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ArrayAdapter;\nimpo"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java",
    "chars": 946,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java",
    "chars": 1027,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.CompoundButton;\nimport"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java",
    "chars": 2111,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.view.Menu;\nimport android"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java",
    "chars": 465,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java",
    "chars": 1831,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.RadioButton;\nimport an"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java",
    "chars": 2432,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.RatingBar;\nimport "
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java",
    "chars": 456,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java",
    "chars": 2851,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.widget.SearchView;\nimport androidx.test.annotation.UiThreadTe"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java",
    "chars": 406,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java",
    "chars": 5716,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.SeekBar;\nimport an"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java",
    "chars": 385,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java",
    "chars": 5719,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.TextView;\nimport andro"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java",
    "chars": 2404,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widge"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java",
    "chars": 651,
    "preview": "package com.jakewharton.rxbinding4.widget;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport and"
  },
  {
    "path": "rxbinding/src/androidTest/res/drawable/icon.xml",
    "chars": 138,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<color\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:col"
  },
  {
    "path": "rxbinding/src/androidTest/res/values/ids.xml",
    "chars": 105,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <item type=\"id\" name=\"auto_complete\"/>\n</resources>\n"
  },
  {
    "path": "rxbinding/src/androidTest/res/values/strings.xml",
    "chars": 141,
    "preview": "<resources>\n  <string name=\"hey\">Hey</string>\n  <string name=\"ouch\">Ouch</string>\n  <string name=\"hint\">Your name here</"
  },
  {
    "path": "rxbinding/src/main/AndroidManifest.xml",
    "chars": 49,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4\"/>\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt",
    "chars": 636,
    "preview": "package com.jakewharton.rxbinding4\n\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observe"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/mainThread.kt",
    "chars": 1202,
    "preview": "/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance "
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/true.kt",
    "chars": 299,
    "preview": "package com.jakewharton.rxbinding4.internal\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.RestrictTo"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEvent.kt",
    "chars": 655,
    "preview": "package com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.MenuItem\n\n/**\n * An action v"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEventObservable.kt",
    "chars": 2608,
    "preview": "@file:JvmName(\"RxMenuItem\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MenuIt"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemClickObservable.kt",
    "chars": 2253,
    "preview": "@file:JvmName(\"RxMenuItem\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MenuIt"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEvent.kt",
    "chars": 967,
    "preview": "package com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.View\n\n/**\n * A view attach e"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEventObservable.kt",
    "chars": 1634,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachesObservable.kt",
    "chars": 2096,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewClickObservable.kt",
    "chars": 1554,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewDragObservable.kt",
    "chars": 2090,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.DragEvent\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewFocusChangeObservable.kt",
    "chars": 1630,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEvent.kt",
    "chars": 1042,
    "preview": "package com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.ViewGroup\n\nsealed class ViewGroupH"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEventObservable.kt",
    "chars": 1872,
    "preview": "@file:JvmName(\"RxViewGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewHoverObservable.kt",
    "chars": 2514,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MotionEven"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewKeyObservable.kt",
    "chars": 2086,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.KeyEvent\ni"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeEventObservable.kt",
    "chars": 2595,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.content.Context"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeObservable.kt",
    "chars": 1590,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLongClickObservable.kt",
    "chars": 2173,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewScrollChangeEventObservable.kt",
    "chars": 1702,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.Req"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewSystemUiVisibilityChangeObservable.kt",
    "chars": 1711,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTouchObservable.kt",
    "chars": 2523,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MotionEven"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverDrawObservable.kt",
    "chars": 1650,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.Req"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverGlobalLayoutObservable.kt",
    "chars": 1818,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverPreDrawObservable.kt",
    "chars": 1995,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimpor"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewVisibilityConsumer.kt",
    "chars": 968,
    "preview": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.Che"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AbsListViewScrollEventObservable.kt",
    "chars": 2486,
    "preview": "@file:JvmName(\"RxAbsListView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterDataChangeObservable.kt",
    "chars": 1597,
    "preview": "@file:JvmName(\"RxAdapter\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.database.D"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickEventObservable.kt",
    "chars": 1882,
    "preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickObservable.kt",
    "chars": 1566,
    "preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickEventObservable.kt",
    "chars": 2641,
    "preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickObservable.kt",
    "chars": 2212,
    "preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemSelectionObservable.kt",
    "chars": 2023,
    "preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionEvent.kt",
    "chars": 522,
    "preview": "package com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.AdapterView\n\nsealed class Adap"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionObservable.kt",
    "chars": 2459,
    "preview": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.V"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AutoCompleteTextViewItemClickEventObservable.kt",
    "chars": 1739,
    "preview": "@file:JvmName(\"RxAutoCompleteTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport andro"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/CompoundButtonCheckedChangeObservable.kt",
    "chars": 1888,
    "preview": "@file:JvmName(\"RxCompoundButton\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.wid"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuDismissObservable.kt",
    "chars": 1607,
    "preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.P"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuItemClickObservable.kt",
    "chars": 1715,
    "preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.Men"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupCheckedChangeObservable.kt",
    "chars": 1746,
    "preview": "@file:JvmName(\"RxRadioGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget."
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupToggleCheckedConsumer.kt",
    "chars": 622,
    "preview": "@file:JvmName(\"RxRadioGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annota"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeEventObservable.kt",
    "chars": 1957,
    "preview": "@file:JvmName(\"RxRatingBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.R"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeObservable.kt",
    "chars": 1643,
    "preview": "@file:JvmName(\"RxRatingBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.R"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryConsumer.kt",
    "chars": 631,
    "preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annota"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextChangeEventsObservable.kt",
    "chars": 2046,
    "preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget."
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextChangesObservable.kt",
    "chars": 1752,
    "preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget."
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextEvent.kt",
    "chars": 249,
    "preview": "package com.jakewharton.rxbinding4.widget\n\nimport android.widget.SearchView\n\ndata class SearchViewQueryTextEvent(\n  /** "
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeEvent.kt",
    "chars": 511,
    "preview": "package com.jakewharton.rxbinding4.widget\n\nimport android.widget.SeekBar\n\nsealed class SeekBarChangeEvent {\n  /** The vi"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeEventObservable.kt",
    "chars": 2077,
    "preview": "@file:JvmName(\"RxSeekBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.See"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeObservable.kt",
    "chars": 2705,
    "preview": "@file:JvmName(\"RxSeekBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.See"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewAfterTextChangeEventObservable.kt",
    "chars": 2277,
    "preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.C"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewBeforeTextChangeEventObservable.kt",
    "chars": 2321,
    "preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.C"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewEditorActionEventObservable.kt",
    "chars": 2577,
    "preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.KeyE"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewEditorActionObservable.kt",
    "chars": 2168,
    "preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.KeyE"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewTextChangeEventObservable.kt",
    "chars": 2659,
    "preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.C"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewTextChangesObservable.kt",
    "chars": 2087,
    "preview": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.text.Edit"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/ToolbarItemClickObservable.kt",
    "chars": 1596,
    "preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotatio"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/ToolbarNavigationClickObservable.kt",
    "chars": 1752,
    "preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotatio"
  },
  {
    "path": "rxbinding-appcompat/build.gradle",
    "chars": 1089,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-appcompat/gradle.properties",
    "chars": 85,
    "preview": "POM_ARTIFACT_ID=rxbinding-appcompat\nPOM_NAME=RxBinding (appcompat)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/AndroidManifest.xml",
    "chars": 566,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxActionMenuViewTest.java",
    "chars": 1366,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTest.java",
    "chars": 2180,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Instrumentation;\nimport android.view.Menu;\nimport andr"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTestActivity.java",
    "chars": 479,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.vie"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTest.java",
    "chars": 2976,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport androidx.appcompat.widget.SearchView;\nimport androidx.test.annotat"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTestActivity.java",
    "chars": 421,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\nimport androidx.a"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTest.java",
    "chars": 2383,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.a"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTestActivity.java",
    "chars": 613,
    "preview": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.ap"
  },
  {
    "path": "rxbinding-appcompat/src/main/AndroidManifest.xml",
    "chars": 59,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.appcompat\"/>\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ActionMenuViewItemClickObservable.kt",
    "chars": 1601,
    "preview": "@file:JvmName(\"RxActionMenuView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android."
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/PopupMenuDismissObservable.kt",
    "chars": 1625,
    "preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.anno"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/PopupMenuItemClickObservable.kt",
    "chars": 1720,
    "preview": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view."
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextChangeEventsObservable.kt",
    "chars": 2014,
    "preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.ann"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextChangesObservable.kt",
    "chars": 1763,
    "preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.ann"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextEvent.kt",
    "chars": 263,
    "preview": "package com.jakewharton.rxbinding4.appcompat\n\nimport androidx.appcompat.widget.SearchView\n\ndata class SearchViewQueryTex"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewSetQueryConsumer.kt",
    "chars": 645,
    "preview": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.ann"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ToolbarItemClickObservable.kt",
    "chars": 1532,
    "preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.Me"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ToolbarNavigationClickObservable.kt",
    "chars": 1664,
    "preview": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.Vi"
  },
  {
    "path": "rxbinding-core/build.gradle",
    "chars": 1034,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-core/gradle.properties",
    "chars": 75,
    "preview": "POM_ARTIFACT_ID=rxbinding-core\nPOM_NAME=RxBinding (core)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-core/src/androidTest/AndroidManifest.xml",
    "chars": 264,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package"
  },
  {
    "path": "rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTest.java",
    "chars": 1427,
    "preview": "package com.jakewharton.rxbinding4.core;\n\nimport androidx.core.widget.NestedScrollView;\nimport androidx.test.annotation."
  },
  {
    "path": "rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTestActivity.java",
    "chars": 1004,
    "preview": "package com.jakewharton.rxbinding4.core;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.Vie"
  },
  {
    "path": "rxbinding-core/src/main/AndroidManifest.xml",
    "chars": 54,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.core\"/>\n"
  },
  {
    "path": "rxbinding-core/src/main/java/com/jakewharton/rxbinding4/core/NestedScrollViewScrollChangeEventObservable.kt",
    "chars": 1826,
    "preview": "@file:JvmName(\"RxNestedScrollView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.core\n\nimport androidx.an"
  },
  {
    "path": "rxbinding-drawerlayout/build.gradle",
    "chars": 1103,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-drawerlayout/gradle.properties",
    "chars": 91,
    "preview": "POM_ARTIFACT_ID=rxbinding-drawerlayout\nPOM_NAME=RxBinding (drawerlayout)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/androidTest/AndroidManifest.xml",
    "chars": 268,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package"
  },
  {
    "path": "rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTest.java",
    "chars": 3016,
    "preview": "package com.jakewharton.rxbinding4.drawerlayout;\n\nimport android.app.Instrumentation;\nimport androidx.drawerlayout.widge"
  },
  {
    "path": "rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTestActivity.java",
    "chars": 1107,
    "preview": "package com.jakewharton.rxbinding4.drawerlayout;\n\nimport android.app.Activity;\nimport android.graphics.Color;\nimport and"
  },
  {
    "path": "rxbinding-drawerlayout/src/main/AndroidManifest.xml",
    "chars": 62,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.drawerlayout\"/>\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/main/java/com/jakewharton/rxbinding4/drawerlayout/DrawerLayoutDrawerOpenedObservable.kt",
    "chars": 2315,
    "preview": "@file:JvmName(\"RxDrawerLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.drawerlayout\n\nimport android"
  },
  {
    "path": "rxbinding-drawerlayout/src/main/java/com/jakewharton/rxbinding4/drawerlayout/DrawerLayoutOpenConsumer.kt",
    "chars": 639,
    "preview": "@file:JvmName(\"RxDrawerLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.drawerlayout\n\nimport android"
  },
  {
    "path": "rxbinding-leanback/build.gradle",
    "chars": 1065,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-leanback/gradle.properties",
    "chars": 83,
    "preview": "POM_ARTIFACT_ID=rxbinding-leanback\nPOM_NAME=RxBinding (leanback)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/AndroidManifest.xml",
    "chars": 513,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTest.java",
    "chars": 2526,
    "preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.view.KeyEvent;\nimport androidx.leanback.widget.SearchBar;\ni"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTestActivity.java",
    "chars": 893,
    "preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.lea"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTest.java",
    "chars": 1180,
    "preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.view.KeyEvent;\nimport androidx.leanback.widget.SearchEditTe"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTestActivity.java",
    "chars": 446,
    "preview": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.lea"
  },
  {
    "path": "rxbinding-leanback/src/main/AndroidManifest.xml",
    "chars": 58,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.leanback\"/>\n"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryChangeEventsObservable.kt",
    "chars": 1919,
    "preview": "@file:JvmName(\"RxSearchBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annot"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryChangesObservable.kt",
    "chars": 1548,
    "preview": "@file:JvmName(\"RxSearchBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annot"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryEvent.kt",
    "chars": 695,
    "preview": "package com.jakewharton.rxbinding4.leanback\n\nimport androidx.leanback.widget.SearchBar\n\nsealed class SearchBarSearchQuer"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchEditTextKeyboardDismissObservable.kt",
    "chars": 1532,
    "preview": "@file:JvmName(\"RxSearchEditText\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx."
  },
  {
    "path": "rxbinding-material/build.gradle",
    "chars": 1086,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-material/gradle.properties",
    "chars": 83,
    "preview": "POM_ARTIFACT_ID=rxbinding-material\nPOM_NAME=RxBinding (material)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/AndroidManifest.xml",
    "chars": 337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxAppBarLayoutTest.java",
    "chars": 1631,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxBottomNavigationViewTest.java",
    "chars": 1666,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxChipTest.kt",
    "chars": 982,
    "preview": "package com.jakewharton.rxbinding4.material\n\nimport android.content.Context\nimport android.view.ContextThemeWrapper\nimpo"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxFloatingActionButtonTest.java",
    "chars": 1062,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxNavigationViewTest.java",
    "chars": 1713,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSnackbarTest.java",
    "chars": 1706,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.app.Instrumentation;\nimport android.content.Context;\nimport"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTest.java",
    "chars": 1945,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.view.View;\nimport androidx.coordinatorlayout.widget.Coordin"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTestActivity.java",
    "chars": 701,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxTabLayoutTest.java",
    "chars": 3594,
    "preview": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\ni"
  },
  {
    "path": "rxbinding-material/src/androidTest/res/menu/menu.xml",
    "chars": 310,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <group>\n    <"
  },
  {
    "path": "rxbinding-material/src/androidTest/res/values/strings.xml",
    "chars": 119,
    "preview": "<resources>\n  <string name=\"hint\">Your name here</string>\n  <string name=\"error\">Your error here</string>\n</resources>\n"
  },
  {
    "path": "rxbinding-material/src/main/AndroidManifest.xml",
    "chars": 58,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.material\"/>\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/AppBarLayoutOffsetChangeObservable.kt",
    "chars": 1572,
    "preview": "@file:JvmName(\"RxAppBarLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.an"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/BottomNavigationViewItemSelectionsObservable.kt",
    "chars": 2071,
    "preview": "@file:JvmName(\"RxBottomNavigationView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport and"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/ChipCloseIconClicksObservable.kt",
    "chars": 1669,
    "preview": "@file:JvmName(\"RxChip\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.view.View\ni"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/FloatingActionButtonVisibilityConsumer.kt",
    "chars": 619,
    "preview": "@file:JvmName(\"RxFloatingActionButton\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport and"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/NavigationViewItemSelectionsObservable.kt",
    "chars": 2092,
    "preview": "@file:JvmName(\"RxNavigationView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.v"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/SnackbarDismissesObservable.kt",
    "chars": 1487,
    "preview": "@file:JvmName(\"RxSnackbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annota"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/SwipeDismissBehaviorObservable.kt",
    "chars": 1976,
    "preview": "@file:JvmName(\"RxSwipeDismissBehavior\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport and"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectConsumer.kt",
    "chars": 664,
    "preview": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annot"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionEvent.kt",
    "chars": 694,
    "preview": "package com.jakewharton.rxbinding4.material\n\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionEventObservable.kt",
    "chars": 2183,
    "preview": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annot"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionsObservable.kt",
    "chars": 1844,
    "preview": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annot"
  },
  {
    "path": "rxbinding-recyclerview/build.gradle",
    "chars": 1042,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-recyclerview/gradle.properties",
    "chars": 91,
    "preview": "POM_ARTIFACT_ID=rxbinding-recyclerview\nPOM_NAME=RxBinding (recyclerview)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/AndroidManifest.xml",
    "chars": 274,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest package=\"com.jakewharton.rxbinding4.recyclerview\"\n          xmlns:andr"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewAdapterTest.java",
    "chars": 1323,
    "preview": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.view.ViewGroup;\nimport androidx.recyclerview.widget.Rec"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTest.java",
    "chars": 8663,
    "preview": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.app.Instrumentation;\nimport android.view.LayoutInflater"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTestActivity.java",
    "chars": 608,
    "preview": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx"
  },
  {
    "path": "rxbinding-recyclerview/src/main/AndroidManifest.xml",
    "chars": 62,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.recyclerview\"/>\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerAdapterDataChangeObservable.kt",
    "chars": 1738,
    "preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerViewAdapter\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport "
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewChildAttachStateChangeEventObservable.kt",
    "chars": 2035,
    "preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewChildAttachStateChangeEvents.kt",
    "chars": 1321,
    "preview": "package com.jakewharton.rxbinding4.recyclerview\n\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerVi"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewFlingEventObservable.kt",
    "chars": 1971,
    "preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewScrollEventObservable.kt",
    "chars": 1985,
    "preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewScrollStateChangeObservable.kt",
    "chars": 1562,
    "preview": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android"
  },
  {
    "path": "rxbinding-slidingpanelayout/build.gradle",
    "chars": 1108,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  },
  {
    "path": "rxbinding-slidingpanelayout/gradle.properties",
    "chars": 101,
    "preview": "POM_ARTIFACT_ID=rxbinding-slidingpanelayout\nPOM_NAME=RxBinding (slidingpanelayout)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/androidTest/AndroidManifest.xml",
    "chars": 278,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTest.java",
    "chars": 4988,
    "preview": "package com.jakewharton.rxbinding4.slidingpanelayout;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimp"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTestActivity.java",
    "chars": 1180,
    "preview": "package com.jakewharton.rxbinding4.slidingpanelayout;\n\nimport android.app.Activity;\nimport android.graphics.Color;\nimpor"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/AndroidManifest.xml",
    "chars": 67,
    "preview": "<manifest package=\"com.jakewharton.rxbinding4.slidingpanelayout\"/>\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutOpenConsumer.kt",
    "chars": 617,
    "preview": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimpo"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutPaneOpenedObservable.kt",
    "chars": 1961,
    "preview": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimpo"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutSlideObservable.kt",
    "chars": 1794,
    "preview": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimpo"
  },
  {
    "path": "rxbinding-swiperefreshlayout/build.gradle",
    "chars": 1048,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbindi"
  }
]

// ... and 35 more files (download for full content)

About this extraction

This page contains the full source code of the JakeWharton/RxBinding GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 235 files (367.0 KB), approximately 96.2k tokens, and a symbol index with 336 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!