[
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non: [push, pull_request]\n\nenv:\n  GRADLE_OPTS: \"-Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false -Dkotlin.incremental=false\"\n\njobs:\n  test:\n    runs-on: macos-latest\n\n    strategy:\n      fail-fast: false\n      matrix:\n        module:\n          - rxbinding\n          - rxbinding-appcompat\n          - rxbinding-core\n          - rxbinding-drawerlayout\n          - rxbinding-leanback\n          - rxbinding-material\n          - rxbinding-recyclerview\n          - rxbinding-slidingpanelayout\n          - rxbinding-swiperefreshlayout\n          - rxbinding-viewpager\n          - rxbinding-viewpager2\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Validate Gradle Wrapper\n        uses: gradle/wrapper-validation-action@v1\n\n      - uses: actions/cache@v1\n        with:\n          path: ~/.gradle/caches\n          key: ${{ runner.os }}-${{ hashFiles('**/build.gradle') }}-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }}\n\n      - name: Run Tests\n        uses: reactivecircus/android-emulator-runner@v2\n        with:\n          api-level: 18\n          script: ./gradlew ${{ matrix.module }}:connectedCheck --stacktrace\n\n  publish:\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs/heads/master'\n    needs: test\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Configure JDK\n        uses: actions/setup-java@v1\n        with:\n          java-version: 14\n\n      - name: Upload Artifacts\n        run: ./gradlew uploadArchives\n        env:\n          ORG_GRADLE_PROJECT_SONATYPE_NEXUS_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }}\n          ORG_GRADLE_PROJECT_SONATYPE_NEXUS_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# IntelliJ IDEA\n.idea\n*.iml\nannotations\n\n# Gradle\n.gradle\ngradlew.bat\nbuild\nlocal.properties\nreports\njacoco.exec\n\n.DS_Store\n\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Change Log\n==========\n\nVersion 4.0.0 *(2020-05-19)*\n----------------------------\n\nThis version updates to support RxJava 3. No functional changes.\n\nThe groupId and package name are now `com.jakewharton.rxbinding4`.\n\n\nVersion 3.1.0 *(2019-11-22)*\n----------------------------\n\n * New bindings!\n    * `rxbinding-viewpager2`:\n       * `ViewPager2`:\n          * `pageSelections`\n          * `pageScrollEvents`\n          * `pageScrollStateChanges`\n\n\nVersion 3.0.0 *(2019-07-23)*\n----------------------------\n\n * New: Maven coordinates are now `com.jakewharton.rxbinding3:rxbinding` (et al). Package name is now\n   `com.jakewharton.rxbinding3.*`.\n * New: AndroidX support! The library is now AndroidX-only. For use with the old support libraries use version 2.2.0.\n * New: Library is now Kotlin-first and `-kotlin` artifacts are gone. Java callers get the same API as before. Kotlin\n   callers get the extension-based API. Event classes are now Kotlin `data` classes instead of using AutoValue. RxJava's\n   `Predicate` and Java's `Callable` are no longer used and are replaced by Kotlin functional types. For Java callers\n   these can still be used as `Function1` but the use of lambdas is encouraged.\n * New: Observables which signal an event without any information use `Unit` instead of `Object`. (Note: This was\n   always true for Kotlin extension users)\n * All deprecated methods have been removed.\n * Some trivial consumer factories have been removed. You can subscribe lambdas to the stream to replicate their functionality.\n\nChanges from 3.0.0-alpha2:\n\n * Fix: Correct binary compatibility with Material Design Components v1.1.0.\n\n\nVersion 3.0.0-alpha2 *(2018-12-18)*\n-----------------------------------\n\n * Fix: Correct nullability of adapter view callback's clicked view.\n\n\nVersion 3.0.0-alpha1 *(2018-10-17)*\n-----------------------------------\n\n * New: Maven coordinates are now `com.jakewharton.rxbinding3:rxbinding` (et al). Package name is now\n   `com.jakewharton.rxbinding3.*`.\n * New: AndroidX support! The library is now AndroidX-only. For use with the old support libraries use version 2.2.0.\n * New: Library is now Kotlin-first and `-kotlin` artifacts are gone. Java callers get the same API as before. Kotlin\n   callers get the extension-based API. Event classes are now Kotlin `data` classes instead of using AutoValue. RxJava's\n   `Predicate` and Java's `Callable` are no longer used and are replaced by Kotlin functional types. For Java callers\n   these can still be used as `Function1` but the use of lambdas is encouraged.\n * New: Observables which signal an event without any information use `Unit` instead of `Object`. (Note: This was\n   always true for Kotlin extension users)\n * All deprecated methods have been removed.\n * Some trivial consumer factories have been removed. You can subscribe lambdas to the stream to replicate their functionality.\n\n\nVersion 2.2.0 *(2018-09-25)*\n----------------------------\n\n * New bindings!\n    * `rxbinding-support-v4`:\n       * `ViewPager`:\n          * `pageScrollEvents`\n    * `rxbinding-recyclerview-v7`:\n       * `RecyclerView`:\n          * `flingEvents`\n * New: Target Java 8 bytecode. Use AGP 3.2 or newer and enable Java 8 source/target compatibility.\n * Deprecate `RxMenuItemCompat` which is no longer needed. Use `RxMenuItem` directly.\n * 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`.\n\n\nVersion 2.1.1 *(2018-02-12)*\n----------------------------\n\n * Fix: Include consumer ProGuard rules to prevent warning about AutoValue annotation.\n * Fix: Useless `BuildConfig` classes are no longer included.\n * 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.\n\n\nVersion 2.1.0 *(2018-01-30)*\n----------------------------\n\n * New bindings!\n    * `rxbinding-design`:\n       * `FloatingActionButton`:\n          * `visibility`: Shows or hides FAB.\n * Use add/remove callback for Snackbar dismisses.\n * 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`.\n * Fix: Propagate `@RequiresApi` annotations to Kotlin extensions.\n\n\nVersion 2.0.0 *(2017-03-06)*\n----------------------------\n\nThis version only supports RxJava 2.\n\n * New: Maven coordinates are now `com.jakewharton.rxbinding2:rxbinding` (et al). Package name is now\n   `com.jakewharton.rxbinding2.*`.\n * New: Bindings which emit an initial value now return an `InitialValueObservable<T>` which offers a\n   type-safe way to skip that value via `skipInitialValue()`.\n * Event objects which previously contained an enum now use an abstract event type and subclasses for\n   easier filtering using the `ofType(Class)` operator.\n * Bindings which previously emitted null using the `Void` type now use `Object` and omit an opaque\n   item instance for which no guarantees are provided. You can neither rely on the emitted instance\n   being the same, equal, nor different for subsequent events.\n\n\nVersion 1.0.1 *(2017-02-28)*\n----------------------------\n\n * Fix: Reduce method count cost for Kotlin modules.\n\n\nVersion 1.0.0 *(2016-12-01)*\n----------------------------\n\n * New bindings!\n    * `rxbinding`:\n       * `Toolbar`:\n          * `title` - Toolbar title.\n          * `titleRes` - Toolbar title from resource.\n          * `subtitle` - Toolbar subtitle.\n          * `subtitleRes` - Toolbar subtitle from resource.\n       * `View`:\n          * `keys` - View key events.\n    * `rxbinding-appcompat-v7`:\n       * `Toolbar`:\n          * `title` - Toolbar title.\n          * `titleRes` - Toolbar title from resource.\n          * `subtitle` - Toolbar subtitle.\n          * `subtitleRes` - Toolbar subtitle from resource.\n    * `rxbinding-design`:\n       * `BottomNavigationView`:\n          * `itemSelections` - Navigation item selections.\n    * `rxbinding-support-v4`:\n       * `NestedScrollView`:\n          * `scrollChangeEvents` - Nested scrolling change events.\n       * `SlidingPaneLayout`:\n          * `open` - Opens the panel.\n          * `panelOpens` - Sliding panel opens.\n          * `panelSlides` - Sliding panel open offsets.\n       * `ViewPager`:\n          * `pageScrollStateChanges` - Page scrolling change events.\n          * `currentItem` - Sets the current page item.\n * New: `rxbinding-support-v4` now only depends on `support-core-ui`.\n * Fix: Kotlin `Action` generic types now properly allow nulls when applicable.\n * Fix: Correct nullability of `TextViewAfterTextChangeEvent`'s `editable` property.\n * Fix: Correct nullability of `TextViewEditorActionEvent`'s `keyEvent` property.\n\n\nVersion 0.4.0 *(2016-02-18)*\n----------------------------\n\n * New bindings!\n    * `rxbinding`:\n       * `RxAbsListView`:\n          * `scrollEvents` - List scroll events.\n       * `RxAutoCompleteTextView`:\n          * `completionHint` - Sets the hint text at the bottom of the suggestion list.\n          * `threshold` - Sets the minimum number of characters before suggestions are shown.\n       * `RxPopupMenu`:\n          * `itemClicks` - Menu item clicks.\n          * `dismisses` - Menu item dismissal.\n    * `rxbinding-appcompat-v7`:\n       * `RxActionMenuView`:\n          * `itemClicks` - Menu item clicks.\n       * `RxPopupMenu`:\n          * `itemClicks` - Menu item clicks.\n          * `dismisses` - Menu item dismissal.\n    * `rxbinding-design`:\n       * `RxTextInputLayout`:\n          * `error` - Sets the error text for the text input.\n          * `errorRes` - Sets the error text resource for the text input.\n    * `rxbinding-support-v4`:\n       * `RxMenuItemCompat`:\n          * `actionViewEvents`- Menu item action view events.\n * Update Kotlin modules dependency to v1.0.0.\n * Fix: Remove 76 needless synthetic accessor methods.\n\n\nVersion 0.3.0 *(2015-10-22)*\n----------------------------\n\n * New modules!\n    * `rxbinding-leanback-v17` (and `rxbinding-leanback-v17-kotlin`) for the 'Leanback Support Library':\n       * `RxSearchBar`:\n          * `searchQuery` - Sets the query text.\n          * `searchQueryChanges` - Query text changes.\n          * `searchQueryChangeEvents` - Query text change events.\n       * `RxSearchEditText`:\n          * `keyboardDismisses` - Keyboard dismisses.\n * New bindings!\n    * `rxbinding`:\n       * `RxAutoCompleteTextView`:\n          * `itemClickEvents` - Suggestion item clicks.\n       * `RxCheckedTextView`:\n          * `checked` - Sets the checked state.\n       * `RxMenuItem`:\n          * `actionViewEvents` - Action view expand and collapse events.\n          * `checked` - Sets the checked state.\n          * `clicks` - Item clicks.\n          * `enabled` - Sets the enabled state.\n          * `icon` - Sets the icon.\n          * `iconRes` - Sets the icon using a resource.\n          * `title` - Sets the title.\n          * `titleRes` - Sets the title using a resources.\n          * `visible` - Sets the visible state.\n       * `RxSeekBar`:\n          * `userChanges` - Only user value changes.\n          * `systemChanges` - Only system value changes.\n       * `RxTextView`:\n          * `afterTextChangeEvents` - After text change events.\n          * `beforeTextChangeEvents` - Before text change events.\n          * `color` - Sets the text color.\n          * `error` - Sets the error text.\n          * `errorRes` - Sets the error text using a resource.\n          * `hint` - Sets the hint text.\n          * `hintRes` - Sets the hint text using a resource.\n       * `RxToolbar`:\n          * `navigationClicks` - Clicks on the navigation view.\n       * `RxView`:\n          * `draws` - ViewTreeObserver draw events.\n          * `globalLayouts` - ViewTreeObserver global layout events.\n          * `hovers` - View hover `MotionEvent`.\n          * `hoverEvents` - View hover `MotionEvent` events.\n          * `layoutChanges` - ViewTreeObserver layout changes.\n          * `layoutChangeEvents` - ViewTreeObserver layout change events.\n          * `preDraws` - ViewTreeObserver pre-draw events.\n          * `scrollChangeEvents` - Scroll offset change events.\n          * `systemUiVisibilityChanges` - System UI visibility changes.\n       * `RxViewGroup`:\n          * `changeEvents` - Child add and remove events.\n    * `rxbinding-appcompat-v7`:\n       * `RxToolbar`:\n          * `navigationClicks` - Clicks on the navigation view.\n    * `rxbinding-design`:\n       * `RxAppBarLayout`:\n          * `offsetChanges` - Offset value changes.\n       * `RxSwipeDismissBehavior`:\n          * `dismisses` - Dismiss events.\n       * `RxTextInputLayoutTest`:\n          * `counterEnabled` - Sets the enabled state of the counter.\n          * `counterMaxLength` - Sets the maximum length of the counter.\n          * `hint` - Sets the hint text.\n          * `hintRest` - Sets the hint text using a resource.\n    * `rxbinding-recyclerview-v7`:\n       * `RxRecyclerView`:\n          * `scrollStateChanges` - Scroll state changes (dragging, settling, idling).\n       * `RxRecyclerViewAdapter`:\n          * `childAttachStateChangeEvents` - Child attach and detach events.\n          * `dataChanges` - Adapter data changes.\n    * `rxbinding-support-v4`:\n       * `RxViewPager`:\n          * `pageSelections` - Page index selections.\n * Update Kotlin modules dependency to v1.0.0-beta-1038.\n * Update support library dependencies to v23.1.0.\n * Fix: Bindings whose values are irrelevant now use `Void` instead of `Object` (and `Unit` in\n   Kotlin).\n * Fix: Remove binding overloads which provided event objects that included no additional\n   information (aside from the source view). To include the source view for an event, add it with\n   the `map` operator (e.g., `RxFoo.bar(sourceView).map(data -> new Pair<>(sourceView, data))`).\n    * `RxCompoundButton.checkedChangeEvents`\n    * `RxRadioGroup.checkedChangeEvents`\n    * `RxRecyclerView.scrollStateChangeEvents`\n    * `RxView.clickEvents`\n    * `RxView.dragEvents`\n    * `RxView.focusChangeEvents`\n    * `RxView.hoverEvents`\n    * `RxView.longClickEvents`\n    * `RxView.touchEvents`\n\n\nVersion 0.2.0 *(2015-08-23)*\n----------------------------\n\n * New modules!\n    * `rxbinding-appcompat-v7` (and `rxbinding-appcompat-v7-kotlin`) for the 'AppCompat Support Library':\n       * `RxSearchView`:\n          * `queryTextChanges` - Query text changes.\n          * `queryTextChangeEvents` - Query text change events.\n          * `query` - Sets the query text.\n       * `RxToolbar`:\n          * `itemClicks` - Item clicks.\n    * `rxbinding-design` (and `rxbinding-design-kotlin`) for the 'Design Support Library':\n       * `RxNavigationView`:\n          * `itemSelections` - Item selections.\n       * `RxSnackbar`:\n          * `dismisses` - Dismiss events.\n       * `RxTabLayout`:\n          * `selections` - Tab selections.\n          * `selectionEvents` - Tab selection, reselection, and unselection events.\n          * `select` - Sets the selected tab.\n    * `rxbinding-recyclerview-v7` (and `rxbinding-recyclerview-v7-kotlin`) for the 'RecyclerView Support Library':\n       * `RxRecyclerView`:\n          * `scrollEvents` - Scroll events.\n          * `scrollStateChangeEvents` - Scroll state change events (dragging, settling, idling).\n * New bindings!\n    * `rxbinding`:\n       * `RxSearchView`:\n          * `queryTextChanges` - Query text changes.\n          * `queryTextChangeEvents` - Query text change events.\n          * `query` - Sets the query text.\n       * `RxSwipeRefreshLayout`:\n          * `refreshes` - Refresh events.\n          * `refreshing` - Whether showing the refreshing indicator.\n       * `RxTextSwitcher`:\n          * `text` - Sets the text to display.\n          * `currentText` - Sets the current displayed text.\n       * `RxToolbar`:\n          * `itemClicks` - Item clicks.\n       * `RxView`:\n          * `attaches` - Attach indication.\n          * `attachEvents` - Attach and detach events.\n          * `detaches` - Detach indication.\n * Added `@CheckResult` to methods which will generate lint warnings if the return value is ignored.\n * Added `@NonNull` to methods to indicate to lint that they will never return null and added to parameters\n   to indicate to lint for which arguments is null not allowed. Explicit null checks have been removed.\n * Update Kotlin modules to Kotlin v0.12.1230.\n * Update support library dependencies to v23.0.0.\n * Minimum SDK version is now 14 because reasons.\n * Fix: Kotlin modules now have correct dependencies on the corresponding Java modules.\n\n\nVersion 0.1.0 *(2015-08-02)*\n----------------------------\n\nInitial release.\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "RxBinding\n=========\n\nRxJava binding APIs for Android UI widgets from the platform and support libraries.\n\n\nDownload\n--------\n\nPlatform bindings:\n```groovy\nimplementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'\n```\n\nAndroidX library bindings:\n```groovy\nimplementation 'com.jakewharton.rxbinding4:rxbinding-core:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-appcompat:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-drawerlayout:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-leanback:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-recyclerview:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-slidingpanelayout:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-swiperefreshlayout:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-viewpager:4.0.0'\nimplementation 'com.jakewharton.rxbinding4:rxbinding-viewpager2:4.0.0'\n```\n\nGoogle 'material' library bindings:\n```groovy\nimplementation 'com.jakewharton.rxbinding4:rxbinding-material:4.0.0'\n```\n\nSnapshots of the development version are available in [Sonatype's `snapshots` repository][snap].\n\n\nLicense\n-------\n\n    Copyright (C) 2015 Jake Wharton\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\n\n\n\n [snap]: https://oss.sonatype.org/content/repositories/snapshots/\n"
  },
  {
    "path": "RELEASING.md",
    "content": "Releasing\n========\n\n 1. Change the version in `gradle.properties` to a non-SNAPSHOT version.\n 2. Update the `CHANGELOG.md` for the impending release.\n 3. Update the `README.md` with the new version.\n 4. `git commit -am \"Prepare for release X.Y.Z.\"` (where X.Y.Z is the new version)\n 5. `git tag -a X.Y.Z -m \"Version X.Y.Z\"` (where X.Y.Z is the new version)\n 6. `./gradlew clean uploadArchives`\n 7. Update the `gradle.properties` to the next SNAPSHOT version.\n 8. `git commit -am \"Prepare next development version.\"`\n 9. `git push && git push --tags`\n 10. Visit [Sonatype Nexus](https://oss.sonatype.org/) and promote the artifact.\n"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n  ext.buildConfig = [\n    'minSdkVersion': 14,\n    'compileSdkVersion': 29,\n  ]\n  ext.versions = [\n    'kotlin': '1.3.72',\n  ]\n  ext.deps = [\n    'kotlinStdlib': \"org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}\",\n\n    'androidXAnnotations': 'androidx.annotation:annotation:1.0.0',\n    'androidXAppCompat': 'androidx.appcompat:appcompat:1.0.0',\n    'androidXCore': 'androidx.core:core:1.0.0',\n    'androidXDrawerLayout': 'androidx.drawerlayout:drawerlayout:1.0.0',\n    'androidXLeanback': 'androidx.leanback:leanback:1.0.0',\n    'androidXRecyclerView': 'androidx.recyclerview:recyclerview:1.0.0',\n    'androidXSlidingPaneLayout': 'androidx.slidingpanelayout:slidingpanelayout:1.0.0',\n    'androidXSwipeRefreshLayout': 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0',\n    'androidXViewPager': 'androidx.viewpager:viewpager:1.0.0',\n    'androidXViewPager2': 'androidx.viewpager2:viewpager2:1.0.0',\n\n    'androidXTestCore': 'androidx.test:core:1.1.0',\n    'androidXTestRunner': 'androidx.test:runner:1.1.1',\n    'androidXTestRules': 'androidx.test:rules:1.1.1',\n    'androidXTestEspresso': 'androidx.test.espresso:espresso-core:3.1.1',\n    'androidXTestEspressoContrib': 'androidx.test.espresso:espresso-contrib:3.1.1',\n\n    'googleMaterial': 'com.google.android.material:material:1.0.0',\n\n    'rxJava': 'io.reactivex.rxjava3:rxjava:3.0.3',\n    'rxAndroid': 'io.reactivex.rxjava3:rxandroid:3.0.0',\n\n    'junit': 'junit:junit:4.12',\n  ]\n\n  dependencies {\n    classpath 'com.android.tools.build:gradle:3.6.3'\n    classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}\"\n  }\n  repositories {\n    mavenCentral()\n    google()\n    jcenter()\n  }\n}\n\nsubprojects {\n  repositories {\n    mavenCentral()\n    google()\n    jcenter()\n  }\n\n  group = GROUP\n  version = VERSION_NAME\n\n  afterEvaluate {\n    // The default 'assemble' task only applies to normal variants. Add test variants as well.\n    def assembleProvider = tasks.named('assemble')\n    android.testVariants.all { variant ->\n      assembleProvider.configure {\n        it.dependsOn(variant.assembleProvider)\n      }\n    }\n\n    // Disable BuildConfig generation.\n    // TODO replace with https://issuetracker.google.com/issues/72050365 once released.\n    android.libraryVariants.all {\n      it.generateBuildConfigProvider.configure {\n        enabled = false\n      }\n    }\n\n    tasks.withType(com.android.build.gradle.internal.tasks.AndroidTestTask) { task ->\n      task.doFirst {\n        logging.level = LogLevel.INFO\n      }\n      task.doLast {\n        logging.level = LogLevel.LIFECYCLE\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gradle/gradle-mvn-push.gradle",
    "content": "/*\n * Copyright 2013 Chris Banes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\napply plugin: 'maven'\napply plugin: 'signing'\n\ndef isReleaseBuild() {\n    return VERSION_NAME.contains(\"SNAPSHOT\") == false\n}\n\ndef getRepositoryUsername() {\n    return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : \"\"\n}\n\ndef getRepositoryPassword() {\n    return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : \"\"\n}\n\nafterEvaluate { project ->\n    uploadArchives {\n        repositories {\n            mavenDeployer {\n                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }\n\n                pom.groupId = GROUP\n                pom.artifactId = POM_ARTIFACT_ID\n                pom.version = VERSION_NAME\n\n                repository(url: \"https://oss.sonatype.org/service/local/staging/deploy/maven2/\") {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n                snapshotRepository(url: \"https://oss.sonatype.org/content/repositories/snapshots/\") {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n\n                pom.project {\n                    name POM_NAME\n                    packaging POM_PACKAGING\n                    description POM_DESCRIPTION\n                    url POM_URL\n\n                    scm {\n                        url POM_SCM_URL\n                        connection POM_SCM_CONNECTION\n                        developerConnection POM_SCM_DEV_CONNECTION\n                    }\n\n                    licenses {\n                        license {\n                            name POM_LICENCE_NAME\n                            url POM_LICENCE_URL\n                            distribution POM_LICENCE_DIST\n                        }\n                    }\n\n                    developers {\n                        developer {\n                            id POM_DEVELOPER_ID\n                            name POM_DEVELOPER_NAME\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    signing {\n        required { isReleaseBuild() && gradle.taskGraph.hasTask(\"uploadArchives\") }\n        sign configurations.archives\n    }\n\n    task androidJavadocs(type: Javadoc) {\n        if (!project.plugins.hasPlugin('kotlin-android')) {\n            source = android.sourceSets.main.java.srcDirs\n        }\n        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))\n        exclude '**/internal/*'\n        include '**/*.java'\n\n        if (JavaVersion.current().isJava8Compatible()) {\n            options.addStringOption('Xdoclint:none', '-quiet')\n        }\n    }\n\n    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {\n        classifier = 'javadoc'\n        from androidJavadocs.destinationDir\n    }\n\n    task androidSourcesJar(type: Jar) {\n        classifier = 'sources'\n        from android.sourceSets.main.java.source\n    }\n\n    artifacts {\n        archives androidSourcesJar\n        archives androidJavadocsJar\n    }\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.4-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "GROUP=com.jakewharton.rxbinding4\nVERSION_NAME=4.0.1-SNAPSHOT\n\nPOM_DESCRIPTION=RxJava binding APIs for Android's UI widgets.\n\nPOM_URL=https://github.com/JakeWharton/RxBinding/\nPOM_SCM_URL=https://github.com/JakeWharton/RxBinding/\nPOM_SCM_CONNECTION=scm:git:git://github.com/JakeWharton/RxBinding.git\nPOM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/JakeWharton/RxBinding.git\n\nPOM_LICENCE_NAME=The Apache Software License, Version 2.0\nPOM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt\nPOM_LICENCE_DIST=repo\n\nPOM_DEVELOPER_ID=jakewharton\nPOM_DEVELOPER_NAME=Jake Wharton\n\nandroid.useAndroidX=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "rxbinding/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api deps.androidXAnnotations\n  api deps.kotlinStdlib\n  api deps.rxJava\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestCore\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding\nPOM_NAME=RxBinding\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4\">\n\n  <application>\n    <activity android:name=\".view.RxViewAttachTestActivity\"/>\n    <activity android:name=\".view.RxViewSystemUiVisibilityTestActivity\"/>\n    <activity android:name=\".widget.RxAdapterViewTestActivity\"/>\n    <activity android:name=\".widget.RxAbsListViewTestActivity\"/>\n    <activity android:name=\".widget.RxAutoCompleteTextViewTestActivity\"/>\n    <activity android:name=\".widget.RxRatingBarTestActivity\"/>\n    <activity android:name=\".widget.RxSearchViewTestActivity\"/>\n    <activity android:name=\".widget.RxSeekBarTestActivity\"/>\n    <activity android:name=\".widget.RxPopupMenuTestActivity\"/>\n    <activity\n        android:name=\".widget.RxToolbarTestActivity\"\n        android:theme=\"@android:style/Theme.Material\"\n        />\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/internal/MainThreadKtTest.java",
    "content": "package com.jakewharton.rxbinding4.internal;\n\nimport androidx.test.annotation.UiThreadTest;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic final class MainThreadKtTest {\n  @UiThreadTest\n  @Test public void checkMainOnMainDoesNotNotify() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    assertTrue(Preconditions.checkMainThread(o));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void checkMainOnNotMainNotifies() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    assertFalse(Preconditions.checkMainThread(o));\n    Throwable e = o.takeError();\n    assertTrue(e instanceof IllegalStateException);\n    assertTrue(e.getMessage().startsWith(\"Expected to be called on the main thread but was \"));\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxMenuItemTest.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.drawable.Drawable;\nimport android.view.ActionProvider;\nimport android.view.ContextMenu;\nimport android.view.LayoutInflater;\nimport android.view.MenuItem;\nimport android.view.SubMenu;\nimport android.view.View;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport kotlin.jvm.functions.Function1;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\n\npublic final class RxMenuItemTest {\n  private final Context context = ApplicationProvider.getApplicationContext();\n  private final TestMenuItem menuItem = new TestMenuItem(context);\n\n  @Test @UiThreadTest public void clicks() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxMenuItem.clicks(menuItem).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    menuItem.performClick();\n    assertNotNull(o.takeNext());\n\n    menuItem.performClick();\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    menuItem.performClick();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void clicksAvoidHandling() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxMenuItem.clicks(menuItem, item -> false).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    menuItem.performClick();\n    o.assertNoMoreEvents();\n\n    menuItem.performClick();\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    menuItem.performClick();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void actionViewEvents() {\n    RecordingObserver<MenuItemActionViewEvent> o = new RecordingObserver<>();\n    RxMenuItem.actionViewEvents(menuItem).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    menuItem.expandActionView();\n    assertEquals(new MenuItemActionViewExpandEvent(menuItem), o.takeNext());\n\n    menuItem.collapseActionView();\n    assertEquals(new MenuItemActionViewCollapseEvent(menuItem), o.takeNext());\n\n    o.dispose();\n\n    menuItem.performClick();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void actionViewEventsAvoidHandling() {\n    Function1<MenuItemActionViewEvent, Boolean> handled = menuItem -> false;\n\n    RecordingObserver<MenuItemActionViewEvent> o = new RecordingObserver<>();\n    RxMenuItem.actionViewEvents(menuItem, handled).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    menuItem.expandActionView();\n    assertFalse(menuItem.isActionViewExpanded()); // Should be prevented by handler\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    menuItem.performClick();\n    o.assertNoMoreEvents();\n  }\n\n  // There is no accessible default implementation of MenuItem, so we have to create one\n  private static final class TestMenuItem implements MenuItem {\n\n    private final Context context;\n\n    private int itemId;\n    private int groupId;\n    private int order;\n    private CharSequence title;\n    private CharSequence titleCondensed;\n    private Drawable icon;\n    private Intent intent;\n    private char numericChar;\n    private char alphaChar;\n    private boolean checkable;\n    private boolean checked;\n    private boolean visible;\n    private boolean enabled;\n    private OnMenuItemClickListener menuItemClickListener;\n    private int actionEnum;\n    private View actionView;\n    private ActionProvider actionProvider;\n    private boolean isActionViewExpanded;\n    private OnActionExpandListener actionExpandListener;\n\n    public TestMenuItem(Context context) {\n      this.context = context;\n    }\n\n    public void performClick() {\n      if (menuItemClickListener != null) {\n        menuItemClickListener.onMenuItemClick(this);\n      }\n    }\n\n    @Override public int getItemId() {\n      return itemId;\n    }\n\n    @Override public int getGroupId() {\n      return groupId;\n    }\n\n    @Override public int getOrder() {\n      return order;\n    }\n\n    @Override public MenuItem setTitle(CharSequence title) {\n      this.title = title;\n      return this;\n    }\n\n    @Override public MenuItem setTitle(int title) {\n      this.title = context.getText(title);\n      return this;\n    }\n\n    @Override public CharSequence getTitle() {\n      return title;\n    }\n\n    @Override public MenuItem setTitleCondensed(CharSequence title) {\n      this.titleCondensed = title;\n      return this;\n    }\n\n    @Override public CharSequence getTitleCondensed() {\n      return titleCondensed;\n    }\n\n    @Override public MenuItem setIcon(Drawable icon) {\n      this.icon = icon;\n      return this;\n    }\n\n    @Override public MenuItem setIcon(int iconRes) {\n      this.icon = context.getResources().getDrawable(iconRes);\n      return this;\n    }\n\n    @Override public Drawable getIcon() {\n      return icon;\n    }\n\n    @Override public MenuItem setIntent(Intent intent) {\n      this.intent = intent;\n      return this;\n    }\n\n    @Override public Intent getIntent() {\n      return intent;\n    }\n\n    @Override public MenuItem setShortcut(char numericChar, char alphaChar) {\n      this.numericChar = numericChar;\n      this.alphaChar = alphaChar;\n      return this;\n    }\n\n    @Override public MenuItem setNumericShortcut(char numericChar) {\n      this.numericChar = numericChar;\n      return this;\n    }\n\n    @Override public char getNumericShortcut() {\n      return numericChar;\n    }\n\n    @Override public MenuItem setAlphabeticShortcut(char alphaChar) {\n      this.alphaChar = alphaChar;\n      return this;\n    }\n\n    @Override public char getAlphabeticShortcut() {\n      return alphaChar;\n    }\n\n    @Override public MenuItem setCheckable(boolean checkable) {\n      this.checkable = checkable;\n      return this;\n    }\n\n    @Override public boolean isCheckable() {\n      return checkable;\n    }\n\n    @Override public MenuItem setChecked(boolean checked) {\n      if (checkable) {\n        this.checked = checked;\n      }\n      return this;\n    }\n\n    @Override public boolean isChecked() {\n      return checked;\n    }\n\n    @Override public MenuItem setVisible(boolean visible) {\n      this.visible = visible;\n      return this;\n    }\n\n    @Override public boolean isVisible() {\n      return visible;\n    }\n\n    @Override public MenuItem setEnabled(boolean enabled) {\n      this.enabled = enabled;\n      return this;\n    }\n\n    @Override public boolean isEnabled() {\n      return enabled;\n    }\n\n    @Override public boolean hasSubMenu() {\n      return false;\n    }\n\n    @Override public SubMenu getSubMenu() {\n      return null;\n    }\n\n    @Override\n    public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {\n      this.menuItemClickListener = menuItemClickListener;\n      return this;\n    }\n\n    @Override public ContextMenu.ContextMenuInfo getMenuInfo() {\n      return null;\n    }\n\n    @Override public void setShowAsAction(int actionEnum) {\n      this.actionEnum = actionEnum;\n    }\n\n    @Override public MenuItem setShowAsActionFlags(int actionEnum) {\n      this.actionEnum = actionEnum;\n      return this;\n    }\n\n    @Override public MenuItem setActionView(View view) {\n      this.actionView = view;\n      return this;\n    }\n\n    @Override public MenuItem setActionView(int resId) {\n      this.actionView = LayoutInflater.from(context).inflate(resId, null);\n      return this;\n    }\n\n    @Override public View getActionView() {\n      return actionView;\n    }\n\n    @Override public MenuItem setActionProvider(ActionProvider actionProvider) {\n      this.actionProvider = actionProvider;\n      return this;\n    }\n\n    @Override public ActionProvider getActionProvider() {\n      return actionProvider;\n    }\n\n    @Override public boolean expandActionView() {\n      if (isActionViewExpanded) {\n        return false;\n      }\n\n      if (actionExpandListener != null && !actionExpandListener.onMenuItemActionExpand(this)) {\n        return false;\n      }\n\n      isActionViewExpanded = true;\n      return true;\n    }\n\n    @Override public boolean collapseActionView() {\n      if (!isActionViewExpanded) {\n        return false;\n      }\n\n      if (actionExpandListener != null && !actionExpandListener.onMenuItemActionCollapse(this)) {\n        return false;\n      }\n\n      isActionViewExpanded = false;\n      return true;\n    }\n\n    @Override public boolean isActionViewExpanded() {\n      return isActionViewExpanded;\n    }\n\n    @Override public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {\n      this.actionExpandListener = listener;\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTest.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\npublic final class RxViewAttachTest {\n  @Rule public final ActivityTestRule<RxViewAttachTestActivity> activityRule =\n      new ActivityTestRule<>(RxViewAttachTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n  FrameLayout parent;\n  View child;\n\n  @Before public void setUp() {\n    RxViewAttachTestActivity activity = activityRule.getActivity();\n    parent = activity.parent;\n    child = activity.child;\n  }\n\n  @Test public void attaches() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.attaches(child)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    instrumentation.runOnMainSync(() -> parent.addView(child));\n    assertNotNull(o.takeNext());\n    instrumentation.runOnMainSync(() -> parent.removeView(child));\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> {\n      parent.addView(child);\n      parent.removeView(child);\n    });\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void attachEvents() {\n    RecordingObserver<ViewAttachEvent> o = new RecordingObserver<>();\n    RxView.attachEvents(child)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    instrumentation.runOnMainSync(() -> parent.addView(child));\n    assertEquals(new ViewAttachAttachedEvent(child), o.takeNext());\n    instrumentation.runOnMainSync(() -> parent.removeView(child));\n    assertEquals(new ViewAttachDetachedEvent(child), o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> {\n      parent.addView(child);\n      parent.removeView(child);\n    });\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void detaches() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.detaches(child)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    instrumentation.runOnMainSync(() -> parent.addView(child));\n    o.assertNoMoreEvents();\n    instrumentation.runOnMainSync(() -> parent.removeView(child));\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> {\n      parent.addView(child);\n      parent.removeView(child);\n    });\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewAttachTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.FrameLayout;\n\npublic final class RxViewAttachTestActivity extends Activity {\n  FrameLayout parent;\n  View child;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    parent = new FrameLayout(this);\n    child = new View(this);\n    setContentView(parent);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewGroupTest.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxViewGroupTest {\n  private final Context context = ApplicationProvider.getApplicationContext();\n  private final LinearLayout parent = new LinearLayout(context);\n  private final View child = new View(context);\n\n  @Test @UiThreadTest public void childViewEvents() {\n    RecordingObserver<ViewGroupHierarchyChangeEvent> o = new RecordingObserver<>();\n    RxViewGroup.changeEvents(parent).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    parent.addView(child);\n    assertEquals(new ViewGroupHierarchyChildViewAddEvent(parent, child), o.takeNext());\n\n    parent.removeView(child);\n    assertEquals(new ViewGroupHierarchyChildViewRemoveEvent(parent, child), o.takeNext());\n\n    o.dispose();\n\n    parent.addView(child);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTest.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxViewSystemUiVisibilityTest {\n  @Rule public final ActivityTestRule<RxViewSystemUiVisibilityTestActivity> activityRule =\n      new ActivityTestRule<>(RxViewSystemUiVisibilityTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n  FrameLayout root;\n\n  @Before public void setUp() {\n    RxViewSystemUiVisibilityTestActivity activity = activityRule.getActivity();\n    root = activity.root;\n    root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);\n  }\n\n  @Test public void systemUiVisibilityChanges() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxView.systemUiVisibilityChanges(root)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(\n        () -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));\n    assertEquals(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE));\n    assertEquals(View.SYSTEM_UI_FLAG_VISIBLE, o.takeNext().intValue());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(\n        () -> root.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewSystemUiVisibilityTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.FrameLayout;\n\npublic final class RxViewSystemUiVisibilityTestActivity extends Activity {\n  FrameLayout root;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    root = new FrameLayout(this);\n    setContentView(root);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/view/RxViewTest.java",
    "content": "package com.jakewharton.rxbinding4.view;\n\nimport android.content.Context;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport androidx.test.filters.SdkSuppress;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport org.junit.Test;\n\nimport static android.view.MotionEvent.ACTION_DOWN;\nimport static android.view.MotionEvent.ACTION_HOVER_ENTER;\nimport static android.view.MotionEvent.ACTION_HOVER_EXIT;\nimport static android.view.MotionEvent.ACTION_HOVER_MOVE;\nimport static android.view.MotionEvent.ACTION_MOVE;\nimport static android.view.MotionEvent.ACTION_UP;\nimport static com.jakewharton.rxbinding4.MotionEventUtil.hoverMotionEventAtPosition;\nimport static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertNotSame;\nimport static org.junit.Assert.assertSame;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\npublic final class RxViewTest {\n  private final Context context = ApplicationProvider.getApplicationContext();\n  private final View view = new View(context);\n\n  @Test @UiThreadTest public void clicks() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.clicks(view).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    view.performClick();\n    assertNotNull(o.takeNext());\n\n    view.performClick();\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    view.performClick();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void drags() {\n    //RecordingObserver<ViewClickEvent> o = new RecordingObserver<>();\n    //RxView.clickEvents(view).subscribe(o);\n    //o.assertNoMoreEvents(); // No initial value.\n    //\n    //clock.advance(1, SECONDS);\n    //view.performClick();\n    //assertEquals(ViewClickEvent.create(view, 1000), o.takeNext());\n    //\n    //clock.advance(1, SECONDS);\n    //view.performClick();\n    //assertEquals(ViewClickEvent.create(view, 2000), o.takeNext());\n    //\n    //o.dispose();\n    //\n    //clock.advance(1, SECONDS);\n    //view.performClick();\n    //o.assertNoMoreEvents();\n  }\n\n  @SdkSuppress(minSdkVersion = 16)\n  @Test @UiThreadTest public void drawEvents() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.draws(view).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    view.getViewTreeObserver().dispatchOnDraw();\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    view.getViewTreeObserver().dispatchOnDraw();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void focusChanges() {\n    // We need a parent which can take focus from our view when it attempts to clear.\n    LinearLayout parent = new LinearLayout(context);\n    parent.setFocusable(true);\n    parent.addView(view);\n\n    view.setFocusable(true);\n\n    RecordingObserver<Boolean> o = new RecordingObserver<>();\n    RxView.focusChanges(view).subscribe(o);\n    assertFalse(o.takeNext());\n\n    view.requestFocus();\n    assertTrue(o.takeNext());\n\n    view.clearFocus();\n    assertFalse(o.takeNext());\n\n    o.dispose();\n\n    view.requestFocus();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void globalLayouts() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.globalLayouts(view).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    view.getViewTreeObserver().dispatchOnGlobalLayout();\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n    view.getViewTreeObserver().dispatchOnGlobalLayout();\n\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void hovers() {\n    RecordingObserver<MotionEvent> o = new RecordingObserver<>();\n    RxView.hovers(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_ENTER, 0, 50));\n    MotionEvent event1 = o.takeNext();\n    assertEquals(ACTION_HOVER_ENTER, event1.getAction());\n\n    view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_MOVE, 1, 50));\n    MotionEvent event2 = o.takeNext();\n    assertEquals(ACTION_HOVER_MOVE, event2.getAction());\n\n    o.dispose();\n\n    view.dispatchGenericMotionEvent(hoverMotionEventAtPosition(view, ACTION_HOVER_EXIT, 1, 50));\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void layoutChanges() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.layoutChanges(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());\n    assertNotNull(o.takeNext());\n\n    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());\n    o.assertNoMoreEvents();\n\n    o.dispose();\n    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void layoutChangeEvents() {\n    RecordingObserver<ViewLayoutChangeEvent> o = new RecordingObserver<>();\n    RxView.layoutChangeEvents(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());\n    ViewLayoutChangeEvent event1 = o.takeNext();\n    assertSame(view, event1.getView());\n    assertNotSame(event1.getOldLeft(), event1.getLeft());\n    assertSame(event1.getOldRight(), event1.getRight());\n\n    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());\n    o.assertNoMoreEvents();\n\n    o.dispose();\n    view.layout(view.getLeft() - 5, view.getTop() - 5, view.getRight(), view.getBottom());\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void longClicks() {\n    // We need a parent because long presses delegate to the parent.\n    LinearLayout parent = new LinearLayout(context) {\n      @Override public boolean showContextMenuForChild(View originalView) {\n        return true;\n      }\n    };\n    parent.addView(view);\n\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.longClicks(view).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    view.performLongClick();\n    assertNotNull(o.takeNext());\n\n    view.performLongClick();\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    view.performLongClick();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void preDrawEvents() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxView.preDraws(view, AlwaysTrue.INSTANCE).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    view.getViewTreeObserver().dispatchOnPreDraw();\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    view.getViewTreeObserver().dispatchOnPreDraw();\n    o.assertNoMoreEvents();\n  }\n\n  @SdkSuppress(minSdkVersion = 23)\n  @Test @UiThreadTest public void scrollChangeEvents() {\n    RecordingObserver<ViewScrollChangeEvent> o = new RecordingObserver<>();\n    RxView.scrollChangeEvents(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.scrollTo(1, 1);\n    ViewScrollChangeEvent event0 = o.takeNext();\n    assertSame(view, event0.getView());\n    assertEquals(1, event0.getScrollX());\n    assertEquals(1, event0.getScrollY());\n    assertEquals(0, event0.getOldScrollX());\n    assertEquals(0, event0.getOldScrollY());\n\n    view.scrollTo(2, 2);\n    ViewScrollChangeEvent event1 = o.takeNext();\n    assertSame(view, event1.getView());\n    assertEquals(2, event1.getScrollX());\n    assertEquals(2, event1.getScrollY());\n    assertEquals(1, event1.getOldScrollX());\n    assertEquals(1, event1.getOldScrollY());\n\n    o.dispose();\n    view.scrollTo(3, 3);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void touches() {\n    RecordingObserver<MotionEvent> o = new RecordingObserver<>();\n    RxView.touches(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_DOWN, 0, 50));\n    MotionEvent event1 = o.takeNext();\n    assertEquals(ACTION_DOWN, event1.getAction());\n\n    view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_MOVE, 1, 50));\n    MotionEvent event2 = o.takeNext();\n    assertEquals(ACTION_MOVE, event2.getAction());\n\n    o.dispose();\n\n    view.dispatchTouchEvent(motionEventAtPosition(view, ACTION_UP, 1, 50));\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void keys() {\n    RecordingObserver<KeyEvent> o = new RecordingObserver<>();\n    RxView.keys(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_R));\n    KeyEvent event1 = o.takeNext();\n    assertEquals(KeyEvent.ACTION_DOWN, event1.getAction());\n\n    view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_H));\n    KeyEvent event2 = o.takeNext();\n    assertEquals(KeyEvent.KEYCODE_H, event2.getKeyCode());\n\n    o.dispose();\n\n    view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_S));\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void visibility() throws Throwable {\n    view.setVisibility(View.VISIBLE);\n    Consumer<? super Boolean> action = RxView.visibility(view);\n    action.accept(false);\n    assertEquals(View.GONE, view.getVisibility());\n    action.accept(true);\n    assertEquals(View.VISIBLE, view.getVisibility());\n  }\n\n  @Test @UiThreadTest public void visibilityCustomFalse() throws Throwable {\n    view.setVisibility(View.VISIBLE);\n    Consumer<? super Boolean> action = RxView.visibility(view, View.INVISIBLE);\n    action.accept(false);\n    assertEquals(View.INVISIBLE, view.getVisibility());\n    action.accept(true);\n    assertEquals(View.VISIBLE, view.getVisibility());\n  }\n\n  @SuppressWarnings(\"ResourceType\") @Test @UiThreadTest public void setVisibilityCustomFalseToVisibleThrows() {\n    try {\n      RxView.visibility(view, View.VISIBLE);\n      fail();\n    } catch (IllegalArgumentException e) {\n      assertEquals(\"Setting visibility to VISIBLE when false would have no effect.\", e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ListView;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxAbsListViewTest {\n  @Rule public final ActivityTestRule<RxAbsListViewTestActivity> activityRule =\n      new ActivityTestRule<>(RxAbsListViewTestActivity.class);\n\n  private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  private RxAbsListViewTestActivity activity;\n  ListView listView;\n\n  @Before public void setUp() {\n    activity = activityRule.getActivity();\n    listView = activity.listView;\n  }\n\n  @Test public void scrollEvents() {\n    RecordingObserver<AbsListViewScrollEvent> o = new RecordingObserver<>();\n    RxAbsListView.scrollEvents(listView)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    AbsListViewScrollEvent event = o.takeNext();\n    assertEquals(100, event.getTotalItemCount());\n    assertEquals(0, event.getFirstVisibleItem());\n    assertEquals(0, event.getScrollState());\n\n    instrumentation.runOnMainSync(() -> listView.smoothScrollToPosition(50));\n    AbsListViewScrollEvent event1 = o.takeNext();\n    assertEquals(listView, event1.getView());\n    assertEquals(100, event1.getTotalItemCount());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> listView.smoothScrollToPosition(100));\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAbsListViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.ArrayAdapter;\nimport android.widget.FrameLayout;\nimport android.widget.ListView;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic final class RxAbsListViewTestActivity extends Activity {\n  ListView listView;\n\n  List<String> values;\n  ArrayAdapter<String> adapter;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    values = createValues(100);\n    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);\n\n    listView = new ListView(this);\n    listView.setAdapter(adapter);\n\n    FrameLayout layout = new FrameLayout(this);\n    layout.addView(listView);\n    setContentView(layout);\n  }\n\n  private static List<String> createValues(int count) {\n    final List<String> values = new ArrayList<>(count);\n    for (int i = 0; i < count; i++) {\n      values.add(String.valueOf(i));\n    }\n    return values;\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport androidx.test.annotation.UiThreadTest;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertSame;\n\npublic final class RxAdapterTest {\n  private final TestAdapter adapter = new TestAdapter();\n\n  @Test @UiThreadTest public void dataChanges() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxAdapter.dataChanges(adapter).subscribe(o);\n    assertSame(adapter, o.takeNext());\n\n    adapter.notifyDataSetChanged();\n    assertSame(adapter, o.takeNext());\n\n    adapter.notifyDataSetChanged();\n    assertSame(adapter, o.takeNext());\n\n    o.dispose();\n    adapter.notifyDataSetChanged();\n    o.assertNoMoreEvents();\n  }\n\n  private static final class TestAdapter extends BaseAdapter {\n    TestAdapter() {\n    }\n\n    @Override public int getCount() {\n      return 0;\n    }\n\n    @Override public Object getItem(int position) {\n      return null;\n    }\n\n    @Override public long getItemId(int position) {\n      return 0;\n    }\n\n    @Override public View getView(int position, View convertView, ViewGroup parent) {\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ListView;\nimport android.widget.Spinner;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\n\npublic final class RxAdapterViewTest {\n  @Rule public final ActivityTestRule<RxAdapterViewTestActivity> activityRule =\n      new ActivityTestRule<>(RxAdapterViewTestActivity.class);\n\n  private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  RxAdapterViewTestActivity activity;\n  Spinner spinner;\n  ListView listView;\n\n  @Before public void setUp() {\n    activity = activityRule.getActivity();\n    spinner = activity.spinner;\n    listView = activity.listView;\n  }\n\n  @Test public void itemSelections() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxAdapterView.itemSelections(spinner)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    assertEquals(0, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> spinner.setSelection(2));\n    assertEquals(2, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> spinner.setSelection(0));\n    assertEquals(0, o.takeNext().intValue());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> spinner.setSelection(1));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void selectionEvents() {\n    RecordingObserver<AdapterViewSelectionEvent> o = new RecordingObserver<>();\n    RxAdapterView.selectionEvents(spinner)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    AdapterViewItemSelectionEvent event1 = (AdapterViewItemSelectionEvent) o.takeNext();\n    assertSame(spinner, event1.getView());\n    assertNotNull(event1.getSelectedView());\n    assertEquals(0, event1.getPosition());\n    assertEquals(0, event1.getId());\n\n    instrumentation.runOnMainSync(() -> spinner.setSelection(2));\n    AdapterViewItemSelectionEvent event2 = (AdapterViewItemSelectionEvent) o.takeNext();\n    assertSame(spinner, event2.getView());\n    assertNotNull(event2.getSelectedView());\n    assertEquals(2, event2.getPosition());\n    assertEquals(2, event2.getId());\n\n    instrumentation.runOnMainSync(() -> {\n      activity.values.clear();\n      activity.adapter.notifyDataSetChanged();\n    });\n    assertEquals(new AdapterViewNothingSelectionEvent(spinner), o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> {\n      activity.values.add(\"Hello\");\n      activity.adapter.notifyDataSetChanged();\n    });\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void itemClicks() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxAdapterView.itemClicks(listView)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(2), 2, 2));\n    assertEquals(2, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(0), 0, 0));\n    assertEquals(0, o.takeNext().intValue());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(1), 1, 1));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void itemClickEvents() {\n    RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();\n    RxAdapterView.itemClickEvents(listView)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(2), 2, 2));\n    AdapterViewItemClickEvent event = o.takeNext();\n    assertEquals(listView, event.getView());\n    assertNotNull(event.getClickedView());\n    assertEquals(2, event.getPosition());\n    assertEquals(2, event.getId());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> listView.performItemClick(listView.getChildAt(1), 1, 1));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void itemLongClicks() {\n    // TODO\n  }\n\n  @Test public void itemLongClickEvents() {\n    // TODO\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAdapterViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.ArrayAdapter;\nimport android.widget.FrameLayout;\nimport android.widget.ListView;\nimport android.widget.Spinner;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic final class RxAdapterViewTestActivity extends Activity {\n  Spinner spinner;\n  ListView listView;\n\n  List<String> values;\n  ArrayAdapter<String> adapter;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    values = new ArrayList<>(Arrays.asList(\"One\", \"Two\", \"Three\"));\n    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);\n\n    spinner = new Spinner(this);\n    spinner.setAdapter(adapter);\n\n    listView = new ListView(this);\n    listView.setAdapter(adapter);\n\n    FrameLayout layout = new FrameLayout(this);\n    layout.addView(spinner);\n    layout.addView(listView);\n    setContentView(layout);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.ArrayAdapter;\nimport android.widget.AutoCompleteTextView;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport com.jakewharton.rxbinding4.test.R;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport java.util.Arrays;\nimport java.util.List;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onData;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.action.ViewActions.clearText;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.action.ViewActions.typeText;\nimport static androidx.test.espresso.matcher.RootMatchers.withDecorView;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.hamcrest.CoreMatchers.is;\nimport static org.hamcrest.CoreMatchers.not;\nimport static org.hamcrest.CoreMatchers.startsWith;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\npublic final class RxAutoCompleteTextViewTest {\n  @Rule public final ActivityTestRule<RxAutoCompleteTextViewTestActivity> activityRule =\n      new ActivityTestRule<>(RxAutoCompleteTextViewTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  private RxAutoCompleteTextViewTestActivity activity;\n  AutoCompleteTextView autoCompleteTextView;\n\n  @Before public void setUp() {\n    activity = activityRule.getActivity();\n    autoCompleteTextView = activity.autoCompleteTextView;\n  }\n\n  @Test public void itemClickEvents() {\n    instrumentation.runOnMainSync(() -> {\n      autoCompleteTextView.setThreshold(1);\n\n      List<String> values = Arrays.asList(\"Two\", \"Three\", \"Twenty\");\n      ArrayAdapter<String> adapter = new ArrayAdapter<>(autoCompleteTextView.getContext(),\n          android.R.layout.simple_list_item_1, values);\n      autoCompleteTextView.setAdapter(adapter);\n    });\n\n    RecordingObserver<AdapterViewItemClickEvent> o = new RecordingObserver<>();\n    RxAutoCompleteTextView.itemClickEvents(autoCompleteTextView)\n      .subscribeOn(AndroidSchedulers.mainThread())\n      .subscribe(o);\n    o.assertNoMoreEvents();\n\n    onView(withId(R.id.auto_complete)).perform(typeText(\"Tw\"));\n    onData(startsWith(\"Twenty\"))\n        .inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))\n        .perform(click());\n\n    AdapterViewItemClickEvent event = o.takeNext();\n    assertNotNull(event.getView());\n    assertNotNull(event.getClickedView());\n    assertEquals(1, event.getPosition()); // Second item in two-item filtered list.\n    assertEquals(1, event.getId()); // Second item in two-item filtered list.\n\n    o.dispose();\n\n    onView(withId(R.id.auto_complete)).perform(clearText(), typeText(\"Tw\"));\n    onData(startsWith(\"Twenty\"))\n        .inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))))\n        .perform(click());\n\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxAutoCompleteTextViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.AutoCompleteTextView;\nimport android.widget.LinearLayout;\nimport com.jakewharton.rxbinding4.test.R;\n\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\nimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;\n\npublic final class RxAutoCompleteTextViewTestActivity extends Activity {\n  AutoCompleteTextView autoCompleteTextView;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    LinearLayout layout = new LinearLayout(this);\n    setContentView(layout);\n\n    autoCompleteTextView = new AutoCompleteTextView(this);\n    autoCompleteTextView.setLayoutParams(new LayoutParams(MATCH_PARENT, WRAP_CONTENT));\n    autoCompleteTextView.setId(R.id.auto_complete);\n    layout.addView(autoCompleteTextView);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxCompoundButtonTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.CompoundButton;\nimport android.widget.ToggleButton;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic final class RxCompoundButtonTest {\n  private final Context context = ApplicationProvider.getApplicationContext();\n  private final CompoundButton view = new ToggleButton(context);\n\n  @Test @UiThreadTest public void checkedChanges() {\n    view.setChecked(false);\n\n    RecordingObserver<Boolean> o = new RecordingObserver<>();\n    RxCompoundButton.checkedChanges(view).subscribe(o);\n    assertFalse(o.takeNext());\n\n    view.setChecked(true);\n    assertTrue(o.takeNext());\n    view.setChecked(false);\n    assertFalse(o.takeNext());\n\n    o.dispose();\n\n    view.setChecked(true);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widget.PopupMenu;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\n\npublic final class RxPopupMenuTest {\n  @Rule public final ActivityTestRule<RxPopupMenuTestActivity> activityRule =\n      new ActivityTestRule<>(RxPopupMenuTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  PopupMenu view;\n\n  @Before public void setUp() {\n    view = activityRule.getActivity().popupMenu;\n  }\n\n  @Test @UiThreadTest public void itemClicks() {\n    Menu menu = view.getMenu();\n    MenuItem item1 = menu.add(0, 1, 0, \"Hi\");\n    MenuItem item2 = menu.add(0, 2, 0, \"Hey\");\n\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    RxPopupMenu.itemClicks(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    menu.performIdentifierAction(2, 0);\n    assertSame(item2, o.takeNext());\n\n    menu.performIdentifierAction(1, 0);\n    assertSame(item1, o.takeNext());\n\n    o.dispose();\n\n    menu.performIdentifierAction(2, 0);\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void dismisses() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxPopupMenu.dismisses(view).subscribeOn(AndroidSchedulers.mainThread()).subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    instrumentation.runOnMainSync(() -> view.show());\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.dismiss());\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n    instrumentation.runOnMainSync(() -> view.show());\n    instrumentation.runOnMainSync(() -> view.dismiss());\n\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxPopupMenuTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.PopupMenu;\n\npublic final class RxPopupMenuTestActivity extends Activity {\n\n  PopupMenu popupMenu;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    View anchor = new View(this);\n    setContentView(anchor);\n    popupMenu = new PopupMenu(this, anchor);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRadioGroupTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.RadioButton;\nimport android.widget.RadioGroup;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\n@SuppressWarnings(\"ResourceType\") // Don't need real IDs for test case.\npublic final class RxRadioGroupTest {\n  private final Context context = ApplicationProvider.getApplicationContext();\n  private final RadioGroup view = new RadioGroup(context);\n\n  @Before public void setUp() {\n    RadioButton button1 = new RadioButton(context);\n    button1.setId(1);\n    view.addView(button1);\n    RadioButton button2 = new RadioButton(context);\n    button2.setId(2);\n    view.addView(button2);\n  }\n\n  @Test @UiThreadTest public void checkedChanges() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxRadioGroup.checkedChanges(view).subscribe(o);\n    assertEquals(-1, o.takeNext().intValue());\n\n    view.check(1);\n    assertEquals(1, o.takeNext().intValue());\n\n    view.clearCheck();\n    assertEquals(-1, o.takeNext().intValue());\n\n    view.check(2);\n    assertEquals(2, o.takeNext().intValue());\n\n    o.dispose();\n\n    view.check(1);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void checked() throws Throwable {\n    Consumer<? super Integer> action = RxRadioGroup.checked(view);\n    assertEquals(-1, view.getCheckedRadioButtonId());\n    action.accept(1);\n    assertEquals(1, view.getCheckedRadioButtonId());\n    action.accept(-1);\n    assertEquals(-1, view.getCheckedRadioButtonId());\n    action.accept(2);\n    assertEquals(2, view.getCheckedRadioButtonId());\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.RatingBar;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static android.view.MotionEvent.ACTION_DOWN;\nimport static android.view.MotionEvent.ACTION_UP;\nimport static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxRatingBarTest {\n  @Rule public final ActivityTestRule<RxRatingBarTestActivity> activityRule =\n      new ActivityTestRule<>(RxRatingBarTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  RatingBar view;\n\n  @Before public void setUp() {\n    view = activityRule.getActivity().ratingBar;\n  }\n\n  @Test public void ratingChanges() {\n    RecordingObserver<Float> o = new RecordingObserver<>();\n    RxRatingBar.ratingChanges(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    assertEquals(0f, o.takeNext(), 0f);\n\n    instrumentation.runOnMainSync(() -> view.setRating(1f));\n    assertEquals(1f, o.takeNext(), 0f);\n\n    instrumentation.runOnMainSync(() -> view.setRating(2f));\n    assertEquals(2f, o.takeNext(), 0f);\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.setRating(1f));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void ratingChangeEvents() {\n    RecordingObserver<RatingBarChangeEvent> o = new RecordingObserver<>();\n    RxRatingBar.ratingChangeEvents(view) //\n        .subscribeOn(AndroidSchedulers.mainThread()) //\n        .subscribe(o);\n    assertEquals(new RatingBarChangeEvent(view, 0f, false), o.takeNext());\n\n    instrumentation.runOnMainSync(() -> view.setRating(5f));\n    assertEquals(new RatingBarChangeEvent(view, 5f, false), o.takeNext());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_DOWN, 0, 50));\n    instrumentation.sendPointerSync(motionEventAtPosition(view, ACTION_UP, 0, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(new RatingBarChangeEvent(view, 1f, true), o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.setRating(1f));\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxRatingBarTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.RatingBar;\n\npublic final class RxRatingBarTestActivity extends Activity {\n  RatingBar ratingBar;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    ratingBar = new RatingBar(this);\n    ratingBar.setMax(10);\n    ratingBar.setStepSize(1f);\n    setContentView(ratingBar);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.widget.SearchView;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic final class RxSearchViewTest {\n  @Rule\n  public final ActivityTestRule<RxSearchViewTestActivity> activityRule =\n          new ActivityTestRule<>(RxSearchViewTestActivity.class);\n\n  private SearchView searchView;\n\n  @Before public void setUp() {\n    searchView = activityRule.getActivity().searchView;\n  }\n\n  @Test @UiThreadTest public void queryTextChanges() {\n    searchView.setQuery(\"Initial\", false);\n    RecordingObserver<CharSequence> o = new RecordingObserver<>();\n    RxSearchView.queryTextChanges(searchView).subscribe(o);\n    assertEquals(\"Initial\", o.takeNext().toString());\n\n    searchView.setQuery(\"H\", false);\n    assertEquals(\"H\", o.takeNext().toString());\n    searchView.setQuery(\"He\", false);\n    assertEquals(\"He\", o.takeNext().toString());\n\n    searchView.setQuery(null, false); // Internally coerced to empty string.\n    assertEquals(\"\", o.takeNext().toString());\n\n    o.dispose();\n\n    searchView.setQuery(\"Silent\", false);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void query() throws Throwable {\n    RxSearchView.query(searchView, false).accept(\"Hey\");\n    assertEquals(\"Hey\", searchView.getQuery().toString());\n\n    RxSearchView.query(searchView, true).accept(\"Bye\");\n    assertEquals(\"Bye\", searchView.getQuery().toString());\n  }\n\n  @Test @UiThreadTest public void queryTextEventNotSubmitted() {\n    RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();\n    RxSearchView.queryTextChangeEvents(searchView).subscribe(o);\n\n    assertEquals(\"\", o.takeNext().getQueryText().toString());\n\n    searchView.setQuery(\"q\", false);\n    SearchViewQueryTextEvent event = o.takeNext();\n    assertEquals(\"q\", event.getQueryText().toString());\n    assertFalse(event.isSubmitted());\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void queryTextEventSubmitted() {\n    RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();\n    RxSearchView.queryTextChangeEvents(searchView).subscribe(o);\n\n    assertEquals(\"\", o.takeNext().getQueryText().toString());\n\n    searchView.setQuery(\"q\", true);\n    // Text change event:\n    SearchViewQueryTextEvent event = o.takeNext();\n    assertEquals(\"q\", event.getQueryText().toString());\n    assertFalse(event.isSubmitted());\n    // Submission event:\n    SearchViewQueryTextEvent event1 = o.takeNext();\n    assertEquals(\"q\", event1.getQueryText().toString());\n    assertTrue(event1.isSubmitted());\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSearchViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.SearchView;\n\npublic final class RxSearchViewTestActivity extends Activity {\n  SearchView searchView;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    searchView = new SearchView(this);\n    setContentView(searchView);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Instrumentation;\nimport android.widget.SeekBar;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static android.view.MotionEvent.ACTION_DOWN;\nimport static android.view.MotionEvent.ACTION_MOVE;\nimport static android.view.MotionEvent.ACTION_UP;\nimport static com.jakewharton.rxbinding4.MotionEventUtil.motionEventAtPosition;\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxSeekBarTest {\n  @Rule public final ActivityTestRule<RxSeekBarTestActivity> activityRule =\n      new ActivityTestRule<>(RxSeekBarTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  SeekBar seekBar;\n\n  @Before public void setUp() {\n    seekBar = activityRule.getActivity().seekBar;\n  }\n\n  @Test public void changes() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxSeekBar.changes(seekBar) //\n        .subscribeOn(AndroidSchedulers.mainThread()) //\n        .subscribe(o);\n    assertEquals(0, o.takeNext().intValue());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(100, o.takeNext().intValue());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 0, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(0, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));\n    instrumentation.waitForIdleSync();\n    assertEquals(85, o.takeNext().intValue());\n\n    o.dispose();\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void systemChanges() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxSeekBar.systemChanges(seekBar) //\n            .subscribeOn(AndroidSchedulers.mainThread()) //\n            .subscribe(o);\n    assertEquals(0, o.takeNext().intValue());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));\n    instrumentation.waitForIdleSync();\n    assertEquals(85, o.takeNext().intValue());\n\n    o.dispose();\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void userChanges() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxSeekBar.userChanges(seekBar) //\n            .subscribeOn(AndroidSchedulers.mainThread()) //\n            .subscribe(o);\n    assertEquals(0, o.takeNext().intValue());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(100, o.takeNext().intValue());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 0, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(0, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(85));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void changeEvents() {\n    RecordingObserver<SeekBarChangeEvent> o = new RecordingObserver<>();\n    RxSeekBar.changeEvents(seekBar) //\n        .subscribeOn(AndroidSchedulers.mainThread()) //\n        .subscribe(o);\n    assertEquals(new SeekBarProgressChangeEvent(seekBar, 0, false), o.takeNext());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(new SeekBarStartChangeEvent(seekBar), o.takeNext());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_MOVE, 100, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(new SeekBarProgressChangeEvent(seekBar, 100, true), o.takeNext());\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_UP, 100, 50));\n    instrumentation.waitForIdleSync();\n    assertEquals(new SeekBarStopChangeEvent(seekBar), o.takeNext());\n\n    instrumentation.runOnMainSync(() -> seekBar.setProgress(0));\n    instrumentation.waitForIdleSync();\n    assertEquals(new SeekBarProgressChangeEvent(seekBar, 0, false), o.takeNext());\n\n    o.dispose();\n\n    instrumentation.sendPointerSync(motionEventAtPosition(seekBar, ACTION_DOWN, 0, 50));\n    instrumentation.waitForIdleSync();\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxSeekBarTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.SeekBar;\n\npublic final class RxSeekBarTestActivity extends Activity {\n  SeekBar seekBar;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    seekBar = new SeekBar(this);\n    setContentView(seekBar);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxTextViewTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.content.Context;\nimport android.widget.TextView;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Test;\n\nimport static android.view.inputmethod.EditorInfo.IME_ACTION_GO;\nimport static android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\nimport static org.junit.Assert.assertSame;\n\npublic final class RxTextViewTest {\n  private final Context context = ApplicationProvider.getApplicationContext();\n  private final TextView view = new TextView(context);\n\n  @Test @UiThreadTest public void editorActions() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxTextView.editorActions(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.onEditorAction(IME_ACTION_GO);\n    assertEquals(IME_ACTION_GO, o.takeNext().intValue());\n\n    view.onEditorAction(IME_ACTION_NEXT);\n    assertEquals(IME_ACTION_NEXT, o.takeNext().intValue());\n\n    o.dispose();\n\n    view.onEditorAction(IME_ACTION_GO);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void editorActionEvents() {\n    RecordingObserver<TextViewEditorActionEvent> o = new RecordingObserver<>();\n    RxTextView.editorActionEvents(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.onEditorAction(IME_ACTION_GO);\n    TextViewEditorActionEvent event1 = o.takeNext();\n    assertSame(view, event1.getView());\n    assertEquals(IME_ACTION_GO, event1.getActionId());\n    assertNull(event1.getKeyEvent());\n\n    view.onEditorAction(IME_ACTION_NEXT);\n    TextViewEditorActionEvent event2 = o.takeNext();\n    assertSame(view, event2.getView());\n    assertEquals(IME_ACTION_NEXT, event2.getActionId());\n    assertNull(event2.getKeyEvent()); // TODO figure out a user event?\n\n    o.dispose();\n\n    view.onEditorAction(IME_ACTION_GO);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void textChanges() {\n    view.setText(\"Initial\");\n\n    RecordingObserver<CharSequence> o = new RecordingObserver<>();\n    RxTextView.textChanges(view).subscribe(o);\n    assertEquals(\"Initial\", o.takeNext().toString());\n\n    view.setText(\"H\");\n    assertEquals(\"H\", o.takeNext().toString());\n    view.setText(\"He\");\n    assertEquals(\"He\", o.takeNext().toString());\n\n    view.setText(null); // Internally coerced to empty string.\n    assertEquals(\"\", o.takeNext().toString());\n\n    o.dispose();\n\n    view.setText(\"Silent\");\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void textChangeEvents() {\n    view.setText(\"Initial\");\n\n    RecordingObserver<TextViewTextChangeEvent> o = new RecordingObserver<>();\n    RxTextView.textChangeEvents(view).subscribe(o);\n    TextViewTextChangeEvent event0 = o.takeNext();\n    assertSame(view, event0.getView());\n    assertEquals(\"Initial\", event0.getText().toString());\n    assertEquals(0, event0.getStart());\n    assertEquals(0, event0.getBefore());\n    assertEquals(0, event0.getCount());\n\n    view.setText(\"H\");\n    TextViewTextChangeEvent event1 = o.takeNext();\n    assertSame(view, event1.getView());\n    assertEquals(\"H\", event1.getText().toString());\n    assertEquals(0, event1.getStart());\n    assertEquals(7, event1.getBefore());\n    assertEquals(1, event1.getCount());\n\n    view.setText(\"He\");\n    TextViewTextChangeEvent event2 = o.takeNext();\n    assertSame(view, event2.getView());\n    assertEquals(\"He\", event2.getText().toString());\n    assertEquals(0, event2.getStart());\n    assertEquals(1, event2.getBefore());\n    assertEquals(2, event2.getCount());\n\n    o.dispose();\n\n    view.setText(\"Silent\");\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void beforeTextChangeEvents() {\n    view.setText(\"Initial\");\n\n    RecordingObserver<TextViewBeforeTextChangeEvent> o = new RecordingObserver<>();\n    RxTextView.beforeTextChangeEvents(view).subscribe(o);\n    TextViewBeforeTextChangeEvent event0 = o.takeNext();\n    assertSame(view, event0.getView());\n    assertEquals(\"Initial\", event0.getText().toString());\n    assertEquals(0, event0.getStart());\n    assertEquals(0, event0.getCount());\n    assertEquals(0, event0.getAfter());\n\n    view.setText(\"H\");\n    TextViewBeforeTextChangeEvent event1 = o.takeNext();\n    assertSame(view, event1.getView());\n    assertEquals(\"Initial\", event1.getText().toString());\n    assertEquals(0, event1.getStart());\n    assertEquals(7, event1.getCount());\n    assertEquals(1, event1.getAfter());\n\n    view.setText(\"He\");\n    TextViewBeforeTextChangeEvent event2 = o.takeNext();\n    assertSame(view, event2.getView());\n    assertEquals(\"H\", event2.getText().toString());\n    assertEquals(0, event2.getStart());\n    assertEquals(1, event2.getCount());\n    assertEquals(2, event2.getAfter());\n\n    o.dispose();\n\n    view.setText(\"Silent\");\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void afterTextChangeEvents() {\n    view.setText(\"Initial\");\n\n    RecordingObserver<TextViewAfterTextChangeEvent> o = new RecordingObserver<>();\n    RxTextView.afterTextChangeEvents(view).subscribe(o);\n    TextViewAfterTextChangeEvent event0 = o.takeNext();\n    assertSame(view, event0.getView());\n    assertEquals(null, event0.getEditable());\n\n    view.setText(\"H\");\n    TextViewAfterTextChangeEvent event1 = o.takeNext();\n    assertSame(view, event1.getView());\n    assertEquals(\"H\", event1.getEditable().toString());\n\n    view.setText(\"He\");\n    TextViewAfterTextChangeEvent event2 = o.takeNext();\n    assertSame(view, event2.getView());\n    assertEquals(\"He\", event2.getEditable().toString());\n\n    o.dispose();\n\n    view.setText(\"Silent\");\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTest.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widget.Toolbar;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.filters.SdkSuppress;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;\nimport static com.jakewharton.rxbinding4.widget.RxToolbarTestActivity.NAVIGATION_CONTENT_DESCRIPTION;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\n\n@SdkSuppress(minSdkVersion = 21)\npublic final class RxToolbarTest {\n  @Rule public final ActivityTestRule<RxToolbarTestActivity> activityRule =\n      new ActivityTestRule<>(RxToolbarTestActivity.class);\n\n  private Toolbar view;\n\n  @Before public void setUp() {\n    RxToolbarTestActivity activity = activityRule.getActivity();\n    view = activity.toolbar;\n  }\n\n  @Test @UiThreadTest public void itemClicks() {\n    Menu menu = view.getMenu();\n    MenuItem item1 = menu.add(0, 1, 0, \"Hi\");\n    MenuItem item2 = menu.add(0, 2, 0, \"Hey\");\n\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    RxToolbar.itemClicks(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    menu.performIdentifierAction(2, 0);\n    assertSame(item2, o.takeNext());\n\n    menu.performIdentifierAction(1, 0);\n    assertSame(item1, o.takeNext());\n\n    o.dispose();\n\n    menu.performIdentifierAction(2, 0);\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void navigationClicks() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxToolbar.navigationClicks(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());\n    assertNotNull(o.takeNext());\n\n    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/java/com/jakewharton/rxbinding4/widget/RxToolbarTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.widget;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.widget.Toolbar;\n\n@TargetApi(21)\npublic final class RxToolbarTestActivity extends Activity {\n  static final String NAVIGATION_CONTENT_DESCRIPTION = \"click me!\";\n\n  Toolbar toolbar;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    toolbar = new Toolbar(this);\n    toolbar.setNavigationContentDescription(NAVIGATION_CONTENT_DESCRIPTION);\n    toolbar.setNavigationIcon(android.R.drawable.sym_def_app_icon);\n    setContentView(toolbar);\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/androidTest/res/drawable/icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<color\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:color=\"#008800\"\n  />\n"
  },
  {
    "path": "rxbinding/src/androidTest/res/values/ids.xml",
    "content": "<?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",
    "content": "<resources>\n  <string name=\"hey\">Hey</string>\n  <string name=\"ouch\">Ouch</string>\n  <string name=\"hint\">Your name here</string>\n</resources>\n"
  },
  {
    "path": "rxbinding/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4\"/>\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt",
    "content": "package com.jakewharton.rxbinding4\n\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\n\nabstract class InitialValueObservable<T> : Observable<T>() {\n  protected abstract val initialValue: T\n\n  override fun subscribeActual(observer: Observer<in T>) {\n    subscribeListener(observer)\n    observer.onNext(initialValue)\n  }\n\n  protected abstract fun subscribeListener(observer: Observer<in T>)\n\n  fun skipInitialValue(): Observable<T> = Skipped()\n\n  private inner class Skipped : Observable<T>() {\n    override fun subscribeActual(observer: Observer<in T>) {\n      subscribeListener(observer)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/mainThread.kt",
    "content": "/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:JvmName(\"Preconditions\")\n\npackage com.jakewharton.rxbinding4.internal\n\nimport android.os.Looper\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.disposables.Disposable\n\n@RestrictTo(LIBRARY_GROUP)\nfun checkMainThread(observer: Observer<*>): Boolean {\n  if (Looper.myLooper() != Looper.getMainLooper()) {\n    observer.onSubscribe(Disposable.empty())\n    observer.onError(IllegalStateException(\n        \"Expected to be called on the main thread but was \" + Thread.currentThread().name))\n    return false\n  }\n  return true\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/true.kt",
    "content": "package com.jakewharton.rxbinding4.internal\n\nimport androidx.annotation.RestrictTo\nimport androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP\n\n@RestrictTo(LIBRARY_GROUP)\nobject AlwaysTrue : () -> Boolean, (Any) -> Boolean {\n  override fun invoke() = true\n  override fun invoke(ignored: Any) = true\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEvent.kt",
    "content": "package com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.MenuItem\n\n/**\n * An action view event on a menu item.\n *\n * **Warning:** Instances keep a strong reference to the menu item. Operators that\n * cache instances have the potential to leak the associated [Context].\n */\nsealed class MenuItemActionViewEvent {\n  /** The menu item from which this event occurred.  */\n  abstract val menuItem: MenuItem\n}\n\ndata class MenuItemActionViewCollapseEvent(\n  override val menuItem: MenuItem\n) : MenuItemActionViewEvent()\n\ndata class MenuItemActionViewExpandEvent(\n  override val menuItem: MenuItem\n) : MenuItemActionViewEvent()\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemActionViewEventObservable.kt",
    "content": "@file:JvmName(\"RxMenuItem\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MenuItem\nimport android.view.MenuItem.OnActionExpandListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of action view events for `menuItem`.\n *\n * *Warning:* The created observable keeps a strong reference to `menuItem`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses [MenuItem.setOnActionExpandListener] to\n * observe action view events. Only one observable can be used for a menu item at a time.\n *\n * @param handled Function invoked with each value to determine the return value of the\n * underlying [MenuItem.OnActionExpandListener].\n */\n@CheckResult\n@JvmOverloads\nfun MenuItem.actionViewEvents(\n  handled: (MenuItemActionViewEvent) -> Boolean = AlwaysTrue\n): Observable<MenuItemActionViewEvent> {\n  return MenuItemActionViewEventObservable(this, handled)\n}\n\nprivate class MenuItemActionViewEventObservable(\n  private val menuItem: MenuItem,\n  private val handled: (MenuItemActionViewEvent) -> Boolean\n) : Observable<MenuItemActionViewEvent>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItemActionViewEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(menuItem, handled, observer)\n    observer.onSubscribe(listener)\n    menuItem.setOnActionExpandListener(listener)\n  }\n\n  private class Listener(\n    private val menuItem: MenuItem,\n    private val handled: (MenuItemActionViewEvent) -> Boolean,\n    private val observer: Observer<in MenuItemActionViewEvent>\n  ) : MainThreadDisposable(), OnActionExpandListener {\n\n    override fun onMenuItemActionExpand(item: MenuItem): Boolean {\n      return onEvent(MenuItemActionViewExpandEvent(item))\n    }\n\n    override fun onMenuItemActionCollapse(item: MenuItem): Boolean {\n      return onEvent(MenuItemActionViewCollapseEvent(item))\n    }\n\n    private fun onEvent(event: MenuItemActionViewEvent): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled(event)) {\n            observer.onNext(event)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      menuItem.setOnActionExpandListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/MenuItemClickObservable.kt",
    "content": "@file:JvmName(\"RxMenuItem\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MenuItem\nimport android.view.MenuItem.OnMenuItemClickListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `menuItem` click events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `menuItem`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses [MenuItem.setOnMenuItemClickListener] to\n * observe clicks. Only one observable can be used for a menu item at a time.\n *\n * @param handled Function invoked with each value to determine the return value of the\n * underlying [MenuItem.OnMenuItemClickListener].\n */\n@CheckResult\n@JvmOverloads\nfun MenuItem.clicks(handled: (MenuItem) -> Boolean = AlwaysTrue): Observable<Unit> {\n  return MenuItemClickObservable(this, handled)\n}\n\nprivate class MenuItemClickObservable(\n  private val menuItem: MenuItem,\n  private val handled: (MenuItem) -> Boolean\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(menuItem, handled, observer)\n    observer.onSubscribe(listener)\n    menuItem.setOnMenuItemClickListener(listener)\n  }\n\n  private class Listener(\n    private val menuItem: MenuItem,\n    private val handled: (MenuItem) -> Boolean,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnMenuItemClickListener {\n\n    override fun onMenuItemClick(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled(menuItem)) {\n            observer.onNext(Unit)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      menuItem.setOnMenuItemClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEvent.kt",
    "content": "package com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.View\n\n/**\n * A view attach event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that\n * cache instances have the potential to leak the associated [Context].\n */\nsealed class ViewAttachEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: View\n}\n\n/**\n * A view attached event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class ViewAttachAttachedEvent(\n  override val view: View\n) : ViewAttachEvent()\n\n/**\n * A view detached event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class ViewAttachDetachedEvent(\n  override val view: View\n) : ViewAttachEvent()\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachEventObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnAttachStateChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of attach and detach events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun View.attachEvents(): Observable<ViewAttachEvent> {\n  return ViewAttachEventObservable(this)\n}\n\nprivate class ViewAttachEventObservable(\n  private val view: View\n) : Observable<ViewAttachEvent>() {\n\n  override fun subscribeActual(observer: Observer<in ViewAttachEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnAttachStateChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in ViewAttachEvent>\n  ) : MainThreadDisposable(), OnAttachStateChangeListener {\n\n    override fun onViewAttachedToWindow(v: View) {\n      if (!isDisposed) {\n        observer.onNext(ViewAttachAttachedEvent(view))\n      }\n    }\n\n    override fun onViewDetachedFromWindow(v: View) {\n      if (!isDisposed) {\n        observer.onNext(ViewAttachDetachedEvent(view))\n      }\n    }\n\n    override fun onDispose() {\n      view.removeOnAttachStateChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewAttachesObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnAttachStateChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` attach events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun View.attaches(): Observable<Unit> {\n  return ViewAttachesObservable(this, true)\n}\n\n/**\n * Create an observable which emits on `view` detach events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun View.detaches(): Observable<Unit> {\n  return ViewAttachesObservable(this, false)\n}\n\nprivate class ViewAttachesObservable(\n  private val view: View,\n  private val callOnAttach: Boolean\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, callOnAttach, observer)\n    observer.onSubscribe(listener)\n    view.addOnAttachStateChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val callOnAttach: Boolean,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnAttachStateChangeListener {\n\n    override fun onViewAttachedToWindow(v: View) {\n      if (callOnAttach && !isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onViewDetachedFromWindow(v: View) {\n      if (!callOnAttach && !isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.removeOnAttachStateChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewClickObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnClickListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` click events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [View.setOnClickListener] to observe\n * clicks. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun View.clicks(): Observable<Unit> {\n  return ViewClickObservable(this)\n}\n\nprivate class ViewClickObservable(\n  private val view: View\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnClickListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnClickListener {\n\n    override fun onClick(v: View) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewDragObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.DragEvent\nimport android.view.View\nimport android.view.View.OnDragListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of [DragEvent] for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [View.setOnDragListener] to observe\n * drags. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked with each value to determine the return value of the\n * underlying [View.OnDragListener].\n */\n@CheckResult\n@JvmOverloads\nfun View.drags(handled: (DragEvent) -> Boolean = AlwaysTrue): Observable<DragEvent> {\n  return ViewDragObservable(this, handled)\n}\n\nprivate class ViewDragObservable(\n  private val view: View,\n  private val handled: (DragEvent) -> Boolean\n) : Observable<DragEvent>() {\n\n  override fun subscribeActual(observer: Observer<in DragEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, handled, observer)\n    observer.onSubscribe(listener)\n    view.setOnDragListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val handled: (DragEvent) -> Boolean,\n    private val observer: Observer<in DragEvent>\n  ) : MainThreadDisposable(), OnDragListener {\n\n    override fun onDrag(v: View, event: DragEvent): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled(event)) {\n            observer.onNext(event)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnDragListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewFocusChangeObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnFocusChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of booleans representing the focus of `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [View.setOnFocusChangeListener] to observe\n * focus change. Only one observable can be used for a view at a time.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun View.focusChanges(): InitialValueObservable<Boolean> {\n  return ViewFocusChangeObservable(this)\n}\n\nprivate class ViewFocusChangeObservable(\n  private val view: View\n) : InitialValueObservable<Boolean>() {\n\n  override val initialValue: Boolean\n    get() = view.hasFocus()\n\n  override fun subscribeListener(observer: Observer<in Boolean>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.onFocusChangeListener = listener\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in Boolean>\n  ) : MainThreadDisposable(), OnFocusChangeListener {\n\n    override fun onFocusChange(v: View, hasFocus: Boolean) {\n      if (!isDisposed) {\n        observer.onNext(hasFocus)\n      }\n    }\n\n    override fun onDispose() {\n      view.onFocusChangeListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEvent.kt",
    "content": "package com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.ViewGroup\n\nsealed class ViewGroupHierarchyChangeEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: ViewGroup\n\n  /** The child from which this event occurred.  */\n  abstract val child: View\n}\n\n/**\n * A child view add event on a [ViewGroup].\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [android.content.Context].\n */\ndata class ViewGroupHierarchyChildViewAddEvent(\n  override val view: ViewGroup,\n  override val child: View\n) : ViewGroupHierarchyChangeEvent()\n\n/**\n * A child view remove event on a [ViewGroup].\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [android.content.Context].\n */\ndata class ViewGroupHierarchyChildViewRemoveEvent(\n  override val view: ViewGroup,\n  override val child: View\n) : ViewGroupHierarchyChangeEvent()\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewGroupHierarchyChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxViewGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.OnHierarchyChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of hierarchy change events for `viewGroup`.\n *\n * *Warning:* The created observable keeps a strong reference to `viewGroup`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun ViewGroup.changeEvents(): Observable<ViewGroupHierarchyChangeEvent> {\n  return ViewGroupHierarchyChangeEventObservable(this)\n}\n\nprivate class ViewGroupHierarchyChangeEventObservable(\n  private val viewGroup: ViewGroup\n) : Observable<ViewGroupHierarchyChangeEvent>() {\n\n  override fun subscribeActual(observer: Observer<in ViewGroupHierarchyChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(viewGroup, observer)\n    observer.onSubscribe(listener)\n    viewGroup.setOnHierarchyChangeListener(listener)\n  }\n\n  private class Listener(\n    private val viewGroup: ViewGroup,\n    private val observer: Observer<in ViewGroupHierarchyChangeEvent>\n  ) : MainThreadDisposable(), OnHierarchyChangeListener {\n\n    override fun onChildViewAdded(parent: View, child: View) {\n      if (!isDisposed) {\n        observer.onNext(ViewGroupHierarchyChildViewAddEvent(viewGroup, child))\n      }\n    }\n\n    override fun onChildViewRemoved(parent: View, child: View) {\n      if (!isDisposed) {\n        observer.onNext(ViewGroupHierarchyChildViewRemoveEvent(viewGroup, child))\n      }\n    }\n\n    override fun onDispose() {\n      viewGroup.setOnHierarchyChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewHoverObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.View.OnHoverListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of hover events for `view`.\n *\n * *Warning:* Values emitted by this observable are **mutable** and part of a shared\n * object pool and thus are **not safe** to cache or delay reading (such as by observing\n * on a different thread). If you want to cache or delay reading the items emitted then you must\n * map values through a function which calls [MotionEvent.obtain] or\n * [MotionEvent.obtainNoHistory] to create a copy.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [View.setOnHoverListener] to observe\n * touches. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked with each value to determine the return value of the\n * underlying [View.OnHoverListener].\n */\n@CheckResult\n@JvmOverloads\nfun View.hovers(\n  handled: (MotionEvent) -> Boolean = AlwaysTrue\n): Observable<MotionEvent> {\n  return ViewHoverObservable(this, handled)\n}\n\nprivate class ViewHoverObservable(\n  private val view: View,\n  private val handled: (MotionEvent) -> Boolean\n) : Observable<MotionEvent>() {\n\n  override fun subscribeActual(observer: Observer<in MotionEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, handled, observer)\n    observer.onSubscribe(listener)\n    view.setOnHoverListener(listener)\n  }\n\n  private class Listener(\n    private val view: View, private val handled: (MotionEvent) -> Boolean,\n    private val observer: Observer<in MotionEvent>\n  ) : MainThreadDisposable(), OnHoverListener {\n\n    override fun onHover(v: View, event: MotionEvent): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled(event)) {\n            observer.onNext(event)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnHoverListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewKeyObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.KeyEvent\nimport android.view.View\nimport android.view.View.OnKeyListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of key events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n * *Warning:* The created observable uses [View.setOnKeyListener] to observe\n * key events. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked each occurrence to determine the return value of the\n * underlying [View.OnKeyListener].\n */\n@CheckResult\n@JvmOverloads\nfun View.keys(handled: (KeyEvent) -> Boolean = AlwaysTrue): Observable<KeyEvent> {\n  return ViewKeyObservable(this, handled)\n}\n\nprivate class ViewKeyObservable(\n  private val view: View,\n  private val handled: (KeyEvent) -> Boolean\n) : Observable<KeyEvent>() {\n\n  override fun subscribeActual(observer: Observer<in KeyEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, handled, observer)\n    observer.onSubscribe(listener)\n    view.setOnKeyListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val handled: (KeyEvent) -> Boolean,\n    private val observer: Observer<in KeyEvent>\n  ) : MainThreadDisposable(), OnKeyListener {\n\n    override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled(event)) {\n            observer.onNext(event)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnKeyListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.content.Context\nimport android.view.View\nimport android.view.View.OnLayoutChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of layout-change events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun View.layoutChangeEvents(): Observable<ViewLayoutChangeEvent> {\n  return ViewLayoutChangeEventObservable(this)\n}\n\n/**\n * A layout-change event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class ViewLayoutChangeEvent(\n  /** The view from which this event occurred. */\n  val view: View,\n  val left: Int,\n  val top: Int,\n  val right: Int,\n  val bottom: Int,\n  val oldLeft: Int,\n  val oldTop: Int,\n  val oldRight: Int,\n  val oldBottom: Int\n)\n\n/**\n * A scroll-change event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [android.content.Context].\n */\ndata class ViewScrollChangeEvent(\n  /** The view from which this event occurred.  */\n  val view: View,\n  val scrollX: Int,\n  val scrollY: Int,\n  val oldScrollX: Int,\n  val oldScrollY: Int\n)\n\nprivate class ViewLayoutChangeEventObservable(\n  private val view: View\n) : Observable<ViewLayoutChangeEvent>() {\n\n  override fun subscribeActual(observer: Observer<in ViewLayoutChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnLayoutChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in ViewLayoutChangeEvent>\n  ) : MainThreadDisposable(), OnLayoutChangeListener {\n\n    override fun onLayoutChange(\n      v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int,\n      oldTop: Int, oldRight: Int, oldBottom: Int\n    ) {\n      if (!isDisposed) {\n        observer.onNext(\n            ViewLayoutChangeEvent(v, left, top, right, bottom, oldLeft, oldTop, oldRight,\n                oldBottom))\n      }\n    }\n\n    override fun onDispose() {\n      view.removeOnLayoutChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLayoutChangeObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnLayoutChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` layout changes. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun View.layoutChanges(): Observable<Unit> {\n  return ViewLayoutChangeObservable(this)\n}\n\nprivate class ViewLayoutChangeObservable(\n  private val view: View\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnLayoutChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnLayoutChangeListener {\n\n    override fun onLayoutChange(\n      v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int,\n      oldTop: Int, oldRight: Int, oldBottom: Int\n    ) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.removeOnLayoutChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewLongClickObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnLongClickListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\nimport java.util.concurrent.Callable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` long-click events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [View.setOnLongClickListener] to observe\n * long clicks. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked each occurrence to determine the return value of the\n * underlying [View.OnLongClickListener].\n */\n@CheckResult\n@JvmOverloads\nfun View.longClicks(handled: () -> Boolean = AlwaysTrue): Observable<Unit> {\n  return ViewLongClickObservable(this, handled)\n}\n\nprivate class ViewLongClickObservable(\n  private val view: View,\n  private val handled: () -> Boolean\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, handled, observer)\n    observer.onSubscribe(listener)\n    view.setOnLongClickListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val handled: () -> Boolean,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnLongClickListener {\n\n    override fun onLongClick(v: View): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled()) {\n            observer.onNext(Unit)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnLongClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewScrollChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.RequiresApi\nimport android.view.View\nimport android.view.View.OnScrollChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of scroll-change events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@RequiresApi(23)\n@CheckResult\nfun View.scrollChangeEvents(): Observable<ViewScrollChangeEvent> {\n  return ViewScrollChangeEventObservable(this)\n}\n\n@RequiresApi(23)\nprivate class ViewScrollChangeEventObservable(\n  private val view: View\n) : Observable<ViewScrollChangeEvent>() {\n\n  override fun subscribeActual(observer: Observer<in ViewScrollChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnScrollChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in ViewScrollChangeEvent>\n  ) : MainThreadDisposable(), OnScrollChangeListener {\n\n    override fun onScrollChange(\n      v: View,\n      scrollX: Int,\n      scrollY: Int,\n      oldScrollX: Int,\n      oldScrollY: Int\n    ) {\n      if (!isDisposed) {\n        observer.onNext(ViewScrollChangeEvent(v, scrollX, scrollY, oldScrollX, oldScrollY))\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnScrollChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewSystemUiVisibilityChangeObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.View.OnSystemUiVisibilityChangeListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of integers representing a new system UI visibility for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses\n * [View.setOnSystemUiVisibilityChangeListener] to observe system UI visibility changes.\n * Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun View.systemUiVisibilityChanges(): Observable<Int> {\n  return ViewSystemUiVisibilityChangeObservable(this)\n}\n\nprivate class ViewSystemUiVisibilityChangeObservable(\n  private val view: View\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnSystemUiVisibilityChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnSystemUiVisibilityChangeListener {\n\n    override fun onSystemUiVisibilityChange(visibility: Int) {\n      if (!isDisposed) {\n        observer.onNext(visibility)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnSystemUiVisibilityChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTouchObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.View.OnTouchListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of touch events for `view`.\n *\n *\n * *Warning:* Values emitted by this observable are **mutable** and part of a shared\n * object pool and thus are **not safe** to cache or delay reading (such as by observing\n * on a different thread). If you want to cache or delay reading the items emitted then you must\n * map values through a function which calls [MotionEvent.obtain] or\n * [MotionEvent.obtainNoHistory] to create a copy.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [View.setOnTouchListener] to observe\n * touches. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked with each value to determine the return value of the\n * underlying [View.OnTouchListener].\n */\n@CheckResult\n@JvmOverloads\nfun View.touches(\n  handled: (MotionEvent) -> Boolean = AlwaysTrue\n): Observable<MotionEvent> {\n  return ViewTouchObservable(this, handled)\n}\n\nprivate class ViewTouchObservable(\n  private val view: View,\n  private val handled: (MotionEvent) -> Boolean\n) : Observable<MotionEvent>() {\n\n  override fun subscribeActual(observer: Observer<in MotionEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, handled, observer)\n    observer.onSubscribe(listener)\n    view.setOnTouchListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val handled: (MotionEvent) -> Boolean,\n    private val observer: Observer<in MotionEvent>\n  ) : MainThreadDisposable(), OnTouchListener {\n\n    override fun onTouch(v: View, event: MotionEvent): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled(event)) {\n            observer.onNext(event)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnTouchListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverDrawObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.RequiresApi\nimport android.view.View\nimport android.view.ViewTreeObserver\nimport android.view.ViewTreeObserver.OnDrawListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable for draws on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [ViewTreeObserver.addOnDrawListener] to\n * observe draws. Multiple observables can be used for a view at a time.\n */\n@RequiresApi(16)\n@CheckResult\nfun View.draws(): Observable<Unit> {\n  return ViewTreeObserverDrawObservable(this)\n}\n\n@RequiresApi(16)\nprivate class ViewTreeObserverDrawObservable(\n  private val view: View\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.viewTreeObserver\n        .addOnDrawListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnDrawListener {\n\n    override fun onDraw() {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.viewTreeObserver.removeOnDrawListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverGlobalLayoutObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.ViewTreeObserver\nimport android.view.ViewTreeObserver.OnGlobalLayoutListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` globalLayout events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [ ][ViewTreeObserver.addOnGlobalLayoutListener] to observe global layouts. Multiple observables\n * can be used for a view at a time.\n */\n@CheckResult\nfun View.globalLayouts(): Observable<Unit> {\n  return ViewTreeObserverGlobalLayoutObservable(this)\n}\n\nprivate class ViewTreeObserverGlobalLayoutObservable(\n  private val view: View\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.viewTreeObserver\n        .addOnGlobalLayoutListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnGlobalLayoutListener {\n\n    override fun onGlobalLayout() {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      @Suppress(\"DEPRECATION\") // Correct when minSdk 16.\n      view.viewTreeObserver.removeGlobalOnLayoutListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewTreeObserverPreDrawObservable.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport android.view.View\nimport android.view.ViewTreeObserver\nimport android.view.ViewTreeObserver.OnPreDrawListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\nimport java.util.concurrent.Callable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable for pre-draws on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [ViewTreeObserver.addOnPreDrawListener] to\n * observe pre-draws. Multiple observables can be used for a view at a time.\n */\n@CheckResult\nfun View.preDraws(proceedDrawingPass: () -> Boolean): Observable<Unit> {\n  return ViewTreeObserverPreDrawObservable(this, proceedDrawingPass)\n}\n\nprivate class ViewTreeObserverPreDrawObservable(\n  private val view: View,\n  private val proceedDrawingPass: () -> Boolean\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, proceedDrawingPass, observer)\n    observer.onSubscribe(listener)\n    view.viewTreeObserver\n        .addOnPreDrawListener(listener)\n  }\n\n  private class Listener(\n    private val view: View,\n    private val proceedDrawingPass: () -> Boolean,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnPreDrawListener {\n\n    override fun onPreDraw(): Boolean {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n        try {\n          return proceedDrawingPass()\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return true\n    }\n\n    override fun onDispose() {\n      view.viewTreeObserver.removeOnPreDrawListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/view/ViewVisibilityConsumer.kt",
    "content": "@file:JvmName(\"RxView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.view\n\nimport androidx.annotation.CheckResult\nimport android.view.View\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets the visibility property of `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe to free this\n * reference.\n *\n * @param visibilityWhenFalse Visibility to set on a `false` value (`View.INVISIBLE` or\n * `View.GONE`).\n */\n@CheckResult\n@JvmOverloads\nfun View.visibility(visibilityWhenFalse: Int = View.GONE): Consumer<in Boolean> {\n  require(visibilityWhenFalse != View.VISIBLE) {\n    \"Setting visibility to VISIBLE when false would have no effect.\"\n  }\n  require(visibilityWhenFalse == View.INVISIBLE || visibilityWhenFalse == View.GONE) {\n    \"Must set visibility to INVISIBLE or GONE when false.\"\n  }\n  return Consumer { value -> visibility = if (value) View.VISIBLE else visibilityWhenFalse }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AbsListViewScrollEventObservable.kt",
    "content": "@file:JvmName(\"RxAbsListView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.AbsListView\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of scroll events on `absListView`.\n *\n * *Warning:* The created observable keeps a strong reference to `absListView`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses\n * [AbsListView.setOnScrollListener] to observe scroll\n * changes. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun AbsListView.scrollEvents(): Observable<AbsListViewScrollEvent> {\n  return AbsListViewScrollEventObservable(this)\n}\n\ndata class AbsListViewScrollEvent(\n  /** The view from which this event occurred.  */\n  val view: AbsListView,\n  val scrollState: Int,\n  val firstVisibleItem: Int,\n  val visibleItemCount: Int,\n  val totalItemCount: Int\n)\n\nprivate class AbsListViewScrollEventObservable(\n  private val view: AbsListView\n) : Observable<AbsListViewScrollEvent>() {\n\n  override fun subscribeActual(observer: Observer<in AbsListViewScrollEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnScrollListener(listener)\n  }\n\n  private class Listener(\n    private val view: AbsListView,\n    private val observer: Observer<in AbsListViewScrollEvent>\n  ) : MainThreadDisposable(), AbsListView.OnScrollListener {\n    private var currentScrollState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE\n\n    override fun onScrollStateChanged(absListView: AbsListView, scrollState: Int) {\n      currentScrollState = scrollState\n      if (!isDisposed) {\n        val event = AbsListViewScrollEvent(view, scrollState, view.firstVisiblePosition,\n            view.childCount, view.count)\n        observer.onNext(event)\n      }\n    }\n\n    override fun onScroll(\n      absListView: AbsListView, firstVisibleItem: Int, visibleItemCount: Int,\n      totalItemCount: Int\n    ) {\n      if (!isDisposed) {\n        val event = AbsListViewScrollEvent(view, currentScrollState, firstVisibleItem,\n            visibleItemCount, totalItemCount)\n        observer.onNext(event)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnScrollListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterDataChangeObservable.kt",
    "content": "@file:JvmName(\"RxAdapter\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.database.DataSetObserver\nimport android.widget.Adapter\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of data change events for `adapter`.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun <T : Adapter> T.dataChanges(): InitialValueObservable<T> {\n  return AdapterDataChangeObservable(this)\n}\n\nprivate class AdapterDataChangeObservable<T : Adapter>(\n  private val adapter: T\n) : InitialValueObservable<T>() {\n\n  override fun subscribeListener(observer: Observer<in T>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val disposableDataSetObserver = ObserverDisposable(initialValue, observer)\n    initialValue.registerDataSetObserver(disposableDataSetObserver.dataSetObserver)\n    observer.onSubscribe(disposableDataSetObserver)\n  }\n\n  override val initialValue get() = adapter\n\n  private class ObserverDisposable<T : Adapter>(\n    private val adapter: T,\n    observer: Observer<in T>\n  ) : MainThreadDisposable() {\n    @JvmField val dataSetObserver = object : DataSetObserver() {\n      override fun onChanged() {\n        if (!isDisposed) {\n          observer.onNext(adapter)\n        }\n      }\n    }\n\n    override fun onDispose() {\n      adapter.unregisterDataSetObserver(dataSetObserver)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickEventObservable.kt",
    "content": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.Adapter\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemClickListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the item click events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun <T : Adapter> AdapterView<T>.itemClickEvents(): Observable<AdapterViewItemClickEvent> {\n  return AdapterViewItemClickEventObservable(this)\n}\n\ndata class AdapterViewItemClickEvent(\n  /** The view from which this event occurred.  */\n  val view: AdapterView<*>,\n  val clickedView: View?,\n  val position: Int,\n  val id: Long\n)\n\nprivate class AdapterViewItemClickEventObservable(\n  private val view: AdapterView<*>\n) : Observable<AdapterViewItemClickEvent>() {\n\n  override fun subscribeActual(observer: Observer<in AdapterViewItemClickEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.onItemClickListener = listener\n  }\n\n  private class Listener(\n    private val view: AdapterView<*>,\n    private val observer: Observer<in AdapterViewItemClickEvent>\n  ) : MainThreadDisposable(), OnItemClickListener {\n\n    override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {\n      if (!isDisposed) {\n        observer.onNext(AdapterViewItemClickEvent(parent, view, position, id))\n      }\n    }\n\n    override fun onDispose() {\n      view.onItemClickListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemClickObservable.kt",
    "content": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.Adapter\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemClickListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the position of item clicks for `view`.\n *\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun <T : Adapter> AdapterView<T>.itemClicks(): Observable<Int> {\n  return AdapterViewItemClickObservable(this)\n}\n\nprivate class AdapterViewItemClickObservable(\n  private val view: AdapterView<*>\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.onItemClickListener = listener\n  }\n\n  private class Listener(\n    private val view: AdapterView<*>,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnItemClickListener {\n\n    override fun onItemClick(adapterView: AdapterView<*>, view: View?, position: Int, id: Long) {\n      if (!isDisposed) {\n        observer.onNext(position)\n      }\n    }\n\n    override fun onDispose() {\n      view.onItemClickListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickEventObservable.kt",
    "content": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.Adapter\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemLongClickListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the item long-click events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * @param handled Function invoked with each value to determine the return value of the\n * underlying [AdapterView.OnItemLongClickListener].\n */\n@CheckResult\n@JvmOverloads\nfun <T : Adapter> AdapterView<T>.itemLongClickEvents(\n  handled: (AdapterViewItemLongClickEvent) -> Boolean = AlwaysTrue\n): Observable<AdapterViewItemLongClickEvent> {\n  return AdapterViewItemLongClickEventObservable(this, handled)\n}\n\ndata class AdapterViewItemLongClickEvent(\n  /** The view from which this event occurred.  */\n  val view: AdapterView<*>,\n  val clickedView: View?,\n  val position: Int,\n  val id: Long\n)\n\nprivate class AdapterViewItemLongClickEventObservable(\n  private val view: AdapterView<*>,\n  private val handled: (AdapterViewItemLongClickEvent) -> Boolean\n) : Observable<AdapterViewItemLongClickEvent>() {\n\n  override fun subscribeActual(observer: Observer<in AdapterViewItemLongClickEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer, handled)\n    observer.onSubscribe(listener)\n    view.onItemLongClickListener = listener\n  }\n\n  private class Listener(\n    private val view: AdapterView<*>,\n    private val observer: Observer<in AdapterViewItemLongClickEvent>,\n    private val handled: (AdapterViewItemLongClickEvent) -> Boolean\n  ) : MainThreadDisposable(), OnItemLongClickListener {\n\n    override fun onItemLongClick(\n      parent: AdapterView<*>,\n      view: View?,\n      position: Int,\n      id: Long\n    ): Boolean {\n      if (!isDisposed) {\n        val event = AdapterViewItemLongClickEvent(parent, view, position, id)\n        try {\n          if (handled(event)) {\n            observer.onNext(event)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.onItemLongClickListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemLongClickObservable.kt",
    "content": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.Adapter\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemLongClickListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\nimport java.util.concurrent.Callable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the position of item long-clicks for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * @param handled Function invoked each occurrence to determine the return value of the\n * underlying [AdapterView.OnItemLongClickListener].\n */\n@CheckResult\n@JvmOverloads\nfun <T : Adapter> AdapterView<T>.itemLongClicks(\n  handled: () -> Boolean = AlwaysTrue\n): Observable<Int> {\n  return AdapterViewItemLongClickObservable(this, handled)\n}\n\nprivate class AdapterViewItemLongClickObservable(\n  private val view: AdapterView<*>,\n  private val handled: () -> Boolean\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer, handled)\n    observer.onSubscribe(listener)\n    view.onItemLongClickListener = listener\n  }\n\n  private class Listener(\n    private val view: AdapterView<*>,\n    private val observer: Observer<in Int>,\n    private val handled: () -> Boolean\n  ) : MainThreadDisposable(), OnItemLongClickListener {\n\n    override fun onItemLongClick(\n      parent: AdapterView<*>,\n      view: View?,\n      position: Int,\n      id: Long\n    ): Boolean {\n      if (!isDisposed) {\n        try {\n          if (handled()) {\n            observer.onNext(position)\n            return true\n          }\n        } catch (e: Exception) {\n          observer.onError(e)\n          dispose()\n        }\n\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.onItemLongClickListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewItemSelectionObservable.kt",
    "content": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.Adapter\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemSelectedListener\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport android.widget.AdapterView.INVALID_POSITION\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the selected position of `view`. If nothing is selected,\n * [AdapterView.INVALID_POSITION] will be emitted.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun <T : Adapter> AdapterView<T>.itemSelections(): InitialValueObservable<Int> {\n  return AdapterViewItemSelectionObservable(this)\n}\n\nprivate class AdapterViewItemSelectionObservable(\n  private val view: AdapterView<*>\n) : InitialValueObservable<Int>() {\n\n  override fun subscribeListener(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.onItemSelectedListener = listener\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = view.selectedItemPosition\n\n  private class Listener(\n    private val view: AdapterView<*>,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnItemSelectedListener {\n\n    override fun onItemSelected(adapterView: AdapterView<*>, view: View?, position: Int, id: Long) {\n      if (!isDisposed) {\n        observer.onNext(position)\n      }\n    }\n\n    override fun onNothingSelected(adapterView: AdapterView<*>) {\n      if (!isDisposed) {\n        observer.onNext(INVALID_POSITION)\n      }\n    }\n\n    override fun onDispose() {\n      view.onItemSelectedListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionEvent.kt",
    "content": "package com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.AdapterView\n\nsealed class AdapterViewSelectionEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: AdapterView<*>\n}\n\ndata class AdapterViewItemSelectionEvent(\n  override val view: AdapterView<*>,\n  val selectedView: View?,\n  val position: Int,\n  val id: Long\n) : AdapterViewSelectionEvent()\n\ndata class AdapterViewNothingSelectionEvent(\n  override val view: AdapterView<*>\n) : AdapterViewSelectionEvent()\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AdapterViewSelectionObservable.kt",
    "content": "@file:JvmName(\"RxAdapterView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.Adapter\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemSelectedListener\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport android.widget.AdapterView.INVALID_POSITION\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of selection events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun <T : Adapter> AdapterView<T>.selectionEvents(): InitialValueObservable<AdapterViewSelectionEvent> {\n  return AdapterViewSelectionObservable(this)\n}\n\nprivate class AdapterViewSelectionObservable(\n  private val view: AdapterView<*>\n) : InitialValueObservable<AdapterViewSelectionEvent>() {\n\n  override fun subscribeListener(observer: Observer<in AdapterViewSelectionEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.onItemSelectedListener = listener\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue: AdapterViewSelectionEvent\n    get() {\n      val selectedPosition = view.selectedItemPosition\n      return if (selectedPosition == INVALID_POSITION) {\n        AdapterViewNothingSelectionEvent(view)\n      } else {\n        val selectedView = view.selectedView\n        val selectedId = view.selectedItemId\n        AdapterViewItemSelectionEvent(view, selectedView, selectedPosition, selectedId)\n      }\n    }\n\n  private class Listener(\n    private val view: AdapterView<*>,\n    private val observer: Observer<in AdapterViewSelectionEvent>\n  ) : MainThreadDisposable(), OnItemSelectedListener {\n\n    override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {\n      if (!isDisposed) {\n        observer.onNext(AdapterViewItemSelectionEvent(parent, view, position, id))\n      }\n    }\n\n    override fun onNothingSelected(parent: AdapterView<*>) {\n      if (!isDisposed) {\n        observer.onNext(AdapterViewNothingSelectionEvent(parent))\n      }\n    }\n\n    override fun onDispose() {\n      view.onItemSelectedListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/AutoCompleteTextViewItemClickEventObservable.kt",
    "content": "@file:JvmName(\"RxAutoCompleteTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.View\nimport android.widget.AdapterView\nimport android.widget.AdapterView.OnItemClickListener\nimport android.widget.AutoCompleteTextView\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of item click events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun AutoCompleteTextView.itemClickEvents(): Observable<AdapterViewItemClickEvent> {\n  return AutoCompleteTextViewItemClickEventObservable(this)\n}\n\nprivate class AutoCompleteTextViewItemClickEventObservable(\n  private val view: AutoCompleteTextView\n) : Observable<AdapterViewItemClickEvent>() {\n\n  override fun subscribeActual(observer: Observer<in AdapterViewItemClickEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.onItemClickListener = listener\n  }\n\n  private class Listener(\n    private val view: AutoCompleteTextView,\n    private val observer: Observer<in AdapterViewItemClickEvent>\n  ) : MainThreadDisposable(), OnItemClickListener {\n\n    override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {\n      if (!isDisposed) {\n        observer.onNext(AdapterViewItemClickEvent(parent, view, position, id))\n      }\n    }\n\n    override fun onDispose() {\n      view.onItemClickListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/CompoundButtonCheckedChangeObservable.kt",
    "content": "@file:JvmName(\"RxCompoundButton\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.CompoundButton\nimport android.widget.CompoundButton.OnCheckedChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of booleans representing the checked state of `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [CompoundButton.setOnCheckedChangeListener]\n * to observe checked changes. Only one observable can be used for a view at a time.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun CompoundButton.checkedChanges(): InitialValueObservable<Boolean> {\n  return CompoundButtonCheckedChangeObservable(this)\n}\n\nprivate class CompoundButtonCheckedChangeObservable(\n  private val view: CompoundButton\n) : InitialValueObservable<Boolean>() {\n\n  override fun subscribeListener(observer: Observer<in Boolean>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnCheckedChangeListener(listener)\n  }\n\n  override val initialValue get() = view.isChecked\n\n  private class Listener(\n    private val view: CompoundButton,\n    private val observer: Observer<in Boolean>\n  ) : MainThreadDisposable(), OnCheckedChangeListener {\n\n    override fun onCheckedChanged(compoundButton: CompoundButton, isChecked: Boolean) {\n      if (!isDisposed) {\n        observer.onNext(isChecked)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnCheckedChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuDismissObservable.kt",
    "content": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.PopupMenu\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` dismiss events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses [PopupMenu.setOnDismissListener] to\n * observe dismiss change. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun PopupMenu.dismisses(): Observable<Unit> {\n  return PopupMenuDismissObservable(this)\n}\n\nprivate class PopupMenuDismissObservable(\n  private val view: PopupMenu\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.setOnDismissListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  private class Listener(\n    private val view: PopupMenu,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), PopupMenu.OnDismissListener {\n\n    override fun onDismiss(popupMenu: PopupMenu) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnDismissListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/PopupMenuItemClickObservable.kt",
    "content": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.MenuItem\nimport android.widget.PopupMenu\nimport android.widget.PopupMenu.OnMenuItemClickListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits the clicked item in `view`'s menu.\n *\n * *Warning:* The created observable keeps a strong reference to `view`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses [PopupMenu.setOnMenuItemClickListener]\n * to observe dismiss change. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun PopupMenu.itemClicks(): Observable<MenuItem> {\n  return PopupMenuItemClickObservable(this)\n}\n\nprivate class PopupMenuItemClickObservable(\n  private val view: PopupMenu\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.setOnMenuItemClickListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  private class Listener(\n    private val view: PopupMenu,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnMenuItemClickListener {\n\n    override fun onMenuItemClick(menuItem: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(menuItem)\n        return true\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnMenuItemClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupCheckedChangeObservable.kt",
    "content": "@file:JvmName(\"RxRadioGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.RadioGroup\nimport android.widget.RadioGroup.OnCheckedChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the checked view ID changes in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun RadioGroup.checkedChanges(): InitialValueObservable<Int> {\n  return RadioGroupCheckedChangeObservable(this)\n}\n\nprivate class RadioGroupCheckedChangeObservable(\n  private val view: RadioGroup\n) : InitialValueObservable<Int>() {\n\n  override fun subscribeListener(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.setOnCheckedChangeListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = view.checkedRadioButtonId\n\n  private class Listener(\n    private val view: RadioGroup,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnCheckedChangeListener {\n    private var lastChecked = -1\n\n    override fun onCheckedChanged(radioGroup: RadioGroup, checkedId: Int) {\n      if (!isDisposed && checkedId != lastChecked) {\n        lastChecked = checkedId\n        observer.onNext(checkedId)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnCheckedChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RadioGroupToggleCheckedConsumer.kt",
    "content": "@file:JvmName(\"RxRadioGroup\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotation.CheckResult\nimport android.widget.RadioGroup\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets the checked child of `view` with ID. Passing `-1` will clear\n * any checked view.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun RadioGroup.checked(): Consumer<in Int> {\n  return Consumer { value ->\n    if (value == -1) {\n      clearCheck()\n    } else {\n      check(value!!)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxRatingBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.RatingBar\nimport android.widget.RatingBar.OnRatingBarChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the rating change events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun RatingBar.ratingChangeEvents(): InitialValueObservable<RatingBarChangeEvent> {\n  return RatingBarRatingChangeEventObservable(this)\n}\n\ndata class RatingBarChangeEvent(\n  /** The view from which this event occurred.  */\n  val view: RatingBar,\n  val rating: Float,\n  val fromUser: Boolean\n)\n\nprivate class RatingBarRatingChangeEventObservable(\n  private val view: RatingBar\n) : InitialValueObservable<RatingBarChangeEvent>() {\n\n  override fun subscribeListener(observer: Observer<in RatingBarChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.onRatingBarChangeListener = listener\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = RatingBarChangeEvent(view, view.rating, false)\n\n  private class Listener(\n    private val view: RatingBar,\n    private val observer: Observer<in RatingBarChangeEvent>\n  ) : MainThreadDisposable(), OnRatingBarChangeListener {\n\n    override fun onRatingChanged(ratingBar: RatingBar, rating: Float, fromUser: Boolean) {\n      if (!isDisposed) {\n        observer.onNext(RatingBarChangeEvent(ratingBar, rating, fromUser))\n      }\n    }\n\n    override fun onDispose() {\n      view.onRatingBarChangeListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/RatingBarRatingChangeObservable.kt",
    "content": "@file:JvmName(\"RxRatingBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.RatingBar\nimport android.widget.RatingBar.OnRatingBarChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the rating changes on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun RatingBar.ratingChanges(): InitialValueObservable<Float> {\n  return RatingBarRatingChangeObservable(this)\n}\n\nprivate class RatingBarRatingChangeObservable(\n  private val view: RatingBar\n) : InitialValueObservable<Float>() {\n\n  override fun subscribeListener(observer: Observer<in Float>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.onRatingBarChangeListener = listener\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = view.rating\n\n  private class Listener(\n    private val view: RatingBar,\n    private val observer: Observer<in Float>\n  ) : MainThreadDisposable(), OnRatingBarChangeListener {\n\n    override fun onRatingChanged(ratingBar: RatingBar, rating: Float, fromUser: Boolean) {\n      if (!isDisposed) {\n        observer.onNext(rating)\n      }\n    }\n\n    override fun onDispose() {\n      view.onRatingBarChangeListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryConsumer.kt",
    "content": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotation.CheckResult\nimport android.widget.SearchView\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets the query property of `view` with character sequences.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * @param submit whether to submit query right after updating query text\n */\n@CheckResult\nfun SearchView.query(submit: Boolean): Consumer<in CharSequence> {\n  return Consumer { text -> setQuery(text, submit) }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextChangeEventsObservable.kt",
    "content": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.SearchView\nimport android.widget.SearchView.OnQueryTextListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of [query text events][SearchViewQueryTextEvent] on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SearchView.queryTextChangeEvents(): InitialValueObservable<SearchViewQueryTextEvent> {\n  return SearchViewQueryTextChangeEventsObservable(this)\n}\n\nprivate class SearchViewQueryTextChangeEventsObservable(\n  private val view: SearchView\n) : InitialValueObservable<SearchViewQueryTextEvent>() {\n\n  override fun subscribeListener(observer: Observer<in SearchViewQueryTextEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.setOnQueryTextListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = SearchViewQueryTextEvent(view, view.query, false)\n\n  private class Listener(\n    private val view: SearchView,\n    private val observer: Observer<in SearchViewQueryTextEvent>\n  ) : MainThreadDisposable(), OnQueryTextListener {\n\n    override fun onQueryTextChange(s: String): Boolean {\n      if (!isDisposed) {\n        observer.onNext(SearchViewQueryTextEvent(view, s, false))\n        return true\n      }\n      return false\n    }\n\n    override fun onQueryTextSubmit(query: String): Boolean {\n      if (!isDisposed) {\n        observer.onNext(SearchViewQueryTextEvent(view, query, true))\n        return true\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnQueryTextListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextChangesObservable.kt",
    "content": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.SearchView\nimport android.widget.SearchView.OnQueryTextListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of character sequences for query text changes on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SearchView.queryTextChanges(): InitialValueObservable<CharSequence> {\n  return SearchViewQueryTextChangesObservable(this)\n}\n\nprivate class SearchViewQueryTextChangesObservable(\n  private val view: SearchView\n) : InitialValueObservable<CharSequence>() {\n\n  override fun subscribeListener(observer: Observer<in CharSequence>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.setOnQueryTextListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = view.query\n\n  private class Listener(\n    private val view: SearchView,\n    private val observer: Observer<in CharSequence>\n  ) : MainThreadDisposable(), OnQueryTextListener {\n\n    override fun onQueryTextChange(s: String): Boolean {\n      if (!isDisposed) {\n        observer.onNext(s)\n        return true\n      }\n      return false\n    }\n\n    override fun onQueryTextSubmit(query: String) = false\n\n    override fun onDispose() {\n      view.setOnQueryTextListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SearchViewQueryTextEvent.kt",
    "content": "package com.jakewharton.rxbinding4.widget\n\nimport android.widget.SearchView\n\ndata class SearchViewQueryTextEvent(\n  /** The view from which this event occurred.  */\n  val view: SearchView,\n  val queryText: CharSequence,\n  val isSubmitted: Boolean\n)\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeEvent.kt",
    "content": "package com.jakewharton.rxbinding4.widget\n\nimport android.widget.SeekBar\n\nsealed class SeekBarChangeEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: SeekBar\n}\n\ndata class SeekBarProgressChangeEvent(\n  override val view: SeekBar,\n  val progress: Int,\n  val fromUser: Boolean\n) : SeekBarChangeEvent()\n\ndata class SeekBarStartChangeEvent(\n  override val view: SeekBar\n) : SeekBarChangeEvent()\n\ndata class SeekBarStopChangeEvent(\n  override val view: SeekBar\n) : SeekBarChangeEvent()\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxSeekBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.SeekBar\nimport android.widget.SeekBar.OnSeekBarChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of progress change events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SeekBar.changeEvents(): InitialValueObservable<SeekBarChangeEvent> {\n  return SeekBarChangeEventObservable(this)\n}\n\nprivate class SeekBarChangeEventObservable(\n  private val view: SeekBar\n) : InitialValueObservable<SeekBarChangeEvent>() {\n\n  override fun subscribeListener(observer: Observer<in SeekBarChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    view.setOnSeekBarChangeListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = SeekBarProgressChangeEvent(view, view.progress, false)\n\n  private class Listener(\n    private val view: SeekBar,\n    private val observer: Observer<in SeekBarChangeEvent>\n  ) : MainThreadDisposable(), OnSeekBarChangeListener {\n\n    override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {\n      if (!isDisposed) {\n        observer.onNext(SeekBarProgressChangeEvent(seekBar, progress, fromUser))\n      }\n    }\n\n    override fun onStartTrackingTouch(seekBar: SeekBar) {\n      if (!isDisposed) {\n        observer.onNext(SeekBarStartChangeEvent(seekBar))\n      }\n    }\n\n    override fun onStopTrackingTouch(seekBar: SeekBar) {\n      if (!isDisposed) {\n        observer.onNext(SeekBarStopChangeEvent(seekBar))\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnSeekBarChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/SeekBarChangeObservable.kt",
    "content": "@file:JvmName(\"RxSeekBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.widget.SeekBar\nimport android.widget.SeekBar.OnSeekBarChangeListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of progress value changes on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SeekBar.changes(): InitialValueObservable<Int> {\n  return SeekBarChangeObservable(this, null)\n}\n\n/**\n * Create an observable of progress value changes on `view` that were made only from the\n * user.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SeekBar.userChanges(): InitialValueObservable<Int> {\n  return SeekBarChangeObservable(this, true)\n}\n\n/**\n * Create an observable of progress value changes on `view` that were made only from the\n * system.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SeekBar.systemChanges(): InitialValueObservable<Int> {\n  return SeekBarChangeObservable(this, false)\n}\n\nprivate class SeekBarChangeObservable(\n  private val view: SeekBar,\n  private val shouldBeFromUser: Boolean?\n) : InitialValueObservable<Int>() {\n\n  override fun subscribeListener(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, shouldBeFromUser, observer)\n    view.setOnSeekBarChangeListener(listener)\n    observer.onSubscribe(listener)\n  }\n\n  override val initialValue get() = view.progress\n\n  private class Listener(\n    private val view: SeekBar,\n    private val shouldBeFromUser: Boolean?,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnSeekBarChangeListener {\n\n    override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {\n      if (!isDisposed && (shouldBeFromUser == null || shouldBeFromUser == fromUser)) {\n        observer.onNext(progress)\n      }\n    }\n\n    override fun onStartTrackingTouch(seekBar: SeekBar) {}\n\n    override fun onStopTrackingTouch(seekBar: SeekBar) {}\n\n    override fun onDispose() {\n      view.setOnSeekBarChangeListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewAfterTextChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.Context\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.widget.TextView\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of after text change events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe using\n * [TextView.getEditableText].\n */\n@CheckResult\nfun TextView.afterTextChangeEvents(): InitialValueObservable<TextViewAfterTextChangeEvent> {\n  return TextViewAfterTextChangeEventObservable(this)\n}\n\n/**\n * An after text-change event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class TextViewAfterTextChangeEvent(\n  /** The view from which this event occurred.  */\n  val view: TextView,\n  val editable: Editable?\n)\n\nprivate class TextViewAfterTextChangeEventObservable(\n  private val view: TextView\n) : InitialValueObservable<TextViewAfterTextChangeEvent>() {\n\n  override fun subscribeListener(observer: Observer<in TextViewAfterTextChangeEvent>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addTextChangedListener(listener)\n  }\n\n  override val initialValue get() = TextViewAfterTextChangeEvent(view, view.editableText)\n\n  private class Listener(\n    private val view: TextView,\n    private val observer: Observer<in TextViewAfterTextChangeEvent>\n  ) : MainThreadDisposable(), TextWatcher {\n\n    override fun beforeTextChanged(\n      charSequence: CharSequence,\n      start: Int,\n      count: Int,\n      after: Int\n    ) {\n    }\n\n    override fun onTextChanged(charSequence: CharSequence, start: Int, before: Int, count: Int) {\n    }\n\n    override fun afterTextChanged(s: Editable) {\n      observer.onNext(TextViewAfterTextChangeEvent(view, s))\n    }\n\n    override fun onDispose() {\n      view.removeTextChangedListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewBeforeTextChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.Context\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.widget.TextView\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of before text change events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun TextView.beforeTextChangeEvents(): InitialValueObservable<TextViewBeforeTextChangeEvent> {\n  return TextViewBeforeTextChangeEventObservable(this)\n}\n\n/**\n * A before text-change event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class TextViewBeforeTextChangeEvent(\n  /** The view from which this event occurred.  */\n  val view: TextView,\n  val text: CharSequence,\n  val start: Int,\n  val count: Int,\n  val after: Int\n)\n\nprivate class TextViewBeforeTextChangeEventObservable(\n  private val view: TextView\n) : InitialValueObservable<TextViewBeforeTextChangeEvent>() {\n\n  override fun subscribeListener(observer: Observer<in TextViewBeforeTextChangeEvent>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addTextChangedListener(listener)\n  }\n\n  override val initialValue get() = TextViewBeforeTextChangeEvent(view, view.text, 0, 0, 0)\n\n  private class Listener(\n    private val view: TextView,\n    private val observer: Observer<in TextViewBeforeTextChangeEvent>\n  ) : MainThreadDisposable(), TextWatcher {\n\n    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {\n      if (!isDisposed) {\n        observer.onNext(TextViewBeforeTextChangeEvent(view, s, start, count, after))\n      }\n    }\n\n    override fun onTextChanged(charSequence: CharSequence, start: Int, before: Int, count: Int) {\n    }\n\n    override fun afterTextChanged(s: Editable) {\n    }\n\n    override fun onDispose() {\n      view.removeTextChangedListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewEditorActionEventObservable.kt",
    "content": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.KeyEvent\nimport android.widget.TextView\nimport android.widget.TextView.OnEditorActionListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of editor action events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [TextView.OnEditorActionListener] to\n * observe actions. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked each occurrence to determine the return value of the\n * underlying [TextView.OnEditorActionListener].\n */\n@CheckResult\n@JvmOverloads\nfun TextView.editorActionEvents(\n  handled: (TextViewEditorActionEvent) -> Boolean = AlwaysTrue\n): Observable<TextViewEditorActionEvent> {\n  return TextViewEditorActionEventObservable(this, handled)\n}\n\ndata class TextViewEditorActionEvent(\n  /** The view from which this event occurred.  */\n  val view: TextView,\n  val actionId: Int,\n  val keyEvent: KeyEvent?\n)\n\nprivate class TextViewEditorActionEventObservable(\n  private val view: TextView,\n  private val handled: (TextViewEditorActionEvent) -> Boolean\n) : Observable<TextViewEditorActionEvent>() {\n\n  override fun subscribeActual(observer: Observer<in TextViewEditorActionEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer, handled)\n    observer.onSubscribe(listener)\n    view.setOnEditorActionListener(listener)\n  }\n\n  private class Listener(\n    private val view: TextView,\n    private val observer: Observer<in TextViewEditorActionEvent>,\n    private val handled: (TextViewEditorActionEvent) -> Boolean\n  ) : MainThreadDisposable(), OnEditorActionListener {\n\n    override fun onEditorAction(textView: TextView, actionId: Int, keyEvent: KeyEvent?): Boolean {\n      val event = TextViewEditorActionEvent(view, actionId, keyEvent)\n      try {\n        if (!isDisposed && handled(event)) {\n          observer.onNext(event)\n          return true\n        }\n      } catch (e: Exception) {\n        observer.onError(e)\n        dispose()\n      }\n\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnEditorActionListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewEditorActionObservable.kt",
    "content": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.view.KeyEvent\nimport android.widget.TextView\nimport android.widget.TextView.OnEditorActionListener\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.internal.AlwaysTrue\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of editor actions on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [TextView.OnEditorActionListener] to\n * observe actions. Only one observable can be used for a view at a time.\n *\n * @param handled Predicate invoked each occurrence to determine the return value of the\n * underlying [TextView.OnEditorActionListener].\n */\n@CheckResult\n@JvmOverloads\nfun TextView.editorActions(handled: (Int) -> Boolean = AlwaysTrue): Observable<Int> {\n  return TextViewEditorActionObservable(this, handled)\n}\n\nprivate class TextViewEditorActionObservable(\n  private val view: TextView,\n  private val handled: (Int) -> Boolean\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer, handled)\n    observer.onSubscribe(listener)\n    view.setOnEditorActionListener(listener)\n  }\n\n  private class Listener(\n    private val view: TextView, private val observer: Observer<in Int>,\n    private val handled: (Int) -> Boolean\n  ) : MainThreadDisposable(), OnEditorActionListener {\n\n    override fun onEditorAction(textView: TextView, actionId: Int, keyEvent: KeyEvent?): Boolean {\n      try {\n        if (!isDisposed && handled(actionId)) {\n          observer.onNext(actionId)\n          return true\n        }\n      } catch (e: Exception) {\n        observer.onError(e)\n        dispose()\n      }\n\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnEditorActionListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewTextChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.content.Context\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.widget.TextView\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of text change events for `view`.\n *\n * *Warning:* Values emitted by this observable contain a **mutable**\n * [CharSequence] owned by the host `TextView` and thus are **not safe** to cache\n * or delay reading (such as by observing on a different thread). If you want to cache or delay\n * reading the items emitted then you must map values through a function which calls\n * [String.valueOf] or [.toString()][CharSequence.toString] to create a copy.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun TextView.textChangeEvents(): InitialValueObservable<TextViewTextChangeEvent> {\n  return TextViewTextChangeEventObservable(this)\n}\n\n/**\n * A text-change event on a view.\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class TextViewTextChangeEvent(\n  /** The view from which this event occurred.  */\n  val view: TextView,\n  val text: CharSequence,\n  val start: Int,\n  val before: Int,\n  val count: Int\n)\n\nprivate class TextViewTextChangeEventObservable(\n  private val view: TextView\n) : InitialValueObservable<TextViewTextChangeEvent>() {\n\n  override val initialValue get() = TextViewTextChangeEvent(view, view.text, 0, 0, 0)\n\n  override fun subscribeListener(observer: Observer<in TextViewTextChangeEvent>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addTextChangedListener(listener)\n  }\n\n  private class Listener(\n    private val view: TextView,\n    private val observer: Observer<in TextViewTextChangeEvent>\n  ) : MainThreadDisposable(), TextWatcher {\n\n    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {\n    }\n\n    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {\n      if (!isDisposed) {\n        observer.onNext(TextViewTextChangeEvent(view, s, start, before, count))\n      }\n    }\n\n    override fun afterTextChanged(editable: Editable) {\n    }\n\n    override fun onDispose() {\n      view.removeTextChangedListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewTextChangesObservable.kt",
    "content": "@file:JvmName(\"RxTextView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.widget.TextView\nimport androidx.annotation.CheckResult\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of character sequences for text changes on `view`.\n *\n * *Warning:* Values emitted by this observable are **mutable** and owned by the host\n * `TextView` and thus are **not safe** to cache or delay reading (such as by observing\n * on a different thread). If you want to cache or delay reading the items emitted then you must\n * map values through a function which calls [String.valueOf] or\n * [.toString()][CharSequence.toString] to create a copy.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun TextView.textChanges(): InitialValueObservable<CharSequence> {\n  return TextViewTextChangesObservable(this)\n}\n\nprivate class TextViewTextChangesObservable(\n  private val view: TextView\n) : InitialValueObservable<CharSequence>() {\n\n  override fun subscribeListener(observer: Observer<in CharSequence>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addTextChangedListener(listener)\n  }\n\n  override val initialValue get() = view.text\n\n  private class Listener(\n    private val view: TextView,\n    private val observer: Observer<in CharSequence>\n  ) : MainThreadDisposable(), TextWatcher {\n\n    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {\n    }\n\n    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {\n      if (!isDisposed) {\n        observer.onNext(s)\n      }\n    }\n\n    override fun afterTextChanged(s: Editable) {\n    }\n\n    override fun onDispose() {\n      view.removeTextChangedListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/ToolbarItemClickObservable.kt",
    "content": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotation.RequiresApi\nimport android.view.MenuItem\nimport android.widget.Toolbar\nimport android.widget.Toolbar.OnMenuItemClickListener\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits the clicked item in `view`'s menu.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\n@RequiresApi(21)\nfun Toolbar.itemClicks(): Observable<MenuItem> {\n  return ToolbarItemClickObservable(this)\n}\n\n@RequiresApi(21)\nprivate class ToolbarItemClickObservable(\n  private val view: Toolbar\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnMenuItemClickListener(listener)\n  }\n\n  private class Listener(\n    private val view: Toolbar,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnMenuItemClickListener {\n\n    override fun onMenuItemClick(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(item)\n        return true\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnMenuItemClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/ToolbarNavigationClickObservable.kt",
    "content": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.widget\n\nimport androidx.annotation.RequiresApi\nimport android.view.View\nimport android.view.View.OnClickListener\nimport android.widget.Toolbar\nimport androidx.annotation.CheckResult\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits on `view` navigation click events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [Toolbar.setNavigationOnClickListener]\n * to observe clicks. Only one observable can be used for a view at a time.\n */\n@CheckResult\n@RequiresApi(21)\nfun Toolbar.navigationClicks(): Observable<Unit> {\n  return ToolbarNavigationClickObservable(this)\n}\n\n@RequiresApi(21)\ninternal class ToolbarNavigationClickObservable(\n  private val view: Toolbar\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setNavigationOnClickListener(listener)\n  }\n\n  private class Listener(\n    private val view: Toolbar,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnClickListener {\n\n    override fun onClick(v: View) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.setNavigationOnClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXAppCompat\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestCore\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-appcompat/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-appcompat\nPOM_NAME=RxBinding (appcompat)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.appcompat\">\n\n  <application>\n    <activity\n        android:name=\".RxToolbarTestActivity\"\n        android:theme=\"@style/Theme.AppCompat\"\n        />\n    <activity\n        android:name=\".RxPopupMenuTestActivity\"\n        android:theme=\"@style/Theme.AppCompat\"\n        />\n    <activity\n        android:name=\".RxSearchViewTestActivity\"\n        android:theme=\"@style/Theme.AppCompat\"\n        />\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxActionMenuViewTest.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.appcompat.widget.ActionMenuView;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertSame;\n\npublic final class RxActionMenuViewTest {\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n\n  private ActionMenuView view;\n\n  @Before public void setUp() {\n    view = new ActionMenuView(context);\n  }\n\n  @Test @UiThreadTest public void itemClicks() {\n    Menu menu = view.getMenu();\n\n    MenuItem item1 = menu.add(0, 1, 0, \"Hi\");\n    MenuItem item2 = menu.add(0, 2, 0, \"Hey\");\n\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    RxActionMenuView.itemClicks(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    menu.performIdentifierAction(2, 0);\n    assertSame(item2, o.takeNext());\n\n    menu.performIdentifierAction(1, 0);\n    assertSame(item1, o.takeNext());\n\n    o.dispose();\n\n    menu.performIdentifierAction(2, 0);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTest.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Instrumentation;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.appcompat.widget.PopupMenu;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\n\npublic final class RxPopupMenuTest {\n  @Rule public final ActivityTestRule<RxPopupMenuTestActivity> activityRule =\n      new ActivityTestRule<>(RxPopupMenuTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  PopupMenu view;\n\n  @Before public void setUp() {\n    view = activityRule.getActivity().popupMenu;\n  }\n\n  @Test @UiThreadTest public void itemClicks() {\n    Menu menu = view.getMenu();\n    MenuItem item1 = menu.add(0, 1, 0, \"Hi\");\n    MenuItem item2 = menu.add(0, 2, 0, \"Hey\");\n\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    com.jakewharton.rxbinding4.appcompat.RxPopupMenu.itemClicks(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    menu.performIdentifierAction(2, 0);\n    assertSame(item2, o.takeNext());\n\n    menu.performIdentifierAction(1, 0);\n    assertSame(item1, o.takeNext());\n\n    o.dispose();\n\n    menu.performIdentifierAction(2, 0);\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void dismisses() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxPopupMenu.dismisses(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    instrumentation.runOnMainSync(() -> view.show());\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.dismiss());\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n    instrumentation.runOnMainSync(() -> view.show());\n    instrumentation.runOnMainSync(() -> view.dismiss());\n\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxPopupMenuTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport androidx.appcompat.widget.PopupMenu;\n\npublic final class RxPopupMenuTestActivity extends Activity {\n\n  PopupMenu popupMenu;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    View anchor = new View(this);\n    setContentView(anchor);\n    popupMenu = new PopupMenu(this, anchor);\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTest.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport androidx.appcompat.widget.SearchView;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic final class RxSearchViewTest {\n  @Rule\n  public final ActivityTestRule<RxSearchViewTestActivity> activityRule =\n          new ActivityTestRule<>(RxSearchViewTestActivity.class);\n\n  private SearchView searchView;\n\n  @Before public void setUp() {\n    searchView = activityRule.getActivity().searchView;\n  }\n\n  @Test @UiThreadTest public void queryTextChanges() {\n    searchView.setQuery(\"Initial\", false);\n    RecordingObserver<CharSequence> o = new RecordingObserver<>();\n    com.jakewharton.rxbinding4.appcompat.RxSearchView.queryTextChanges(searchView).subscribe(o);\n    assertEquals(\"Initial\", o.takeNext().toString());\n\n    searchView.setQuery(\"H\", false);\n    assertEquals(\"H\", o.takeNext().toString());\n    searchView.setQuery(\"He\", false);\n    assertEquals(\"He\", o.takeNext().toString());\n\n    searchView.setQuery(null, false); // Internally coerced to empty string.\n    assertEquals(\"\", o.takeNext().toString());\n\n    o.dispose();\n\n    searchView.setQuery(\"Silent\", false);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void query() throws Throwable {\n    RxSearchView.query(searchView, false).accept(\"Hey\");\n    assertEquals(\"Hey\", searchView.getQuery().toString());\n\n    RxSearchView.query(searchView, true).accept(\"Bye\");\n    assertEquals(\"Bye\", searchView.getQuery().toString());\n  }\n\n  @Test @UiThreadTest public void queryTextEventNotSubmitted() {\n    RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();\n    com.jakewharton.rxbinding4.appcompat.RxSearchView.queryTextChangeEvents(searchView).subscribe(o);\n\n    assertEquals(\"\", o.takeNext().getQueryText().toString());\n\n    searchView.setQuery(\"q\", false);\n    SearchViewQueryTextEvent event = o.takeNext();\n    assertEquals(\"q\", event.getQueryText().toString());\n    assertFalse(event.isSubmitted());\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void queryTextEventSubmitted() {\n    RecordingObserver<SearchViewQueryTextEvent> o = new RecordingObserver<>();\n    com.jakewharton.rxbinding4.appcompat.RxSearchView.queryTextChangeEvents(searchView).subscribe(o);\n\n    assertEquals(\"\", o.takeNext().getQueryText().toString());\n\n    searchView.setQuery(\"q\", true);\n    // Text change event:\n    SearchViewQueryTextEvent event = o.takeNext();\n    assertEquals(\"q\", event.getQueryText().toString());\n    assertFalse(event.isSubmitted());\n    // Submission event:\n    SearchViewQueryTextEvent event1 = o.takeNext();\n    assertEquals(\"q\", event1.getQueryText().toString());\n    assertTrue(event1.isSubmitted());\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxSearchViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\nimport androidx.appcompat.widget.SearchView;\n\npublic final class RxSearchViewTestActivity extends Activity {\n  SearchView searchView;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    searchView = new SearchView(this);\n    setContentView(searchView);\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTest.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;\nimport static com.jakewharton.rxbinding4.appcompat.RxToolbarTestActivity.NAVIGATION_CONTENT_DESCRIPTION;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertSame;\n\npublic final class RxToolbarTest {\n  @Rule public final ActivityTestRule<RxToolbarTestActivity> activityRule =\n      new ActivityTestRule<>(RxToolbarTestActivity.class);\n\n  private Toolbar view;\n\n  @Before public void setUp() {\n    RxToolbarTestActivity activity = activityRule.getActivity();\n    view = activity.toolbar;\n  }\n\n  @Test @UiThreadTest public void itemClicks() {\n    Menu menu = view.getMenu();\n    MenuItem item1 = menu.add(0, 1, 0, \"Hi\");\n    MenuItem item2 = menu.add(0, 2, 0, \"Hey\");\n\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    com.jakewharton.rxbinding4.appcompat.RxToolbar.itemClicks(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    menu.performIdentifierAction(2, 0);\n    assertSame(item2, o.takeNext());\n\n    menu.performIdentifierAction(1, 0);\n    assertSame(item1, o.takeNext());\n\n    o.dispose();\n\n    menu.performIdentifierAction(2, 0);\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void navigationClicks() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxToolbar.navigationClicks(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());\n    assertNotNull(o.takeNext());\n\n    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    onView(withContentDescription(NAVIGATION_CONTENT_DESCRIPTION)).perform(click());\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/androidTest/java/com/jakewharton/rxbinding4/appcompat/RxToolbarTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.appcompat;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.appcompat.widget.Toolbar;\n\npublic final class RxToolbarTestActivity extends Activity {\n  static final String NAVIGATION_CONTENT_DESCRIPTION = \"click me!\";\n\n  Toolbar toolbar;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    toolbar = new Toolbar(this);\n    toolbar.setNavigationContentDescription(NAVIGATION_CONTENT_DESCRIPTION);\n    toolbar.setNavigationIcon(android.R.drawable.sym_def_app_icon);\n    setContentView(toolbar);\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.appcompat\"/>\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ActionMenuViewItemClickObservable.kt",
    "content": "@file:JvmName(\"RxActionMenuView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.MenuItem\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.ActionMenuView\nimport androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits the clicked menu item in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun ActionMenuView.itemClicks(): Observable<MenuItem> {\n  return ActionMenuViewItemClickObservable(this)\n}\n\nprivate class ActionMenuViewItemClickObservable(\n  private val view: ActionMenuView\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnMenuItemClickListener(listener)\n  }\n\n  private class Listener(\n    private val actionMenuView: ActionMenuView,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnMenuItemClickListener {\n\n    override fun onMenuItemClick(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(item)\n      }\n      return true\n    }\n\n    override fun onDispose() {\n      actionMenuView.setOnMenuItemClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/PopupMenuDismissObservable.kt",
    "content": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.PopupMenu\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits on `view` dismiss events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses [PopupMenu.setOnDismissListener] to\n * observe dismiss change. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun PopupMenu.dismisses(): Observable<Unit> {\n  return PopupMenuDismissObservable(this)\n}\n\nprivate class PopupMenuDismissObservable(\n  private val view: PopupMenu\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnDismissListener(listener)\n  }\n\n  private class Listener(\n    private val popupMenu: PopupMenu,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), PopupMenu.OnDismissListener {\n\n    override fun onDismiss(menu: PopupMenu) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      popupMenu.setOnDismissListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/PopupMenuItemClickObservable.kt",
    "content": "@file:JvmName(\"RxPopupMenu\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.MenuItem\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.PopupMenu\nimport androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the clicked item in `view`'s menu.\n *\n * *Warning:* The created observable keeps a strong reference to `view`.\n * Unsubscribe to free this reference.\n *\n * *Warning:* The created observable uses [PopupMenu.setOnMenuItemClickListener]\n * to observe dismiss change. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun PopupMenu.itemClicks(): Observable<MenuItem> {\n  return PopupMenuItemClickObservable(this)\n}\n\nprivate class PopupMenuItemClickObservable(\n  private val view: PopupMenu\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnMenuItemClickListener(listener)\n  }\n\n  private class Listener(\n    private val popupMenu: PopupMenu,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnMenuItemClickListener {\n\n    override fun onMenuItemClick(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(item)\n      }\n      return true\n    }\n\n    override fun onDispose() {\n      popupMenu.setOnMenuItemClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextChangeEventsObservable.kt",
    "content": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.SearchView\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of [query text events][SearchViewQueryTextEvent] on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SearchView.queryTextChangeEvents(): InitialValueObservable<SearchViewQueryTextEvent> {\n  return SearchViewQueryTextChangeEventsObservable(this)\n}\n\nprivate class SearchViewQueryTextChangeEventsObservable(\n  val view: SearchView\n) : InitialValueObservable<SearchViewQueryTextEvent>() {\n\n  override fun subscribeListener(observer: Observer<in SearchViewQueryTextEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnQueryTextListener(listener)\n  }\n\n  override val initialValue get() = SearchViewQueryTextEvent(view, view.query, false)\n\n  private class Listener(\n    private val view: SearchView,\n    private val observer: Observer<in SearchViewQueryTextEvent>\n  ) : MainThreadDisposable(), SearchView.OnQueryTextListener {\n\n    override fun onQueryTextChange(s: String): Boolean {\n      if (!isDisposed) {\n        observer.onNext(SearchViewQueryTextEvent(view, s, false))\n        return true\n      }\n      return false\n    }\n\n    override fun onQueryTextSubmit(query: String): Boolean {\n      if (!isDisposed) {\n        observer.onNext(SearchViewQueryTextEvent(view, view.query, true))\n        return true\n      }\n      return false\n    }\n\n    override fun onDispose() {\n      view.setOnQueryTextListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextChangesObservable.kt",
    "content": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.SearchView\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of character sequences for query text changes on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SearchView.queryTextChanges(): InitialValueObservable<CharSequence> {\n  return SearchViewQueryTextChangesObservable(this)\n}\n\nprivate class SearchViewQueryTextChangesObservable(\n  private val view: SearchView\n) : InitialValueObservable<CharSequence>() {\n\n  override fun subscribeListener(observer: Observer<in CharSequence>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnQueryTextListener(listener)\n  }\n\n  override val initialValue get() = view.query\n\n  private class Listener(\n    private val searchView: SearchView,\n    private val observer: Observer<in CharSequence>\n  ) : MainThreadDisposable(), SearchView.OnQueryTextListener {\n\n    override fun onQueryTextChange(s: String): Boolean {\n      if (!isDisposed) {\n        observer.onNext(s)\n        return true\n      }\n      return false\n    }\n\n    override fun onQueryTextSubmit(query: String): Boolean {\n      return false\n    }\n\n    override fun onDispose() {\n      searchView.setOnQueryTextListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewQueryTextEvent.kt",
    "content": "package com.jakewharton.rxbinding4.appcompat\n\nimport androidx.appcompat.widget.SearchView\n\ndata class SearchViewQueryTextEvent(\n  /** The view from which this event occurred.  */\n  val view: SearchView,\n  val queryText: CharSequence,\n  val isSubmitted: Boolean\n)\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/SearchViewSetQueryConsumer.kt",
    "content": "@file:JvmName(\"RxSearchView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.SearchView\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets the query property of `view` with character sequences.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * @param submit whether to submit query right after updating query text\n */\n@CheckResult\nfun SearchView.query(submit: Boolean): Consumer<in CharSequence> {\n  return Consumer { text -> setQuery(text, submit) }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ToolbarItemClickObservable.kt",
    "content": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.MenuItem\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.Toolbar\nimport androidx.appcompat.widget.Toolbar.OnMenuItemClickListener\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the clicked item in `view`'s menu.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun Toolbar.itemClicks(): Observable<MenuItem> {\n  return ToolbarItemClickObservable(this)\n}\n\nprivate class ToolbarItemClickObservable(\n  private val view: Toolbar\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnMenuItemClickListener(listener)\n  }\n\n  private class Listener(\n    private val toolbar: Toolbar,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnMenuItemClickListener {\n\n    override fun onMenuItemClick(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(item)\n      }\n      return true\n    }\n\n    override fun onDispose() {\n      toolbar.setOnMenuItemClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-appcompat/src/main/java/com/jakewharton/rxbinding4/appcompat/ToolbarNavigationClickObservable.kt",
    "content": "@file:JvmName(\"RxToolbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.appcompat\n\nimport android.view.View\nimport androidx.annotation.CheckResult\nimport androidx.appcompat.widget.Toolbar\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits on `view` navigation click events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [Toolbar.setNavigationOnClickListener]\n * to observe clicks. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun Toolbar.navigationClicks(): Observable<Unit> {\n  return ToolbarNavigationClickObservable(this)\n}\n\nprivate class ToolbarNavigationClickObservable(\n  private val view: Toolbar\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setNavigationOnClickListener(listener)\n  }\n\n  private class Listener(\n    private val toolbar: Toolbar,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), View.OnClickListener {\n\n    override fun onClick(view: View) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      toolbar.setNavigationOnClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-core/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXCore\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-core/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-core\nPOM_NAME=RxBinding (core)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-core/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.core\">\n  <application>\n    <activity android:name=\".RxNestedScrollViewTestActivity\"/>\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTest.java",
    "content": "package com.jakewharton.rxbinding4.core;\n\nimport androidx.core.widget.NestedScrollView;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport com.jakewharton.rxbinding4.view.ViewScrollChangeEvent;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertSame;\n\npublic final class RxNestedScrollViewTest {\n  @Rule public final ActivityTestRule<RxNestedScrollViewTestActivity> activityRule =\n      new ActivityTestRule<>(RxNestedScrollViewTestActivity.class);\n\n  private NestedScrollView view;\n\n  @Before public void setUp() {\n    RxNestedScrollViewTestActivity activity = activityRule.getActivity();\n    view = activity.nestedScrollView;\n  }\n\n  @Test @UiThreadTest public void scrollChangeEvents() {\n    RecordingObserver<ViewScrollChangeEvent> o = new RecordingObserver<>();\n    RxNestedScrollView.scrollChangeEvents(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    view.scrollTo(1000, 0);\n    ViewScrollChangeEvent event = o.takeNext();\n    assertSame(view, event.getView());\n    assertEquals(1000, event.getScrollX());\n    assertEquals(0, event.getScrollY());\n    assertEquals(0, event.getOldScrollX());\n    assertEquals(0, event.getOldScrollY());\n\n    o.dispose();\n    view.scrollTo(2000, 0);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-core/src/androidTest/java/com/jakewharton/rxbinding4/core/RxNestedScrollViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.core;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.FrameLayout;\nimport android.widget.ScrollView;\nimport androidx.core.widget.NestedScrollView;\n\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\n\npublic final class RxNestedScrollViewTestActivity extends Activity {\n  NestedScrollView nestedScrollView;\n  FrameLayout emptyView;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    ScrollView scrollView = new ScrollView(this);\n    nestedScrollView = new NestedScrollView(this);\n    emptyView = new FrameLayout(this);\n\n    LayoutParams scrollParams = new LayoutParams(MATCH_PARENT, MATCH_PARENT);\n    LayoutParams emptyParams = new LayoutParams(50000, 50000);\n\n    nestedScrollView.addView(emptyView, emptyParams);\n    scrollView.addView(nestedScrollView, scrollParams);\n    setContentView(scrollView, scrollParams);\n  }\n}\n"
  },
  {
    "path": "rxbinding-core/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.core\"/>\n"
  },
  {
    "path": "rxbinding-core/src/main/java/com/jakewharton/rxbinding4/core/NestedScrollViewScrollChangeEventObservable.kt",
    "content": "@file:JvmName(\"RxNestedScrollView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.core\n\nimport androidx.annotation.CheckResult\nimport androidx.core.widget.NestedScrollView\nimport androidx.core.widget.NestedScrollView.OnScrollChangeListener\nimport com.jakewharton.rxbinding4.view.ViewScrollChangeEvent\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of scroll-change events for `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun NestedScrollView.scrollChangeEvents(): Observable<ViewScrollChangeEvent> {\n  return NestedScrollViewScrollChangeEventObservable(this)\n}\n\nprivate class NestedScrollViewScrollChangeEventObservable(\n  private val view: NestedScrollView\n) : Observable<ViewScrollChangeEvent>() {\n\n  override fun subscribeActual(observer: Observer<in ViewScrollChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnScrollChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: NestedScrollView,\n    private val observer: Observer<in ViewScrollChangeEvent>\n  ) : MainThreadDisposable(), OnScrollChangeListener {\n\n    override fun onScrollChange(\n      v: NestedScrollView, scrollX: Int, scrollY: Int, oldScrollX: Int,\n      oldScrollY: Int\n    ) {\n      if (!isDisposed) {\n        observer.onNext(ViewScrollChangeEvent(view, scrollX, scrollY, oldScrollX, oldScrollY))\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnScrollChangeListener(null as OnScrollChangeListener?)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-drawerlayout/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXDrawerLayout\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.androidXTestEspressoContrib\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-drawerlayout/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-drawerlayout\nPOM_NAME=RxBinding (drawerlayout)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.drawerlayout\">\n  <application>\n    <activity android:name=\".RxDrawerLayoutTestActivity\"/>\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTest.java",
    "content": "package com.jakewharton.rxbinding4.drawerlayout;\n\nimport android.app.Instrumentation;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport androidx.test.espresso.IdlingRegistry;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.ViewDirtyIdlingResource;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport com.jakewharton.rxbinding4.UnsafeRunnable;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static android.view.Gravity.RIGHT;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.assertion.ViewAssertions.matches;\nimport static androidx.test.espresso.contrib.DrawerMatchers.isClosed;\nimport static androidx.test.espresso.contrib.DrawerMatchers.isOpen;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic final class RxDrawerLayoutTest {\n  @Rule public final ActivityTestRule<RxDrawerLayoutTestActivity> activityRule =\n      new ActivityTestRule<>(RxDrawerLayoutTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n  private final IdlingRegistry idlingRegistry = IdlingRegistry.getInstance();\n\n  DrawerLayout view;\n  private ViewDirtyIdlingResource viewDirtyIdler;\n\n  @Before public void setUp() {\n    RxDrawerLayoutTestActivity activity = activityRule.getActivity();\n    view = activity.drawerLayout;\n\n    viewDirtyIdler = new ViewDirtyIdlingResource(activity);\n    idlingRegistry.register(viewDirtyIdler);\n  }\n\n  @After public void tearDown() {\n    idlingRegistry.unregister(viewDirtyIdler);\n  }\n\n  @Test public void drawerOpen() {\n    RecordingObserver<Boolean> o = new RecordingObserver<>();\n    RxDrawerLayout.drawerOpen(view, RIGHT) //\n        .subscribeOn(AndroidSchedulers.mainThread()) //\n        .subscribe(o);\n    assertFalse(o.takeNext());\n\n    instrumentation.runOnMainSync(() -> view.openDrawer(RIGHT));\n    assertTrue(o.takeNext());\n\n    instrumentation.runOnMainSync(() -> view.closeDrawer(RIGHT));\n    assertFalse(o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.openDrawer(RIGHT));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void open() {\n    final Consumer<? super Boolean> open = RxDrawerLayout.open(view, RIGHT);\n\n    instrumentation.runOnMainSync(new UnsafeRunnable() {\n\n      @Override protected void unsafeRun() throws Throwable {\n        open.accept(true);\n      }\n    });\n    onView(withId(view.getId())).check(matches(isOpen(RIGHT)));\n\n    instrumentation.runOnMainSync(new UnsafeRunnable() {\n      @Override protected void unsafeRun() throws Throwable {\n        open.accept(false);\n      }\n    });\n    onView(withId(view.getId())).check(matches(isClosed(RIGHT)));\n  }\n}\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/androidTest/java/com/jakewharton/rxbinding4/drawerlayout/RxDrawerLayoutTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.drawerlayout;\n\nimport android.app.Activity;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.widget.FrameLayout;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport androidx.drawerlayout.widget.DrawerLayout.LayoutParams;\n\nimport static android.view.Gravity.RIGHT;\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\n\npublic final class RxDrawerLayoutTestActivity extends Activity {\n  DrawerLayout drawerLayout;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    drawerLayout = new DrawerLayout(this);\n    drawerLayout.setId(android.R.id.primary);\n\n    FrameLayout main = new FrameLayout(this);\n    LayoutParams mainParams = new LayoutParams(MATCH_PARENT, MATCH_PARENT);\n    drawerLayout.addView(main, mainParams);\n\n    FrameLayout drawer = new FrameLayout(this);\n    drawer.setBackgroundColor(Color.WHITE);\n    LayoutParams drawerParams = new LayoutParams(300, MATCH_PARENT, RIGHT);\n    drawerLayout.addView(drawer, drawerParams);\n\n    setContentView(drawerLayout);\n  }\n}\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.drawerlayout\"/>\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/main/java/com/jakewharton/rxbinding4/drawerlayout/DrawerLayoutDrawerOpenedObservable.kt",
    "content": "@file:JvmName(\"RxDrawerLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.drawerlayout\n\nimport android.view.View\nimport androidx.annotation.CheckResult\nimport androidx.drawerlayout.widget.DrawerLayout\nimport androidx.drawerlayout.widget.DrawerLayout.DrawerListener\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the open state of the drawer of `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun DrawerLayout.drawerOpen(gravity: Int): InitialValueObservable<Boolean> {\n  return DrawerLayoutDrawerOpenedObservable(this, gravity)\n}\n\nprivate class DrawerLayoutDrawerOpenedObservable(\n  private val view: DrawerLayout,\n  private val gravity: Int\n) : InitialValueObservable<Boolean>() {\n\n  override fun subscribeListener(observer: Observer<in Boolean>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, gravity, observer)\n    observer.onSubscribe(listener)\n    view.addDrawerListener(listener)\n  }\n\n  override val initialValue get() = view.isDrawerOpen(gravity)\n\n  private class Listener(\n    private val view: DrawerLayout,\n    private val gravity: Int,\n    private val observer: Observer<in Boolean>\n  ) : MainThreadDisposable(), DrawerListener {\n\n    override fun onDrawerSlide(drawerView: View, slideOffset: Float) {\n    }\n\n    override fun onDrawerOpened(drawerView: View) {\n      if (!isDisposed) {\n        val drawerGravity = (drawerView.layoutParams as DrawerLayout.LayoutParams).gravity\n        if (drawerGravity == gravity) {\n          observer.onNext(true)\n        }\n      }\n    }\n\n    override fun onDrawerClosed(drawerView: View) {\n      if (!isDisposed) {\n        val drawerGravity = (drawerView.layoutParams as DrawerLayout.LayoutParams).gravity\n        if (drawerGravity == gravity) {\n          observer.onNext(false)\n        }\n      }\n    }\n\n    override fun onDrawerStateChanged(newState: Int) {\n    }\n\n    override fun onDispose() {\n      view.removeDrawerListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-drawerlayout/src/main/java/com/jakewharton/rxbinding4/drawerlayout/DrawerLayoutOpenConsumer.kt",
    "content": "@file:JvmName(\"RxDrawerLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.drawerlayout\n\nimport androidx.annotation.CheckResult\nimport androidx.drawerlayout.widget.DrawerLayout\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets whether the drawer with `gravity` of `view` is open.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun DrawerLayout.open(gravity: Int): Consumer<in Boolean> {\n  return Consumer { value ->\n    if (value) {\n      openDrawer(gravity)\n    } else {\n      closeDrawer(gravity)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXLeanback\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestCore\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion 17\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-leanback/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-leanback\nPOM_NAME=RxBinding (leanback)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.leanback\">\n\n  <uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n\n  <application>\n    <activity\n        android:name=\".RxSearchBarTestActivity\"\n        android:theme=\"@style/Theme.Leanback\"\n    />\n    <activity\n        android:name=\".RxSearchEditTextTestActivity\"\n        android:theme=\"@style/Theme.Leanback\"\n    />\n    </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTest.java",
    "content": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.view.KeyEvent;\nimport androidx.leanback.widget.SearchBar;\nimport androidx.leanback.widget.SearchEditText;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxSearchBarTest {\n  @Rule public final ActivityTestRule<RxSearchBarTestActivity> activityRule =\n          new ActivityTestRule<>(RxSearchBarTestActivity.class);\n\n  private SearchBar searchBar;\n  private SearchEditText searchEditText;\n\n  @Before public void setUp() {\n    RxSearchBarTestActivity activity = activityRule.getActivity();\n    searchBar = activity.searchBar;\n    searchEditText = activity.searchEditText;\n  }\n\n  @Test @UiThreadTest public void searchQueryChanges() {\n    RecordingObserver<String> o = new RecordingObserver<>();\n    RxSearchBar.searchQueryChanges(searchBar).subscribe(o);\n    o.assertNoMoreEvents();\n\n    searchBar.setSearchQuery(\"H\");\n    assertEquals(\"H\", o.takeNext());\n    searchBar.setSearchQuery(\"He\");\n    assertEquals(\"He\", o.takeNext());\n\n    o.dispose();\n\n    searchBar.setSearchQuery(\"Silent\");\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void searchQueryChangeEvents() {\n    RecordingObserver<SearchBarSearchQueryEvent> o = new RecordingObserver<>();\n    RxSearchBar.searchQueryChangeEvents(searchBar).subscribe(o);\n    o.assertNoMoreEvents();\n\n    searchBar.setSearchQuery(\"q\");\n    assertEquals(new SearchBarSearchQueryChangedEvent(searchBar, \"q\"), o.takeNext());\n    o.assertNoMoreEvents();\n\n    o.dispose();\n    searchBar.setSearchQuery(\"Silent\");\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void searchQueryChangeEventsKeyboardDismissed() {\n    RecordingObserver<SearchBarSearchQueryEvent> o = new RecordingObserver<>();\n    RxSearchBar.searchQueryChangeEvents(searchBar).subscribe(o);\n    o.assertNoMoreEvents();\n\n    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);\n\n    searchBar.setSearchQuery(\"q\");\n    searchEditText.onKeyPreIme(KeyEvent.KEYCODE_BACK, keyEvent);\n\n    assertEquals(new SearchBarSearchQueryChangedEvent(searchBar, \"q\"), o.takeNext());\n    assertEquals(new SearchBarSearchQueryKeyboardDismissedEvent(searchBar, \"q\"), o.takeNext());\n\n    o.dispose();\n    searchEditText.onKeyPreIme(KeyEvent.KEYCODE_BACK, keyEvent);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchBarTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.leanback.widget.SearchBar;\nimport androidx.leanback.widget.SearchEditText;\nimport androidx.leanback.widget.SearchOrbView;\n\npublic final class RxSearchBarTestActivity extends Activity {\n  SearchBar searchBar;\n  SearchEditText searchEditText;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    setContentView(R.layout.lb_search_fragment);\n\n    searchBar = findViewById(R.id.lb_search_bar);\n    searchEditText = searchBar.findViewById(R.id.lb_search_text_editor);\n\n    // reduce flakiness\n    SearchOrbView searchOrbView = searchBar.findViewById(R.id.lb_search_bar_speech_orb);\n    searchOrbView.enableOrbColorAnimation(false);\n    searchOrbView.setSoundEffectsEnabled(false);\n    searchOrbView.clearAnimation();\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTest.java",
    "content": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.view.KeyEvent;\nimport androidx.leanback.widget.SearchEditText;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertNotNull;\n\npublic final class RxSearchEditTextTest {\n  @Rule public final ActivityTestRule<RxSearchEditTextTestActivity> activityRule =\n          new ActivityTestRule<>(RxSearchEditTextTestActivity.class);\n  private SearchEditText view;\n\n  @Before public void setUp() {\n    view = activityRule.getActivity().searchEditText;\n  }\n\n  @Test @UiThreadTest public void keyboardDismisses() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxSearchEditText.keyboardDismisses(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);\n\n    view.onKeyPreIme(KeyEvent.KEYCODE_BACK, event);\n    assertNotNull(o.takeNext());\n\n    o.dispose();\n\n    view.onKeyPreIme(KeyEvent.KEYCODE_BACK, event);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/src/androidTest/java/com/jakewharton/rxbinding4/leanback/RxSearchEditTextTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.leanback;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.leanback.widget.SearchEditText;\n\npublic final class RxSearchEditTextTestActivity extends Activity {\n  SearchEditText searchEditText;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    searchEditText = new SearchEditText(this);\n    setContentView(searchEditText);\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.leanback\"/>\n"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryChangeEventsObservable.kt",
    "content": "@file:JvmName(\"RxSearchBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annotation.CheckResult\nimport androidx.leanback.widget.SearchBar\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of [search query events][SearchBarSearchQueryEvent] on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun SearchBar.searchQueryChangeEvents(): Observable<SearchBarSearchQueryEvent> {\n  return SearchBarSearchQueryChangeEventsObservable(this)\n}\n\nprivate class SearchBarSearchQueryChangeEventsObservable(\n  private val view: SearchBar\n) : Observable<SearchBarSearchQueryEvent>() {\n\n  override fun subscribeActual(observer: Observer<in SearchBarSearchQueryEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setSearchBarListener(listener)\n  }\n\n  private class Listener(\n    private val view: SearchBar,\n    private val observer: Observer<in SearchBarSearchQueryEvent>\n  ) : MainThreadDisposable(), SearchBar.SearchBarListener {\n\n    override fun onSearchQueryChange(query: String) {\n      if (!isDisposed) {\n        observer.onNext(SearchBarSearchQueryChangedEvent(view, query))\n      }\n    }\n\n    override fun onSearchQuerySubmit(query: String) {\n      if (!isDisposed) {\n        observer.onNext(SearchBarSearchQuerySubmittedEvent(view, query))\n      }\n    }\n\n    override fun onKeyboardDismiss(query: String) {\n      if (!isDisposed) {\n        observer.onNext(SearchBarSearchQueryKeyboardDismissedEvent(view, query))\n      }\n    }\n\n    override fun onDispose() {\n      view.setSearchBarListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryChangesObservable.kt",
    "content": "@file:JvmName(\"RxSearchBar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annotation.CheckResult\nimport androidx.leanback.widget.SearchBar\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of String values for search query changes on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun SearchBar.searchQueryChanges(): Observable<String> {\n  return SearchBarSearchQueryChangesObservable(this)\n}\n\nprivate class SearchBarSearchQueryChangesObservable(\n  private val view: SearchBar\n) : Observable<String>() {\n\n  override fun subscribeActual(observer: Observer<in String>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setSearchBarListener(listener)\n  }\n\n  private class Listener(\n    private val view: SearchBar,\n    private val observer: Observer<in String>\n  ) : MainThreadDisposable(), SearchBar.SearchBarListener {\n\n    override fun onSearchQueryChange(query: String) {\n      if (!isDisposed) {\n        observer.onNext(query)\n      }\n    }\n\n    override fun onSearchQuerySubmit(query: String) {}\n\n    override fun onKeyboardDismiss(query: String) {}\n\n    override fun onDispose() {\n      view.setSearchBarListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchBarSearchQueryEvent.kt",
    "content": "package com.jakewharton.rxbinding4.leanback\n\nimport androidx.leanback.widget.SearchBar\n\nsealed class SearchBarSearchQueryEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: SearchBar\n  abstract val searchQuery: String\n}\n\ndata class SearchBarSearchQueryChangedEvent(\n  override val view: SearchBar,\n  override val searchQuery: String\n) : SearchBarSearchQueryEvent()\n\ndata class SearchBarSearchQueryKeyboardDismissedEvent(\n  override val view: SearchBar,\n  override val searchQuery: String\n) : SearchBarSearchQueryEvent()\n\ndata class SearchBarSearchQuerySubmittedEvent(\n  override val view: SearchBar,\n  override val searchQuery: String\n) : SearchBarSearchQueryEvent()\n"
  },
  {
    "path": "rxbinding-leanback/src/main/java/com/jakewharton/rxbinding4/leanback/SearchEditTextKeyboardDismissObservable.kt",
    "content": "@file:JvmName(\"RxSearchEditText\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.leanback\n\nimport androidx.annotation.CheckResult\nimport androidx.leanback.widget.SearchEditText\nimport androidx.leanback.widget.SearchEditText.OnKeyboardDismissListener\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable which emits the keyboard dismiss events from `view`.\n *\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun SearchEditText.keyboardDismisses(): Observable<Unit> {\n  return SearchEditTextKeyboardDismissObservable(this)\n}\n\nprivate class SearchEditTextKeyboardDismissObservable(\n  private val view: SearchEditText\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnKeyboardDismissListener(listener)\n  }\n\n  private class Listener(\n    private val view: SearchEditText,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnKeyboardDismissListener {\n\n    override fun onKeyboardDismiss() {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnKeyboardDismissListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.googleMaterial\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestCore\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-material/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-material\nPOM_NAME=RxBinding (material)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.material\">\n\n  <application>\n    <activity\n        android:name=\".RxSwipeDismissBehaviorTestActivity\"\n        android:theme=\"@style/Theme.AppCompat\"\n        />\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxAppBarLayoutTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.view.View;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport androidx.test.filters.SdkSuppress;\nimport com.google.android.material.appbar.AppBarLayout;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic class RxAppBarLayoutTest {\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n  private final CoordinatorLayout parent = new CoordinatorLayout(context);\n  private final AppBarLayout view = new AppBarLayout(context);\n\n  @Before public void setUp() {\n    parent.addView(view);\n  }\n\n  @SdkSuppress(minSdkVersion = 17)\n  @Test @UiThreadTest public void offsetChanges() {\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxAppBarLayout.offsetChanges(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();\n    AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();\n    params.setBehavior(behavior);\n    behavior.onLayoutChild(parent, view, View.LAYOUT_DIRECTION_LTR);\n    assertEquals(0, o.takeNext().intValue());\n\n    o.dispose();\n\n    behavior.onLayoutChild(parent, view, View.LAYOUT_DIRECTION_LTR);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxBottomNavigationViewTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.google.android.material.bottomnavigation.BottomNavigationView;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport com.jakewharton.rxbinding4.material.test.R;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxBottomNavigationViewTest {\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n  private final BottomNavigationView view = new BottomNavigationView(context);\n  private final Menu menu = view.getMenu();\n\n  @Before public void setUp() {\n    view.inflateMenu(R.menu.menu);\n  }\n\n  @After public void teardown() {\n    menu.clear();\n  }\n\n  @Test @UiThreadTest public void itemSelections() {\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    RxBottomNavigationView.itemSelections(view).subscribe(o);\n\n    // initial value\n    assertEquals(R.id.menu_item_one, o.takeNext().getItemId());\n\n    menu.performIdentifierAction(R.id.menu_item_two, 0);\n    assertEquals(R.id.menu_item_two, o.takeNext().getItemId());\n\n    menu.performIdentifierAction(R.id.menu_item_one, 0);\n    assertEquals(R.id.menu_item_one, o.takeNext().getItemId());\n\n    o.dispose();\n\n    menu.performIdentifierAction(R.id.menu_item_two, 0);\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxChipTest.kt",
    "content": "package com.jakewharton.rxbinding4.material\n\nimport android.content.Context\nimport android.view.ContextThemeWrapper\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.core.app.ApplicationProvider\nimport com.google.android.material.chip.Chip\nimport com.jakewharton.rxbinding4.RecordingObserver\nimport org.junit.Assert.assertNotNull\nimport org.junit.Test\n\nclass RxChipTest {\n  private val rawContext: Context = ApplicationProvider.getApplicationContext()\n  private val context = ContextThemeWrapper(rawContext, R.style.Theme_MaterialComponents)\n  private val view = Chip(context)\n\n  @Test @UiThreadTest fun closeIconClicks() {\n    val o = RecordingObserver<Unit>()\n    view.closeIconClicks().subscribe(o)\n    o.assertNoMoreEvents() // No initial value.\n\n    view.performCloseIconClick()\n    assertNotNull(o.takeNext())\n\n    view.performCloseIconClick()\n    assertNotNull(o.takeNext())\n\n    o.dispose()\n\n    view.performCloseIconClick()\n    o.assertNoMoreEvents()\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxFloatingActionButtonTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.view.View;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\npublic class RxFloatingActionButtonTest {\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n  private final FloatingActionButton fab = new FloatingActionButton(context);\n\n  @Test\n  @UiThreadTest\n  public void visibility() throws Throwable {\n    fab.show();\n    Consumer<? super Boolean> action = RxFloatingActionButton.visibility(fab);\n    action.accept(false);\n    assertEquals(View.GONE, fab.getVisibility());\n    action.accept(true);\n    assertEquals(View.VISIBLE, fab.getVisibility());\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxNavigationViewTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.google.android.material.navigation.NavigationView;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertSame;\n\npublic final class RxNavigationViewTest {\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n  private final NavigationView view = new NavigationView(context);\n  private final Menu menu = view.getMenu();\n  private final MenuItem item1 = menu.add(1, 1, 0, \"Hi\");\n  private final MenuItem item2 = menu.add(1, 2, 0, \"Hey\");\n\n  @Before public void setUp() {\n    menu.setGroupCheckable(1, true, true);\n  }\n\n  @Test @UiThreadTest public void itemSelections() {\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    RxNavigationView.itemSelections(view).subscribe(o);\n    o.assertNoMoreEvents();\n\n    menu.performIdentifierAction(2, 0);\n    assertSame(item2, o.takeNext());\n\n    menu.performIdentifierAction(1, 0);\n    assertSame(item1, o.takeNext());\n\n    o.dispose();\n\n    menu.performIdentifierAction(2, 0);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void itemSelectionsInitialValue() {\n    item2.setChecked(true);\n\n    RecordingObserver<MenuItem> o = new RecordingObserver<>();\n    RxNavigationView.itemSelections(view).subscribe(o);\n    assertSame(item2, o.takeNext());\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSnackbarTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.app.Instrumentation;\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.widget.FrameLayout;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.google.android.material.snackbar.Snackbar;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Test;\n\nimport static com.google.android.material.snackbar.Snackbar.Callback.DISMISS_EVENT_MANUAL;\nimport static com.google.android.material.snackbar.Snackbar.LENGTH_SHORT;\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxSnackbarTest {\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n  private final FrameLayout parent = new FrameLayout(context);\n\n  @Test public void dismisses() {\n    final Snackbar view = Snackbar.make(parent, \"Hey\", LENGTH_SHORT);\n\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxSnackbar.dismisses(view).subscribeOn(AndroidSchedulers.mainThread()).subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.show());\n    instrumentation.runOnMainSync(() -> view.dismiss());\n    assertEquals(DISMISS_EVENT_MANUAL, o.takeNext().intValue());\n\n    instrumentation.runOnMainSync(() -> view.show());\n    o.dispose();\n    instrumentation.runOnMainSync(() -> view.dismiss());\n    o.assertNoMoreEvents();\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.view.View;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\nimport androidx.test.espresso.ViewAction;\nimport androidx.test.espresso.action.GeneralLocation;\nimport androidx.test.espresso.action.GeneralSwipeAction;\nimport androidx.test.espresso.action.Press;\nimport androidx.test.espresso.action.Swipe;\nimport androidx.test.rule.ActivityTestRule;\nimport com.google.android.material.behavior.SwipeDismissBehavior;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.junit.Assert.assertEquals;\n\npublic final class RxSwipeDismissBehaviorTest {\n  @Rule public final ActivityTestRule<RxSwipeDismissBehaviorTestActivity> activityRule =\n      new ActivityTestRule<>(RxSwipeDismissBehaviorTestActivity.class);\n\n  private View view;\n\n  @Before public void setUp() {\n    RxSwipeDismissBehaviorTestActivity activity = activityRule.getActivity();\n    view = activity.view;\n  }\n\n  @Test public void dismisses() {\n    ((CoordinatorLayout.LayoutParams) view.getLayoutParams()).setBehavior(\n        new SwipeDismissBehavior());\n\n    RecordingObserver<View> o = new RecordingObserver<>();\n    RxSwipeDismissBehavior.dismisses(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    onView(withId(1)).perform(swipeRight());\n    assertEquals(view, o.takeNext());\n\n    o.dispose();\n\n    onView(withId(1)).perform(swipeRight());\n    o.assertNoMoreEvents();\n  }\n\n  private static ViewAction swipeRight() {\n    return new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_LEFT,\n        GeneralLocation.CENTER_RIGHT, Press.FINGER);\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxSwipeDismissBehaviorTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\n\npublic class RxSwipeDismissBehaviorTestActivity extends Activity {\n  CoordinatorLayout parent;\n  View view;\n\n  @SuppressWarnings(\"ResourceType\")\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    parent = new CoordinatorLayout(this);\n    view = new View(this);\n    view.setId(1);\n    view.setLayoutParams(new CoordinatorLayout.LayoutParams(100, 100));\n    view.setBackgroundColor(0xFFFF0000);\n    parent.addView(view);\n\n    setContentView(parent);\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/java/com/jakewharton/rxbinding4/material/RxTabLayoutTest.java",
    "content": "package com.jakewharton.rxbinding4.material;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.google.android.material.tabs.TabLayout;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertSame;\nimport static org.junit.Assert.fail;\n\npublic final class RxTabLayoutTest {\n  private final Context rawContext = ApplicationProvider.getApplicationContext();\n  private final Context context = new ContextThemeWrapper(rawContext, R.style.Theme_AppCompat);\n  private final TabLayout view = new TabLayout(context);\n  private final TabLayout.Tab tab1 = view.newTab();\n  private final TabLayout.Tab tab2 = view.newTab();\n\n  @Before public void setUp() {\n    view.addTab(tab1);\n    view.addTab(tab2);\n  }\n\n  @Test @UiThreadTest public void selectionEvents() {\n    RecordingObserver<TabLayoutSelectionEvent> o = new RecordingObserver<>();\n    RxTabLayout.selectionEvents(view).subscribe(o);\n    assertEquals(new TabLayoutSelectionSelectedEvent(view, tab1), o.takeNext());\n\n    tab2.select();\n    assertEquals(new TabLayoutSelectionUnselectedEvent(view, tab1), o.takeNext());\n    assertEquals(new TabLayoutSelectionSelectedEvent(view, tab2), o.takeNext());\n\n    tab2.select(); // Reselection\n    assertEquals(new TabLayoutSelectionReselectedEvent(view, tab2), o.takeNext());\n\n    tab1.select();\n    assertEquals(new TabLayoutSelectionUnselectedEvent(view, tab2), o.takeNext());\n    assertEquals(new TabLayoutSelectionSelectedEvent(view, tab1), o.takeNext());\n\n    o.dispose();\n\n    tab2.select();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void selectionEventsNoInitial() {\n    TabLayout empty = new TabLayout(context);\n\n    RecordingObserver<TabLayoutSelectionEvent> o = new RecordingObserver<>();\n    RxTabLayout.selectionEvents(empty).subscribe(o);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void selections() {\n    RecordingObserver<TabLayout.Tab> o = new RecordingObserver<>();\n    RxTabLayout.selections(view).subscribe(o);\n    assertSame(tab1, o.takeNext());\n\n    tab2.select();\n    assertSame(tab2, o.takeNext());\n\n    tab2.select(); // Reselection\n    o.assertNoMoreEvents();\n\n    tab1.select();\n    assertSame(tab1, o.takeNext());\n\n    o.dispose();\n\n    tab2.select();\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void selectionsNoInitial() {\n    TabLayout empty = new TabLayout(context);\n\n    RecordingObserver<TabLayout.Tab> o = new RecordingObserver<>();\n    RxTabLayout.selections(empty).subscribe(o);\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void select() throws Throwable {\n    Consumer<? super Integer> action = RxTabLayout.select(view);\n    assertEquals(0, view.getSelectedTabPosition());\n    action.accept(1);\n    assertEquals(1, view.getSelectedTabPosition());\n    action.accept(0);\n    assertEquals(0, view.getSelectedTabPosition());\n  }\n\n  @Test @UiThreadTest public void selectInvalidValueThrows() throws Throwable {\n    Consumer<? super Integer> action = RxTabLayout.select(view);\n    try {\n      action.accept(2);\n      fail();\n    } catch (IllegalArgumentException e) {\n      assertEquals(\"No tab for index 2\", e.getMessage());\n    }\n    try {\n      action.accept(-1);\n      fail();\n    } catch (IllegalArgumentException e) {\n      assertEquals(\"No tab for index -1\", e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/androidTest/res/menu/menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <group>\n    <item\n        android:id=\"@+id/menu_item_one\"\n        android:title=\"Hi\"\n        />\n    <item\n        android:id=\"@+id/menu_item_two\"\n        android:title=\"Hey\"\n        />\n  </group>\n</menu>"
  },
  {
    "path": "rxbinding-material/src/androidTest/res/values/strings.xml",
    "content": "<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",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.material\"/>\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/AppBarLayoutOffsetChangeObservable.kt",
    "content": "@file:JvmName(\"RxAppBarLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annotation.CheckResult\nimport com.google.android.material.appbar.AppBarLayout\nimport com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the offset change in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun AppBarLayout.offsetChanges(): Observable<Int> {\n  return AppBarLayoutOffsetChangeObservable(this)\n}\n\nprivate class AppBarLayoutOffsetChangeObservable(\n  private val view: AppBarLayout\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnOffsetChangedListener(listener)\n  }\n\n  private class Listener(\n    private val appBarLayout: AppBarLayout,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnOffsetChangedListener {\n\n    override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {\n      if (!isDisposed) {\n        observer.onNext(verticalOffset)\n      }\n    }\n\n    override fun onDispose() {\n      appBarLayout.removeOnOffsetChangedListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/BottomNavigationViewItemSelectionsObservable.kt",
    "content": "@file:JvmName(\"RxBottomNavigationView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.view.MenuItem\nimport androidx.annotation.CheckResult\nimport com.google.android.material.bottomnavigation.BottomNavigationView\nimport com.google.android.material.bottomnavigation.BottomNavigationView.OnNavigationItemSelectedListener\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the selected item in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* If an item is already selected, it will be emitted immediately on subscribe.\n */\n@CheckResult\nfun BottomNavigationView.itemSelections(): Observable<MenuItem> {\n  return BottomNavigationViewItemSelectionsObservable(this)\n}\n\nprivate class BottomNavigationViewItemSelectionsObservable(\n  private val view: BottomNavigationView\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnNavigationItemSelectedListener(listener)\n\n    // Emit initial item, if one can be found\n    val menu = view.menu\n    for (i in 0 until menu.size()) {\n      val item = menu.getItem(i)\n      if (item.isChecked) {\n        observer.onNext(item)\n        break\n      }\n    }\n  }\n\n  private class Listener(\n    private val bottomNavigationView: BottomNavigationView,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnNavigationItemSelectedListener {\n\n    override fun onNavigationItemSelected(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(item)\n      }\n      return true\n    }\n\n    override fun onDispose() {\n      bottomNavigationView.setOnNavigationItemSelectedListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/ChipCloseIconClicksObservable.kt",
    "content": "@file:JvmName(\"RxChip\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.view.View\nimport android.view.View.OnClickListener\nimport androidx.annotation.CheckResult\nimport com.google.android.material.chip.Chip\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits on [Chip] close icon click events. The emitted value is\n * unspecified and should only be used as notification.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [Chip.setOnCloseIconClickListener] to observe\n * clicks. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun Chip.closeIconClicks(): Observable<Unit> {\n  return ChipCloseIconClicksObservable(this)\n}\n\nprivate class ChipCloseIconClicksObservable(\n  private val view: Chip\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnCloseIconClickListener(listener)\n  }\n\n  private class Listener(\n    private val view: Chip,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnClickListener {\n\n    override fun onClick(v: View) {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnCloseIconClickListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/FloatingActionButtonVisibilityConsumer.kt",
    "content": "@file:JvmName(\"RxFloatingActionButton\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annotation.CheckResult\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets the visibility of `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun FloatingActionButton.visibility(): Consumer<in Boolean> {\n  return Consumer { value ->\n    if (value) {\n      show()\n    } else {\n      hide()\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/NavigationViewItemSelectionsObservable.kt",
    "content": "@file:JvmName(\"RxNavigationView\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.view.MenuItem\nimport androidx.annotation.CheckResult\nimport com.google.android.material.navigation.NavigationView\nimport com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the selected item in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* If an item is already selected, it will be emitted immediately on subscribe.\n * This behavior assumes but does not enforce that the items are exclusively checkable.\n */\n@CheckResult\nfun NavigationView.itemSelections(): Observable<MenuItem> {\n  return NavigationViewItemSelectionsObservable(this)\n}\n\nprivate class NavigationViewItemSelectionsObservable(\n  private val view: NavigationView\n) : Observable<MenuItem>() {\n\n  override fun subscribeActual(observer: Observer<in MenuItem>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setNavigationItemSelectedListener(listener)\n\n    // Emit initial checked item, if one can be found.\n    val menu = view.menu\n    for (i in 0 until menu.size()) {\n      val item = menu.getItem(i)\n      if (item.isChecked) {\n        observer.onNext(item)\n        break\n      }\n    }\n  }\n\n  private class Listener(\n    private val navigationView: NavigationView,\n    private val observer: Observer<in MenuItem>\n  ) : MainThreadDisposable(), OnNavigationItemSelectedListener {\n\n    override fun onNavigationItemSelected(item: MenuItem): Boolean {\n      if (!isDisposed) {\n        observer.onNext(item)\n      }\n      return true\n    }\n\n    override fun onDispose() {\n      navigationView.setNavigationItemSelectedListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/SnackbarDismissesObservable.kt",
    "content": "@file:JvmName(\"RxSnackbar\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annotation.CheckResult\nimport com.google.android.material.snackbar.Snackbar\nimport com.google.android.material.snackbar.Snackbar.Callback\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the dismiss events from `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun Snackbar.dismisses(): Observable<Int> {\n  return SnackbarDismissesObservable(this)\n}\n\nprivate class SnackbarDismissesObservable(\n  private val view: Snackbar\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addCallback(listener.callback)\n  }\n\n  private class Listener(\n    private val snackbar: Snackbar,\n    observer: Observer<in Int>\n  ) : MainThreadDisposable() {\n    val callback = object : Callback() {\n      override fun onDismissed(snackbar: Snackbar?, event: Int) {\n        if (!isDisposed) {\n          observer.onNext(event)\n        }\n      }\n    }\n\n    override fun onDispose() {\n      snackbar.removeCallback(callback)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/SwipeDismissBehaviorObservable.kt",
    "content": "@file:JvmName(\"RxSwipeDismissBehavior\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport android.view.View\nimport androidx.annotation.CheckResult\nimport androidx.coordinatorlayout.widget.CoordinatorLayout.LayoutParams\nimport com.google.android.material.behavior.SwipeDismissBehavior\nimport com.google.android.material.behavior.SwipeDismissBehavior.OnDismissListener\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the dismiss events from `view` on\n * [SwipeDismissBehavior].\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun View.dismisses(): Observable<View> {\n  return SwipeDismissBehaviorObservable(this)\n}\n\nprivate class SwipeDismissBehaviorObservable(\n  private val view: View\n) : Observable<View>() {\n\n  override fun subscribeActual(observer: Observer<in View>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val params = view.layoutParams as? LayoutParams\n        ?: throw IllegalArgumentException(\"The view is not in a Coordinator Layout.\")\n    val behavior = params.behavior as SwipeDismissBehavior<*>?\n        ?: throw IllegalStateException(\"There's no behavior set on this view.\")\n\n    val listener = Listener(behavior, observer)\n    observer.onSubscribe(listener)\n    behavior.setListener(listener)\n  }\n\n  private class Listener(\n    private val swipeDismissBehavior: SwipeDismissBehavior<*>,\n    private val observer: Observer<in View>\n  ) : MainThreadDisposable(), OnDismissListener {\n\n    override fun onDismiss(view: View) {\n      if (!isDisposed) {\n        observer.onNext(view)\n      }\n    }\n\n    override fun onDragStateChanged(state: Int) {}\n\n    override fun onDispose() {\n      swipeDismissBehavior.setListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectConsumer.kt",
    "content": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annotation.CheckResult\nimport com.google.android.material.tabs.TabLayout\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets the selected tab of `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun select(view: TabLayout): Consumer<in Int> {\n  return Consumer { index ->\n    if (index < 0 || index >= view.tabCount) {\n      throw IllegalArgumentException(\"No tab for index \" + index!!)\n    }\n    view.getTabAt(index)!!.select()\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionEvent.kt",
    "content": "package com.jakewharton.rxbinding4.material\n\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayout.Tab\n\nsealed class TabLayoutSelectionEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: TabLayout\n  abstract val tab: Tab\n}\n\ndata class TabLayoutSelectionSelectedEvent(\n  override val view: TabLayout,\n  override val tab: Tab\n) : TabLayoutSelectionEvent()\n\ndata class TabLayoutSelectionReselectedEvent(\n  override val view: TabLayout,\n  override val tab: Tab\n) : TabLayoutSelectionEvent()\n\ndata class TabLayoutSelectionUnselectedEvent(\n  override val view: TabLayout,\n  override val tab: Tab\n) : TabLayoutSelectionEvent()\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionEventObservable.kt",
    "content": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annotation.CheckResult\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayout.Tab\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits selection, reselection, and unselection events for the tabs\n * in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* If a tab is already selected, an event will be emitted immediately on subscribe.\n */\n@CheckResult\nfun TabLayout.selectionEvents(): Observable<TabLayoutSelectionEvent> {\n  return TabLayoutSelectionEventObservable(this)\n}\n\nprivate class TabLayoutSelectionEventObservable(\n  val view: TabLayout\n) : Observable<TabLayoutSelectionEvent>() {\n\n  override fun subscribeActual(observer: Observer<in TabLayoutSelectionEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnTabSelectedListener(listener)\n\n    val index = view.selectedTabPosition\n    if (index != -1) {\n      observer.onNext(TabLayoutSelectionSelectedEvent(view, view.getTabAt(index)!!))\n    }\n  }\n\n  private class Listener(\n    private val view: TabLayout,\n    private val observer: Observer<in TabLayoutSelectionEvent>\n  ) : MainThreadDisposable(), TabLayout.OnTabSelectedListener {\n\n    override fun onTabSelected(tab: Tab) {\n      if (!isDisposed) {\n        observer.onNext(TabLayoutSelectionSelectedEvent(view, tab))\n      }\n    }\n\n    override fun onTabUnselected(tab: Tab) {\n      if (!isDisposed) {\n        observer.onNext(TabLayoutSelectionUnselectedEvent(view, tab))\n      }\n    }\n\n    override fun onTabReselected(tab: Tab) {\n      if (!isDisposed) {\n        observer.onNext(TabLayoutSelectionReselectedEvent(view, tab))\n      }\n    }\n\n    override fun onDispose() {\n      view.removeOnTabSelectedListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-material/src/main/java/com/jakewharton/rxbinding4/material/TabLayoutSelectionsObservable.kt",
    "content": "@file:JvmName(\"RxTabLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.material\n\nimport androidx.annotation.CheckResult\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayout.BaseOnTabSelectedListener\nimport com.google.android.material.tabs.TabLayout.Tab\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable which emits the selected tab in `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Note:* If a tab is already selected, it will be emitted immediately on subscribe.\n */\n@CheckResult\nfun TabLayout.selections(): Observable<Tab> {\n  return TabLayoutSelectionsObservable(this)\n}\n\nprivate class TabLayoutSelectionsObservable(\n  private val view: TabLayout\n) : Observable<Tab>() {\n\n  override fun subscribeActual(observer: Observer<in Tab>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view,\n        observer)\n    observer.onSubscribe(listener)\n    view.addOnTabSelectedListener(listener)\n    val index = view.selectedTabPosition\n    if (index != -1) {\n      observer.onNext(view.getTabAt(index)!!)\n    }\n  }\n\n  private class Listener(\n    private val tabLayout: TabLayout,\n    private val observer: Observer<in Tab>\n  ) : MainThreadDisposable(), BaseOnTabSelectedListener<Tab> {\n\n    override fun onDispose() {\n      tabLayout.removeOnTabSelectedListener(this)\n    }\n\n    override fun onTabSelected(tab: Tab) {\n      if (!isDisposed) {\n        observer.onNext(tab)\n      }\n    }\n\n    override fun onTabUnselected(tab: Tab) {}\n\n    override fun onTabReselected(tab: Tab) {}\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXRecyclerView\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-recyclerview/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-recyclerview\nPOM_NAME=RxBinding (recyclerview)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest package=\"com.jakewharton.rxbinding4.recyclerview\"\n          xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <application>\n    <activity android:name=\".RxRecyclerViewTestActivity\"/>\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewAdapterTest.java",
    "content": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.view.ViewGroup;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder;\nimport androidx.test.annotation.UiThreadTest;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertSame;\n\npublic final class RxRecyclerViewAdapterTest {\n  private final TestRecyclerAdapter adapter = new TestRecyclerAdapter();\n\n  @Test @UiThreadTest public void dataChanges() {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxRecyclerViewAdapter.dataChanges(adapter).subscribe(o);\n    assertSame(adapter, o.takeNext());\n\n    adapter.notifyDataSetChanged();\n    assertSame(adapter, o.takeNext());\n\n    adapter.notifyDataSetChanged();\n    assertSame(adapter, o.takeNext());\n\n    o.dispose();\n    adapter.notifyDataSetChanged();\n    o.assertNoMoreEvents();\n  }\n\n  private static final class TestRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> {\n    TestRecyclerAdapter() {\n    }\n\n    @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n      return null;\n    }\n\n    @Override public void onBindViewHolder(ViewHolder holder, int position) {\n    }\n\n    @Override public int getItemCount() {\n      return 0;\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTest.java",
    "content": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.app.Instrumentation;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.test.espresso.IdlingRegistry;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.ViewDirtyIdlingResource;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\n\npublic final class RxRecyclerViewTest {\n  @Rule public final ActivityTestRule<RxRecyclerViewTestActivity> activityRule =\n      new ActivityTestRule<>(RxRecyclerViewTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n  private final IdlingRegistry idlingRegistry = IdlingRegistry.getInstance();\n\n  RecyclerView view;\n  private ViewDirtyIdlingResource viewDirtyIdler;\n  private View child;\n\n  @Before public void setUp() {\n    RxRecyclerViewTestActivity activity = activityRule.getActivity();\n    view = activity.recyclerView;\n    child = new View(activityRule.getActivity());\n    viewDirtyIdler = new ViewDirtyIdlingResource(activity);\n    idlingRegistry.register(viewDirtyIdler);\n  }\n\n  @After public void tearDown() {\n    idlingRegistry.unregister(viewDirtyIdler);\n  }\n\n  @Test public void childAttachEvents() {\n    RecordingObserver<RecyclerViewChildAttachStateChangeEvent> o = new RecordingObserver<>();\n    RxRecyclerView.childAttachStateChangeEvents(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    final SimpleAdapter adapter = new SimpleAdapter(child);\n\n    instrumentation.runOnMainSync(() -> view.setAdapter(adapter));\n    assertEquals(new RecyclerViewChildAttachEvent(view, child), o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.setAdapter(adapter));\n\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void childDetachEvents() {\n    final SimpleAdapter adapter = new SimpleAdapter(child);\n\n    instrumentation.runOnMainSync(() -> view.setAdapter(adapter));\n\n    RecordingObserver<RecyclerViewChildAttachStateChangeEvent> o = new RecordingObserver<>();\n    RxRecyclerView.childAttachStateChangeEvents(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.setAdapter(null));\n    assertEquals(new RecyclerViewChildDetachEvent(view, child), o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.setAdapter(adapter));\n\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void scrollEventsVertical() {\n    instrumentation.runOnMainSync(() -> view.setAdapter(new Adapter()));\n\n    RecordingObserver<RecyclerViewScrollEvent> o = new RecordingObserver<>();\n    RxRecyclerView.scrollEvents(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(0, 50));\n    RecyclerViewScrollEvent event1 = o.takeNext();\n    assertNotNull(event1);\n    assertEquals(50, event1.getDy());\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(0, 0));\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(0, -50));\n    RecyclerViewScrollEvent event2 = o.takeNext();\n    assertNotNull(event2);\n    assertEquals(-50, event2.getDy());\n\n    // Back at position 0. Trying to scroll earlier shouldn't fire any events\n    instrumentation.runOnMainSync(() -> view.scrollBy(0, -50));\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(0, 50));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void scrollEventsHorizontal() {\n    instrumentation.runOnMainSync(() -> {\n      view.setAdapter(new Adapter());\n      ((LinearLayoutManager) view.getLayoutManager()).setOrientation(LinearLayoutManager.HORIZONTAL);\n    });\n\n    instrumentation.waitForIdleSync();\n    RecordingObserver<RecyclerViewScrollEvent> o = new RecordingObserver<>();\n    RxRecyclerView.scrollEvents(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(50, 0));\n    RecyclerViewScrollEvent event3 = o.takeNext();\n    assertNotNull(event3);\n    assertEquals(50, event3.getDx());\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(0, 0));\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(-50, 0));\n    RecyclerViewScrollEvent event4 = o.takeNext();\n    assertNotNull(event4);\n    assertEquals(-50, event4.getDx());\n\n    // Back at position 0. Trying to scroll earlier shouldn't fire any events\n    instrumentation.runOnMainSync(() -> view.scrollBy(-50, 0));\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.scrollBy(50, 0));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void flingEventsVertical() {\n    instrumentation.runOnMainSync(() -> view.setAdapter(new Adapter()));\n\n    RecordingObserver<RecyclerViewFlingEvent> o = new RecordingObserver<>();\n    RxRecyclerView.flingEvents(view)\n            .subscribeOn(AndroidSchedulers.mainThread())\n            .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.fling(0, 1000));\n    RecyclerViewFlingEvent event1 = o.takeNext();\n    assertNotNull(event1);\n    assertEquals(1000, event1.getVelocityY());\n\n    instrumentation.runOnMainSync(() -> view.fling(0, 0));\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.fling(0, -1000));\n    RecyclerViewFlingEvent event2 = o.takeNext();\n    assertNotNull(event2);\n    assertEquals(-1000, event2.getVelocityY());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.fling(0, 1000));\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void flingEventsHorizontal() {\n    instrumentation.runOnMainSync(() -> {\n      view.setAdapter(new Adapter());\n      ((LinearLayoutManager) view.getLayoutManager()).setOrientation(LinearLayoutManager.HORIZONTAL);\n    });\n    instrumentation.waitForIdleSync();\n\n    RecordingObserver<RecyclerViewFlingEvent> o = new RecordingObserver<>();\n    RxRecyclerView.flingEvents(view)\n            .subscribeOn(AndroidSchedulers.mainThread())\n            .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.fling(1000, 0));\n    RecyclerViewFlingEvent event1 = o.takeNext();\n    assertNotNull(event1);\n    assertEquals(1000, event1.getVelocityX());\n\n    instrumentation.runOnMainSync(() -> view.fling(0, 0));\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.fling(-1000, 0));\n    RecyclerViewFlingEvent event2 = o.takeNext();\n    assertNotNull(event2);\n    assertEquals(-1000, event2.getVelocityX());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.fling(1000, 0));\n    o.assertNoMoreEvents();\n  }\n\n  private class SimpleAdapter extends RecyclerView.Adapter {\n    private final View child;\n\n    SimpleAdapter(View child) {\n      this.child = child;\n    }\n\n    @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n      return new RecyclerView.ViewHolder(child) {\n      };\n    }\n\n    @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n    }\n\n    @Override public int getItemCount() {\n      return 1;\n    }\n  }\n\n  private static class Adapter extends RecyclerView.Adapter<ViewHolder> {\n    public Adapter() {\n      setHasStableIds(true);\n    }\n\n    @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int position) {\n      TextView v = (TextView) LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);\n      return new ViewHolder(v);\n    }\n\n    @Override public void onBindViewHolder(ViewHolder holder, int position) {\n      holder.textView.setText(String.valueOf(position));\n    }\n\n    @Override public int getItemCount() {\n      return 100;\n    }\n\n    @Override public long getItemId(int position) {\n      return position;\n    }\n  }\n\n  private static class ViewHolder extends RecyclerView.ViewHolder {\n\n    TextView textView;\n\n    ViewHolder(TextView itemView) {\n      super(itemView);\n      this.textView = itemView;\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/androidTest/java/com/jakewharton/rxbinding4/recyclerview/RxRecyclerViewTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.recyclerview;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic final class RxRecyclerViewTestActivity extends Activity {\n  RecyclerView recyclerView;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    recyclerView = new RecyclerView(this);\n    recyclerView.setId(android.R.id.primary);\n    recyclerView.setLayoutManager(new LinearLayoutManager(this));\n    setContentView(recyclerView);\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.recyclerview\"/>\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerAdapterDataChangeObservable.kt",
    "content": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerViewAdapter\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport androidx.annotation.CheckResult\nimport androidx.recyclerview.widget.RecyclerView.Adapter\nimport androidx.recyclerview.widget.RecyclerView.AdapterDataObserver\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of data change events for `RecyclerView.adapter`.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun <T : Adapter<out ViewHolder>> T.dataChanges(): InitialValueObservable<T> =\n    RecyclerAdapterDataChangeObservable(this)\n\nprivate class RecyclerAdapterDataChangeObservable<T : Adapter<out ViewHolder>>(\n  private val adapter: T\n) : InitialValueObservable<T>() {\n\n  override fun subscribeListener(observer: Observer<in T>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(\n        adapter, observer)\n    observer.onSubscribe(listener)\n    adapter.registerAdapterDataObserver(listener.dataObserver)\n  }\n\n  override val initialValue get() = adapter\n\n  class Listener<T : Adapter<out ViewHolder>>(\n    private val recyclerAdapter: T,\n    observer: Observer<in T>\n  ) : MainThreadDisposable() {\n\n    val dataObserver = object : AdapterDataObserver() {\n      override fun onChanged() {\n        if (!isDisposed) {\n          observer.onNext(recyclerAdapter)\n        }\n      }\n    }\n\n    override fun onDispose() {\n      recyclerAdapter.unregisterAdapterDataObserver(dataObserver)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewChildAttachStateChangeEventObservable.kt",
    "content": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android.view.View\nimport androidx.annotation.CheckResult\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of child attach state change events on `recyclerView`.\n *\n * *Warning:* The created observable keeps a strong reference to `recyclerView`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun RecyclerView.childAttachStateChangeEvents(): Observable<RecyclerViewChildAttachStateChangeEvent> =\n    RecyclerViewChildAttachStateChangeEventObservable(this)\n\nprivate class RecyclerViewChildAttachStateChangeEventObservable(\n  private val view: RecyclerView\n) : Observable<RecyclerViewChildAttachStateChangeEvent>() {\n\n  override fun subscribeActual(observer: Observer<in RecyclerViewChildAttachStateChangeEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(\n        view, observer)\n    observer.onSubscribe(listener)\n    view.addOnChildAttachStateChangeListener(listener)\n  }\n\n  class Listener(\n    private val recyclerView: RecyclerView,\n    private val observer: Observer<in RecyclerViewChildAttachStateChangeEvent>\n  ) : MainThreadDisposable(), OnChildAttachStateChangeListener {\n\n    override fun onChildViewAttachedToWindow(childView: View) {\n      if (!isDisposed) {\n        observer.onNext(RecyclerViewChildAttachEvent(recyclerView, childView))\n      }\n    }\n\n    override fun onChildViewDetachedFromWindow(childView: View) {\n      if (!isDisposed) {\n        observer.onNext(RecyclerViewChildDetachEvent(recyclerView, childView))\n      }\n    }\n\n    override fun onDispose() {\n      recyclerView.removeOnChildAttachStateChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewChildAttachStateChangeEvents.kt",
    "content": "package com.jakewharton.rxbinding4.recyclerview\n\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerView\n\n// TODO move all of this next to the Observable https://youtrack.jetbrains.com/issue/KT-27097\n\n/**\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\nsealed class RecyclerViewChildAttachStateChangeEvent {\n  /** The view from which this event occurred.  */\n  abstract val view: RecyclerView\n\n  /** The child from which this event occurred.  */\n  abstract val child: View\n}\n\n/**\n * A child view attach event on a [RecyclerView].\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class RecyclerViewChildAttachEvent(\n  override val view: RecyclerView,\n  override val child: View\n) : RecyclerViewChildAttachStateChangeEvent()\n\n/**\n * A child view detach event on a [RecyclerView].\n *\n * **Warning:** Instances keep a strong reference to the view. Operators that cache\n * instances have the potential to leak the associated [Context].\n */\ndata class RecyclerViewChildDetachEvent(\n  override val view: RecyclerView,\n  override val child: View\n) : RecyclerViewChildAttachStateChangeEvent()\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewFlingEventObservable.kt",
    "content": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android.content.Context\nimport androidx.annotation.CheckResult\nimport androidx.recyclerview.widget.RecyclerView\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of fling events on `recyclerView`.\n *\n * *Warning:* The created observable keeps a strong reference to `recyclerView`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun RecyclerView.flingEvents(): Observable<RecyclerViewFlingEvent> =\n    RecyclerViewFlingEventObservable(this)\n\n/**\n * A fling event on a recyclerView.\n *\n * **Warning:** Instances keep a strong reference to the recyclerView. Operators that\n * cache instances have the potential to leak the associated [Context].\n */\ndata class RecyclerViewFlingEvent(val view: RecyclerView, val velocityX: Int, val velocityY: Int)\n\nprivate class RecyclerViewFlingEventObservable(\n  private val view: RecyclerView\n) : Observable<RecyclerViewFlingEvent>() {\n\n  override fun subscribeActual(observer: Observer<in RecyclerViewFlingEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.onFlingListener = listener.scrollListener\n  }\n\n  class Listener(\n    private val recyclerView: RecyclerView,\n    observer: Observer<in RecyclerViewFlingEvent>\n  ) : MainThreadDisposable() {\n\n    val scrollListener = object : RecyclerView.OnFlingListener() {\n      override fun onFling(velocityX: Int, velocityY: Int): Boolean {\n        if (!isDisposed) {\n          observer.onNext(RecyclerViewFlingEvent(recyclerView, velocityX, velocityY))\n        }\n        return false\n      }\n    }\n\n    override fun onDispose() {\n      recyclerView.onFlingListener = null\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewScrollEventObservable.kt",
    "content": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport android.content.Context\nimport androidx.annotation.CheckResult\nimport androidx.recyclerview.widget.RecyclerView\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of scroll events on `recyclerView`.\n *\n * *Warning:* The created observable keeps a strong reference to `recyclerView`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun RecyclerView.scrollEvents(): Observable<RecyclerViewScrollEvent> =\n    RecyclerViewScrollEventObservable(this)\n\n/**\n * A scroll event on a recyclerView.\n *\n * **Warning:** Instances keep a strong reference to the recyclerView. Operators that\n * cache instances have the potential to leak the associated [Context].\n */\ndata class RecyclerViewScrollEvent(val view: RecyclerView, val dx: Int, val dy: Int)\n\nprivate class RecyclerViewScrollEventObservable(\n  private val view: RecyclerView\n) : Observable<RecyclerViewScrollEvent>() {\n\n  override fun subscribeActual(observer: Observer<in RecyclerViewScrollEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(\n        view, observer)\n    observer.onSubscribe(listener)\n    view.addOnScrollListener(listener.scrollListener)\n  }\n\n  class Listener(\n    private val recyclerView: RecyclerView,\n    observer: Observer<in RecyclerViewScrollEvent>\n  ) : MainThreadDisposable() {\n\n    val scrollListener = object : RecyclerView.OnScrollListener() {\n      override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n        if (!isDisposed) {\n          observer.onNext(\n              RecyclerViewScrollEvent(recyclerView, dx, dy))\n        }\n      }\n    }\n\n    override fun onDispose() {\n      recyclerView.removeOnScrollListener(scrollListener)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewScrollStateChangeObservable.kt",
    "content": "@file:JvmMultifileClass\n@file:JvmName(\"RxRecyclerView\")\n\npackage com.jakewharton.rxbinding4.recyclerview\n\nimport androidx.annotation.CheckResult\nimport androidx.recyclerview.widget.RecyclerView\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of scroll state changes on `recyclerView`.\n *\n * *Warning:* The created observable keeps a strong reference to `recyclerView`.\n * Unsubscribe to free this reference.\n */\n@CheckResult\nfun RecyclerView.scrollStateChanges(): Observable<Int> =\n    RecyclerViewScrollStateChangeObservable(this)\n\nprivate class RecyclerViewScrollStateChangeObservable(\n  private val view: RecyclerView\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(\n        view, observer)\n    observer.onSubscribe(listener)\n    view.addOnScrollListener(listener.scrollListener)\n  }\n\n  class Listener(\n    private val recyclerView: RecyclerView,\n    observer: Observer<in Int>\n  ) : MainThreadDisposable() {\n\n    val scrollListener = object : RecyclerView.OnScrollListener() {\n      override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n        if (!isDisposed) {\n          observer.onNext(newState)\n        }\n      }\n    }\n\n    override fun onDispose() {\n      recyclerView.removeOnScrollListener(scrollListener)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXSlidingPaneLayout\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.androidXTestEspressoContrib\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-slidingpanelayout\nPOM_NAME=RxBinding (slidingpanelayout)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.slidingpanelayout\">\n  <application>\n    <activity android:name=\".RxSlidingPaneLayoutTestActivity\"/>\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTest.java",
    "content": "package com.jakewharton.rxbinding4.slidingpanelayout;\n\nimport android.app.Instrumentation;\nimport android.view.View;\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout;\nimport androidx.test.espresso.IdlingRegistry;\nimport androidx.test.espresso.idling.CountingIdlingResource;\nimport androidx.test.espresso.matcher.BoundedMatcher;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport com.jakewharton.rxbinding4.UnsafeRunnable;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport org.hamcrest.Description;\nimport org.hamcrest.Matcher;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.assertion.ViewAssertions.matches;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\npublic class RxSlidingPaneLayoutTest {\n  @Rule public final ActivityTestRule<RxSlidingPaneLayoutTestActivity> activityRule =\n      new ActivityTestRule<>(RxSlidingPaneLayoutTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n  private final IdlingRegistry idlingRegistry = IdlingRegistry.getInstance();\n\n  SlidingPaneLayout view;\n\n  CountingIdlingResource idler;\n\n  @Before public void setUp() {\n    RxSlidingPaneLayoutTestActivity activity = activityRule.getActivity();\n    view = activity.slidingPaneLayout;\n\n    idler = new CountingIdlingResource(\"counting idler\");\n    idlingRegistry.register(idler);\n  }\n\n  @After public void teardown() {\n    idlingRegistry.unregister(idler);\n  }\n\n  @Test public void paneOpen() {\n    RecordingObserver<Boolean> o = new RecordingObserver<>();\n    RxSlidingPaneLayout.panelOpens(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    assertFalse(o.takeNext());\n\n    instrumentation.runOnMainSync(() -> view.openPane());\n    assertTrue(o.takeNext());\n\n    instrumentation.runOnMainSync(() -> view.closePane());\n    assertFalse(o.takeNext());\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.openPane());\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void slides() {\n    RecordingObserver<Float> o1 = new RecordingObserver<>();\n    RxSlidingPaneLayout.panelSlides(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o1);\n    o1.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.openPane());\n    instrumentation.waitForIdleSync();\n    assertTrue(o1.takeNext() > 0f);\n\n    o1.dispose();\n    o1.assertNoMoreEvents();\n\n    RecordingObserver<Float> o2 = new RecordingObserver<>();\n    RxSlidingPaneLayout.panelSlides(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o2);\n    o2.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.closePane());\n    instrumentation.waitForIdleSync();\n    assertTrue(o2.takeNext() < 1f);\n\n    o2.dispose();\n    o2.assertNoMoreEvents();\n  }\n\n  @Test public void open() {\n    final Consumer<? super Boolean> open = RxSlidingPaneLayout.open(view);\n\n    view.setPanelSlideListener(new SlidingPaneLayout.SimplePanelSlideListener() {\n      @Override public void onPanelOpened(View panel) {\n        idler.decrement();\n      }\n\n      @Override public void onPanelClosed(View panel) {\n        idler.decrement();\n      }\n    });\n\n    idler.increment();\n    instrumentation.runOnMainSync(new UnsafeRunnable() {\n      @Override protected void unsafeRun() throws Throwable {\n        open.accept(true);\n      }\n    });\n    instrumentation.waitForIdleSync();\n    onView(withId(view.getId())).check(matches(isOpen()));\n\n    idler.increment();\n    instrumentation.runOnMainSync(new UnsafeRunnable() {\n      @Override protected void unsafeRun() throws Throwable {\n        open.accept(false);\n      }\n    });\n    instrumentation.waitForIdleSync();\n    onView(withId(view.getId())).check(matches(isClosed()));\n\n    view.setPanelSlideListener(null);\n  }\n\n  private static Matcher<View> isOpen() {\n    return new BoundedMatcher<View, SlidingPaneLayout>(SlidingPaneLayout.class) {\n      @Override public void describeTo(Description description) {\n        description.appendText(\"is pane open\");\n      }\n\n      @Override public boolean matchesSafely(SlidingPaneLayout slidingPaneLayout) {\n        return slidingPaneLayout.isOpen();\n      }\n    };\n  }\n\n  private static Matcher<View> isClosed() {\n    return new BoundedMatcher<View, SlidingPaneLayout>(SlidingPaneLayout.class) {\n      @Override public void describeTo(Description description) {\n        description.appendText(\"is pane closed\");\n      }\n\n      @Override public boolean matchesSafely(SlidingPaneLayout slidingPaneLayout) {\n        return !slidingPaneLayout.isOpen();\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/androidTest/java/com/jakewharton/rxbinding4/slidingpanelayout/RxSlidingPaneLayoutTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.slidingpanelayout;\n\nimport android.app.Activity;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.widget.FrameLayout;\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout;\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout.LayoutParams;\n\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\n\npublic final class RxSlidingPaneLayoutTestActivity extends Activity {\n  SlidingPaneLayout slidingPaneLayout;\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    slidingPaneLayout = new SlidingPaneLayout(this);\n    slidingPaneLayout.setId(android.R.id.primary);\n\n    FrameLayout paneOne = new FrameLayout(this);\n    LayoutParams paneOneParams = new LayoutParams(300, MATCH_PARENT);\n    slidingPaneLayout.addView(paneOne, paneOneParams);\n\n    FrameLayout paneTwo = new FrameLayout(this);\n    paneTwo.setBackgroundColor(Color.WHITE);\n    LayoutParams paneTwoParams = new LayoutParams(MATCH_PARENT, MATCH_PARENT);\n    paneTwoParams.leftMargin = 50;\n    slidingPaneLayout.addView(paneTwo, paneTwoParams);\n\n    setContentView(slidingPaneLayout);\n  }\n}\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.slidingpanelayout\"/>\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutOpenConsumer.kt",
    "content": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimport androidx.annotation.CheckResult\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout\nimport io.reactivex.rxjava3.functions.Consumer\n\n/**\n * An action which sets whether the pane of `view` is open.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun SlidingPaneLayout.open(): Consumer<in Boolean> {\n  return Consumer { value ->\n    if (value) {\n      openPane()\n    } else {\n      closePane()\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutPaneOpenedObservable.kt",
    "content": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimport android.view.View\nimport androidx.annotation.CheckResult\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout.PanelSlideListener\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of the open state of the pane of `view`\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [SlidingPaneLayout.setPanelSlideListener]\n * to observe dismiss change. Only one observable can be used for a view at a time.\n *\n * *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun SlidingPaneLayout.panelOpens(): InitialValueObservable<Boolean> {\n  return SlidingPaneLayoutPaneOpenedObservable(this)\n}\n\nprivate class SlidingPaneLayoutPaneOpenedObservable(\n  private val view: SlidingPaneLayout\n) : InitialValueObservable<Boolean>() {\n\n  override fun subscribeListener(observer: Observer<in Boolean>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setPanelSlideListener(listener)\n  }\n\n  override val initialValue get() = view.isOpen\n\n  private class Listener(\n    private val view: SlidingPaneLayout,\n    private val observer: Observer<in Boolean>\n  ) : MainThreadDisposable(), PanelSlideListener {\n\n    override fun onPanelSlide(panel: View, slideOffset: Float) {\n    }\n\n    override fun onPanelOpened(panel: View) {\n      if (!isDisposed) {\n        observer.onNext(true)\n      }\n    }\n\n    override fun onPanelClosed(panel: View) {\n      if (!isDisposed) {\n        observer.onNext(false)\n      }\n    }\n\n    override fun onDispose() {\n      view.setPanelSlideListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-slidingpanelayout/src/main/java/com/jakewharton/rxbinding4/slidingpanelayout/SlidingPaneLayoutSlideObservable.kt",
    "content": "@file:JvmName(\"RxSlidingPaneLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.slidingpanelayout\n\nimport android.view.View\nimport androidx.annotation.CheckResult\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of the slide offset of the pane of `view`\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n * *Warning:* The created observable uses [SlidingPaneLayout.setPanelSlideListener]\n * to observe dismiss change. Only one observable can be used for a view at a time.\n */\n@CheckResult\nfun SlidingPaneLayout.panelSlides(): Observable<Float> {\n  return SlidingPaneLayoutSlideObservable(this)\n}\n\nprivate class SlidingPaneLayoutSlideObservable(\n  private val view: SlidingPaneLayout\n) : Observable<Float>() {\n\n  override fun subscribeActual(observer: Observer<in Float>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setPanelSlideListener(listener)\n  }\n\n  private class Listener(\n    private val view: SlidingPaneLayout,\n    private val observer: Observer<in Float>\n  ) : MainThreadDisposable(), SlidingPaneLayout.PanelSlideListener {\n\n    override fun onPanelSlide(panel: View, slideOffset: Float) {\n      if (!isDisposed) {\n        observer.onNext(slideOffset)\n      }\n    }\n\n    override fun onPanelOpened(panel: View) {\n    }\n\n    override fun onPanelClosed(panel: View) {\n    }\n\n    override fun onDispose() {\n      view.setPanelSlideListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXSwipeRefreshLayout\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-swiperefreshlayout\nPOM_NAME=RxBinding (swiperefreshlayout)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.swiperefreshlayout\">\n  <application>\n    <activity android:name=\".RxSwipeRefreshLayoutTestActivity\"/>\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/src/androidTest/java/com/jakewharton/rxbinding4/swiperefreshlayout/RxSwipeRefreshLayoutTest.java",
    "content": "package com.jakewharton.rxbinding4.swiperefreshlayout;\n\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport androidx.test.espresso.ViewAction;\nimport androidx.test.espresso.action.GeneralLocation;\nimport androidx.test.espresso.action.GeneralSwipeAction;\nimport androidx.test.espresso.action.Press;\nimport androidx.test.espresso.action.Swipe;\nimport androidx.test.rule.ActivityTestRule;\nimport com.jakewharton.rxbinding4.swiperefreshlayout.test.R;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\n\npublic final class RxSwipeRefreshLayoutTest {\n  @Rule public final ActivityTestRule<RxSwipeRefreshLayoutTestActivity> activityRule =\n      new ActivityTestRule<>(RxSwipeRefreshLayoutTestActivity.class);\n\n  private SwipeRefreshLayout view;\n\n  @Before public void setUp() {\n    RxSwipeRefreshLayoutTestActivity activity = activityRule.getActivity();\n    view = activity.swipeRefreshLayout;\n  }\n\n  @Test public void refreshes() throws InterruptedException {\n    RecordingObserver<Object> o = new RecordingObserver<>();\n    RxSwipeRefreshLayout.refreshes(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    onView(withId(R.id.swipe_refresh_layout)).perform(swipeDown());\n    o.takeNext();\n\n    o.dispose();\n    onView(withId(R.id.swipe_refresh_layout)).perform(swipeDown());\n    o.assertNoMoreEvents();\n  }\n\n  private static ViewAction swipeDown() {\n    return new GeneralSwipeAction(Swipe.SLOW, GeneralLocation.TOP_CENTER,\n        GeneralLocation.BOTTOM_CENTER, Press.FINGER);\n  }\n}\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/src/androidTest/java/com/jakewharton/rxbinding4/swiperefreshlayout/RxSwipeRefreshLayoutTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.swiperefreshlayout;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.view.MotionEvent;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.FrameLayout;\nimport android.widget.ScrollView;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\nimport com.jakewharton.rxbinding4.swiperefreshlayout.test.R;\n\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\n\npublic final class RxSwipeRefreshLayoutTestActivity extends Activity {\n  SwipeRefreshLayout swipeRefreshLayout;\n\n  final Handler handler = new Handler(Looper.getMainLooper());\n  final Runnable stopRefreshing = new Runnable() {\n    @Override public void run() {\n      swipeRefreshLayout.setRefreshing(false);\n    }\n  };\n\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    swipeRefreshLayout = new SwipeRefreshLayout(this);\n    swipeRefreshLayout.setId(R.id.swipe_refresh_layout);\n    swipeRefreshLayout.setOnTouchListener((v, event) -> {\n      if (event.getActionMasked() == MotionEvent.ACTION_UP) {\n        handler.removeCallbacks(stopRefreshing);\n        handler.postDelayed(stopRefreshing, 300);\n      }\n      return false;\n    });\n\n    ScrollView scrollView = new ScrollView(this);\n    LayoutParams scrollParams = new LayoutParams(MATCH_PARENT, MATCH_PARENT);\n    swipeRefreshLayout.addView(scrollView, scrollParams);\n\n    FrameLayout emptyView = new FrameLayout(this);\n    LayoutParams emptyParams = new LayoutParams(MATCH_PARENT, 100000);\n    scrollView.addView(emptyView, emptyParams);\n\n    setContentView(swipeRefreshLayout);\n  }\n\n  @Override protected void onPause() {\n    super.onPause();\n    handler.removeCallbacks(stopRefreshing);\n  }\n}\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/src/androidTest/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <item type=\"id\" name=\"swipe_refresh_layout\"/>\n</resources>\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.swiperefreshlayout\"/>\n"
  },
  {
    "path": "rxbinding-swiperefreshlayout/src/main/java/com/jakewharton/rxbinding4/swiperefreshlayout/SwipeRefreshLayoutRefreshObservable.kt",
    "content": "@file:JvmName(\"RxSwipeRefreshLayout\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.swiperefreshlayout\n\nimport androidx.annotation.CheckResult\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of refresh events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun SwipeRefreshLayout.refreshes(): Observable<Unit> {\n  return SwipeRefreshLayoutRefreshObservable(this)\n}\n\nprivate class SwipeRefreshLayoutRefreshObservable(\n  private val view: SwipeRefreshLayout\n) : Observable<Unit>() {\n\n  override fun subscribeActual(observer: Observer<in Unit>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.setOnRefreshListener(listener)\n  }\n\n  private class Listener(\n    private val view: SwipeRefreshLayout,\n    private val observer: Observer<in Unit>\n  ) : MainThreadDisposable(), OnRefreshListener {\n\n    override fun onRefresh() {\n      if (!isDisposed) {\n        observer.onNext(Unit)\n      }\n    }\n\n    override fun onDispose() {\n      view.setOnRefreshListener(null)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXViewPager\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-viewpager/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-viewpager\nPOM_NAME=RxBinding (viewpager)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-viewpager/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.viewpager\">\n  <application>\n    <activity android:name=\".RxViewPagerTestActivity\"/>\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-viewpager/src/androidTest/java/com/jakewharton/rxbinding4/viewpager/RxViewPagerTest.java",
    "content": "package com.jakewharton.rxbinding4.viewpager;\n\nimport android.app.Instrumentation;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.espresso.ViewAction;\nimport androidx.test.espresso.action.GeneralLocation;\nimport androidx.test.espresso.action.GeneralSwipeAction;\nimport androidx.test.espresso.action.Press;\nimport androidx.test.espresso.action.Swipe;\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.rule.ActivityTestRule;\nimport androidx.viewpager.widget.ViewPager;\nimport com.jakewharton.rxbinding4.RecordingObserver;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\npublic final class RxViewPagerTest {\n  @Rule public final ActivityTestRule<RxViewPagerTestActivity> activityRule =\n      new ActivityTestRule<>(RxViewPagerTestActivity.class);\n\n  private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();\n\n  private ViewPager view;\n\n  @Before public void setUp() {\n    RxViewPagerTestActivity activity = activityRule.getActivity();\n    view = activity.viewPager;\n  }\n\n  @Test public void pageScrollEvents() {\n    view.setCurrentItem(0);\n    RecordingObserver<ViewPagerPageScrollEvent> o = new RecordingObserver<>();\n    RxViewPager.pageScrollEvents(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents();\n\n    instrumentation.runOnMainSync(() -> view.setCurrentItem(1, true));\n    instrumentation.waitForIdleSync();\n    ViewPagerPageScrollEvent event1 = o.takeNext();\n    assertEquals(0, event1.getPosition());\n    assertTrue(event1.getPositionOffset() > 0f);\n    assertTrue(event1.getPositionOffsetPixels() > 0);\n    o.clearEvents();\n\n    o.dispose();\n\n    instrumentation.runOnMainSync(() -> view.setCurrentItem(0, true));\n    instrumentation.waitForIdleSync();\n\n    o.assertNoMoreEvents();\n  }\n\n  @Test public void pageScrollStateChanges() {\n    view.setCurrentItem(0);\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxViewPager.pageScrollStateChanges(view)\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(o);\n    o.assertNoMoreEvents(); // No initial value.\n\n    onView(withId(1)).perform(swipeLeft());\n    assertEquals(ViewPager.SCROLL_STATE_DRAGGING, o.takeNext().intValue());\n    assertEquals(ViewPager.SCROLL_STATE_SETTLING, o.takeNext().intValue());\n    assertEquals(ViewPager.SCROLL_STATE_IDLE, o.takeNext().intValue());\n    o.assertNoMoreEvents();\n\n    o.dispose();\n\n    onView(withId(1)).perform(swipeLeft());\n    o.assertNoMoreEvents();\n  }\n\n  @Test @UiThreadTest public void pageSelections() {\n    view.setCurrentItem(0);\n    RecordingObserver<Integer> o = new RecordingObserver<>();\n    RxViewPager.pageSelections(view).subscribe(o);\n    assertEquals(0, o.takeNext().intValue());\n\n    view.setCurrentItem(3);\n    assertEquals(3, o.takeNext().intValue());\n    view.setCurrentItem(5);\n    assertEquals(5, o.takeNext().intValue());\n\n    o.dispose();\n\n    view.setCurrentItem(0);\n    o.assertNoMoreEvents();\n  }\n\n  private static ViewAction swipeLeft() {\n    return new GeneralSwipeAction(Swipe.FAST, GeneralLocation.CENTER_RIGHT,\n        GeneralLocation.CENTER_LEFT, Press.FINGER);\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager/src/androidTest/java/com/jakewharton/rxbinding4/viewpager/RxViewPagerTestActivity.java",
    "content": "package com.jakewharton.rxbinding4.viewpager;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\nimport androidx.viewpager.widget.PagerAdapter;\nimport androidx.viewpager.widget.ViewPager;\n\npublic final class RxViewPagerTestActivity extends Activity {\n  ViewPager viewPager;\n\n  @SuppressWarnings(\"ResourceType\")\n  @Override protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    viewPager = new ViewPager(this);\n    viewPager.setId(1);\n    viewPager.setAdapter(new Adapter());\n\n    setContentView(viewPager);\n  }\n\n  private static class Adapter extends PagerAdapter {\n    Adapter() {\n    }\n\n    @Override public int getCount() {\n      return 20;\n    }\n\n    @Override public boolean isViewFromObject(View view, Object object) {\n      return view == object;\n    }\n\n    @Override public Object instantiateItem(ViewGroup container, int position) {\n      FrameLayout frameLayout = new FrameLayout(container.getContext());\n      container.addView(frameLayout);\n      return frameLayout;\n    }\n\n    @Override public void destroyItem(ViewGroup container, int position, Object object) {\n      container.removeView((View) object);\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.viewpager\"/>\n"
  },
  {
    "path": "rxbinding-viewpager/src/main/java/com/jakewharton/rxbinding4/viewpager/ViewPagerPageScrollStateChangedObservable.kt",
    "content": "@file:JvmName(\"RxViewPager\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.viewpager\n\nimport androidx.annotation.CheckResult\nimport androidx.viewpager.widget.ViewPager\nimport androidx.viewpager.widget.ViewPager.OnPageChangeListener\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of scroll state change events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun ViewPager.pageScrollStateChanges(): Observable<Int> {\n  return ViewPagerPageScrollStateChangedObservable(this)\n}\n\nprivate class ViewPagerPageScrollStateChangedObservable(\n  private val view: ViewPager\n) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnPageChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: ViewPager,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnPageChangeListener {\n\n    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {\n    }\n\n    override fun onPageSelected(position: Int) {\n    }\n\n    override fun onPageScrollStateChanged(state: Int) {\n      if (!isDisposed) {\n        observer.onNext(state)\n      }\n    }\n\n    override fun onDispose() {\n      view.removeOnPageChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager/src/main/java/com/jakewharton/rxbinding4/viewpager/ViewPagerPageScrolledObservable.kt",
    "content": "@file:JvmName(\"RxViewPager\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.viewpager\n\nimport androidx.annotation.CheckResult\nimport androidx.viewpager.widget.ViewPager\nimport androidx.viewpager.widget.ViewPager.OnPageChangeListener\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\nimport com.jakewharton.rxbinding4.internal.checkMainThread\n\n/**\n * Create an observable of page scroll events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun ViewPager.pageScrollEvents(): Observable<ViewPagerPageScrollEvent> {\n  return ViewPagerPageScrolledObservable(this)\n}\n\ndata class ViewPagerPageScrollEvent(\n  val viewPager: ViewPager,\n  val position: Int,\n  val positionOffset: Float,\n  val positionOffsetPixels: Int\n)\n\nprivate class ViewPagerPageScrolledObservable(\n  private val view: ViewPager\n) : Observable<ViewPagerPageScrollEvent>() {\n\n  override fun subscribeActual(observer: Observer<in ViewPagerPageScrollEvent>) {\n    if (!checkMainThread(observer)) {\n      return\n    }\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnPageChangeListener(listener)\n  }\n\n  private class Listener(\n    private val view: ViewPager,\n    private val observer: Observer<in ViewPagerPageScrollEvent>\n  ) : MainThreadDisposable(), OnPageChangeListener {\n\n    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {\n      if (!isDisposed) {\n        val event = ViewPagerPageScrollEvent(view, position, positionOffset,\n            positionOffsetPixels)\n        observer.onNext(event)\n      }\n    }\n\n    override fun onPageSelected(position: Int) {\n\n    }\n\n    override fun onPageScrollStateChanged(state: Int) {\n\n    }\n\n    override fun onDispose() {\n      view.removeOnPageChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager/src/main/java/com/jakewharton/rxbinding4/viewpager/ViewPagerPageSelectedObservable.kt",
    "content": "@file:JvmName(\"RxViewPager\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.viewpager\n\nimport androidx.annotation.CheckResult\nimport androidx.viewpager.widget.ViewPager\nimport androidx.viewpager.widget.ViewPager.OnPageChangeListener\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.core.Observer\nimport io.reactivex.rxjava3.android.MainThreadDisposable\n\n/**\n * Create an observable of page selected events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n *  *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun ViewPager.pageSelections(): InitialValueObservable<Int> {\n  return ViewPagerPageSelectedObservable(this)\n}\n\nprivate class ViewPagerPageSelectedObservable(\n  private val view: ViewPager\n) : InitialValueObservable<Int>() {\n\n  override fun subscribeListener(observer: Observer<in Int>) {\n    val listener = Listener(view, observer)\n    observer.onSubscribe(listener)\n    view.addOnPageChangeListener(listener)\n  }\n\n  override val initialValue get() = view.currentItem\n\n  private class Listener(\n    private val view: ViewPager,\n    private val observer: Observer<in Int>\n  ) : MainThreadDisposable(), OnPageChangeListener {\n\n    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {\n    }\n\n    override fun onPageSelected(position: Int) {\n      if (!isDisposed) {\n        observer.onNext(position)\n      }\n    }\n\n    override fun onPageScrollStateChanged(state: Int) {\n    }\n\n    override fun onDispose() {\n      view.removeOnPageChangeListener(this)\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager2/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'org.jetbrains.kotlin.android'\n\ndependencies {\n  api project(':rxbinding')\n  api deps.androidXViewPager2\n  api deps.kotlinStdlib\n  implementation deps.rxAndroid\n\n  androidTestImplementation project(':testing-utils')\n  androidTestImplementation deps.androidXTestRunner\n  androidTestImplementation deps.androidXTestRules\n  androidTestImplementation deps.androidXTestEspresso\n  androidTestImplementation deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n\n    testInstrumentationRunner 'com.jakewharton.rxbinding4.RxBindingTestRunner'\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  kotlinOptions {\n    jvmTarget = '1.8'\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n  }\n\n  buildTypes {\n    debug {\n      testCoverageEnabled true\n    }\n  }\n}\n\napply from: rootProject.file('gradle/gradle-mvn-push.gradle')\n"
  },
  {
    "path": "rxbinding-viewpager2/gradle.properties",
    "content": "POM_ARTIFACT_ID=rxbinding-viewpager2\nPOM_NAME=RxBinding (viewpager2)\nPOM_PACKAGING=aar\n"
  },
  {
    "path": "rxbinding-viewpager2/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.viewpager2\">\n\n  <application>\n    <activity\n        android:name=\".RxViewPager2TestActivity\"\n        android:screenOrientation=\"portrait\" />\n  </application>\n</manifest>\n"
  },
  {
    "path": "rxbinding-viewpager2/src/androidTest/java/com/jakewharton/rxbinding4/viewpager2/RxViewPager2Test.kt",
    "content": "package com.jakewharton.rxbinding4.viewpager2\n\nimport androidx.test.annotation.UiThreadTest\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.ViewAction\nimport androidx.test.espresso.action.GeneralLocation\nimport androidx.test.espresso.action.GeneralSwipeAction\nimport androidx.test.espresso.action.Press\nimport androidx.test.espresso.action.Swipe\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.rule.ActivityTestRule\nimport androidx.viewpager2.widget.ViewPager2\nimport androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_DRAGGING\nimport androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE\nimport androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_SETTLING\nimport com.jakewharton.rxbinding4.RecordingObserver\nimport com.jakewharton.rxbinding4.viewpager2.RxViewPager2TestActivity.Companion.PAGER_ID\nimport com.jakewharton.rxbinding4.viewpager2.RxViewPager2TestActivity.Companion.RAINBOW\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\nclass RxViewPager2Test {\n\n  @get:Rule\n  val activityRule = ActivityTestRule(RxViewPager2TestActivity::class.java)\n\n  private val instrumentation = InstrumentationRegistry.getInstrumentation()\n  private lateinit var viewPager2: ViewPager2\n\n  @Before\n  fun setup() {\n    val activity = activityRule.activity\n    viewPager2 = activity.getViewPager2()\n  }\n\n  @Test\n  fun pageScrollEvents() {\n    viewPager2.currentItem = 0\n    val recorder = RecordingObserver<PageScrollEvent>()\n\n    viewPager2.pageScrollEvents()\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(recorder)\n\n    recorder.assertNoMoreEvents()\n\n    instrumentation.runOnMainSync { viewPager2.setCurrentItem(1, true) }\n    instrumentation.waitForIdleSync()\n\n    val event = recorder.takeNext()\n    assertEquals(0, event.position)\n    assertTrue(event.positionOffset > 0f)\n    assertTrue(event.positionOffsetPixels > 0)\n    recorder.clearEvents()\n\n    recorder.dispose()\n\n    instrumentation.runOnMainSync { viewPager2.setCurrentItem(0, true) }\n    instrumentation.waitForIdleSync()\n\n    recorder.assertNoMoreEvents()\n  }\n\n  @Test\n  fun pageScrollStateChanges() {\n    viewPager2.currentItem = 0\n    val recorder = RecordingObserver<Int>()\n\n    viewPager2.pageScrollStateChanges()\n        .subscribeOn(AndroidSchedulers.mainThread())\n        .subscribe(recorder)\n\n    recorder.assertNoMoreEvents()\n\n    onView(withId(PAGER_ID)).perform(swipeLeft())\n    assertEquals(SCROLL_STATE_DRAGGING, recorder.takeNext())\n    assertEquals(SCROLL_STATE_SETTLING, recorder.takeNext())\n    assertEquals(SCROLL_STATE_IDLE, recorder.takeNext())\n    recorder.assertNoMoreEvents()\n\n    recorder.dispose()\n\n    onView(withId(PAGER_ID)).perform(swipeLeft())\n    recorder.assertNoMoreEvents()\n  }\n\n  @Test\n  @UiThreadTest\n  fun pageSelections() {\n    viewPager2.currentItem = 0\n    val recorder = RecordingObserver<Int>()\n\n    viewPager2.pageSelections()\n        .subscribe(recorder)\n\n    assertEquals(0, recorder.takeNext())\n\n    viewPager2.currentItem = (RAINBOW.size / 2)\n    assertEquals(RAINBOW.size / 2, recorder.takeNext())\n\n    viewPager2.currentItem = (RAINBOW.size - 1)\n    assertEquals(RAINBOW.size - 1, recorder.takeNext())\n\n    recorder.dispose()\n\n    viewPager2.currentItem = 0\n    recorder.assertNoMoreEvents()\n  }\n\n  private fun swipeLeft(): ViewAction =\n    GeneralSwipeAction(\n        Swipe.FAST, GeneralLocation.CENTER_RIGHT,\n        GeneralLocation.CENTER_LEFT, Press.FINGER\n    )\n}\n"
  },
  {
    "path": "rxbinding-viewpager2/src/androidTest/java/com/jakewharton/rxbinding4/viewpager2/RxViewPager2TestActivity.kt",
    "content": "package com.jakewharton.rxbinding4.viewpager2\n\nimport android.app.Activity\nimport android.os.Bundle\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.LayoutParams\nimport android.view.ViewGroup.LayoutParams.MATCH_PARENT\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.viewpager2.widget.ViewPager2\n\nclass RxViewPager2TestActivity : Activity() {\n\n  private lateinit var viewPager2: ViewPager2\n\n  fun getViewPager2(): ViewPager2 =\n    viewPager2\n\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    viewPager2 = ViewPager2(this).apply {\n      id = PAGER_ID\n      adapter =\n        TestAdapter(RAINBOW)\n    }\n    setContentView(viewPager2)\n  }\n\n  private class TestAdapter(private val colors: List<Int>) : RecyclerView.Adapter<TestViewHolder>() {\n\n    override fun onCreateViewHolder(\n      parent: ViewGroup,\n      viewType: Int\n    ): TestViewHolder =\n      TestViewHolder(View(parent.context).apply {\n        layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)\n      })\n\n    override fun getItemCount(): Int =\n      colors.size\n\n    override fun onBindViewHolder(\n      holder: TestViewHolder,\n      position: Int\n    ) {\n      holder.itemView.setBackgroundResource(colors[position])\n    }\n  }\n\n  companion object {\n    const val PAGER_ID = Int.MAX_VALUE\n    val RAINBOW = listOf(\n        android.R.color.holo_red_light,\n        android.R.color.holo_orange_dark,\n        android.R.color.holo_orange_light,\n        android.R.color.holo_green_light,\n        android.R.color.holo_blue_light,\n        android.R.color.holo_blue_dark,\n        android.R.color.holo_purple\n    )\n  }\n\n  private class TestViewHolder(item: View) : RecyclerView.ViewHolder(item)\n}\n"
  },
  {
    "path": "rxbinding-viewpager2/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.jakewharton.rxbinding4.viewpager2\" />\n"
  },
  {
    "path": "rxbinding-viewpager2/src/main/java/com/jakewharton/rxbinding4/viewpager2/PageScrollStateChangedObservable.kt",
    "content": "@file:JvmName(\"RxViewPager2\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.viewpager2\n\nimport androidx.annotation.CheckResult\nimport androidx.viewpager2.widget.ViewPager2\nimport androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.android.MainThreadDisposable\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\n\n/**\n * Create an observable of scroll state change events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun ViewPager2.pageScrollStateChanges(): Observable<Int> =\n  PageScrollStateChangedObservable(this)\n\nprivate class PageScrollStateChangedObservable(private val viewPager2: ViewPager2) : Observable<Int>() {\n\n  override fun subscribeActual(observer: Observer<in Int>) {\n    if (checkMainThread(observer)) {\n      RxPageChangeCallback(viewPager2, observer).run {\n        observer.onSubscribe(disposable)\n        viewPager2.registerOnPageChangeCallback(this)\n      }\n    }\n  }\n\n  private class RxPageChangeCallback(\n    private val viewPager2: ViewPager2,\n    private val observer: Observer<in Int>\n  ) : OnPageChangeCallback() {\n\n    val disposable = object : MainThreadDisposable() {\n      override fun onDispose() {\n        viewPager2.unregisterOnPageChangeCallback(this@RxPageChangeCallback)\n      }\n    }\n\n    override fun onPageScrollStateChanged(state: Int) {\n      if (!disposable.isDisposed) {\n        observer.onNext(state)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager2/src/main/java/com/jakewharton/rxbinding4/viewpager2/PageScrolledObservable.kt",
    "content": "@file:JvmName(\"RxViewPager2\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.viewpager2\n\nimport androidx.annotation.CheckResult\nimport androidx.viewpager2.widget.ViewPager2\nimport androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback\nimport com.jakewharton.rxbinding4.internal.checkMainThread\nimport io.reactivex.rxjava3.android.MainThreadDisposable\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.core.Observer\n\n/**\n * Create an observable of page scroll events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n */\n@CheckResult\nfun ViewPager2.pageScrollEvents(): Observable<PageScrollEvent> =\n  PageScrolledObservable(this)\n\ndata class PageScrollEvent(\n  val viewPager2: ViewPager2,\n  val position: Int,\n  val positionOffset: Float,\n  val positionOffsetPixels: Int\n)\n\nprivate class PageScrolledObservable(private val viewPager2: ViewPager2) : Observable<PageScrollEvent>() {\n\n  override fun subscribeActual(observer: Observer<in PageScrollEvent>) {\n    if (checkMainThread(observer)) {\n      RxPageChangeCallback(viewPager2, observer).run {\n        observer.onSubscribe(disposable)\n        viewPager2.registerOnPageChangeCallback(this)\n      }\n    }\n  }\n\n  private class RxPageChangeCallback(\n    private val viewPager2: ViewPager2,\n    private val observer: Observer<in PageScrollEvent>\n  ) : OnPageChangeCallback() {\n\n    val disposable = object : MainThreadDisposable() {\n      override fun onDispose() {\n        viewPager2.unregisterOnPageChangeCallback(this@RxPageChangeCallback)\n      }\n    }\n\n    override fun onPageScrolled(\n      position: Int,\n      positionOffset: Float,\n      positionOffsetPixels: Int\n    ) {\n      if (!disposable.isDisposed) {\n        observer.onNext(\n            PageScrollEvent(\n                viewPager2 = viewPager2,\n                position = position,\n                positionOffset = positionOffset,\n                positionOffsetPixels = positionOffsetPixels\n            )\n        )\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "rxbinding-viewpager2/src/main/java/com/jakewharton/rxbinding4/viewpager2/PageSelectedObservable.kt",
    "content": "@file:JvmName(\"RxViewPager2\")\n@file:JvmMultifileClass\n\npackage com.jakewharton.rxbinding4.viewpager2\n\nimport androidx.annotation.CheckResult\nimport androidx.viewpager2.widget.ViewPager2\nimport androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback\nimport com.jakewharton.rxbinding4.InitialValueObservable\nimport io.reactivex.rxjava3.android.MainThreadDisposable\nimport io.reactivex.rxjava3.core.Observer\n\n/**\n * Create an observable of page selected events on `view`.\n *\n * *Warning:* The created observable keeps a strong reference to `view`. Unsubscribe\n * to free this reference.\n *\n *  *Note:* A value will be emitted immediately on subscribe.\n */\n@CheckResult\nfun ViewPager2.pageSelections(): InitialValueObservable<Int> =\n  PageSelectedObservable(this)\n\nprivate class PageSelectedObservable(private val viewPager2: ViewPager2) : InitialValueObservable<Int>() {\n\n  override val initialValue: Int\n    get() = viewPager2.currentItem\n\n  override fun subscribeListener(observer: Observer<in Int>) {\n    RxPageChangeCallback(viewPager2, observer).run {\n      observer.onSubscribe(disposable)\n      viewPager2.registerOnPageChangeCallback(this)\n    }\n  }\n\n  private class RxPageChangeCallback(\n    private val viewPager2: ViewPager2,\n    private val observer: Observer<in Int>\n  ) : OnPageChangeCallback() {\n\n    val disposable = object : MainThreadDisposable() {\n      override fun onDispose() {\n        viewPager2.unregisterOnPageChangeCallback(this@RxPageChangeCallback)\n      }\n    }\n\n    override fun onPageSelected(position: Int) {\n      if (!disposable.isDisposed) {\n        observer.onNext(position)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "rootProject.name = 'rxbinding-root'\n\ninclude ':rxbinding'\ninclude ':rxbinding-appcompat'\ninclude ':rxbinding-core'\ninclude ':rxbinding-drawerlayout'\ninclude ':rxbinding-leanback'\ninclude ':rxbinding-material'\ninclude ':rxbinding-recyclerview'\ninclude ':rxbinding-slidingpanelayout'\ninclude ':rxbinding-swiperefreshlayout'\ninclude ':rxbinding-viewpager'\ninclude ':rxbinding-viewpager2'\ninclude ':testing-utils'\n"
  },
  {
    "path": "testing-utils/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\ndependencies {\n  api deps.androidXTestRunner\n  api deps.androidXTestEspresso\n  api deps.rxAndroid\n}\n\nandroid {\n  compileSdkVersion buildConfig.compileSdkVersion\n\n  defaultConfig {\n    minSdkVersion buildConfig.minSdkVersion\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_1_8\n    targetCompatibility JavaVersion.VERSION_1_8\n  }\n\n  lintOptions {\n    textReport true\n    textOutput 'stdout'\n    disable 'InvalidPackage'\n  }\n}\n"
  },
  {
    "path": "testing-utils/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.jakewharton.rxbinding4.testingutils\">\n\n  <uses-permission android:name=\"android.permission.DISABLE_KEYGUARD\"/>\n  <uses-permission android:name=\"android.permission.WAKE_LOCK\"/>\n</manifest>\n"
  },
  {
    "path": "testing-utils/src/main/java/com/jakewharton/rxbinding4/MotionEventUtil.java",
    "content": "package com.jakewharton.rxbinding4;\n\nimport android.os.SystemClock;\nimport android.view.InputDevice;\nimport android.view.MotionEvent;\nimport android.view.View;\n\npublic final class MotionEventUtil {\n  public static MotionEvent motionEventAtPosition(View view, int action, int xPercent,\n      int yPercent) {\n    // NOTE: This method is not perfect. If you send touch events in a granular nature, you'll\n    // see varying results of accuracy depending on the size of the jump.\n\n    int paddingLeft = view.getPaddingLeft();\n    int paddingRight = view.getPaddingRight();\n    int paddingTop = view.getPaddingTop();\n    int paddingBottom = view.getPaddingBottom();\n\n    int width = view.getWidth();\n    int height = view.getHeight();\n\n    int[] topLeft = new int[2];\n    view.getLocationInWindow(topLeft);\n    int x1 = topLeft[0] + paddingLeft;\n    int y1 = topLeft[1] + paddingTop;\n    int x2 = x1 + width - paddingLeft - paddingRight;\n    int y2 = y1 + height - paddingTop - paddingBottom;\n\n    float x = x1 + ((x2 - x1) * xPercent / 100f);\n    float y = y1 + ((y2 - y1) * yPercent / 100f);\n\n    long time = SystemClock.uptimeMillis();\n    return MotionEvent.obtain(time, time, action, x, y, 0);\n  }\n\n  public static MotionEvent hoverMotionEventAtPosition(View view, int action, int xPercent,\n      int yPercent) {\n    MotionEvent ev = motionEventAtPosition(view, action, xPercent, yPercent);\n\n    MotionEvent.PointerProperties[] pointerProperties = new MotionEvent.PointerProperties[1];\n    pointerProperties[0] = new MotionEvent.PointerProperties();\n\n    MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1];\n    pointerCoords[0] = new MotionEvent.PointerCoords();\n    pointerCoords[0].x = ev.getX();\n    pointerCoords[0].y = ev.getY();\n\n    return MotionEvent.obtain(ev.getDownTime(), ev.getEventTime(),\n        ev.getAction(), 1, pointerProperties, pointerCoords, ev.getMetaState(), 0,\n        ev.getXPrecision(), ev.getYPrecision(), ev.getDeviceId(), ev.getEdgeFlags(),\n        InputDevice.SOURCE_CLASS_POINTER, ev.getFlags());\n  }\n\n  private MotionEventUtil() {\n    throw new AssertionError(\"No instances.\");\n  }\n}\n"
  },
  {
    "path": "testing-utils/src/main/java/com/jakewharton/rxbinding4/RecordingObserver.java",
    "content": "package com.jakewharton.rxbinding4;\n\nimport android.util.Log;\nimport io.reactivex.rxjava3.observers.DisposableObserver;\nimport java.util.NoSuchElementException;\nimport java.util.concurrent.BlockingDeque;\nimport java.util.concurrent.LinkedBlockingDeque;\nimport java.util.concurrent.TimeUnit;\n\nimport static org.junit.Assert.assertTrue;\n\npublic final class RecordingObserver<T> extends DisposableObserver<T> {\n  private static final String TAG = \"RecordingObserver\";\n\n  private final BlockingDeque<Object> events = new LinkedBlockingDeque<>();\n\n  @Override public void onComplete() {\n    Log.v(TAG, \"onCompleted\");\n    events.addLast(new OnCompleted());\n  }\n\n  @Override public void onError(Throwable e) {\n    Log.v(TAG, \"onError\", e);\n    events.addLast(new OnError(e));\n  }\n\n  @Override public void onNext(T t) {\n    Log.v(TAG, \"onNext \" + t);\n    events.addLast(new OnNext(t));\n  }\n\n  private <E> E takeEvent(Class<E> wanted) {\n    Object event;\n    try {\n      event = events.pollFirst(1, TimeUnit.SECONDS);\n    } catch (InterruptedException e) {\n      throw new RuntimeException(e);\n    }\n    if (event == null) {\n      throw new NoSuchElementException(\n          \"No event found while waiting for \" + wanted.getSimpleName());\n    }\n    assertTrue(wanted.isInstance(event));\n    return wanted.cast(event);\n  }\n\n  public T takeNext() {\n    OnNext event = takeEvent(OnNext.class);\n    return event.value;\n  }\n\n  public Throwable takeError() {\n    return takeEvent(OnError.class).throwable;\n  }\n\n  public void clearEvents() {\n    while (events.peek() instanceof RecordingObserver.OnNext) {\n      events.removeFirst();\n    }\n  }\n\n  public void assertOnCompleted() {\n    takeEvent(OnCompleted.class);\n  }\n\n  public void assertNoMoreEvents() {\n    try {\n      Object event = takeEvent(Object.class);\n      throw new IllegalStateException(\"Expected no more events but got \" + event);\n    } catch (NoSuchElementException ignored) {\n    }\n  }\n\n  private final class OnNext {\n    final T value;\n\n    private OnNext(T value) {\n      this.value = value;\n    }\n\n    @Override public String toString() {\n      return \"OnNext[\" + value + \"]\";\n    }\n  }\n\n  private final class OnCompleted {\n    @Override public String toString() {\n      return \"OnCompleted\";\n    }\n  }\n\n  private final class OnError {\n    private final Throwable throwable;\n\n    private OnError(Throwable throwable) {\n      this.throwable = throwable;\n    }\n\n    @Override public String toString() {\n      return \"OnError[\" + throwable + \"]\";\n    }\n  }\n}\n"
  },
  {
    "path": "testing-utils/src/main/java/com/jakewharton/rxbinding4/RxBindingTestRunner.java",
    "content": "package com.jakewharton.rxbinding4;\n\nimport android.app.KeyguardManager;\nimport android.content.Context;\nimport android.os.PowerManager;\nimport androidx.test.runner.AndroidJUnitRunner;\n\nimport static android.content.Context.KEYGUARD_SERVICE;\nimport static android.content.Context.POWER_SERVICE;\nimport static android.os.PowerManager.ACQUIRE_CAUSES_WAKEUP;\nimport static android.os.PowerManager.FULL_WAKE_LOCK;\nimport static android.os.PowerManager.ON_AFTER_RELEASE;\n\npublic final class RxBindingTestRunner extends AndroidJUnitRunner {\n  private PowerManager.WakeLock wakeLock;\n\n  @Override public void onStart() {\n    Context app = getTargetContext().getApplicationContext();\n\n    String name = RxBindingTestRunner.class.getSimpleName();\n    // Unlock the device so that the tests can input keystrokes.\n    KeyguardManager keyguard = (KeyguardManager) app.getSystemService(KEYGUARD_SERVICE);\n    keyguard.newKeyguardLock(name).disableKeyguard();\n    // Wake up the screen.\n    PowerManager power = (PowerManager) app.getSystemService(POWER_SERVICE);\n    wakeLock = power.newWakeLock(FULL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP | ON_AFTER_RELEASE, name);\n    wakeLock.acquire();\n\n    super.onStart();\n  }\n\n  @Override public void onDestroy() {\n    super.onDestroy();\n\n    wakeLock.release();\n  }\n}\n"
  },
  {
    "path": "testing-utils/src/main/java/com/jakewharton/rxbinding4/TouchUtilsBackport.java",
    "content": "package com.jakewharton.rxbinding4;\n\nimport android.app.Instrumentation;\nimport android.os.SystemClock;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport androidx.test.platform.app.InstrumentationRegistry;\n\npublic final class TouchUtilsBackport {\n  /**\n   * Simulate touching a view and dragging it to a specified location.\n   *\n   * @param v The view that should be dragged\n   * @param gravity Which part of the view to use for the initial down event. A combination of\n   * (TOP, CENTER_VERTICAL, BOTTOM) and (LEFT, CENTER_HORIZONTAL, RIGHT)\n   * @param toX Final location of the view after dragging\n   * @param toY Final location of the view after dragging\n   * @return distance in pixels covered by the drag\n   */\n  public static int dragViewTo(View v, int gravity, int toX, int toY) {\n    int[] xy = new int[2];\n\n    getStartLocation(v, gravity, xy);\n\n    int fromX = xy[0];\n    int fromY = xy[1];\n\n    int deltaX = fromX - toX;\n    int deltaY = fromY - toY;\n\n    int distance = (int) Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n    drag(fromX, toX, fromY, toY, distance);\n\n    return distance;\n  }\n\n  /**\n   * Simulate touching a specific location and dragging to a new location.\n   *\n   * @param fromX X coordinate of the initial touch, in screen coordinates\n   * @param toX Xcoordinate of the drag destination, in screen coordinates\n   * @param fromY X coordinate of the initial touch, in screen coordinates\n   * @param toY Y coordinate of the drag destination, in screen coordinates\n   * @param stepCount How many move steps to include in the drag\n   */\n  public static void drag(float fromX, float toX, float fromY, float toY, int stepCount) {\n    Instrumentation inst = InstrumentationRegistry.getInstrumentation();\n\n    long downTime = SystemClock.uptimeMillis();\n    long eventTime = SystemClock.uptimeMillis();\n\n    float y = fromY;\n    float x = fromX;\n\n    float yStep = (toY - fromY) / stepCount;\n    float xStep = (toX - fromX) / stepCount;\n\n    MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0);\n    inst.sendPointerSync(event);\n    for (int i = 0; i < stepCount; ++i) {\n      y += yStep;\n      x += xStep;\n      eventTime = SystemClock.uptimeMillis();\n      event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 0);\n      inst.sendPointerSync(event);\n    }\n\n    eventTime = SystemClock.uptimeMillis();\n    event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0);\n    inst.sendPointerSync(event);\n    inst.waitForIdleSync();\n  }\n\n  /**\n   * Get the location of a view. Use the gravity param to specify which part of the view to\n   * return.\n   *\n   * @param v View to find\n   * @param gravity A combination of (TOP, CENTER_VERTICAL, BOTTOM) and (LEFT, CENTER_HORIZONTAL,\n   * RIGHT)\n   * @param xy Result\n   */\n  private static void getStartLocation(View v, int gravity, int[] xy) {\n    v.getLocationOnScreen(xy);\n\n    int viewWidth = v.getWidth();\n    int viewHeight = v.getHeight();\n\n    switch (gravity & Gravity.VERTICAL_GRAVITY_MASK) {\n      case Gravity.TOP:\n        break;\n      case Gravity.CENTER_VERTICAL:\n        xy[1] += viewHeight / 2;\n        break;\n      case Gravity.BOTTOM:\n        xy[1] += viewHeight - 1;\n        break;\n      default:\n        // Same as top -- do nothing\n    }\n\n    switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {\n      case Gravity.LEFT:\n        break;\n      case Gravity.CENTER_HORIZONTAL:\n        xy[0] += viewWidth / 2;\n        break;\n      case Gravity.RIGHT:\n        xy[0] += viewWidth - 1;\n        break;\n      default:\n        // Same as left -- do nothing\n    }\n  }\n\n  private TouchUtilsBackport() {\n    throw new AssertionError(\"No instances\");\n  }\n}\n"
  },
  {
    "path": "testing-utils/src/main/java/com/jakewharton/rxbinding4/UnsafeRunnable.java",
    "content": "package com.jakewharton.rxbinding4;\n\npublic abstract class UnsafeRunnable implements Runnable {\n\n  @Override\n  public final void run() {\n    try {\n      unsafeRun();\n    } catch (Throwable e) {\n      throw new RuntimeException(e);\n    }\n  }\n\n  protected abstract void unsafeRun() throws Throwable;\n}\n"
  },
  {
    "path": "testing-utils/src/main/java/com/jakewharton/rxbinding4/ViewDirtyIdlingResource.java",
    "content": "package com.jakewharton.rxbinding4;\n\nimport android.app.Activity;\nimport android.view.View;\nimport androidx.test.espresso.IdlingResource;\n\npublic final class ViewDirtyIdlingResource implements IdlingResource {\n  private final View decorView;\n  private ResourceCallback resourceCallback;\n\n  public ViewDirtyIdlingResource(Activity activity) {\n    decorView = activity.getWindow().getDecorView();\n  }\n\n  @Override public String getName() {\n    return \"view dirty\";\n  }\n\n  @Override public boolean isIdleNow() {\n    boolean clean = !decorView.isDirty();\n    if (clean) {\n      resourceCallback.onTransitionToIdle();\n    }\n    return clean;\n  }\n\n  @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {\n    this.resourceCallback = resourceCallback;\n  }\n}\n"
  }
]